From: Craig Topper Date: Sun, 20 Aug 2017 21:38:28 +0000 (+0000) Subject: [InstCombine] Add a test case for a weakness in canEvaluateZExtd. NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3bdcc1c1bf9b58c51d1a9fb617ab18ec8610357;p=llvm [InstCombine] Add a test case for a weakness in canEvaluateZExtd. NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311303 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index e852c0ab5af..364337b9693 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/test/Transforms/InstCombine/cast.ll @@ -1586,3 +1586,22 @@ define i64 @test94(i32 %a) { %4 = sext i8 %3 to i64 ret i64 %4 } + +; We should be able to remove the zext and trunc here. +; TODO: This is currently blocked because we don't realize the 'and' has cleared the extra bits that would be shifted in widening the lshr. +define i32 @test95(i32 %x) { +; CHECK-LABEL: @test95( +; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i8 +; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], 6 +; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 2 +; CHECK-NEXT: [[TMP4:%.*]] = or i8 [[TMP3]], 40 +; CHECK-NEXT: [[TMP5:%.*]] = zext i8 [[TMP4]] to i32 +; CHECK-NEXT: ret i32 [[TMP5]] +; + %1 = trunc i32 %x to i8 + %2 = lshr i8 %1, 6 + %3 = and i8 %2, 2 + %4 = or i8 %3, 40 + %5 = zext i8 %4 to i32 + ret i32 %5 +}