diff options
Diffstat (limited to 'test/Transforms/LoopUnswitch')
17 files changed, 145 insertions, 16 deletions
diff --git a/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll b/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll index b80220a..b4cf406 100644 --- a/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll +++ b/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output ; END. target datalayout = "E-p:32:32" diff --git a/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll b/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll index 916cba2..a50bd54 100644 --- a/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll +++ b/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output define void @sort_Eq(i32* %S2) { entry: diff --git a/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll b/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll index 60e464f..e030157 100644 --- a/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll +++ b/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output %struct.BLEND_MAP = type { i16, i16, i16, i32, %struct.BLEND_MAP_ENTRY* } %struct.BLEND_MAP_ENTRY = type { float, i8, { [5 x float], [4 x i8] } } diff --git a/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll b/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll index 67da9ff..fd4d730 100644 --- a/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll +++ b/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output define void @init_caller_save() { entry: diff --git a/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll b/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll index 08cb9b6..468b194 100644 --- a/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll +++ b/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll @@ -1,5 +1,5 @@ ; PR1333 -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output 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" target triple = "i686-pc-linux-gnu" diff --git a/test/Transforms/LoopUnswitch/2007-05-09-tl.ll b/test/Transforms/LoopUnswitch/2007-05-09-tl.ll index c987dae..61615d0 100644 --- a/test/Transforms/LoopUnswitch/2007-05-09-tl.ll +++ b/test/Transforms/LoopUnswitch/2007-05-09-tl.ll @@ -1,5 +1,5 @@ +; RUN: opt < %s -loop-unswitch -disable-output ; PR1333 -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output define void @pp_cxx_expression() { entry: diff --git a/test/Transforms/LoopUnswitch/2007-07-12-ExitDomInfo.ll b/test/Transforms/LoopUnswitch/2007-07-12-ExitDomInfo.ll index c4080c1..bf5a61b 100644 --- a/test/Transforms/LoopUnswitch/2007-07-12-ExitDomInfo.ll +++ b/test/Transforms/LoopUnswitch/2007-07-12-ExitDomInfo.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -instcombine -disable-output +; RUN: opt < %s -loop-unswitch -instcombine -disable-output @str3 = external constant [3 x i8] ; <[3 x i8]*> [#uses=1] diff --git a/test/Transforms/LoopUnswitch/2007-07-13-DomInfo.ll b/test/Transforms/LoopUnswitch/2007-07-13-DomInfo.ll index de3f670..5ae335b 100644 --- a/test/Transforms/LoopUnswitch/2007-07-13-DomInfo.ll +++ b/test/Transforms/LoopUnswitch/2007-07-13-DomInfo.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output define i32 @main(i32 %argc, i8** %argv) { entry: diff --git a/test/Transforms/LoopUnswitch/2007-07-18-DomInfo.ll b/test/Transforms/LoopUnswitch/2007-07-18-DomInfo.ll index edd7d1f..dfca154 100644 --- a/test/Transforms/LoopUnswitch/2007-07-18-DomInfo.ll +++ b/test/Transforms/LoopUnswitch/2007-07-18-DomInfo.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output ; PR1559 target triple = "i686-pc-linux-gnu" diff --git a/test/Transforms/LoopUnswitch/2007-08-01-Dom.ll b/test/Transforms/LoopUnswitch/2007-08-01-Dom.ll index 9673e2e..fc92579 100644 --- a/test/Transforms/LoopUnswitch/2007-08-01-Dom.ll +++ b/test/Transforms/LoopUnswitch/2007-08-01-Dom.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -licm -loop-unswitch -disable-output +; RUN: opt < %s -licm -loop-unswitch -disable-output ; PR 1589 %struct.QBasicAtomic = type { i32 } diff --git a/test/Transforms/LoopUnswitch/2007-08-01-LCSSA.ll b/test/Transforms/LoopUnswitch/2007-08-01-LCSSA.ll index 139cdbe..f83acaa 100644 --- a/test/Transforms/LoopUnswitch/2007-08-01-LCSSA.ll +++ b/test/Transforms/LoopUnswitch/2007-08-01-LCSSA.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -instcombine -disable-output +; RUN: opt < %s -loop-unswitch -instcombine -disable-output %struct.ClassDef = type { %struct.QByteArray, %struct.QByteArray, %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", i8, i8, %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", %"struct.QList<ArgumentDef>", %"struct.QMap<QByteArray,QByteArray>", %"struct.QList<ArgumentDef>", %"struct.QMap<QByteArray,QByteArray>", i32, i32 } %struct.FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct.FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i32, i32, [40 x i8] } %struct.Generator = type { %struct.FILE*, %struct.ClassDef*, %"struct.QList<ArgumentDef>", %struct.QByteArray, %"struct.QList<ArgumentDef>" } diff --git a/test/Transforms/LoopUnswitch/2007-10-04-DomFrontier.ll b/test/Transforms/LoopUnswitch/2007-10-04-DomFrontier.ll index b236edc..efbb761 100644 --- a/test/Transforms/LoopUnswitch/2007-10-04-DomFrontier.ll +++ b/test/Transforms/LoopUnswitch/2007-10-04-DomFrontier.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -licm -loop-unroll -disable-output +; RUN: opt < %s -licm -loop-unroll -disable-output @resonant = external global i32 ; <i32*> [#uses=2] diff --git a/test/Transforms/LoopUnswitch/2008-06-02-DomInfo.ll b/test/Transforms/LoopUnswitch/2008-06-02-DomInfo.ll index dcf41c3..906c2c5 100644 --- a/test/Transforms/LoopUnswitch/2008-06-02-DomInfo.ll +++ b/test/Transforms/LoopUnswitch/2008-06-02-DomInfo.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -instcombine -gvn -disable-output +; RUN: opt < %s -loop-unswitch -instcombine -gvn -disable-output ; PR2372 target triple = "i386-pc-linux-gnu" diff --git a/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll b/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll index 713a0bd..f74054a 100644 --- a/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll +++ b/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -licm -loop-unswitch -disable-output +; RUN: opt < %s -licm -loop-unswitch -disable-output @g_56 = external global i16 ; <i16*> [#uses=2] define i32 @func_67(i32 %p_68, i8 signext %p_69, i8 signext %p_71) nounwind { diff --git a/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll b/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll index 383aa5b..20f2c2b 100644 --- a/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll +++ b/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -stats -disable-output |& grep "1 loop-unswitch - Number of branches unswitched" | count 1 +; RUN: opt < %s -loop-unswitch -stats -disable-output |& grep "1 loop-unswitch - Number of branches unswitched" | count 1 ; PR 3170 define i32 @a(i32 %x, i32 %y) nounwind { entry: diff --git a/test/Transforms/LoopUnswitch/basictest.ll b/test/Transforms/LoopUnswitch/basictest.ll index eeaf08d..1e6f2cf 100644 --- a/test/Transforms/LoopUnswitch/basictest.ll +++ b/test/Transforms/LoopUnswitch/basictest.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -loop-unswitch -disable-output +; RUN: opt < %s -loop-unswitch -disable-output define i32 @test(i32* %A, i1 %C) { entry: diff --git a/test/Transforms/LoopUnswitch/preserve-analyses.ll b/test/Transforms/LoopUnswitch/preserve-analyses.ll new file mode 100644 index 0000000..3364fb2 --- /dev/null +++ b/test/Transforms/LoopUnswitch/preserve-analyses.ll @@ -0,0 +1,129 @@ +; RUN: opt -loop-unswitch -verify-loop-info -verify-dom-info %s -disable-output + +; Loop unswitch should be able to unswitch these loops and +; preserve LCSSA and LoopSimplify forms. + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64" +target triple = "armv6-apple-darwin9" + +@delim1 = external global i32 ; <i32*> [#uses=1] +@delim2 = external global i32 ; <i32*> [#uses=1] + +define arm_apcscc i32 @ineqn(i8* %s, i8* %p) nounwind readonly { +entry: + %0 = load i32* @delim1, align 4 ; <i32> [#uses=1] + %1 = load i32* @delim2, align 4 ; <i32> [#uses=1] + br label %bb8.outer + +bb: ; preds = %bb8 + %2 = icmp eq i8* %p_addr.0, %s ; <i1> [#uses=1] + br i1 %2, label %bb10, label %bb2 + +bb2: ; preds = %bb + %3 = getelementptr inbounds i8* %p_addr.0, i32 1 ; <i8*> [#uses=3] + switch i32 %ineq.0.ph, label %bb8.backedge [ + i32 0, label %bb3 + i32 1, label %bb6 + ] + +bb8.backedge: ; preds = %bb6, %bb5, %bb2 + br label %bb8 + +bb3: ; preds = %bb2 + %4 = icmp eq i32 %8, %0 ; <i1> [#uses=1] + br i1 %4, label %bb8.outer.loopexit, label %bb5 + +bb5: ; preds = %bb3 + br i1 %6, label %bb6, label %bb8.backedge + +bb6: ; preds = %bb5, %bb2 + %5 = icmp eq i32 %8, %1 ; <i1> [#uses=1] + br i1 %5, label %bb7, label %bb8.backedge + +bb7: ; preds = %bb6 + %.lcssa1 = phi i8* [ %3, %bb6 ] ; <i8*> [#uses=1] + br label %bb8.outer.backedge + +bb8.outer.backedge: ; preds = %bb8.outer.loopexit, %bb7 + %.lcssa2 = phi i8* [ %.lcssa1, %bb7 ], [ %.lcssa, %bb8.outer.loopexit ] ; <i8*> [#uses=1] + %ineq.0.ph.be = phi i32 [ 0, %bb7 ], [ 1, %bb8.outer.loopexit ] ; <i32> [#uses=1] + br label %bb8.outer + +bb8.outer.loopexit: ; preds = %bb3 + %.lcssa = phi i8* [ %3, %bb3 ] ; <i8*> [#uses=1] + br label %bb8.outer.backedge + +bb8.outer: ; preds = %bb8.outer.backedge, %entry + %ineq.0.ph = phi i32 [ 0, %entry ], [ %ineq.0.ph.be, %bb8.outer.backedge ] ; <i32> [#uses=3] + %p_addr.0.ph = phi i8* [ %p, %entry ], [ %.lcssa2, %bb8.outer.backedge ] ; <i8*> [#uses=1] + %6 = icmp eq i32 %ineq.0.ph, 1 ; <i1> [#uses=1] + br label %bb8 + +bb8: ; preds = %bb8.outer, %bb8.backedge + %p_addr.0 = phi i8* [ %p_addr.0.ph, %bb8.outer ], [ %3, %bb8.backedge ] ; <i8*> [#uses=3] + %7 = load i8* %p_addr.0, align 1 ; <i8> [#uses=2] + %8 = sext i8 %7 to i32 ; <i32> [#uses=2] + %9 = icmp eq i8 %7, 0 ; <i1> [#uses=1] + br i1 %9, label %bb10, label %bb + +bb10: ; preds = %bb8, %bb + %.0 = phi i32 [ %ineq.0.ph, %bb ], [ 0, %bb8 ] ; <i32> [#uses=1] + ret i32 %.0 +} + +; This is a simplified form of ineqn from above. It triggers some +; different cases in the loop-unswitch code. + +define void @simplified_ineqn() nounwind readonly { +entry: + br label %bb8.outer + +bb8.outer: ; preds = %bb6, %bb2, %entry + %x = phi i32 [ 0, %entry ], [ 0, %bb6 ], [ 1, %bb2 ] ; <i32> [#uses=1] + br i1 undef, label %return, label %bb2 + +bb2: ; preds = %bb + switch i32 %x, label %bb6 [ + i32 0, label %bb8.outer + ] + +bb6: ; preds = %bb2 + br i1 undef, label %bb8.outer, label %bb2 + +return: ; preds = %bb8, %bb + ret void +} + +; This function requires special handling to preserve LCSSA form. +; PR4934 + +define void @pnp_check_irq() nounwind noredzone { +entry: + %conv56 = trunc i64 undef to i32 ; <i32> [#uses=1] + br label %while.cond.i + +while.cond.i: ; preds = %while.cond.i.backedge, %entry + %call.i25 = call i8* @pci_get_device() nounwind noredzone ; <i8*> [#uses=2] + br i1 undef, label %if.then65, label %while.body.i + +while.body.i: ; preds = %while.cond.i + br i1 undef, label %if.then31.i.i, label %while.cond.i.backedge + +while.cond.i.backedge: ; preds = %if.then31.i.i, %while.body.i + br label %while.cond.i + +if.then31.i.i: ; preds = %while.body.i + switch i32 %conv56, label %while.cond.i.backedge [ + i32 14, label %if.then42.i.i + i32 15, label %if.then42.i.i + ] + +if.then42.i.i: ; preds = %if.then31.i.i, %if.then31.i.i + %call.i25.lcssa48 = phi i8* [ %call.i25, %if.then31.i.i ], [ %call.i25, %if.then31.i.i ] ; <i8*> [#uses=0] + unreachable + +if.then65: ; preds = %while.cond.i + unreachable +} + +declare i8* @pci_get_device() noredzone |