diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2009-12-15 18:09:07 +0000 |
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2009-12-15 18:09:07 +0000 |
| commit | 571945e6affd20b19264ec22495da418d0fbdbb4 (patch) | |
| tree | 076117cdf3579003f07cad4cdf0593347ce58150 /test/Transforms | |
| parent | 06f9d4012fb8acea3e9861d5722b5965dbb724d9 (diff) | |
Notes
Diffstat (limited to 'test/Transforms')
| -rw-r--r-- | test/Transforms/ConstProp/loads.ll | 9 | ||||
| -rw-r--r-- | test/Transforms/DeadStoreElimination/const-pointers.ll | 12 | ||||
| -rw-r--r-- | test/Transforms/DeadStoreElimination/lifetime-simple.ll | 18 | ||||
| -rw-r--r-- | test/Transforms/GVN/crash-no-aa.ll | 16 | ||||
| -rw-r--r-- | test/Transforms/GVN/crash.ll | 43 | ||||
| -rw-r--r-- | test/Transforms/GVN/lifetime-simple.ll | 4 | ||||
| -rw-r--r-- | test/Transforms/GVN/rle-dominated.ll | 20 | ||||
| -rw-r--r-- | test/Transforms/GVN/rle.ll | 252 | ||||
| -rw-r--r-- | test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll | 14 | ||||
| -rw-r--r-- | test/Transforms/IndVarSimplify/indirectbr.ll | 22 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/compare-signs.ll | 38 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/crash.ll | 11 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/sext-misc.ll | 77 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/sext.ll | 128 | ||||
| -rw-r--r-- | test/Transforms/InstCombine/xor-demorgans.ll | 12 | ||||
| -rw-r--r-- | test/Transforms/JumpThreading/crash.ll | 22 | ||||
| -rw-r--r-- | test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll | 21 |
17 files changed, 579 insertions, 140 deletions
diff --git a/test/Transforms/ConstProp/loads.ll b/test/Transforms/ConstProp/loads.ll index edd26b877254..9151d256b024 100644 --- a/test/Transforms/ConstProp/loads.ll +++ b/test/Transforms/ConstProp/loads.ll @@ -101,3 +101,12 @@ entry: } +; PR5551 +@test12g = private constant [6 x i8] c"a\00b\00\00\00" + +define i16 @test12() { + %a = load i16* getelementptr inbounds ([3 x i16]* bitcast ([6 x i8]* @test12g to [3 x i16]*), i32 0, i64 1) + ret i16 %a +; CHECK: @test12 +; CHECK: ret i16 98 +} diff --git a/test/Transforms/DeadStoreElimination/const-pointers.ll b/test/Transforms/DeadStoreElimination/const-pointers.ll index ce18c6fb8197..ce3b24c996fd 100644 --- a/test/Transforms/DeadStoreElimination/const-pointers.ll +++ b/test/Transforms/DeadStoreElimination/const-pointers.ll @@ -11,7 +11,7 @@ define void @test1(%t* noalias %pp) { %x = load i32* inttoptr (i32 12345 to i32*) store i32 %x, i32* %p ret void -; CHECK define void @test1 +; CHECK: define void @test1 ; CHECK: store ; CHECK-NOT: store ; CHECK: ret void @@ -21,10 +21,10 @@ define void @test3() { store i32 1, i32* @g; <-- This is dead. store i32 42, i32* @g ret void -;CHECK define void @test3 -;CHECK: store -;CHECK-NOT: store -;CHECK: ret void +; CHECK: define void @test3 +; CHECK: store +; CHECK-NOT: store +; CHECK: ret void } define void @test4(i32* %p) { @@ -32,7 +32,7 @@ define void @test4(i32* %p) { %x = load i32* @g; <-- %p and @g could alias store i32 %x, i32* %p ret void -; CHECK define void @test4 +; CHECK: define void @test4 ; CHECK: store ; CHECK: store ; CHECK: ret void diff --git a/test/Transforms/DeadStoreElimination/lifetime-simple.ll b/test/Transforms/DeadStoreElimination/lifetime-simple.ll deleted file mode 100644 index 430e7006351d..000000000000 --- a/test/Transforms/DeadStoreElimination/lifetime-simple.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: opt < %s -dse -S | FileCheck %s - -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" -target triple = "i386-apple-darwin7" - -define i8 @test2(i8* %P) nounwind { -; CHECK: @test2 -; CHECK-NOT: store i8 1 -; CHECK: ret i8 0 -entry: - call void @llvm.lifetime.start(i64 32, i8* %P) - call void @llvm.lifetime.end(i64 32, i8* %P) - store i8 1, i8* %P - ret i8 0 -} - -declare {}* @llvm.lifetime.start(i64 %S, i8* nocapture %P) readonly -declare void @llvm.lifetime.end(i64 %S, i8* nocapture %P)
\ No newline at end of file diff --git a/test/Transforms/GVN/crash-no-aa.ll b/test/Transforms/GVN/crash-no-aa.ll new file mode 100644 index 000000000000..dae65ddb2fe7 --- /dev/null +++ b/test/Transforms/GVN/crash-no-aa.ll @@ -0,0 +1,16 @@ +; RUN: opt -no-aa -gvn -S %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v1 +28:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-unknown-freebsd8.0" + +; PR5744 +define i32 @test1({i16, i32} *%P) { + %P2 = getelementptr {i16, i32} *%P, i32 0, i32 0 + store i16 42, i16* %P2 + + %P3 = getelementptr {i16, i32} *%P, i32 0, i32 1 + %V = load i32* %P3 + ret i32 %V +} + diff --git a/test/Transforms/GVN/crash.ll b/test/Transforms/GVN/crash.ll index 30563cd5848a..9167b6ec6848 100644 --- a/test/Transforms/GVN/crash.ll +++ b/test/Transforms/GVN/crash.ll @@ -92,3 +92,46 @@ bb64.i: ; Unreachable bb66.i: ; Unreachable br label %bb69.i } + + + +; rdar://7438974 + +@g = external global i64, align 8 + +define i32* @foo() { +do.end17.i: + %tmp18.i = load i7** undef + %tmp1 = bitcast i7* %tmp18.i to i8* + br i1 undef, label %do.body36.i, label %if.then21.i + +if.then21.i: + %tmp2 = bitcast i7* %tmp18.i to i8* + ret i32* undef + +do.body36.i: + %ivar38.i = load i64* @g + %tmp3 = bitcast i7* %tmp18.i to i8* + %add.ptr39.sum.i = add i64 %ivar38.i, 8 + %tmp40.i = getelementptr inbounds i8* %tmp3, i64 %add.ptr39.sum.i + %tmp4 = bitcast i8* %tmp40.i to i64* + %tmp41.i = load i64* %tmp4 + br i1 undef, label %if.then48.i, label %do.body57.i + +if.then48.i: + %call54.i = call i32 @foo2() + br label %do.body57.i + +do.body57.i: + %tmp58.i = load i7** undef + %ivar59.i = load i64* @g + %tmp5 = bitcast i7* %tmp58.i to i8* + %add.ptr65.sum.i = add i64 %ivar59.i, 8 + %tmp66.i = getelementptr inbounds i8* %tmp5, i64 %add.ptr65.sum.i + %tmp6 = bitcast i8* %tmp66.i to i64* + %tmp67.i = load i64* %tmp6 + ret i32* undef +} + +declare i32 @foo2() + diff --git a/test/Transforms/GVN/lifetime-simple.ll b/test/Transforms/GVN/lifetime-simple.ll index 00a0c2907c16..8139246dcf3c 100644 --- a/test/Transforms/GVN/lifetime-simple.ll +++ b/test/Transforms/GVN/lifetime-simple.ll @@ -4,9 +4,9 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f3 target triple = "i386-apple-darwin7" define i8 @test(i8* %P) nounwind { -; CHECK: @test +; CHECK: lifetime.start ; CHECK-NOT: load -; CHECK: ret i8 undef +; CHECK: lifetime.end entry: call void @llvm.lifetime.start(i64 32, i8* %P) %0 = load i8* %P diff --git a/test/Transforms/GVN/rle-dominated.ll b/test/Transforms/GVN/rle-dominated.ll deleted file mode 100644 index e86f5929b99b..000000000000 --- a/test/Transforms/GVN/rle-dominated.ll +++ /dev/null @@ -1,20 +0,0 @@ -; RUN: opt < %s -gvn -S | grep load | count 2 - -define i32 @main(i32** %p) { -block1: - %z = load i32** %p - br i1 true, label %block2, label %block3 - -block2: - %a = load i32** %p - br label %block4 - -block3: - %b = load i32** %p - br label %block4 - -block4: - %c = load i32** %p - %d = load i32* %c - ret i32 %d -} diff --git a/test/Transforms/GVN/rle.ll b/test/Transforms/GVN/rle.ll index cdd1f4fa4e89..d419fd24240c 100644 --- a/test/Transforms/GVN/rle.ll +++ b/test/Transforms/GVN/rle.ll @@ -131,6 +131,84 @@ define i8* @coerce_mustalias7(i64 %V, i64* %P) { ; CHECK: ret i8* } +; memset -> i16 forwarding. +define signext i16 @memset_to_i16_local(i16* %A) nounwind ssp { +entry: + %conv = bitcast i16* %A to i8* + tail call void @llvm.memset.i64(i8* %conv, i8 1, i64 200, i32 1) + %arrayidx = getelementptr inbounds i16* %A, i64 42 + %tmp2 = load i16* %arrayidx + ret i16 %tmp2 +; CHECK: @memset_to_i16_local +; CHECK-NOT: load +; CHECK: ret i16 257 +} + +; memset -> float forwarding. +define float @memset_to_float_local(float* %A, i8 %Val) nounwind ssp { +entry: + %conv = bitcast float* %A to i8* ; <i8*> [#uses=1] + tail call void @llvm.memset.i64(i8* %conv, i8 %Val, i64 400, i32 1) + %arrayidx = getelementptr inbounds float* %A, i64 42 ; <float*> [#uses=1] + %tmp2 = load float* %arrayidx ; <float> [#uses=1] + ret float %tmp2 +; CHECK: @memset_to_float_local +; CHECK-NOT: load +; CHECK: zext +; CHECK-NEXT: shl +; CHECK-NEXT: or +; CHECK-NEXT: shl +; CHECK-NEXT: or +; CHECK-NEXT: bitcast +; CHECK-NEXT: ret float +} + +;; non-local memset -> i16 load forwarding. +define i16 @memset_to_i16_nonlocal0(i16* %P, i1 %cond) { + %P3 = bitcast i16* %P to i8* + br i1 %cond, label %T, label %F +T: + tail call void @llvm.memset.i64(i8* %P3, i8 1, i64 400, i32 1) + br label %Cont + +F: + tail call void @llvm.memset.i64(i8* %P3, i8 2, i64 400, i32 1) + br label %Cont + +Cont: + %P2 = getelementptr i16* %P, i32 4 + %A = load i16* %P2 + ret i16 %A + +; CHECK: @memset_to_i16_nonlocal0 +; CHECK: Cont: +; CHECK-NEXT: %A = phi i16 [ 514, %F ], [ 257, %T ] +; CHECK-NOT: load +; CHECK: ret i16 %A +} + +@GCst = constant {i32, float, i32 } { i32 42, float 14., i32 97 } + +; memset -> float forwarding. +define float @memcpy_to_float_local(float* %A) nounwind ssp { +entry: + %conv = bitcast float* %A to i8* ; <i8*> [#uses=1] + tail call void @llvm.memcpy.i64(i8* %conv, i8* bitcast ({i32, float, i32 }* @GCst to i8*), i64 12, i32 1) + %arrayidx = getelementptr inbounds float* %A, i64 1 ; <float*> [#uses=1] + %tmp2 = load float* %arrayidx ; <float> [#uses=1] + ret float %tmp2 +; CHECK: @memcpy_to_float_local +; CHECK-NOT: load +; CHECK: ret float 1.400000e+01 +} + + +declare void @llvm.memset.i64(i8* nocapture, i8, i64, i32) nounwind +declare void @llvm.memcpy.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind + + + + ;; non-local i32/float -> i8 load forwarding. define i8 @coerce_mustalias_nonlocal0(i32* %P, i1 %cond) { %P2 = bitcast i32* %P to float* @@ -155,6 +233,7 @@ Cont: ; CHECK: ret i8 %A } + ;; non-local i32/float -> i8 load forwarding. This also tests that the "P3" ;; bitcast equivalence can be properly phi translated. define i8 @coerce_mustalias_nonlocal1(i32* %P, i1 %cond) { @@ -279,4 +358,177 @@ Cont: ; CHECK: ret i8 %A } +define i32 @chained_load(i32** %p) { +block1: + %z = load i32** %p + br i1 true, label %block2, label %block3 + +block2: + %a = load i32** %p + br label %block4 + +block3: + %b = load i32** %p + br label %block4 + +block4: + %c = load i32** %p + %d = load i32* %c + ret i32 %d + +; CHECK: @chained_load +; CHECK: %z = load i32** %p +; CHECK-NOT: load +; CHECK: %d = load i32* %z +; CHECK-NEXT: ret i32 %d +} + + +declare i1 @cond() readonly +declare i1 @cond2() readonly + +define i32 @phi_trans2() { +; CHECK: @phi_trans2 +entry: + %P = alloca i32, i32 400 + br label %F1 + +F1: + %A = phi i32 [1, %entry], [2, %F] + %cond2 = call i1 @cond() + br i1 %cond2, label %T1, label %TY + +T1: + %P2 = getelementptr i32* %P, i32 %A + %x = load i32* %P2 + %cond = call i1 @cond2() + br i1 %cond, label %TX, label %F + +F: + %P3 = getelementptr i32* %P, i32 2 + store i32 17, i32* %P3 + + store i32 42, i32* %P2 ; Provides "P[A]". + br label %F1 + +TX: + ; This load should not be compiled to 'ret i32 42'. An overly clever + ; implementation of GVN would see that we're returning 17 if the loop + ; executes once or 42 if it executes more than that, but we'd have to do + ; loop restructuring to expose this, and GVN shouldn't do this sort of CFG + ; transformation. + +; CHECK: TX: +; CHECK: ret i32 %x + ret i32 %x +TY: + ret i32 0 +} + +define i32 @phi_trans3(i32* %p) { +; CHECK: @phi_trans3 +block1: + br i1 true, label %block2, label %block3 + +block2: + store i32 87, i32* %p + br label %block4 + +block3: + %p2 = getelementptr i32* %p, i32 43 + store i32 97, i32* %p2 + br label %block4 + +block4: + %A = phi i32 [-1, %block2], [42, %block3] + br i1 true, label %block5, label %exit + +; CHECK: block4: +; CHECK-NEXT: %D = phi i32 [ 87, %block2 ], [ 97, %block3 ] +; CHECK-NOT: load + +block5: + %B = add i32 %A, 1 + br i1 true, label %block6, label %exit + +block6: + %C = getelementptr i32* %p, i32 %B + br i1 true, label %block7, label %exit + +block7: + %D = load i32* %C + ret i32 %D + +; CHECK: block7: +; CHECK-NEXT: ret i32 %D + +exit: + ret i32 -1 +} + +define i8 @phi_trans4(i8* %p) { +; CHECK: @phi_trans4 +entry: + %X3 = getelementptr i8* %p, i32 192 + store i8 192, i8* %X3 + + %X = getelementptr i8* %p, i32 4 + %Y = load i8* %X + br label %loop + +loop: + %i = phi i32 [4, %entry], [192, %loop] + %X2 = getelementptr i8* %p, i32 %i + %Y2 = load i8* %X2 + +; CHECK: loop: +; CHECK-NEXT: %Y2 = phi i8 [ %Y, %entry ], [ 0, %loop ] +; CHECK-NOT: load i8 + + %cond = call i1 @cond2() + + %Z = bitcast i8 *%X3 to i32* + store i32 0, i32* %Z + br i1 %cond, label %loop, label %out + +out: + %R = add i8 %Y, %Y2 + ret i8 %R +} + +define i8 @phi_trans5(i8* %p) { +; CHECK: @phi_trans5 +entry: + + %X4 = getelementptr i8* %p, i32 2 + store i8 19, i8* %X4 + + %X = getelementptr i8* %p, i32 4 + %Y = load i8* %X + br label %loop + +loop: + %i = phi i32 [4, %entry], [3, %cont] + %X2 = getelementptr i8* %p, i32 %i + %Y2 = load i8* %X2 ; Ensure this load is not being incorrectly replaced. + %cond = call i1 @cond2() + br i1 %cond, label %cont, label %out + +cont: + %Z = getelementptr i8* %X2, i32 -1 + %Z2 = bitcast i8 *%Z to i32* + store i32 50462976, i32* %Z2 ;; (1 << 8) | (2 << 16) | (3 << 24) + + +; CHECK: store i32 +; CHECK-NEXT: getelementptr i8* %p, i32 3 +; CHECK-NEXT: load i8* + br label %loop + +out: + %R = add i8 %Y, %Y2 + ret i8 %R +} + + diff --git a/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll b/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll index 5e639fd8222e..a5be2b17d4ad 100644 --- a/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll +++ b/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll @@ -1,6 +1,8 @@ -; RUN: opt < %s -globalopt -S | grep {define void @a} +; RUN: opt < %s -globalopt -S | FileCheck %s define internal void @f() { +; CHECK-NOT: @f +; CHECK: define void @a ret void } @@ -10,3 +12,13 @@ define void @g() { call void()* @a() ret void } + +@b = alias internal void ()* @g +; CHECK-NOT: @b + +define void @h() { + call void()* @b() +; CHECK: call void @g + ret void +} + diff --git a/test/Transforms/IndVarSimplify/indirectbr.ll b/test/Transforms/IndVarSimplify/indirectbr.ll new file mode 100644 index 000000000000..b4ce153244af --- /dev/null +++ b/test/Transforms/IndVarSimplify/indirectbr.ll @@ -0,0 +1,22 @@ +; RUN: opt < %s -indvars -S -disable-output +; PR5758 + +define zeroext i1 @foo() nounwind { +entry: + indirectbr i8* undef, [label %"202", label %"133"] + +"132": ; preds = %"133" + %0 = add i32 %1, 1 ; <i32> [#uses=1] + br label %"133" + +"133": ; preds = %"132", %entry + %1 = phi i32 [ %0, %"132" ], [ 0, %entry ] ; <i32> [#uses=2] + %2 = icmp eq i32 %1, 4 ; <i1> [#uses=1] + br i1 %2, label %"134", label %"132" + +"134": ; preds = %"133" + ret i1 true + +"202": ; preds = %entry + ret i1 false +} diff --git a/test/Transforms/InstCombine/compare-signs.ll b/test/Transforms/InstCombine/compare-signs.ll index ba638ba36fc0..f8e49110610a 100644 --- a/test/Transforms/InstCombine/compare-signs.ll +++ b/test/Transforms/InstCombine/compare-signs.ll @@ -2,7 +2,7 @@ ; PR5438 ; TODO: This should also optimize down. -;define i32 @bar(i32 %a, i32 %b) nounwind readnone { +;define i32 @test1(i32 %a, i32 %b) nounwind readnone { ;entry: ; %0 = icmp sgt i32 %a, -1 ; <i1> [#uses=1] ; %1 = icmp slt i32 %b, 0 ; <i1> [#uses=1] @@ -11,11 +11,21 @@ ; ret i32 %3 ;} -define i32 @qaz(i32 %a, i32 %b) nounwind readnone { -; CHECK: @qaz +; TODO: This optimizes partially but not all the way. +;define i32 @test2(i32 %a, i32 %b) nounwind readnone { +;entry: +; %0 = and i32 %a, 8 ;<i32> [#uses=1] +; %1 = and i32 %b, 8 ;<i32> [#uses=1] +; %2 = icmp eq i32 %0, %1 ;<i1> [#uses=1] +; %3 = zext i1 %2 to i32 ;<i32> [#uses=1] +; ret i32 %3 +;} + +define i32 @test3(i32 %a, i32 %b) nounwind readnone { +; CHECK: @test3 entry: ; CHECK: xor i32 %a, %b -; CHECK; lshr i32 %0, 31 +; CHECK: lshr i32 %0, 31 ; CHECK: xor i32 %1, 1 %0 = lshr i32 %a, 31 ; <i32> [#uses=1] %1 = lshr i32 %b, 31 ; <i32> [#uses=1] @@ -26,3 +36,23 @@ entry: ; CHECK-NOT: zext ; CHECK: ret i32 %2 } + +; Variation on @test3: checking the 2nd bit in a situation where the 5th bit +; is one, not zero. +define i32 @test3i(i32 %a, i32 %b) nounwind readnone { +; CHECK: @test3i +entry: +; CHECK: xor i32 %a, %b +; CHECK: lshr i32 %0, 31 +; CHECK: xor i32 %1, 1 + %0 = lshr i32 %a, 29 ; <i32> [#uses=1] + %1 = lshr i32 %b, 29 ; <i32> [#uses=1] + %2 = or i32 %0, 35 + %3 = or i32 %1, 35 + %4 = icmp eq i32 %2, %3 ; <i1> [#uses=1] + %5 = zext i1 %4 to i32 ; <i32> [#uses=1] + ret i32 %5 +; CHECK-NOT: icmp +; CHECK-NOT: zext +; CHECK: ret i32 %2 +} diff --git a/test/Transforms/InstCombine/crash.ll b/test/Transforms/InstCombine/crash.ll index 1528f6ddf3c0..82ac57571781 100644 --- a/test/Transforms/InstCombine/crash.ll +++ b/test/Transforms/InstCombine/crash.ll @@ -137,3 +137,14 @@ define arm_apcscc void @test5() { exit: ret void } + + +; PR5673 + +@test6g = external global i32* + +define arm_aapcs_vfpcc i32 @test6(i32 %argc, i8** %argv) nounwind { +entry: + store i32* getelementptr (i32* bitcast (i32 (i32, i8**)* @test6 to i32*), i32 -2048), i32** @test6g, align 4 + unreachable +} diff --git a/test/Transforms/InstCombine/sext-misc.ll b/test/Transforms/InstCombine/sext-misc.ll deleted file mode 100644 index 3346ff87add8..000000000000 --- a/test/Transforms/InstCombine/sext-misc.ll +++ /dev/null @@ -1,77 +0,0 @@ -; RUN: opt < %s -instcombine -S | not grep sext - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" - -declare i32 @llvm.ctpop.i32(i32) -declare i32 @llvm.ctlz.i32(i32) -declare i32 @llvm.cttz.i32(i32) - -define i64 @foo(i32 %x) { - %t = call i32 @llvm.ctpop.i32(i32 %x) - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @boo(i32 %x) { - %t = call i32 @llvm.ctlz.i32(i32 %x) - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @zoo(i32 %x) { - %t = call i32 @llvm.cttz.i32(i32 %x) - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @coo(i32 %x) { - %t = udiv i32 %x, 3 - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @moo(i32 %x) { - %t = urem i32 %x, 30000 - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @yoo(i32 %x) { - %u = lshr i32 %x, 3 - %t = mul i32 %u, 3 - %s = sext i32 %t to i64 - ret i64 %s -} -define i64 @voo(i32 %x) { - %t = and i32 %x, 511 - %u = sub i32 20000, %t - %s = sext i32 %u to i64 - ret i64 %s -} -define i32 @woo(i8 %a, i32 %f, i1 %p, i32* %z) { - %d = lshr i32 %f, 24 - %e = select i1 %p, i32 %d, i32 0 - %s = trunc i32 %e to i16 - %n = sext i16 %s to i32 - ret i32 %n -} - -; rdar://6013816 -define i16 @test(i16 %t, i1 %cond) nounwind { -entry: - br i1 %cond, label %T, label %F -T: - %t2 = sext i16 %t to i32 - br label %F - -F: - %V = phi i32 [%t2, %T], [42, %entry] - %W = trunc i32 %V to i16 - ret i16 %W -} - -; PR2638 -define i32 @test2(i32 %i) nounwind { -entry: - %tmp12 = trunc i32 %i to i8 ; <i8> [#uses=1] - %tmp16 = shl i8 %tmp12, 6 ; <i8> [#uses=1] - %a = ashr i8 %tmp16, 6 ; <i8> [#uses=1] - %b = sext i8 %a to i32 ; <i32> [#uses=1] - ret i32 %b -} - diff --git a/test/Transforms/InstCombine/sext.ll b/test/Transforms/InstCombine/sext.ll new file mode 100644 index 000000000000..6deee1ff5653 --- /dev/null +++ b/test/Transforms/InstCombine/sext.ll @@ -0,0 +1,128 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" + +declare i32 @llvm.ctpop.i32(i32) +declare i32 @llvm.ctlz.i32(i32) +declare i32 @llvm.cttz.i32(i32) + +define i64 @test1(i32 %x) { + %t = call i32 @llvm.ctpop.i32(i32 %x) + %s = sext i32 %t to i64 + ret i64 %s + +; CHECK: @test1 +; CHECK: zext i32 %t +} + +define i64 @test2(i32 %x) { + %t = call i32 @llvm.ctlz.i32(i32 %x) + %s = sext i32 %t to i64 + ret i64 %s + +; CHECK: @test2 +; CHECK: zext i32 %t +} + +define i64 @test3(i32 %x) { + %t = call i32 @llvm.cttz.i32(i32 %x) + %s = sext i32 %t to i64 + ret i64 %s + +; CHECK: @test3 +; CHECK: zext i32 %t +} + +define i64 @test4(i32 %x) { + %t = udiv i32 %x, 3 + %s = sext i32 %t to i64 + ret i64 %s + +; CHECK: @test4 +; CHECK: zext i32 %t +} + +define i64 @test5(i32 %x) { + %t = urem i32 %x, 30000 + %s = sext i32 %t to i64 + ret i64 %s +; CHECK: @test5 +; CHECK: zext i32 %t +} + +define i64 @test6(i32 %x) { + %u = lshr i32 %x, 3 + %t = mul i32 %u, 3 + %s = sext i32 %t to i64 + ret i64 %s +; CHECK: @test6 +; CHECK: zext i32 %t +} + +define i64 @test7(i32 %x) { + %t = and i32 %x, 511 + %u = sub i32 20000, %t + %s = sext i32 %u to i64 + ret i64 %s +; CHECK: @test7 +; CHECK: zext i32 %u to i64 +} + +define i32 @test8(i8 %a, i32 %f, i1 %p, i32* %z) { + %d = lshr i32 %f, 24 + %e = select i1 %p, i32 %d, i32 0 + %s = trunc i32 %e to i16 + %n = sext i16 %s to i32 + ret i32 %n +; CHECK: @test8 +; CHECK: %d = lshr i32 %f, 24 +; CHECK: %n = select i1 %p, i32 %d, i32 0 +; CHECK: ret i32 %n +} + +; rdar://6013816 +define i16 @test9(i16 %t, i1 %cond) nounwind { +entry: + br i1 %cond, label %T, label %F +T: + %t2 = sext i16 %t to i32 + br label %F + +F: + %V = phi i32 [%t2, %T], [42, %entry] + %W = trunc i32 %V to i16 + ret i16 %W +; CHECK: @test9 +; CHECK: T: +; CHECK-NEXT: br label %F +; CHECK: F: +; CHECK-NEXT: phi i16 +; CHECK-NEXT: ret i16 +} + +; PR2638 +define i32 @test10(i32 %i) nounwind { +entry: + %tmp12 = trunc i32 %i to i8 + %tmp16 = shl i8 %tmp12, 6 + %a = ashr i8 %tmp16, 6 + %b = sext i8 %a to i32 + ret i32 %b +; CHECK: @test10 +; CHECK: shl i32 %i, 30 +; CHECK-NEXT: ashr i32 +; CHECK-NEXT: ret i32 +} + +define void @test11(<2 x i16> %srcA, <2 x i16> %srcB, <2 x i16>* %dst) { + %cmp = icmp eq <2 x i16> %srcB, %srcA + %sext = sext <2 x i1> %cmp to <2 x i16> + %tmask = ashr <2 x i16> %sext, <i16 15, i16 15> + store <2 x i16> %tmask, <2 x i16>* %dst + ret void +; CHECK: @test11 +; CHECK-NEXT: icmp eq +; CHECK-NEXT: sext <2 x i1> +; CHECK-NEXT: store <2 x i16> +; CHECK-NEXT: ret +} diff --git a/test/Transforms/InstCombine/xor-demorgans.ll b/test/Transforms/InstCombine/xor-demorgans.ll deleted file mode 100644 index 3383845fb361..000000000000 --- a/test/Transforms/InstCombine/xor-demorgans.ll +++ /dev/null @@ -1,12 +0,0 @@ -; RUN: opt < %s -instcombine -S | not grep {= or} -; PR3266 -; XFAIL: * - -define i1 @foo(i32 %x, i32 %y) nounwind { -.summary: - %0 = icmp sgt i32 %x, 4 ; <i1> [#uses=1] - %1 = icmp sgt i32 %y, 0 ; <i1> [#uses=1] - %.demorgan = or i1 %1, %0 ; <i1> [#uses=1] - %2 = xor i1 %.demorgan, true ; <i1> [#uses=1] - ret i1 %2 -} diff --git a/test/Transforms/JumpThreading/crash.ll b/test/Transforms/JumpThreading/crash.ll index b2b9d69e16d2..361ec6cfb5a1 100644 --- a/test/Transforms/JumpThreading/crash.ll +++ b/test/Transforms/JumpThreading/crash.ll @@ -212,3 +212,25 @@ bb13: bb61: ret void } + + +; PR5698 +define void @test7(i32 %x) { +tailrecurse: + switch i32 %x, label %return [ + i32 2, label %bb2 + i32 3, label %bb + ] + +bb: + switch i32 %x, label %return [ + i32 2, label %bb2 + i32 3, label %tailrecurse + ] + +bb2: + ret void + +return: + ret void +} diff --git a/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll b/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll new file mode 100644 index 000000000000..e3cdbb3d2a40 --- /dev/null +++ b/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll @@ -0,0 +1,21 @@ +; Test for rdar://7452967 +; RUN: opt < %s -licm -disable-output +define void @foo (i8* %v) +{ + entry: + br i1 undef, label %preheader, label %return + + preheader: + br i1 undef, label %loop, label %return + + loop: + indirectbr i8* undef, [label %preheader, label %stuff] + + stuff: + %0 = load i8* undef, align 1 + br label %loop + + return: + ret void + +} |
