diff options
author | dim <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
commit | 7b3392326c40c3c20697816acae597ba7b3144eb (patch) | |
tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /test/Transforms/IndVarSimplify | |
parent | 1176aa52646fe641a4243a246aa7f960c708a274 (diff) | |
download | FreeBSD-src-7b3392326c40c3c20697816acae597ba7b3144eb.zip FreeBSD-src-7b3392326c40c3c20697816acae597ba7b3144eb.tar.gz |
Vendor import of llvm release_30 branch r142614:
http://llvm.org/svn/llvm-project/llvm/branches/release_30@142614
Diffstat (limited to 'test/Transforms/IndVarSimplify')
34 files changed, 560 insertions, 200 deletions
diff --git a/test/Transforms/IndVarSimplify/2003-09-12-MultiplePred.ll b/test/Transforms/IndVarSimplify/2003-09-12-MultiplePred.ll deleted file mode 100644 index ecd5086..0000000 --- a/test/Transforms/IndVarSimplify/2003-09-12-MultiplePred.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -indvars -S | grep indvar - -define i32 @test() { -; <label>:0 - br i1 true, label %LoopHead, label %LoopHead - -LoopHead: ; preds = %LoopHead, %0, %0 - %A = phi i32 [ 7, %0 ], [ 7, %0 ], [ %B, %LoopHead ] ; <i32> [#uses=1] - %B = add i32 %A, 1 ; <i32> [#uses=2] - br i1 true, label %LoopHead, label %Out - -Out: ; preds = %LoopHead - ret i32 %B -} - diff --git a/test/Transforms/IndVarSimplify/2003-12-21-IndVarSize.ll b/test/Transforms/IndVarSimplify/2003-12-21-IndVarSize.ll deleted file mode 100644 index 0fc9c85..0000000 --- a/test/Transforms/IndVarSimplify/2003-12-21-IndVarSize.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -indvars -S | grep indvar | not grep i32 - -@G = global i64 0 ; <i64*> [#uses=1] - -define void @test() { -; <label>:0 - br label %Loop - -Loop: ; preds = %Loop, %0 - %X = phi i64 [ 1, %0 ], [ %X.next, %Loop ] ; <i64> [#uses=2] - %X.next = add i64 %X, 1 ; <i64> [#uses=1] - store i64 %X, i64* @G - br label %Loop -} - diff --git a/test/Transforms/IndVarSimplify/2004-04-05-InvokeCastCrash.ll b/test/Transforms/IndVarSimplify/2004-04-05-InvokeCastCrash.ll index 1ed4c44..708a961 100644 --- a/test/Transforms/IndVarSimplify/2004-04-05-InvokeCastCrash.ll +++ b/test/Transforms/IndVarSimplify/2004-04-05-InvokeCastCrash.ll @@ -110,12 +110,16 @@ declare void @_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTyp declare void @_ZNK4llvm19MachineInstrBuilder7addSImmEi() +declare i32 @__gxx_personality_v0(...) + define void @_ZN4llvm11_GLOBAL__N_22InsertPrologEpilogCode20runOnMachineFunctionERNS_15MachineFunctionE(%"struct.llvm::MachineFunction"* %F) { entry: %tmp.8.i = invoke %"struct.llvm::TargetFrameInfo"* null( %"struct.llvm::TargetMachine"* null ) to label %invoke_cont.0.i unwind label %invoke_catch.0.i ; <%"struct.llvm::TargetFrameInfo"*> [#uses=0] invoke_catch.0.i: ; preds = %invoke_cont.49.i, %invoke_cont.48.i, %invoke_cont.47.i, %invoke_cont.i53.i, %no_exit.i, %invoke_cont.44.i, %invoke_cont.43.i, %invoke_cont.42.i, %invoke_cont.41.i, %invoke_cont.40.i, %invoke_cont.39.i, %invoke_cont.38.i, %invoke_cont.37.i, %then.2.i, %invoke_cont.35.i, %invoke_cont.34.i, %then.1.i, %endif.0.i, %invoke_cont.9.i, %invoke_cont.8.i, %invoke_cont.7.i, %invoke_cont.i.i, %then.0.i, %invoke_cont.4.i, %invoke_cont.3.i, %invoke_cont.2.i, %invoke_cont.1.i, %endif.0.i.i, %tmp.7.i.noexc.i, %invoke_cont.0.i, %entry + %exn0.i = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret void invoke_cont.0.i: ; preds = %entry @@ -164,6 +168,8 @@ tmp.0.i.noexc.i: ; preds = %then.0.i to label %invoke_cont.i.i unwind label %cond_true.i.i cond_true.i.i: ; preds = %tmp.0.i.noexc.i + %exn.i.i = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret void invoke_cont.i.i: ; preds = %tmp.0.i.noexc.i @@ -256,6 +262,8 @@ tmp.0.i.noexc55.i: ; preds = %no_exit.i to label %invoke_cont.i53.i unwind label %cond_true.i52.i cond_true.i52.i: ; preds = %tmp.0.i.noexc55.i + %exn.i52.i = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret void invoke_cont.i53.i: ; preds = %tmp.0.i.noexc55.i diff --git a/test/Transforms/IndVarSimplify/2005-02-11-InvokeCrash.ll b/test/Transforms/IndVarSimplify/2005-02-11-InvokeCrash.ll index aee67cc..a5706ca 100644 --- a/test/Transforms/IndVarSimplify/2005-02-11-InvokeCrash.ll +++ b/test/Transforms/IndVarSimplify/2005-02-11-InvokeCrash.ll @@ -5,9 +5,6 @@ entry: %tmp.7 = invoke i32 @_ZN5ArrayISt7complexIdEE8get_sizeERK10dim_vector( ) to label %invoke_cont.0 unwind label %cond_true.1 ; <i32> [#uses=2] -cond_true.1: ; preds = %entry - unwind - invoke_cont.0: ; preds = %entry %tmp.4.i = bitcast i32 %tmp.7 to i32 ; <i32> [#uses=0] %tmp.14.0.i5 = add i32 %tmp.7, -1 ; <i32> [#uses=1] @@ -17,7 +14,14 @@ no_exit.i: ; preds = %no_exit.i, %invoke_cont.0 %tmp.14.0.i.0 = phi i32 [ %tmp.14.0.i, %no_exit.i ], [ %tmp.14.0.i5, %invoke_cont.0 ] ; <i32> [#uses=1] %tmp.14.0.i = add i32 %tmp.14.0.i.0, -1 ; <i32> [#uses=1] br label %no_exit.i + +cond_true.1: ; preds = %entry + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup + resume { i8*, i32 } %exn } +declare i32 @__gxx_personality_v0(...) + declare i32 @_ZN5ArrayISt7complexIdEE8get_sizeERK10dim_vector() diff --git a/test/Transforms/IndVarSimplify/2005-02-17-TruncateExprCrash.ll b/test/Transforms/IndVarSimplify/2005-02-17-TruncateExprCrash.ll index 70a7a9d..ce043be 100644 --- a/test/Transforms/IndVarSimplify/2005-02-17-TruncateExprCrash.ll +++ b/test/Transforms/IndVarSimplify/2005-02-17-TruncateExprCrash.ll @@ -10,6 +10,8 @@ entry: to label %endif.1 unwind label %then.i.i551 then.i.i551: ; preds = %entry + %exn551 = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret void endif.1: ; preds = %entry @@ -20,6 +22,8 @@ then.2: ; preds = %endif.1 to label %loopentry.0 unwind label %invoke_catch.6 invoke_catch.6: ; preds = %then.2 + %exn6 = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup ret void loopentry.0: ; preds = %then.2 @@ -59,3 +63,5 @@ loopexit.1: ; preds = %no_exit.0, %endif.4 then.i.i: ; preds = %endif.1 ret void } + +declare i32 @__gxx_personality_v0(...) diff --git a/test/Transforms/IndVarSimplify/2009-04-14-shorten_iv_vars.ll b/test/Transforms/IndVarSimplify/2009-04-14-shorten_iv_vars.ll index 0f6267b..dd400be 100644 --- a/test/Transforms/IndVarSimplify/2009-04-14-shorten_iv_vars.ll +++ b/test/Transforms/IndVarSimplify/2009-04-14-shorten_iv_vars.ll @@ -1,6 +1,6 @@ ; RUN: opt < %s -indvars -S | not grep {sext} ; ModuleID = '<stdin>' -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-n:32:64" +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-n32:64" target triple = "x86_64-apple-darwin9.6" @a = external global i32* ; <i32**> [#uses=3] @b = external global i32* ; <i32**> [#uses=3] diff --git a/test/Transforms/IndVarSimplify/2009-04-15-shorten-iv-vars-2.ll b/test/Transforms/IndVarSimplify/2009-04-15-shorten-iv-vars-2.ll index 46d6b38..55e8a50 100644 --- a/test/Transforms/IndVarSimplify/2009-04-15-shorten-iv-vars-2.ll +++ b/test/Transforms/IndVarSimplify/2009-04-15-shorten-iv-vars-2.ll @@ -13,7 +13,7 @@ ; d[(i+2)&15] = e[(i+2)&15]+f[(i+2)&15]+K[i+2]; ; } ;} -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-n:32:64" +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-n32:64" target triple = "x86_64-apple-darwin9.6" @a = external global i32* ; <i32**> [#uses=3] @b = external global i32* ; <i32**> [#uses=3] diff --git a/test/Transforms/IndVarSimplify/2011-09-10-widen-nsw.ll b/test/Transforms/IndVarSimplify/2011-09-10-widen-nsw.ll new file mode 100644 index 0000000..77354f7 --- /dev/null +++ b/test/Transforms/IndVarSimplify/2011-09-10-widen-nsw.ll @@ -0,0 +1,30 @@ +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s +; Test WidenIV::GetExtendedOperandRecurrence. +; add219 should be extended to i64 because it is nsw, even though its +; sext cannot be hoisted outside the loop. + +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-n8:16:32:64" + +define void @test() nounwind { +entry: + br i1 undef, label %for.body11, label %for.end285 + +for.body11: ; preds = %entry + %shl = shl i32 1, 1 + %shl132 = shl i32 %shl, 1 + br label %for.body153 + +for.body153: ; preds = %for.body153, %for.body11 + br i1 undef, label %for.body170, label %for.body153 + +; CHECK: add nsw i64 %indvars.iv, 1 +for.body170: ; preds = %for.body170, %for.body153 + %i2.19 = phi i32 [ %add249, %for.body170 ], [ undef, %for.body153 ] + %add219 = add nsw i32 %i2.19, 1 + %idxprom220 = sext i32 %add219 to i64 + %add249 = add nsw i32 %i2.19, %shl132 + br label %for.body170 + +for.end285: ; preds = %entry + ret void +} diff --git a/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll b/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll new file mode 100644 index 0000000..6a01012 --- /dev/null +++ b/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll @@ -0,0 +1,16 @@ +; RUN: opt < %s -indvars -S | FileCheck %s +; PR10946: Vector IVs are not SCEVable. +; CHECK-NOT: phi +define void @test() nounwind { +allocas: + br i1 undef, label %cif_done, label %for_loop398 + +cif_done: ; preds = %allocas + ret void + +for_loop398: ; preds = %for_loop398, %allocas + %storemerge35 = phi <4 x i32> [ %storemerge, %for_loop398 ], [ undef, %allocas ] + %bincmp431 = icmp sge <4 x i32> %storemerge35, <i32 5, i32 5, i32 5, i32 5> + %storemerge = bitcast <4 x float> undef to <4 x i32> + br label %for_loop398 +} diff --git a/test/Transforms/IndVarSimplify/2011-09-27-hoistsext.ll b/test/Transforms/IndVarSimplify/2011-09-27-hoistsext.ll new file mode 100644 index 0000000..0737489 --- /dev/null +++ b/test/Transforms/IndVarSimplify/2011-09-27-hoistsext.ll @@ -0,0 +1,28 @@ +; RUN: opt < %s -indvars -S | FileCheck %s +; Test indvars' ability to hoist new sext created by WidenIV. +; From ffbench. + +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-n8:16:32:64" +define internal double @fourn(double* %data, i32 %x, i32 %y, i32 %n) nounwind { +; CHECK: entry: +; CHECK: sext +; CHECK: sext +entry: + br label %for.body + +; CHECK: for.body: +; CHECK-NOT: sext +; CHECK: br +for.body: + %i2.115 = phi i32 [ 0, %entry ], [ %add249, %for.body ] + %add174 = add nsw i32 %i2.115, %x + %idxprom177 = sext i32 %add174 to i64 + %arrayidx179 = getelementptr inbounds double* %data, i64 %idxprom177 + %tmp180 = load double* %arrayidx179, align 8 + %add249 = add nsw i32 %i2.115, %y + %cmp168 = icmp sgt i32 %add249, %n + br i1 %cmp168, label %exit, label %for.body + +exit: + ret double %tmp180 +} diff --git a/test/Transforms/IndVarSimplify/ada-loops.ll b/test/Transforms/IndVarSimplify/ada-loops.ll index 9e635fd..154de6f 100644 --- a/test/Transforms/IndVarSimplify/ada-loops.ll +++ b/test/Transforms/IndVarSimplify/ada-loops.ll @@ -1,5 +1,5 @@ ; RUN: opt < %s -indvars -S | FileCheck %s -; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s ; ; PR1301 @@ -9,13 +9,12 @@ ; Note that all four functions should actually be converted to ; memset. However, this test case validates indvars behavior. We ; don't check that phis are "folded together" because that is a job -; for loop strength reduction. But indvars must remove sext, zext, -; trunc, and add i8. +; for loop strength reduction. But indvars must remove sext, zext, and add i8. ; -; CHECK-NOT: {{sext|zext|trunc|add i8}} +; CHECK-NOT: {{sext|zext|add i8}} ; ModuleID = 'ada.bc' -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-n:8:16:32" +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-n8:16:32" target triple = "i686-pc-linux-gnu" define void @kinds__sbytezero([256 x i32]* nocapture %a) nounwind { diff --git a/test/Transforms/IndVarSimplify/addrec-gep.ll b/test/Transforms/IndVarSimplify/addrec-gep.ll index 58cba60..b62d093 100644 --- a/test/Transforms/IndVarSimplify/addrec-gep.ll +++ b/test/Transforms/IndVarSimplify/addrec-gep.ll @@ -1,15 +1,15 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: grep getelementptr %t | count 1 -; RUN: grep {mul .*, 37} %t | count 1 -; RUN: grep {add .*, 5203} %t | count 1 -; RUN: not grep cast %t +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK: getelementptr +; CHECK: mul {{.*}}, 37 +; CHECK: add {{.*}}, 5203 +; CHECK-NOT: cast ; This test tests several things. The load and store should use the ; same address instead of having it computed twice, and SCEVExpander should ; be able to reconstruct the full getelementptr, despite it having a few ; obstacles set in its way. -target datalayout = "e-p:64:64:64-n:32:64" +target datalayout = "e-p:64:64:64-n32:64" define void @foo(i64 %n, i64 %m, i64 %o, i64 %q, double* nocapture %p) nounwind { entry: diff --git a/test/Transforms/IndVarSimplify/ashr-tripcount.ll b/test/Transforms/IndVarSimplify/ashr-tripcount.ll index 09d559f..b47c8ad 100644 --- a/test/Transforms/IndVarSimplify/ashr-tripcount.ll +++ b/test/Transforms/IndVarSimplify/ashr-tripcount.ll @@ -4,7 +4,7 @@ ; Indvars should be able to eliminate all of the sign extensions ; inside the loop. -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-n:32:64" +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-n32:64" @pow_2_tab = external constant [0 x float] ; <[0 x float]*> [#uses=1] @pow_2_025_tab = external constant [0 x float] ; <[0 x float]*> [#uses=1] @i_pow_2_tab = external constant [0 x float] ; <[0 x float]*> [#uses=1] diff --git a/test/Transforms/IndVarSimplify/complex-scev.ll b/test/Transforms/IndVarSimplify/complex-scev.ll index 434c4ec..395377e 100644 --- a/test/Transforms/IndVarSimplify/complex-scev.ll +++ b/test/Transforms/IndVarSimplify/complex-scev.ll @@ -1,7 +1,9 @@ ; The i induction variable looks like a wrap-around, but it really is just ; a simple affine IV. Make sure that indvars eliminates it. -; RUN: opt < %s -indvars -S | grep phi | count 1 +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK: phi +; CHECK-NOT: phi define void @foo() { entry: diff --git a/test/Transforms/IndVarSimplify/crash.ll b/test/Transforms/IndVarSimplify/crash.ll index 516fd80..3335be7 100644 --- a/test/Transforms/IndVarSimplify/crash.ll +++ b/test/Transforms/IndVarSimplify/crash.ll @@ -53,3 +53,37 @@ bb30: ; preds = %bb29 %2 = add nsw i32 %r.0, 1 ; <i32> [#uses=1] br label %bb24 } + +; PR10770 + +declare void @__go_panic() noreturn + +declare void @__go_undefer() + +declare i32 @__gccgo_personality_v0(i32, i64, i8*, i8*) + +define void @main.main() uwtable { +entry: + invoke void @__go_panic() noreturn + to label %0 unwind label %"5.i" + +; <label>:0 ; preds = %entry + unreachable + +"3.i": ; preds = %"7.i", %"5.i" + invoke void @__go_undefer() + to label %main.f.exit unwind label %"7.i" + +"5.i": ; preds = %entry + %1 = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gccgo_personality_v0 + catch i8* null + br label %"3.i" + +"7.i": ; preds = %"3.i" + %2 = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gccgo_personality_v0 + catch i8* null + br label %"3.i" + +main.f.exit: ; preds = %"3.i" + unreachable +} diff --git a/test/Transforms/IndVarSimplify/elim-extend.ll b/test/Transforms/IndVarSimplify/elim-extend.ll index 0367e11..43c162f 100644 --- a/test/Transforms/IndVarSimplify/elim-extend.ll +++ b/test/Transforms/IndVarSimplify/elim-extend.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -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-n8:16:32:64" diff --git a/test/Transforms/IndVarSimplify/floating-point-iv.ll b/test/Transforms/IndVarSimplify/floating-point-iv.ll index 8f4b870..266eebd 100644 --- a/test/Transforms/IndVarSimplify/floating-point-iv.ll +++ b/test/Transforms/IndVarSimplify/floating-point-iv.ll @@ -67,7 +67,8 @@ bb: ; preds = %bb, %entry return: ret void ; CHECK: @test4 -; CHECK: fcmp +; CHECK-NOT: cmp +; CHECK: br i1 false } ; PR6761 @@ -84,9 +85,8 @@ define void @test5() nounwind { exit: ret void - + ; CHECK: @test5 -; CHECK: icmp eq i32 {{.*}}, 10 +; CHECK: icmp slt i32 {{.*}}, 0 ; CHECK-NEXT: br i1 } - diff --git a/test/Transforms/IndVarSimplify/gep-with-mul-base.ll b/test/Transforms/IndVarSimplify/gep-with-mul-base.ll index 19d54ff..7e1e2a3 100644 --- a/test/Transforms/IndVarSimplify/gep-with-mul-base.ll +++ b/test/Transforms/IndVarSimplify/gep-with-mul-base.ll @@ -1,7 +1,16 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: grep add %t | count 6 -; RUN: grep sub %t | count 2 -; RUN: grep mul %t | count 6 +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK: define void @foo +; CHECK: mul +; CHECK: mul +; CHECK: mul +; CHECK: add +; CHECK: sub +; CHECK: define void @bar +; CHECK: mul +; CHECK: mul +; CHECK: mul +; CHECK: add +; CHECK: sub define void @foo(i64 %n, i64 %m, i64 %o, double* nocapture %p) nounwind { entry: diff --git a/test/Transforms/IndVarSimplify/interesting-invoke-use.ll b/test/Transforms/IndVarSimplify/interesting-invoke-use.ll index 8adc0e5..69bea6e 100644 --- a/test/Transforms/IndVarSimplify/interesting-invoke-use.ll +++ b/test/Transforms/IndVarSimplify/interesting-invoke-use.ll @@ -47,9 +47,13 @@ bb178: ; preds = %invcont127 br label %bb123 lpad266: ; preds = %invcont129, %bb128, %bb123 + %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 + cleanup unreachable } +declare i32 @__gxx_personality_v0(...) + declare void @system__img_int__image_integer(%struct.string___XUP* noalias sret, i32) declare void @system__string_ops__str_concat(%struct.string___XUP* noalias sret, [0 x i8]*, %struct.string___XUB*, [0 x i8]*, %struct.string___XUB*) diff --git a/test/Transforms/IndVarSimplify/iv-fold.ll b/test/Transforms/IndVarSimplify/iv-fold.ll new file mode 100644 index 0000000..2e19118 --- /dev/null +++ b/test/Transforms/IndVarSimplify/iv-fold.ll @@ -0,0 +1,56 @@ +; RUN: opt < %s -indvars -enable-iv-rewrite=false -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-n32:64" + +; Indvars should be able to fold IV increments into shr when low bits are zero. +; +; CHECK: @foldIncShr +; CHECK: shr.1 = lshr i32 %0, 5 +define i32 @foldIncShr(i32* %bitmap, i32 %bit_addr, i32 %nbits) nounwind { +entry: + br label %while.body + +while.body: + %0 = phi i32 [ 0, %entry ], [ %inc.2, %while.body ] + %shr = lshr i32 %0, 5 + %arrayidx = getelementptr inbounds i32* %bitmap, i32 %shr + %tmp6 = load i32* %arrayidx, align 4 + %inc.1 = add i32 %0, 1 + %shr.1 = lshr i32 %inc.1, 5 + %arrayidx.1 = getelementptr inbounds i32* %bitmap, i32 %shr.1 + %tmp6.1 = load i32* %arrayidx.1, align 4 + %inc.2 = add i32 %inc.1, 1 + %exitcond.3 = icmp eq i32 %inc.2, 128 + br i1 %exitcond.3, label %while.end, label %while.body + +while.end: + %r = add i32 %tmp6, %tmp6.1 + ret i32 %r +} + +; Invdars should not fold an increment into shr unless 2^shiftBits is +; a multiple of the recurrence step. +; +; CHECK: @noFoldIncShr +; CHECK: shr.1 = lshr i32 %inc.1, 5 +define i32 @noFoldIncShr(i32* %bitmap, i32 %bit_addr, i32 %nbits) nounwind { +entry: + br label %while.body + +while.body: + %0 = phi i32 [ 0, %entry ], [ %inc.3, %while.body ] + %shr = lshr i32 %0, 5 + %arrayidx = getelementptr inbounds i32* %bitmap, i32 %shr + %tmp6 = load i32* %arrayidx, align 4 + %inc.1 = add i32 %0, 1 + %shr.1 = lshr i32 %inc.1, 5 + %arrayidx.1 = getelementptr inbounds i32* %bitmap, i32 %shr.1 + %tmp6.1 = load i32* %arrayidx.1, align 4 + %inc.3 = add i32 %inc.1, 2 + %exitcond.3 = icmp eq i32 %inc.3, 96 + br i1 %exitcond.3, label %while.end, label %while.body + +while.end: + %r = add i32 %tmp6, %tmp6.1 + ret i32 %r +} diff --git a/test/Transforms/IndVarSimplify/iv-sext.ll b/test/Transforms/IndVarSimplify/iv-sext.ll index 6c7a627..04df0f9 100644 --- a/test/Transforms/IndVarSimplify/iv-sext.ll +++ b/test/Transforms/IndVarSimplify/iv-sext.ll @@ -4,7 +4,7 @@ ; inner loop to i64. ; TODO: it should promote hiPart to i64 in the outer loop too. -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-n:32:64" +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-n32:64" define void @t(float* %pTmp1, float* %peakWeight, float* %nrgReducePeakrate, i32 %bandEdgeIndex, float %tmp1) nounwind { entry: diff --git a/test/Transforms/IndVarSimplify/iv-zext.ll b/test/Transforms/IndVarSimplify/iv-zext.ll index 3a05c89..646e6c0 100644 --- a/test/Transforms/IndVarSimplify/iv-zext.ll +++ b/test/Transforms/IndVarSimplify/iv-zext.ll @@ -1,9 +1,9 @@ ; RUN: opt < %s -indvars -S | FileCheck %s -; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s ; CHECK-NOT: and ; CHECK-NOT: zext -target datalayout = "-p:64:64:64-n:32:64" +target datalayout = "-p:64:64:64-n32:64" define void @foo(double* %d, i64 %n) nounwind { entry: diff --git a/test/Transforms/IndVarSimplify/lftr-reuse.ll b/test/Transforms/IndVarSimplify/lftr-reuse.ll new file mode 100644 index 0000000..490eee9 --- /dev/null +++ b/test/Transforms/IndVarSimplify/lftr-reuse.ll @@ -0,0 +1,230 @@ +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s +; +; Make sure that indvars can perform LFTR without a canonical IV. + +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-n8:16:32:64" + +; Perform LFTR using the original pointer-type IV. + +; for(char* p = base; p < base + n; ++p) { +; *p = p-base; +; } +define void @ptriv(i8* %base, i32 %n) nounwind { +entry: + %idx.ext = sext i32 %n to i64 + %add.ptr = getelementptr inbounds i8* %base, i64 %idx.ext + %cmp1 = icmp ult i8* %base, %add.ptr + br i1 %cmp1, label %for.body, label %for.end + +; CHECK: for.body: +; CHECK: phi i8* +; CHECK-NOT: phi +; CHECK-NOT: add +; CHECK: icmp ne i8* +; CHECK: br i1 +for.body: + %p.02 = phi i8* [ %base, %entry ], [ %incdec.ptr, %for.body ] + ; cruft to make the IV useful + %sub.ptr.lhs.cast = ptrtoint i8* %p.02 to i64 + %sub.ptr.rhs.cast = ptrtoint i8* %base to i64 + %sub.ptr.sub = sub i64 %sub.ptr.lhs.cast, %sub.ptr.rhs.cast + %conv = trunc i64 %sub.ptr.sub to i8 + store i8 %conv, i8* %p.02 + %incdec.ptr = getelementptr inbounds i8* %p.02, i32 1 + %cmp = icmp ult i8* %incdec.ptr, %add.ptr + br i1 %cmp, label %for.body, label %for.end + +for.end: + ret void +} + +; It would be nice if SCEV and any loop analysis could assume that +; preheaders exist. Unfortunately it is not always the case. This test +; checks that SCEVExpander can handle an outer loop that has not yet +; been simplified. As a result, the inner loop's exit test will not be +; rewritten. +define void @expandOuterRecurrence(i32 %arg) nounwind { +entry: + %sub1 = sub nsw i32 %arg, 1 + %cmp1 = icmp slt i32 0, %sub1 + br i1 %cmp1, label %outer, label %exit + +outer: + %i = phi i32 [ 0, %entry ], [ %i.inc, %outer.inc ] + %sub2 = sub nsw i32 %arg, %i + %sub3 = sub nsw i32 %sub2, 1 + %cmp2 = icmp slt i32 0, %sub3 + br i1 %cmp2, label %inner.ph, label %outer.inc + +inner.ph: + br label %inner + +; CHECK: inner: +; CHECK: icmp slt +; CHECK: br i1 +inner: + %j = phi i32 [ 0, %inner.ph ], [ %j.inc, %inner ] + %j.inc = add nsw i32 %j, 1 + %cmp3 = icmp slt i32 %j.inc, %sub3 + br i1 %cmp3, label %inner, label %outer.inc + +; CHECK: outer.inc: +; CHECK: icmp ne +; CHECK: br i1 +outer.inc: + %i.inc = add nsw i32 %i, 1 + %cmp4 = icmp slt i32 %i.inc, %sub1 + br i1 %cmp4, label %outer, label %exit + +exit: + ret void +} + +; Force SCEVExpander to look for an existing well-formed phi. +; Perform LFTR without generating extra preheader code. +define void @guardedloop([0 x double]* %matrix, [0 x double]* %vector, + i32 %irow, i32 %ilead) nounwind { +; CHECK: entry: +; CHECK-NOT: zext +; CHECK-NOT: add +; CHECK: loop: +; CHECK: phi i64 +; CHECK: phi i64 +; CHECK-NOT: phi +; CHECK: icmp ne +; CHECK: br i1 +entry: + %cmp = icmp slt i32 1, %irow + br i1 %cmp, label %loop, label %return + +loop: + %rowidx = phi i32 [ 0, %entry ], [ %row.inc, %loop ] + %i = phi i32 [ 0, %entry ], [ %i.inc, %loop ] + %diagidx = add nsw i32 %rowidx, %i + %diagidxw = sext i32 %diagidx to i64 + %matrixp = getelementptr inbounds [0 x double]* %matrix, i32 0, i64 %diagidxw + %v1 = load double* %matrixp + %iw = sext i32 %i to i64 + %vectorp = getelementptr inbounds [0 x double]* %vector, i32 0, i64 %iw + %v2 = load double* %vectorp + %row.inc = add nsw i32 %rowidx, %ilead + %i.inc = add nsw i32 %i, 1 + %cmp196 = icmp slt i32 %i.inc, %irow + br i1 %cmp196, label %loop, label %return + +return: + ret void +} + +; Avoid generating extra code to materialize a trip count. Skip LFTR. +define void @unguardedloop([0 x double]* %matrix, [0 x double]* %vector, + i32 %irow, i32 %ilead) nounwind { +entry: + br label %loop + +; CHECK: entry: +; CHECK-NOT: zext +; CHECK-NOT: add +; CHECK: loop: +; CHECK: phi i64 +; CHECK: phi i64 +; CHECK-NOT: phi +; CHECK: icmp slt +; CHECK: br i1 +loop: + %rowidx = phi i32 [ 0, %entry ], [ %row.inc, %loop ] + %i = phi i32 [ 0, %entry ], [ %i.inc, %loop ] + %diagidx = add nsw i32 %rowidx, %i + %diagidxw = sext i32 %diagidx to i64 + %matrixp = getelementptr inbounds [0 x double]* %matrix, i32 0, i64 %diagidxw + %v1 = load double* %matrixp + %iw = sext i32 %i to i64 + %vectorp = getelementptr inbounds [0 x double]* %vector, i32 0, i64 %iw + %v2 = load double* %vectorp + %row.inc = add nsw i32 %rowidx, %ilead + %i.inc = add nsw i32 %i, 1 + %cmp196 = icmp slt i32 %i.inc, %irow + br i1 %cmp196, label %loop, label %return + +return: + ret void +} + +; Remove %i which is only used by the exit test. +; Verify that SCEV can still compute a backedge count from the sign +; extended %n, used for pointer comparison by LFTR. +define void @geplftr(i8* %base, i32 %x, i32 %y, i32 %n) nounwind { +entry: + %x.ext = sext i32 %x to i64 + %add.ptr = getelementptr inbounds i8* %base, i64 %x.ext + %y.ext = sext i32 %y to i64 + %add.ptr10 = getelementptr inbounds i8* %add.ptr, i64 %y.ext + %lim = add i32 %x, %n + %cmp.ph = icmp ult i32 %x, %lim + br i1 %cmp.ph, label %loop, label %exit + +; CHECK: loop: +; CHECK: phi i8* +; CHECK-NOT: phi +; CHECK: getelementptr +; CHECK: store +; CHECK: icmp ne i8* +; CHECK: br i1 +loop: + %i = phi i32 [ %x, %entry ], [ %inc, %loop ] + %aptr = phi i8* [ %add.ptr10, %entry ], [ %incdec.ptr, %loop ] + %incdec.ptr = getelementptr inbounds i8* %aptr, i32 1 + store i8 3, i8* %aptr + %inc = add i32 %i, 1 + %cmp = icmp ult i32 %inc, %lim + br i1 %cmp, label %loop, label %exit + +exit: + ret void +} + +; Exercise backedge taken count verification with a never-taken loop. +define void @nevertaken() nounwind uwtable ssp { +entry: + br label %loop + +; CHECK: loop: +; CHECK-NOT: phi +; CHECK-NOT: add +; CHECK-NOT: icmp +; CHECK: exit: +loop: + %i = phi i32 [ 0, %entry ], [ %inc, %loop ] + %inc = add nsw i32 %i, 1 + %cmp = icmp sle i32 %inc, 0 + br i1 %cmp, label %loop, label %exit + +exit: + ret void +} + +; Test LFTR on an IV whose recurrence start is a non-unit pointer type. +define void @aryptriv([256 x i8]* %base, i32 %n) nounwind { +entry: + %ivstart = getelementptr inbounds [256 x i8]* %base, i32 0, i32 0 + %ivend = getelementptr inbounds [256 x i8]* %base, i32 0, i32 %n + %cmp.ph = icmp ult i8* %ivstart, %ivend + br i1 %cmp.ph, label %loop, label %exit + +; CHECK: loop: +; CHECK: phi i8* +; CHECK-NOT: phi +; CHECK: getelementptr +; CHECK: store +; CHECK: icmp ne i8* +; CHECK: br i1 +loop: + %aptr = phi i8* [ %ivstart, %entry ], [ %incdec.ptr, %loop ] + %incdec.ptr = getelementptr inbounds i8* %aptr, i32 1 + store i8 3, i8* %aptr + %cmp = icmp ult i8* %incdec.ptr, %ivend + br i1 %cmp, label %loop, label %exit + +exit: + ret void +} diff --git a/test/Transforms/IndVarSimplify/max-pointer.ll b/test/Transforms/IndVarSimplify/max-pointer.ll deleted file mode 100644 index 46ac2d8..0000000 --- a/test/Transforms/IndVarSimplify/max-pointer.ll +++ /dev/null @@ -1,39 +0,0 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: grep {icmp ugt i8\\\*} %t | count 1 -; RUN: grep {icmp sgt i8\\\*} %t | count 1 - -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-n:32:64" - - %struct.CKenCodeCodec = type <{ i8 }> - -define void @foo(i8* %str1Ptr, i8* %str2Ptr, i8* %inLastBytePtr) nounwind { -entry: - %0 = icmp ult i8* %str2Ptr, %str1Ptr ; <i1> [#uses=1] - %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr ; <i8*> [#uses=1] - br label %bb2 - -bb2: ; preds = %bb2, %entry - %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ] ; <i8*> [#uses=1] - %1 = getelementptr i8* %str2Ptr_addr.1, i64 1 ; <i8*> [#uses=2] - %2 = icmp ult i8* %1, %inLastBytePtr ; <i1> [#uses=0] - br i1 undef, label %bb2, label %return - -return: ; preds = %bb2 - ret void -} - -define void @sfoo(i8* %str1Ptr, i8* %str2Ptr, i8* %inLastBytePtr) nounwind { -entry: - %0 = icmp slt i8* %str2Ptr, %str1Ptr ; <i1> [#uses=1] - %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr ; <i8*> [#uses=1] - br label %bb2 - -bb2: ; preds = %bb2, %entry - %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ] ; <i8*> [#uses=1] - %1 = getelementptr i8* %str2Ptr_addr.1, i64 1 ; <i8*> [#uses=2] - %2 = icmp slt i8* %1, %inLastBytePtr ; <i1> [#uses=0] - br i1 undef, label %bb2, label %return - -return: ; preds = %bb2 - ret void -} diff --git a/test/Transforms/IndVarSimplify/no-iv-rewrite.ll b/test/Transforms/IndVarSimplify/no-iv-rewrite.ll index 9605670..9c2abd0 100644 --- a/test/Transforms/IndVarSimplify/no-iv-rewrite.ll +++ b/test/Transforms/IndVarSimplify/no-iv-rewrite.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s ; ; Make sure that indvars isn't inserting canonical IVs. ; This is kinda hard to do until linear function test replacement is removed. @@ -125,9 +125,9 @@ return: ret void } -%struct = type { i32 } +%structI = type { i32 } -define void @bitcastiv(i32 %start, i32 %limit, i32 %step, %struct* %base) +define void @bitcastiv(i32 %start, i32 %limit, i32 %step, %structI* %base) nounwind { entry: @@ -142,12 +142,12 @@ entry: ; CHECK: exit: loop: %iv = phi i32 [%start, %entry], [%next, %loop] - %p = phi %struct* [%base, %entry], [%pinc, %loop] - %adr = getelementptr %struct* %p, i32 0, i32 0 + %p = phi %structI* [%base, %entry], [%pinc, %loop] + %adr = getelementptr %structI* %p, i32 0, i32 0 store i32 3, i32* %adr - %pp = bitcast %struct* %p to i32* + %pp = bitcast %structI* %p to i32* store i32 4, i32* %pp - %pinc = getelementptr %struct* %p, i32 1 + %pinc = getelementptr %structI* %p, i32 1 %next = add i32 %iv, 1 %cond = icmp ne i32 %next, %limit br i1 %cond, label %loop, label %exit @@ -281,6 +281,7 @@ return: ; CHECK-NOT: phi ; CHECK: add i32 ; CHECK: add i32 +; CHECK: add i32 ; CHECK-NOT: add ; CHECK: return: ; @@ -320,3 +321,72 @@ return: %sum4 = add i32 %sum1, %l.next ret i32 %sum4 } + +; Test a GEP IV that is derived from another GEP IV by a nop gep that +; lowers the type without changing the expression. +%structIF = type { i32, float } + +define void @congruentgepiv(%structIF* %base) nounwind uwtable ssp { +entry: + %first = getelementptr inbounds %structIF* %base, i64 0, i32 0 + br label %loop + +; CHECK: loop: +; CHECK: phi %structIF* +; CHECK: phi i32* +; CHECK: getelementptr inbounds +; CHECK: getelementptr inbounds +; CHECK: exit: +loop: + %ptr.iv = phi %structIF* [ %ptr.inc, %latch ], [ %base, %entry ] + %next = phi i32* [ %next.inc, %latch ], [ %first, %entry ] + store i32 4, i32* %next + br i1 undef, label %latch, label %exit + +latch: ; preds = %for.inc50.i + %ptr.inc = getelementptr inbounds %structIF* %ptr.iv, i64 1 + %next.inc = getelementptr inbounds %structIF* %ptr.inc, i64 0, i32 0 + br label %loop + +exit: + ret void +} + +; Test a widened IV that is used by a phi on different paths within the loop. +; +; CHECK: for.body: +; CHECK: phi i64 +; CHECK: trunc i64 +; CHECK: if.then: +; CHECK: for.inc: +; CHECK: phi i32 +; CHECK: for.end: +define void @phiUsesTrunc() nounwind { +entry: + br i1 undef, label %for.body, label %for.end + +for.body: + %iv = phi i32 [ %inc, %for.inc ], [ 1, %entry ] + br i1 undef, label %if.then, label %if.else + +if.then: + br i1 undef, label %if.then33, label %for.inc + +if.then33: + br label %for.inc + +if.else: + br i1 undef, label %if.then97, label %for.inc + +if.then97: + %idxprom100 = sext i32 %iv to i64 + br label %for.inc + +for.inc: + %kmin.1 = phi i32 [ %iv, %if.then33 ], [ 0, %if.then ], [ %iv, %if.then97 ], [ 0, %if.else ] + %inc = add nsw i32 %iv, 1 + br i1 undef, label %for.body, label %for.end + +for.end: + ret void +} diff --git a/test/Transforms/IndVarSimplify/pointer-indvars.ll b/test/Transforms/IndVarSimplify/pointer-indvars.ll deleted file mode 100644 index 6d25f90..0000000 --- a/test/Transforms/IndVarSimplify/pointer-indvars.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -indvars -S | grep indvar -@G = global i32* null ; <i32**> [#uses=1] -@Array = external global [40 x i32] ; <[40 x i32]*> [#uses=1] - -define void @test() { -; <label>:0 - br label %Loop - -Loop: ; preds = %Loop, %0 - %X = phi i32* [ getelementptr ([40 x i32]* @Array, i64 0, i64 0), %0 ], [ %X.next, %Loop ] ; <i32*> [#uses=2] - %X.next = getelementptr i32* %X, i64 1 ; <i32*> [#uses=1] - store i32* %X, i32** @G - br label %Loop -} - diff --git a/test/Transforms/IndVarSimplify/pointer.ll b/test/Transforms/IndVarSimplify/pointer.ll deleted file mode 100644 index d55bf98..0000000 --- a/test/Transforms/IndVarSimplify/pointer.ll +++ /dev/null @@ -1,38 +0,0 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: grep {%exitcond = icmp eq i64 %indvar.next, %n} %t -; RUN: grep {getelementptr i8\\* %A, i64 %indvar} %t -; RUN: grep getelementptr %t | count 1 -; RUN: grep add %t | count 1 -; RUN: not grep scevgep %t -; RUN: not grep ptrtoint %t - -; Indvars should be able to expand the pointer-arithmetic -; IV into an integer IV indexing into a simple getelementptr. - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-n:32:64" - -define void @foo(i8* %A, i64 %n) nounwind { -entry: - %0 = icmp eq i64 %n, 0 ; <i1> [#uses=1] - br i1 %0, label %return, label %bb.nph - -bb.nph: ; preds = %entry - %1 = getelementptr i8* %A, i64 %n ; <i8*> [#uses=1] - br label %bb - -bb: ; preds = %bb1, %bb.nph - %q.01 = phi i8* [ %2, %bb1 ], [ %A, %bb.nph ] ; <i8*> [#uses=2] - store i8 0, i8* %q.01, align 1 - %2 = getelementptr i8* %q.01, i64 1 ; <i8*> [#uses=2] - br label %bb1 - -bb1: ; preds = %bb - %3 = icmp eq i8* %1, %2 ; <i1> [#uses=1] - br i1 %3, label %bb1.return_crit_edge, label %bb - -bb1.return_crit_edge: ; preds = %bb1 - br label %return - -return: ; preds = %bb1.return_crit_edge, %entry - ret void -} diff --git a/test/Transforms/IndVarSimplify/preserve-gep-loop-variant.ll b/test/Transforms/IndVarSimplify/preserve-gep-loop-variant.ll index 26f05c4..251d34e 100644 --- a/test/Transforms/IndVarSimplify/preserve-gep-loop-variant.ll +++ b/test/Transforms/IndVarSimplify/preserve-gep-loop-variant.ll @@ -1,8 +1,8 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: not grep inttoptr %t -; RUN: not grep ptrtoint %t -; RUN: grep scevgep %t -target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n:32:64" +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK-NOT: {{inttoptr|ptrtoint}} +; CHECK: scevgep +; CHECK-NOT: {{inttoptr|ptrtoint}} +target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n32:64" ; Indvars shouldn't need inttoptr/ptrtoint to expand an address here. diff --git a/test/Transforms/IndVarSimplify/preserve-gep-nested.ll b/test/Transforms/IndVarSimplify/preserve-gep-nested.ll index b41de58..cdcaaa0 100644 --- a/test/Transforms/IndVarSimplify/preserve-gep-nested.ll +++ b/test/Transforms/IndVarSimplify/preserve-gep-nested.ll @@ -1,19 +1,20 @@ -; RUN: opt < %s -indvars -S > %t -; Exactly one getelementptr for each load+store. -; RUN: grep getelementptr %t | count 6 -; Each getelementptr using %struct.Q* %s as a base and not i8*. -; RUN: grep {getelementptr \[%\]struct\\.Q\\* \[%\]s,} %t | count 6 +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s ; No explicit integer multiplications! -; RUN: not grep {= mul} %t ; No i8* arithmetic or pointer casting anywhere! -; RUN: not grep {i8\\*} %t -; RUN: not grep bitcast %t -; RUN: not grep inttoptr %t -; RUN: not grep ptrtoint %t +; CHECK-NOT: = {{= mul|i8\*|bitcast|inttoptr|ptrtoint}} +; Exactly one getelementptr for each load+store. +; Each getelementptr using %struct.Q* %s as a base and not i8*. +; CHECK: getelementptr %struct.Q* %s, +; CHECK: getelementptr %struct.Q* %s, +; CHECK: getelementptr %struct.Q* %s, +; CHECK: getelementptr %struct.Q* %s, +; CHECK: getelementptr %struct.Q* %s, +; CHECK: getelementptr %struct.Q* %s, +; CHECK-NOT: = {{= mul|i8\*|bitcast|inttoptr|ptrtoint}} ; FIXME: This test should pass with or without TargetData. Until opt ; supports running tests without targetdata, just hardware this in. -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-n:32:64" +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-n32:64" %struct.Q = type { [10 x %struct.N] } %struct.N = type { %struct.S } diff --git a/test/Transforms/IndVarSimplify/preserve-gep-remainder.ll b/test/Transforms/IndVarSimplify/preserve-gep-remainder.ll index ca0c399..2f3100f 100644 --- a/test/Transforms/IndVarSimplify/preserve-gep-remainder.ll +++ b/test/Transforms/IndVarSimplify/preserve-gep-remainder.ll @@ -1,6 +1,6 @@ -; RUN: opt < %s -indvars -S \ -; RUN: | grep {\[%\]p.2.ip.1 = getelementptr \\\[3 x \\\[3 x double\\\]\\\]\\* \[%\]p, i64 2, i64 \[%\]tmp, i64 1} -target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n:32:64" +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK: %p.2.ip.1 = getelementptr [3 x [3 x double]]* %p, i64 2, i64 %0, i64 1 +target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n32:64" ; Indvars shouldn't expand this to ; %p.2.ip.1 = getelementptr [3 x [3 x double]]* %p, i64 0, i64 %tmp, i64 19 diff --git a/test/Transforms/IndVarSimplify/preserve-gep.ll b/test/Transforms/IndVarSimplify/preserve-gep.ll index 82eda03..fec8a28 100644 --- a/test/Transforms/IndVarSimplify/preserve-gep.ll +++ b/test/Transforms/IndVarSimplify/preserve-gep.ll @@ -1,12 +1,12 @@ -; RUN: opt < %s -indvars -S > %t -; RUN: not grep ptrtoint %t -; RUN: not grep inttoptr %t -; RUN: grep getelementptr %t | count 1 +; RUN: opt < %s -indvars -S -enable-iv-rewrite | FileCheck %s +; CHECK-NOT: {{ptrtoint|inttoptr}} +; CHECK: getelementptr +; CHECK-NOT: {{ptrtoint|inttoptr|getelementptr}} ; Indvars shouldn't leave getelementptrs expanded out as ; inttoptr+ptrtoint in its output in common cases. -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-n:32:64" +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-n32:64" target triple = "x86_64-unknown-linux-gnu" %struct.Foo = type { i32, i32, [10 x i32], i32 } diff --git a/test/Transforms/IndVarSimplify/preserve-signed-wrap.ll b/test/Transforms/IndVarSimplify/preserve-signed-wrap.ll index 5063b17..22e2092 100644 --- a/test/Transforms/IndVarSimplify/preserve-signed-wrap.ll +++ b/test/Transforms/IndVarSimplify/preserve-signed-wrap.ll @@ -1,5 +1,5 @@ ; RUN: opt < %s -indvars -S | FileCheck %s -; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -S | FileCheck %s ; Indvars should insert a 64-bit induction variable to eliminate the ; sext for the addressing, however it shouldn't eliminate the sext diff --git a/test/Transforms/IndVarSimplify/subtract.ll b/test/Transforms/IndVarSimplify/subtract.ll deleted file mode 100644 index f45bdab..0000000 --- a/test/Transforms/IndVarSimplify/subtract.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -indvars -S | grep indvar - -@G = global i64 0 ; <i64*> [#uses=1] - -define void @test(i64 %V) { -; <label>:0 - br label %Loop - -Loop: ; preds = %Loop, %0 - %X = phi i64 [ 1, %0 ], [ %X.next, %Loop ] ; <i64> [#uses=2] - %X.next = sub i64 %X, %V ; <i64> [#uses=1] - store i64 %X, i64* @G - br label %Loop -} - diff --git a/test/Transforms/IndVarSimplify/variable-stride-ivs-0.ll b/test/Transforms/IndVarSimplify/variable-stride-ivs-0.ll index ace74ff..fc906cd 100644 --- a/test/Transforms/IndVarSimplify/variable-stride-ivs-0.ll +++ b/test/Transforms/IndVarSimplify/variable-stride-ivs-0.ll @@ -1,5 +1,5 @@ ; RUN: opt < %s -indvars -instcombine -S | FileCheck %s -; RUN: opt < %s -indvars -disable-iv-rewrite -instcombine -S | FileCheck %s +; RUN: opt < %s -indvars -enable-iv-rewrite=false -instcombine -S | FileCheck %s ; ; Test that -indvars can reduce variable stride IVs. If it can reduce variable ; stride iv's, it will make %iv. and %m.0.0 isomorphic to each other without |