diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-02-16 09:30:23 +0000 |
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-02-16 09:30:23 +0000 |
| commit | 6fe5c7aa327e188b7176daa5595bbf075a6b94df (patch) | |
| tree | 4cfca640904d1896e25032757a61f8959c066919 /test/Transforms/InstCombine | |
| parent | 989df958a10f0beb90b89ccadd8351cbe51d90b1 (diff) | |
Notes
Diffstat (limited to 'test/Transforms/InstCombine')
| -rw-r--r-- | test/Transforms/InstCombine/2007-03-27-PR1280.ll | 15 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/2010-01-28-NegativeSRem.ll | 19 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/and2.ll | 6 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/call.ll | 22 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/crash.ll | 33 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/getelementptr.ll | 2 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/icmp.ll | 9 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/intrinsics.ll | 15 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/load-select.ll | 16 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/logical-select.ll | 22 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/objsize.ll | 75 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/or.ll | 14 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/signext.ll | 23 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/sub.ll | 8 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/vector-casts.ll | 16 |
15 files changed, 264 insertions, 31 deletions
diff --git a/test/Transforms/InstCombine/2007-03-27-PR1280.ll b/test/Transforms/InstCombine/2007-03-27-PR1280.ll deleted file mode 100644 index 7700c7dd8a69..000000000000 --- a/test/Transforms/InstCombine/2007-03-27-PR1280.ll +++ /dev/null @@ -1,15 +0,0 @@ -; PR1280 - we should be able to reduce this function to a trunc/sext but it -; would involve using a bit width (24) that doesn't match a size that -; the back end can handle. This test makes sure that such a transform -; is not done. It should be removed when code gen supports "funny" -; bit widths. - -; RUN: opt < %s -instcombine -S | grep {add i49.*-8388608} - -define i49 @test5(i49 %x) { - ;; If we have ADD(XOR(AND(X, 0xFF), 0x80), 0xF..F80), it's a sext. - %X = and i49 %x, 16777215 ; 0x0000000ffffff - %tmp.2 = xor i49 %X, 8388608 ; 0x0000000800000 - %tmp.4 = add i49 %tmp.2, -8388608 ; 0x1FFFFFF800000 - ret i49 %tmp.4 -} diff --git a/test/Transforms/InstCombine/2010-01-28-NegativeSRem.ll b/test/Transforms/InstCombine/2010-01-28-NegativeSRem.ll new file mode 100644 index 000000000000..4ab9bf0c3f5f --- /dev/null +++ b/test/Transforms/InstCombine/2010-01-28-NegativeSRem.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s +; PR6165 + +define i32 @f() { +entry: + br label %BB1 + +BB1: ; preds = %BB1, %entry +; CHECK: BB1: + %x = phi i32 [ -29, %entry ], [ 0, %BB1 ] ; <i32> [#uses=2] + %rem = srem i32 %x, 2 ; <i32> [#uses=1] + %t = icmp eq i32 %rem, -1 ; <i1> [#uses=1] + br i1 %t, label %BB2, label %BB1 +; CHECK-NOT: br i1 false + +BB2: ; preds = %BB1 +; CHECK: BB2: + ret i32 %x +} diff --git a/test/Transforms/InstCombine/and2.ll b/test/Transforms/InstCombine/and2.ll index 0af9bfaff394..a5a6574e9f46 100644 --- a/test/Transforms/InstCombine/and2.ll +++ b/test/Transforms/InstCombine/and2.ll @@ -1,5 +1,4 @@ -; RUN: opt < %s -instcombine -S | not grep and - +; RUN: opt < %s -instcombine -S | FileCheck %s ; PR1738 define i1 @test1(double %X, double %Y) { @@ -7,6 +6,5 @@ define i1 @test1(double %X, double %Y) { %tmp13 = fcmp ord double %Y, 0.000000e+00 %bothcond = and i1 %tmp13, %tmp9 ret i1 %bothcond +; CHECK: fcmp ord double %Y, %X } - - diff --git a/test/Transforms/InstCombine/call.ll b/test/Transforms/InstCombine/call.ll index 05c063d34be2..dd65b969737d 100644 --- a/test/Transforms/InstCombine/call.ll +++ b/test/Transforms/InstCombine/call.ll @@ -75,7 +75,7 @@ define i32 @test5() { declare i32 @test6a(i32) define i32 @test6() { - %X = call i32 bitcast (i32 (i32)* @test6a to i32 ()*)( ) ; <i32> [#uses=1] + %X = call i32 bitcast (i32 (i32)* @test6a to i32 ()*)( ) ret i32 %X ; CHECK: %X1 = call i32 @test6a(i32 0) ; CHECK: ret i32 %X1 @@ -96,3 +96,23 @@ define void @test7() { } +; rdar://7590304 +declare void @test8a() + +define i8* @test8() { + invoke arm_apcscc void @test8a() + to label %invoke.cont unwind label %try.handler + +invoke.cont: ; preds = %entry + unreachable + +try.handler: ; preds = %entry + ret i8* null +} + +; Don't turn this into "unreachable": the callee and caller don't agree in +; calling conv, but the implementation of test8a may actually end up using the +; right calling conv. +; CHECK: @test8() { +; CHECK-NEXT: invoke arm_apcscc void @test8a() + diff --git a/test/Transforms/InstCombine/crash.ll b/test/Transforms/InstCombine/crash.ll index 732a88262178..2faa5392d4ba 100644 --- a/test/Transforms/InstCombine/crash.ll +++ b/test/Transforms/InstCombine/crash.ll @@ -204,3 +204,36 @@ declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind declare void @_ZSt9terminatev() declare void @_Unwind_Resume_or_Rethrow(i8*) + + + +; rdar://7590304 +define i8* @test10(i8* %self, i8* %tmp3) { +entry: + store i1 true, i1* undef + store i1 true, i1* undef + invoke arm_apcscc void @test10a() + to label %invoke.cont unwind label %try.handler ; <i8*> [#uses=0] + +invoke.cont: ; preds = %entry + unreachable + +try.handler: ; preds = %entry + ret i8* %self +} + +define void @test10a() { + ret void +} + + +; PR6193 +define i32 @test11(i32 %aMaskWidth, i8 %aStride) nounwind { +entry: + %conv41 = sext i8 %aStride to i32 + %neg = xor i32 %conv41, -1 + %and42 = and i32 %aMaskWidth, %neg + %and47 = and i32 130, %conv41 + %or = or i32 %and42, %and47 + ret i32 %or +} diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll index de325f64021f..f0bee4ea2eb8 100644 --- a/test/Transforms/InstCombine/getelementptr.ll +++ b/test/Transforms/InstCombine/getelementptr.ll @@ -246,7 +246,7 @@ bc0: store i32 0, i32* %tmp53 ret void ; CHECK: @test24 -; CHECK: store i32 0, i32* getelementptr (%"java/lang/StringBuffer"* null, i32 0, i32 1) +; CHECK: store i32 0, i32* getelementptr (%"java/lang/StringBuffer"* null, i64 0, i32 1) } define void @test25() { diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 79fa220752b5..c2234a10e5b7 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -112,3 +112,12 @@ define i1 @test11(i32 %x) { ; CHECK: ret i1 true } +; PR6195 +define i1 @test12(i1 %A) { + %S = select i1 %A, i64 -4294967295, i64 8589934591 + %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S + ret i1 %B +; CHECK: @test12 +; CHECK-NEXT: %B = select i1 +; CHECK-NEXT: ret i1 %B +} diff --git a/test/Transforms/InstCombine/intrinsics.ll b/test/Transforms/InstCombine/intrinsics.ll index c63475c2bd76..08dcfa731a94 100644 --- a/test/Transforms/InstCombine/intrinsics.ll +++ b/test/Transforms/InstCombine/intrinsics.ll @@ -144,3 +144,18 @@ entry: ; CHECK-NEXT: %pop.cmp = icmp eq i32 %b, 0 ; CHECK-NEXT: volatile store i1 %pop.cmp, i1* %c } + + +define i32 @cttz_simplify1(i32 %x) nounwind readnone ssp { + %tmp1 = tail call i32 @llvm.ctlz.i32(i32 %x) ; <i32> [#uses=1] + %shr3 = lshr i32 %tmp1, 5 ; <i32> [#uses=1] + ret i32 %shr3 + +; CHECK: @cttz_simplify1 +; CHECK: icmp eq i32 %x, 0 +; CHECK-NEXT: zext i1 +; CHECK-NEXT: ret i32 +} + +declare i32 @llvm.ctlz.i32(i32) nounwind readnone + diff --git a/test/Transforms/InstCombine/load-select.ll b/test/Transforms/InstCombine/load-select.ll new file mode 100644 index 000000000000..f3d83dc8210e --- /dev/null +++ b/test/Transforms/InstCombine/load-select.ll @@ -0,0 +1,16 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32" + +@a = constant [2 x i32] [i32 3, i32 6] ; <[2 x i32]*> [#uses=2] + +define i32 @b(i32 %y) nounwind readonly { +; CHECK: @b +; CHECK-NOT: load +; CHECK: ret i32 +entry: + %0 = icmp eq i32 %y, 0 ; <i1> [#uses=1] + %storemerge = select i1 %0, i32* getelementptr inbounds ([2 x i32]* @a, i32 0, i32 1), i32* getelementptr inbounds ([2 x i32]* @a, i32 0, i32 0) ; <i32*> [#uses=1] + %1 = load i32* %storemerge, align 4 ; <i32> [#uses=1] + ret i32 %1 +} diff --git a/test/Transforms/InstCombine/logical-select.ll b/test/Transforms/InstCombine/logical-select.ll index ece8bc317e5a..bb59817a4f69 100644 --- a/test/Transforms/InstCombine/logical-select.ll +++ b/test/Transforms/InstCombine/logical-select.ll @@ -1,7 +1,5 @@ -; RUN: opt < %s -instcombine -S > %t -; RUN: grep select %t | count 5 -; RUN: not grep and %t -; RUN: not grep or %t +; RUN: opt < %s -instcombine -S | FileCheck %s + define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %e = icmp slt i32 %a, %b @@ -11,6 +9,9 @@ define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %i = and i32 %d, %h %j = or i32 %g, %i ret i32 %j +; CHECK: %e = icmp slt i32 %a, %b +; CHECK: %j = select i1 %e, i32 %c, i32 %d +; CHECK: ret i32 %j } define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %e = icmp slt i32 %a, %b @@ -20,7 +21,11 @@ define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { %i = and i32 %d, %h %j = or i32 %i, %g ret i32 %j +; CHECK: %e = icmp slt i32 %a, %b +; CHECK: %j = select i1 %e, i32 %c, i32 %d +; CHECK: ret i32 %j } + define i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { entry: %0 = icmp slt i32 %a, %b @@ -30,6 +35,9 @@ entry: %2 = and i32 %not, %d %3 = or i32 %1, %2 ret i32 %3 +; CHECK: %0 = icmp slt i32 %a, %b +; CHECK: %1 = select i1 %0, i32 %c, i32 %d +; CHECK: ret i32 %1 } define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { entry: @@ -40,6 +48,9 @@ entry: %2 = and i32 %iftmp, %d %3 = or i32 %1, %2 ret i32 %3 +; CHECK: %0 = icmp slt i32 %a, %b +; CHECK: %1 = select i1 %0, i32 %c, i32 %d +; CHECK: ret i32 %1 } define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { @@ -51,4 +62,7 @@ entry: %2 = and i32 %not, %d %3 = or i32 %1, %2 ret i32 %3 +; CHECK: %0 = icmp slt i32 %a, %b +; CHECK: %1 = select i1 %0, i32 %c, i32 %d +; CHECK: ret i32 %1 } diff --git a/test/Transforms/InstCombine/objsize.ll b/test/Transforms/InstCombine/objsize.ll new file mode 100644 index 000000000000..dbc7d31c3925 --- /dev/null +++ b/test/Transforms/InstCombine/objsize.ll @@ -0,0 +1,75 @@ +; Test a pile of objectsize bounds checking. +; RUN: opt < %s -instcombine -S | FileCheck %s +; We need target data to get the sizes of the arrays and structures. +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" + +@a = private global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*> +@.str = private constant [8 x i8] c"abcdefg\00" ; <[8 x i8]*> + +define i32 @foo() nounwind { +; CHECK: @foo +; CHECK-NEXT: ret i32 60 + %1 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false) + ret i32 %1 +} + +define i8* @bar() nounwind { +; CHECK: @bar +entry: + %retval = alloca i8* + %0 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false) + %cmp = icmp ne i32 %0, -1 +; CHECK: br i1 true + br i1 %cmp, label %cond.true, label %cond.false + +cond.true: + %1 = load i8** %retval; + ret i8* %1; + +cond.false: + %2 = load i8** %retval; + ret i8* %2; +} + +define i32 @f() nounwind { +; CHECK: @f +; CHECK-NEXT: ret i32 0 + %1 = call i32 @llvm.objectsize.i32(i8* getelementptr ([60 x i8]* @a, i32 1, i32 0), i1 false) + ret i32 %1 +} + +@window = external global [0 x i8] + +define i1 @baz() nounwind { +; CHECK: @baz +; CHECK-NEXT: ret i1 true + %1 = tail call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([0 x i8]* @window, i32 0, i32 0), i1 false) + %2 = icmp eq i32 %1, -1 + ret i1 %2 +} + +define void @test1(i8* %q, i32 %x) nounwind noinline { +; CHECK: @test1 +; CHECK: objectsize.i32 +entry: + %0 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([0 x i8]* @window, i32 0, i32 10), i1 false) ; <i64> [#uses=1] + %1 = icmp eq i32 %0, -1 ; <i1> [#uses=1] + br i1 %1, label %"47", label %"46" + +"46": ; preds = %entry + unreachable + +"47": ; preds = %entry + unreachable +} + +@.str5 = private constant [9 x i32] [i32 97, i32 98, i32 99, i32 100, i32 0, i32 + 101, i32 102, i32 103, i32 0], align 4 ; +define i32 @test2() nounwind { +; CHECK: @test2 +; CHECK-NEXT: ret i32 34 + %1 = call i32 @llvm.objectsize.i32(i8* getelementptr (i8* bitcast ([9 x i32]* @.str5 to i8*), i32 2), i1 false) + ret i32 %1 +} + +declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
\ No newline at end of file diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll index 2040f3da8f9c..189be1050fbd 100644 --- a/test/Transforms/InstCombine/or.ll +++ b/test/Transforms/InstCombine/or.ll @@ -336,3 +336,17 @@ define i64 @test31(i64 %A) nounwind readnone ssp noredzone { ; CHECK-NEXT: %F = and i64 %bitfield, 4294941946 ; CHECK-NEXT: ret i64 %F } + +define <4 x i32> @test32(<4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32> %vecinit6.i191) { + %and.i135 = sext <4 x i1> %and.i1352 to <4 x i32> ; <<4 x i32>> [#uses=2] + %and.i129 = and <4 x i32> %vecinit6.i176, %and.i135 ; <<4 x i32>> [#uses=1] + %neg.i = xor <4 x i32> %and.i135, <i32 -1, i32 -1, i32 -1, i32 -1> ; <<4 x i32>> [#uses=1] + %and.i = and <4 x i32> %vecinit6.i191, %neg.i ; <<4 x i32>> [#uses=1] + %or.i = or <4 x i32> %and.i, %and.i129 ; <<4 x i32>> [#uses=1] + ret <4 x i32> %or.i +; Don't turn this into a vector select until codegen matures to handle them +; better. +; CHECK: @test32 +; CHECK: or <4 x i32> %and.i, %and.i129 +} + diff --git a/test/Transforms/InstCombine/signext.ll b/test/Transforms/InstCombine/signext.ll index 1c52b62df4e0..49384d6275e8 100644 --- a/test/Transforms/InstCombine/signext.ll +++ b/test/Transforms/InstCombine/signext.ll @@ -8,8 +8,8 @@ define i32 @test1(i32 %x) { %tmp.3 = add i32 %tmp.2, 32768 ; <i32> [#uses=1] ret i32 %tmp.3 ; CHECK: @test1 -; CHECK: %sext1 = shl i32 %x, 16 -; CHECK: %tmp.3 = ashr i32 %sext1, 16 +; CHECK: %sext = shl i32 %x, 16 +; CHECK: %tmp.3 = ashr i32 %sext, 16 ; CHECK: ret i32 %tmp.3 } @@ -19,8 +19,8 @@ define i32 @test2(i32 %x) { %tmp.3 = add i32 %tmp.2, -32768 ; <i32> [#uses=1] ret i32 %tmp.3 ; CHECK: @test2 -; CHECK: %sext1 = shl i32 %x, 16 -; CHECK: %tmp.3 = ashr i32 %sext1, 16 +; CHECK: %sext = shl i32 %x, 16 +; CHECK: %tmp.3 = ashr i32 %sext, 16 ; CHECK: ret i32 %tmp.3 } @@ -50,8 +50,8 @@ define i32 @test5(i32 %x) { %tmp.3 = add i32 %tmp.2, -128 ; <i32> [#uses=1] ret i32 %tmp.3 ; CHECK: @test5 -; CHECK: %sext1 = shl i32 %x, 24 -; CHECK: %tmp.3 = ashr i32 %sext1, 24 +; CHECK: %sext = shl i32 %x, 24 +; CHECK: %tmp.3 = ashr i32 %sext, 24 ; CHECK: ret i32 %tmp.3 } @@ -74,3 +74,14 @@ define i32 @test7(i16 %P) { ; CHECK: %tmp.5 = sext i16 %P to i32 ; CHECK: ret i32 %tmp.5 } + +define i32 @test8(i32 %x) nounwind readnone { +entry: + %shr = lshr i32 %x, 5 ; <i32> [#uses=1] + %xor = xor i32 %shr, 67108864 ; <i32> [#uses=1] + %sub = add i32 %xor, -67108864 ; <i32> [#uses=1] + ret i32 %sub +; CHECK: @test8 +; CHECK: %sub = ashr i32 %x, 5 +; CHECK: ret i32 %sub +} diff --git a/test/Transforms/InstCombine/sub.ll b/test/Transforms/InstCombine/sub.ll index fa0322a44e80..29bd7be2ff84 100644 --- a/test/Transforms/InstCombine/sub.ll +++ b/test/Transforms/InstCombine/sub.ll @@ -272,4 +272,12 @@ define i64 @test25(i8* %P, i64 %A){ ; CHECK-NEXT: ret i64 } +define i32 @test26(i32 %x) { + %shl = shl i32 3, %x + %neg = sub i32 0, %shl + ret i32 %neg +; CHECK: @test26 +; CHECK-NEXT: shl i32 -3 +; CHECK-NEXT: ret i32 +} diff --git a/test/Transforms/InstCombine/vector-casts.ll b/test/Transforms/InstCombine/vector-casts.ll index 470d48547532..24bd04dcb2db 100644 --- a/test/Transforms/InstCombine/vector-casts.ll +++ b/test/Transforms/InstCombine/vector-casts.ll @@ -51,6 +51,22 @@ entry: } +; rdar://7434900 +define <2 x i64> @test5(<4 x float> %a, <4 x float> %b) nounwind readnone { +entry: + %cmp = fcmp ult <4 x float> %a, zeroinitializer + %sext = sext <4 x i1> %cmp to <4 x i32> + %cmp4 = fcmp ult <4 x float> %b, zeroinitializer + %sext5 = sext <4 x i1> %cmp4 to <4 x i32> + %and = and <4 x i32> %sext, %sext5 + %conv = bitcast <4 x i32> %and to <2 x i64> + ret <2 x i64> %conv + +; CHECK: @test5 +; CHECK: sext <4 x i1> %cmp to <4 x i32> +; CHECK: sext <4 x i1> %cmp4 to <4 x i32> +} + define void @convert(<2 x i32>* %dst.addr, <2 x i64> %src) nounwind { entry: |
