diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-06 01:56:21 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-06 01:56:21 +0000 |
commit | e0e4cc7fd57999633141d19cbfe6369d1b4b0a1a (patch) | |
tree | f1926be9411b0cc385b0ae9a0db0ad85ec3a45ab /test | |
parent | 8efadf94b568c08de3ff8ce35fd904a935387406 (diff) | |
download | external_llvm-e0e4cc7fd57999633141d19cbfe6369d1b4b0a1a.zip external_llvm-e0e4cc7fd57999633141d19cbfe6369d1b4b0a1a.tar.gz external_llvm-e0e4cc7fd57999633141d19cbfe6369d1b4b0a1a.tar.bz2 |
Teach instcombine's sext elimination logic to be more aggressive.
Previously, instcombine would only promote an expression tree to
the larger type if doing so eliminated two casts. This is because
a need to manually do the sign extend after the promoted expression
tree with two shifts. Now, we keep track of whether the result of
the computation is going to be properly sign extended already. If
so, we can unconditionally promote the expression, which allows us
to zap more sext's.
This implements rdar://6598839 (aka gcc pr38751)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92815 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Transforms/InstCombine/cast-sext-zext.ll | 21 | ||||
-rw-r--r-- | test/Transforms/InstCombine/cast.ll | 11 |
2 files changed, 11 insertions, 21 deletions
diff --git a/test/Transforms/InstCombine/cast-sext-zext.ll b/test/Transforms/InstCombine/cast-sext-zext.ll deleted file mode 100644 index 678874a..0000000 --- a/test/Transforms/InstCombine/cast-sext-zext.ll +++ /dev/null @@ -1,21 +0,0 @@ -; RUN: opt < %s -instcombine -S | not grep sext -; XFAIL: * -; rdar://6598839 - -define zeroext i16 @t(i8 zeroext %on_off, i16* nocapture %puls) nounwind readonly { -entry: - %0 = zext i8 %on_off to i32 - %1 = add i32 %0, -1 - %2 = sext i32 %1 to i64 - %3 = getelementptr i16* %puls, i64 %2 - %4 = load i16* %3, align 2 - ret i16 %4 -} - -define zeroext i64 @t2(i8 zeroext %on_off) nounwind readonly { -entry: - %0 = zext i8 %on_off to i32 - %1 = add i32 %0, -1 - %2 = sext i32 %1 to i64 - ret i64 %2 ;; Should be (add (zext i8 -> i64), -1) -} diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index a6c6795..10e5050 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/test/Transforms/InstCombine/cast.ll @@ -381,3 +381,14 @@ define i32 @test42(i32 %X) { ; CHECK: %Z = and i32 %X, 255 } +; rdar://6598839 +define zeroext i64 @test43(i8 zeroext %on_off) nounwind readonly { + %A = zext i8 %on_off to i32 + %B = add i32 %A, -1 + %C = sext i32 %B to i64 + ret i64 %C ;; Should be (add (zext i8 -> i64), -1) +; CHECK: @test43 +; CHECK-NEXT: %A = zext i8 %on_off to i64 +; CHECK-NEXT: %B = add i64 %A, -1 +; CHECK-NEXT: ret i64 %B +} |