diff options
Diffstat (limited to 'test/Transforms/LoopStrengthReduce/X86')
3 files changed, 147 insertions, 8 deletions
diff --git a/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll b/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll new file mode 100644 index 0000000000000..9a7f4865c5913 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll @@ -0,0 +1,99 @@ +; RUN: opt < %s -loop-reduce -S -mtriple=x86_64-unknown-unknown | grep "phi double" | count 1 + +define void @foobar(i32 %n) nounwind { +entry: + icmp eq i32 %n, 0 ; <i1>:0 [#uses=2] + br i1 %0, label %return, label %bb.nph + +bb.nph: ; preds = %entry + %umax = select i1 %0, i32 1, i32 %n ; <i32> [#uses=1] + br label %bb + +bb: ; preds = %bb, %bb.nph + %i.03 = phi i32 [ 0, %bb.nph ], [ %indvar.next, %bb ] ; <i32> [#uses=3] + tail call void @bar( i32 %i.03 ) nounwind + uitofp i32 %i.03 to double ; <double>:1 [#uses=1] + tail call void @foo( double %1 ) nounwind + %indvar.next = add i32 %i.03, 1 ; <i32> [#uses=2] + %exitcond = icmp eq i32 %indvar.next, %umax ; <i1> [#uses=1] + br i1 %exitcond, label %return, label %bb + +return: ; preds = %bb, %entry + ret void +} + +; Unable to eliminate cast because the mantissa bits for double are not enough +; to hold all of i64 IV bits. +define void @foobar2(i64 %n) nounwind { +entry: + icmp eq i64 %n, 0 ; <i1>:0 [#uses=2] + br i1 %0, label %return, label %bb.nph + +bb.nph: ; preds = %entry + %umax = select i1 %0, i64 1, i64 %n ; <i64> [#uses=1] + br label %bb + +bb: ; preds = %bb, %bb.nph + %i.03 = phi i64 [ 0, %bb.nph ], [ %indvar.next, %bb ] ; <i64> [#uses=3] + trunc i64 %i.03 to i32 ; <i32>:1 [#uses=1] + tail call void @bar( i32 %1 ) nounwind + uitofp i64 %i.03 to double ; <double>:2 [#uses=1] + tail call void @foo( double %2 ) nounwind + %indvar.next = add i64 %i.03, 1 ; <i64> [#uses=2] + %exitcond = icmp eq i64 %indvar.next, %umax ; <i1> [#uses=1] + br i1 %exitcond, label %return, label %bb + +return: ; preds = %bb, %entry + ret void +} + +; Unable to eliminate cast due to potentional overflow. +define void @foobar3() nounwind { +entry: + tail call i32 (...)* @nn( ) nounwind ; <i32>:0 [#uses=1] + icmp eq i32 %0, 0 ; <i1>:1 [#uses=1] + br i1 %1, label %return, label %bb + +bb: ; preds = %bb, %entry + %i.03 = phi i32 [ 0, %entry ], [ %3, %bb ] ; <i32> [#uses=3] + tail call void @bar( i32 %i.03 ) nounwind + uitofp i32 %i.03 to double ; <double>:2 [#uses=1] + tail call void @foo( double %2 ) nounwind + add i32 %i.03, 1 ; <i32>:3 [#uses=2] + tail call i32 (...)* @nn( ) nounwind ; <i32>:4 [#uses=1] + icmp ugt i32 %4, %3 ; <i1>:5 [#uses=1] + br i1 %5, label %bb, label %return + +return: ; preds = %bb, %entry + ret void +} + +; Unable to eliminate cast due to overflow. +define void @foobar4() nounwind { +entry: + br label %bb.nph + +bb.nph: ; preds = %entry + br label %bb + +bb: ; preds = %bb, %bb.nph + %i.03 = phi i8 [ 0, %bb.nph ], [ %indvar.next, %bb ] ; <i32> [#uses=3] + %tmp2 = sext i8 %i.03 to i32 ; <i32>:0 [#uses=1] + tail call void @bar( i32 %tmp2 ) nounwind + %tmp3 = uitofp i8 %i.03 to double ; <double>:1 [#uses=1] + tail call void @foo( double %tmp3 ) nounwind + %indvar.next = add i8 %i.03, 1 ; <i32> [#uses=2] + %tmp = sext i8 %indvar.next to i32 + %exitcond = icmp eq i32 %tmp, 32767 ; <i1> [#uses=1] + br i1 %exitcond, label %return, label %bb + +return: ; preds = %bb, %entry + ret void +} + +declare void @bar(i32) + +declare void @foo(double) + +declare i32 @nn(...) + diff --git a/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll b/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll new file mode 100644 index 0000000000000..a932b47925865 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll @@ -0,0 +1,43 @@ +; RUN: opt < %s -loop-reduce -S -mtriple=x86_64-unknown-unknown | FileCheck %s +; +; Test LSR's OptimizeShadowIV. Handle a floating-point IV with a +; nonzero initial value. +; rdar://9786536 + +; First, make sure LSR doesn't crash on an empty IVUsers list. +; CHECK: @dummyIV +; CHECK-NOT: phi +; CHECK-NOT: sitofp +; CHECK: br +define void @dummyIV() nounwind { +entry: + br label %loop + +loop: + %i.01 = phi i32 [ -39, %entry ], [ %inc, %loop ] + %conv = sitofp i32 %i.01 to double + %inc = add nsw i32 %i.01, 1 + br i1 undef, label %loop, label %for.end + +for.end: + unreachable +} + +; Now check that the computed double constant is correct. +; CHECK: @doubleIV +; CHECK: phi double [ -3.900000e+01, %entry ] +; CHECK: br +define void @doubleIV() nounwind { +entry: + br label %loop + +loop: + %i.01 = phi i32 [ -39, %entry ], [ %inc, %loop ] + %conv = sitofp i32 %i.01 to double + %div = fdiv double %conv, 4.000000e+01 + %inc = add nsw i32 %i.01, 1 + br i1 undef, label %loop, label %for.end + +for.end: + unreachable +} diff --git a/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll b/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll index 5108650962728..eedfc200f48ba 100644 --- a/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll +++ b/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: opt < %s -loop-reduce -S | FileCheck %s ; ; Test LSR's ability to prune formulae that refer to nonexistant ; AddRecs in other loops. @@ -15,13 +15,10 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 target triple = "x86_64-apple-darwin" ; CHECK: @test -; CHECK: # %for.body{{$}} -; dummyiv copy should be removed -; CHECK-NOT: movq -; CHECK: # %for.cond19.preheader -; dummycnt should be removed -; CHECK-NOT: incq -; CHECK: # %for.body23{{$}} +; CHECK: for.body: +; CHECK: %lsr.iv +; CHECK-NOT: %dummyout +; CHECK: ret define i64 @test(i64 %count, float* nocapture %srcrow, i32* nocapture %destrow) nounwind uwtable ssp { entry: %cmp34 = icmp eq i64 %count, 0 |