diff options
Diffstat (limited to 'test/Transforms')
777 files changed, 31285 insertions, 0 deletions
diff --git a/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll b/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll new file mode 100644 index 0000000..893d82b --- /dev/null +++ b/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as %s -o - | opt -adce + +define i32 @"main"(i32 %argc) +begin + br label %2 + + %retval = phi i32 [ %argc, %2 ] ; <i32> [#uses=2] + %two = add i32 %retval, %retval ; <i32> [#uses=1] + ret i32 %two + + br label %1 +end + diff --git a/test/Transforms/ADCE/2002-05-22-PHITest.ll b/test/Transforms/ADCE/2002-05-22-PHITest.ll new file mode 100644 index 0000000..cf9872e --- /dev/null +++ b/test/Transforms/ADCE/2002-05-22-PHITest.ll @@ -0,0 +1,13 @@ +; It is illegal to remove BB1 because it will mess up the PHI node! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | grep BB1 + + +int "test"(bool %C, int %A, int %B) { + br bool %C, label %BB1, label %BB2 +BB1: + br label %BB2 +BB2: + %R = phi int [%A, %0], [%B, %BB1] + ret int %R +} diff --git a/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll b/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll new file mode 100644 index 0000000..999675b --- /dev/null +++ b/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll @@ -0,0 +1,33 @@ +; This testcase contains a entire loop that should be removed. The only thing +; left is the store instruction in BB0. The problem this testcase was running +; into was that when the reg109 PHI was getting zero predecessors, it was +; removed even though there were uses still around. Now the uses are filled +; in with a dummy value before the PHI is deleted. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +%node_t = type { double*, %node_t*, %node_t**, double**, double*, int, int } + +implementation ; Functions: + +void %localize_local(%node_t* %nodelist) { +bb0: ;[#uses=0] + %nodelist = alloca %node_t* ; <%node_t**> [#uses=2] + store %node_t* %nodelist, %node_t** %nodelist + br label %bb1 + +bb1: ;[#uses=2] + %reg107 = load %node_t** %nodelist ; <%node_t*> [#uses=2] + %cond211 = seteq %node_t* %reg107, null ; <bool> [#uses=1] + br bool %cond211, label %bb3, label %bb2 + +bb2: ;[#uses=3] + %reg109 = phi %node_t* [ %reg110, %bb2 ], [ %reg107, %bb1 ] ; <%node_t*> [#uses=1] + %reg212 = getelementptr %node_t* %reg109, long 0, uint 1 ; <%node_t**> [#uses=1] + %reg110 = load %node_t** %reg212 ; <%node_t*> [#uses=2] + %cond213 = setne %node_t* %reg110, null ; <bool> [#uses=1] + br bool %cond213, label %bb2, label %bb3 + +bb3: ;[#uses=2] + ret void +} diff --git a/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll b/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll new file mode 100644 index 0000000..0d5adf9 --- /dev/null +++ b/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll @@ -0,0 +1,17 @@ +; This testcase is a distilled form of: 2002-05-28-Crash.ll + +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +float "test"(int %i) { + %F = cast int %i to float ; This BB is not dead + %I = cast int %i to uint ; future dead inst + br label %Loop + +Loop: ; This block is dead + %B = cast uint %I to bool + br bool %B, label %Out, label %Loop + +Out: + ret float %F +} + diff --git a/test/Transforms/ADCE/2002-05-28-Crash.ll b/test/Transforms/ADCE/2002-05-28-Crash.ll new file mode 100644 index 0000000..b6340d5 --- /dev/null +++ b/test/Transforms/ADCE/2002-05-28-Crash.ll @@ -0,0 +1,56 @@ +; This testcase is distilled from the GNU rx package. The loop should be +; removed but causes a problem when ADCE does. The source function is: +; int rx_bitset_empty (int size, rx_Bitset set) { +; int x; +; RX_subset s; +; s = set[0]; +; set[0] = 1; +; for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x) +; ; +; set[0] = s; +; return !s; +;} +; +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +implementation ; Functions: + +int %rx_bitset_empty(int %size, uint* %set) { +bb1: ;[#uses=2] + %reg110 = load uint* %set ; <uint> [#uses=2] + store uint 1, uint* %set + %cast112 = cast int %size to ulong ; <ulong> [#uses=1] + %reg113 = add ulong %cast112, 31 ; <ulong> [#uses=1] + %reg114 = shr ulong %reg113, ubyte 5 ; <ulong> [#uses=2] + %cast109 = cast ulong %reg114 to int ; <int> [#uses=1] + %reg129 = add int %cast109, -1 ; <int> [#uses=1] + %reg114-idxcast = cast ulong %reg114 to uint ; <uint> [#uses=1] + %reg114-idxcast-offset = add uint %reg114-idxcast, 1073741823 ; <uint> [#uses=1] + %reg114-idxcast-offset = cast uint %reg114-idxcast-offset to long + %reg124 = getelementptr uint* %set, long %reg114-idxcast-offset ; <uint*> [#uses=1] + %reg125 = load uint* %reg124 ; <uint> [#uses=1] + %cond232 = setne uint %reg125, 0 ; <bool> [#uses=1] + br bool %cond232, label %bb3, label %bb2 + +bb2: ;[#uses=3] + %cann-indvar = phi int [ 0, %bb1 ], [ %add1-indvar, %bb2 ] ; <int> [#uses=2] + %reg130-scale = mul int %cann-indvar, -1 ; <int> [#uses=1] + %reg130 = add int %reg130-scale, %reg129 ; <int> [#uses=1] + %add1-indvar = add int %cann-indvar, 1 ; <int> [#uses=1] + %reg130-idxcast = cast int %reg130 to uint ; <uint> [#uses=1] + %reg130-idxcast-offset = add uint %reg130-idxcast, 1073741823 ; <uint> [#uses=1] + %reg130-idxcast-offset = cast uint %reg130-idxcast-offset to long + %reg118 = getelementptr uint* %set, long %reg130-idxcast-offset ; <uint*> [#uses=1] + %reg119 = load uint* %reg118 ; <uint> [#uses=1] + %cond233 = seteq uint %reg119, 0 ; <bool> [#uses=1] + br bool %cond233, label %bb2, label %bb3 + +bb3: ;[#uses=2] + store uint %reg110, uint* %set + %cast126 = cast uint %reg110 to ulong ; <ulong> [#uses=1] + %reg127 = add ulong %cast126, 18446744073709551615 ; <ulong> [#uses=1] + %reg128 = shr ulong %reg127, ubyte 63 ; <ulong> [#uses=1] + %cast120 = cast ulong %reg128 to int ; <int> [#uses=1] + ret int %cast120 + +} diff --git a/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll b/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll new file mode 100644 index 0000000..61b1402 --- /dev/null +++ b/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll @@ -0,0 +1,13 @@ +; This testcase fails because ADCE does not correctly delete the chain of +; three instructions that are dead here. Ironically there were a dead basic +; block in this function, it would work fine, but that would be the part we +; have to fix now, wouldn't it.... +; +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +void %foo(sbyte* %reg5481) { + %cast611 = cast sbyte* %reg5481 to sbyte** ; <sbyte**> [#uses=1] + %reg162 = load sbyte** %cast611 ; <sbyte*> [#uses=0] + cast sbyte*%reg162 to int + ret void +} diff --git a/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll b/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll new file mode 100644 index 0000000..6d15fae --- /dev/null +++ b/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll @@ -0,0 +1,49 @@ +; This testcase was extracted from the gzip SPEC benchmark +; +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +%bk = external global uint ; <uint*> [#uses=2] +%hufts = external global uint ; <uint*> [#uses=1] + +implementation ; Functions: + +int %inflate() { +bb0: ;[#uses=1] + br label %bb2 + +bb2: ;[#uses=2] + %reg128 = phi uint [ %reg130, %bb6 ], [ 0, %bb0 ] ; <uint> [#uses=2] + br bool true, label %bb4, label %bb3 + +bb3: ;[#uses=2] + br label %UnifiedExitNode + +bb4: ;[#uses=2] + %reg117 = load uint* %hufts ; <uint> [#uses=2] + %cond241 = setle uint %reg117, %reg128 ; <bool> [#uses=1] + br bool %cond241, label %bb6, label %bb5 + +bb5: ;[#uses=2] + br label %bb6 + +bb6: ;[#uses=3] + %reg130 = phi uint [ %reg117, %bb5 ], [ %reg128, %bb4 ] ; <uint> [#uses=1] + br bool false, label %bb2, label %bb7 + +bb7: ;[#uses=1] + %reg126 = load uint* %bk ; <uint> [#uses=1] + %cond247 = setle uint %reg126, 7 ; <bool> [#uses=1] + br bool %cond247, label %bb9, label %bb8 + +bb8: ;[#uses=2] + %reg119 = load uint* %bk ; <uint> [#uses=1] + %cond256 = setgt uint %reg119, 7 ; <bool> [#uses=1] + br bool %cond256, label %bb8, label %bb9 + +bb9: ;[#uses=3] + br label %UnifiedExitNode + +UnifiedExitNode: ;[#uses=2] + %UnifiedRetVal = phi int [ 7, %bb3 ], [ 0, %bb9 ] ; <int> [#uses=1] + ret int %UnifiedRetVal +} diff --git a/test/Transforms/ADCE/2002-07-29-Segfault.ll b/test/Transforms/ADCE/2002-07-29-Segfault.ll new file mode 100644 index 0000000..0c0e2af --- /dev/null +++ b/test/Transforms/ADCE/2002-07-29-Segfault.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +void "test"() +begin + br label %BB3 + +BB3: + br label %BB3 +end diff --git a/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll b/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll new file mode 100644 index 0000000..d8c6448 --- /dev/null +++ b/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll @@ -0,0 +1,25 @@ +; Testcase reduced from 197.parser by bugpoint +; RUN: llvm-upgrade < %s | llvm-as | opt -adce +implementation ; Functions: + +void %conjunction_prune() { +; <label>:0 ; No predecessors! + br label %bb19 + +bb19: ; preds = %bb22, %bb23, %0 + %reg205 = phi sbyte* [ null, %bb22 ], [ null, %bb23 ], [ null, %0 ] ; <sbyte*> [#uses=1] + br bool false, label %bb21, label %bb22 + +bb21: ; preds = %bb19 + %cast455 = cast sbyte* %reg205 to sbyte** ; <sbyte**> [#uses=0] + br label %bb22 + +bb22: ; preds = %bb21, %bb19 + br bool false, label %bb19, label %bb23 + +bb23: ; preds = %bb22 + br bool false, label %bb19, label %bb28 + +bb28: ; preds = %bb23 + ret void +} diff --git a/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll b/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll new file mode 100644 index 0000000..92d7cad --- /dev/null +++ b/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll @@ -0,0 +1,37 @@ +; THis testcase caused an assertion failure because a PHI node did not have +; entries for it's postdominator. But I think this can only happen when the +; PHI node is dead, so we just avoid patching up dead PHI nodes. + +; RUN: llvm-upgrade < %s | llvm-as | opt -adce + +target endian = little +target pointersize = 32 + +implementation ; Functions: + +void %dead_test8() { +entry: ; No predecessors! + br label %loopentry + +loopentry: ; preds = %entry, %endif + %k.1 = phi int [ %k.0, %endif ], [ 0, %entry ] ; <int> [#uses=1] + br bool false, label %no_exit, label %return + +no_exit: ; preds = %loopentry + br bool false, label %then, label %else + +then: ; preds = %no_exit + br label %endif + +else: ; preds = %no_exit + %dec = add int %k.1, -1 ; <int> [#uses=1] + br label %endif + +endif: ; preds = %else, %then + %k.0 = phi int [ %dec, %else ], [ 0, %then ] ; <int> [#uses=1] + store int 2, int* null + br label %loopentry + +return: ; preds = %loopentry + ret void +} diff --git a/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll b/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll new file mode 100644 index 0000000..590089d --- /dev/null +++ b/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output +%G = external global int* + +implementation ; Functions: + +declare void %Fn(int*) + +int %main(int %argc.1, sbyte** %argv.1) { +entry: ; No predecessors! + br label %endif.42 + +endif.42: ; preds = %entry, %shortcirc_done.12, %then.66, %endif.42 + br bool false, label %endif.65, label %endif.42 + +then.66: ; preds = %shortcirc_done.12 + call void %Fn( int* %tmp.2846) + br label %endif.42 + +endif.65: ; preds = %endif.42 + %tmp.2846 = load int** %G + br bool false, label %shortcirc_next.12, label %shortcirc_done.12 + +shortcirc_next.12: ; preds = %endif.65 + br label %shortcirc_done.12 + +shortcirc_done.12: ; preds = %endif.65, %shortcirc_next.12 + br bool false, label %then.66, label %endif.42 +} diff --git a/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll b/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll new file mode 100644 index 0000000..1a73019 --- /dev/null +++ b/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll @@ -0,0 +1,94 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +target endian = little +target pointersize = 32 + %struct..CppObjTypeDesc = type { uint, ushort, ushort } + %struct..TypeToken = type { uint, ushort, ushort } + +implementation ; Functions: + +uint %C_ReFaxToDb() { +entry: ; No predecessors! + br bool false, label %endif.0, label %then.0 + +then.0: ; preds = %entry + ret uint 0 + +endif.0: ; preds = %entry + br bool false, label %then.11, label %then.4 + +then.4: ; preds = %endif.0 + ret uint 0 + +then.11: ; preds = %endif.0 + br bool false, label %loopentry.0, label %else.2 + +loopentry.0: ; preds = %then.11, %endif.14, %loopentry.1 + br bool false, label %endif.14, label %loopexit.0 + +endif.14: ; preds = %loopentry.0 + br bool false, label %loopentry.1, label %loopentry.0 + +loopentry.1: ; preds = %endif.14, %then.53, %then.53, %then.53, %then.53, %then.53 + %SubArrays.10 = phi uint* [ %SubArrays.8, %then.53 ] , [ null, %endif.14 ] ; <uint*> [#uses=3] + br bool false, label %no_exit.1, label %loopentry.0 + +no_exit.1: ; preds = %loopentry.1 + switch uint 0, label %label.17 [ + uint 2, label %label.11 + uint 19, label %label.10 + ] + +label.10: ; preds = %no_exit.1 + br bool false, label %then.43, label %endif.43 + +then.43: ; preds = %label.10 + br bool false, label %then.44, label %endif.44 + +then.44: ; preds = %then.43 + br bool false, label %shortcirc_next.4, label %endif.45 + +shortcirc_next.4: ; preds = %then.44 + br bool false, label %no_exit.2, label %loopexit.2 + +no_exit.2: ; preds = %shortcirc_next.4 + %tmp.897 = getelementptr uint* %SubArrays.10, long 0 ; <uint*> [#uses=1] + %tmp.899 = load uint* %tmp.897 ; <uint> [#uses=1] + store uint %tmp.899, uint* null + ret uint 0 + +loopexit.2: ; preds = %shortcirc_next.4 + ret uint 0 + +endif.45: ; preds = %then.44 + ret uint 0 + +endif.44: ; preds = %then.43 + ret uint 0 + +endif.43: ; preds = %label.10 + ret uint 0 + +label.11: ; preds = %no_exit.1 + ret uint 0 + +label.17: ; preds = %no_exit.1, %no_exit.1, %no_exit.1, %no_exit.1, %no_exit.1, %no_exit.1 + br bool false, label %then.53, label %shortcirc_next.7 + +shortcirc_next.7: ; preds = %label.17 + br bool false, label %then.53, label %shortcirc_next.8 + +shortcirc_next.8: ; preds = %shortcirc_next.7 + ret uint 0 + +then.53: ; preds = %shortcirc_next.7, %label.17 + %SubArrays.8 = phi uint* [ %SubArrays.10, %shortcirc_next.7 ], [ %SubArrays.10, %label.17 ] ; <uint*> [#uses=5] + %tmp.1023 = load uint* null ; <uint> [#uses=1] + switch uint %tmp.1023, label %loopentry.1 [] + +loopexit.0: ; preds = %loopentry.0 + ret uint 0 + +else.2: ; preds = %then.11 + ret uint 0 +} diff --git a/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll b/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll new file mode 100644 index 0000000..ac62699 --- /dev/null +++ b/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll @@ -0,0 +1,40 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -simplifycfg | llvm-dis | not grep then: + +void %dead_test8(int* %data.1, int %idx.1) { +entry: ; No predecessors! + %tmp.1 = load int* %data.1 ; <int> [#uses=2] + %tmp.41 = setgt int %tmp.1, 0 ; <bool> [#uses=1] + br bool %tmp.41, label %no_exit.preheader, label %return + +no_exit.preheader: ; preds = %entry + %tmp.11 = getelementptr int* %data.1, long 1 ; <int*> [#uses=1] + %tmp.22-idxcast = cast int %idx.1 to long ; <long> [#uses=1] + %tmp.28 = getelementptr int* %data.1, long %tmp.22-idxcast ; <int*> [#uses=1] + br label %no_exit + +no_exit: ; preds = %no_exit.preheader, %endif + %k.1 = phi int [ %k.0, %endif ], [ 0, %no_exit.preheader ] ; <int> [#uses=3] + %i.0 = phi int [ %inc.1, %endif ], [ 0, %no_exit.preheader ] ; <int> [#uses=1] + %tmp.12 = load int* %tmp.11 ; <int> [#uses=1] + %tmp.14 = sub int 0, %tmp.12 ; <int> [#uses=1] + %tmp.161 = setne int %k.1, %tmp.14 ; <bool> [#uses=1] + br bool %tmp.161, label %then, label %else + +then: ; preds = %no_exit + %inc.0 = add int %k.1, 1 ; <int> [#uses=1] + br label %endif + +else: ; preds = %no_exit + %dec = add int %k.1, -1 ; <int> [#uses=1] + br label %endif + +endif: ; preds = %else, %then + %k.0 = phi int [ %dec, %else ], [ %inc.0, %then ] ; <int> [#uses=1] + store int 2, int* %tmp.28 + %inc.1 = add int %i.0, 1 ; <int> [#uses=2] + %tmp.4 = setlt int %inc.1, %tmp.1 ; <bool> [#uses=1] + br bool %tmp.4, label %no_exit, label %return + +return: ; preds = %entry, %endif + ret void +} diff --git a/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll b/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll new file mode 100644 index 0000000..a88e041 --- /dev/null +++ b/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +implementation ; Functions: + +void %test() { + br bool false, label %then, label %endif + +then: + invoke void null( sbyte* null ) + to label %invoke_cont except label %invoke_catch + +invoke_catch: + unwind + +invoke_cont: + ret void + +endif: + ret void +} diff --git a/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll b/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll new file mode 100644 index 0000000..c61bd6d --- /dev/null +++ b/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +int %main() { + br label %loop + +loop: + br label %loop +} diff --git a/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll b/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll new file mode 100644 index 0000000..cf7b088 --- /dev/null +++ b/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -simplifycfg | llvm-dis | grep call +declare void %exit(int) + +int %main(int %argc) { + %C = seteq int %argc, 1 + br bool %C, label %Cond, label %Done + +Cond: + br bool %C, label %Loop, label %Done + +Loop: + call void %exit(int 0) + br label %Loop + +Done: + ret int 1 +} diff --git a/test/Transforms/ADCE/2003-12-19-MergeReturn.llx b/test/Transforms/ADCE/2003-12-19-MergeReturn.llx new file mode 100644 index 0000000..6b8b547 --- /dev/null +++ b/test/Transforms/ADCE/2003-12-19-MergeReturn.llx @@ -0,0 +1,28 @@ +; This testcase was failing because without merging the return blocks, ADCE +; didn't know that it could get rid of the then.0 block. + +; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep load + + +implementation ; Functions: + +void %main(uint %argc, sbyte** %argv) { +entry: + call void %__main( ) + %tmp.1 = setle uint %argc, 5 ; <bool> [#uses=1] + br bool %tmp.1, label %then.0, label %return + +then.0: ; preds = %entry + %tmp.8 = load sbyte** %argv ; <sbyte*> [#uses=1] + %tmp.10 = load sbyte* %tmp.8 ; <sbyte> [#uses=1] + %tmp.11 = seteq sbyte %tmp.10, 98 ; <bool> [#uses=1] + br bool %tmp.11, label %then.1, label %return + +then.1: ; preds = %then.0 + ret void + +return: ; preds = %entry, %then.0 + ret void +} + +declare void %__main() diff --git a/test/Transforms/ADCE/2004-05-04-UnreachableBlock.llx b/test/Transforms/ADCE/2004-05-04-UnreachableBlock.llx new file mode 100644 index 0000000..56f2b2b --- /dev/null +++ b/test/Transforms/ADCE/2004-05-04-UnreachableBlock.llx @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +void %test() { +entry: + br label %UnifiedReturnBlock + +UnifiedReturnBlock: + ret void + +invoke_catch.0: ; No predecessors! + br bool false, label %UnifiedUnwindBlock, label %UnifiedReturnBlock + +UnifiedUnwindBlock: ; preds = %invoke_catch.0 + unwind + +} diff --git a/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll b/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll new file mode 100644 index 0000000..b7965f0 --- /dev/null +++ b/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll @@ -0,0 +1,44 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +implementation ; Functions: + +declare void %strlen() +declare void %_ZN10QByteArray6resizeEi() +declare void %q_atomic_decrement() + +void %_ZNK10QByteArray13leftJustifiedEicb() { +entry: + invoke void %strlen( ) + to label %tmp.3.i.noexc unwind label %invoke_catch.0 + +tmp.3.i.noexc: ; preds = %entry + br bool false, label %then.0, label %else.0 + +invoke_catch.0: ; preds = %entry + invoke void %q_atomic_decrement( ) + to label %tmp.1.i.i183.noexc unwind label %terminate + +tmp.1.i.i183.noexc: ; preds = %invoke_catch.0 + unwind + +then.0: ; preds = %tmp.3.i.noexc + invoke void %_ZN10QByteArray6resizeEi( ) + to label %invoke_cont.1 unwind label %invoke_catch.1 + +invoke_catch.1: ; preds = %then.0 + invoke void %q_atomic_decrement( ) + to label %tmp.1.i.i162.noexc unwind label %terminate + +tmp.1.i.i162.noexc: ; preds = %invoke_catch.1 + ret void + +invoke_cont.1: ; preds = %then.0 + ret void + +else.0: ; preds = %tmp.3.i.noexc + ret void + +terminate: ; preds = %invoke_catch.1, %invoke_catch.0 + %dbg.0.1 = phi { }* [ null, %invoke_catch.1 ], [ null, %invoke_catch.0 ] ; <{ }*> [#uses=1] + unreachable +} diff --git a/test/Transforms/ADCE/adcetest.ll b/test/Transforms/ADCE/adcetest.ll new file mode 100644 index 0000000..f0d7843 --- /dev/null +++ b/test/Transforms/ADCE/adcetest.ll @@ -0,0 +1,34 @@ +; This is the test case taken from Appel's book that illustrates a hard case +; that SCCP gets right, and when followed by ADCE, is completely eliminated +; +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -adce -simplifycfg | llvm-dis | not grep br + +int "test function"(int %i0, int %j0) { +BB1: + br label %BB2 +BB2: + %j2 = phi int [%j4, %BB7], [1, %BB1] + %k2 = phi int [%k4, %BB7], [0, %BB1] + %kcond = setlt int %k2, 100 + br bool %kcond, label %BB3, label %BB4 + +BB3: + %jcond = setlt int %j2, 20 + br bool %jcond, label %BB5, label %BB6 + +BB4: + ret int %j2 + +BB5: + %k3 = add int %k2, 1 + br label %BB7 + +BB6: + %k5 = add int %k2, 1 + br label %BB7 + +BB7: + %j4 = phi int [1, %BB5], [%k2, %BB6] + %k4 = phi int [%k3, %BB5], [%k5, %BB6] + br label %BB2 +} diff --git a/test/Transforms/ADCE/basictest.ll b/test/Transforms/ADCE/basictest.ll new file mode 100644 index 0000000..6be744e --- /dev/null +++ b/test/Transforms/ADCE/basictest.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -simplifycfg | llvm-dis + +int "Test"(int %A, int %B) { +BB1: + br label %BB4 +BB2: + br label %BB3 +BB3: + %ret = phi int [%X, %BB4], [%B, %BB2] + ret int %ret +BB4: + %X = phi int [%A, %BB1] + br label %BB3 +} diff --git a/test/Transforms/ADCE/basictest1.ll b/test/Transforms/ADCE/basictest1.ll new file mode 100644 index 0000000..7d511e8 --- /dev/null +++ b/test/Transforms/ADCE/basictest1.ll @@ -0,0 +1,101 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -simplifycfg | llvm-dis + +%FILE = type { int, ubyte*, ubyte*, ubyte, ubyte, uint, uint, uint } + %spec_fd_t = type { int, int, int, ubyte* } +%__iob = uninitialized global [20 x %FILE] ; <[20 x %FILE]*> [#uses=1] +%dbglvl = global int 4 ; <int*> [#uses=3] +%spec_fd = uninitialized global [3 x %spec_fd_t] ; <[3 x %spec_fd_t]*> [#uses=4] +%.LC9 = internal global [34 x sbyte] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00" ; <[34 x sbyte]*> [#uses=1] +%.LC10 = internal global [4 x sbyte] c"EOF\00" ; <[4 x sbyte]*> [#uses=1] +%.LC11 = internal global [4 x sbyte] c"%d\0A\00" ; <[4 x sbyte]*> [#uses=1] +%.LC12 = internal global [17 x sbyte] c"spec_getc: %d = \00" ; <[17 x sbyte]*> [#uses=1] + +implementation ; Functions: + +declare int "fprintf"(%FILE*, sbyte*, ...) + +declare void "exit"(int) + +declare int "remove"(sbyte*) + +declare int "fputc"(int, %FILE*) + +declare uint "fwrite"(sbyte*, uint, uint, %FILE*) + +declare void "perror"(sbyte*) + +int "spec_getc"(int %fd) { +; <label>:0 ;[#uses=0] + %reg109 = load int* %dbglvl ; <int> [#uses=1] + %cond266 = setle int %reg109, 4 ; <bool> [#uses=1] + br bool %cond266, label %bb3, label %bb2 + +bb2: ;[#uses=1] + %cast273 = getelementptr [17 x sbyte]* %.LC12, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb3 + +bb3: ;[#uses=2] + %cond267 = setle int %fd, 3 ; <bool> [#uses=1] + br bool %cond267, label %bb5, label %bb4 + +bb4: ;[#uses=2] + %reg111 = getelementptr [20 x %FILE]* %__iob, long 0, long 1, uint 3 ; <ubyte*> [#uses=1] + %cast274 = getelementptr [34 x sbyte]* %.LC9, long 0, long 0 ; <sbyte*> [#uses=0] + %cast282 = cast ubyte* %reg111 to %FILE* ; <%FILE*> [#uses=0] + call void %exit( int 1 ) + br label %UnifiedExitNode + +bb5: ;[#uses=1] + %reg107-idxcast1 = cast int %fd to long ; <long> [#uses=2] + %reg107-idxcast2 = cast int %fd to long ; <long> [#uses=1] + %reg1311 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast2 ; <%spec_fd_t*> [#uses=1] + %idx1 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast1, uint 2 ; <int> [#uses=3] + %reg1321 = load int* %idx1 + %idx2 = getelementptr %spec_fd_t* %reg1311, long 0, uint 1 ; <int> [#uses=1] + %reg1331 = load int* %idx2 + %cond270 = setlt int %reg1321, %reg1331 ; <bool> [#uses=1] + br bool %cond270, label %bb9, label %bb6 + +bb6: ;[#uses=1] + %reg134 = load int* %dbglvl ; <int> [#uses=1] + %cond271 = setle int %reg134, 4 ; <bool> [#uses=1] + br bool %cond271, label %bb8, label %bb7 + +bb7: ;[#uses=1] + %cast277 = getelementptr [4 x sbyte]* %.LC10, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb8 + +bb8: ;[#uses=3] + br label %UnifiedExitNode + +bb9: ;[#uses=1] + %reg107-idxcast3 = cast int %fd to long ; <long> [#uses=1] + %idx3 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast3, uint 3 ; <ubyte*> [#uses=1] + %reg1601 = load ubyte** %idx3 + %reg132-idxcast1 = cast int %reg1321 to long ; <long> [#uses=1] + %idx4 = getelementptr ubyte* %reg1601, long %reg132-idxcast1 ; <ubyte> [#uses=2] + %reg1621 = load ubyte* %idx4 + %cast108 = cast ubyte %reg1621 to long ; <long> [#uses=0] + %reg157 = add int %reg1321, 1 ; <int> [#uses=1] + %idx5 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast1, uint 2 + store int %reg157, int* %idx5 + %reg163 = load int* %dbglvl ; <int> [#uses=1] + %cond272 = setle int %reg163, 4 ; <bool> [#uses=1] + br bool %cond272, label %bb11, label %bb10 + +bb10: ;[#uses=1] + %cast279 = getelementptr [4 x sbyte]* %.LC11, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb11 + +bb11: ;[#uses=3] + %cast291 = cast ubyte %reg1621 to int ; <int> [#uses=1] + br label %UnifiedExitNode + +UnifiedExitNode: ;[#uses=3] + %UnifiedRetVal = phi int [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ] ; <int> [#uses=1] + ret int %UnifiedRetVal +} + +declare int "puts"(sbyte*) + +declare int "printf"(sbyte*, ...) diff --git a/test/Transforms/ADCE/basictest2.ll b/test/Transforms/ADCE/basictest2.ll new file mode 100644 index 0000000..75b1d95 --- /dev/null +++ b/test/Transforms/ADCE/basictest2.ll @@ -0,0 +1,102 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -simplifycfg | llvm-dis + +%FILE = type { int, ubyte*, ubyte*, ubyte, ubyte, uint, uint, uint } + %spec_fd_t = type { int, int, int, ubyte* } +%__iob = uninitialized global [20 x %FILE] ; <[20 x %FILE]*> [#uses=1] +%dbglvl = global int 4 ; <int*> [#uses=3] +%spec_fd = uninitialized global [3 x %spec_fd_t] ; <[3 x %spec_fd_t]*> [#uses=4] +%.LC9 = internal global [34 x sbyte] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00" ; <[34 x sbyte]*> [#uses=1] +%.LC10 = internal global [4 x sbyte] c"EOF\00" ; <[4 x sbyte]*> [#uses=1] +%.LC11 = internal global [4 x sbyte] c"%d\0A\00" ; <[4 x sbyte]*> [#uses=1] +%.LC12 = internal global [17 x sbyte] c"spec_getc: %d = \00" ; <[17 x sbyte]*> [#uses=1] + +implementation ; Functions: + +declare int "fprintf"(%FILE*, sbyte*, ...) + +declare void "exit"(int) + +declare int "remove"(sbyte*) + +declare int "fputc"(int, %FILE*) + +declare uint "fwrite"(sbyte*, uint, uint, %FILE*) + +declare void "perror"(sbyte*) + +int "spec_getc"(int %fd) { +; <label>:0 ;[#uses=0] + %reg109 = load int* %dbglvl ; <int> [#uses=1] + %cond266 = setle int %reg109, 4 ; <bool> [#uses=1] + br bool %cond266, label %bb3, label %bb2 + +bb2: ;[#uses=1] + %cast273 = getelementptr [17 x sbyte]* %.LC12, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb3 + +bb3: ;[#uses=2] + %cond267 = setle int %fd, 3 ; <bool> [#uses=1] +; br bool %cond267, label %bb5, label %bb4 + br label %bb5 + +bb4: ;[#uses=2] + %reg111 = getelementptr [20 x %FILE]* %__iob, long 0, long 1, uint 3 ; <ubyte*> [#uses=1] + %cast274 = getelementptr [34 x sbyte]* %.LC9, long 0, long 0 ; <sbyte*> [#uses=0] + %cast282 = cast ubyte* %reg111 to %FILE* ; <%FILE*> [#uses=0] + call void %exit( int 1 ) + br label %UnifiedExitNode + +bb5: ;[#uses=1] + %reg107-idxcast1 = cast int %fd to long ; <long> [#uses=2] + %reg107-idxcast2 = cast int %fd to long ; <long> [#uses=1] + %reg1311 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast2 ; <%spec_fd_t*> [#uses=1] + %idx1 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast1, uint 2 ; <int> [#uses=3] + %reg1321 = load int* %idx1 + %idx2 = getelementptr %spec_fd_t* %reg1311, long 0, uint 1 ; <int> [#uses=1] + %reg1331 = load int* %idx2 + %cond270 = setlt int %reg1321, %reg1331 ; <bool> [#uses=1] + br bool %cond270, label %bb9, label %bb6 + +bb6: ;[#uses=1] + %reg134 = load int* %dbglvl ; <int> [#uses=1] + %cond271 = setle int %reg134, 4 ; <bool> [#uses=1] + br bool %cond271, label %bb8, label %bb7 + +bb7: ;[#uses=1] + %cast277 = getelementptr [4 x sbyte]* %.LC10, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb8 + +bb8: ;[#uses=3] + br label %UnifiedExitNode + +bb9: ;[#uses=1] + %reg107-idxcast3 = cast int %fd to long ; <uint> [#uses=1] + %idx3 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast3, uint 3 ; <ubyte*> [#uses=1] + %reg1601 = load ubyte** %idx3 + %reg132-idxcast1 = cast int %reg1321 to long ; <long> [#uses=1] + %idx4 = getelementptr ubyte* %reg1601, long %reg132-idxcast1 ; <ubyte> [#uses=2] + %reg1621 = load ubyte* %idx4 + %cast108 = cast ubyte %reg1621 to long ; <long> [#uses=0] + %reg157 = add int %reg1321, 1 ; <int> [#uses=1] + %idx5 = getelementptr [3 x %spec_fd_t]* %spec_fd, long 0, long %reg107-idxcast1, uint 2 + store int %reg157, int* %idx5 + %reg163 = load int* %dbglvl ; <int> [#uses=1] + %cond272 = setle int %reg163, 4 ; <bool> [#uses=1] + br bool %cond272, label %bb11, label %bb10 + +bb10: ;[#uses=1] + %cast279 = getelementptr [4 x sbyte]* %.LC11, long 0, long 0 ; <sbyte*> [#uses=0] + br label %bb11 + +bb11: ;[#uses=3] + %cast291 = cast ubyte %reg1621 to int ; <int> [#uses=1] + br label %UnifiedExitNode + +UnifiedExitNode: ;[#uses=3] + %UnifiedRetVal = phi int [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ] ; <int> [#uses=1] + ret int %UnifiedRetVal +} + +declare int "puts"(sbyte*) + +declare int "printf"(sbyte*, ...) diff --git a/test/Transforms/ADCE/dce_pure_call.ll b/test/Transforms/ADCE/dce_pure_call.ll new file mode 100644 index 0000000..79a360c --- /dev/null +++ b/test/Transforms/ADCE/dce_pure_call.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep call + +declare int %strlen(sbyte*) + +void %test() { + ;; Dead call should be deleted! + call int %strlen(sbyte *null) + ret void +} diff --git a/test/Transforms/ADCE/dce_pure_invoke.ll b/test/Transforms/ADCE/dce_pure_invoke.ll new file mode 100644 index 0000000..9604def --- /dev/null +++ b/test/Transforms/ADCE/dce_pure_invoke.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep null + +declare int %strlen(sbyte*) + +int %test() { + ;; Dead call should be deleted! + invoke int %strlen(sbyte *null) to label %Cont unwind label %Other +Cont: + ret int 0 +Other: + ret int 1 +} + diff --git a/test/Transforms/ADCE/dead-phi-edge.ll b/test/Transforms/ADCE/dead-phi-edge.ll new file mode 100644 index 0000000..a0c0705 --- /dev/null +++ b/test/Transforms/ADCE/dead-phi-edge.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep call + +; The call is not live just because the PHI uses the call retval! + +int %test(int %X) { + br label %Done + +DeadBlock: + %Y = call int %test(int 0) + br label %Done + +Done: + %Z = phi int [%X, %0], [%Y, %DeadBlock] + ret int %Z +} diff --git a/test/Transforms/ADCE/dg.exp b/test/Transforms/ADCE/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/ADCE/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/ADCE/unreachable-function.ll b/test/Transforms/ADCE/unreachable-function.ll new file mode 100644 index 0000000..0c10253 --- /dev/null +++ b/test/Transforms/ADCE/unreachable-function.ll @@ -0,0 +1,5 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -adce -disable-output + +void %test() { + unreachable +} diff --git a/test/Transforms/ArgumentPromotion/aggregate-promote.ll b/test/Transforms/ArgumentPromotion/aggregate-promote.ll new file mode 100644 index 0000000..19cbb6d --- /dev/null +++ b/test/Transforms/ArgumentPromotion/aggregate-promote.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -argpromotion -instcombine | not grep load + +%QuadTy = type {int, int, int, int} + +%G = constant %QuadTy {int 0, int 0, int 17, int 25 } + +implementation + +internal int %test(%QuadTy* %P) { + %A = getelementptr %QuadTy* %P, long 0, uint 3 + %B = getelementptr %QuadTy* %P, long 0, uint 2 + %a = load int* %A + %b = load int* %B + %V = add int %a, %b + ret int %V +} + +int %caller() { + %V = call int %test(%QuadTy* %G) + ret int %V +} diff --git a/test/Transforms/ArgumentPromotion/basictest.ll b/test/Transforms/ArgumentPromotion/basictest.ll new file mode 100644 index 0000000..4742027 --- /dev/null +++ b/test/Transforms/ArgumentPromotion/basictest.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -argpromotion -mem2reg | llvm-dis | not grep alloca + +implementation + +internal int %test(int *%X, int* %Y) { + %A = load int* %X + %B = load int* %Y + %C = add int %A, %B + ret int %C +} + +internal int %caller(int* %B) { + %A = alloca int + store int 1, int* %A + %C = call int %test(int* %A, int* %B) + ret int %C +} + +int %callercaller() { + %B = alloca int + store int 2, int* %B + %X = call int %caller(int* %B) + ret int %X +} diff --git a/test/Transforms/ArgumentPromotion/chained.ll b/test/Transforms/ArgumentPromotion/chained.ll new file mode 100644 index 0000000..d6055e2 --- /dev/null +++ b/test/Transforms/ArgumentPromotion/chained.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -argpromotion -instcombine | llvm-dis | not grep load + +%G1 = constant int 0 +%G2 = constant int* %G1 + +implementation + +internal int %test(int **%X) { + %Y = load int** %X + %X = load int* %Y + ret int %X +} + +int %caller(int** %P) { + %X = call int %test(int** %G2) + ret int %X +} diff --git a/test/Transforms/ArgumentPromotion/control-flow.ll b/test/Transforms/ArgumentPromotion/control-flow.ll new file mode 100644 index 0000000..8e47ac9 --- /dev/null +++ b/test/Transforms/ArgumentPromotion/control-flow.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -argpromotion | llvm-dis | \ +; RUN: not grep {load int\* null} + +implementation + +internal int %callee(bool %C, int* %P) { + br bool %C, label %T, label %F +T: + ret int 17 +F: + %X = load int* %P + ret int %X +} + +int %foo() { + %X = call int %callee(bool true, int* null) + ret int %X +} + diff --git a/test/Transforms/ArgumentPromotion/control-flow2.ll b/test/Transforms/ArgumentPromotion/control-flow2.ll new file mode 100644 index 0000000..93b02a7 --- /dev/null +++ b/test/Transforms/ArgumentPromotion/control-flow2.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -argpromotion | llvm-dis | \ +; RUN: grep {load i32\\* %A} + +implementation + +internal int %callee(bool %C, int* %P) { + br bool %C, label %T, label %F +T: + ret int 17 +F: + %X = load int* %P + ret int %X +} + +int %foo() { + %A = alloca int + store int 17, int* %A + %X = call int %callee(bool false, int* %A) + ret int %X +} + diff --git a/test/Transforms/ArgumentPromotion/dg.exp b/test/Transforms/ArgumentPromotion/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/ArgumentPromotion/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/BlockPlacement/basictest.ll b/test/Transforms/BlockPlacement/basictest.ll new file mode 100644 index 0000000..4dafa4f --- /dev/null +++ b/test/Transforms/BlockPlacement/basictest.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -block-placement -disable-output -print + +int %test() { + + br bool true, label %X, label %Y +A: + ret int 0 +X: + br label %A +Y: + br label %A +} diff --git a/test/Transforms/BlockPlacement/dg.exp b/test/Transforms/BlockPlacement/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/BlockPlacement/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll b/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll new file mode 100644 index 0000000..3100d64 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll @@ -0,0 +1,75 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output + +void %solve() { +entry: + br label %loopentry.0 + +loopentry.0: ; preds = %entry, %endif.0 + br bool false, label %no_exit.0, label %loopexit.0 + +no_exit.0: ; preds = %loopentry.0 + br bool false, label %then.0, label %endif.0 + +then.0: ; preds = %no_exit.0 + br bool false, label %shortcirc_done, label %shortcirc_next + +shortcirc_next: ; preds = %then.0 + br label %shortcirc_done + +shortcirc_done: ; preds = %then.0, %shortcirc_next + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %shortcirc_done + br bool false, label %cond_true, label %cond_false + +cond_true: ; preds = %then.1 + br label %cond_continue + +cond_false: ; preds = %then.1 + br label %cond_continue + +cond_continue: ; preds = %cond_true, %cond_false + br label %return + +after_ret.0: ; No predecessors! + br label %endif.1 + +endif.1: ; preds = %shortcirc_done, %after_ret.0 + br label %endif.0 + +endif.0: ; preds = %no_exit.0, %endif.1 + br label %loopentry.0 + +loopexit.0: ; preds = %loopentry.0 + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %loopexit.0 + br bool false, label %then.3, label %endif.3 + +then.3: ; preds = %then.2 + br label %return + +after_ret.1: ; No predecessors! + br label %endif.3 + +endif.3: ; preds = %then.2, %after_ret.1 + br label %endif.2 + +endif.2: ; preds = %loopexit.0, %endif.3 + br label %loopentry.1 + +loopentry.1: ; preds = %endif.2, %no_exit.1 + br bool false, label %no_exit.1, label %loopexit.1 + +no_exit.1: ; preds = %loopentry.1 + br label %loopentry.1 + +loopexit.1: ; preds = %loopentry.1 + br label %return + +after_ret.2: ; No predecessors! + br label %return + +return: ; preds = %cond_continue, %then.3, %loopexit.1, %after_ret.2 + ret void +} diff --git a/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll b/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll new file mode 100644 index 0000000..186466d --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll @@ -0,0 +1,34 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output +; This testcase is failing the loop extractor because not all exit blocks +; are dominated by all of the live-outs. + +implementation ; Functions: + +int %ab(int %alpha, int %beta) { +entry: + br label %loopentry.1.preheader + +loopentry.1.preheader: ; preds = %then.1 + br label %loopentry.1 + +loopentry.1: ; preds = %loopentry.1.preheader, %no_exit.1 + br bool false, label %no_exit.1, label %loopexit.0.loopexit1 + +no_exit.1: ; preds = %loopentry.1 + %tmp.53 = load int* null ; <int> [#uses=1] + br bool false, label %shortcirc_next.2, label %loopentry.1 + +shortcirc_next.2: ; preds = %no_exit.1 + %tmp.563 = call int %wins( int 0, int %tmp.53, int 3 ) ; <int> [#uses=0] + ret int 0 + +loopexit.0.loopexit1: ; preds = %loopentry.1 + br label %loopexit.0 + +loopexit.0: ; preds = %loopexit.0.loopexit, %loopexit.0.loopexit1 + ret int 0 +} + +declare int %wins(int, int, int) + +declare ushort %ab_code() diff --git a/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll b/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll new file mode 100644 index 0000000..3efcea5 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract-single -disable-output + +void %ab() { +entry: + br label %codeReplTail + +then.1: ; preds = %codeReplTail + br label %loopentry.1 + +loopentry.1: ; preds = %loopentry.1.preheader, %no_exit.1 + br bool false, label %no_exit.1, label %loopexit.0.loopexit1 + +no_exit.1: ; preds = %loopentry.1 + br label %loopentry.1 + +loopexit.0.loopexit: ; preds = %codeReplTail + ret void + +loopexit.0.loopexit1: ; preds = %loopentry.1 + ret void + +codeReplTail: ; preds = %codeRepl, %codeReplTail + switch ushort 0, label %codeReplTail [ + ushort 0, label %loopexit.0.loopexit + ushort 1, label %then.1 + ] +} diff --git a/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll b/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll new file mode 100644 index 0000000..67756b5 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll @@ -0,0 +1,47 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output + +void %sendMTFValues() { +entry: + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %entry + br bool false, label %loopentry.6.preheader, label %else.0 + +endif.1: ; preds = %entry + ret void + +else.0: ; preds = %then.1 + ret void + +loopentry.6.preheader: ; preds = %then.1 + br bool false, label %endif.7.preheader, label %loopexit.9 + +endif.7.preheader: ; preds = %loopentry.6.preheader + %tmp.183 = add int 0, -1 ; <int> [#uses=1] + br label %endif.7 + +endif.7: ; preds = %endif.7.preheader, %loopexit.15 + br bool false, label %loopentry.10, label %loopentry.12 + +loopentry.10: ; preds = %endif.7 + br label %loopentry.12 + +loopentry.12: ; preds = %endif.7, %loopentry.10 + %ge.2.1 = phi int [ 0, %loopentry.10 ], [ %tmp.183, %endif.7 ] ; <int> [#uses=0] + br bool false, label %loopexit.14, label %no_exit.11 + +no_exit.11: ; preds = %loopentry.12 + ret void + +loopexit.14: ; preds = %loopentry.12 + br bool false, label %loopexit.15, label %no_exit.14 + +no_exit.14: ; preds = %loopexit.14 + ret void + +loopexit.15: ; preds = %loopexit.14 + br bool false, label %endif.7, label %loopexit.9 + +loopexit.9: ; preds = %loopentry.6.preheader, %loopexit.15 + ret void +} diff --git a/test/Transforms/CodeExtractor/2004-03-17-OutputMismatch.ll b/test/Transforms/CodeExtractor/2004-03-17-OutputMismatch.ll new file mode 100644 index 0000000..23ca986 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-17-OutputMismatch.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output + + %struct.node_t = type { double*, %struct.node_t*, %struct.node_t**, double**, double*, int, int } + %struct.table_t = type { [1 x %struct.node_t**], [1 x %struct.node_t**] } + +implementation ; Functions: + +void %make_tables() { +entry: + %tmp.0.i = malloc %struct.node_t ; <%struct.node_t*> [#uses=1] + br bool false, label %no_exit.i, label %loopexit.i + +no_exit.i: ; preds = %entry, %no_exit.i + %prev_node.0.i.1 = phi %struct.node_t* [ %tmp.16.i, %no_exit.i ], [ %tmp.0.i, %entry ] ; <%struct.node_t*> [#uses=0] + %tmp.16.i = malloc %struct.node_t ; <%struct.node_t*> [#uses=2] + br bool false, label %no_exit.i, label %loopexit.i + +loopexit.i: ; preds = %entry, %no_exit.i + %cur_node.0.i.0 = phi %struct.node_t* [ null, %entry ], [ %tmp.16.i, %no_exit.i ] ; <%struct.node_t*> [#uses=0] + ret void +} diff --git a/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll b/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll new file mode 100644 index 0000000..0ff3091 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output + + +void %maketree() { +entry: + br bool false, label %no_exit.1, label %loopexit.0 + +no_exit.1: ; preds = %entry, %expandbox.entry, %endif + br bool false, label %endif, label %expandbox.entry + +expandbox.entry: ; preds = %no_exit.1 + br bool false, label %loopexit.1, label %no_exit.1 + +endif: ; preds = %no_exit.1 + br bool false, label %loopexit.1, label %no_exit.1 + +loopexit.1: ; preds = %expandbox.entry, %endif + %ic.i.0.0.4 = phi int [ 0, %expandbox.entry ], [ 0, %endif ] ; <int> [#uses=0] + ret void + +loopexit.0: ; preds = %entry + ret void +} diff --git a/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll b/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll new file mode 100644 index 0000000..70d1e0a --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll @@ -0,0 +1,196 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-extract -disable-output + +implementation ; Functions: + +declare int %_IO_getc() + +declare void %__errno_location() + +void %yylex() { +entry: + switch uint 0, label %label.126 [ + uint 0, label %return + uint 61, label %combine + uint 33, label %combine + uint 94, label %combine + uint 37, label %combine + uint 47, label %combine + uint 42, label %combine + uint 62, label %combine + uint 60, label %combine + uint 58, label %combine + uint 124, label %combine + uint 38, label %combine + uint 45, label %combine + uint 43, label %combine + uint 34, label %string_constant + uint 39, label %char_constant + uint 46, label %loopexit.2 + uint 57, label %loopexit.2 + uint 56, label %loopexit.2 + uint 55, label %loopexit.2 + uint 54, label %loopexit.2 + uint 53, label %loopexit.2 + uint 52, label %loopexit.2 + uint 51, label %loopexit.2 + uint 50, label %loopexit.2 + uint 49, label %loopexit.2 + uint 48, label %loopexit.2 + uint 95, label %letter + uint 122, label %letter + uint 121, label %letter + uint 120, label %letter + uint 119, label %letter + uint 118, label %letter + uint 117, label %letter + uint 116, label %letter + uint 115, label %letter + uint 114, label %letter + uint 113, label %letter + uint 112, label %letter + uint 111, label %letter + uint 110, label %letter + uint 109, label %letter + uint 108, label %letter + uint 107, label %letter + uint 106, label %letter + uint 105, label %letter + uint 104, label %letter + uint 103, label %letter + uint 102, label %letter + uint 101, label %letter + uint 100, label %letter + uint 99, label %letter + uint 98, label %letter + uint 97, label %letter + uint 90, label %letter + uint 89, label %letter + uint 88, label %letter + uint 87, label %letter + uint 86, label %letter + uint 85, label %letter + uint 84, label %letter + uint 83, label %letter + uint 82, label %letter + uint 81, label %letter + uint 80, label %letter + uint 79, label %letter + uint 78, label %letter + uint 77, label %letter + uint 75, label %letter + uint 74, label %letter + uint 73, label %letter + uint 72, label %letter + uint 71, label %letter + uint 70, label %letter + uint 69, label %letter + uint 68, label %letter + uint 67, label %letter + uint 66, label %letter + uint 65, label %letter + uint 64, label %label.13 + uint 76, label %label.12 + uint 36, label %label.11 + uint 4294967295, label %label.10 + ] + +label.10: ; preds = %entry + ret void + +label.11: ; preds = %entry + ret void + +label.12: ; preds = %entry + ret void + +label.13: ; preds = %entry + ret void + +letter: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry + ret void + +loopexit.2: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry + switch int 0, label %shortcirc_next.14 [ + int 48, label %then.20 + int 46, label %endif.38 + ] + +then.20: ; preds = %loopexit.2 + switch int 0, label %else.4 [ + int 120, label %then.21 + int 88, label %then.21 + ] + +then.21: ; preds = %then.20, %then.20 + ret void + +else.4: ; preds = %then.20 + ret void + +shortcirc_next.14: ; preds = %loopexit.2 + ret void + +endif.38: ; preds = %loopexit.2 + br bool false, label %then.40, label %then.39 + +then.39: ; preds = %endif.38 + ret void + +then.40: ; preds = %endif.38 + invoke void %__errno_location( ) + to label %switchexit.2 unwind label %LongJmpBlkPre + +loopentry.6: ; preds = %endif.52 + switch uint 0, label %switchexit.2 [ + uint 73, label %label.82 + uint 105, label %label.82 + uint 76, label %label.80 + uint 108, label %label.80 + uint 70, label %label.78 + uint 102, label %label.78 + ] + +label.78: ; preds = %loopentry.6, %loopentry.6 + ret void + +label.80: ; preds = %loopentry.6, %loopentry.6 + ret void + +label.82: ; preds = %loopentry.6, %loopentry.6 + %c.0.15.5 = phi int [ %tmp.79417, %loopentry.6 ], [ %tmp.79417, %loopentry.6 ] ; <int> [#uses=0] + ret void + +switchexit.2: ; preds = %then.40, %loopentry.6 + br bool false, label %endif.51, label %loopexit.6 + +endif.51: ; preds = %switchexit.2 + br bool false, label %endif.52, label %then.52 + +then.52: ; preds = %endif.51 + ret void + +endif.52: ; preds = %endif.51 + %tmp.79417 = invoke int %_IO_getc( ) + to label %loopentry.6 unwind label %LongJmpBlkPre ; <int> [#uses=2] + +loopexit.6: ; preds = %switchexit.2 + ret void + +char_constant: ; preds = %entry + ret void + +string_constant: ; preds = %entry + ret void + +combine: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry + ret void + +label.126: ; preds = %entry + ret void + +return: ; preds = %entry + ret void + +LongJmpBlkPre: ; preds = %then.40, %endif.52 + ret void +} diff --git a/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll b/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll new file mode 100644 index 0000000..c9c23d4 --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -extract-blocks -disable-output + +implementation + +void %test1() { +no_exit.0.i: + br bool false, label %yylex.entry, label %yylex.entry + +yylex.entry: + %tmp.1027 = phi int [ 0, %no_exit.0.i ], [ 0, %no_exit.0.i ] + ret void +} + +void %test2() { +no_exit.0.i: + switch uint 0, label %yylex.entry [ + uint 0, label %yylex.entry + uint 1, label %foo + ] + +yylex.entry: + %tmp.1027 = phi int [ 0, %no_exit.0.i ], [ 0, %no_exit.0.i ] + ret void +foo: + ret void +} + diff --git a/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll b/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll new file mode 100644 index 0000000..4ada2ae --- /dev/null +++ b/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -extract-blocks -disable-output +int %foo() { + br label %EB +EB: + %V = invoke int %foo() to label %Cont unwind label %Unw +Cont: + ret int %V +Unw: + unwind +} diff --git a/test/Transforms/CodeExtractor/dg.exp b/test/Transforms/CodeExtractor/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/CodeExtractor/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/CondProp/2006-08-14-SingleEntryPhiCrash.ll b/test/Transforms/CondProp/2006-08-14-SingleEntryPhiCrash.ll new file mode 100644 index 0000000..e029831 --- /dev/null +++ b/test/Transforms/CondProp/2006-08-14-SingleEntryPhiCrash.ll @@ -0,0 +1,466 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -condprop -disable-output +; PR877 + +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin9.0.0d1" + "struct.kc::impl_Ccode_option" = type { "struct.kc::impl_abstract_phylum" } + "struct.kc::impl_ID" = type { "struct.kc::impl_abstract_phylum", "struct.kc::impl_Ccode_option"*, "struct.kc::impl_casestring__Str"*, int, "struct.kc::impl_casestring__Str"* } + "struct.kc::impl_abstract_phylum" = type { int (...)** } + "struct.kc::impl_casestring__Str" = type { "struct.kc::impl_abstract_phylum", sbyte* } + "struct.kc::impl_elem_patternrepresentation" = type { "struct.kc::impl_abstract_phylum", int, "struct.kc::impl_casestring__Str"*, "struct.kc::impl_ID"* } + "struct.kc::impl_outmostpatterns" = type { "struct.kc::impl_Ccode_option", "struct.kc::impl_elem_patternrepresentation"*, "struct.kc::impl_outmostpatterns"* } + "struct.kc::impl_patternrepresentations" = type { "struct.kc::impl_Ccode_option", "struct.kc::impl_outmostpatterns"*, "struct.kc::impl_patternrepresentations"* } + +implementation ; Functions: + +void %_ZN2kc16compare_patternsEPNS_26impl_patternrepresentationES1_PNS_27impl_patternrepresentationsE() { +entry: + br label %bb1269.outer.outer.outer.outer + +cond_true: ; preds = %cond_true1298 + br label %bb1269.outer69 + +cond_false: ; preds = %cond_true1298 + br bool false, label %cond_next, label %bb51 + +cond_next: ; preds = %cond_false + br bool false, label %bb52, label %bb51 + +bb51: ; preds = %cond_next, %cond_false + br label %bb52 + +bb52: ; preds = %bb51, %cond_next + br bool false, label %cond_false82, label %cond_true55 + +cond_true55: ; preds = %bb52 + br bool false, label %UnifiedReturnBlock, label %cond_true57 + +cond_true57: ; preds = %cond_true55 + br label %UnifiedReturnBlock + +cond_false82: ; preds = %bb52 + br bool false, label %cond_next97, label %bb113 + +cond_next97: ; preds = %cond_false82 + br bool false, label %bb114, label %bb113 + +bb113: ; preds = %cond_next97, %cond_false82 + br label %bb114 + +bb114: ; preds = %bb113, %cond_next97 + br bool false, label %cond_false151, label %cond_true117 + +cond_true117: ; preds = %bb114 + br bool false, label %UnifiedReturnBlock, label %cond_true120 + +cond_true120: ; preds = %cond_true117 + br label %UnifiedReturnBlock + +cond_false151: ; preds = %bb114 + br bool false, label %cond_next166, label %bb182 + +cond_next166: ; preds = %cond_false151 + br bool false, label %bb183, label %bb182 + +bb182: ; preds = %cond_next166, %cond_false151 + br label %bb183 + +bb183: ; preds = %bb182, %cond_next166 + br bool false, label %cond_false256, label %cond_true186 + +cond_true186: ; preds = %bb183 + br bool false, label %cond_true207, label %cond_false214 + +cond_true207: ; preds = %cond_true186 + br label %bb1269.outer38.backedge + +bb1269.outer38.backedge: ; preds = %cond_true545, %cond_true432, %cond_true320, %cond_true207 + br label %bb1269.outer38 + +cond_false214: ; preds = %cond_true186 + br bool false, label %cond_true228, label %cond_false235 + +cond_true228: ; preds = %cond_false214 + br label %bb1269.outer21.backedge + +bb1269.outer21.backedge: ; preds = %cond_true566, %cond_true453, %cond_true341, %cond_true228 + br label %bb1269.outer21 + +cond_false235: ; preds = %cond_false214 + br bool false, label %UnifiedReturnBlock, label %cond_false250 + +cond_false250: ; preds = %cond_false235 + br label %UnifiedUnreachableBlock + +cond_false256: ; preds = %bb183 + br bool false, label %cond_next271, label %bb287 + +cond_next271: ; preds = %cond_false256 + br bool false, label %bb288, label %bb287 + +bb287: ; preds = %cond_next271, %cond_false256 + br label %bb288 + +bb288: ; preds = %bb287, %cond_next271 + br bool false, label %cond_false369, label %cond_true291 + +cond_true291: ; preds = %bb288 + br bool false, label %cond_true320, label %cond_false327 + +cond_true320: ; preds = %cond_true291 + br label %bb1269.outer38.backedge + +cond_false327: ; preds = %cond_true291 + br bool false, label %cond_true341, label %cond_false348 + +cond_true341: ; preds = %cond_false327 + br label %bb1269.outer21.backedge + +cond_false348: ; preds = %cond_false327 + br bool false, label %UnifiedReturnBlock, label %cond_false363 + +cond_false363: ; preds = %cond_false348 + br label %UnifiedUnreachableBlock + +cond_false369: ; preds = %bb288 + br bool false, label %cond_next384, label %bb400 + +cond_next384: ; preds = %cond_false369 + br bool false, label %bb401, label %bb400 + +bb400: ; preds = %cond_next384, %cond_false369 + br label %bb401 + +bb401: ; preds = %bb400, %cond_next384 + br bool false, label %cond_false481, label %cond_true404 + +cond_true404: ; preds = %bb401 + br bool false, label %cond_true432, label %cond_false439 + +cond_true432: ; preds = %cond_true404 + br label %bb1269.outer38.backedge + +cond_false439: ; preds = %cond_true404 + br bool false, label %cond_true453, label %cond_false460 + +cond_true453: ; preds = %cond_false439 + br label %bb1269.outer21.backedge + +cond_false460: ; preds = %cond_false439 + br bool false, label %UnifiedReturnBlock, label %cond_false475 + +cond_false475: ; preds = %cond_false460 + br label %UnifiedUnreachableBlock + +cond_false481: ; preds = %bb401 + br bool false, label %cond_next496, label %bb512 + +cond_next496: ; preds = %cond_false481 + br bool false, label %bb513, label %bb512 + +bb512: ; preds = %cond_next496, %cond_false481 + br label %bb513 + +bb513: ; preds = %bb512, %cond_next496 + br bool false, label %cond_false594, label %cond_true516 + +cond_true516: ; preds = %bb513 + br bool false, label %cond_true545, label %cond_false552 + +cond_true545: ; preds = %cond_true516 + br label %bb1269.outer38.backedge + +cond_false552: ; preds = %cond_true516 + br bool false, label %cond_true566, label %cond_false573 + +cond_true566: ; preds = %cond_false552 + br label %bb1269.outer21.backedge + +cond_false573: ; preds = %cond_false552 + br bool false, label %UnifiedReturnBlock, label %cond_false588 + +cond_false588: ; preds = %cond_false573 + br label %UnifiedUnreachableBlock + +cond_false594: ; preds = %bb513 + br bool false, label %cond_next609, label %bb625 + +cond_next609: ; preds = %cond_false594 + br bool false, label %bb626, label %bb625 + +bb625: ; preds = %cond_next609, %cond_false594 + br label %bb626 + +bb626: ; preds = %bb625, %cond_next609 + br bool false, label %cond_false707, label %cond_true629 + +cond_true629: ; preds = %bb626 + br bool false, label %cond_true658, label %cond_false665 + +cond_true658: ; preds = %cond_true629 + br label %bb1269.outer2.backedge + +bb1269.outer2.backedge: ; preds = %cond_true679, %cond_true658 + br label %bb1269.outer2 + +cond_false665: ; preds = %cond_true629 + br bool false, label %cond_true679, label %cond_false686 + +cond_true679: ; preds = %cond_false665 + br label %bb1269.outer2.backedge + +cond_false686: ; preds = %cond_false665 + br bool false, label %UnifiedReturnBlock, label %cond_false701 + +cond_false701: ; preds = %cond_false686 + br label %UnifiedUnreachableBlock + +cond_false707: ; preds = %bb626 + br bool false, label %cond_next722, label %bb738 + +cond_next722: ; preds = %cond_false707 + br bool false, label %bb739, label %bb738 + +bb738: ; preds = %cond_next722, %cond_false707 + br label %bb739 + +bb739: ; preds = %bb738, %cond_next722 + br bool false, label %cond_false820, label %cond_true742 + +cond_true742: ; preds = %bb739 + br bool false, label %cond_true771, label %cond_false778 + +cond_true771: ; preds = %cond_true742 + br label %bb1269.outer.backedge + +bb1269.outer.backedge: ; preds = %cond_true792, %cond_true771 + br label %bb1269.outer + +cond_false778: ; preds = %cond_true742 + br bool false, label %cond_true792, label %cond_false799 + +cond_true792: ; preds = %cond_false778 + br label %bb1269.outer.backedge + +cond_false799: ; preds = %cond_false778 + br bool false, label %UnifiedReturnBlock, label %cond_false814 + +cond_false814: ; preds = %cond_false799 + br label %UnifiedUnreachableBlock + +cond_false820: ; preds = %bb739 + br bool false, label %cond_next835, label %bb851 + +cond_next835: ; preds = %cond_false820 + br bool false, label %bb852, label %bb851 + +bb851: ; preds = %cond_next835, %cond_false820 + br label %bb852 + +bb852: ; preds = %bb851, %cond_next835 + br bool false, label %cond_false933, label %cond_true855 + +cond_true855: ; preds = %bb852 + br bool false, label %cond_true884, label %cond_false891 + +cond_true884: ; preds = %cond_true855 + br label %bb1269.outer.outer.backedge + +bb1269.outer.outer.backedge: ; preds = %cond_true905, %cond_true884 + br label %bb1269.outer.outer + +cond_false891: ; preds = %cond_true855 + br bool false, label %cond_true905, label %cond_false912 + +cond_true905: ; preds = %cond_false891 + br label %bb1269.outer.outer.backedge + +cond_false912: ; preds = %cond_false891 + br bool false, label %UnifiedReturnBlock, label %cond_false927 + +cond_false927: ; preds = %cond_false912 + br label %UnifiedUnreachableBlock + +cond_false933: ; preds = %bb852 + br bool false, label %cond_next948, label %bb964 + +cond_next948: ; preds = %cond_false933 + br bool false, label %bb965, label %bb964 + +bb964: ; preds = %cond_next948, %cond_false933 + br label %bb965 + +bb965: ; preds = %bb964, %cond_next948 + br bool false, label %cond_false1046, label %cond_true968 + +cond_true968: ; preds = %bb965 + br bool false, label %cond_true997, label %cond_false1004 + +cond_true997: ; preds = %cond_true968 + br label %bb1269.outer.outer.outer.backedge + +bb1269.outer.outer.outer.backedge: ; preds = %cond_true1018, %cond_true997 + br label %bb1269.outer.outer.outer + +cond_false1004: ; preds = %cond_true968 + br bool false, label %cond_true1018, label %cond_false1025 + +cond_true1018: ; preds = %cond_false1004 + br label %bb1269.outer.outer.outer.backedge + +cond_false1025: ; preds = %cond_false1004 + br bool false, label %UnifiedReturnBlock, label %cond_false1040 + +cond_false1040: ; preds = %cond_false1025 + br label %UnifiedUnreachableBlock + +cond_false1046: ; preds = %bb965 + br bool false, label %cond_next1061, label %bb1077 + +cond_next1061: ; preds = %cond_false1046 + br bool false, label %bb1078, label %bb1077 + +bb1077: ; preds = %cond_next1061, %cond_false1046 + br label %bb1078 + +bb1078: ; preds = %bb1077, %cond_next1061 + %tmp1080 = phi bool [ true, %bb1077 ], [ false, %cond_next1061 ] ; <bool> [#uses=1] + br bool %tmp1080, label %cond_false1159, label %cond_true1081 + +cond_true1081: ; preds = %bb1078 + br bool false, label %cond_true1110, label %cond_false1117 + +cond_true1110: ; preds = %cond_true1081 + br label %bb1269.outer.outer.outer.outer.backedge + +bb1269.outer.outer.outer.outer.backedge: ; preds = %cond_true1131, %cond_true1110 + br label %bb1269.outer.outer.outer.outer + +cond_false1117: ; preds = %cond_true1081 + br bool false, label %cond_true1131, label %cond_false1138 + +cond_true1131: ; preds = %cond_false1117 + br label %bb1269.outer.outer.outer.outer.backedge + +cond_false1138: ; preds = %cond_false1117 + br bool false, label %UnifiedReturnBlock, label %cond_false1153 + +cond_false1153: ; preds = %cond_false1138 + br label %UnifiedUnreachableBlock + +cond_false1159: ; preds = %bb1078 + %tmp.i119.lcssa35.lcssa.lcssa.lcssa.lcssa.lcssa = phi "struct.kc::impl_elem_patternrepresentation"* [ null, %bb1078 ] ; <"struct.kc::impl_elem_patternrepresentation"*> [#uses=0] + br bool false, label %UnifiedReturnBlock, label %cond_false1174 + +cond_false1174: ; preds = %cond_false1159 + br bool false, label %UnifiedReturnBlock, label %cond_false1189 + +cond_false1189: ; preds = %cond_false1174 + br bool false, label %UnifiedReturnBlock, label %cond_false1204 + +cond_false1204: ; preds = %cond_false1189 + br bool false, label %UnifiedReturnBlock, label %cond_false1219 + +cond_false1219: ; preds = %cond_false1204 + br bool false, label %UnifiedReturnBlock, label %cond_true1222 + +cond_true1222: ; preds = %cond_false1219 + br label %UnifiedReturnBlock + +bb1269.outer.outer.outer.outer: ; preds = %bb1269.outer.outer.outer.outer.backedge, %entry + br label %bb1269.outer.outer.outer + +bb1269.outer.outer.outer: ; preds = %bb1269.outer.outer.outer.outer, %bb1269.outer.outer.outer.backedge + br label %bb1269.outer.outer + +bb1269.outer.outer: ; preds = %bb1269.outer.outer.outer, %bb1269.outer.outer.backedge + br label %bb1269.outer + +bb1269.outer: ; preds = %bb1269.outer.outer, %bb1269.outer.backedge + br label %bb1269.outer2 + +bb1269.outer2: ; preds = %bb1269.outer, %bb1269.outer2.backedge + br label %bb1269.outer21 + +bb1269.outer21: ; preds = %bb1269.outer2, %bb1269.outer21.backedge + br label %bb1269.outer38 + +bb1269.outer38: ; preds = %bb1269.outer21, %bb1269.outer38.backedge + br label %bb1269.outer54 + +bb1269.outer54: ; preds = %bb1269.outer38 + br label %bb1269.outer69 + +bb1269.outer69: ; preds = %bb1269.outer54, %cond_true + br label %bb1269 + +bb1269: ; preds = %bb1269.outer69 + br bool false, label %cond_next1281, label %bb1294 + +cond_next1281: ; preds = %bb1269 + br bool false, label %cond_true1298, label %bb1294 + +bb1294: ; preds = %cond_next1281, %bb1269 + br bool false, label %cond_true1331, label %cond_next1313 + +cond_true1298: ; preds = %cond_next1281 + br bool false, label %cond_false, label %cond_true + +cond_next1313: ; preds = %bb1294 + br bool false, label %cond_true1331, label %cond_next1355 + +cond_true1331: ; preds = %cond_next1313, %bb1294 + br bool false, label %cond_false1346, label %cond_true1342 + +cond_true1342: ; preds = %cond_true1331 + br label %cond_next1350 + +cond_false1346: ; preds = %cond_true1331 + br label %cond_next1350 + +cond_next1350: ; preds = %cond_false1346, %cond_true1342 + br label %bb.i + +bb.i: ; preds = %bb.i, %cond_next1350 + br bool false, label %_ZN2kc18impl_abstract_list8freelistEv.exit, label %bb.i + +_ZN2kc18impl_abstract_list8freelistEv.exit: ; preds = %bb.i + br label %cond_next1355 + +cond_next1355: ; preds = %_ZN2kc18impl_abstract_list8freelistEv.exit, %cond_next1313 + br bool false, label %cond_next1363, label %bb1388 + +cond_next1363: ; preds = %cond_next1355 + br bool false, label %UnifiedReturnBlock, label %cond_true1366 + +cond_true1366: ; preds = %cond_next1363 + br label %UnifiedReturnBlock + +bb1388: ; preds = %cond_next1355 + br bool false, label %UnifiedReturnBlock, label %bb1414.preheader + +bb1414.preheader: ; preds = %bb1388 + br label %bb1414 + +bb1414: ; preds = %cond_true1426, %bb1414.preheader + br bool false, label %cond_true1426, label %bb1429 + +cond_true1426: ; preds = %bb1414 + br label %bb1414 + +bb1429: ; preds = %bb1414 + br bool false, label %cond_true1431, label %UnifiedReturnBlock + +cond_true1431: ; preds = %bb1429 + br bool false, label %UnifiedReturnBlock, label %cond_true1434 + +cond_true1434: ; preds = %cond_true1431 + br label %UnifiedReturnBlock + +UnifiedUnreachableBlock: ; preds = %cond_false1153, %cond_false1040, %cond_false927, %cond_false814, %cond_false701, %cond_false588, %cond_false475, %cond_false363, %cond_false250 + unreachable + +UnifiedReturnBlock: ; preds = %cond_true1434, %cond_true1431, %bb1429, %bb1388, %cond_true1366, %cond_next1363, %cond_true1222, %cond_false1219, %cond_false1204, %cond_false1189, %cond_false1174, %cond_false1159, %cond_false1138, %cond_false1025, %cond_false912, %cond_false799, %cond_false686, %cond_false573, %cond_false460, %cond_false348, %cond_false235, %cond_true120, %cond_true117, %cond_true57, %cond_true55 + ret void +} diff --git a/test/Transforms/CondProp/2006-11-01-PhiNodeCrash.ll b/test/Transforms/CondProp/2006-11-01-PhiNodeCrash.ll new file mode 100644 index 0000000..5221319 --- /dev/null +++ b/test/Transforms/CondProp/2006-11-01-PhiNodeCrash.ll @@ -0,0 +1,1087 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -condprop -disable-output +; PR979 +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +deplibs = [ "c", "crtend" ] + %struct.IO_APIC_reg_00 = type { uint } + %struct.Qdisc = type { int (%struct.sk_buff*, %struct.Qdisc*)*, %struct.sk_buff* (%struct.Qdisc*)*, uint, %struct.Qdisc_ops*, %struct.Qdisc*, uint, %struct.bluez_skb_cb, %struct.sk_buff_head, %struct.net_device*, %struct.tc_stats, int (%struct.sk_buff*, %struct.Qdisc*)*, %struct.Qdisc*, [1 x sbyte] } + %struct.Qdisc_class_ops = type { int (%struct.Qdisc*, uint, %struct.Qdisc*, %struct.Qdisc**)*, %struct.Qdisc* (%struct.Qdisc*, uint)*, uint (%struct.Qdisc*, uint)*, void (%struct.Qdisc*, uint)*, int (%struct.Qdisc*, uint, uint, %struct._agp_version**, uint*)*, int (%struct.Qdisc*, uint)*, void (%struct.Qdisc*, %struct.qdisc_walker*)*, %struct.tcf_proto** (%struct.Qdisc*, uint)*, uint (%struct.Qdisc*, uint, uint)*, void (%struct.Qdisc*, uint)*, int (%struct.Qdisc*, uint, %struct.sk_buff*, %struct.tcmsg*)* } + %struct.Qdisc_ops = type { %struct.Qdisc_ops*, %struct.Qdisc_class_ops*, [16 x sbyte], int, int (%struct.sk_buff*, %struct.Qdisc*)*, %struct.sk_buff* (%struct.Qdisc*)*, int (%struct.sk_buff*, %struct.Qdisc*)*, uint (%struct.Qdisc*)*, int (%struct.Qdisc*, %struct._agp_version*)*, void (%struct.Qdisc*)*, void (%struct.Qdisc*)*, int (%struct.Qdisc*, %struct._agp_version*)*, int (%struct.Qdisc*, %struct.sk_buff*)* } + %struct.ViceFid = type { uint, uint, uint } + %struct.__wait_queue = type { uint, %struct.task_struct*, %struct.list_head } + %struct.__wait_queue_head = type { %struct.IO_APIC_reg_00, %struct.list_head } + %struct._agp_version = type { ushort, ushort } + %struct._drm_i810_overlay_t = type { uint, uint } + %struct.address_space = type { %struct.list_head, %struct.list_head, %struct.list_head, uint, %struct.address_space_operations*, %struct.inode*, %struct.vm_area_struct*, %struct.vm_area_struct*, %struct.IO_APIC_reg_00, int } + %struct.address_space_operations = type { int (%struct.page*)*, int (%struct.file*, %struct.page*)*, int (%struct.page*)*, int (%struct.file*, %struct.page*, uint, uint)*, int (%struct.file*, %struct.page*, uint, uint)*, int (%struct.address_space*, int)*, int (%struct.page*, uint)*, int (%struct.page*, int)*, int (int, %struct.inode*, %struct.kiobuf*, uint, int)*, int (int, %struct.file*, %struct.kiobuf*, uint, int)*, void (%struct.page*)* } + %struct.audio_buf_info = type { int, int, int, int } + %struct.autofs_packet_hdr = type { int, int } + %struct.block_device = type { %struct.list_head, %struct.bluez_skb_cb, %struct.inode*, ushort, int, %struct.block_device_operations*, %struct.semaphore, %struct.list_head } + %struct.block_device_operations = type { int (%struct.inode*, %struct.file*)*, int (%struct.inode*, %struct.file*)*, int (%struct.inode*, %struct.file*, uint, uint)*, int (ushort)*, int (ushort)*, %struct.module* } + %struct.bluez_skb_cb = type { int } + %struct.buffer_head = type { %struct.buffer_head*, uint, ushort, ushort, ushort, %struct.bluez_skb_cb, ushort, uint, uint, %struct.buffer_head*, %struct.buffer_head*, %struct.buffer_head*, %struct.buffer_head*, %struct.buffer_head**, sbyte*, %struct.page*, void (%struct.buffer_head*, int)*, sbyte*, uint, %struct.__wait_queue_head, %struct.list_head } + %struct.char_device = type { %struct.list_head, %struct.bluez_skb_cb, ushort, %struct.bluez_skb_cb, %struct.semaphore } + %struct.completion = type { uint, %struct.__wait_queue_head } + %struct.cramfs_info = type { uint, uint, uint, uint } + %struct.dentry = type { %struct.bluez_skb_cb, uint, %struct.inode*, %struct.dentry*, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, int, %struct.qstr, uint, %struct.dentry_operations*, %struct.super_block*, uint, sbyte*, [16 x ubyte] } + %struct.dentry_operations = type { int (%struct.dentry*, int)*, int (%struct.dentry*, %struct.qstr*)*, int (%struct.dentry*, %struct.qstr*, %struct.qstr*)*, int (%struct.dentry*)*, void (%struct.dentry*)*, void (%struct.dentry*, %struct.inode*)* } + %struct.dev_mc_list = type { %struct.dev_mc_list*, [8 x ubyte], ubyte, int, int } + %struct.dnotify_struct = type { %struct.dnotify_struct*, uint, int, %struct.file*, %struct.files_struct* } + %struct.dquot = type { %struct.list_head, %struct.list_head, %struct.list_head, %struct.__wait_queue_head, %struct.__wait_queue_head, int, int, %struct.super_block*, uint, ushort, long, short, short, uint, %struct.mem_dqblk } + %struct.dquot_operations = type { void (%struct.inode*, int)*, void (%struct.inode*)*, int (%struct.inode*, ulong, int)*, int (%struct.inode*, uint)*, void (%struct.inode*, ulong)*, void (%struct.inode*, uint)*, int (%struct.inode*, %struct.iattr*)*, int (%struct.dquot*)* } + %struct.drm_clip_rect = type { ushort, ushort, ushort, ushort } + %struct.drm_ctx_priv_map = type { uint, sbyte* } + %struct.drm_mga_indices = type { int, uint, uint, int } + %struct.dst_entry = type { %struct.dst_entry*, %struct.bluez_skb_cb, int, %struct.net_device*, int, int, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, int, %struct.neighbour*, %struct.hh_cache*, int (%struct.sk_buff*)*, int (%struct.sk_buff*)*, %struct.dst_ops*, [0 x sbyte] } + %struct.dst_ops = type { ushort, ushort, uint, int ()*, %struct.dst_entry* (%struct.dst_entry*, uint)*, %struct.dst_entry* (%struct.dst_entry*, %struct.sk_buff*)*, void (%struct.dst_entry*)*, %struct.dst_entry* (%struct.dst_entry*)*, void (%struct.sk_buff*)*, int, %struct.bluez_skb_cb, %struct.kmem_cache_s* } + %struct.e820entry = type { ulong, ulong, uint } + %struct.exec_domain = type { sbyte*, void (int, %struct.pt_regs*)*, ubyte, ubyte, uint*, uint*, %struct.map_segment*, %struct.map_segment*, %struct.map_segment*, %struct.map_segment*, %struct.module*, %struct.exec_domain* } + %struct.ext2_inode_info = type { [15 x uint], uint, uint, ubyte, ubyte, uint, uint, uint, uint, uint, uint, uint, uint, uint, int } + %struct.ext3_inode_info = type { [15 x uint], uint, uint, uint, uint, uint, uint, uint, uint, uint, %struct.list_head, long, %struct.rw_semaphore } + %struct.fasync_struct = type { int, int, %struct.fasync_struct*, %struct.file* } + %struct.file = type { %struct.list_head, %struct.dentry*, %struct.vfsmount*, %struct.file_operations*, %struct.bluez_skb_cb, uint, ushort, long, uint, uint, uint, uint, uint, %struct.drm_mga_indices, uint, uint, int, uint, sbyte*, %struct.kiobuf*, int } + %struct.file_lock = type { %struct.file_lock*, %struct.list_head, %struct.list_head, %struct.files_struct*, uint, %struct.__wait_queue_head, %struct.file*, ubyte, ubyte, long, long, void (%struct.file_lock*)*, void (%struct.file_lock*)*, void (%struct.file_lock*)*, %struct.fasync_struct*, uint, { %struct.nfs_lock_info } } + %struct.file_operations = type { %struct.module*, long (%struct.file*, long, int)*, int (%struct.file*, sbyte*, uint, long*)*, int (%struct.file*, sbyte*, uint, long*)*, int (%struct.file*, sbyte*, int (sbyte*, sbyte*, int, long, uint, uint)*)*, uint (%struct.file*, %struct.poll_table_struct*)*, int (%struct.inode*, %struct.file*, uint, uint)*, int (%struct.file*, %struct.vm_area_struct*)*, int (%struct.inode*, %struct.file*)*, int (%struct.file*)*, int (%struct.inode*, %struct.file*)*, int (%struct.file*, %struct.dentry*, int)*, int (int, %struct.file*, int)*, int (%struct.file*, int, %struct.file_lock*)*, int (%struct.file*, %struct.iovec*, uint, long*)*, int (%struct.file*, %struct.iovec*, uint, long*)*, int (%struct.file*, %struct.page*, int, uint, long*, int)*, uint (%struct.file*, uint, uint, uint, uint)* } + %struct.file_system_type = type { sbyte*, int, %struct.super_block* (%struct.super_block*, sbyte*, int)*, %struct.module*, %struct.file_system_type*, %struct.list_head } + %struct.files_struct = type { %struct.bluez_skb_cb, %typedef.rwlock_t, int, int, int, %struct.file**, %typedef.__kernel_fd_set*, %typedef.__kernel_fd_set*, %typedef.__kernel_fd_set, %typedef.__kernel_fd_set, [32 x %struct.file*] } + %struct.fs_disk_quota = type { sbyte, sbyte, ushort, uint, ulong, ulong, ulong, ulong, ulong, ulong, int, int, ushort, ushort, int, ulong, ulong, ulong, int, ushort, short, [8 x sbyte] } + %struct.fs_quota_stat = type { sbyte, ushort, sbyte, %struct.e820entry, %struct.e820entry, uint, int, int, int, ushort, ushort } + %struct.fs_struct = type { %struct.bluez_skb_cb, %typedef.rwlock_t, int, %struct.dentry*, %struct.dentry*, %struct.dentry*, %struct.vfsmount*, %struct.vfsmount*, %struct.vfsmount* } + %struct.hh_cache = type { %struct.hh_cache*, %struct.bluez_skb_cb, ushort, int, int (%struct.sk_buff*)*, %typedef.rwlock_t, [32 x uint] } + %struct.i387_fxsave_struct = type { ushort, ushort, ushort, ushort, int, int, int, int, int, int, [32 x int], [32 x int], [56 x int] } + %struct.iattr = type { uint, ushort, uint, uint, long, int, int, int, uint } + %struct.if_dqblk = type { ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, uint } + %struct.if_dqinfo = type { ulong, ulong, uint, uint } + %struct.ifmap = type { uint, uint, ushort, ubyte, ubyte, ubyte } + %struct.ifreq = type { { [16 x sbyte] }, %typedef.dvd_authinfo } + %struct.inode = type { %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, uint, %struct.bluez_skb_cb, ushort, ushort, ushort, uint, uint, ushort, long, int, int, int, uint, uint, uint, uint, ushort, %struct.semaphore, %struct.rw_semaphore, %struct.semaphore, %struct.inode_operations*, %struct.file_operations*, %struct.super_block*, %struct.__wait_queue_head, %struct.file_lock*, %struct.address_space*, %struct.address_space, [2 x %struct.dquot*], %struct.list_head, %struct.pipe_inode_info*, %struct.block_device*, %struct.char_device*, uint, %struct.dnotify_struct*, uint, uint, ubyte, %struct.bluez_skb_cb, uint, uint, { %struct.ext2_inode_info, %struct.ext3_inode_info, %struct.msdos_inode_info, %struct.iso_inode_info, %struct.nfs_inode_info, %struct._drm_i810_overlay_t, %struct.shmem_inode_info, %struct.proc_inode_info, %struct.socket, %struct.usbdev_inode_info, sbyte* } } + %struct.inode_operations = type { int (%struct.inode*, %struct.dentry*, int)*, %struct.dentry* (%struct.inode*, %struct.dentry*)*, int (%struct.dentry*, %struct.inode*, %struct.dentry*)*, int (%struct.inode*, %struct.dentry*)*, int (%struct.inode*, %struct.dentry*, sbyte*)*, int (%struct.inode*, %struct.dentry*, int)*, int (%struct.inode*, %struct.dentry*)*, int (%struct.inode*, %struct.dentry*, int, int)*, int (%struct.inode*, %struct.dentry*, %struct.inode*, %struct.dentry*)*, int (%struct.dentry*, sbyte*, int)*, int (%struct.dentry*, %struct.nameidata*)*, void (%struct.inode*)*, int (%struct.inode*, int)*, int (%struct.dentry*)*, int (%struct.dentry*, %struct.iattr*)*, int (%struct.dentry*, %struct.iattr*)*, int (%struct.dentry*, sbyte*, sbyte*, uint, int)*, int (%struct.dentry*, sbyte*, sbyte*, uint)*, int (%struct.dentry*, sbyte*, uint)*, int (%struct.dentry*, sbyte*)* } + %struct.iovec = type { sbyte*, uint } + %struct.ip_options = type { uint, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, [0 x ubyte] } + %struct.isapnp_dma = type { ubyte, ubyte, %struct.isapnp_resources*, %struct.isapnp_dma* } + %struct.isapnp_irq = type { ushort, ubyte, ubyte, %struct.isapnp_resources*, %struct.isapnp_irq* } + %struct.isapnp_mem = type { uint, uint, uint, uint, ubyte, ubyte, %struct.isapnp_resources*, %struct.isapnp_mem* } + %struct.isapnp_mem32 = type { [17 x ubyte], %struct.isapnp_resources*, %struct.isapnp_mem32* } + %struct.isapnp_port = type { ushort, ushort, ubyte, ubyte, ubyte, ubyte, %struct.isapnp_resources*, %struct.isapnp_port* } + %struct.isapnp_resources = type { ushort, ushort, %struct.isapnp_port*, %struct.isapnp_irq*, %struct.isapnp_dma*, %struct.isapnp_mem*, %struct.isapnp_mem32*, %struct.pci_dev*, %struct.isapnp_resources*, %struct.isapnp_resources* } + %struct.iso_inode_info = type { uint, ubyte, [3 x ubyte], uint, int } + %struct.iw_handler_def = type opaque + %struct.iw_statistics = type opaque + %struct.k_sigaction = type { %struct.sigaction } + %struct.kern_ipc_perm = type { int, uint, uint, uint, uint, ushort, uint } + %struct.kiobuf = type { int, int, int, int, uint, %struct.page**, %struct.buffer_head**, uint*, %struct.bluez_skb_cb, int, void (%struct.kiobuf*)*, %struct.__wait_queue_head } + %struct.kmem_cache_s = type { %struct.list_head, %struct.list_head, %struct.list_head, uint, uint, uint, %struct.IO_APIC_reg_00, uint, uint, uint, uint, uint, uint, %struct.kmem_cache_s*, uint, uint, void (sbyte*, %struct.kmem_cache_s*, uint)*, void (sbyte*, %struct.kmem_cache_s*, uint)*, uint, [20 x sbyte], %struct.list_head, [32 x %struct._drm_i810_overlay_t*], uint } + %struct.linux_binfmt = type { %struct.linux_binfmt*, %struct.module*, int (%struct.linux_binprm*, %struct.pt_regs*)*, int (%struct.file*)*, int (int, %struct.pt_regs*, %struct.file*)*, uint, int (%struct.linux_binprm*, sbyte*)* } + %struct.linux_binprm = type { [128 x sbyte], [32 x %struct.page*], uint, int, %struct.file*, int, int, uint, uint, uint, int, int, sbyte*, uint, uint } + %struct.list_head = type { %struct.list_head*, %struct.list_head* } + %struct.llva_sigcontext = type { %typedef.llva_icontext_t, %typedef.llva_fp_state_t, uint, uint, uint, uint, [1 x uint], sbyte* } + %struct.map_segment = type opaque + %struct.mem_dqblk = type { uint, uint, ulong, uint, uint, uint, int, int } + %struct.mem_dqinfo = type { %struct.quota_format_type*, int, uint, uint, { %struct.ViceFid } } + %struct.mm_struct = type { %struct.vm_area_struct*, %struct.rb_root_s, %struct.vm_area_struct*, %struct.IO_APIC_reg_00*, %struct.bluez_skb_cb, %struct.bluez_skb_cb, int, %struct.rw_semaphore, %struct.IO_APIC_reg_00, %struct.list_head, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, %struct.iovec } + %struct.module = type { uint, %struct.module*, sbyte*, uint, %struct.bluez_skb_cb, uint, uint, uint, %struct.drm_ctx_priv_map*, %struct.module_ref*, %struct.module_ref*, int ()*, void ()*, %struct._drm_i810_overlay_t*, %struct._drm_i810_overlay_t*, %struct.module_persist*, %struct.module_persist*, int ()*, int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte* } + %struct.module_persist = type opaque + %struct.module_ref = type { %struct.module*, %struct.module*, %struct.module_ref* } + %struct.msdos_inode_info = type { uint, int, int, int, int, int, %struct.inode*, %struct.list_head } + %struct.msghdr = type { sbyte*, int, %struct.iovec*, uint, sbyte*, uint, uint } + %struct.msq_setbuf = type { uint, uint, uint, ushort } + %struct.nameidata = type { %struct.dentry*, %struct.vfsmount*, %struct.qstr, uint, int } + %struct.namespace = type { %struct.bluez_skb_cb, %struct.vfsmount*, %struct.list_head, %struct.rw_semaphore } + %struct.neigh_ops = type { int, void (%struct.neighbour*)*, void (%struct.neighbour*, %struct.sk_buff*)*, void (%struct.neighbour*, %struct.sk_buff*)*, int (%struct.sk_buff*)*, int (%struct.sk_buff*)*, int (%struct.sk_buff*)*, int (%struct.sk_buff*)* } + %struct.neigh_parms = type { %struct.neigh_parms*, int (%struct.neighbour*)*, %struct.neigh_table*, int, sbyte*, sbyte*, int, int, int, int, int, int, int, int, int, int, int, int, int } + %struct.neigh_table = type { %struct.neigh_table*, int, int, int, uint (sbyte*, %struct.net_device*)*, int (%struct.neighbour*)*, int (%struct.pneigh_entry*)*, void (%struct.pneigh_entry*)*, void (%struct.sk_buff*)*, sbyte*, %struct.neigh_parms, int, int, int, int, uint, %struct.timer_list, %struct.timer_list, %struct.sk_buff_head, int, %typedef.rwlock_t, uint, %struct.neigh_parms*, %struct.kmem_cache_s*, %struct.tasklet_struct, %struct.cramfs_info, [32 x %struct.neighbour*], [16 x %struct.pneigh_entry*] } + %struct.neighbour = type { %struct.neighbour*, %struct.neigh_table*, %struct.neigh_parms*, %struct.net_device*, uint, uint, uint, ubyte, ubyte, ubyte, ubyte, %struct.bluez_skb_cb, %typedef.rwlock_t, [8 x ubyte], %struct.hh_cache*, %struct.bluez_skb_cb, int (%struct.sk_buff*)*, %struct.sk_buff_head, %struct.timer_list, %struct.neigh_ops*, [0 x ubyte] } + %struct.net_bridge_port = type opaque + %struct.net_device = type { [16 x sbyte], uint, uint, uint, uint, uint, uint, ubyte, ubyte, uint, %struct.net_device*, int (%struct.net_device*)*, %struct.net_device*, int, int, %struct.net_device_stats* (%struct.net_device*)*, %struct.iw_statistics* (%struct.net_device*)*, %struct.iw_handler_def*, uint, uint, ushort, ushort, ushort, ushort, uint, ushort, ushort, sbyte*, %struct.net_device*, [8 x ubyte], [8 x ubyte], ubyte, %struct.dev_mc_list*, int, int, int, int, %struct.timer_list, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct.list_head, int, int, %struct.Qdisc*, %struct.Qdisc*, %struct.Qdisc*, %struct.Qdisc*, uint, %struct.IO_APIC_reg_00, int, %struct.IO_APIC_reg_00, %struct.bluez_skb_cb, int, int, void (%struct.net_device*)*, void (%struct.net_device*)*, int (%struct.net_device*)*, int (%struct.net_device*)*, int (%struct.sk_buff*, %struct.net_device*)*, int (%struct.net_device*, int*)*, int (%struct.sk_buff*, %struct.net_device*, ushort, sbyte*, sbyte*, uint)*, int (%struct.sk_buff*)*, void (%struct.net_device*)*, int (%struct.net_device*, sbyte*)*, int (%struct.net_device*, %struct.ifreq*, int)*, int (%struct.net_device*, %struct.ifmap*)*, int (%struct.neighbour*, %struct.hh_cache*)*, void (%struct.hh_cache*, %struct.net_device*, ubyte*)*, int (%struct.net_device*, int)*, void (%struct.net_device*)*, void (%struct.net_device*, %struct.vlan_group*)*, void (%struct.net_device*, ushort)*, void (%struct.net_device*, ushort)*, int (%struct.sk_buff*, ubyte*)*, int (%struct.net_device*, %struct.neigh_parms*)*, int (%struct.net_device*, %struct.dst_entry*)*, %struct.module*, %struct.net_bridge_port* } + %struct.net_device_stats = type { uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint } + %struct.nf_conntrack = type { %struct.bluez_skb_cb, void (%struct.nf_conntrack*)* } + %struct.nf_ct_info = type { %struct.nf_conntrack* } + %struct.nfs_fh = type { ushort, [64 x ubyte] } + %struct.nfs_inode_info = type { ulong, %struct.nfs_fh, ushort, uint, ulong, ulong, ulong, uint, uint, uint, [2 x uint], %struct.list_head, %struct.list_head, %struct.list_head, %struct.list_head, uint, uint, uint, uint, %struct.rpc_cred* } + %struct.nfs_lock_info = type { uint, uint, %struct.nlm_host* } + %struct.nlm_host = type opaque + %struct.open_request = type { %struct.open_request*, uint, uint, ushort, ushort, ubyte, ubyte, ushort, uint, uint, uint, uint, %struct.or_calltable*, %struct.sock*, { %struct.tcp_v4_open_req } } + %struct.or_calltable = type { int, int (%struct.sock*, %struct.open_request*, %struct.dst_entry*)*, void (%struct.sk_buff*, %struct.open_request*)*, void (%struct.open_request*)*, void (%struct.sk_buff*)* } + %struct.page = type { %struct.list_head, %struct.address_space*, uint, %struct.page*, %struct.bluez_skb_cb, uint, %struct.list_head, %struct.page**, %struct.buffer_head* } + %struct.pci_bus = type { %struct.list_head, %struct.pci_bus*, %struct.list_head, %struct.list_head, %struct.pci_dev*, [4 x %struct.resource*], %struct.pci_ops*, sbyte*, %struct.proc_dir_entry*, ubyte, ubyte, ubyte, ubyte, [48 x sbyte], ushort, ushort, uint, ubyte, ubyte, ubyte, ubyte } + %struct.pci_dev = type { %struct.list_head, %struct.list_head, %struct.pci_bus*, %struct.pci_bus*, sbyte*, %struct.proc_dir_entry*, uint, ushort, ushort, ushort, ushort, uint, ubyte, ubyte, %struct.pci_driver*, sbyte*, ulong, uint, [4 x ushort], [4 x ushort], uint, [12 x %struct.resource], [2 x %struct.resource], [2 x %struct.resource], [90 x sbyte], [8 x sbyte], int, int, ushort, ushort, int (%struct.pci_dev*)*, int (%struct.pci_dev*)*, int (%struct.pci_dev*)* } + %struct.pci_device_id = type { uint, uint, uint, uint, uint, uint, uint } + %struct.pci_driver = type { %struct.list_head, sbyte*, %struct.pci_device_id*, int (%struct.pci_dev*, %struct.pci_device_id*)*, void (%struct.pci_dev*)*, int (%struct.pci_dev*, uint)*, int (%struct.pci_dev*, uint)*, int (%struct.pci_dev*)*, int (%struct.pci_dev*, uint, int)* } + %struct.pci_ops = type { int (%struct.pci_dev*, int, ubyte*)*, int (%struct.pci_dev*, int, ushort*)*, int (%struct.pci_dev*, int, uint*)*, int (%struct.pci_dev*, int, ubyte)*, int (%struct.pci_dev*, int, ushort)*, int (%struct.pci_dev*, int, uint)* } + %struct.pipe_inode_info = type { %struct.__wait_queue_head, sbyte*, uint, uint, uint, uint, uint, uint, uint, uint } + %struct.pneigh_entry = type { %struct.pneigh_entry*, %struct.net_device*, [0 x ubyte] } + %struct.poll_table_entry = type { %struct.file*, %struct.__wait_queue, %struct.__wait_queue_head* } + %struct.poll_table_page = type { %struct.poll_table_page*, %struct.poll_table_entry*, [0 x %struct.poll_table_entry] } + %struct.poll_table_struct = type { int, %struct.poll_table_page* } + %struct.proc_dir_entry = type { ushort, ushort, sbyte*, ushort, ushort, uint, uint, uint, %struct.inode_operations*, %struct.file_operations*, int (sbyte*, sbyte**, int, int)*, %struct.module*, %struct.proc_dir_entry*, %struct.proc_dir_entry*, %struct.proc_dir_entry*, sbyte*, int (sbyte*, sbyte**, int, int, int*, sbyte*)*, int (%struct.file*, sbyte*, uint, sbyte*)*, %struct.bluez_skb_cb, int, ushort } + %struct.proc_inode_info = type { %struct.task_struct*, int, { int (%struct.task_struct*, sbyte*)* }, %struct.file* } + %struct.proto = type { void (%struct.sock*, int)*, int (%struct.sock*, %struct.sockaddr*, int)*, int (%struct.sock*, int)*, %struct.sock* (%struct.sock*, int, int*)*, int (%struct.sock*, int, uint)*, int (%struct.sock*)*, int (%struct.sock*)*, void (%struct.sock*, int)*, int (%struct.sock*, int, int, sbyte*, int)*, int (%struct.sock*, int, int, sbyte*, int*)*, int (%struct.sock*, %struct.msghdr*, int)*, int (%struct.sock*, %struct.msghdr*, int, int, int, int*)*, int (%struct.sock*, %struct.sockaddr*, int)*, int (%struct.sock*, %struct.sk_buff*)*, void (%struct.sock*)*, void (%struct.sock*)*, int (%struct.sock*, ushort)*, [32 x sbyte], [32 x { int, [28 x ubyte] }] } + %struct.proto_ops = type { int, int (%struct.socket*)*, int (%struct.socket*, %struct.sockaddr*, int)*, int (%struct.socket*, %struct.sockaddr*, int, int)*, int (%struct.socket*, %struct.socket*)*, int (%struct.socket*, %struct.socket*, int)*, int (%struct.socket*, %struct.sockaddr*, int*, int)*, uint (%struct.file*, %struct.socket*, %struct.poll_table_struct*)*, int (%struct.socket*, uint, uint)*, int (%struct.socket*, int)*, int (%struct.socket*, int)*, int (%struct.socket*, int, int, sbyte*, int)*, int (%struct.socket*, int, int, sbyte*, int*)*, int (%struct.socket*, %struct.msghdr*, int, %struct.scm_cookie*)*, int (%struct.socket*, %struct.msghdr*, int, int, %struct.scm_cookie*)*, int (%struct.file*, %struct.socket*, %struct.vm_area_struct*)*, int (%struct.socket*, %struct.page*, int, uint, int)* } + %struct.pt_regs = type { int, int, int, int, int, int, int, int, int, int, int, int, int, int, int } + %struct.qdisc_walker = type { int, int, int, int (%struct.Qdisc*, uint, %struct.qdisc_walker*)* } + %struct.qstr = type { ubyte*, uint, uint } + %struct.quota_format_ops = type { int (%struct.super_block*, int)*, int (%struct.super_block*, int)*, int (%struct.super_block*, int)*, int (%struct.super_block*, int)*, int (%struct.dquot*)*, int (%struct.dquot*)* } + %struct.quota_format_type = type { int, %struct.quota_format_ops*, %struct.module*, %struct.quota_format_type* } + %struct.quota_info = type { uint, %struct.semaphore, %struct.semaphore, [2 x %struct.file*], [2 x %struct.mem_dqinfo], [2 x %struct.quota_format_ops*] } + %struct.quotactl_ops = type { int (%struct.super_block*, int, int, sbyte*)*, int (%struct.super_block*, int)*, int (%struct.super_block*, int)*, int (%struct.super_block*, int, %struct.if_dqinfo*)*, int (%struct.super_block*, int, %struct.if_dqinfo*)*, int (%struct.super_block*, int, uint, %struct.if_dqblk*)*, int (%struct.super_block*, int, uint, %struct.if_dqblk*)*, int (%struct.super_block*, %struct.fs_quota_stat*)*, int (%struct.super_block*, uint, int)*, int (%struct.super_block*, int, uint, %struct.fs_disk_quota*)*, int (%struct.super_block*, int, uint, %struct.fs_disk_quota*)* } + %struct.rb_node_s = type { %struct.rb_node_s*, int, %struct.rb_node_s*, %struct.rb_node_s* } + %struct.rb_root_s = type { %struct.rb_node_s* } + %struct.resource = type { sbyte*, uint, uint, uint, %struct.resource*, %struct.resource*, %struct.resource* } + %struct.revectored_struct = type { [8 x uint] } + %struct.rpc_auth = type { [8 x %struct.rpc_cred*], uint, uint, uint, uint, uint, %struct.rpc_authops* } + %struct.rpc_authops = type { uint, sbyte*, %struct.rpc_auth* (%struct.rpc_clnt*)*, void (%struct.rpc_auth*)*, %struct.rpc_cred* (int)* } + %struct.rpc_clnt = type { %struct.bluez_skb_cb, %struct.rpc_xprt*, %struct.rpc_procinfo*, uint, sbyte*, sbyte*, %struct.rpc_auth*, %struct.rpc_stat*, uint, uint, uint, %struct.rpc_rtt, %struct.msq_setbuf, %struct.rpc_wait_queue, int, [32 x sbyte] } + %struct.rpc_cred = type { %struct.rpc_cred*, %struct.rpc_auth*, %struct.rpc_credops*, uint, %struct.bluez_skb_cb, ushort, uint, uint } + %struct.rpc_credops = type { void (%struct.rpc_cred*)*, int (%struct.rpc_cred*, int)*, uint* (%struct.rpc_task*, uint*, int)*, int (%struct.rpc_task*)*, uint* (%struct.rpc_task*, uint*)* } + %struct.rpc_message = type { uint, sbyte*, sbyte*, %struct.rpc_cred* } + %struct.rpc_procinfo = type { sbyte*, int (sbyte*, uint*, sbyte*)*, int (sbyte*, uint*, sbyte*)*, uint, uint, uint } + %struct.rpc_program = type { sbyte*, uint, uint, %struct.rpc_version**, %struct.rpc_stat* } + %struct.rpc_rqst = type { %struct.rpc_xprt*, %struct.rpc_timeout, %struct.xdr_buf, %struct.xdr_buf, %struct.rpc_task*, uint, %struct.rpc_rqst*, int, int, %struct.list_head, %struct.xdr_buf, [2 x uint], uint, int, int, int } + %struct.rpc_rtt = type { int, [5 x int], [5 x int], %struct.bluez_skb_cb } + %struct.rpc_stat = type { %struct.rpc_program*, uint, uint, uint, uint, uint, uint, uint, uint, uint } + %struct.rpc_task = type { %struct.list_head, uint, %struct.list_head, %struct.rpc_clnt*, %struct.rpc_rqst*, int, %struct.rpc_wait_queue*, %struct.rpc_message, uint*, ubyte, ubyte, ubyte, void (%struct.rpc_task*)*, void (%struct.rpc_task*)*, void (%struct.rpc_task*)*, void (%struct.rpc_task*)*, void (%struct.rpc_task*)*, sbyte*, %struct.timer_list, %struct.__wait_queue_head, uint, ushort, ubyte, uint, ushort } + %struct.rpc_timeout = type { uint, uint, uint, uint, short, ubyte } + %struct.rpc_version = type { uint, uint, %struct.rpc_procinfo* } + %struct.rpc_wait_queue = type { %struct.list_head, sbyte* } + %struct.rpc_xprt = type { %struct.socket*, %struct.sock*, %struct.rpc_timeout, %struct.sockaddr_in, int, uint, uint, uint, uint, %struct.rpc_wait_queue, %struct.rpc_wait_queue, %struct.rpc_wait_queue, %struct.rpc_wait_queue, %struct.rpc_rqst*, [16 x %struct.rpc_rqst], uint, ubyte, uint, uint, uint, uint, uint, uint, %struct.IO_APIC_reg_00, %struct.IO_APIC_reg_00, %struct.rpc_task*, %struct.list_head, void (%struct.sock*, int)*, void (%struct.sock*)*, void (%struct.sock*)*, %struct.__wait_queue_head } + %struct.rw_semaphore = type { int, %struct.IO_APIC_reg_00, %struct.list_head } + %struct.scm_cookie = type { %struct.ViceFid, %struct.scm_fp_list*, uint } + %struct.scm_fp_list = type { int, [255 x %struct.file*] } + %struct.sem_array = type { %struct.kern_ipc_perm, int, int, %struct.autofs_packet_hdr*, %struct.sem_queue*, %struct.sem_queue**, %struct.sem_undo*, uint } + %struct.sem_queue = type { %struct.sem_queue*, %struct.sem_queue**, %struct.task_struct*, %struct.sem_undo*, int, int, %struct.sem_array*, int, %struct.sembuf*, int, int } + %struct.sem_undo = type { %struct.sem_undo*, %struct.sem_undo*, int, short* } + %struct.semaphore = type { %struct.bluez_skb_cb, int, %struct.__wait_queue_head } + %struct.sembuf = type { ushort, short, short } + %struct.seq_file = type { sbyte*, uint, uint, uint, long, %struct.semaphore, %struct.seq_operations*, sbyte* } + %struct.seq_operations = type { sbyte* (%struct.seq_file*, long*)*, void (%struct.seq_file*, sbyte*)*, sbyte* (%struct.seq_file*, sbyte*, long*)*, int (%struct.seq_file*, sbyte*)* } + %struct.shmem_inode_info = type { %struct.IO_APIC_reg_00, uint, [16 x %struct.IO_APIC_reg_00], sbyte**, uint, uint, %struct.list_head, %struct.inode* } + %struct.sigaction = type { void (int)*, uint, void ()*, %typedef.sigset_t } + %struct.siginfo = type { int, int, int, { [29 x int] } } + %struct.signal_struct = type { %struct.bluez_skb_cb, [64 x %struct.k_sigaction], %struct.IO_APIC_reg_00 } + %struct.sigpending = type { %struct.sigqueue*, %struct.sigqueue**, %typedef.sigset_t } + %struct.sigqueue = type { %struct.sigqueue*, %struct.siginfo } + %struct.sk_buff = type { %struct.sk_buff*, %struct.sk_buff*, %struct.sk_buff_head*, %struct.sock*, %struct.autofs_packet_hdr, %struct.net_device*, %struct.net_device*, { ubyte* }, { ubyte* }, { ubyte* }, %struct.dst_entry*, [48 x sbyte], uint, uint, uint, ubyte, ubyte, ubyte, ubyte, uint, %struct.bluez_skb_cb, ushort, ushort, uint, ubyte*, ubyte*, ubyte*, ubyte*, void (%struct.sk_buff*)*, uint, uint, %struct.nf_ct_info*, uint } + %struct.sk_buff_head = type { %struct.sk_buff*, %struct.sk_buff*, uint, %struct.IO_APIC_reg_00 } + %struct.sock = type { uint, uint, ushort, ushort, int, %struct.sock*, %struct.sock**, %struct.sock*, %struct.sock**, ubyte, ubyte, ushort, ushort, ubyte, ubyte, %struct.bluez_skb_cb, %typedef.socket_lock_t, int, %struct.__wait_queue_head*, %struct.dst_entry*, %typedef.rwlock_t, %struct.bluez_skb_cb, %struct.sk_buff_head, %struct.bluez_skb_cb, %struct.sk_buff_head, %struct.bluez_skb_cb, int, int, uint, uint, int, %struct.sock*, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, ubyte, ubyte, ubyte, ubyte, int, int, uint, int, %struct.sock*, { %struct.sk_buff*, %struct.sk_buff* }, %typedef.rwlock_t, %struct.sk_buff_head, %struct.proto*, { %struct.tcp_opt }, int, int, ushort, ushort, uint, ushort, ubyte, ubyte, %struct.ViceFid, int, int, int, { %struct.unix_opt }, %struct.timer_list, %struct.autofs_packet_hdr, %struct.socket*, sbyte*, void (%struct.sock*)*, void (%struct.sock*, int)*, void (%struct.sock*)*, void (%struct.sock*)*, int (%struct.sock*, %struct.sk_buff*)*, void (%struct.sock*)* } + %struct.sockaddr = type { ushort, [14 x sbyte] } + %struct.sockaddr_in = type { ushort, ushort, %struct.IO_APIC_reg_00, [8 x ubyte] } + %struct.sockaddr_un = type { ushort, [108 x sbyte] } + %struct.socket = type { uint, uint, %struct.proto_ops*, %struct.inode*, %struct.fasync_struct*, %struct.file*, %struct.sock*, %struct.__wait_queue_head, short, ubyte } + %struct.statfs = type { int, int, int, int, int, int, int, %typedef.__kernel_fsid_t, int, [6 x int] } + %struct.super_block = type { %struct.list_head, ushort, uint, ubyte, ubyte, ulong, %struct.file_system_type*, %struct.super_operations*, %struct.dquot_operations*, %struct.quotactl_ops*, uint, uint, %struct.dentry*, %struct.rw_semaphore, %struct.semaphore, int, %struct.bluez_skb_cb, %struct.list_head, %struct.list_head, %struct.list_head, %struct.block_device*, %struct.list_head, %struct.quota_info, { [115 x uint] }, %struct.semaphore, %struct.semaphore } + %struct.super_operations = type { %struct.inode* (%struct.super_block*)*, void (%struct.inode*)*, void (%struct.inode*)*, void (%struct.inode*, sbyte*)*, void (%struct.inode*)*, void (%struct.inode*, int)*, void (%struct.inode*)*, void (%struct.inode*)*, void (%struct.super_block*)*, void (%struct.super_block*)*, int (%struct.super_block*)*, void (%struct.super_block*)*, void (%struct.super_block*)*, int (%struct.super_block*, %struct.statfs*)*, int (%struct.super_block*, int*, sbyte*)*, void (%struct.inode*)*, void (%struct.super_block*)*, %struct.dentry* (%struct.super_block*, uint*, int, int, int)*, int (%struct.dentry*, uint*, int*, int)*, int (%struct.seq_file*, %struct.vfsmount*)* } + %struct.task_struct = type { int, uint, int, %struct.IO_APIC_reg_00, %struct.exec_domain*, int, uint, int, int, int, uint, %struct.mm_struct*, int, uint, uint, %struct.list_head, uint, %struct.task_struct*, %struct.task_struct*, %struct.mm_struct*, %struct.list_head, uint, uint, %struct.linux_binfmt*, int, int, int, uint, int, int, int, int, int, int, int, %struct.task_struct*, %struct.task_struct*, %struct.task_struct*, %struct.task_struct*, %struct.task_struct*, %struct.list_head, %struct.task_struct*, %struct.task_struct**, %struct.__wait_queue_head, %struct.completion*, uint, uint, uint, uint, uint, uint, uint, %struct.timer_list, %struct.audio_buf_info, uint, [32 x int], [32 x int], uint, uint, uint, uint, uint, uint, int, uint, uint, uint, uint, uint, uint, uint, uint, int, [32 x uint], uint, uint, uint, int, %struct.user_struct*, [11 x %struct._drm_i810_overlay_t], ushort, [16 x sbyte], int, int, %struct.tty_struct*, uint, %struct.sem_undo*, %struct.sem_queue*, %struct.thread_struct, %struct.fs_struct*, %struct.files_struct*, %struct.namespace*, %struct.IO_APIC_reg_00, %struct.signal_struct*, %typedef.sigset_t, %struct.sigpending, uint, uint, int (sbyte*)*, sbyte*, %typedef.sigset_t*, uint, uint, %struct.IO_APIC_reg_00, sbyte*, %struct.llva_sigcontext*, uint, %struct.task_struct*, uint, %typedef.llva_icontext_t, %typedef.llva_fp_state_t, uint*, int, sbyte* } + %struct.tasklet_struct = type { %struct.tasklet_struct*, uint, %struct.bluez_skb_cb, void (uint)*, uint } + %struct.tc_stats = type { ulong, uint, uint, uint, uint, uint, uint, uint, %struct.IO_APIC_reg_00* } + %struct.tcf_proto = type { %struct.tcf_proto*, sbyte*, int (%struct.sk_buff*, %struct.tcf_proto*, %struct._drm_i810_overlay_t*)*, uint, uint, uint, %struct.Qdisc*, sbyte*, %struct.tcf_proto_ops* } + %struct.tcf_proto_ops = type { %struct.tcf_proto_ops*, [16 x sbyte], int (%struct.sk_buff*, %struct.tcf_proto*, %struct._drm_i810_overlay_t*)*, int (%struct.tcf_proto*)*, void (%struct.tcf_proto*)*, uint (%struct.tcf_proto*, uint)*, void (%struct.tcf_proto*, uint)*, int (%struct.tcf_proto*, uint, uint, %struct._agp_version**, uint*)*, int (%struct.tcf_proto*, uint)*, void (%struct.tcf_proto*, %struct.tcf_walker*)*, int (%struct.tcf_proto*, uint, %struct.sk_buff*, %struct.tcmsg*)* } + %struct.tcf_walker = type { int, int, int, int (%struct.tcf_proto*, uint, %struct.tcf_walker*)* } + %struct.tcmsg = type { ubyte, ubyte, ushort, int, uint, uint, uint } + %struct.tcp_func = type { int (%struct.sk_buff*)*, void (%struct.sock*, %struct.tcphdr*, int, %struct.sk_buff*)*, int (%struct.sock*)*, int (%struct.sock*, %struct.sk_buff*)*, %struct.sock* (%struct.sock*, %struct.sk_buff*, %struct.open_request*, %struct.dst_entry*)*, int (%struct.sock*)*, ushort, int (%struct.sock*, int, int, sbyte*, int)*, int (%struct.sock*, int, int, sbyte*, int*)*, void (%struct.sock*, %struct.sockaddr*)*, int } + %struct.tcp_listen_opt = type { ubyte, int, int, int, uint, [512 x %struct.open_request*] } + %struct.tcp_opt = type { int, uint, uint, uint, uint, uint, uint, uint, { ubyte, ubyte, ubyte, ubyte, uint, uint, uint, ushort, ushort }, { %struct.sk_buff_head, %struct.task_struct*, %struct.iovec*, int, int }, uint, uint, uint, uint, ushort, ushort, ushort, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, ushort, ushort, uint, uint, uint, %struct.timer_list, %struct.timer_list, %struct.sk_buff_head, %struct.tcp_func*, %struct.sk_buff*, %struct.page*, uint, uint, uint, uint, uint, uint, sbyte, sbyte, sbyte, sbyte, ubyte, ubyte, ubyte, ubyte, uint, uint, uint, int, ushort, ubyte, ubyte, [1 x %struct._drm_i810_overlay_t], [4 x %struct._drm_i810_overlay_t], uint, uint, ubyte, ubyte, ushort, ubyte, ubyte, ushort, uint, uint, uint, uint, uint, uint, int, uint, ushort, ubyte, ubyte, uint, %typedef.rwlock_t, %struct.tcp_listen_opt*, %struct.open_request*, %struct.open_request*, int, uint, uint, int, int, uint, uint } + %struct.tcp_v4_open_req = type { uint, uint, %struct.ip_options* } + %struct.tcphdr = type { ushort, ushort, uint, uint, ushort, ushort, ushort, ushort } + %struct.termios = type { uint, uint, uint, uint, ubyte, [19 x ubyte] } + %struct.thread_struct = type { uint, uint, uint, uint, uint, [8 x uint], uint, uint, uint, %union.i387_union, %struct.vm86_struct*, uint, uint, uint, uint, int, [33 x uint] } + %struct.timer_list = type { %struct.list_head, uint, uint, void (uint)* } + %struct.tq_struct = type { %struct.list_head, uint, void (sbyte*)*, sbyte* } + %struct.tty_driver = type { int, sbyte*, sbyte*, int, short, short, short, short, short, %struct.termios, int, int*, %struct.proc_dir_entry*, %struct.tty_driver*, %struct.tty_struct**, %struct.termios**, %struct.termios**, sbyte*, int (%struct.tty_struct*, %struct.file*)*, void (%struct.tty_struct*, %struct.file*)*, int (%struct.tty_struct*, int, ubyte*, int)*, void (%struct.tty_struct*, ubyte)*, void (%struct.tty_struct*)*, int (%struct.tty_struct*)*, int (%struct.tty_struct*)*, int (%struct.tty_struct*, %struct.file*, uint, uint)*, void (%struct.tty_struct*, %struct.termios*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*, int)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*, int)*, void (%struct.tty_struct*, sbyte)*, int (sbyte*, sbyte**, int, int, int*, sbyte*)*, int (%struct.file*, sbyte*, uint, sbyte*)*, %struct.tty_driver*, %struct.tty_driver* } + %struct.tty_flip_buffer = type { %struct.tq_struct, %struct.semaphore, sbyte*, ubyte*, int, int, [1024 x ubyte], [1024 x sbyte], [4 x ubyte] } + %struct.tty_ldisc = type { int, sbyte*, int, int, int (%struct.tty_struct*)*, void (%struct.tty_struct*)*, void (%struct.tty_struct*)*, int (%struct.tty_struct*)*, int (%struct.tty_struct*, %struct.file*, ubyte*, uint)*, int (%struct.tty_struct*, %struct.file*, ubyte*, uint)*, int (%struct.tty_struct*, %struct.file*, uint, uint)*, void (%struct.tty_struct*, %struct.termios*)*, uint (%struct.tty_struct*, %struct.file*, %struct.poll_table_struct*)*, void (%struct.tty_struct*, ubyte*, sbyte*, int)*, int (%struct.tty_struct*)*, void (%struct.tty_struct*)* } + %struct.tty_struct = type { int, %struct.tty_driver, %struct.tty_ldisc, %struct.termios*, %struct.termios*, int, int, ushort, uint, int, %struct.drm_clip_rect, ubyte, ubyte, %struct.tty_struct*, %struct.fasync_struct*, %struct.tty_flip_buffer, int, int, %struct.__wait_queue_head, %struct.__wait_queue_head, %struct.tq_struct, sbyte*, sbyte*, %struct.list_head, uint, ubyte, ushort, uint, int, [8 x uint], sbyte*, int, int, int, [128 x uint], int, uint, uint, %struct.semaphore, %struct.semaphore, %struct.IO_APIC_reg_00, %struct.tq_struct } + %struct.unix_address = type { %struct.bluez_skb_cb, int, uint, [0 x %struct.sockaddr_un] } + %struct.unix_opt = type { %struct.unix_address*, %struct.dentry*, %struct.vfsmount*, %struct.semaphore, %struct.sock*, %struct.sock**, %struct.sock*, %struct.bluez_skb_cb, %typedef.rwlock_t, %struct.__wait_queue_head } + %struct.usb_bus = type opaque + %struct.usbdev_inode_info = type { %struct.list_head, %struct.list_head, { %struct.usb_bus* } } + %struct.user_struct = type { %struct.bluez_skb_cb, %struct.bluez_skb_cb, %struct.bluez_skb_cb, %struct.user_struct*, %struct.user_struct**, uint } + %struct.vfsmount = type { %struct.list_head, %struct.vfsmount*, %struct.dentry*, %struct.dentry*, %struct.super_block*, %struct.list_head, %struct.list_head, %struct.bluez_skb_cb, int, sbyte*, %struct.list_head } + %struct.vlan_group = type opaque + %struct.vm86_regs = type { int, int, int, int, int, int, int, int, int, int, int, int, int, ushort, ushort, int, int, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort } + %struct.vm86_struct = type { %struct.vm86_regs, uint, uint, uint, %struct.revectored_struct, %struct.revectored_struct } + %struct.vm_area_struct = type { %struct.mm_struct*, uint, uint, %struct.vm_area_struct*, %struct.IO_APIC_reg_00, uint, %struct.rb_node_s, %struct.vm_area_struct*, %struct.vm_area_struct**, %struct.vm_operations_struct*, uint, %struct.file*, uint, sbyte* } + %struct.vm_operations_struct = type { void (%struct.vm_area_struct*)*, void (%struct.vm_area_struct*)*, %struct.page* (%struct.vm_area_struct*, uint, int)* } + %struct.xdr_buf = type { [1 x %struct.iovec], [1 x %struct.iovec], %struct.page**, uint, uint, uint } + %typedef.__kernel_fd_set = type { [32 x int] } + %typedef.__kernel_fsid_t = type { [2 x int] } + %typedef.dvd_authinfo = type { [2 x ulong] } + %typedef.llva_fp_state_t = type { [7 x uint], [20 x uint] } + %typedef.llva_icontext_t = type { uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint*, uint } + %typedef.rwlock_t = type { %struct.IO_APIC_reg_00, %struct.IO_APIC_reg_00, uint } + %typedef.sigset_t = type { [2 x uint] } + %typedef.socket_lock_t = type { %struct.IO_APIC_reg_00, uint, %struct.__wait_queue_head } + %union.i387_union = type { %struct.i387_fxsave_struct } + +implementation ; Functions: + +void %rs_init() { +entry: + br bool false, label %loopentry.0.no_exit.0_crit_edge, label %loopentry.0.loopexit.0_crit_edge + +loopentry.0: ; No predecessors! + unreachable + +loopentry.0.loopexit.0_crit_edge: ; preds = %entry + br label %loopexit.0 + +loopentry.0.no_exit.0_crit_edge: ; preds = %entry + br label %no_exit.0 + +no_exit.0: ; preds = %no_exit.0.no_exit.0_crit_edge, %loopentry.0.no_exit.0_crit_edge + br bool false, label %no_exit.0.no_exit.0_crit_edge, label %no_exit.0.loopexit.0_crit_edge + +no_exit.0.loopexit.0_crit_edge: ; preds = %no_exit.0 + br label %loopexit.0 + +no_exit.0.no_exit.0_crit_edge: ; preds = %no_exit.0 + br label %no_exit.0 + +loopexit.0: ; preds = %no_exit.0.loopexit.0_crit_edge, %loopentry.0.loopexit.0_crit_edge + br bool false, label %then.0, label %loopexit.0.endif.0_crit_edge + +loopexit.0.endif.0_crit_edge: ; preds = %loopexit.0 + br label %endif.0 + +then.0: ; preds = %loopexit.0 + br bool false, label %loopentry.1.no_exit.1_crit_edge, label %loopentry.1.loopexit.1_crit_edge + +loopentry.1: ; No predecessors! + unreachable + +loopentry.1.loopexit.1_crit_edge: ; preds = %then.0 + br label %loopexit.1 + +loopentry.1.no_exit.1_crit_edge: ; preds = %then.0 + br label %no_exit.1 + +no_exit.1: ; preds = %no_exit.1.backedge, %loopentry.1.no_exit.1_crit_edge + br bool false, label %shortcirc_next.0, label %no_exit.1.shortcirc_done.0_crit_edge + +no_exit.1.shortcirc_done.0_crit_edge: ; preds = %no_exit.1 + br label %shortcirc_done.0 + +shortcirc_next.0: ; preds = %no_exit.1 + br label %shortcirc_done.0 + +shortcirc_done.0: ; preds = %shortcirc_next.0, %no_exit.1.shortcirc_done.0_crit_edge + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %shortcirc_done.0 + br bool false, label %then.1.no_exit.1_crit_edge, label %then.1.loopexit.1_crit_edge + +then.1.loopexit.1_crit_edge: ; preds = %then.1 + br label %loopexit.1 + +then.1.no_exit.1_crit_edge: ; preds = %then.1 + br label %no_exit.1.backedge + +no_exit.1.backedge: ; preds = %endif.1.no_exit.1_crit_edge, %then.1.no_exit.1_crit_edge + br label %no_exit.1 + +endif.1: ; preds = %shortcirc_done.0 + br bool false, label %endif.1.no_exit.1_crit_edge, label %endif.1.loopexit.1_crit_edge + +endif.1.loopexit.1_crit_edge: ; preds = %endif.1 + br label %loopexit.1 + +endif.1.no_exit.1_crit_edge: ; preds = %endif.1 + br label %no_exit.1.backedge + +loopexit.1: ; preds = %endif.1.loopexit.1_crit_edge, %then.1.loopexit.1_crit_edge, %loopentry.1.loopexit.1_crit_edge + br label %endif.0 + +endif.0: ; preds = %loopexit.1, %loopexit.0.endif.0_crit_edge + br bool false, label %then.2, label %endif.0.endif.2_crit_edge + +endif.0.endif.2_crit_edge: ; preds = %endif.0 + br label %endif.2 + +then.2: ; preds = %endif.0 + unreachable + +dead_block.0: ; No predecessors! + br label %endif.2 + +endif.2: ; preds = %dead_block.0, %endif.0.endif.2_crit_edge + br bool false, label %then.3, label %endif.2.endif.3_crit_edge + +endif.2.endif.3_crit_edge: ; preds = %endif.2 + br label %endif.3 + +then.3: ; preds = %endif.2 + unreachable + +dead_block.1: ; No predecessors! + br label %endif.3 + +endif.3: ; preds = %dead_block.1, %endif.2.endif.3_crit_edge + br label %loopentry.2 + +loopentry.2: ; preds = %endif.6, %endif.3 + br bool false, label %loopentry.2.no_exit.2_crit_edge, label %loopentry.2.loopexit.2_crit_edge + +loopentry.2.loopexit.2_crit_edge: ; preds = %loopentry.2 + br label %loopexit.2 + +loopentry.2.no_exit.2_crit_edge: ; preds = %loopentry.2 + br label %no_exit.2 + +no_exit.2: ; preds = %then.5.no_exit.2_crit_edge, %loopentry.2.no_exit.2_crit_edge + br bool false, label %then.4, label %no_exit.2.endif.4_crit_edge + +no_exit.2.endif.4_crit_edge: ; preds = %no_exit.2 + br label %endif.4 + +then.4: ; preds = %no_exit.2 + br label %endif.4 + +endif.4: ; preds = %then.4, %no_exit.2.endif.4_crit_edge + br bool false, label %shortcirc_next.1, label %endif.4.shortcirc_done.1_crit_edge + +endif.4.shortcirc_done.1_crit_edge: ; preds = %endif.4 + br label %shortcirc_done.1 + +shortcirc_next.1: ; preds = %endif.4 + br bool false, label %then.i21, label %endif.i + +then.i21: ; preds = %shortcirc_next.1 + br label %then.5 + +then.i21.endif.5_crit_edge: ; No predecessors! + unreachable + +then.i21.then.5_crit_edge: ; No predecessors! + unreachable + +endif.i: ; preds = %shortcirc_next.1 + br label %shortcirc_done.1 + +__check_region.exit: ; No predecessors! + unreachable + +shortcirc_done.1: ; preds = %endif.i, %endif.4.shortcirc_done.1_crit_edge + br bool false, label %shortcirc_done.1.then.5_crit_edge, label %shortcirc_done.1.endif.5_crit_edge + +shortcirc_done.1.endif.5_crit_edge: ; preds = %shortcirc_done.1 + br label %endif.5 + +shortcirc_done.1.then.5_crit_edge: ; preds = %shortcirc_done.1 + br label %then.5 + +then.5: ; preds = %shortcirc_done.1.then.5_crit_edge, %then.i21 + br bool false, label %then.5.no_exit.2_crit_edge, label %then.5.loopexit.2_crit_edge + +then.5.loopexit.2_crit_edge: ; preds = %then.5 + br label %loopexit.2 + +then.5.no_exit.2_crit_edge: ; preds = %then.5 + br label %no_exit.2 + +dead_block_after_continue.0: ; No predecessors! + unreachable + +endif.5: ; preds = %shortcirc_done.1.endif.5_crit_edge + br bool false, label %then.6, label %endif.5.endif.6_crit_edge + +endif.5.endif.6_crit_edge: ; preds = %endif.5 + br label %endif.6 + +then.6: ; preds = %endif.5 + br label %endif.6 + +endif.6: ; preds = %then.6, %endif.5.endif.6_crit_edge + br label %loopentry.2 + +loopcont.2: ; No predecessors! + unreachable + +loopexit.2: ; preds = %then.5.loopexit.2_crit_edge, %loopentry.2.loopexit.2_crit_edge + br label %loopentry.3 + +loopentry.3: ; preds = %endif.9, %loopexit.2 + br bool false, label %loopentry.3.no_exit.3_crit_edge, label %loopentry.3.loopexit.3_crit_edge + +loopentry.3.loopexit.3_crit_edge: ; preds = %loopentry.3 + br label %loopexit.3 + +loopentry.3.no_exit.3_crit_edge: ; preds = %loopentry.3 + br label %no_exit.3 + +no_exit.3: ; preds = %then.7.no_exit.3_crit_edge, %loopentry.3.no_exit.3_crit_edge + br bool false, label %then.7, label %no_exit.3.endif.7_crit_edge + +no_exit.3.endif.7_crit_edge: ; preds = %no_exit.3 + br label %endif.7 + +then.7: ; preds = %no_exit.3 + br bool false, label %then.7.no_exit.3_crit_edge, label %then.7.loopexit.3_crit_edge + +then.7.loopexit.3_crit_edge: ; preds = %then.7 + br label %loopexit.3 + +then.7.no_exit.3_crit_edge: ; preds = %then.7 + br label %no_exit.3 + +dead_block_after_continue.1: ; No predecessors! + unreachable + +endif.7: ; preds = %no_exit.3.endif.7_crit_edge + br bool false, label %shortcirc_next.2, label %endif.7.shortcirc_done.2_crit_edge + +endif.7.shortcirc_done.2_crit_edge: ; preds = %endif.7 + br label %shortcirc_done.2 + +shortcirc_next.2: ; preds = %endif.7 + br label %shortcirc_done.2 + +shortcirc_done.2: ; preds = %shortcirc_next.2, %endif.7.shortcirc_done.2_crit_edge + br bool false, label %shortcirc_next.3, label %shortcirc_done.2.shortcirc_done.3_crit_edge + +shortcirc_done.2.shortcirc_done.3_crit_edge: ; preds = %shortcirc_done.2 + br label %shortcirc_done.3 + +shortcirc_next.3: ; preds = %shortcirc_done.2 + br bool false, label %shortcirc_next.3.shortcirc_done.4_crit_edge, label %shortcirc_next.4 + +shortcirc_next.3.shortcirc_done.4_crit_edge: ; preds = %shortcirc_next.3 + br label %shortcirc_done.4 + +shortcirc_next.4: ; preds = %shortcirc_next.3 + br label %shortcirc_done.4 + +shortcirc_done.4: ; preds = %shortcirc_next.4, %shortcirc_next.3.shortcirc_done.4_crit_edge + br label %shortcirc_done.3 + +shortcirc_done.3: ; preds = %shortcirc_done.4, %shortcirc_done.2.shortcirc_done.3_crit_edge + br bool false, label %then.8, label %shortcirc_done.3.endif.8_crit_edge + +shortcirc_done.3.endif.8_crit_edge: ; preds = %shortcirc_done.3 + br label %endif.8 + +then.8: ; preds = %shortcirc_done.3 + br label %endif.8 + +endif.8: ; preds = %then.8, %shortcirc_done.3.endif.8_crit_edge + br bool false, label %then.9, label %else + +then.9: ; preds = %endif.8 + br bool false, label %cond_true.0, label %cond_false.0 + +cond_true.0: ; preds = %then.9 + br label %cond_continue.0 + +cond_false.0: ; preds = %then.9 + br label %cond_continue.0 + +cond_continue.0: ; preds = %cond_false.0, %cond_true.0 + br label %endif.9 + +else: ; preds = %endif.8 + br bool false, label %cond_true.1, label %cond_false.1 + +cond_true.1: ; preds = %else + br label %cond_continue.1 + +cond_false.1: ; preds = %else + br label %cond_continue.1 + +cond_continue.1: ; preds = %cond_false.1, %cond_true.1 + br label %endif.9 + +endif.9: ; preds = %cond_continue.1, %cond_continue.0 + br label %loopentry.3 + +loopcont.3: ; No predecessors! + unreachable + +loopexit.3: ; preds = %then.7.loopexit.3_crit_edge, %loopentry.3.loopexit.3_crit_edge + br bool false, label %loopentry.i.i.i2.no_exit.i.i.i4_crit_edge, label %loopentry.i.i.i2.pci_register_driver.exit.i.i_crit_edge + +loopentry.i.i.i2: ; No predecessors! + unreachable + +loopentry.i.i.i2.pci_register_driver.exit.i.i_crit_edge: ; preds = %loopexit.3 + br label %pci_register_driver.exit.i.i + +loopentry.i.i.i2.no_exit.i.i.i4_crit_edge: ; preds = %loopexit.3 + br label %no_exit.i.i.i4 + +no_exit.i.i.i4: ; preds = %endif.i.i.i10.no_exit.i.i.i4_crit_edge, %loopentry.i.i.i2.no_exit.i.i.i4_crit_edge + br bool false, label %then.i.i.i6, label %no_exit.i.i.i4.endif.i.i.i10_crit_edge + +no_exit.i.i.i4.endif.i.i.i10_crit_edge: ; preds = %no_exit.i.i.i4 + br label %endif.i.i.i10 + +then.i.i.i6: ; preds = %no_exit.i.i.i4 + br bool false, label %then.0.i.i.i.i, label %else.i.i.i.i + +then.0.i.i.i.i: ; preds = %then.i.i.i6 + br bool false, label %then.1.i.i.i.i, label %endif.1.i.i.i.i + +then.1.i.i.i.i: ; preds = %then.0.i.i.i.i + br label %endif.i.i.i10 + +endif.1.i.i.i.i: ; preds = %then.0.i.i.i.i + br bool false, label %endif.1.i.i.i.i.then.i.i.i.i.i.i_crit_edge, label %endif.1.i.i.i.i.endif.i.i.i.i.i.i_crit_edge + +endif.1.i.i.i.i.endif.i.i.i.i.i.i_crit_edge: ; preds = %endif.1.i.i.i.i + br label %endif.i.i.i.i.i.i + +endif.1.i.i.i.i.then.i.i.i.i.i.i_crit_edge: ; preds = %endif.1.i.i.i.i + br label %then.i.i.i.i.i.i + +else.i.i.i.i: ; preds = %then.i.i.i6 + br bool false, label %endif.0.i.i.i.i.then.i.i.i.i.i.i_crit_edge, label %endif.0.i.i.i.i.endif.i.i.i.i.i.i_crit_edge + +endif.0.i.i.i.i: ; No predecessors! + unreachable + +endif.0.i.i.i.i.endif.i.i.i.i.i.i_crit_edge: ; preds = %else.i.i.i.i + br label %endif.i.i.i.i.i.i + +endif.0.i.i.i.i.then.i.i.i.i.i.i_crit_edge: ; preds = %else.i.i.i.i + br label %then.i.i.i.i.i.i + +then.i.i.i.i.i.i: ; preds = %endif.0.i.i.i.i.then.i.i.i.i.i.i_crit_edge, %endif.1.i.i.i.i.then.i.i.i.i.i.i_crit_edge + br bool false, label %then.i.i.i.i.i.i.then.2.i.i.i.i_crit_edge, label %then.i.i.i.i.i.i.endif.2.i.i.i.i_crit_edge + +then.i.i.i.i.i.i.endif.2.i.i.i.i_crit_edge: ; preds = %then.i.i.i.i.i.i + br label %endif.2.i.i.i.i + +then.i.i.i.i.i.i.then.2.i.i.i.i_crit_edge: ; preds = %then.i.i.i.i.i.i + br label %then.2.i.i.i.i + +endif.i.i.i.i.i.i: ; preds = %endif.0.i.i.i.i.endif.i.i.i.i.i.i_crit_edge, %endif.1.i.i.i.i.endif.i.i.i.i.i.i_crit_edge + br bool false, label %dev_probe_lock.exit.i.i.i.i.then.2.i.i.i.i_crit_edge, label %dev_probe_lock.exit.i.i.i.i.endif.2.i.i.i.i_crit_edge + +dev_probe_lock.exit.i.i.i.i: ; No predecessors! + unreachable + +dev_probe_lock.exit.i.i.i.i.endif.2.i.i.i.i_crit_edge: ; preds = %endif.i.i.i.i.i.i + br label %endif.2.i.i.i.i + +dev_probe_lock.exit.i.i.i.i.then.2.i.i.i.i_crit_edge: ; preds = %endif.i.i.i.i.i.i + br label %then.2.i.i.i.i + +then.2.i.i.i.i: ; preds = %dev_probe_lock.exit.i.i.i.i.then.2.i.i.i.i_crit_edge, %then.i.i.i.i.i.i.then.2.i.i.i.i_crit_edge + br label %endif.2.i.i.i.i + +endif.2.i.i.i.i: ; preds = %then.2.i.i.i.i, %dev_probe_lock.exit.i.i.i.i.endif.2.i.i.i.i_crit_edge, %then.i.i.i.i.i.i.endif.2.i.i.i.i_crit_edge + br bool false, label %then.i.i2.i.i.i.i, label %endif.i.i3.i.i.i.i + +then.i.i2.i.i.i.i: ; preds = %endif.2.i.i.i.i + br label %endif.i.i.i10 + +endif.i.i3.i.i.i.i: ; preds = %endif.2.i.i.i.i + br label %endif.i.i.i10 + +dev_probe_unlock.exit.i.i.i.i: ; No predecessors! + unreachable + +pci_announce_device.exit.i.i.i: ; No predecessors! + unreachable + +endif.i.i.i10: ; preds = %endif.i.i3.i.i.i.i, %then.i.i2.i.i.i.i, %then.1.i.i.i.i, %no_exit.i.i.i4.endif.i.i.i10_crit_edge + br bool false, label %endif.i.i.i10.no_exit.i.i.i4_crit_edge, label %endif.i.i.i10.pci_register_driver.exit.i.i_crit_edge + +endif.i.i.i10.pci_register_driver.exit.i.i_crit_edge: ; preds = %endif.i.i.i10 + br label %pci_register_driver.exit.i.i + +endif.i.i.i10.no_exit.i.i.i4_crit_edge: ; preds = %endif.i.i.i10 + br label %no_exit.i.i.i4 + +pci_register_driver.exit.i.i: ; preds = %endif.i.i.i10.pci_register_driver.exit.i.i_crit_edge, %loopentry.i.i.i2.pci_register_driver.exit.i.i_crit_edge + br bool false, label %then.0.i.i12, label %endif.0.i.i13 + +then.0.i.i12: ; preds = %pci_register_driver.exit.i.i + br label %probe_serial_pci.exit + +then.0.i.i12.probe_serial_pci.exit_crit_edge: ; No predecessors! + unreachable + +then.0.i.i12.then.i_crit_edge: ; No predecessors! + br label %then.i + +endif.0.i.i13: ; preds = %pci_register_driver.exit.i.i + br bool false, label %then.1.i.i14, label %endif.0.i.i13.endif.1.i.i15_crit_edge + +endif.0.i.i13.endif.1.i.i15_crit_edge: ; preds = %endif.0.i.i13 + br label %endif.1.i.i15 + +then.1.i.i14: ; preds = %endif.0.i.i13 + br label %endif.1.i.i15 + +endif.1.i.i15: ; preds = %then.1.i.i14, %endif.0.i.i13.endif.1.i.i15_crit_edge + br bool false, label %loopentry.i8.i.i.no_exit.i9.i.i_crit_edge, label %loopentry.i8.i.i.pci_unregister_driver.exit.i.i_crit_edge + +loopentry.i8.i.i: ; No predecessors! + unreachable + +loopentry.i8.i.i.pci_unregister_driver.exit.i.i_crit_edge: ; preds = %endif.1.i.i15 + br label %pci_unregister_driver.exit.i.i + +loopentry.i8.i.i.no_exit.i9.i.i_crit_edge: ; preds = %endif.1.i.i15 + br label %no_exit.i9.i.i + +no_exit.i9.i.i: ; preds = %endif.0.i.i.i.no_exit.i9.i.i_crit_edge, %loopentry.i8.i.i.no_exit.i9.i.i_crit_edge + br bool false, label %then.0.i.i.i, label %no_exit.i9.i.i.endif.0.i.i.i_crit_edge + +no_exit.i9.i.i.endif.0.i.i.i_crit_edge: ; preds = %no_exit.i9.i.i + br label %endif.0.i.i.i + +then.0.i.i.i: ; preds = %no_exit.i9.i.i + br bool false, label %then.1.i.i.i, label %then.0.i.i.i.endif.1.i.i.i_crit_edge + +then.0.i.i.i.endif.1.i.i.i_crit_edge: ; preds = %then.0.i.i.i + br label %endif.1.i.i.i + +then.1.i.i.i: ; preds = %then.0.i.i.i + br label %endif.1.i.i.i + +endif.1.i.i.i: ; preds = %then.1.i.i.i, %then.0.i.i.i.endif.1.i.i.i_crit_edge + br label %endif.0.i.i.i + +endif.0.i.i.i: ; preds = %endif.1.i.i.i, %no_exit.i9.i.i.endif.0.i.i.i_crit_edge + br bool false, label %endif.0.i.i.i.no_exit.i9.i.i_crit_edge, label %endif.0.i.i.i.pci_unregister_driver.exit.i.i_crit_edge + +endif.0.i.i.i.pci_unregister_driver.exit.i.i_crit_edge: ; preds = %endif.0.i.i.i + br label %pci_unregister_driver.exit.i.i + +endif.0.i.i.i.no_exit.i9.i.i_crit_edge: ; preds = %endif.0.i.i.i + br label %no_exit.i9.i.i + +pci_unregister_driver.exit.i.i: ; preds = %endif.0.i.i.i.pci_unregister_driver.exit.i.i_crit_edge, %loopentry.i8.i.i.pci_unregister_driver.exit.i.i_crit_edge + br bool false, label %pci_module_init.exit.i.then.i_crit_edge, label %pci_module_init.exit.i.probe_serial_pci.exit_crit_edge + +pci_module_init.exit.i: ; No predecessors! + unreachable + +pci_module_init.exit.i.probe_serial_pci.exit_crit_edge: ; preds = %pci_unregister_driver.exit.i.i + br label %probe_serial_pci.exit + +pci_module_init.exit.i.then.i_crit_edge: ; preds = %pci_unregister_driver.exit.i.i + br label %then.i + +then.i: ; preds = %pci_module_init.exit.i.then.i_crit_edge, %then.0.i.i12.then.i_crit_edge + br label %probe_serial_pci.exit + +probe_serial_pci.exit: ; preds = %then.i, %pci_module_init.exit.i.probe_serial_pci.exit_crit_edge, %then.0.i.i12 + br bool false, label %then.0.i, label %endif.0.i + +then.0.i: ; preds = %probe_serial_pci.exit + ret void + +endif.0.i: ; preds = %probe_serial_pci.exit + br bool false, label %loopentry.0.i.no_exit.0.i_crit_edge, label %loopentry.0.i.loopexit.0.i_crit_edge + +loopentry.0.i: ; No predecessors! + unreachable + +loopentry.0.i.loopexit.0.i_crit_edge: ; preds = %endif.0.i + br label %loopexit.0.i + +loopentry.0.i.no_exit.0.i_crit_edge: ; preds = %endif.0.i + br label %no_exit.0.i + +no_exit.0.i: ; preds = %loopcont.0.i.no_exit.0.i_crit_edge, %loopentry.0.i.no_exit.0.i_crit_edge + br bool false, label %then.1.i, label %endif.1.i + +then.1.i: ; preds = %no_exit.0.i + br label %loopcont.0.i + +endif.1.i: ; preds = %no_exit.0.i + br bool false, label %loopentry.1.i.no_exit.1.i_crit_edge, label %loopentry.1.i.loopexit.1.i_crit_edge + +loopentry.1.i: ; No predecessors! + unreachable + +loopentry.1.i.loopexit.1.i_crit_edge: ; preds = %endif.1.i + br label %loopexit.1.i + +loopentry.1.i.no_exit.1.i_crit_edge: ; preds = %endif.1.i + br label %no_exit.1.i + +no_exit.1.i: ; preds = %endif.2.i.no_exit.1.i_crit_edge, %loopentry.1.i.no_exit.1.i_crit_edge + br bool false, label %shortcirc_next.0.i, label %no_exit.1.i.shortcirc_done.0.i_crit_edge + +no_exit.1.i.shortcirc_done.0.i_crit_edge: ; preds = %no_exit.1.i + br label %shortcirc_done.0.i + +shortcirc_next.0.i: ; preds = %no_exit.1.i + br label %shortcirc_done.0.i + +shortcirc_done.0.i: ; preds = %shortcirc_next.0.i, %no_exit.1.i.shortcirc_done.0.i_crit_edge + br bool false, label %then.2.i, label %endif.2.i + +then.2.i: ; preds = %shortcirc_done.0.i + br bool false, label %then.2.i.then.3.i_crit_edge, label %then.2.i.else.i_crit_edge + +then.2.i.else.i_crit_edge: ; preds = %then.2.i + br label %else.i + +then.2.i.then.3.i_crit_edge: ; preds = %then.2.i + br label %then.3.i + +endif.2.i: ; preds = %shortcirc_done.0.i + br bool false, label %endif.2.i.no_exit.1.i_crit_edge, label %endif.2.i.loopexit.1.i_crit_edge + +endif.2.i.loopexit.1.i_crit_edge: ; preds = %endif.2.i + br label %loopexit.1.i + +endif.2.i.no_exit.1.i_crit_edge: ; preds = %endif.2.i + br label %no_exit.1.i + +loopexit.1.i: ; preds = %endif.2.i.loopexit.1.i_crit_edge, %loopentry.1.i.loopexit.1.i_crit_edge + br bool false, label %loopexit.1.i.then.3.i_crit_edge, label %loopexit.1.i.else.i_crit_edge + +loopexit.1.i.else.i_crit_edge: ; preds = %loopexit.1.i + br label %else.i + +loopexit.1.i.then.3.i_crit_edge: ; preds = %loopexit.1.i + br label %then.3.i + +then.3.i: ; preds = %loopexit.1.i.then.3.i_crit_edge, %then.2.i.then.3.i_crit_edge + br bool false, label %shortcirc_next.1.i, label %then.3.i.shortcirc_done.1.i_crit_edge + +then.3.i.shortcirc_done.1.i_crit_edge: ; preds = %then.3.i + br label %shortcirc_done.1.i + +shortcirc_next.1.i: ; preds = %then.3.i + br label %shortcirc_done.1.i + +shortcirc_done.1.i: ; preds = %shortcirc_next.1.i, %then.3.i.shortcirc_done.1.i_crit_edge + br bool false, label %then.4.i, label %endif.4.i + +then.4.i: ; preds = %shortcirc_done.1.i + br label %endif.3.i + +endif.4.i: ; preds = %shortcirc_done.1.i + br label %endif.3.i + +else.i: ; preds = %loopexit.1.i.else.i_crit_edge, %then.2.i.else.i_crit_edge + br bool false, label %shortcirc_next.0.i.i, label %else.i.shortcirc_done.0.i.i_crit_edge + +else.i.shortcirc_done.0.i.i_crit_edge: ; preds = %else.i + br label %shortcirc_done.0.i.i + +shortcirc_next.0.i.i: ; preds = %else.i + br label %shortcirc_done.0.i.i + +shortcirc_done.0.i.i: ; preds = %shortcirc_next.0.i.i, %else.i.shortcirc_done.0.i.i_crit_edge + br bool false, label %shortcirc_next.1.i.i, label %shortcirc_done.0.i.i.shortcirc_done.1.i.i_crit_edge + +shortcirc_done.0.i.i.shortcirc_done.1.i.i_crit_edge: ; preds = %shortcirc_done.0.i.i + br label %shortcirc_done.1.i.i + +shortcirc_next.1.i.i: ; preds = %shortcirc_done.0.i.i + br bool false, label %loopentry.i.i2.i.no_exit.i.i3.i_crit_edge, label %loopentry.i.i2.i.loopexit.i.i.i_crit_edge + +loopentry.i.i2.i: ; No predecessors! + unreachable + +loopentry.i.i2.i.loopexit.i.i.i_crit_edge: ; preds = %shortcirc_next.1.i.i + br label %loopexit.i.i.i + +loopentry.i.i2.i.no_exit.i.i3.i_crit_edge: ; preds = %shortcirc_next.1.i.i + br label %no_exit.i.i3.i + +no_exit.i.i3.i: ; preds = %endif.i.i.i.no_exit.i.i3.i_crit_edge, %loopentry.i.i2.i.no_exit.i.i3.i_crit_edge + br bool false, label %shortcirc_next.0.i.i.i, label %no_exit.i.i3.i.shortcirc_done.0.i.i.i_crit_edge + +no_exit.i.i3.i.shortcirc_done.0.i.i.i_crit_edge: ; preds = %no_exit.i.i3.i + br label %shortcirc_done.0.i.i.i + +shortcirc_next.0.i.i.i: ; preds = %no_exit.i.i3.i + br label %shortcirc_done.0.i.i.i + +shortcirc_done.0.i.i.i: ; preds = %shortcirc_next.0.i.i.i, %no_exit.i.i3.i.shortcirc_done.0.i.i.i_crit_edge + br bool false, label %shortcirc_next.1.i.i.i, label %shortcirc_done.0.i.i.i.shortcirc_done.1.i.i.i_crit_edge + +shortcirc_done.0.i.i.i.shortcirc_done.1.i.i.i_crit_edge: ; preds = %shortcirc_done.0.i.i.i + br label %shortcirc_done.1.i.i.i + +shortcirc_next.1.i.i.i: ; preds = %shortcirc_done.0.i.i.i + br label %shortcirc_done.1.i.i.i + +shortcirc_done.1.i.i.i: ; preds = %shortcirc_next.1.i.i.i, %shortcirc_done.0.i.i.i.shortcirc_done.1.i.i.i_crit_edge + br bool false, label %then.i.i.i, label %endif.i.i.i + +then.i.i.i: ; preds = %shortcirc_done.1.i.i.i + br label %then.0.i.i + +then.i.i.i.endif.0.i.i_crit_edge: ; No predecessors! + unreachable + +then.i.i.i.then.0.i.i_crit_edge: ; No predecessors! + unreachable + +endif.i.i.i: ; preds = %shortcirc_done.1.i.i.i + br bool false, label %endif.i.i.i.no_exit.i.i3.i_crit_edge, label %endif.i.i.i.loopexit.i.i.i_crit_edge + +endif.i.i.i.loopexit.i.i.i_crit_edge: ; preds = %endif.i.i.i + br label %loopexit.i.i.i + +endif.i.i.i.no_exit.i.i3.i_crit_edge: ; preds = %endif.i.i.i + br label %no_exit.i.i3.i + +loopexit.i.i.i: ; preds = %endif.i.i.i.loopexit.i.i.i_crit_edge, %loopentry.i.i2.i.loopexit.i.i.i_crit_edge + br label %shortcirc_done.1.i.i + +check_compatible_id.exit.i.i: ; No predecessors! + unreachable + +shortcirc_done.1.i.i: ; preds = %loopexit.i.i.i, %shortcirc_done.0.i.i.shortcirc_done.1.i.i_crit_edge + br bool false, label %shortcirc_done.1.i.i.then.0.i.i_crit_edge, label %shortcirc_done.1.i.i.endif.0.i.i_crit_edge + +shortcirc_done.1.i.i.endif.0.i.i_crit_edge: ; preds = %shortcirc_done.1.i.i + br label %endif.0.i.i + +shortcirc_done.1.i.i.then.0.i.i_crit_edge: ; preds = %shortcirc_done.1.i.i + br label %then.0.i.i + +then.0.i.i: ; preds = %shortcirc_done.1.i.i.then.0.i.i_crit_edge, %then.i.i.i + br label %then.5.i + +then.0.i.i.endif.5.i_crit_edge: ; No predecessors! + unreachable + +then.0.i.i.then.5.i_crit_edge: ; No predecessors! + unreachable + +endif.0.i.i: ; preds = %shortcirc_done.1.i.i.endif.0.i.i_crit_edge + br bool false, label %endif.0.i.i.shortcirc_done.2.i.i_crit_edge, label %shortcirc_next.2.i.i + +endif.0.i.i.shortcirc_done.2.i.i_crit_edge: ; preds = %endif.0.i.i + br label %shortcirc_done.2.i.i + +shortcirc_next.2.i.i: ; preds = %endif.0.i.i + br label %shortcirc_done.2.i.i + +shortcirc_done.2.i.i: ; preds = %shortcirc_next.2.i.i, %endif.0.i.i.shortcirc_done.2.i.i_crit_edge + br bool false, label %then.1.i.i, label %endif.1.i.i + +then.1.i.i: ; preds = %shortcirc_done.2.i.i + br label %then.5.i + +then.1.i.i.endif.5.i_crit_edge: ; No predecessors! + unreachable + +then.1.i.i.then.5.i_crit_edge: ; No predecessors! + unreachable + +endif.1.i.i: ; preds = %shortcirc_done.2.i.i + br bool false, label %loopentry.0.i7.i.no_exit.0.i8.i_crit_edge, label %loopentry.0.i7.i.loopexit.0.i11.i_crit_edge + +loopentry.0.i7.i: ; No predecessors! + unreachable + +loopentry.0.i7.i.loopexit.0.i11.i_crit_edge: ; preds = %endif.1.i.i + br label %loopexit.0.i11.i + +loopentry.0.i7.i.no_exit.0.i8.i_crit_edge: ; preds = %endif.1.i.i + br label %no_exit.0.i8.i + +no_exit.0.i8.i: ; preds = %loopexit.1.i.i.no_exit.0.i8.i_crit_edge, %loopentry.0.i7.i.no_exit.0.i8.i_crit_edge + br bool false, label %loopentry.1.i9.i.no_exit.1.i10.i_crit_edge, label %loopentry.1.i9.i.loopexit.1.i.i_crit_edge + +loopentry.1.i9.i: ; No predecessors! + unreachable + +loopentry.1.i9.i.loopexit.1.i.i_crit_edge: ; preds = %no_exit.0.i8.i + br label %loopexit.1.i.i + +loopentry.1.i9.i.no_exit.1.i10.i_crit_edge: ; preds = %no_exit.0.i8.i + br label %no_exit.1.i10.i + +no_exit.1.i10.i: ; preds = %endif.2.i.i.no_exit.1.i10.i_crit_edge, %loopentry.1.i9.i.no_exit.1.i10.i_crit_edge + br bool false, label %shortcirc_next.3.i.i, label %no_exit.1.i10.i.shortcirc_done.3.i.i_crit_edge + +no_exit.1.i10.i.shortcirc_done.3.i.i_crit_edge: ; preds = %no_exit.1.i10.i + br label %shortcirc_done.3.i.i + +shortcirc_next.3.i.i: ; preds = %no_exit.1.i10.i + br bool false, label %shortcirc_next.3.i.i.shortcirc_done.4.i.i_crit_edge, label %shortcirc_next.4.i.i + +shortcirc_next.3.i.i.shortcirc_done.4.i.i_crit_edge: ; preds = %shortcirc_next.3.i.i + br label %shortcirc_done.4.i.i + +shortcirc_next.4.i.i: ; preds = %shortcirc_next.3.i.i + br label %shortcirc_done.4.i.i + +shortcirc_done.4.i.i: ; preds = %shortcirc_next.4.i.i, %shortcirc_next.3.i.i.shortcirc_done.4.i.i_crit_edge + br bool false, label %shortcirc_done.4.i.i.shortcirc_done.5.i.i_crit_edge, label %shortcirc_next.5.i.i + +shortcirc_done.4.i.i.shortcirc_done.5.i.i_crit_edge: ; preds = %shortcirc_done.4.i.i + br label %shortcirc_done.5.i.i + +shortcirc_next.5.i.i: ; preds = %shortcirc_done.4.i.i + %tmp.68.i.i = seteq ushort 0, 1000 ; <bool> [#uses=1] + br label %shortcirc_done.5.i.i + +shortcirc_done.5.i.i: ; preds = %shortcirc_next.5.i.i, %shortcirc_done.4.i.i.shortcirc_done.5.i.i_crit_edge + %shortcirc_val.4.i.i = phi bool [ true, %shortcirc_done.4.i.i.shortcirc_done.5.i.i_crit_edge ], [ %tmp.68.i.i, %shortcirc_next.5.i.i ] ; <bool> [#uses=1] + br label %shortcirc_done.3.i.i + +shortcirc_done.3.i.i: ; preds = %shortcirc_done.5.i.i, %no_exit.1.i10.i.shortcirc_done.3.i.i_crit_edge + %shortcirc_val.5.i.i = phi bool [ false, %no_exit.1.i10.i.shortcirc_done.3.i.i_crit_edge ], [ %shortcirc_val.4.i.i, %shortcirc_done.5.i.i ] ; <bool> [#uses=1] + br bool %shortcirc_val.5.i.i, label %then.2.i.i, label %endif.2.i.i + +then.2.i.i: ; preds = %shortcirc_done.3.i.i + %port.2.i.i.8.lcssa20 = phi %struct.isapnp_port* [ null, %shortcirc_done.3.i.i ] ; <%struct.isapnp_port*> [#uses=0] + br label %endif.5.i + +then.2.i.i.endif.5.i_crit_edge: ; No predecessors! + unreachable + +then.2.i.i.then.5.i_crit_edge: ; No predecessors! + unreachable + +endif.2.i.i: ; preds = %shortcirc_done.3.i.i + br bool false, label %endif.2.i.i.no_exit.1.i10.i_crit_edge, label %endif.2.i.i.loopexit.1.i.i_crit_edge + +endif.2.i.i.loopexit.1.i.i_crit_edge: ; preds = %endif.2.i.i + br label %loopexit.1.i.i + +endif.2.i.i.no_exit.1.i10.i_crit_edge: ; preds = %endif.2.i.i + br label %no_exit.1.i10.i + +loopexit.1.i.i: ; preds = %endif.2.i.i.loopexit.1.i.i_crit_edge, %loopentry.1.i9.i.loopexit.1.i.i_crit_edge + br bool false, label %loopexit.1.i.i.no_exit.0.i8.i_crit_edge, label %loopexit.1.i.i.loopexit.0.i11.i_crit_edge + +loopexit.1.i.i.loopexit.0.i11.i_crit_edge: ; preds = %loopexit.1.i.i + br label %loopexit.0.i11.i + +loopexit.1.i.i.no_exit.0.i8.i_crit_edge: ; preds = %loopexit.1.i.i + br label %no_exit.0.i8.i + +loopexit.0.i11.i: ; preds = %loopexit.1.i.i.loopexit.0.i11.i_crit_edge, %loopentry.0.i7.i.loopexit.0.i11.i_crit_edge + br bool false, label %serial_pnp_guess_board.exit.i.then.5.i_crit_edge, label %serial_pnp_guess_board.exit.i.endif.5.i_crit_edge + +serial_pnp_guess_board.exit.i: ; No predecessors! + unreachable + +serial_pnp_guess_board.exit.i.endif.5.i_crit_edge: ; preds = %loopexit.0.i11.i + br label %endif.5.i + +serial_pnp_guess_board.exit.i.then.5.i_crit_edge: ; preds = %loopexit.0.i11.i + br label %then.5.i + +then.5.i: ; preds = %serial_pnp_guess_board.exit.i.then.5.i_crit_edge, %then.1.i.i, %then.0.i.i + br label %loopcont.0.i + +endif.5.i: ; preds = %serial_pnp_guess_board.exit.i.endif.5.i_crit_edge, %then.2.i.i + br label %endif.3.i + +endif.3.i: ; preds = %endif.5.i, %endif.4.i, %then.4.i + br bool false, label %then.6.i, label %endif.3.i.endif.6.i_crit_edge + +endif.3.i.endif.6.i_crit_edge: ; preds = %endif.3.i + br label %endif.6.i + +then.6.i: ; preds = %endif.3.i + br label %loopentry.0.i.i + +loopentry.0.i.i: ; preds = %endif.i.i, %then.6.i + br bool false, label %loopentry.0.i.i.no_exit.0.i.i_crit_edge, label %loopentry.0.i.i.loopexit.0.i.i_crit_edge + +loopentry.0.i.i.loopexit.0.i.i_crit_edge: ; preds = %loopentry.0.i.i + br label %loopexit.0.i.i + +loopentry.0.i.i.no_exit.0.i.i_crit_edge: ; preds = %loopentry.0.i.i + br label %no_exit.0.i.i + +no_exit.0.i.i: ; preds = %clear_bit195.exit.i.i.no_exit.0.i.i_crit_edge, %loopentry.0.i.i.no_exit.0.i.i_crit_edge + br bool false, label %then.i.i, label %endif.i.i + +then.i.i: ; preds = %no_exit.0.i.i + br label %loopentry.i.i.i + +loopentry.i.i.i: ; preds = %no_exit.i.i.i, %then.i.i + br bool false, label %no_exit.i.i.i, label %clear_bit195.exit.i.i + +no_exit.i.i.i: ; preds = %loopentry.i.i.i + br label %loopentry.i.i.i + +clear_bit195.exit.i.i: ; preds = %loopentry.i.i.i + br bool false, label %clear_bit195.exit.i.i.no_exit.0.i.i_crit_edge, label %clear_bit195.exit.i.i.loopexit.0.i.i_crit_edge + +clear_bit195.exit.i.i.loopexit.0.i.i_crit_edge: ; preds = %clear_bit195.exit.i.i + br label %loopexit.0.i.i + +clear_bit195.exit.i.i.no_exit.0.i.i_crit_edge: ; preds = %clear_bit195.exit.i.i + br label %no_exit.0.i.i + +endif.i.i: ; preds = %no_exit.0.i.i + br label %loopentry.0.i.i + +loopexit.0.i.i: ; preds = %clear_bit195.exit.i.i.loopexit.0.i.i_crit_edge, %loopentry.0.i.i.loopexit.0.i.i_crit_edge + br bool false, label %loopentry.1.i.i.no_exit.1.i.i_crit_edge, label %loopentry.1.i.i.avoid_irq_share.exit.i_crit_edge + +loopentry.1.i.i: ; No predecessors! + unreachable + +loopentry.1.i.i.avoid_irq_share.exit.i_crit_edge: ; preds = %loopexit.0.i.i + br label %avoid_irq_share.exit.i + +loopentry.1.i.i.no_exit.1.i.i_crit_edge: ; preds = %loopexit.0.i.i + br label %no_exit.1.i.i + +no_exit.1.i.i: ; preds = %loopexit.2.i.i.no_exit.1.i.i_crit_edge, %loopentry.1.i.i.no_exit.1.i.i_crit_edge + br bool false, label %loopentry.2.i.i.no_exit.2.i.i_crit_edge, label %loopentry.2.i.i.loopexit.2.i.i_crit_edge + +loopentry.2.i.i: ; No predecessors! + unreachable + +loopentry.2.i.i.loopexit.2.i.i_crit_edge: ; preds = %no_exit.1.i.i + br label %loopexit.2.i.i + +loopentry.2.i.i.no_exit.2.i.i_crit_edge: ; preds = %no_exit.1.i.i + br label %no_exit.2.i.i + +no_exit.2.i.i: ; preds = %no_exit.2.i.i.no_exit.2.i.i_crit_edge, %loopentry.2.i.i.no_exit.2.i.i_crit_edge + br bool false, label %no_exit.2.i.i.no_exit.2.i.i_crit_edge, label %no_exit.2.i.i.loopexit.2.i.i_crit_edge + +no_exit.2.i.i.loopexit.2.i.i_crit_edge: ; preds = %no_exit.2.i.i + br label %loopexit.2.i.i + +no_exit.2.i.i.no_exit.2.i.i_crit_edge: ; preds = %no_exit.2.i.i + br label %no_exit.2.i.i + +loopexit.2.i.i: ; preds = %no_exit.2.i.i.loopexit.2.i.i_crit_edge, %loopentry.2.i.i.loopexit.2.i.i_crit_edge + br bool false, label %loopexit.2.i.i.no_exit.1.i.i_crit_edge, label %loopexit.2.i.i.avoid_irq_share.exit.i_crit_edge + +loopexit.2.i.i.avoid_irq_share.exit.i_crit_edge: ; preds = %loopexit.2.i.i + br label %avoid_irq_share.exit.i + +loopexit.2.i.i.no_exit.1.i.i_crit_edge: ; preds = %loopexit.2.i.i + br label %no_exit.1.i.i + +avoid_irq_share.exit.i: ; preds = %loopexit.2.i.i.avoid_irq_share.exit.i_crit_edge, %loopentry.1.i.i.avoid_irq_share.exit.i_crit_edge + br label %endif.6.i + +endif.6.i: ; preds = %avoid_irq_share.exit.i, %endif.3.i.endif.6.i_crit_edge + br label %loopcont.0.i + +loopcont.0.i: ; preds = %endif.6.i, %then.5.i, %then.1.i + br bool false, label %loopcont.0.i.no_exit.0.i_crit_edge, label %loopcont.0.i.loopexit.0.i_crit_edge + +loopcont.0.i.loopexit.0.i_crit_edge: ; preds = %loopcont.0.i + br label %loopexit.0.i + +loopcont.0.i.no_exit.0.i_crit_edge: ; preds = %loopcont.0.i + br label %no_exit.0.i + +loopexit.0.i: ; preds = %loopcont.0.i.loopexit.0.i_crit_edge, %loopentry.0.i.loopexit.0.i_crit_edge + ret void + +probe_serial_pnp.exit: ; No predecessors! + unreachable + +after_ret: ; No predecessors! + ret void + +return: ; No predecessors! + unreachable +} diff --git a/test/Transforms/CondProp/basictest.ll b/test/Transforms/CondProp/basictest.ll new file mode 100644 index 0000000..1e2a936 --- /dev/null +++ b/test/Transforms/CondProp/basictest.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -condprop | llvm-dis | \ +; RUN: not grep {br label} + +int %test(bool %C) { + br bool %C, label %T1, label %F1 +T1: + br label %Cont +F1: + br label %Cont +Cont: + %C2 = phi bool [false, %F1], [true, %T1] + br bool %C2, label %T2, label %F2 +T2: + call void %bar() + ret int 17 +F2: + ret int 1 +} +declare void %bar() diff --git a/test/Transforms/CondProp/dg.exp b/test/Transforms/CondProp/dg.exp new file mode 100644 index 0000000..39954d8 --- /dev/null +++ b/test/Transforms/CondProp/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll}]] diff --git a/test/Transforms/CondProp/phisimplify.ll b/test/Transforms/CondProp/phisimplify.ll new file mode 100644 index 0000000..a4728eb --- /dev/null +++ b/test/Transforms/CondProp/phisimplify.ll @@ -0,0 +1,33 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -condprop | llvm-dis | not grep phi + +int %test(uint %C, bool %Val) { + switch uint %C, label %T1 [ + uint 4, label %T2 + uint 17, label %T3 + ] +T1: + call void %a() + br label %Cont +T2: + call void %b() + br label %Cont +T3: + call void %c() + br label %Cont + +Cont: + ;; PHI becomes dead after threading T2 + %C2 = phi bool [%Val, %T1], [true, %T2], [%Val, %T3] + br bool %C2, label %L2, label %F2 +L2: + call void %d() + ret int 17 +F2: + call void %e() + ret int 1 +} +declare void %a() +declare void %b() +declare void %c() +declare void %d() +declare void %e() diff --git a/test/Transforms/CondProp/phisimplify2.ll b/test/Transforms/CondProp/phisimplify2.ll new file mode 100644 index 0000000..4c83fa3 --- /dev/null +++ b/test/Transforms/CondProp/phisimplify2.ll @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -condprop | llvm-dis | not grep phi + +declare bool %foo() + +int %test(uint %C) { + %Val = call bool %foo() + switch uint %C, label %T1 [ + uint 4, label %T2 + uint 17, label %T3 + ] +T1: + call void %a() + br label %Cont +T2: + call void %b() + br label %Cont +T3: + call void %c() + br label %Cont + +Cont: + ;; PHI becomes dead after threading T2 + %C2 = phi bool [%Val, %T1], [true, %T2], [%Val, %T3] + br bool %C2, label %L2, label %F2 +L2: + call void %d() + ret int 17 +F2: + call void %e() + ret int 1 +} +declare void %a() +declare void %b() +declare void %c() +declare void %d() +declare void %e() diff --git a/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll b/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll new file mode 100644 index 0000000..331501a --- /dev/null +++ b/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll @@ -0,0 +1,14 @@ +; Make sure that the constant propogator doesn't divide by zero! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop +; + +int "test"() { + %R = div int 12, 0 + ret int %R +} + +int "test2"() { + %R = rem int 12, 0 + ret int %R +} diff --git a/test/Transforms/ConstProp/2002-05-03-NotOperator.ll b/test/Transforms/ConstProp/2002-05-03-NotOperator.ll new file mode 100644 index 0000000..51f352c --- /dev/null +++ b/test/Transforms/ConstProp/2002-05-03-NotOperator.ll @@ -0,0 +1,18 @@ +; This bug has to do with the fact that constant propogation was implemented in +; terms of _logical_ not (! in C) instead of _bitwise_ not (~ in C). This was +; due to a spec change. + +; Fix #2: The unary not instruction now no longer exists. Change to xor. + +; RUN: llvm-upgrade < $test | llvm-as | opt -constprop | llvm-dis | \ +; RUN: not grep {int 0} + +int "test1"() { + %R = xor int 123, -1 + ret int %R +} + +int "test2"() { + %R = xor int -123, -1 + ret int %R +} diff --git a/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll b/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll new file mode 100644 index 0000000..cf44346 --- /dev/null +++ b/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll @@ -0,0 +1,20 @@ +; SetCC on boolean values was not implemented! + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | \ +; RUN: not grep set + +bool "test1"() { + %A = setle bool true, false + %B = setge bool true, false + %C = setlt bool false, true + %D = setgt bool true, false + %E = seteq bool false, false + %F = setne bool false, true + %G = and bool %A, %B + %H = and bool %C, %D + %I = and bool %E, %F + %J = and bool %G, %H + %K = and bool %I, %J + ret bool %K +} + diff --git a/test/Transforms/ConstProp/2003-05-12-DivideError.ll b/test/Transforms/ConstProp/2003-05-12-DivideError.ll new file mode 100644 index 0000000..289384b --- /dev/null +++ b/test/Transforms/ConstProp/2003-05-12-DivideError.ll @@ -0,0 +1,15 @@ +; Make sure that the constant propagator doesn't cause a sigfpe +; +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop +; + +int "test"() { + %R = div int -2147483648, -1 + ret int %R +} + +int "test2"() { + %R = rem int -2147483648, -1 + ret int %R +} + diff --git a/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll b/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll new file mode 100644 index 0000000..ee1f251 --- /dev/null +++ b/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: not grep {ret bool false} + +%b = external global [2 x { }] + +implementation + +bool %f() { + ; tmp.2 -> true, not false. + %tmp.2 = seteq { }* getelementptr ([2 x { }]* %b, int 0, int 0), + getelementptr ([2 x { }]* %b, int 0, int 1) + ret bool %tmp.2 +} diff --git a/test/Transforms/ConstProp/2006-11-30-vector-cast.ll b/test/Transforms/ConstProp/2006-11-30-vector-cast.ll new file mode 100644 index 0000000..80f4252 --- /dev/null +++ b/test/Transforms/ConstProp/2006-11-30-vector-cast.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: grep {i32 -1} +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: not grep zeroinitializer + +< 4 x uint> %test() { + %tmp40 = bitcast <2 x long> bitcast (<4 x int> < int 0, int 0, int -1, int 0 > to <2 x long>) to <4 x uint> + ret <4 x uint> %tmp40 +} diff --git a/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll b/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll new file mode 100644 index 0000000..779f6be --- /dev/null +++ b/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll @@ -0,0 +1,6 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i1 false} +bool %test() { + %X = trunc uint 320 to bool + ret bool %X +} diff --git a/test/Transforms/ConstProp/2006-12-01-bool-casts.ll b/test/Transforms/ConstProp/2006-12-01-bool-casts.ll new file mode 100644 index 0000000..2474132 --- /dev/null +++ b/test/Transforms/ConstProp/2006-12-01-bool-casts.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: grep {ret i32 -1} +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: grep {ret i32 1} + +int %test1() { + %A = sext bool true to int + ret int %A +} + +uint %test2() { + %A = zext bool true to uint + ret uint %A +} + diff --git a/test/Transforms/ConstProp/2007-02-05-BitCast.ll b/test/Transforms/ConstProp/2007-02-05-BitCast.ll new file mode 100644 index 0000000..a1d7c3e --- /dev/null +++ b/test/Transforms/ConstProp/2007-02-05-BitCast.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -constprop | llvm-dis | grep 1065353216 + +define i32 @test() { + %A = bitcast float 1.000000e+00 to i32 ; <i32> [#uses=1] + ret i32 %A +} + diff --git a/test/Transforms/ConstProp/2007-02-23-sdiv.ll b/test/Transforms/ConstProp/2007-02-23-sdiv.ll new file mode 100644 index 0000000..721199f --- /dev/null +++ b/test/Transforms/ConstProp/2007-02-23-sdiv.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llvm-dis | grep {global i32 0} +; PR1215 + +@G = global i32 sdiv (i32 0, i32 -1) + diff --git a/test/Transforms/ConstProp/basictest.ll b/test/Transforms/ConstProp/basictest.ll new file mode 100644 index 0000000..178467d --- /dev/null +++ b/test/Transforms/ConstProp/basictest.ll @@ -0,0 +1,16 @@ +; This is a basic sanity check for constant propogation. The add instruction +; should be eliminated. + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | not grep add + +int %test(bool %B) { + br bool %B, label %BB1, label %BB2 +BB1: + %Val = add int 0, 0 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi int [%Val, %BB1], [1, %BB2] + ret int %Ret +} diff --git a/test/Transforms/ConstProp/bitcast.ll b/test/Transforms/ConstProp/bitcast.ll new file mode 100644 index 0000000..1fc2570 --- /dev/null +++ b/test/Transforms/ConstProp/bitcast.ll @@ -0,0 +1,3 @@ +; RUN: llvm-upgrade < %s | llvm-as | llvm-dis | grep 0x36A0000000000000 + +%A = global float bitcast (int 1 to float) diff --git a/test/Transforms/ConstProp/bswap.ll b/test/Transforms/ConstProp/bswap.ll new file mode 100644 index 0000000..d31fa9d --- /dev/null +++ b/test/Transforms/ConstProp/bswap.ll @@ -0,0 +1,22 @@ +; bswap should be constant folded when it is passed a constant argument + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | not grep call + +declare ushort %llvm.bswap.i16(ushort) +declare uint %llvm.bswap.i32(uint) +declare ulong %llvm.bswap.i64(ulong) + +ushort %W() { + %Z = call ushort %llvm.bswap.i16(ushort 1) + ret ushort %Z +} + +uint %X() { + %Z = call uint %llvm.bswap.i32(uint 1) + ret uint %Z +} + +ulong %Y() { + %Z = call ulong %llvm.bswap.i64(ulong 1) + ret ulong %Z +} diff --git a/test/Transforms/ConstProp/calls.ll b/test/Transforms/ConstProp/calls.ll new file mode 100644 index 0000000..c4a8206 --- /dev/null +++ b/test/Transforms/ConstProp/calls.ll @@ -0,0 +1,25 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | not grep call + +declare double %cos(double) +declare double %sin(double) +declare double %tan(double) +declare double %sqrt(double) +declare bool %llvm.isunordered.f64(double, double) + +double %T() { + %A = call double %cos(double 0.0) + %B = call double %sin(double 0.0) + %a = add double %A, %B + %C = call double %tan(double 0.0) + %b = add double %a, %C + %D = call double %sqrt(double 4.0) + %c = add double %b, %D + ret double %c +} + +bool %TNAN() { + %A = call bool %llvm.isunordered.f64(double 0x7FF8000000000000, double 1.0) ;; it's a nan! + %B = call bool %llvm.isunordered.f64(double 123.0, double 1.0) + %C = or bool %A, %B + ret bool %C +} diff --git a/test/Transforms/ConstProp/dg.exp b/test/Transforms/ConstProp/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/ConstProp/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/ConstProp/float-to-ptr-cast.ll b/test/Transforms/ConstProp/float-to-ptr-cast.ll new file mode 100644 index 0000000..f5201de --- /dev/null +++ b/test/Transforms/ConstProp/float-to-ptr-cast.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop | llvm-dis | \ +; RUN: grep -F {ret i32* null} | wc -l | grep 2 + +int* %test1() { + %X = cast float 0.0 to int* + ret int* %X +} + +int* %test2() { + ret int* cast (float 0.0 to int*) +} diff --git a/test/Transforms/ConstProp/logicaltest.ll b/test/Transforms/ConstProp/logicaltest.ll new file mode 100644 index 0000000..ce31114 --- /dev/null +++ b/test/Transforms/ConstProp/logicaltest.ll @@ -0,0 +1,14 @@ +; Ensure constant propogation of logical instructions is working correctly. + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | \ +; RUN: not egrep {and|or|xor} + + +int "test1"() { %R = and int 4,1234 ret int %R } +bool "test1"() { %R = and bool true, false ret bool %R } + +int "test2"() { %R = or int 4,1234 ret int %R } +bool "test2"() { %R = or bool true, false ret bool %R } + +int "test3"() { %R = xor int 4,1234 ret int %R } +bool "test3"() { %R = xor bool true, false ret bool %R } diff --git a/test/Transforms/ConstProp/nottest.ll b/test/Transforms/ConstProp/nottest.ll new file mode 100644 index 0000000..022a513 --- /dev/null +++ b/test/Transforms/ConstProp/nottest.ll @@ -0,0 +1,19 @@ +; Ensure constant propogation of 'not' instructions is working correctly. + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | not grep xor + +int "test1"() { + %R = xor int 4, -1 + ret int %R +} + +int "test2"() { + %R = xor int -23, -1 + ret int %R +} + +bool "test3"() { + %R = xor bool true, true + ret bool %R +} + diff --git a/test/Transforms/ConstProp/phi.ll b/test/Transforms/ConstProp/phi.ll new file mode 100644 index 0000000..d7624dc --- /dev/null +++ b/test/Transforms/ConstProp/phi.ll @@ -0,0 +1,14 @@ +; This is a basic sanity check for constant propogation. The add instruction +; should be eliminated. + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | not grep phi + +int %test(bool %B) { +BB0: + br bool %B, label %BB1, label %BB3 +BB1: + br label %BB3 +BB3: + %Ret = phi int [1, %BB0], [1, %BB1] + ret int %Ret +} diff --git a/test/Transforms/ConstProp/remtest.ll b/test/Transforms/ConstProp/remtest.ll new file mode 100644 index 0000000..905f4b7 --- /dev/null +++ b/test/Transforms/ConstProp/remtest.ll @@ -0,0 +1,23 @@ +; Ensure constant propagation of remainder instructions is working correctly. + +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -die | llvm-dis | not grep rem + +int %test1() { + %R = rem int 4, 3 + ret int %R +} + +int %test2() { + %R = rem int 123, -23 + ret int %R +} + +float %test3() { + %R = rem float 12.45, 123.213 + ret float %R +} + +double %test4() { + %R = rem double 312.20213123, 12.3333412 + ret double %R +} diff --git a/test/Transforms/ConstantMerge/2002-09-23-CPR-Update.ll b/test/Transforms/ConstantMerge/2002-09-23-CPR-Update.ll new file mode 100644 index 0000000..8d3d434 --- /dev/null +++ b/test/Transforms/ConstantMerge/2002-09-23-CPR-Update.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constmerge > /dev/null + +%foo = internal constant {int} {int 7} +%bar = internal constant {int} {int 7} + +implementation + +declare int %test(int*) + +void %foo() { + call int %test(int* getelementptr ( {int} * %foo, long 0, uint 0)) + call int %test(int* getelementptr ( {int} * %bar, long 0, uint 0)) + ret void +} diff --git a/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll b/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll new file mode 100644 index 0000000..72f8ecf --- /dev/null +++ b/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constmerge | llvm-dis | %prcontext foo 2 | grep bar + +%foo = constant int 6 +%bar = constant int 6 + +implementation + diff --git a/test/Transforms/ConstantMerge/2006-03-07-DontMergeDiffSections.ll b/test/Transforms/ConstantMerge/2006-03-07-DontMergeDiffSections.ll new file mode 100644 index 0000000..36786d9 --- /dev/null +++ b/test/Transforms/ConstantMerge/2006-03-07-DontMergeDiffSections.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -constmerge | llvm-dis | grep foo +; RUN: llvm-upgrade < %s | llvm-as | opt -constmerge | llvm-dis | grep bar + +; Don't merge constants in different sections. + +%G1 = internal constant int 1, section "foo" +%G2 = internal constant int 1, section "bar" +%G3 = internal constant int 1, section "bar" + +void %test(int** %P1, int **%P2, int **%P3) { + store int* %G1, int** %P1 + store int* %G2, int** %P2 + store int* %G3, int** %P3 + ret void +} diff --git a/test/Transforms/ConstantMerge/dg.exp b/test/Transforms/ConstantMerge/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/ConstantMerge/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/CorrelatedExprs/2002-09-23-PHIUpdateBug.ll b/test/Transforms/CorrelatedExprs/2002-09-23-PHIUpdateBug.ll new file mode 100644 index 0000000..5873a63 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-09-23-PHIUpdateBug.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -cee + +implementation + +declare void %foo(int) + +void %test(int %A, bool %C) { + br bool %C, label %bb0, label %bb1 +bb0: + br label %bb3 +Unreachable: + br label %bb2 +bb1: ;[#uses=0] + %cond212 = setgt int %A, 9 ; <bool> [#uses=1] + br bool %cond212, label %bb2, label %bb7 + +bb2: ;[#uses=1] + %cond = setgt int %A, 7 + br bool %cond, label %bb3, label %bb7 + +bb3: ;[#uses=1] + %X = phi int [ 0, %bb0], [ 12, %bb2] + call void %foo( int %X ) + br label %bb7 + +bb7: ;[#uses=2] + ret void +} + diff --git a/test/Transforms/CorrelatedExprs/2002-10-03-PHIPropogate.ll b/test/Transforms/CorrelatedExprs/2002-10-03-PHIPropogate.ll new file mode 100644 index 0000000..a9d5f0c --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-03-PHIPropogate.ll @@ -0,0 +1,45 @@ +; This test checks to see if the CEE pass is applying jump-bypassing for values +; determined by PHI nodes. Because we are coming from a particular block, we +; know what value a PHI node will take on this edge and should exploit it. +; +; This testcase comes from the following C code: +; void bar(void); +; void foo(int c) { +; int i = c ? 2 : 8; +; while (i < 20) { +; bar (); +; i++; +; } +; } +; +; RUN: llvm-upgrade < %s | llvm-as | opt -cee -simplifycfg | llvm-dis | not grep bb3 + +implementation +declare void %bar() + +void %foo(int %c) { +bb0: ; No predecessors! + %cond215 = seteq int %c, 0 ; <bool> [#uses=1] + br bool %cond215, label %bb3, label %bb4 + +bb3: ; preds = %bb0 + br label %bb4 + +bb4: ; preds = %bb3, %bb0 + %reg110 = phi int [ 8, %bb3 ], [ 2, %bb0 ] ; <int> [#uses=2] + %cond217 = setgt int %reg110, 19 ; <bool> [#uses=1] + br bool %cond217, label %bb6, label %bb5 + +bb5: ; preds = %bb5, %bb4 + %cann-indvar = phi int [ 0, %bb4 ], [ %add1-indvar, %bb5 ] ; <int> [#uses=2] + %add1-indvar = add int %cann-indvar, 1 ; <int> [#uses=1] + %reg111 = add int %cann-indvar, %reg110 ; <int> [#uses=1] + call void %bar( ) + %reg112 = add int %reg111, 1 ; <int> [#uses=1] + %cond222 = setle int %reg112, 19 ; <bool> [#uses=1] + br bool %cond222, label %bb5, label %bb6 + +bb6: ; preds = %bb5, %bb4 + ret void +} + diff --git a/test/Transforms/CorrelatedExprs/2002-10-04-ForwardingBug.ll b/test/Transforms/CorrelatedExprs/2002-10-04-ForwardingBug.ll new file mode 100644 index 0000000..7dd89d4 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-04-ForwardingBug.ll @@ -0,0 +1,35 @@ +; Testcase distilled from bisort where we tried to perform branch target +; forwarding where it was not safe. +; RUN: llvm-upgrade < %s | llvm-as | opt -cee +; + %HANDLE = type { int, %HANDLE*, %HANDLE* } + %struct.node = type { int, %HANDLE*, %HANDLE* } +%.LC0 = internal global [11 x sbyte] c"%d @ 0x%x\0A\00" ; <[11 x sbyte]*> [#uses=1] + +implementation ; Functions: + +void %InOrder(%HANDLE* %h) { +bb0: ; No predecessors! + br label %bb2 + +bb2: ; preds = %bb3, %bb0 + %reg113 = phi %HANDLE* [ %reg109, %bb3 ], [ %h, %bb0 ] ; <%HANDLE*> [#uses=4] + %cond217 = seteq %HANDLE* %reg113, null ; <bool> [#uses=1] + br bool %cond217, label %bb4, label %bb3 + +bb3: ; preds = %bb2 + %reg221 = getelementptr %HANDLE* %reg113, long 0, uint 1 ; <%HANDLE**> [#uses=1] + %reg108 = load %HANDLE** %reg221 ; <%HANDLE*> [#uses=1] + %reg226 = getelementptr %HANDLE* %reg113, long 0, uint 2 ; <%HANDLE**> [#uses=1] + %reg109 = load %HANDLE** %reg226 ; <%HANDLE*> [#uses=1] + call void %InOrder( %HANDLE* %reg108 ) + %cast231 = getelementptr %HANDLE* %reg113, long 0, uint 0 ; <int*> [#uses=1] + %reg111 = load int* %cast231 ; <int> [#uses=1] + %reg233 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([11 x sbyte]* %.LC0, long 0, long 0), int %reg111, uint 0 ) ; <int> [#uses=0] + br label %bb2 + +bb4: ; preds = %bb2 + ret void +} + +declare int %printf(sbyte*, ...) diff --git a/test/Transforms/CorrelatedExprs/2002-10-07-DominatorProblem.ll b/test/Transforms/CorrelatedExprs/2002-10-07-DominatorProblem.ll new file mode 100644 index 0000000..716db54 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-07-DominatorProblem.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -cee +; +; The 'cee' pass is breaking SSA form when it blindly forwards the branch from +; Eq to branch to "Forwarded" instead. + +implementation + +int %test(int %A, int %B, bool %c0) { +Start: + %c1 = seteq int %A, %B + br bool %c1, label %Eq, label %Loop + +Eq: ; In this block we know that A == B + br label %Loop ; This should be modified to branch to "Forwarded". + +Loop: ;; Merge point, nothing is known here... + %Z = phi int [%A, %Start], [%B, %Eq], [%Z, %Bottom] + %c2 = setgt int %A, %B + br bool %c2, label %Forwarded, label %Bottom + +Forwarded: + %Z2 = phi int [%Z, %Loop] + call int %test(int 0, int %Z2, bool true) + br label %Bottom + +Bottom: + br label %Loop +} diff --git a/test/Transforms/CorrelatedExprs/2002-10-07-NoImmediateDominator.ll b/test/Transforms/CorrelatedExprs/2002-10-07-NoImmediateDominator.ll new file mode 100644 index 0000000..f5ce045 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-07-NoImmediateDominator.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -cee +; +; This testcase causes an assertion error. +; +implementation ; Functions: + +void %test(int %A) { + br label %bb2 +bb2: + ret void + +bb3: ; No predecessors! + br bool true, label %bb4, label %bb2 + +bb4: + ret void +} diff --git a/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest.ll b/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest.ll new file mode 100644 index 0000000..2f39701 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest.ll @@ -0,0 +1,32 @@ +; Test to make sure that SSA is correctly updated +; RUN: llvm-upgrade < %s | llvm-as | opt -cee +; +implementation ; Functions: + +int %test(int %A, int %B, bool %c0) { +Start: ; No predecessors! + %c1 = seteq int %A, %B ; <bool> [#uses=1] + br bool %c1, label %Eq, label %Start_crit_edge + +Start_crit_edge: ; preds = %Start + br label %Loop + +Eq: ; preds = %Start + br label %Loop + +Loop: ; preds = %Bottom, %Eq, %Start_crit_edge + %Z = phi int [ %A, %Start_crit_edge ], [ %B, %Eq ], [ %Z, %Bottom ] ; <int> [#uses=2] + %c2 = setge int %A, %B ; <bool> [#uses=1] + br bool %c2, label %Forwarded, label %Loop_crit_edge + +Loop_crit_edge: ; preds = %Loop + br label %Bottom + +Forwarded: ; preds = %Loop + %Z2 = phi int [ %Z, %Loop ] ; <int> [#uses=1] + call int %test( int 0, int %Z2, bool true ) ; <int>:0 [#uses=0] + br label %Bottom + +Bottom: ; preds = %Forwarded, %Loop_crit_edge + br label %Loop +} diff --git a/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest2.ll b/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest2.ll new file mode 100644 index 0000000..0348e40 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/2002-10-08-DominatorTest2.ll @@ -0,0 +1,34 @@ +; Simple test to make sure dominators are updated properly +; RUN: llvm-upgrade < %s | llvm-as | opt -cee + +implementation ; Functions: + +int %test(int %A, int %B, bool %c0) { +Start: ; No predecessors! + %c1 = seteq int %A, %B ; <bool> [#uses=1] + br bool %c1, label %Eq, label %Start_crit_edge + +Start_crit_edge: ; preds = %Start + br label %Loop + +Eq: ; preds = %Start + br label %Loop + +Loop: ; preds = %Bottom, %Eq, %Start_crit_edge + %Z = phi int [ %A, %Start_crit_edge ], [ %B, %Eq ];, [ %Z, %Bottom ] ; <int> [#uses=2] + %c2 = setge int %A, %B ; <bool> [#uses=1] + br bool %c2, label %Forwarded, label %Loop_crit_edge + +Loop_crit_edge: ; preds = %Loop + %X = seteq int %Z, 7 + br bool %X, label %Forwarded, label %Bottom + +Forwarded: ; preds = %Loop + %Z2 = phi int [ %Z, %Loop ], [%Z, %Loop_crit_edge] ; <int> [#uses=1] + call int %test( int %Z, int %Z2, bool true ) ; <int>:0 [#uses=0] + br label %Bottom + +Bottom: ; preds = %Forwarded, %Loop_crit_edge + ret int %Z + ;br label %Loop +} diff --git a/test/Transforms/CorrelatedExprs/basictest.ll b/test/Transforms/CorrelatedExprs/basictest.ll new file mode 100644 index 0000000..0f41d24 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/basictest.ll @@ -0,0 +1,136 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -cee -constprop -instcombine -dce | \ +; RUN: llvm-dis | not grep REMOVE + +int %test1(int %A) { + %cond = seteq int %A, 40 + br bool %cond, label %T, label %F +T: + %REMOVE = add int %A, 2 ; Should become = 42 + ret int %REMOVE +F: + ret int 8 +} + +bool %test2(int %A) { + %cond = seteq int %A, 40 + br bool %cond, label %T, label %F +T: + %REMOVE = seteq int %A, 2 ; Should become = false + ret bool %REMOVE +F: + ret bool false +} + +bool %test3(int %A) { + %cond = setlt int %A, 40 + br bool %cond, label %T, label %F +T: + %REMOVE = setgt int %A, 47 ; Should become = false + ret bool %REMOVE +F: + %REMOVE2 = setge int %A, 40 ; Should become = true + ret bool %REMOVE2 +} + +bool %test4(int %A) { + %cond = setlt int %A, 40 + br bool %cond, label %T, label %F +T: + %REMOVE = setgt int %A, 47 ; Should become = false + ret bool %REMOVE +F: + ret bool false +} + +int %test5(int %A, int %B) { + %cond = setne int %A, %B + br bool %cond, label %F, label %T +T: + %C = sub int %A, %B ; = 0 + ret int %C +F: + ret int 0 +} + +bool %test6(int %A) { + %REMOVE = setlt int %A, 47 ; Should become dead + %cond = setlt int %A, 40 + br bool %cond, label %T, label %F +T: + ret bool %REMOVE ;; == true +F: + ret bool false +} + +bool %test7(int %A) { + %cond = setlt int %A, 40 + br bool %cond, label %T, label %F +T: + %REMOVE = xor bool %cond, true + ret bool %REMOVE +F: + ret bool false +} + +; Test that and expressions are handled... +bool %test8(int %A, int %B) { + %cond1 = setle int %A, 7 + %cond2 = setle int %B, 7 + %cond = and bool %cond1, %cond2 + br bool %cond, label %T, label %F +T: + %REMOVE1 = seteq int %A, 9 ; false + %REMOVE2 = setge int %B, 9 ; false + %REMOVE = or bool %REMOVE1, %REMOVE2 ; false + ret bool %REMOVE +F: + ret bool false +} + +; Test that or expressions are handled... +bool %test9(int %A, int %B) { + %cond1 = setle int %A, 7 + %cond2 = setle int %B, 7 + %cond = or bool %cond1, %cond2 + br bool %cond, label %T, label %F +T: + ret bool false +F: + %REMOVE1 = setge int %A, 8 ; true + %REMOVE2 = setge int %B, 8 ; true + %REMOVE = or bool %REMOVE1, %REMOVE2 ; true + ret bool %REMOVE +} + +bool %test10(int %A) { + %cond = setle int %A, 7 + br bool %cond, label %T, label %F +T: + ret bool false +F: + %REMOVE = setge int %A, 8 + ret bool %REMOVE +} + +; Implement correlated comparisons against non-constants +bool %test11(int %A, int %B) { + %cond = setlt int %A, %B + br bool %cond, label %T, label %F +T: + %REMOVE1 = seteq int %A, %B ; false + %REMOVE2 = setle int %A, %B ; true + %cond2 = and bool %REMOVE1, %REMOVE2 + ret bool %cond2 +F: + ret bool true +} + +bool %test12(int %A) { + %cond = setlt int %A, 0 + br bool %cond, label %T, label %F +T: + %REMOVE = setne int %A, 0 ; true + ret bool %REMOVE +F: + ret bool false +} diff --git a/test/Transforms/CorrelatedExprs/branchtest.ll b/test/Transforms/CorrelatedExprs/branchtest.ll new file mode 100644 index 0000000..591cede --- /dev/null +++ b/test/Transforms/CorrelatedExprs/branchtest.ll @@ -0,0 +1,35 @@ +; RUN: echo %s + +implementation + +declare void %foo(int) + +void %test(int %A) { +bb1: ;[#uses=0] + %cond212 = setgt int %A, 9 ; <bool> [#uses=1] + br bool %cond212, label %REMOVEbb3, label %bb2 + +bb2: ;[#uses=1] + call void %foo( int 123 ) + br label %REMOVEbb3 + +REMOVEbb3: ;[#uses=2] + %cond217 = setle int %A, 9 ; <bool> [#uses=1] + br bool %cond217, label %REMOVEbb5, label %bb4 + +bb4: ;[#uses=1] + call void %foo( int 234 ) + br label %REMOVEbb5 + +REMOVEbb5: ;[#uses=2] + %cond222 = setgt int %A, 9 ; <bool> [#uses=1] + br bool %cond222, label %bb7, label %REMOVEbb6 + +REMOVEbb6: ;[#uses=1] + call void %foo( int 456 ) + br label %bb7 + +bb7: ;[#uses=2] + ret void +} + diff --git a/test/Transforms/CorrelatedExprs/dg.exp b/test/Transforms/CorrelatedExprs/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/CorrelatedExprs/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/CorrelatedExprs/switch.ll b/test/Transforms/CorrelatedExprs/switch.ll new file mode 100644 index 0000000..24b34b0 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/switch.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -cee -constprop -instcombine -dce | \ +; RUN: llvm-dis | not grep REMOVE +; END. + +int %test_case_values_should_propagate(int %A) { + switch int %A, label %D [ + int 40, label %C1 + int 41, label %C2 + int 42, label %C3 + ] +C1: + %REMOVE1 = add int %A, 2 ; Should be 42. + ret int %REMOVE1 +C2: + %REMOVE2 = add int %A, 3 ; Should be 44. + ret int %REMOVE2 +C3: + %REMOVE3 = add int %A, 4 ; Should be 46. + ret int %REMOVE3 +D: + ret int 10 +} diff --git a/test/Transforms/CorrelatedExprs/whet.ll b/test/Transforms/CorrelatedExprs/whet.ll new file mode 100644 index 0000000..aede002 --- /dev/null +++ b/test/Transforms/CorrelatedExprs/whet.ll @@ -0,0 +1,46 @@ +; This code snippet is derived from the following "whetstone" style code: +; int whet(int j) { +; if (j == 1) j = 2; +; else j = 7; +; if (j > 2) j = 0; +; else j = 3; +; if (j < 1) j = 10; +; else j = 0; +; return j; +;} +; +; This should eliminate all BB's except BB0, BB9, BB10 +; +; RUN: llvm-upgrade < %s | llvm-as | opt -cee -instcombine -simplifycfg | \ +; RUN: llvm-dis | not grep {bb\[2-8\]} + +implementation ; Functions: + +int %whet(int %j) { +bb0: ; No predecessors! + %cond220 = setne int %j, 1 ; <bool> [#uses=1] + br bool %cond220, label %bb3, label %bb4 + +bb3: ; preds = %bb0 + br label %bb4 + +bb4: ; preds = %bb3, %bb0 + %reg111 = phi int [ 7, %bb3 ], [ 2, %bb0 ] ; <int> [#uses=1] + %cond222 = setle int %reg111, 2 ; <bool> [#uses=1] + br bool %cond222, label %bb6, label %bb7 + +bb6: ; preds = %bb4 + br label %bb7 + +bb7: ; preds = %bb6, %bb4 + %reg114 = phi int [ 3, %bb6 ], [ 0, %bb4 ] ; <int> [#uses=1] + %cond225 = setgt int %reg114, 0 ; <bool> [#uses=1] + br bool %cond225, label %bb9, label %bb10 + +bb9: ; preds = %bb7 + br label %bb10 + +bb10: ; preds = %bb9, %bb7 + %reg117 = phi int [ 0, %bb9 ], [ 10, %bb7 ] ; <int> [#uses=1] + ret int %reg117 +} diff --git a/test/Transforms/DeadArgElim/2006-06-27-struct-ret.ll b/test/Transforms/DeadArgElim/2006-06-27-struct-ret.ll new file mode 100644 index 0000000..2a7b3a1 --- /dev/null +++ b/test/Transforms/DeadArgElim/2006-06-27-struct-ret.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim -disable-output + +implementation + +internal csretcc void %build_delaunay({int}* %agg.result) { + ret void +} + +void %test() { + call csretcc void %build_delaunay({int}* null) + ret void +} + diff --git a/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll b/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll new file mode 100644 index 0000000..2b3a2ea --- /dev/null +++ b/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -deadargelim | llvm-dis | grep {@test(} +; RUN: llvm-as < %s | opt -deadargelim | llvm-dis | not grep dead + +define internal i32 @test(i32 %X, i32 %dead) { + ret i32 %X +} + +define i32 @caller() { + %A = call i32 @test(i32 123, i32 456) + ret i32 %A +} diff --git a/test/Transforms/DeadArgElim/basictest.ll b/test/Transforms/DeadArgElim/basictest.ll new file mode 100644 index 0000000..a3a4235 --- /dev/null +++ b/test/Transforms/DeadArgElim/basictest.ll @@ -0,0 +1,37 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim | llvm-dis | not grep DEADARG + +implementation + +; test - an obviously dead argument +internal int %test(int %v, int %DEADARG1, int* %p) { + store int %v, int* %p + ret int %v +} + +; hardertest - an argument which is only used by a call of a function with a +; dead argument. +internal int %hardertest(int %DEADARG2) { + %p = alloca int + %V = call int %test(int 5, int %DEADARG2, int* %p) + ret int %V +} + +; evenhardertest - recursive dead argument... +internal void %evenhardertest(int %DEADARG3) { + call void %evenhardertest(int %DEADARG3) + ret void +} + +internal void %needarg(int %TEST) { + call int %needarg2(int %TEST) + ret void +} + +internal int %needarg2(int %TEST) { + ret int %TEST +} + +internal void %needarg3(int %TEST3) { + call void %needarg(int %TEST3) + ret void +} diff --git a/test/Transforms/DeadArgElim/dead_vaargs.ll b/test/Transforms/DeadArgElim/dead_vaargs.ll new file mode 100644 index 0000000..ecb84cc --- /dev/null +++ b/test/Transforms/DeadArgElim/dead_vaargs.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim | llvm-dis | not grep 47 +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim | llvm-dis | not grep 1.0 + +int %bar(int %A) { + %tmp4 = tail call int (int, ...)* %foo( int %A, int %A, int %A, int %A, ulong 47, double 1.000000e+00 ) + ret int %tmp4 +} + +internal int %foo(int %X, ...) { + ret int %X +} + diff --git a/test/Transforms/DeadArgElim/deadretval.ll b/test/Transforms/DeadArgElim/deadretval.ll new file mode 100644 index 0000000..ccfbc2f --- /dev/null +++ b/test/Transforms/DeadArgElim/deadretval.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim | llvm-dis | not grep DEAD + +implementation + +internal int %test(int %DEADARG) { ; Dead arg only used by dead retval + ret int %DEADARG +} + +int %test2(int %A) { + %DEAD = call int %test(int %A) + ret int 123 +} + +int %test3() { + %X = call int %test2(int 3232) + %Y = add int %X, -123 + ret int %Y +} + diff --git a/test/Transforms/DeadArgElim/deadretval2.ll b/test/Transforms/DeadArgElim/deadretval2.ll new file mode 100644 index 0000000..4f129ab --- /dev/null +++ b/test/Transforms/DeadArgElim/deadretval2.ll @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -deadargelim -die | llvm-dis | not grep DEAD + +%P = external global int + +implementation + + +internal int %test(int %DEADARG) { ; Dead arg only used by dead retval + ret int %DEADARG +} + +internal int %test2(int %DEADARG) { + %DEADRETVAL = call int %test(int %DEADARG) + ret int %DEADRETVAL +} + +void %test3(int %X) { + %DEADRETVAL = call int %test2(int %X) + ret void +} + +internal int %foo() { + %DEAD = load int* %P + ret int %DEAD +} + +internal int %id(int %X) { + ret int %X +} + +void %test4() { + %DEAD = call int %foo() + %DEAD2 = call int %id(int %DEAD) + ret void +} + diff --git a/test/Transforms/DeadArgElim/dg.exp b/test/Transforms/DeadArgElim/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/DeadArgElim/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll b/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll new file mode 100644 index 0000000..36afb24 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse -scalarrepl -instcombine | \ +; RUN: llvm-dis | not grep {ret int undef} + +int %test(double %__x) { + %__u = alloca { [3 x int] } + %tmp.1 = cast { [3 x int] }* %__u to double* + store double %__x, double* %tmp.1 + %tmp.4 = getelementptr { [3 x int] }* %__u, int 0, uint 0, int 1 + %tmp.5 = load int* %tmp.4 + %tmp.6 = setlt int %tmp.5, 0 + %tmp.7 = cast bool %tmp.6 to int + ret int %tmp.7 +} + diff --git a/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll b/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll new file mode 100644 index 0000000..ec48e46 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \ +; RUN: grep {store i32 1234567} + +; Do not delete stores that are only partially killed. + +int %test() { + %V = alloca int + store int 1234567, int* %V + %V2 = cast int* %V to sbyte* + store sbyte 0, sbyte* %V2 + %X = load int* %V + ret int %X +} diff --git a/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll b/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll new file mode 100644 index 0000000..58b253c --- /dev/null +++ b/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | grep store + +double %foo(sbyte* %X) { + %X_addr = alloca sbyte* + store sbyte* %X, sbyte** %X_addr ;; not a dead store. + %tmp.0 = va_arg sbyte** %X_addr, double + ret double %tmp.0 +} + diff --git a/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll b/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll new file mode 100644 index 0000000..5deaef4 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll @@ -0,0 +1,1116 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalsmodref-aa -dse -disable-output +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8" + %struct.ECacheType = type { uint, uint, int } + %struct.FILE = type { ubyte*, int, int, short, short, %struct.__sbuf, int, sbyte*, int (sbyte*)*, int (sbyte*, sbyte*, int)*, long (sbyte*, long, int)*, int (sbyte*, sbyte*, int)*, %struct.__sbuf, %struct.__sFILEX*, int, [3 x ubyte], [1 x ubyte], %struct.__sbuf, int, long } + %struct.QTType = type { sbyte, sbyte, ushort, uint, uint, int } + %struct.TType = type { sbyte, sbyte, sbyte, sbyte, ushort, uint, uint, int } + %struct._RuneEntry = type { int, int, int, uint* } + %struct._RuneLocale = type { [8 x sbyte], [32 x sbyte], int (sbyte*, uint, sbyte**)*, int (int, sbyte*, uint, sbyte**)*, int, [256 x uint], [256 x int], [256 x int], %struct._RuneRange, %struct._RuneRange, %struct._RuneRange, sbyte*, int } + %struct._RuneRange = type { int, %struct._RuneEntry* } + %struct.__sFILEX = type opaque + %struct.__sbuf = type { ubyte*, int } + %struct.move_s = type { int, int, int, int, int, int } + %struct.move_x = type { int, int, int, int } + %struct.node_t = type { ubyte, ubyte, ubyte, ubyte, int, int, %struct.node_t**, %struct.node_t*, %struct.move_s } + %struct.see_data = type { int, int } +%rook_o.2925 = internal global [4 x int] [ int 12, int -12, int 1, int -1 ] ; <[4 x int]*> [#uses=0] +%bishop_o.2926 = internal global [4 x int] [ int 11, int -11, int 13, int -13 ] ; <[4 x int]*> [#uses=0] +%knight_o.2927 = internal global [8 x int] [ int 10, int -10, int 14, int -14, int 23, int -23, int 25, int -25 ] ; <[8 x int]*> [#uses=0] +%board = internal global [144 x int] zeroinitializer ; <[144 x int]*> [#uses=0] +%holding = internal global [2 x [16 x int]] zeroinitializer ; <[2 x [16 x int]]*> [#uses=0] +%hold_hash = internal global uint 0 ; <uint*> [#uses=0] +%white_hand_eval = internal global int 0 ; <int*> [#uses=0] +%black_hand_eval = internal global int 0 ; <int*> [#uses=0] +%num_holding = internal global [2 x int] zeroinitializer ; <[2 x int]*> [#uses=0] +%zobrist = internal global [14 x [144 x uint]] zeroinitializer ; <[14 x [144 x uint]]*> [#uses=0] +%Variant = internal global int 0 ; <int*> [#uses=7] +%userealholdings.b = internal global bool false ; <bool*> [#uses=1] +%realholdings = internal global [255 x sbyte] zeroinitializer ; <[255 x sbyte]*> [#uses=0] +%comp_color = internal global int 0 ; <int*> [#uses=0] +%C.97.3177 = internal global [13 x int] [ int 0, int 2, int 1, int 4, int 3, int 0, int 0, int 8, int 7, int 10, int 9, int 12, int 11 ] ; <[13 x int]*> [#uses=0] +%str = internal global [30 x sbyte] c"%s:%u: failed assertion `%s'\0A\00" ; <[30 x sbyte]*> [#uses=0] +%str = internal global [81 x sbyte] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/crazy.c\00" ; <[81 x sbyte]*> [#uses=0] +%str = internal global [32 x sbyte] c"piece > frame && piece < npiece\00" ; <[32 x sbyte]*> [#uses=0] +%C.101.3190 = internal global [13 x int] [ int 0, int 2, int 1, int 2, int 1, int 0, int 0, int 2, int 1, int 2, int 1, int 2, int 1 ] ; <[13 x int]*> [#uses=0] +%hand_value = internal global [13 x int] [ int 0, int 100, int -100, int 210, int -210, int 0, int 0, int 250, int -250, int 450, int -450, int 230, int -230 ] ; <[13 x int]*> [#uses=0] +%material = internal global [14 x int] zeroinitializer ; <[14 x int]*> [#uses=0] +%Material = internal global int 0 ; <int*> [#uses=0] +%str = internal global [23 x sbyte] c"holding[who][what] > 0\00" ; <[23 x sbyte]*> [#uses=0] +%str = internal global [24 x sbyte] c"holding[who][what] < 20\00" ; <[24 x sbyte]*> [#uses=0] +%fifty = internal global int 0 ; <int*> [#uses=0] +%move_number = internal global int 0 ; <int*> [#uses=1] +%ply = internal global int 0 ; <int*> [#uses=2] +%hash_history = internal global [600 x uint] zeroinitializer ; <[600 x uint]*> [#uses=1] +%hash = internal global uint 0 ; <uint*> [#uses=1] +%ECacheSize.b = internal global bool false ; <bool*> [#uses=1] +%ECache = internal global %struct.ECacheType* null ; <%struct.ECacheType**> [#uses=1] +%ECacheProbes = internal global uint 0 ; <uint*> [#uses=1] +%ECacheHits = internal global uint 0 ; <uint*> [#uses=1] +%str = internal global [34 x sbyte] c"Out of memory allocating ECache.\0A\00" ; <[34 x sbyte]*> [#uses=0] +%rankoffsets.2930 = internal global [8 x int] [ int 110, int 98, int 86, int 74, int 62, int 50, int 38, int 26 ] ; <[8 x int]*> [#uses=0] +%white_castled = internal global int 0 ; <int*> [#uses=0] +%black_castled = internal global int 0 ; <int*> [#uses=0] +%book_ply = internal global int 0 ; <int*> [#uses=0] +%bking_loc = internal global int 0 ; <int*> [#uses=1] +%wking_loc = internal global int 0 ; <int*> [#uses=1] +%white_to_move = internal global int 0 ; <int*> [#uses=3] +%moved = internal global [144 x int] zeroinitializer ; <[144 x int]*> [#uses=0] +%ep_square = internal global int 0 ; <int*> [#uses=0] +%_DefaultRuneLocale = external global %struct._RuneLocale ; <%struct._RuneLocale*> [#uses=0] +%str = internal global [3 x sbyte] c"bm\00" ; <[3 x sbyte]*> [#uses=0] +%str1 = internal global [3 x sbyte] c"am\00" ; <[3 x sbyte]*> [#uses=0] +%str1 = internal global [34 x sbyte] c"No best-move or avoid-move found!\00" ; <[34 x sbyte]*> [#uses=0] +%str = internal global [25 x sbyte] c"\0AName of EPD testsuite: \00" ; <[25 x sbyte]*> [#uses=0] +%__sF = external global [0 x %struct.FILE] ; <[0 x %struct.FILE]*> [#uses=0] +%str = internal global [21 x sbyte] c"\0ATime per move (s): \00" ; <[21 x sbyte]*> [#uses=0] +%str = internal global [2 x sbyte] c"\0A\00" ; <[2 x sbyte]*> [#uses=0] +%str2 = internal global [2 x sbyte] c"r\00" ; <[2 x sbyte]*> [#uses=0] +%root_to_move = internal global int 0 ; <int*> [#uses=1] +%forcedwin.b = internal global bool false ; <bool*> [#uses=2] +%fixed_time = internal global int 0 ; <int*> [#uses=1] +%nodes = internal global int 0 ; <int*> [#uses=1] +%qnodes = internal global int 0 ; <int*> [#uses=1] +%str = internal global [29 x sbyte] c"\0ANodes: %i (%0.2f%% qnodes)\0A\00" ; <[29 x sbyte]*> [#uses=0] +%str = internal global [54 x sbyte] c"ECacheProbes : %u ECacheHits : %u HitRate : %f%%\0A\00" ; <[54 x sbyte]*> [#uses=0] +%TTStores = internal global uint 0 ; <uint*> [#uses=1] +%TTProbes = internal global uint 0 ; <uint*> [#uses=1] +%TTHits = internal global uint 0 ; <uint*> [#uses=1] +%str = internal global [60 x sbyte] c"TTStores : %u TTProbes : %u TTHits : %u HitRate : %f%%\0A\00" ; <[60 x sbyte]*> [#uses=0] +%NTries = internal global uint 0 ; <uint*> [#uses=1] +%NCuts = internal global uint 0 ; <uint*> [#uses=1] +%TExt = internal global uint 0 ; <uint*> [#uses=1] +%str = internal global [51 x sbyte] c"NTries : %u NCuts : %u CutRate : %f%% TExt: %u\0A\00" ; <[51 x sbyte]*> [#uses=0] +%ext_check = internal global uint 0 ; <uint*> [#uses=1] +%razor_drop = internal global uint 0 ; <uint*> [#uses=1] +%razor_material = internal global uint 0 ; <uint*> [#uses=1] +%str = internal global [61 x sbyte] c"Check extensions: %u Razor drops : %u Razor Material : %u\0A\00" ; <[61 x sbyte]*> [#uses=0] +%FHF = internal global uint 0 ; <uint*> [#uses=1] +%FH = internal global uint 0 ; <uint*> [#uses=1] +%str = internal global [22 x sbyte] c"Move ordering : %f%%\0A\00" ; <[22 x sbyte]*> [#uses=0] +%maxposdiff = internal global int 0 ; <int*> [#uses=1] +%str = internal global [47 x sbyte] c"Material score: %d Eval : %d MaxPosDiff: %d\0A\00" ; <[47 x sbyte]*> [#uses=0] +%str = internal global [17 x sbyte] c"Solution found.\0A\00" ; <[17 x sbyte]*> [#uses=0] +%str3 = internal global [21 x sbyte] c"Solution not found.\0A\00" ; <[21 x sbyte]*> [#uses=0] +%str = internal global [15 x sbyte] c"Solved: %d/%d\0A\00" ; <[15 x sbyte]*> [#uses=0] +%str = internal global [9 x sbyte] c"EPD: %s\0A\00" ; <[9 x sbyte]*> [#uses=0] +%str4 = internal global [21 x sbyte] c"Searching to %d ply\0A\00" ; <[21 x sbyte]*> [#uses=0] +%maxdepth = internal global int 0 ; <int*> [#uses=0] +%std_material = internal global [14 x int] [ int 0, int 100, int -100, int 310, int -310, int 4000, int -4000, int 500, int -500, int 900, int -900, int 325, int -325, int 0 ] ; <[14 x int]*> [#uses=0] +%zh_material = internal global [14 x int] [ int 0, int 100, int -100, int 210, int -210, int 4000, int -4000, int 250, int -250, int 450, int -450, int 230, int -230, int 0 ] ; <[14 x int]*> [#uses=0] +%suicide_material = internal global [14 x int] [ int 0, int 15, int -15, int 150, int -150, int 500, int -500, int 150, int -150, int 50, int -50, int 0, int 0, int 0 ] ; <[14 x int]*> [#uses=0] +%losers_material = internal global [14 x int] [ int 0, int 80, int -80, int 320, int -320, int 1000, int -1000, int 350, int -350, int 400, int -400, int 270, int -270, int 0 ] ; <[14 x int]*> [#uses=0] +%Xfile = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%Xrank = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 1, int 1, int 1, int 1, int 1, int 1, int 1, int 0, int 0, int 0, int 0, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 0, int 0, int 0, int 0, int 3, int 3, int 3, int 3, int 3, int 3, int 3, int 3, int 0, int 0, int 0, int 0, int 4, int 4, int 4, int 4, int 4, int 4, int 4, int 4, int 0, int 0, int 0, int 0, int 5, int 5, int 5, int 5, int 5, int 5, int 5, int 5, int 0, int 0, int 0, int 0, int 6, int 6, int 6, int 6, int 6, int 6, int 6, int 6, int 0, int 0, int 0, int 0, int 7, int 7, int 7, int 7, int 7, int 7, int 7, int 7, int 0, int 0, int 0, int 0, int 8, int 8, int 8, int 8, int 8, int 8, int 8, int 8, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%Xdiagl = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 9, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 0, int 0, int 0, int 0, int 10, int 9, int 1, int 2, int 3, int 4, int 5, int 6, int 0, int 0, int 0, int 0, int 11, int 10, int 9, int 1, int 2, int 3, int 4, int 5, int 0, int 0, int 0, int 0, int 12, int 11, int 10, int 9, int 1, int 2, int 3, int 4, int 0, int 0, int 0, int 0, int 13, int 12, int 11, int 10, int 9, int 1, int 2, int 3, int 0, int 0, int 0, int 0, int 14, int 13, int 12, int 11, int 10, int 9, int 1, int 2, int 0, int 0, int 0, int 0, int 15, int 14, int 13, int 12, int 11, int 10, int 9, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%Xdiagr = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 15, int 14, int 13, int 12, int 11, int 10, int 9, int 1, int 0, int 0, int 0, int 0, int 14, int 13, int 12, int 11, int 10, int 9, int 1, int 2, int 0, int 0, int 0, int 0, int 13, int 12, int 11, int 10, int 9, int 1, int 2, int 3, int 0, int 0, int 0, int 0, int 12, int 11, int 10, int 9, int 1, int 2, int 3, int 4, int 0, int 0, int 0, int 0, int 11, int 10, int 9, int 1, int 2, int 3, int 4, int 5, int 0, int 0, int 0, int 0, int 10, int 9, int 1, int 2, int 3, int 4, int 5, int 6, int 0, int 0, int 0, int 0, int 9, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%sqcolor = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%pcsqbishop = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -5, int -5, int -10, int -5, int -5, int -10, int -5, int -5, int 0, int 0, int 0, int 0, int -5, int 10, int 5, int 10, int 10, int 5, int 10, int -5, int 0, int 0, int 0, int 0, int -5, int 5, int 6, int 15, int 15, int 6, int 5, int -5, int 0, int 0, int 0, int 0, int -5, int 3, int 15, int 10, int 10, int 15, int 3, int -5, int 0, int 0, int 0, int 0, int -5, int 3, int 15, int 10, int 10, int 15, int 3, int -5, int 0, int 0, int 0, int 0, int -5, int 5, int 6, int 15, int 15, int 6, int 5, int -5, int 0, int 0, int 0, int 0, int -5, int 10, int 5, int 10, int 10, int 5, int 10, int -5, int 0, int 0, int 0, int 0, int -5, int -5, int -10, int -5, int -5, int -10, int -5, int -5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%black_knight = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int -10, int 15, int 25, int 25, int 25, int 25, int 15, int -10, int 0, int 0, int 0, int 0, int -10, int 15, int 25, int 35, int 35, int 35, int 15, int -10, int 0, int 0, int 0, int 0, int -10, int 10, int 25, int 20, int 25, int 25, int 10, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 20, int 20, int 20, int 20, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 15, int 15, int 15, int 15, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 0, int 3, int 3, int 0, int 0, int -10, int 0, int 0, int 0, int 0, int -20, int -35, int -10, int -10, int -10, int -10, int -35, int -20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%white_knight = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -20, int -35, int -10, int -10, int -10, int -10, int -35, int -20, int 0, int 0, int 0, int 0, int -10, int 0, int 0, int 3, int 3, int 0, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 15, int 15, int 15, int 15, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 20, int 20, int 20, int 20, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 10, int 25, int 20, int 25, int 25, int 10, int -10, int 0, int 0, int 0, int 0, int -10, int 15, int 25, int 35, int 35, int 35, int 15, int -10, int 0, int 0, int 0, int 0, int -10, int 15, int 25, int 25, int 25, int 25, int 15, int -10, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%white_pawn = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 25, int 25, int 35, int 5, int 5, int 50, int 45, int 30, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 7, int 5, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 14, int 14, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 10, int 20, int 20, int 10, int 5, int 5, int 0, int 0, int 0, int 0, int 12, int 18, int 18, int 27, int 27, int 18, int 18, int 18, int 0, int 0, int 0, int 0, int 25, int 30, int 30, int 35, int 35, int 35, int 30, int 25, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%black_pawn = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 30, int 30, int 30, int 35, int 35, int 35, int 30, int 25, int 0, int 0, int 0, int 0, int 12, int 18, int 18, int 27, int 27, int 18, int 18, int 18, int 0, int 0, int 0, int 0, int 0, int 0, int 10, int 20, int 20, int 10, int 5, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 14, int 14, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 7, int 5, int 5, int 0, int 0, int 0, int 0, int 0, int 25, int 25, int 35, int 5, int 5, int 50, int 45, int 30, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%white_king = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -100, int 7, int 4, int 0, int 10, int 4, int 7, int -100, int 0, int 0, int 0, int 0, int -250, int -200, int -150, int -100, int -100, int -150, int -200, int -250, int 0, int 0, int 0, int 0, int -350, int -300, int -300, int -250, int -250, int -300, int -300, int -350, int 0, int 0, int 0, int 0, int -400, int -400, int -400, int -350, int -350, int -400, int -400, int -400, int 0, int 0, int 0, int 0, int -450, int -450, int -450, int -450, int -450, int -450, int -450, int -450, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%black_king = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int -500, int 0, int 0, int 0, int 0, int -450, int -450, int -450, int -450, int -450, int -450, int -450, int -450, int 0, int 0, int 0, int 0, int -400, int -400, int -400, int -350, int -350, int -400, int -400, int -400, int 0, int 0, int 0, int 0, int -350, int -300, int -300, int -250, int -250, int -300, int -300, int -350, int 0, int 0, int 0, int 0, int -250, int -200, int -150, int -100, int -100, int -150, int -200, int -250, int 0, int 0, int 0, int 0, int -100, int 7, int 4, int 0, int 10, int 4, int 7, int -100, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%black_queen = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 5, int 5, int 5, int 10, int 10, int 5, int 5, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 3, int 3, int 3, int 3, int 3, int 0, int 0, int 0, int 0, int 0, int -30, int -30, int -30, int -30, int -30, int -30, int -30, int -30, int 0, int 0, int 0, int 0, int -60, int -40, int -40, int -60, int -60, int -40, int -40, int -60, int 0, int 0, int 0, int 0, int -40, int -40, int -40, int -40, int -40, int -40, int -40, int -40, int 0, int 0, int 0, int 0, int -15, int -15, int -15, int -10, int -10, int -15, int -15, int -15, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 10, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%white_queen = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 10, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int -15, int -15, int -15, int -10, int -10, int -15, int -15, int -15, int 0, int 0, int 0, int 0, int -40, int -40, int -40, int -40, int -40, int -40, int -40, int -40, int 0, int 0, int 0, int 0, int -60, int -40, int -40, int -60, int -60, int -40, int -40, int -60, int 0, int 0, int 0, int 0, int -30, int -30, int -30, int -30, int -30, int -30, int -30, int -30, int 0, int 0, int 0, int 0, int 0, int 0, int 3, int 3, int 3, int 3, int 3, int 0, int 0, int 0, int 0, int 0, int 5, int 5, int 5, int 10, int 10, int 5, int 5, int 5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%black_rook = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 10, int 15, int 20, int 25, int 25, int 20, int 15, int 10, int 0, int 0, int 0, int 0, int 0, int 10, int 15, int 20, int 20, int 15, int 10, int 0, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -30, int -30, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int -15, int -15, int -15, int -10, int -10, int -15, int -15, int -15, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 10, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%white_rook = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 2, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 7, int 10, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -15, int -15, int -15, int -10, int -10, int -15, int -15, int -15, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -30, int -30, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int -20, int 0, int 0, int 0, int 0, int 0, int 10, int 15, int 20, int 20, int 15, int 10, int 0, int 0, int 0, int 0, int 0, int 10, int 15, int 20, int 25, int 25, int 20, int 15, int 10, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%upscale = internal global [64 x int] [ int 26, int 27, int 28, int 29, int 30, int 31, int 32, int 33, int 38, int 39, int 40, int 41, int 42, int 43, int 44, int 45, int 50, int 51, int 52, int 53, int 54, int 55, int 56, int 57, int 62, int 63, int 64, int 65, int 66, int 67, int 68, int 69, int 74, int 75, int 76, int 77, int 78, int 79, int 80, int 81, int 86, int 87, int 88, int 89, int 90, int 91, int 92, int 93, int 98, int 99, int 100, int 101, int 102, int 103, int 104, int 105, int 110, int 111, int 112, int 113, int 114, int 115, int 116, int 117 ] ; <[64 x int]*> [#uses=0] +%pre_p_tropism = internal global [9 x int] [ int 9999, int 40, int 20, int 10, int 3, int 1, int 1, int 0, int 9999 ] ; <[9 x int]*> [#uses=0] +%pre_r_tropism = internal global [9 x int] [ int 9999, int 50, int 40, int 15, int 5, int 1, int 1, int 0, int 9999 ] ; <[9 x int]*> [#uses=0] +%pre_n_tropism = internal global [9 x int] [ int 9999, int 50, int 70, int 35, int 10, int 2, int 1, int 0, int 9999 ] ; <[9 x int]*> [#uses=0] +%pre_q_tropism = internal global [9 x int] [ int 9999, int 100, int 60, int 20, int 5, int 2, int 0, int 0, int 9999 ] ; <[9 x int]*> [#uses=0] +%pre_b_tropism = internal global [9 x int] [ int 9999, int 50, int 25, int 15, int 5, int 2, int 2, int 2, int 9999 ] ; <[9 x int]*> [#uses=0] +%rookdistance = internal global [144 x [144 x int]] zeroinitializer ; <[144 x [144 x int]]*> [#uses=0] +%distance = internal global [144 x [144 x int]] zeroinitializer ; <[144 x [144 x int]]*> [#uses=0] +%p_tropism = internal global [144 x [144 x ubyte]] zeroinitializer ; <[144 x [144 x ubyte]]*> [#uses=0] +%b_tropism = internal global [144 x [144 x ubyte]] zeroinitializer ; <[144 x [144 x ubyte]]*> [#uses=0] +%n_tropism = internal global [144 x [144 x ubyte]] zeroinitializer ; <[144 x [144 x ubyte]]*> [#uses=0] +%r_tropism = internal global [144 x [144 x ubyte]] zeroinitializer ; <[144 x [144 x ubyte]]*> [#uses=0] +%q_tropism = internal global [144 x [144 x ubyte]] zeroinitializer ; <[144 x [144 x ubyte]]*> [#uses=0] +%cfg_devscale.b = internal global bool false ; <bool*> [#uses=0] +%pieces = internal global [62 x int] zeroinitializer ; <[62 x int]*> [#uses=0] +%piece_count = internal global int 0 ; <int*> [#uses=1] +%cfg_smarteval.b = internal global bool false ; <bool*> [#uses=0] +%lcentral = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -20, int -15, int -15, int -15, int -15, int -15, int -15, int -20, int 0, int 0, int 0, int 0, int -15, int 0, int 3, int 5, int 5, int 3, int 0, int -15, int 0, int 0, int 0, int 0, int -15, int 0, int 15, int 15, int 15, int 15, int 0, int -15, int 0, int 0, int 0, int 0, int -15, int 0, int 15, int 30, int 30, int 15, int 0, int -15, int 0, int 0, int 0, int 0, int -15, int 0, int 15, int 30, int 30, int 15, int 0, int -15, int 0, int 0, int 0, int 0, int -15, int 0, int 15, int 15, int 15, int 15, int 0, int -15, int 0, int 0, int 0, int 0, int -15, int 0, int 3, int 5, int 5, int 3, int 0, int -15, int 0, int 0, int 0, int 0, int -20, int -15, int -15, int -15, int -15, int -15, int -15, int -20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%str3 = internal global [81 x sbyte] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/leval.c\00" ; <[81 x sbyte]*> [#uses=0] +%str5 = internal global [21 x sbyte] c"(i > 0) && (i < 145)\00" ; <[21 x sbyte]*> [#uses=0] +%kingcap.b = internal global bool false ; <bool*> [#uses=0] +%numb_moves = internal global int 0 ; <int*> [#uses=2] +%genfor = internal global %struct.move_s* null ; <%struct.move_s**> [#uses=0] +%captures = internal global uint 0 ; <uint*> [#uses=1] +%fcaptures.b = internal global bool false ; <bool*> [#uses=0] +%gfrom = internal global int 0 ; <int*> [#uses=0] +%Giveaway.b = internal global bool false ; <bool*> [#uses=0] +%path_x = internal global [300 x %struct.move_x] zeroinitializer ; <[300 x %struct.move_x]*> [#uses=0] +%str7 = internal global [81 x sbyte] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/moves.c\00" ; <[81 x sbyte]*> [#uses=0] +%str8 = internal global [15 x sbyte] c"find_slot < 63\00" ; <[15 x sbyte]*> [#uses=0] +%is_promoted = internal global [62 x int] zeroinitializer ; <[62 x int]*> [#uses=0] +%squares = internal global [144 x int] zeroinitializer ; <[144 x int]*> [#uses=0] +%str = internal global [38 x sbyte] c"promoted > frame && promoted < npiece\00" ; <[38 x sbyte]*> [#uses=0] +%str1 = internal global [38 x sbyte] c"promoted < npiece && promoted > frame\00" ; <[38 x sbyte]*> [#uses=0] +%evalRoutines = internal global [7 x int (int, int)*] [ int (int, int)* %ErrorIt, int (int, int)* %Pawn, int (int, int)* %Knight, int (int, int)* %King, int (int, int)* %Rook, int (int, int)* %Queen, int (int, int)* %Bishop ] ; <[7 x int (int, int)*]*> [#uses=0] +%sbishop = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -2, int -2, int -2, int -2, int -2, int -2, int -2, int -2, int 0, int 0, int 0, int 0, int -2, int 8, int 5, int 5, int 5, int 5, int 8, int -2, int 0, int 0, int 0, int 0, int -2, int 3, int 3, int 5, int 5, int 3, int 3, int -2, int 0, int 0, int 0, int 0, int -2, int 2, int 5, int 4, int 4, int 5, int 2, int -2, int 0, int 0, int 0, int 0, int -2, int 2, int 5, int 4, int 4, int 5, int 2, int -2, int 0, int 0, int 0, int 0, int -2, int 3, int 3, int 5, int 5, int 3, int 3, int -2, int 0, int 0, int 0, int 0, int -2, int 8, int 5, int 5, int 5, int 5, int 8, int -2, int 0, int 0, int 0, int 0, int -2, int -2, int -2, int -2, int -2, int -2, int -2, int -2, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%sknight = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int -10, int 0, int 0, int 3, int 3, int 0, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 5, int 5, int 5, int 5, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 5, int 10, int 10, int 5, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 5, int 10, int 10, int 5, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 5, int 5, int 5, int 5, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 0, int 3, int 3, int 0, int 0, int -10, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%swhite_pawn = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 10, int 10, int 3, int 2, int 1, int 0, int 0, int 0, int 0, int 2, int 4, int 6, int 12, int 12, int 6, int 4, int 2, int 0, int 0, int 0, int 0, int 3, int 6, int 9, int 14, int 14, int 9, int 6, int 3, int 0, int 0, int 0, int 0, int 10, int 12, int 14, int 16, int 16, int 14, int 12, int 10, int 0, int 0, int 0, int 0, int 20, int 22, int 24, int 26, int 26, int 24, int 22, int 20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%sblack_pawn = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 20, int 22, int 24, int 26, int 26, int 24, int 22, int 20, int 0, int 0, int 0, int 0, int 10, int 12, int 14, int 16, int 16, int 14, int 12, int 10, int 0, int 0, int 0, int 0, int 3, int 6, int 9, int 14, int 14, int 9, int 6, int 3, int 0, int 0, int 0, int 0, int 2, int 4, int 6, int 12, int 12, int 6, int 4, int 2, int 0, int 0, int 0, int 0, int 1, int 2, int 3, int 10, int 10, int 3, int 2, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%swhite_king = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 2, int 14, int 0, int 0, int 0, int 9, int 14, int 2, int 0, int 0, int 0, int 0, int -3, int -5, int -6, int -6, int -6, int -6, int -5, int -3, int 0, int 0, int 0, int 0, int -5, int -5, int -8, int -8, int -8, int -8, int -5, int -5, int 0, int 0, int 0, int 0, int -8, int -8, int -13, int -13, int -13, int -13, int -8, int -8, int 0, int 0, int 0, int 0, int -13, int -13, int -21, int -21, int -21, int -21, int -13, int -13, int 0, int 0, int 0, int 0, int -21, int -21, int -34, int -34, int -34, int -34, int -21, int -21, int 0, int 0, int 0, int 0, int -34, int -34, int -55, int -55, int -55, int -55, int -34, int -34, int 0, int 0, int 0, int 0, int -55, int -55, int -89, int -89, int -89, int -89, int -55, int -55, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%sblack_king = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -55, int -55, int -89, int -89, int -89, int -89, int -55, int -55, int 0, int 0, int 0, int 0, int -34, int -34, int -55, int -55, int -55, int -55, int -34, int -34, int 0, int 0, int 0, int 0, int -21, int -21, int -34, int -34, int -34, int -34, int -21, int -21, int 0, int 0, int 0, int 0, int -13, int -13, int -21, int -21, int -21, int -21, int -13, int -13, int 0, int 0, int 0, int 0, int -8, int -8, int -13, int -13, int -13, int -13, int -8, int -8, int 0, int 0, int 0, int 0, int -5, int -5, int -8, int -8, int -8, int -8, int -5, int -5, int 0, int 0, int 0, int 0, int -3, int -5, int -6, int -6, int -6, int -6, int -5, int -3, int 0, int 0, int 0, int 0, int 2, int 14, int 0, int 0, int 0, int 9, int 14, int 2, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%send_king = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -5, int -3, int -1, int 0, int 0, int -1, int -3, int -5, int 0, int 0, int 0, int 0, int -3, int 10, int 10, int 10, int 10, int 10, int 10, int -3, int 0, int 0, int 0, int 0, int -1, int 10, int 25, int 25, int 25, int 25, int 10, int -1, int 0, int 0, int 0, int 0, int 0, int 10, int 25, int 50, int 50, int 25, int 10, int 0, int 0, int 0, int 0, int 0, int 0, int 10, int 25, int 50, int 50, int 25, int 10, int 0, int 0, int 0, int 0, int 0, int -1, int 10, int 25, int 25, int 25, int 25, int 10, int -1, int 0, int 0, int 0, int 0, int -3, int 10, int 10, int 10, int 10, int 10, int 10, int -3, int 0, int 0, int 0, int 0, int -5, int -3, int -1, int 0, int 0, int -1, int -3, int -5, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%srev_rank = internal global [9 x int] [ int 0, int 8, int 7, int 6, int 5, int 4, int 3, int 2, int 1 ] ; <[9 x int]*> [#uses=0] +%std_p_tropism = internal global [8 x int] [ int 9999, int 15, int 10, int 7, int 2, int 0, int 0, int 0 ] ; <[8 x int]*> [#uses=0] +%std_own_p_tropism = internal global [8 x int] [ int 9999, int 30, int 10, int 2, int 0, int 0, int 0, int 0 ] ; <[8 x int]*> [#uses=0] +%std_r_tropism = internal global [16 x int] [ int 9999, int 0, int 15, int 5, int 2, int 1, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[16 x int]*> [#uses=0] +%std_n_tropism = internal global [8 x int] [ int 9999, int 14, int 9, int 6, int 1, int 0, int 0, int 0 ] ; <[8 x int]*> [#uses=0] +%std_q_tropism = internal global [8 x int] [ int 9999, int 200, int 50, int 15, int 3, int 2, int 1, int 0 ] ; <[8 x int]*> [#uses=0] +%std_b_tropism = internal global [8 x int] [ int 9999, int 12, int 7, int 5, int 0, int 0, int 0, int 0 ] ; <[8 x int]*> [#uses=0] +%phase = internal global int 0 ; <int*> [#uses=1] +%dir.3001 = internal global [4 x int] [ int -13, int -11, int 11, int 13 ] ; <[4 x int]*> [#uses=0] +%dir.3021 = internal global [4 x int] [ int -1, int 1, int 12, int -12 ] ; <[4 x int]*> [#uses=0] +%king_locs = internal global [2 x int] zeroinitializer ; <[2 x int]*> [#uses=0] +%square_d1.3081 = internal global [2 x int] [ int 29, int 113 ] ; <[2 x int]*> [#uses=0] +%wmat = internal global int 0 ; <int*> [#uses=0] +%bmat = internal global int 0 ; <int*> [#uses=0] +%str = internal global [35 x sbyte] c"Illegal piece detected sq=%i c=%i\0A\00" ; <[35 x sbyte]*> [#uses=0] +%str10 = internal global [81 x sbyte] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/neval.c\00" ; <[81 x sbyte]*> [#uses=0] +%std_hand_value = internal global [13 x int] [ int 0, int 100, int -100, int 210, int -210, int 0, int 0, int 250, int -250, int 450, int -450, int 230, int -230 ] ; <[13 x int]*> [#uses=0] +%xb_mode = internal global int 0 ; <int*> [#uses=0] +%str = internal global [69 x sbyte] c"tellics ptell Hello! I am Sjeng and hope you enjoy playing with me.\0A\00" ; <[69 x sbyte]*> [#uses=0] +%str = internal global [76 x sbyte] c"tellics ptell For help on some commands that I understand, ptell me 'help'\0A\00" ; <[76 x sbyte]*> [#uses=0] +%str12 = internal global [3 x sbyte] c"%s\00" ; <[3 x sbyte]*> [#uses=0] +%my_partner = internal global [256 x sbyte] zeroinitializer ; <[256 x sbyte]*> [#uses=0] +%str13 = internal global [25 x sbyte] c"tellics set f5 bughouse\0A\00" ; <[25 x sbyte]*> [#uses=0] +%str = internal global [16 x sbyte] c"tellics unseek\0A\00" ; <[16 x sbyte]*> [#uses=0] +%str = internal global [20 x sbyte] c"tellics set f5 1=1\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str = internal global [80 x sbyte] c"is...uh...what did you say?\0A\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" ; <[80 x sbyte]*> [#uses=0] +%str = internal global [5 x sbyte] c"help\00" ; <[5 x sbyte]*> [#uses=0] +%str = internal global [147 x sbyte] c"tellics ptell Commands that I understand are : sit, go, fast, slow, abort, flag, +/++/+++/-/--/---{p,n,b,r,q,d,h,trades}, x, dead, formula, help.\0A\00" ; <[147 x sbyte]*> [#uses=0] +%str = internal global [6 x sbyte] c"sorry\00" ; <[6 x sbyte]*> [#uses=0] +%str = internal global [59 x sbyte] c"tellics ptell Sorry, but I'm not playing a bughouse game.\0A\00" ; <[59 x sbyte]*> [#uses=0] +%str = internal global [4 x sbyte] c"sit\00" ; <[4 x sbyte]*> [#uses=0] +%str = internal global [56 x sbyte] c"tellics ptell Ok, I sit next move. Tell me when to go.\0A\00" ; <[56 x sbyte]*> [#uses=0] +%must_sit.b = internal global bool false ; <bool*> [#uses=0] +%str114 = internal global [3 x sbyte] c"go\00" ; <[3 x sbyte]*> [#uses=0] +%str2 = internal global [5 x sbyte] c"move\00" ; <[5 x sbyte]*> [#uses=0] +%str = internal global [31 x sbyte] c"tellics ptell Ok, I'm moving.\0A\00" ; <[31 x sbyte]*> [#uses=0] +%str3 = internal global [5 x sbyte] c"fast\00" ; <[5 x sbyte]*> [#uses=0] +%str4 = internal global [5 x sbyte] c"time\00" ; <[5 x sbyte]*> [#uses=0] +%str15 = internal global [35 x sbyte] c"tellics ptell Ok, I'm going FAST!\0A\00" ; <[35 x sbyte]*> [#uses=0] +%go_fast.b = internal global bool false ; <bool*> [#uses=0] +%str5 = internal global [5 x sbyte] c"slow\00" ; <[5 x sbyte]*> [#uses=0] +%str16 = internal global [36 x sbyte] c"tellics ptell Ok, moving normally.\0A\00" ; <[36 x sbyte]*> [#uses=0] +%str6 = internal global [6 x sbyte] c"abort\00" ; <[6 x sbyte]*> [#uses=0] +%str7 = internal global [35 x sbyte] c"tellics ptell Requesting abort...\0A\00" ; <[35 x sbyte]*> [#uses=0] +%str17 = internal global [15 x sbyte] c"tellics abort\0A\00" ; <[15 x sbyte]*> [#uses=0] +%str8 = internal global [5 x sbyte] c"flag\00" ; <[5 x sbyte]*> [#uses=0] +%str = internal global [27 x sbyte] c"tellics ptell Flagging...\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str = internal global [14 x sbyte] c"tellics flag\0A\00" ; <[14 x sbyte]*> [#uses=0] +%str18 = internal global [2 x sbyte] c"+\00" ; <[2 x sbyte]*> [#uses=0] +%str9 = internal global [6 x sbyte] c"trade\00" ; <[6 x sbyte]*> [#uses=0] +%str10 = internal global [35 x sbyte] c"tellics ptell Ok, trading is GOOD\0A\00" ; <[35 x sbyte]*> [#uses=0] +%str11 = internal global [4 x sbyte] c"+++\00" ; <[4 x sbyte]*> [#uses=0] +%str12 = internal global [6 x sbyte] c"mates\00" ; <[6 x sbyte]*> [#uses=0] +%str13 = internal global [3 x sbyte] c"++\00" ; <[3 x sbyte]*> [#uses=0] +%str = internal global [49 x sbyte] c"is VERY good (ptell me 'x' to play normal again)\00" ; <[49 x sbyte]*> [#uses=0] +%str = internal global [44 x sbyte] c"is good (ptell me 'x' to play normal again)\00" ; <[44 x sbyte]*> [#uses=0] +%str19 = internal global [29 x sbyte] c"tellics ptell Ok, Knight %s\0A\00" ; <[29 x sbyte]*> [#uses=0] +%str14 = internal global [29 x sbyte] c"tellics ptell Ok, Bishop %s\0A\00" ; <[29 x sbyte]*> [#uses=0] +%str15 = internal global [27 x sbyte] c"tellics ptell Ok, Rook %s\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str = internal global [28 x sbyte] c"tellics ptell Ok, Queen %s\0A\00" ; <[28 x sbyte]*> [#uses=0] +%str16 = internal global [27 x sbyte] c"tellics ptell Ok, Pawn %s\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str17 = internal global [31 x sbyte] c"tellics ptell Ok, Diagonal %s\0A\00" ; <[31 x sbyte]*> [#uses=0] +%str18 = internal global [28 x sbyte] c"tellics ptell Ok, Heavy %s\0A\00" ; <[28 x sbyte]*> [#uses=0] +%str20 = internal global [34 x sbyte] c"tellics ptell Ok, trading is BAD\0A\00" ; <[34 x sbyte]*> [#uses=0] +%str20 = internal global [4 x sbyte] c"---\00" ; <[4 x sbyte]*> [#uses=0] +%str = internal global [53 x sbyte] c"mates you (ptell me 'x' when it no longer mates you)\00" ; <[53 x sbyte]*> [#uses=0] +%str21 = internal global [3 x sbyte] c"--\00" ; <[3 x sbyte]*> [#uses=0] +%str = internal global [52 x sbyte] c"is VERY bad (ptell me 'x' when it is no longer bad)\00" ; <[52 x sbyte]*> [#uses=0] +%str21 = internal global [47 x sbyte] c"is bad (ptell me 'x' when it is no longer bad)\00" ; <[47 x sbyte]*> [#uses=0] +%str23 = internal global [16 x sbyte] c"mate me anymore\00" ; <[16 x sbyte]*> [#uses=0] +%str24 = internal global [6 x sbyte] c"never\00" ; <[6 x sbyte]*> [#uses=0] +%str25 = internal global [5 x sbyte] c"mind\00" ; <[5 x sbyte]*> [#uses=0] +%str22 = internal global [9 x sbyte] c"ptell me\00" ; <[9 x sbyte]*> [#uses=0] +%str = internal global [55 x sbyte] c"tellics ptell Ok, reverting to STANDARD piece values!\0A\00" ; <[55 x sbyte]*> [#uses=0] +%partnerdead.b = internal global bool false ; <bool*> [#uses=0] +%piecedead.b = internal global bool false ; <bool*> [#uses=0] +%str = internal global [26 x sbyte] c"i'll have to sit...(dead)\00" ; <[26 x sbyte]*> [#uses=0] +%str27 = internal global [5 x sbyte] c"dead\00" ; <[5 x sbyte]*> [#uses=0] +%str28 = internal global [27 x sbyte] c"i'll have to sit...(piece)\00" ; <[27 x sbyte]*> [#uses=0] +%str29 = internal global [3 x sbyte] c"ok\00" ; <[3 x sbyte]*> [#uses=0] +%str30 = internal global [3 x sbyte] c"hi\00" ; <[3 x sbyte]*> [#uses=0] +%str31 = internal global [6 x sbyte] c"hello\00" ; <[6 x sbyte]*> [#uses=0] +%str32 = internal global [26 x sbyte] c"tellics ptell Greetings.\0A\00" ; <[26 x sbyte]*> [#uses=0] +%str = internal global [8 x sbyte] c"formula\00" ; <[8 x sbyte]*> [#uses=0] +%str = internal global [87 x sbyte] c"tellics ptell Setting formula, if you are still interrupted, complain to my operator.\0A\00" ; <[87 x sbyte]*> [#uses=0] +%str33 = internal global [59 x sbyte] c"tellics ptell Sorry, but I don't understand that command.\0A\00" ; <[59 x sbyte]*> [#uses=0] +%pawnmated.3298 = internal global int 0 ; <int*> [#uses=0] +%knightmated.3299 = internal global int 0 ; <int*> [#uses=0] +%bishopmated.3300 = internal global int 0 ; <int*> [#uses=0] +%rookmated.3301 = internal global int 0 ; <int*> [#uses=0] +%queenmated.3302 = internal global int 0 ; <int*> [#uses=0] +%str = internal global [41 x sbyte] c"tellics ptell p doesn't mate me anymore\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str34 = internal global [41 x sbyte] c"tellics ptell n doesn't mate me anymore\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str35 = internal global [41 x sbyte] c"tellics ptell b doesn't mate me anymore\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str36 = internal global [41 x sbyte] c"tellics ptell r doesn't mate me anymore\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str37 = internal global [41 x sbyte] c"tellics ptell q doesn't mate me anymore\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str38 = internal global [20 x sbyte] c"tellics ptell ---p\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str39 = internal global [20 x sbyte] c"tellics ptell ---n\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str40 = internal global [20 x sbyte] c"tellics ptell ---b\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str41 = internal global [20 x sbyte] c"tellics ptell ---r\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str42 = internal global [20 x sbyte] c"tellics ptell ---q\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str23 = internal global [17 x sbyte] c"tellics ptell x\0A\00" ; <[17 x sbyte]*> [#uses=0] +%str = internal global [18 x sbyte] c"tellics ptell go\0A\00" ; <[18 x sbyte]*> [#uses=0] +%bufftop = internal global int 0 ; <int*> [#uses=2] +%membuff = internal global ubyte* null ; <ubyte**> [#uses=3] +%maxply = internal global int 0 ; <int*> [#uses=1] +%forwards = internal global int 0 ; <int*> [#uses=1] +%nodecount = internal global int 0 ; <int*> [#uses=1] +%frees = internal global int 0 ; <int*> [#uses=0] +%PBSize.b = internal global bool false ; <bool*> [#uses=1] +%alllosers.b = internal global bool false ; <bool*> [#uses=1] +%rootlosers = internal global [300 x int] zeroinitializer ; <[300 x int]*> [#uses=1] +%pn_move = internal global %struct.move_s zeroinitializer ; <%struct.move_s*> [#uses=7] +%iters = internal global int 0 ; <int*> [#uses=1] +%kibitzed.b = internal global bool false ; <bool*> [#uses=0] +%str24 = internal global [28 x sbyte] c"tellics kibitz Forced win!\0A\00" ; <[28 x sbyte]*> [#uses=0] +%str25 = internal global [34 x sbyte] c"tellics kibitz Forced win! (alt)\0A\00" ; <[34 x sbyte]*> [#uses=0] +%pn_time = internal global int 0 ; <int*> [#uses=1] +%post = internal global uint 0 ; <uint*> [#uses=0] +%str = internal global [94 x sbyte] c"tellics whisper proof %d, disproof %d, %d losers, highest depth %d, primary %d, secondary %d\0A\00" ; <[94 x sbyte]*> [#uses=0] +%str26 = internal global [30 x sbyte] c"tellics whisper Forced reply\0A\00" ; <[30 x sbyte]*> [#uses=0] +%str27 = internal global [60 x sbyte] c"P: %d D: %d N: %d S: %d Mem: %2.2fM Iters: %d MaxDepth: %d\0A\00" ; <[60 x sbyte]*> [#uses=0] +%str = internal global [90 x sbyte] c"tellics whisper proof %d, disproof %d, %d nodes, %d forwards, %d iters, highest depth %d\0A\00" ; <[90 x sbyte]*> [#uses=0] +%str = internal global [11 x sbyte] c"Time : %f\0A\00" ; <[11 x sbyte]*> [#uses=0] +%str28 = internal global [23 x sbyte] c"This position is WON.\0A\00" ; <[23 x sbyte]*> [#uses=0] +%str29 = internal global [5 x sbyte] c"PV: \00" ; <[5 x sbyte]*> [#uses=0] +%str30 = internal global [4 x sbyte] c"%s \00" ; <[4 x sbyte]*> [#uses=0] +%str31 = internal global [2 x sbyte] c" \00" ; <[2 x sbyte]*> [#uses=0] +%str32 = internal global [41 x sbyte] c"\0Atellics kibitz Forced win in %d moves.\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str33 = internal global [20 x sbyte] c"\0A1-0 {White mates}\0A\00" ; <[20 x sbyte]*> [#uses=0] +%result = internal global int 0 ; <int*> [#uses=4] +%str1 = internal global [20 x sbyte] c"\0A0-1 {Black mates}\0A\00" ; <[20 x sbyte]*> [#uses=0] +%str35 = internal global [24 x sbyte] c"This position is LOST.\0A\00" ; <[24 x sbyte]*> [#uses=0] +%str36 = internal global [27 x sbyte] c"This position is UNKNOWN.\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str37 = internal global [47 x sbyte] c"P: %d D: %d N: %d S: %d Mem: %2.2fM Iters: %d\0A\00" ; <[47 x sbyte]*> [#uses=0] +%s_threat.b = internal global bool false ; <bool*> [#uses=0] +%TTSize.b = internal global bool false ; <bool*> [#uses=3] +%cfg_razordrop.b = internal global bool false ; <bool*> [#uses=0] +%cfg_futprune.b = internal global bool false ; <bool*> [#uses=0] +%cfg_onerep.b = internal global bool false ; <bool*> [#uses=0] +%setcode = internal global [30 x sbyte] zeroinitializer ; <[30 x sbyte]*> [#uses=0] +%str38 = internal global [3 x sbyte] c"%u\00" ; <[3 x sbyte]*> [#uses=0] +%searching_pv.b = internal global bool false ; <bool*> [#uses=0] +%pv = internal global [300 x [300 x %struct.move_s]] zeroinitializer ; <[300 x [300 x %struct.move_s]]*> [#uses=0] +%i_depth = internal global int 0 ; <int*> [#uses=0] +%history_h = internal global [144 x [144 x uint]] zeroinitializer ; <[144 x [144 x uint]]*> [#uses=0] +%killer1 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] +%killer2 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] +%killer3 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] +%rootnodecount = internal global [512 x uint] zeroinitializer ; <[512 x uint]*> [#uses=0] +%raw_nodes = internal global int 0 ; <int*> [#uses=0] +%pv_length = internal global [300 x int] zeroinitializer ; <[300 x int]*> [#uses=0] +%time_exit.b = internal global bool false ; <bool*> [#uses=0] +%time_for_move = internal global int 0 ; <int*> [#uses=3] +%failed = internal global int 0 ; <int*> [#uses=0] +%extendedtime.b = internal global bool false ; <bool*> [#uses=1] +%time_left = internal global int 0 ; <int*> [#uses=0] +%str39 = internal global [38 x sbyte] c"Extended from %d to %d, time left %d\0A\00" ; <[38 x sbyte]*> [#uses=0] +%checks = internal global [300 x uint] zeroinitializer ; <[300 x uint]*> [#uses=0] +%singular = internal global [300 x uint] zeroinitializer ; <[300 x uint]*> [#uses=0] +%recaps = internal global [300 x uint] zeroinitializer ; <[300 x uint]*> [#uses=0] +%ext_onerep = internal global uint 0 ; <uint*> [#uses=1] +%FULL = internal global uint 0 ; <uint*> [#uses=1] +%PVS = internal global uint 0 ; <uint*> [#uses=1] +%PVSF = internal global uint 0 ; <uint*> [#uses=1] +%killer_scores = internal global [300 x int] zeroinitializer ; <[300 x int]*> [#uses=0] +%killer_scores2 = internal global [300 x int] zeroinitializer ; <[300 x int]*> [#uses=0] +%killer_scores3 = internal global [300 x int] zeroinitializer ; <[300 x int]*> [#uses=0] +%time_failure.b = internal global bool false ; <bool*> [#uses=0] +%cur_score = internal global int 0 ; <int*> [#uses=0] +%legals = internal global int 0 ; <int*> [#uses=3] +%movetotal = internal global int 0 ; <int*> [#uses=0] +%searching_move = internal global [20 x sbyte] zeroinitializer ; <[20 x sbyte]*> [#uses=0] +%is_pondering.b = internal global bool false ; <bool*> [#uses=6] +%true_i_depth = internal global sbyte 0 ; <sbyte*> [#uses=1] +%is_analyzing.b = internal global bool false ; <bool*> [#uses=0] +%inc = internal global int 0 ; <int*> [#uses=1] +%time_cushion = internal global int 0 ; <int*> [#uses=2] +%str40 = internal global [16 x sbyte] c"Opening phase.\0A\00" ; <[16 x sbyte]*> [#uses=1] +%str = internal global [19 x sbyte] c"Middlegame phase.\0A\00" ; <[19 x sbyte]*> [#uses=1] +%str1 = internal global [16 x sbyte] c"Endgame phase.\0A\00" ; <[16 x sbyte]*> [#uses=1] +%str43 = internal global [20 x sbyte] c"Time for move : %d\0A\00" ; <[20 x sbyte]*> [#uses=1] +%postpv = internal global [256 x sbyte] zeroinitializer ; <[256 x sbyte]*> [#uses=0] +%str44 = internal global [49 x sbyte] c"tellics whisper %d restart(s), ended up with %s\0A\00" ; <[49 x sbyte]*> [#uses=0] +%moves_to_tc = internal global int 0 ; <int*> [#uses=0] +%str45 = internal global [27 x sbyte] c"tellics kibitz Mate in %d\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str46 = internal global [52 x sbyte] c"tellics ptell Mate in %d, give him no more pieces.\0A\00" ; <[52 x sbyte]*> [#uses=0] +%tradefreely.b = internal global bool false ; <bool*> [#uses=0] +%str = internal global [37 x sbyte] c"tellics ptell You can trade freely.\0A\00" ; <[37 x sbyte]*> [#uses=0] +%str47 = internal global [25 x sbyte] c"tellics ptell ---trades\0A\00" ; <[25 x sbyte]*> [#uses=0] +%str2 = internal global [49 x sbyte] c"tellics kibitz Both players dead...resigning...\0A\00" ; <[49 x sbyte]*> [#uses=0] +%str3 = internal global [16 x sbyte] c"tellics resign\0A\00" ; <[16 x sbyte]*> [#uses=0] +%str48 = internal global [81 x sbyte] c"tellics ptell I am forcedly mated (dead). Tell me 'go' to start moving into it.\0A\00" ; <[81 x sbyte]*> [#uses=0] +%str = internal global [62 x sbyte] c"tellics ptell I'll have to sit...(lose piece that mates you)\0A\00" ; <[62 x sbyte]*> [#uses=0] +%see_num_attackers = internal global [2 x int] zeroinitializer ; <[2 x int]*> [#uses=0] +%see_attackers = internal global [2 x [16 x %struct.see_data]] zeroinitializer ; <[2 x [16 x %struct.see_data]]*> [#uses=0] +%scentral = internal global [144 x int] [ int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int -10, int 0, int 3, int 5, int 5, int 3, int 0, int -10, int 0, int 0, int 0, int 0, int -10, int 2, int 15, int 15, int 15, int 15, int 2, int -10, int 0, int 0, int 0, int 0, int -10, int 7, int 15, int 25, int 25, int 15, int 7, int -10, int 0, int 0, int 0, int 0, int -10, int 7, int 15, int 25, int 25, int 15, int 7, int -10, int 0, int 0, int 0, int 0, int -10, int 2, int 15, int 15, int 15, int 15, int 2, int -10, int 0, int 0, int 0, int 0, int -10, int 0, int 3, int 5, int 5, int 3, int 0, int -10, int 0, int 0, int 0, int 0, int -20, int -10, int -10, int -10, int -10, int -10, int -10, int -20, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0, int 0 ] ; <[144 x int]*> [#uses=0] +%str51 = internal global [81 x sbyte] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/seval.c\00" ; <[81 x sbyte]*> [#uses=0] +%divider = internal global [50 x sbyte] c"-------------------------------------------------\00" ; <[50 x sbyte]*> [#uses=0] +%min_per_game = internal global int 0 ; <int*> [#uses=0] +%opp_rating = internal global int 0 ; <int*> [#uses=0] +%my_rating = internal global int 0 ; <int*> [#uses=0] +%str53 = internal global [15 x sbyte] c"SPEC Workload\0A\00" ; <[15 x sbyte]*> [#uses=0] +%opening_history = internal global [256 x sbyte] zeroinitializer ; <[256 x sbyte]*> [#uses=0] +%str60 = internal global [81 x sbyte] c"Material score: %d Eval : %d MaxPosDiff: %d White hand: %d Black hand : %d\0A\00" ; <[81 x sbyte]*> [#uses=0] +%str61 = internal global [26 x sbyte] c"Hash : %X HoldHash : %X\0A\00" ; <[26 x sbyte]*> [#uses=0] +%str62 = internal global [9 x sbyte] c"move %s\0A\00" ; <[9 x sbyte]*> [#uses=0] +%str63 = internal global [5 x sbyte] c"\0A%s\0A\00" ; <[5 x sbyte]*> [#uses=0] +%str64 = internal global [19 x sbyte] c"0-1 {Black Mates}\0A\00" ; <[19 x sbyte]*> [#uses=0] +%str1 = internal global [19 x sbyte] c"1-0 {White Mates}\0A\00" ; <[19 x sbyte]*> [#uses=0] +%str65 = internal global [27 x sbyte] c"1/2-1/2 {Fifty move rule}\0A\00" ; <[27 x sbyte]*> [#uses=0] +%str2 = internal global [29 x sbyte] c"1/2-1/2 {3 fold repetition}\0A\00" ; <[29 x sbyte]*> [#uses=0] +%str66 = internal global [16 x sbyte] c"1/2-1/2 {Draw}\0A\00" ; <[16 x sbyte]*> [#uses=0] +%str68 = internal global [8 x sbyte] c"Sjeng: \00" ; <[8 x sbyte]*> [#uses=0] +%str69 = internal global [18 x sbyte] c"Illegal move: %s\0A\00" ; <[18 x sbyte]*> [#uses=0] +%str3 = internal global [9 x sbyte] c"setboard\00" ; <[9 x sbyte]*> [#uses=0] +%str470 = internal global [5 x sbyte] c"quit\00" ; <[5 x sbyte]*> [#uses=0] +%str571 = internal global [5 x sbyte] c"exit\00" ; <[5 x sbyte]*> [#uses=0] +%str6 = internal global [8 x sbyte] c"diagram\00" ; <[8 x sbyte]*> [#uses=0] +%str7 = internal global [2 x sbyte] c"d\00" ; <[2 x sbyte]*> [#uses=0] +%str72 = internal global [6 x sbyte] c"perft\00" ; <[6 x sbyte]*> [#uses=0] +%str73 = internal global [3 x sbyte] c"%d\00" ; <[3 x sbyte]*> [#uses=0] +%str74 = internal global [28 x sbyte] c"Raw nodes for depth %d: %i\0A\00" ; <[28 x sbyte]*> [#uses=0] +%str = internal global [13 x sbyte] c"Time : %.2f\0A\00" ; <[13 x sbyte]*> [#uses=0] +%str75 = internal global [4 x sbyte] c"new\00" ; <[4 x sbyte]*> [#uses=0] +%str = internal global [40 x sbyte] c"tellics set 1 Sjeng SPEC 1.0 (SPEC/%s)\0A\00" ; <[40 x sbyte]*> [#uses=0] +%str = internal global [7 x sbyte] c"xboard\00" ; <[7 x sbyte]*> [#uses=0] +%str8 = internal global [6 x sbyte] c"nodes\00" ; <[6 x sbyte]*> [#uses=0] +%str77 = internal global [38 x sbyte] c"Number of nodes: %i (%0.2f%% qnodes)\0A\00" ; <[38 x sbyte]*> [#uses=0] +%str9 = internal global [5 x sbyte] c"post\00" ; <[5 x sbyte]*> [#uses=0] +%str10 = internal global [7 x sbyte] c"nopost\00" ; <[7 x sbyte]*> [#uses=0] +%str11 = internal global [7 x sbyte] c"random\00" ; <[7 x sbyte]*> [#uses=0] +%str12 = internal global [5 x sbyte] c"hard\00" ; <[5 x sbyte]*> [#uses=0] +%str13 = internal global [5 x sbyte] c"easy\00" ; <[5 x sbyte]*> [#uses=0] +%str14 = internal global [2 x sbyte] c"?\00" ; <[2 x sbyte]*> [#uses=0] +%str15 = internal global [6 x sbyte] c"white\00" ; <[6 x sbyte]*> [#uses=0] +%str16 = internal global [6 x sbyte] c"black\00" ; <[6 x sbyte]*> [#uses=0] +%str17 = internal global [6 x sbyte] c"force\00" ; <[6 x sbyte]*> [#uses=0] +%str18 = internal global [5 x sbyte] c"eval\00" ; <[5 x sbyte]*> [#uses=0] +%str = internal global [10 x sbyte] c"Eval: %d\0A\00" ; <[10 x sbyte]*> [#uses=0] +%str2178 = internal global [3 x sbyte] c"%i\00" ; <[3 x sbyte]*> [#uses=0] +%str22 = internal global [5 x sbyte] c"otim\00" ; <[5 x sbyte]*> [#uses=0] +%opp_time = internal global int 0 ; <int*> [#uses=0] +%str23 = internal global [6 x sbyte] c"level\00" ; <[6 x sbyte]*> [#uses=0] +%str = internal global [12 x sbyte] c"%i %i:%i %i\00" ; <[12 x sbyte]*> [#uses=0] +%sec_per_game = internal global int 0 ; <int*> [#uses=0] +%str24 = internal global [9 x sbyte] c"%i %i %i\00" ; <[9 x sbyte]*> [#uses=0] +%str25 = internal global [7 x sbyte] c"rating\00" ; <[7 x sbyte]*> [#uses=0] +%str26 = internal global [6 x sbyte] c"%i %i\00" ; <[6 x sbyte]*> [#uses=0] +%str27 = internal global [8 x sbyte] c"holding\00" ; <[8 x sbyte]*> [#uses=0] +%str28 = internal global [8 x sbyte] c"variant\00" ; <[8 x sbyte]*> [#uses=0] +%str29 = internal global [7 x sbyte] c"normal\00" ; <[7 x sbyte]*> [#uses=0] +%str79 = internal global [11 x sbyte] c"crazyhouse\00" ; <[11 x sbyte]*> [#uses=0] +%str30 = internal global [9 x sbyte] c"bughouse\00" ; <[9 x sbyte]*> [#uses=0] +%str31 = internal global [8 x sbyte] c"suicide\00" ; <[8 x sbyte]*> [#uses=0] +%str32 = internal global [9 x sbyte] c"giveaway\00" ; <[9 x sbyte]*> [#uses=0] +%str33 = internal global [7 x sbyte] c"losers\00" ; <[7 x sbyte]*> [#uses=0] +%str34 = internal global [8 x sbyte] c"analyze\00" ; <[8 x sbyte]*> [#uses=0] +%str35 = internal global [5 x sbyte] c"undo\00" ; <[5 x sbyte]*> [#uses=0] +%str36 = internal global [18 x sbyte] c"Move number : %d\0A\00" ; <[18 x sbyte]*> [#uses=0] +%str37 = internal global [7 x sbyte] c"remove\00" ; <[7 x sbyte]*> [#uses=0] +%str38 = internal global [5 x sbyte] c"edit\00" ; <[5 x sbyte]*> [#uses=0] +%str41 = internal global [2 x sbyte] c"#\00" ; <[2 x sbyte]*> [#uses=0] +%str42 = internal global [8 x sbyte] c"partner\00" ; <[8 x sbyte]*> [#uses=0] +%str43 = internal global [9 x sbyte] c"$partner\00" ; <[9 x sbyte]*> [#uses=0] +%str44 = internal global [6 x sbyte] c"ptell\00" ; <[6 x sbyte]*> [#uses=0] +%str45 = internal global [5 x sbyte] c"test\00" ; <[5 x sbyte]*> [#uses=0] +%str46 = internal global [3 x sbyte] c"st\00" ; <[3 x sbyte]*> [#uses=0] +%str47 = internal global [7 x sbyte] c"result\00" ; <[7 x sbyte]*> [#uses=0] +%str48 = internal global [6 x sbyte] c"prove\00" ; <[6 x sbyte]*> [#uses=0] +%str49 = internal global [26 x sbyte] c"\0AMax time to search (s): \00" ; <[26 x sbyte]*> [#uses=0] +%str50 = internal global [5 x sbyte] c"ping\00" ; <[5 x sbyte]*> [#uses=0] +%str51 = internal global [9 x sbyte] c"pong %d\0A\00" ; <[9 x sbyte]*> [#uses=0] +%str52 = internal global [6 x sbyte] c"fritz\00" ; <[6 x sbyte]*> [#uses=0] +%str53 = internal global [6 x sbyte] c"reset\00" ; <[6 x sbyte]*> [#uses=0] +%str54 = internal global [3 x sbyte] c"sd\00" ; <[3 x sbyte]*> [#uses=0] +%str55 = internal global [26 x sbyte] c"New max depth set to: %d\0A\00" ; <[26 x sbyte]*> [#uses=0] +%str56 = internal global [5 x sbyte] c"auto\00" ; <[5 x sbyte]*> [#uses=0] +%str57 = internal global [9 x sbyte] c"protover\00" ; <[9 x sbyte]*> [#uses=0] +%str = internal global [63 x sbyte] c"feature ping=0 setboard=1 playother=0 san=0 usermove=0 time=1\0A\00" ; <[63 x sbyte]*> [#uses=0] +%str80 = internal global [53 x sbyte] c"feature draw=0 sigint=0 sigterm=0 reuse=1 analyze=0\0A\00" ; <[53 x sbyte]*> [#uses=0] +%str = internal global [33 x sbyte] c"feature myname=\22Sjeng SPEC 1.0\22\0A\00" ; <[33 x sbyte]*> [#uses=0] +%str = internal global [71 x sbyte] c"feature variants=\22normal,bughouse,crazyhouse,suicide,giveaway,losers\22\0A\00" ; <[71 x sbyte]*> [#uses=0] +%str = internal global [46 x sbyte] c"feature colors=1 ics=0 name=0 pause=0 done=1\0A\00" ; <[46 x sbyte]*> [#uses=0] +%str58 = internal global [9 x sbyte] c"accepted\00" ; <[9 x sbyte]*> [#uses=0] +%str59 = internal global [9 x sbyte] c"rejected\00" ; <[9 x sbyte]*> [#uses=0] +%str = internal global [65 x sbyte] c"Interface does not support a required feature...expect trouble.\0A\00" ; <[65 x sbyte]*> [#uses=0] +%str61 = internal global [6 x sbyte] c"\0A%s\0A\0A\00" ; <[6 x sbyte]*> [#uses=0] +%str81 = internal global [41 x sbyte] c"diagram/d: toggle diagram display\0A\00" ; <[41 x sbyte]*> [#uses=0] +%str82 = internal global [34 x sbyte] c"exit/quit: terminate Sjeng\0A\00" ; <[34 x sbyte]*> [#uses=0] +%str62 = internal global [51 x sbyte] c"go: make Sjeng play the side to move\0A\00" ; <[51 x sbyte]*> [#uses=0] +%str83 = internal global [35 x sbyte] c"new: start a new game\0A\00" ; <[35 x sbyte]*> [#uses=0] +%str84 = internal global [55 x sbyte] c"level <x>: the xboard style command to set time\0A\00" ; <[55 x sbyte]*> [#uses=0] +%str85 = internal global [49 x sbyte] c" <x> should be in the form: <a> <b> <c> where:\0A\00" ; <[49 x sbyte]*> [#uses=0] +%str63 = internal global [49 x sbyte] c" a -> moves to TC (0 if using an ICS style TC)\0A\00" ; <[49 x sbyte]*> [#uses=0] +%str86 = internal global [25 x sbyte] c" b -> minutes per game\0A\00" ; <[25 x sbyte]*> [#uses=0] +%str64 = internal global [29 x sbyte] c" c -> increment in seconds\0A\00" ; <[29 x sbyte]*> [#uses=0] +%str65 = internal global [55 x sbyte] c"nodes: outputs the number of nodes searched\0A\00" ; <[55 x sbyte]*> [#uses=0] +%str87 = internal global [47 x sbyte] c"perft <x>: compute raw nodes to depth x\0A\00" ; <[47 x sbyte]*> [#uses=0] +%str = internal global [42 x sbyte] c"post: toggles thinking output\0A\00" ; <[42 x sbyte]*> [#uses=0] +%str = internal global [45 x sbyte] c"xboard: put Sjeng into xboard mode\0A\00" ; <[45 x sbyte]*> [#uses=0] +%str = internal global [39 x sbyte] c"test: run an EPD testsuite\0A\00" ; <[39 x sbyte]*> [#uses=0] +%str88 = internal global [52 x sbyte] c"speed: test movegen and evaluation speed\0A\00" ; <[52 x sbyte]*> [#uses=0] +%str89 = internal global [59 x sbyte] c"proof: try to prove or disprove the current pos\0A\00" ; <[59 x sbyte]*> [#uses=0] +%str90 = internal global [44 x sbyte] c"sd <x>: limit thinking to depth x\0A\00" ; <[44 x sbyte]*> [#uses=0] +%str66 = internal global [51 x sbyte] c"st <x>: limit thinking to x centiseconds\0A\00" ; <[51 x sbyte]*> [#uses=0] +%str67 = internal global [54 x sbyte] c"setboard <FEN>: set board to a specified FEN string\0A\00" ; <[54 x sbyte]*> [#uses=0] +%str68 = internal global [38 x sbyte] c"undo: back up a half move\0A\00" ; <[38 x sbyte]*> [#uses=0] +%str69 = internal global [38 x sbyte] c"remove: back up a full move\0A\00" ; <[38 x sbyte]*> [#uses=0] +%str70 = internal global [42 x sbyte] c"force: disable computer moving\0A\00" ; <[42 x sbyte]*> [#uses=0] +%str71 = internal global [44 x sbyte] c"auto: computer plays both sides\0A\00" ; <[44 x sbyte]*> [#uses=0] +%DP_TTable = internal global %struct.TType* null ; <%struct.TType**> [#uses=1] +%AS_TTable = internal global %struct.TType* null ; <%struct.TType**> [#uses=1] +%QS_TTable = internal global %struct.QTType* null ; <%struct.QTType**> [#uses=1] +%str93 = internal global [38 x sbyte] c"Out of memory allocating hashtables.\0A\00" ; <[38 x sbyte]*> [#uses=0] +%type_to_char.3058 = internal global [14 x int] [ int 70, int 80, int 80, int 78, int 78, int 75, int 75, int 82, int 82, int 81, int 81, int 66, int 66, int 69 ] ; <[14 x int]*> [#uses=0] +%str94 = internal global [8 x sbyte] c"%c@%c%d\00" ; <[8 x sbyte]*> [#uses=0] +%str95 = internal global [5 x sbyte] c"%c%d\00" ; <[5 x sbyte]*> [#uses=0] +%str1 = internal global [8 x sbyte] c"%c%d=%c\00" ; <[8 x sbyte]*> [#uses=0] +%str2 = internal global [8 x sbyte] c"%cx%c%d\00" ; <[8 x sbyte]*> [#uses=0] +%str96 = internal global [11 x sbyte] c"%cx%c%d=%c\00" ; <[11 x sbyte]*> [#uses=0] +%str97 = internal global [4 x sbyte] c"O-O\00" ; <[4 x sbyte]*> [#uses=0] +%str98 = internal global [6 x sbyte] c"O-O-O\00" ; <[6 x sbyte]*> [#uses=0] +%str99 = internal global [9 x sbyte] c"%c%c%c%d\00" ; <[9 x sbyte]*> [#uses=0] +%str3100 = internal global [9 x sbyte] c"%c%d%c%d\00" ; <[9 x sbyte]*> [#uses=0] +%str101 = internal global [10 x sbyte] c"%c%cx%c%d\00" ; <[10 x sbyte]*> [#uses=0] +%str4 = internal global [10 x sbyte] c"%c%dx%c%d\00" ; <[10 x sbyte]*> [#uses=0] +%str102 = internal global [7 x sbyte] c"%c%c%d\00" ; <[7 x sbyte]*> [#uses=0] +%str5103 = internal global [5 x sbyte] c"illg\00" ; <[5 x sbyte]*> [#uses=0] +%type_to_char.3190 = internal global [14 x int] [ int 70, int 80, int 112, int 78, int 110, int 75, int 107, int 82, int 114, int 81, int 113, int 66, int 98, int 69 ] ; <[14 x int]*> [#uses=0] +%str7 = internal global [10 x sbyte] c"%c%d%c%dn\00" ; <[10 x sbyte]*> [#uses=0] +%str8 = internal global [10 x sbyte] c"%c%d%c%dr\00" ; <[10 x sbyte]*> [#uses=0] +%str9 = internal global [10 x sbyte] c"%c%d%c%db\00" ; <[10 x sbyte]*> [#uses=0] +%str10 = internal global [10 x sbyte] c"%c%d%c%dk\00" ; <[10 x sbyte]*> [#uses=0] +%str11 = internal global [10 x sbyte] c"%c%d%c%dq\00" ; <[10 x sbyte]*> [#uses=0] +%C.88.3251 = internal global [14 x sbyte*] [ sbyte* getelementptr ([3 x sbyte]* %str105, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str12106, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str13107, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str14, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str15, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str16, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str17, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str18, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str19108, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str20, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str21109, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str22, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str23, int 0, int 0), sbyte* getelementptr ([3 x sbyte]* %str24, int 0, int 0) ] ; <[14 x sbyte*]*> [#uses=0] +%str105 = internal global [3 x sbyte] c"!!\00" ; <[3 x sbyte]*> [#uses=1] +%str12106 = internal global [3 x sbyte] c" P\00" ; <[3 x sbyte]*> [#uses=1] +%str13107 = internal global [3 x sbyte] c"*P\00" ; <[3 x sbyte]*> [#uses=1] +%str14 = internal global [3 x sbyte] c" N\00" ; <[3 x sbyte]*> [#uses=1] +%str15 = internal global [3 x sbyte] c"*N\00" ; <[3 x sbyte]*> [#uses=1] +%str16 = internal global [3 x sbyte] c" K\00" ; <[3 x sbyte]*> [#uses=1] +%str17 = internal global [3 x sbyte] c"*K\00" ; <[3 x sbyte]*> [#uses=1] +%str18 = internal global [3 x sbyte] c" R\00" ; <[3 x sbyte]*> [#uses=1] +%str19108 = internal global [3 x sbyte] c"*R\00" ; <[3 x sbyte]*> [#uses=1] +%str20 = internal global [3 x sbyte] c" Q\00" ; <[3 x sbyte]*> [#uses=1] +%str21109 = internal global [3 x sbyte] c"*Q\00" ; <[3 x sbyte]*> [#uses=1] +%str22 = internal global [3 x sbyte] c" B\00" ; <[3 x sbyte]*> [#uses=1] +%str23 = internal global [3 x sbyte] c"*B\00" ; <[3 x sbyte]*> [#uses=1] +%str24 = internal global [3 x sbyte] c" \00" ; <[3 x sbyte]*> [#uses=1] +%str110 = internal global [42 x sbyte] c"+----+----+----+----+----+----+----+----+\00" ; <[42 x sbyte]*> [#uses=0] +%str25 = internal global [6 x sbyte] c" %s\0A\00" ; <[6 x sbyte]*> [#uses=0] +%str26 = internal global [5 x sbyte] c"%d |\00" ; <[5 x sbyte]*> [#uses=0] +%str27 = internal global [6 x sbyte] c" %s |\00" ; <[6 x sbyte]*> [#uses=0] +%str28 = internal global [7 x sbyte] c"\0A %s\0A\00" ; <[7 x sbyte]*> [#uses=0] +%str111 = internal global [45 x sbyte] c"\0A a b c d e f g h\0A\0A\00" ; <[45 x sbyte]*> [#uses=0] +%str29 = internal global [45 x sbyte] c"\0A h g f e d c b a\0A\0A\00" ; <[45 x sbyte]*> [#uses=0] +%str33 = internal global [2 x sbyte] c"<\00" ; <[2 x sbyte]*> [#uses=0] +%str34 = internal global [3 x sbyte] c"> \00" ; <[3 x sbyte]*> [#uses=0] +%str114 = internal global [18 x sbyte] c"%2i %7i %5i %8i \00" ; <[18 x sbyte]*> [#uses=0] +%str115 = internal global [20 x sbyte] c"%2i %c%1i.%02i %9i \00" ; <[20 x sbyte]*> [#uses=0] +%str39 = internal global [5 x sbyte] c"%s !\00" ; <[5 x sbyte]*> [#uses=0] +%str40 = internal global [6 x sbyte] c"%s !!\00" ; <[6 x sbyte]*> [#uses=0] +%str41 = internal global [6 x sbyte] c"%s ??\00" ; <[6 x sbyte]*> [#uses=0] +%str124 = internal global [71 x sbyte] c"\0ASjeng version SPEC 1.0, Copyright (C) 2000-2005 Gian-Carlo Pascutto\0A\0A\00" ; <[71 x sbyte]*> [#uses=0] +%state = internal global [625 x uint] zeroinitializer ; <[625 x uint]*> [#uses=0] + +implementation ; Functions: + +declare fastcc int %calc_attackers(int, int) + +declare fastcc uint %is_attacked(int, int) + +declare fastcc void %ProcessHoldings(sbyte*) + +declare void %llvm.memset.i32(sbyte*, ubyte, uint, uint) + +declare sbyte* %strncpy(sbyte*, sbyte*, uint) + +declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) + +declare void %__eprintf(sbyte*, sbyte*, uint, sbyte*) + +declare fastcc void %addHolding(int, int) + +declare fastcc void %removeHolding(int, int) + +declare fastcc void %DropremoveHolding(int, int) + +declare int %printf(sbyte*, ...) + +declare fastcc uint %is_draw() + +declare void %exit(int) + +declare fastcc void %setup_epd_line(sbyte*) + +declare int %atoi(sbyte*) + +declare fastcc void %reset_piece_square() + +declare fastcc void %initialize_hash() + +declare int %__maskrune(int, uint) + +declare fastcc void %comp_to_san(long, long, long, sbyte*) + +declare sbyte* %strstr(sbyte*, sbyte*) + +declare int %atol(sbyte*) + +declare %struct.FILE* %fopen(sbyte*, sbyte*) + +declare fastcc void %display_board(int) + +internal csretcc void %think(%struct.move_s* %agg.result) { +entry: + %output.i = alloca [8 x sbyte], align 8 ; <[8 x sbyte]*> [#uses=0] + %comp_move = alloca %struct.move_s, align 16 ; <%struct.move_s*> [#uses=7] + %temp_move = alloca %struct.move_s, align 16 ; <%struct.move_s*> [#uses=6] + %moves = alloca [512 x %struct.move_s], align 16 ; <[512 x %struct.move_s]*> [#uses=7] + %output = alloca [8 x sbyte], align 8 ; <[8 x sbyte]*> [#uses=1] + store bool false, bool* %userealholdings.b + %tmp = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0 ; <%struct.move_s*> [#uses=3] + %tmp362 = getelementptr %struct.move_s* %comp_move, int 0, uint 0 ; <int*> [#uses=0] + %tmp365 = getelementptr %struct.move_s* %comp_move, int 0, uint 1 ; <int*> [#uses=0] + %tmp368 = getelementptr %struct.move_s* %comp_move, int 0, uint 2 ; <int*> [#uses=0] + %tmp371 = getelementptr %struct.move_s* %comp_move, int 0, uint 3 ; <int*> [#uses=0] + %tmp374 = getelementptr %struct.move_s* %comp_move, int 0, uint 4 ; <int*> [#uses=0] + %tmp377 = getelementptr %struct.move_s* %comp_move, int 0, uint 5 ; <int*> [#uses=0] + %tmp = cast %struct.move_s* %comp_move to { long, long, long }* ; <{ long, long, long }*> [#uses=3] + %tmp = getelementptr { long, long, long }* %tmp, int 0, uint 0 ; <long*> [#uses=0] + %tmp829 = getelementptr { long, long, long }* %tmp, int 0, uint 1 ; <long*> [#uses=0] + %tmp832 = getelementptr { long, long, long }* %tmp, int 0, uint 2 ; <long*> [#uses=0] + %output = getelementptr [8 x sbyte]* %output, int 0, int 0 ; <sbyte*> [#uses=0] + %tmp573 = getelementptr %struct.move_s* %temp_move, int 0, uint 0 ; <int*> [#uses=0] + %tmp576 = getelementptr %struct.move_s* %temp_move, int 0, uint 1 ; <int*> [#uses=0] + %tmp579 = getelementptr %struct.move_s* %temp_move, int 0, uint 2 ; <int*> [#uses=0] + %tmp582 = getelementptr %struct.move_s* %temp_move, int 0, uint 3 ; <int*> [#uses=0] + %tmp585 = getelementptr %struct.move_s* %temp_move, int 0, uint 4 ; <int*> [#uses=0] + %tmp588 = getelementptr %struct.move_s* %temp_move, int 0, uint 5 ; <int*> [#uses=0] + %pn_restart.0.ph = cast uint 0 to int ; <int> [#uses=2] + %tmp21362 = seteq uint 0, 0 ; <bool> [#uses=2] + %tmp216 = cast int %pn_restart.0.ph to float ; <float> [#uses=1] + %tmp216 = cast float %tmp216 to double ; <double> [#uses=1] + %tmp217 = add double %tmp216, 1.000000e+00 ; <double> [#uses=1] + %tmp835 = setgt int %pn_restart.0.ph, 9 ; <bool> [#uses=0] + store int 0, int* %nodes + store int 0, int* %qnodes + store int 1, int* %ply + store uint 0, uint* %ECacheProbes + store uint 0, uint* %ECacheHits + store uint 0, uint* %TTProbes + store uint 0, uint* %TTHits + store uint 0, uint* %TTStores + store uint 0, uint* %NCuts + store uint 0, uint* %NTries + store uint 0, uint* %TExt + store uint 0, uint* %FH + store uint 0, uint* %FHF + store uint 0, uint* %PVS + store uint 0, uint* %FULL + store uint 0, uint* %PVSF + store uint 0, uint* %ext_check + store uint 0, uint* %ext_onerep + store uint 0, uint* %razor_drop + store uint 0, uint* %razor_material + store bool false, bool* %extendedtime.b + store bool false, bool* %forcedwin.b + store int 200, int* %maxposdiff + store sbyte 0, sbyte* %true_i_depth + store int 0, int* %legals + %tmp48 = load int* %Variant ; <int> [#uses=1] + %tmp49 = seteq int %tmp48, 4 ; <bool> [#uses=1] + %storemerge = cast bool %tmp49 to uint ; <uint> [#uses=1] + store uint %storemerge, uint* %captures + call fastcc void %gen( %struct.move_s* %tmp ) + %tmp53 = load int* %numb_moves ; <int> [#uses=1] + %tmp.i = load int* %Variant ; <int> [#uses=1] + %tmp.i = seteq int %tmp.i, 3 ; <bool> [#uses=1] + br bool %tmp.i, label %in_check.exit, label %cond_next.i + +cond_next.i: ; preds = %entry + %tmp2.i5 = load int* %white_to_move ; <int> [#uses=1] + %tmp3.i = seteq int %tmp2.i5, 1 ; <bool> [#uses=0] + ret void + +in_check.exit: ; preds = %entry + %tmp7637 = setgt int %tmp53, 0 ; <bool> [#uses=1] + br bool %tmp7637, label %cond_true77, label %bb80 + +cond_true77: ; preds = %in_check.exit + %l.1.0 = cast uint 0 to int ; <int> [#uses=2] + call fastcc void %make( %struct.move_s* %tmp, int %l.1.0 ) + %tmp61 = call fastcc uint %check_legal( %struct.move_s* %tmp, int %l.1.0, int 0 ) ; <uint> [#uses=1] + %tmp62 = seteq uint %tmp61, 0 ; <bool> [#uses=0] + ret void + +bb80: ; preds = %in_check.exit + %tmp81 = load int* %Variant ; <int> [#uses=1] + %tmp82 = seteq int %tmp81, 4 ; <bool> [#uses=1] + br bool %tmp82, label %cond_true83, label %cond_next118 + +cond_true83: ; preds = %bb80 + %tmp84 = load int* %legals ; <int> [#uses=1] + %tmp85 = seteq int %tmp84, 0 ; <bool> [#uses=0] + ret void + +cond_next118: ; preds = %bb80 + %tmp119 = load int* %Variant ; <int> [#uses=1] + %tmp120 = seteq int %tmp119, 1 ; <bool> [#uses=1] + br bool %tmp120, label %cond_next176, label %cond_true121 + +cond_true121: ; preds = %cond_next118 + %tmp122.b = load bool* %is_pondering.b ; <bool> [#uses=1] + br bool %tmp122.b, label %cond_next176, label %cond_true124 + +cond_true124: ; preds = %cond_true121 + %tmp125 = load int* %legals ; <int> [#uses=1] + %tmp126 = seteq int %tmp125, 1 ; <bool> [#uses=1] + br bool %tmp126, label %cond_true127, label %cond_next176 + +cond_true127: ; preds = %cond_true124 + %tmp128 = load int* %inc ; <int> [#uses=1] + %tmp129 = mul int %tmp128, 100 ; <int> [#uses=1] + %tmp130 = load int* %time_cushion ; <int> [#uses=1] + %tmp131 = add int %tmp129, %tmp130 ; <int> [#uses=1] + store int %tmp131, int* %time_cushion + %tmp134 = getelementptr %struct.move_s* %agg.result, int 0, uint 0 ; <int*> [#uses=1] + %tmp135 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 0 ; <int*> [#uses=1] + %tmp136 = load int* %tmp135 ; <int> [#uses=1] + store int %tmp136, int* %tmp134 + %tmp137 = getelementptr %struct.move_s* %agg.result, int 0, uint 1 ; <int*> [#uses=1] + %tmp138 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 1 ; <int*> [#uses=1] + %tmp139 = load int* %tmp138 ; <int> [#uses=1] + store int %tmp139, int* %tmp137 + %tmp140 = getelementptr %struct.move_s* %agg.result, int 0, uint 2 ; <int*> [#uses=1] + %tmp141 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 2 ; <int*> [#uses=1] + %tmp142 = load int* %tmp141 ; <int> [#uses=1] + store int %tmp142, int* %tmp140 + %tmp143 = getelementptr %struct.move_s* %agg.result, int 0, uint 3 ; <int*> [#uses=1] + %tmp144 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 3 ; <int*> [#uses=1] + %tmp145 = load int* %tmp144 ; <int> [#uses=1] + store int %tmp145, int* %tmp143 + %tmp146 = getelementptr %struct.move_s* %agg.result, int 0, uint 4 ; <int*> [#uses=1] + %tmp147 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 4 ; <int*> [#uses=1] + %tmp148 = load int* %tmp147 ; <int> [#uses=1] + store int %tmp148, int* %tmp146 + %tmp149 = getelementptr %struct.move_s* %agg.result, int 0, uint 5 ; <int*> [#uses=1] + %tmp150 = getelementptr [512 x %struct.move_s]* %moves, int 0, int 0, uint 5 ; <int*> [#uses=1] + %tmp151 = load int* %tmp150 ; <int> [#uses=1] + store int %tmp151, int* %tmp149 + ret void + +cond_next176: ; preds = %cond_true124, %cond_true121, %cond_next118 + call fastcc void %check_phase( ) + %tmp177 = load int* %phase ; <int> [#uses=1] + switch int %tmp177, label %bb187 [ + int 0, label %bb178 + int 1, label %bb180 + int 2, label %bb183 + ] + +bb178: ; preds = %cond_next176 + %tmp179 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([16 x sbyte]* %str40, int 0, uint 0) ) ; <int> [#uses=0] + %tmp18854.b = load bool* %is_pondering.b ; <bool> [#uses=1] + br bool %tmp18854.b, label %cond_false210, label %cond_true190 + +bb180: ; preds = %cond_next176 + %tmp182 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([19 x sbyte]* %str, int 0, uint 0) ) ; <int> [#uses=0] + %tmp18856.b = load bool* %is_pondering.b ; <bool> [#uses=0] + ret void + +bb183: ; preds = %cond_next176 + %tmp185 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([16 x sbyte]* %str1, int 0, uint 0) ) ; <int> [#uses=0] + %tmp18858.b = load bool* %is_pondering.b ; <bool> [#uses=0] + ret void + +bb187: ; preds = %cond_next176 + %tmp188.b = load bool* %is_pondering.b ; <bool> [#uses=0] + ret void + +cond_true190: ; preds = %bb178 + %tmp191 = load int* %fixed_time ; <int> [#uses=1] + %tmp192 = seteq int %tmp191, 0 ; <bool> [#uses=0] + ret void + +cond_false210: ; preds = %bb178 + store int 999999, int* %time_for_move + br bool %tmp21362, label %cond_true226.critedge, label %bb287.critedge + +cond_true226.critedge: ; preds = %cond_false210 + %tmp223.c = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([20 x sbyte]* %str43, int 0, uint 0), int 999999 ) ; <int> [#uses=0] + %tmp.i = load %struct.TType** %DP_TTable ; <%struct.TType*> [#uses=1] + %tmp.i7.b = load bool* %TTSize.b ; <bool> [#uses=1] + %tmp1.i = select bool %tmp.i7.b, uint 60000000, uint 0 ; <uint> [#uses=1] + %tmp.i.sb = getelementptr %struct.TType* %tmp.i, int 0, uint 0 ; <sbyte*> [#uses=1] + call void %llvm.memset.i32( sbyte* %tmp.i.sb, ubyte 0, uint %tmp1.i, uint 4 ) + %tmp2.i = load %struct.TType** %AS_TTable ; <%struct.TType*> [#uses=1] + %tmp3.i8.b = load bool* %TTSize.b ; <bool> [#uses=1] + %tmp4.i = select bool %tmp3.i8.b, uint 60000000, uint 0 ; <uint> [#uses=1] + %tmp2.i = getelementptr %struct.TType* %tmp2.i, int 0, uint 0 ; <sbyte*> [#uses=1] + call void %llvm.memset.i32( sbyte* %tmp2.i, ubyte 0, uint %tmp4.i, uint 4 ) + %tmp.i.QTT = load %struct.QTType** %QS_TTable ; <%struct.QTType*> [#uses=1] + %tmp5.i9.b = load bool* %TTSize.b ; <bool> [#uses=1] + %tmp6.i10 = select bool %tmp5.i9.b, uint 48000000, uint 0 ; <uint> [#uses=1] + %tmp7.i = getelementptr %struct.QTType* %tmp.i.QTT, int 0, uint 0 ; <sbyte*> [#uses=1] + call void %llvm.memset.i32( sbyte* %tmp7.i, ubyte 0, uint %tmp6.i10, uint 4 ) + %tmp.i.ECache = load %struct.ECacheType** %ECache ; <%struct.ECacheType*> [#uses=1] + %tmp.i14.b = load bool* %ECacheSize.b ; <bool> [#uses=1] + %tmp1.i16 = select bool %tmp.i14.b, uint 12000000, uint 0 ; <uint> [#uses=1] + %tmp.i17 = cast %struct.ECacheType* %tmp.i.ECache to sbyte* ; <sbyte*> [#uses=1] + call void %llvm.memset.i32( sbyte* %tmp.i17, ubyte 0, uint %tmp1.i16, uint 4 ) + call void %llvm.memset.i32( sbyte* cast ([300 x int]* %rootlosers to sbyte*), ubyte 0, uint 1200, uint 4 ) + %tmp234.b = load bool* %is_pondering.b ; <bool> [#uses=1] + br bool %tmp234.b, label %bb263, label %cond_next238 + +cond_next238: ; preds = %cond_true226.critedge + %tmp239 = load int* %Variant ; <int> [#uses=2] + switch int %tmp239, label %bb263 [ + int 3, label %bb249 + int 4, label %bb249 + ] + +bb249: ; preds = %cond_next238, %cond_next238 + %tmp250 = load int* %piece_count ; <int> [#uses=1] + %tmp251 = setgt int %tmp250, 3 ; <bool> [#uses=1] + %tmp240.not = setne int %tmp239, 3 ; <bool> [#uses=1] + %brmerge = or bool %tmp251, %tmp240.not ; <bool> [#uses=1] + br bool %brmerge, label %bb260, label %bb263 + +bb260: ; preds = %bb249 + %tmp261 = load int* %time_for_move ; <int> [#uses=1] + %tmp261 = cast int %tmp261 to float ; <float> [#uses=1] + %tmp261 = cast float %tmp261 to double ; <double> [#uses=1] + %tmp262 = div double %tmp261, 3.000000e+00 ; <double> [#uses=1] + %tmp262 = cast double %tmp262 to int ; <int> [#uses=1] + store int %tmp262, int* %pn_time + %tmp1.b.i = load bool* %PBSize.b ; <bool> [#uses=1] + %tmp1.i1 = select bool %tmp1.b.i, uint 200000, uint 0 ; <uint> [#uses=1] + %tmp.i2 = call sbyte* %calloc( uint %tmp1.i1, uint 44 ) ; <sbyte*> [#uses=1] + %tmp.i.ub = cast sbyte* %tmp.i2 to ubyte* ; <ubyte*> [#uses=1] + store ubyte* %tmp.i.ub, ubyte** %membuff + %tmp2.i3 = call sbyte* %calloc( uint 1, uint 44 ) ; <sbyte*> [#uses=3] + %tmp2.i = cast sbyte* %tmp2.i3 to %struct.node_t* ; <%struct.node_t*> [#uses=6] + %tmp.i.move_s = getelementptr [512 x %struct.move_s]* null, int 0, int 0 ; <%struct.move_s*> [#uses=3] + call fastcc void %gen( %struct.move_s* %tmp.i.move_s ) + %tmp3.i4 = load int* %numb_moves ; <int> [#uses=4] + %tmp3.i5 = cast int %tmp3.i4 to uint ; <uint> [#uses=0] + store bool false, bool* %alllosers.b + call void %llvm.memset.i32( sbyte* cast ([300 x int]* %rootlosers to sbyte*), ubyte 0, uint 1200, uint 4 ) + %nodesspent.i = cast [512 x int]* null to sbyte* ; <sbyte*> [#uses=1] + call void %llvm.memset.i32( sbyte* %nodesspent.i, ubyte 0, uint 2048, uint 16 ) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 0) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 1) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 2) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 3) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 4) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 5) + %tmp.i.i = load int* %Variant ; <int> [#uses=1] + %tmp.i.i = seteq int %tmp.i.i, 3 ; <bool> [#uses=1] + br bool %tmp.i.i, label %in_check.exit.i, label %cond_next.i.i + +cond_next.i.i: ; preds = %bb260 + %tmp2.i.i = load int* %white_to_move ; <int> [#uses=1] + %tmp3.i.i = seteq int %tmp2.i.i, 1 ; <bool> [#uses=1] + br bool %tmp3.i.i, label %cond_true4.i.i, label %cond_false12.i.i + +cond_true4.i.i: ; preds = %cond_next.i.i + %tmp5.i.i = load int* %wking_loc ; <int> [#uses=1] + %tmp6.i.i = call fastcc uint %is_attacked( int %tmp5.i.i, int 0 ) ; <uint> [#uses=1] + %not.tmp7.i.i = setne uint %tmp6.i.i, 0 ; <bool> [#uses=1] + %tmp217.i = cast bool %not.tmp7.i.i to int ; <int> [#uses=1] + %tmp4219.i = setgt int %tmp3.i4, 0 ; <bool> [#uses=1] + br bool %tmp4219.i, label %cond_true43.i, label %bb46.i + +cond_false12.i.i: ; preds = %cond_next.i.i + %tmp13.i.i = load int* %bking_loc ; <int> [#uses=1] + %tmp14.i.i = call fastcc uint %is_attacked( int %tmp13.i.i, int 1 ) ; <uint> [#uses=1] + %not.tmp15.i.i = setne uint %tmp14.i.i, 0 ; <bool> [#uses=1] + %tmp2120.i = cast bool %not.tmp15.i.i to int ; <int> [#uses=1] + %tmp4222.i = setgt int %tmp3.i4, 0 ; <bool> [#uses=1] + br bool %tmp4222.i, label %cond_true43.i, label %bb46.i + +in_check.exit.i: ; preds = %bb260 + %tmp4224.i = setgt int %tmp3.i4, 0 ; <bool> [#uses=0] + ret void + +cond_true43.i: ; preds = %cond_false12.i.i, %cond_true4.i.i + %tmp21.0.ph.i = phi int [ %tmp217.i, %cond_true4.i.i ], [ %tmp2120.i, %cond_false12.i.i ] ; <int> [#uses=1] + %i.0.0.i = cast uint 0 to int ; <int> [#uses=2] + call fastcc void %make( %struct.move_s* %tmp.i.move_s, int %i.0.0.i ) + %tmp27.i = call fastcc uint %check_legal( %struct.move_s* %tmp.i.move_s, int %i.0.0.i, int %tmp21.0.ph.i ) ; <uint> [#uses=1] + %tmp.i6 = seteq uint %tmp27.i, 0 ; <bool> [#uses=0] + ret void + +bb46.i: ; preds = %cond_false12.i.i, %cond_true4.i.i + %tmp48.i = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp48.i, label %cond_true49.i, label %cond_next53.i + +cond_true49.i: ; preds = %bb46.i + store int 0, int* %bufftop + %tmp50.i = load ubyte** %membuff ; <ubyte*> [#uses=1] + free ubyte* %tmp50.i + free sbyte* %tmp2.i3 + ret void + +cond_next53.i: ; preds = %bb46.i + store int 1, int* %nodecount + store int 0, int* %iters + store int 0, int* %maxply + store int 0, int* %forwards + %tmp54.i = load int* %move_number ; <int> [#uses=1] + %tmp55.i = load int* %ply ; <int> [#uses=1] + %tmp56.i = add int %tmp54.i, -1 ; <int> [#uses=1] + %tmp57.i = add int %tmp56.i, %tmp55.i ; <int> [#uses=1] + %tmp58.i = load uint* %hash ; <uint> [#uses=1] + %tmp.i = getelementptr [600 x uint]* %hash_history, int 0, int %tmp57.i ; <uint*> [#uses=1] + store uint %tmp58.i, uint* %tmp.i + %tmp59.i = load int* %white_to_move ; <int> [#uses=1] + %tmp60.i = seteq int %tmp59.i, 0 ; <bool> [#uses=1] + %tmp60.i = cast bool %tmp60.i to int ; <int> [#uses=1] + store int %tmp60.i, int* %root_to_move + %tmp.i4.i = load int* %Variant ; <int> [#uses=2] + %tmp.i5.i = seteq int %tmp.i4.i, 3 ; <bool> [#uses=1] + br bool %tmp.i5.i, label %cond_true.i.i, label %cond_false.i.i + +cond_true.i.i: ; preds = %cond_next53.i + call fastcc void %suicide_pn_eval( %struct.node_t* %tmp2.i ) + %tmp6328.i = getelementptr %struct.node_t* %tmp2.i, int 0, uint 0 ; <ubyte*> [#uses=1] + %tmp29.i = load ubyte* %tmp6328.i ; <ubyte> [#uses=1] + %tmp6430.i = seteq ubyte %tmp29.i, 1 ; <bool> [#uses=0] + ret void + +cond_false.i.i: ; preds = %cond_next53.i + %tmp2.i.i = seteq int %tmp.i4.i, 4 ; <bool> [#uses=1] + %tmp63.i = getelementptr %struct.node_t* %tmp2.i, int 0, uint 0 ; <ubyte*> [#uses=2] + br bool %tmp2.i.i, label %cond_true3.i.i, label %cond_false5.i.i + +cond_true3.i.i: ; preds = %cond_false.i.i + call fastcc void %losers_pn_eval( %struct.node_t* %tmp2.i ) + %tmp31.i = load ubyte* %tmp63.i ; <ubyte> [#uses=1] + %tmp6432.i = seteq ubyte %tmp31.i, 1 ; <bool> [#uses=1] + br bool %tmp6432.i, label %bb75.i, label %cond_next67.i + +cond_false5.i.i: ; preds = %cond_false.i.i + call fastcc void %std_pn_eval( %struct.node_t* %tmp2.i ) + %tmp.i = load ubyte* %tmp63.i ; <ubyte> [#uses=1] + %tmp64.i = seteq ubyte %tmp.i, 1 ; <bool> [#uses=0] + ret void + +cond_next67.i: ; preds = %cond_true3.i.i + %tmp69.i = getelementptr %struct.node_t* %tmp2.i, int 0, uint 0 ; <ubyte*> [#uses=1] + %tmp70.i = load ubyte* %tmp69.i ; <ubyte> [#uses=1] + %tmp71.i = seteq ubyte %tmp70.i, 0 ; <bool> [#uses=0] + ret void + +bb75.i: ; preds = %cond_true3.i.i + store int 0, int* %bufftop + %tmp76.i = load ubyte** %membuff ; <ubyte*> [#uses=1] + free ubyte* %tmp76.i + free sbyte* %tmp2.i3 + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 0) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 1) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 2) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 3) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 4) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 5) + %tmp28869 = load int* %result ; <int> [#uses=1] + %tmp28970 = seteq int %tmp28869, 0 ; <bool> [#uses=1] + br bool %tmp28970, label %cond_next337, label %cond_true290 + +bb263: ; preds = %bb249, %cond_next238, %cond_true226.critedge + br bool %tmp21362, label %cond_true266, label %bb287 + +cond_true266: ; preds = %bb263 + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 0) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 1) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 2) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 3) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 4) + store int 0, int* getelementptr (%struct.move_s* %pn_move, uint 0, uint 5) + %tmp28871 = load int* %result ; <int> [#uses=1] + %tmp28972 = seteq int %tmp28871, 0 ; <bool> [#uses=0] + ret void + +bb287.critedge: ; preds = %cond_false210 + %tmp218.c = div double 1.999998e+06, %tmp217 ; <double> [#uses=1] + %tmp218.c = cast double %tmp218.c to int ; <int> [#uses=2] + store int %tmp218.c, int* %time_for_move + %tmp22367.c = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([20 x sbyte]* %str43, int 0, uint 0), int %tmp218.c ) ; <int> [#uses=0] + ret void + +bb287: ; preds = %bb263 + %tmp288 = load int* %result ; <int> [#uses=1] + %tmp289 = seteq int %tmp288, 0 ; <bool> [#uses=0] + ret void + +cond_true290: ; preds = %bb75.i + %tmp292 = load int* getelementptr (%struct.move_s* %pn_move, int 0, uint 1) ; <int> [#uses=1] + %tmp295 = seteq int %tmp292, 0 ; <bool> [#uses=0] + ret void + +cond_next337: ; preds = %bb75.i + %tmp338.b = load bool* %forcedwin.b ; <bool> [#uses=1] + br bool %tmp338.b, label %bb348, label %cond_next342 + +cond_next342: ; preds = %cond_next337 + %tmp343 = load int* %result ; <int> [#uses=1] + %tmp344 = seteq int %tmp343, 0 ; <bool> [#uses=0] + ret void + +bb348: ; preds = %cond_next337 + %tmp350 = load int* getelementptr (%struct.move_s* %pn_move, int 0, uint 1) ; <int> [#uses=1] + %tmp353 = seteq int %tmp350, 0 ; <bool> [#uses=0] + ret void +} + +declare fastcc int %eval(int, int) + +declare sbyte* %fgets(sbyte*, int, %struct.FILE*) + +declare int %fclose(%struct.FILE*) + +declare fastcc int %losers_eval() + +declare fastcc int %l_bishop_mobility(int) + +declare fastcc int %l_rook_mobility(int) + +declare fastcc uint %check_legal(%struct.move_s*, int, int) + +declare fastcc void %gen(%struct.move_s*) + +declare fastcc void %push_pawn(int, uint) + +declare fastcc void %push_knighT(int) + +declare fastcc void %push_slidE(int) + +declare fastcc void %push_king(int) + +declare fastcc uint %f_in_check(%struct.move_s*, int) + +declare fastcc void %make(%struct.move_s*, int) + +declare fastcc void %add_capture(int, int, int) + +declare fastcc void %unmake(%struct.move_s*, int) + +declare int %ErrorIt(int, int) + +declare int %Pawn(int, int) + +declare int %Knight(int, int) + +declare int %King(int, int) + +declare int %Rook(int, int) + +declare int %Queen(int, int) + +declare int %Bishop(int, int) + +declare fastcc void %check_phase() + +declare fastcc int %bishop_mobility(int) + +declare fastcc int %rook_mobility(int) + +declare int %sscanf(sbyte*, sbyte*, ...) + +declare int %strncmp(sbyte*, sbyte*, uint) + +declare sbyte* %strchr(sbyte*, int) + +declare fastcc void %CheckBadFlow(uint) + +declare fastcc void %suicide_pn_eval(%struct.node_t*) + +declare fastcc void %losers_pn_eval(%struct.node_t*) + +declare fastcc void %std_pn_eval(%struct.node_t*) + +declare fastcc %struct.node_t* %select_most_proving(%struct.node_t*) + +declare fastcc void %set_proof_and_disproof_numbers(%struct.node_t*) + +declare fastcc void %StoreTT(int, int, int, int, int, int) + +declare fastcc void %develop_node(%struct.node_t*) + +declare fastcc void %update_ancestors(%struct.node_t*) + +declare sbyte* %calloc(uint, uint) + +declare fastcc void %comp_to_coord(long, long, long, sbyte*) + +declare sbyte* %strcat(sbyte*, sbyte*) + +declare int %sprintf(sbyte*, sbyte*, ...) + +declare fastcc void %order_moves(%struct.move_s*, int*, int*, int, int) + +declare fastcc int %see(int, int, int) + +declare fastcc void %perft(int) + +declare fastcc int %qsearch(int, int, int) + +declare fastcc int %allocate_time() + +declare fastcc void %QStoreTT(int, int, int, int) + +declare fastcc int %search(int, int, int, int) + +declare fastcc int %ProbeTT(int*, int, int*, int*, int*, int) + +declare csretcc void %search_root(%struct.move_s*, int, int, int) + +declare fastcc void %post_fh_thinking(int, %struct.move_s*) + +declare fastcc void %post_thinking(int) + +declare int %fprintf(%struct.FILE*, sbyte*, ...) + +declare fastcc int %s_bishop_mobility(int) + +declare fastcc int %s_rook_mobility(int) + +declare fastcc int %suicide_mid_eval() + +declare int %main(int, sbyte**) + +declare fastcc void %init_game() + +declare void %setbuf(%struct.FILE*, sbyte*) + +declare sbyte* %strcpy(sbyte*, sbyte*) + +declare int %__tolower(int) + +declare int %strcmp(sbyte*, sbyte*) + +declare void (int)* %signal(int, void (int)*) + +declare fastcc void %hash_extract_pv(int, sbyte*) + +declare double %difftime(int, int) + +declare int %getc(%struct.FILE*) + +declare uint %strlen(sbyte*) + +declare uint %fwrite(sbyte*, uint, uint, %struct.FILE*) diff --git a/test/Transforms/DeadStoreElimination/PartialStore.ll b/test/Transforms/DeadStoreElimination/PartialStore.ll new file mode 100644 index 0000000..bdc16db --- /dev/null +++ b/test/Transforms/DeadStoreElimination/PartialStore.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \ +; RUN: not grep {store sbyte} +; Ensure that the dead store is deleted in this case. It is wholely +; overwritten by the second store. +int %test() { + %V = alloca int + %V2 = cast int* %V to sbyte* + store sbyte 0, sbyte* %V2 + store int 1234567, int* %V + %X = load int* %V + ret int %X +} diff --git a/test/Transforms/DeadStoreElimination/alloca.llx b/test/Transforms/DeadStoreElimination/alloca.llx new file mode 100644 index 0000000..d7aacb5 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/alloca.llx @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | not grep DEAD + +void %test(int* %Q) { + %P = alloca int + %DEAD = load int* %Q + store int %DEAD, int* %P ;; Alloca goes out of scope, dead store. + ret void +} diff --git a/test/Transforms/DeadStoreElimination/context-sensitive.llx b/test/Transforms/DeadStoreElimination/context-sensitive.llx new file mode 100644 index 0000000..54396d4 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/context-sensitive.llx @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | not grep DEAD + +declare void %ext() + +int* %caller() { + %P = malloc int + %DEAD = load int* %P + %DEAD2 = add int %DEAD, 1 + store int %DEAD2, int* %P ;; dead store + + call void %ext() ; Can not clobber *P + + store int 0, int* %P + ret int* %P +} diff --git a/test/Transforms/DeadStoreElimination/dg.exp b/test/Transforms/DeadStoreElimination/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/DeadStoreElimination/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/DeadStoreElimination/free.llx b/test/Transforms/DeadStoreElimination/free.llx new file mode 100644 index 0000000..3f0db04 --- /dev/null +++ b/test/Transforms/DeadStoreElimination/free.llx @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | not grep DEAD + +void %test(int* %Q, int* %P) { + %DEAD = load int* %Q + store int %DEAD, int* %P + free int* %P + ret void +} diff --git a/test/Transforms/DeadStoreElimination/simple.llx b/test/Transforms/DeadStoreElimination/simple.llx new file mode 100644 index 0000000..e0ce12d --- /dev/null +++ b/test/Transforms/DeadStoreElimination/simple.llx @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | not grep DEAD + +void %test(int* %Q, int* %P) { + %DEAD = load int* %Q + store int %DEAD, int* %P + store int 0, int* %P + ret void +} diff --git a/test/Transforms/DecomposeMultiDimRefs/dg.exp b/test/Transforms/DecomposeMultiDimRefs/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/DecomposeMultiDimRefs/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/GCSE/2002-05-14-OperandSwap.ll b/test/Transforms/GCSE/2002-05-14-OperandSwap.ll new file mode 100644 index 0000000..51183b8 --- /dev/null +++ b/test/Transforms/GCSE/2002-05-14-OperandSwap.ll @@ -0,0 +1,18 @@ +; This entire chain of computation should be optimized away, but +; wasn't because the two multiplies were not detected as being identical. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -gcse -instcombine -dce | \ +; RUN: llvm-dis | not grep sub + +implementation ; Functions: + +uint "vnum_test4"(uint* %data) { + %idx1 = getelementptr uint* %data, uint 1 + %idx2 = getelementptr uint* %data, uint 3 + %reg1101 = load uint* %idx1 + %reg1111 = load uint* %idx2 + %reg109 = mul uint %reg1101, %reg1111 + %reg108 = mul uint %reg1111, %reg1101 + %reg121 = sub uint %reg108, %reg109 + ret uint %reg121 +} diff --git a/test/Transforms/GCSE/2002-05-21-NoSharedDominator.ll b/test/Transforms/GCSE/2002-05-21-NoSharedDominator.ll new file mode 100644 index 0000000..2c78695 --- /dev/null +++ b/test/Transforms/GCSE/2002-05-21-NoSharedDominator.ll @@ -0,0 +1,13 @@ +; This testcase shows a bug where an common subexpression exists, but there +; is no shared dominator block that the expression can be hoisted out to. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -gcse | llvm-dis + +int "test"(int %X, int %Y) { + %Z = add int %X, %Y + ret int %Z + +Unreachable: + %Q = add int %X, %Y + ret int %Q +} diff --git a/test/Transforms/GCSE/2003-06-13-LoadStoreEliminate.ll b/test/Transforms/GCSE/2003-06-13-LoadStoreEliminate.ll new file mode 100644 index 0000000..4ebb66c --- /dev/null +++ b/test/Transforms/GCSE/2003-06-13-LoadStoreEliminate.ll @@ -0,0 +1,11 @@ +; This testcase shows a bug where an common subexpression exists, but there +; is no shared dominator block that the expression can be hoisted out to. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse | llvm-dis | not grep load + +int %test(int* %P) { + store int 5, int* %P + %Z = load int* %P + ret int %Z +} + diff --git a/test/Transforms/GCSE/dg.exp b/test/Transforms/GCSE/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/GCSE/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/GCSE/gcsetests.ll b/test/Transforms/GCSE/gcsetests.ll new file mode 100644 index 0000000..b866bb7 --- /dev/null +++ b/test/Transforms/GCSE/gcsetests.ll @@ -0,0 +1,57 @@ +; Various test cases to ensure basic functionality is working for GCSE + +; RUN: llvm-upgrade < %s | llvm-as | opt -gcse + +implementation + +void "testinsts"(int %i, int %j, int* %p) +begin + %A = cast int %i to uint + %B = cast int %i to uint + + %C = shl int %i, ubyte 1 + %D = shl int %i, ubyte 1 + + %E = getelementptr int* %p, long 12 + %F = getelementptr int* %p, long 12 + %G = getelementptr int* %p, long 13 + ret void +end + + +; Test different combinations of domination properties... +void "sameBBtest"(int %i, int %j) +begin + %A = add int %i, %j + %B = add int %i, %j + + %C = xor int %A, -1 + %D = xor int %B, -1 + %E = xor int %j, -1 + + ret void +end + +int "dominates"(int %i, int %j) +begin + %A = add int %i, %j + br label %BB2 + +BB2: + %B = add int %i, %j + ret int %B +end + +int "hascommondominator"(int %i, int %j) +begin + br bool true, label %BB1, label %BB2 + +BB1: + %A = add int %i, %j + ret int %A + +BB2: + %B = add int %i, %j + ret int %B +end + diff --git a/test/Transforms/GCSE/vectorops.ll b/test/Transforms/GCSE/vectorops.ll new file mode 100644 index 0000000..694d9d5 --- /dev/null +++ b/test/Transforms/GCSE/vectorops.ll @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -gcse -instcombine | \ +; RUN: llvm-dis | not grep sub + +uint %test_extractelement(<4 x uint> %V) { + %R = extractelement <4 x uint> %V, uint 1 + %R2 = extractelement <4 x uint> %V, uint 1 + %V = sub uint %R, %R2 + ret uint %V +} + +<4 x uint> %test_insertelement(<4 x uint> %V) { + %R = insertelement <4 x uint> %V, uint 0, uint 0 + %R2 = insertelement <4 x uint> %V, uint 0, uint 0 + %x = sub <4 x uint> %R, %R2 + ret <4 x uint> %x +} + +<4 x uint> %test_shufflevector(<4 x uint> %V) { + %R = shufflevector <4 x uint> %V, <4 x uint> %V, + <4 x uint> < uint 1, uint undef, uint 7, uint 2> + %R2 = shufflevector <4 x uint> %V, <4 x uint> %V, + <4 x uint> < uint 1, uint undef, uint 7, uint 2> + %x = sub <4 x uint> %R, %R2 + ret <4 x uint> %x +} + diff --git a/test/Transforms/GVNPRE/2007-06-12-NoExit.ll b/test/Transforms/GVNPRE/2007-06-12-NoExit.ll new file mode 100644 index 0000000..b93a956 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-12-NoExit.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define void @_Z4sortI3Lit16LessThan_defaultIS0_EEvPT_iT0_() { +entry: + br label %cond_false + +cond_false: ; preds = %cond_false, %entry + br label %cond_false +} diff --git a/test/Transforms/GVNPRE/2007-06-12-PhiTranslate.ll b/test/Transforms/GVNPRE/2007-06-12-PhiTranslate.ll new file mode 100644 index 0000000..3a6ac67 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-12-PhiTranslate.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define void @strength_test5(i32* %data) { +entry: + br i1 false, label %cond_next16.preheader, label %cond_true + +cond_true: ; preds = %entry + %tmp12 = icmp sgt i32 0, 0 ; <i1> [#uses=1] + br i1 %tmp12, label %return, label %cond_next16.preheader + +cond_next16.preheader: ; preds = %cond_true, %entry + %i.01.1.ph = phi i32 [ 1, %entry ], [ 1, %cond_true ] ; <i32> [#uses=1] + %i.01.1 = add i32 0, %i.01.1.ph ; <i32> [#uses=0] + %indvar.next = add i32 0, 1 ; <i32> [#uses=0] + ret void + +return: ; preds = %cond_true + ret void +} diff --git a/test/Transforms/GVNPRE/2007-06-15-InvokeInst.ll b/test/Transforms/GVNPRE/2007-06-15-InvokeInst.ll new file mode 100644 index 0000000..1d8f3b5 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-15-InvokeInst.ll @@ -0,0 +1,70 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +@.str1 = external constant [4 x i8] ; <[4 x i8]*> [#uses=1] +@.str2 = external constant [5 x i8] ; <[5 x i8]*> [#uses=1] + +define i32 @main(i32 %argc, i8** %argv) { +entry: + br i1 false, label %cond_next, label %cond_true + +cond_true: ; preds = %entry + ret i32 0 + +cond_next: ; preds = %entry + %tmp10 = invoke i16 @_ZN12token_stream4openEPKc( i8* null, i8* null ) sext + to label %invcont unwind label %cleanup690 ; <i16> [#uses=0] + +invcont: ; preds = %cond_next + %tmp15 = invoke i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @.str1, i32 0, i32 0) ) + to label %invcont14 unwind label %cleanup685 ; <i32> [#uses=0] + +invcont14: ; preds = %invcont + %tmp17 = invoke i8* @_ZN24lambda_expression_parser10expressionEPP11arglst_node( i8* null, i8** null ) + to label %cond_true22 unwind label %cleanup685 + +cond_true22: ; preds = %invcont14 + %tmp35 = invoke i32 null( i8* null ) + to label %cond_next56 unwind label %cleanup685 ; <i32> [#uses=0] + +cond_next56: ; preds = %cond_true22 + %tmp59 = invoke i32 (i8*, ...)* @printf( i8* getelementptr ([5 x i8]* @.str2, i32 0, i32 0) ) + to label %invcont58 unwind label %cleanup685 ; <i32> [#uses=0] + +invcont58: ; preds = %cond_next56 + invoke void null( i8* null, i8* null, i32 0 ) + to label %invcont72 unwind label %cleanup685 + +invcont72: ; preds = %invcont58 + %tmp143 = invoke i32 null( i8* null ) + to label %invcont142 unwind label %cleanup685 ; <i32> [#uses=0] + +invcont142: ; preds = %invcont72 + br i1 false, label %cond_false407, label %cond_true150 + +cond_true150: ; preds = %invcont142 + ret i32 0 + +cond_false407: ; preds = %invcont142 + %tmp431 = invoke i8* null( i8* null, i8* null, i32 0, i32* null ) + to label %bb432 unwind label %cleanup685 + +bb432: ; preds = %bb432, %cond_false407 + %rexp413.7 = phi i8* [ %tmp431, %cond_false407 ], [ %rexp413.7, %bb432 ] + %tmp434 = icmp eq i8* %rexp413.7, null ; <i1> [#uses=1] + br i1 %tmp434, label %bb432, label %cond_true437 + +cond_true437: ; preds = %bb432 + ret i32 0 + +cleanup685: ; preds = %cond_false407, %invcont72, %invcont58, %cond_next56, %cond_true22, %invcont14, %invcont + ret i32 0 + +cleanup690: ; preds = %cond_next + ret i32 0 +} + +declare i16 @_ZN12token_stream4openEPKc(i8*, i8*) sext + +declare i32 @printf(i8*, ...) + +declare i8* @_ZN24lambda_expression_parser10expressionEPP11arglst_node(i8*, i8**) diff --git a/test/Transforms/GVNPRE/2007-06-15-Looping.ll b/test/Transforms/GVNPRE/2007-06-15-Looping.ll new file mode 100644 index 0000000..92d2288 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-15-Looping.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define fastcc void @compute_max_score_1() { +entry: + %tmp7 = sub i32 0, 0 ; <i32> [#uses=0] + br label %bb + +bb: ; preds = %bb212, %entry + %indvar29 = phi i32 [ 0, %entry ], [ %indvar.next30, %bb212 ] ; <i32> [#uses=2] + %j.01.0 = sub i32 %indvar29, 0 ; <i32> [#uses=0] + br label %cond_next166 + +cond_next166: ; preds = %cond_next166, %bb + br i1 false, label %bb212, label %cond_next166 + +bb212: ; preds = %cond_next166 + %indvar.next30 = add i32 %indvar29, 1 ; <i32> [#uses=1] + br i1 false, label %return, label %bb + +return: ; preds = %bb212 + ret void +} diff --git a/test/Transforms/GVNPRE/2007-06-18-ConstantInPhi.ll b/test/Transforms/GVNPRE/2007-06-18-ConstantInPhi.ll new file mode 100644 index 0000000..b4cb517 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-18-ConstantInPhi.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define void @vorbis_lsp_to_curve() { +entry: + br i1 false, label %bb.nph, label %return + +bb.nph: ; preds = %entry + br label %bb34 + +bb34: ; preds = %bb34, %bb.nph + %p.1 = phi float [ 0x3FE6A09E60000000, %bb.nph ], [ %tmp48, %bb34 ] ; <float> [#uses=1] + %tmp44 = load float* null ; <float> [#uses=1] + %tmp46 = sub float %tmp44, 0.000000e+00 ; <float> [#uses=1] + %tmp48 = mul float %tmp46, %p.1 ; <float> [#uses=1] + br i1 false, label %bb57, label %bb34 + +bb57: ; preds = %bb34 + ret void + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/GVNPRE/2007-06-18-EraseNumbering.ll b/test/Transforms/GVNPRE/2007-06-18-EraseNumbering.ll new file mode 100644 index 0000000..af51a03 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-06-18-EraseNumbering.ll @@ -0,0 +1,26 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define i32 @TreeCCStreamFlush(i8* %stream) { +entry: + br i1 false, label %bb55.preheader, label %cond_true + +cond_true: ; preds = %entry + ret i32 0 + +bb55.preheader: ; preds = %entry + %tmp57 = icmp eq i8* null, null ; <i1> [#uses=0] + br i1 false, label %cond_next106, label %bb124 + +cond_next106: ; preds = %bb55.preheader + %tmp109 = load i8** null + br i1 false, label %bb124, label %bb116 + +bb116: ; preds = %cond_next106 + ret i32 0 + +bb124: ; preds = %cond_next106, %bb55.preheader + %buffer.4 = phi i8* [ null, %bb55.preheader ], [ %tmp109, %cond_next106 ] + %tmp131 = icmp eq i8* %buffer.4, null + %bothcond = or i1 %tmp131, false + ret i32 0 +} diff --git a/test/Transforms/GVNPRE/2007-07-03-PhiTranslateGEP.ll b/test/Transforms/GVNPRE/2007-07-03-PhiTranslateGEP.ll new file mode 100644 index 0000000..65d70d9 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-07-03-PhiTranslateGEP.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define i64 @foo({ i32, i32 }** %__v) { +entry: + br label %bb + +bb: ; preds = %bb, %entry + %__x.066.0 = phi { i32, i32 }* [ null, %entry ], [ null, %bb ] + %tmp2.i.i63 = getelementptr { i32, i32 }* %__x.066.0, i32 0, i32 1 + br i1 false, label %bb, label %cond_true + +cond_true: ; preds = %bb + ret i64 0 +} diff --git a/test/Transforms/GVNPRE/2007-07-04-CleanSelect.ll b/test/Transforms/GVNPRE/2007-07-04-CleanSelect.ll new file mode 100644 index 0000000..d72e2e1 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-07-04-CleanSelect.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define i32* @_ZN6Solver9propagateEv(i32* %this) { +entry: + %tmp15.i48 = load i8* null ; <i8> [#uses=2] + %tmp64.i.i51 = sub i8 0, %tmp15.i48 ; <i8> [#uses=1] + %tmp231.i52 = select i1 false, i8 %tmp15.i48, i8 %tmp64.i.i51 ; <i8> [#uses=0] + ret i32* null +} diff --git a/test/Transforms/GVNPRE/2007-07-04-SelectInst.ll b/test/Transforms/GVNPRE/2007-07-04-SelectInst.ll new file mode 100644 index 0000000..944a700 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-07-04-SelectInst.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + +define void @set_depth_values(i32 %level) { +cond_true90: ; preds = %cond_next84 + br i1 false, label %cond_true105, label %cond_true151 + +cond_true105: ; preds = %cond_true90 + %tmp132 = add i32 %level, -3 ; <i32> [#uses=2] + %tmp133 = icmp sgt i32 %tmp132, 0 ; <i1> [#uses=1] + %max134 = select i1 %tmp133, i32 %tmp132, i32 1 ; <i32> [#uses=0] + br label %cond_true151 + +cond_true151: ; preds = %cond_true140, %cond_true105 + %tmp153 = add i32 %level, -3 ; <i32> [#uses=2] + %tmp154 = icmp sgt i32 %tmp153, 0 ; <i1> [#uses=1] + %max155 = select i1 %tmp154, i32 %tmp153, i32 1 ; <i32> [#uses=0] + ret void +} diff --git a/test/Transforms/GVNPRE/2007-07-05-AvailabilityUpdating.ll b/test/Transforms/GVNPRE/2007-07-05-AvailabilityUpdating.ll new file mode 100644 index 0000000..5510935 --- /dev/null +++ b/test/Transforms/GVNPRE/2007-07-05-AvailabilityUpdating.ll @@ -0,0 +1,54 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep tmp114115.gvnpre + + %struct.AV = type { %struct.XPVAV*, i32, i32 } + %struct.CLONE_PARAMS = type { %struct.AV*, i32, %struct.PerlInterpreter* } + %struct.HE = type { %struct.HE*, %struct.HEK*, %struct.SV* } + %struct.HEK = type { i32, i32, [1 x i8] } + %struct.HV = type { %struct.XPVHV*, i32, i32 } + %struct.MAGIC = type { %struct.MAGIC*, %struct.MGVTBL*, i16, i8, i8, %struct.SV*, i8*, i32 } + %struct.MGVTBL = type { i32 (%struct.SV*, %struct.MAGIC*)*, i32 (%struct.SV*, %struct.MAGIC*)*, i32 (%struct.SV*, %struct.MAGIC*)*, i32 (%struct.SV*, %struct.MAGIC*)*, i32 (%struct.SV*, %struct.MAGIC*)*, i32 (%struct.SV*, %struct.MAGIC*, %struct.SV*, i8*, i32)*, i32 (%struct.MAGIC*, %struct.CLONE_PARAMS*)* } + %struct.OP = type { %struct.OP*, %struct.OP*, %struct.OP* ()*, i32, i16, i16, i8, i8 } + %struct.PMOP = type { %struct.OP*, %struct.OP*, %struct.OP* ()*, i32, i16, i16, i8, i8, %struct.OP*, %struct.OP*, %struct.OP*, %struct.OP*, %struct.PMOP*, %struct.REGEXP*, i32, i32, i8, %struct.HV* } + %struct.PerlInterpreter = type { i8 } + %struct.REGEXP = type { i32*, i32*, %struct.regnode*, %struct.reg_substr_data*, i8*, %struct.reg_data*, i8*, i32*, i32, i32, i32, i32, i32, i32, i32, i32, [1 x %struct.regnode] } + %struct.SV = type { i8*, i32, i32 } + %struct.XPVAV = type { i8*, i32, i32, i32, double, %struct.MAGIC*, %struct.HV*, %struct.SV**, %struct.SV*, i8 } + %struct.XPVHV = type { i8*, i32, i32, i32, double, %struct.MAGIC*, %struct.HV*, i32, %struct.HE*, %struct.PMOP*, i8* } + %struct.reg_data = type { i32, i8*, [1 x i8*] } + %struct.reg_substr_data = type { [3 x %struct.reg_substr_datum] } + %struct.reg_substr_datum = type { i32, i32, %struct.SV*, %struct.SV* } + %struct.regnode = type { i8, i8, i16 } + +define void @Perl_op_clear(%struct.OP* %o) { +entry: + switch i32 0, label %bb106 [ + i32 13, label %bb106 + i32 31, label %clear_pmop + i32 32, label %clear_pmop + i32 33, label %bb101 + ] + +bb101: ; preds = %entry + %tmp102103 = bitcast %struct.OP* %o to %struct.PMOP* ; <%struct.PMOP*> [#uses=1] + %tmp104 = getelementptr %struct.PMOP* %tmp102103, i32 0, i32 10 ; <%struct.OP**> [#uses=0] + br i1 false, label %cond_next174, label %cond_true122 + +bb106: ; preds = %entry, %entry + %tmp107108 = bitcast %struct.OP* %o to %struct.PMOP* ; <%struct.PMOP*> [#uses=0] + br label %clear_pmop + +clear_pmop: ; preds = %bb106, %entry, %entry + %tmp114115 = bitcast %struct.OP* %o to %struct.PMOP* ; <%struct.PMOP*> [#uses=0] + br label %cond_true122 + +cond_true122: ; preds = %clear_pmop, %bb101 + br i1 false, label %cond_next174, label %cond_true129 + +cond_true129: ; preds = %cond_true122 + ret void + +cond_next174: ; preds = %cond_true122, %bb101 + %tmp175176 = bitcast %struct.OP* %o to %struct.PMOP* ; <%struct.PMOP*> [#uses=1] + %tmp177 = getelementptr %struct.PMOP* %tmp175176, i32 0, i32 10 ; <%struct.OP**> [#uses=0] + ret void +} diff --git a/test/Transforms/GVNPRE/2007-07-07-AnticOutUnique.ll b/test/Transforms/GVNPRE/2007-07-07-AnticOutUnique.ll new file mode 100644 index 0000000..2a7e49c --- /dev/null +++ b/test/Transforms/GVNPRE/2007-07-07-AnticOutUnique.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis + %"struct.ObjectArena<char>" = type { i32, i32, %"struct.ResizeArray<char*>", i8*, i8* } + %"struct.ResizeArray<char*>" = type { i32 (...)**, %"struct.ResizeArrayRaw<char*>"* } + %"struct.ResizeArrayRaw<char*>" = type { i8**, i8*, i32, i32, i32, float, i32 } + +define void @_ZN11ObjectArenaIcED1Ev(%"struct.ObjectArena<char>"* %this) { +entry: + br label %cond_true21 + +cond_true21: ; preds = %cond_true21, %entry + %tmp215.0 = phi %"struct.ResizeArray<char*>"* [ null, %entry ], [ null, %cond_true21 ] ; <%"struct.ResizeArray<char*>"*> [#uses=1] + %tmp2.i2 = getelementptr %"struct.ResizeArray<char*>"* %tmp215.0, i32 0, i32 1 ; <%"struct.ResizeArrayRaw<char*>"**> [#uses=0] + br label %cond_true21 +} diff --git a/test/Transforms/GVNPRE/basic.ll b/test/Transforms/GVNPRE/basic.ll new file mode 100644 index 0000000..b746873 --- /dev/null +++ b/test/Transforms/GVNPRE/basic.ll @@ -0,0 +1,38 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | not grep {%z3 =} +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | not grep {%z9 =} + +define i32 @main() { +block1: + %z1 = bitcast i32 0 to i32 ; <i32> [#uses=5] + br label %block2 + +block2: ; preds = %block6, %block1 + %z2 = phi i32 [ %z1, %block1 ], [ %z3, %block6 ] ; <i32> [#uses=3] + %z3 = add i32 %z2, 1 ; <i32> [#uses=5] + br i1 false, label %block3, label %block7 + +block3: ; preds = %block2 + br i1 true, label %block4, label %block5 + +block4: ; preds = %block3 + %z4 = add i32 %z2, %z3 ; <i32> [#uses=1] + %z5 = bitcast i32 %z4 to i32 ; <i32> [#uses=1] + %z6 = add i32 %z1, %z5 ; <i32> [#uses=0] + br label %block6 + +block5: ; preds = %block3 + %z7 = add i32 %z3, 1 ; <i32> [#uses=1] + br label %block6 + +block6: ; preds = %block5, %block4 + %z8 = phi i32 [ %z1, %block4 ], [ %z7, %block5 ] ; <i32> [#uses=1] + %z9 = add i32 %z2, %z3 ; <i32> [#uses=2] + %z10 = add i32 %z9, %z8 ; <i32> [#uses=0] + %z11 = bitcast i32 12 to i32 ; <i32> [#uses=1] + %z12 = add i32 %z9, %z11 ; <i32> [#uses=1] + %z13 = add i32 %z12, %z3 ; <i32> [#uses=0] + br label %block2 + +block7: ; preds = %block2 + ret i32 %z1 +} diff --git a/test/Transforms/GVNPRE/cast.ll b/test/Transforms/GVNPRE/cast.ll new file mode 100644 index 0000000..3536a14 --- /dev/null +++ b/test/Transforms/GVNPRE/cast.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract() { +entry: ; preds = %cond_false, %entry + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = sext i16 0 to i32 + br label %end + +end: + %b = sext i16 0 to i32 + ret i32 %b +} diff --git a/test/Transforms/GVNPRE/dg.exp b/test/Transforms/GVNPRE/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/GVNPRE/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/GVNPRE/extractelement.ll b/test/Transforms/GVNPRE/extractelement.ll new file mode 100644 index 0000000..7d05c8f --- /dev/null +++ b/test/Transforms/GVNPRE/extractelement.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract() { +entry: ; preds = %cond_false, %entry + %foo = add <2 x i32> < i32 1, i32 1 >, < i32 1, i32 1 > + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = extractelement <2 x i32> %foo, i32 0 + br label %end + +end: + %b = extractelement <2 x i32> %foo, i32 0 + ret i32 %b +} diff --git a/test/Transforms/GVNPRE/gep.ll b/test/Transforms/GVNPRE/gep.ll new file mode 100644 index 0000000..34bc4c7 --- /dev/null +++ b/test/Transforms/GVNPRE/gep.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract({ i32 }* %P) { +entry: ; preds = %cond_false, %entry + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = getelementptr { i32 }* %P, i32 0, i32 0 + br label %end + +end: + %b = getelementptr { i32 }* %P, i32 0, i32 0 + ret i32 0 +} diff --git a/test/Transforms/GVNPRE/insertelement.ll b/test/Transforms/GVNPRE/insertelement.ll new file mode 100644 index 0000000..caf8474 --- /dev/null +++ b/test/Transforms/GVNPRE/insertelement.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract() { +entry: ; preds = %cond_false, %entry + %foo = add <2 x i32> < i32 1, i32 1 >, < i32 1, i32 1 > + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = insertelement <2 x i32> %foo, i32 0, i32 3 + br label %end + +end: + %b = insertelement <2 x i32> %foo, i32 0, i32 3 + ret i32 0 +} diff --git a/test/Transforms/GVNPRE/select.ll b/test/Transforms/GVNPRE/select.ll new file mode 100644 index 0000000..c73c857 --- /dev/null +++ b/test/Transforms/GVNPRE/select.ll @@ -0,0 +1,17 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract() { +entry: ; preds = %cond_false, %entry + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = select i1 true, i32 0, i32 1 + br label %end + +end: + %b = select i1 true, i32 0, i32 1 + ret i32 %b +} diff --git a/test/Transforms/GVNPRE/shufflevector.ll b/test/Transforms/GVNPRE/shufflevector.ll new file mode 100644 index 0000000..9fc3592 --- /dev/null +++ b/test/Transforms/GVNPRE/shufflevector.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -gvnpre | llvm-dis | grep b.gvnpre + +define i32 @extract() { +entry: ; preds = %cond_false, %entry + %foo = add <2 x i32> < i32 1, i32 1 >, < i32 1, i32 1 > + br i1 true, label %cond_true, label %cond_false + +cond_true: + br label %end + +cond_false: + %a = shufflevector <2 x i32> %foo, <2 x i32> undef, <2 x i32> < i32 0, i32 1 > + br label %end + +end: + %b = shufflevector <2 x i32> %foo, <2 x i32> undef, <2 x i32> < i32 0, i32 1 > + ret i32 0 +} diff --git a/test/Transforms/GlobalDCE/2002-07-17-CastRef.ll b/test/Transforms/GlobalDCE/2002-07-17-CastRef.ll new file mode 100644 index 0000000..3679d51 --- /dev/null +++ b/test/Transforms/GlobalDCE/2002-07-17-CastRef.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce +; +implementation + +internal void %func() { ; Not dead, can be reachable via X + ret void +} + +void %main() { + %X = cast void()* %func to int* + ret void +} diff --git a/test/Transforms/GlobalDCE/2002-07-17-ConstantRef.ll b/test/Transforms/GlobalDCE/2002-07-17-ConstantRef.ll new file mode 100644 index 0000000..8bb6da5 --- /dev/null +++ b/test/Transforms/GlobalDCE/2002-07-17-ConstantRef.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce +; +%X = global void() * %func +implementation + +internal void %func() { ; Not dead, can be reachable via X + ret void +} + +void %main() { + ret void +} diff --git a/test/Transforms/GlobalDCE/2002-08-17-FunctionDGE.ll b/test/Transforms/GlobalDCE/2002-08-17-FunctionDGE.ll new file mode 100644 index 0000000..e0af3c2 --- /dev/null +++ b/test/Transforms/GlobalDCE/2002-08-17-FunctionDGE.ll @@ -0,0 +1,16 @@ +; Make sure that functions are removed successfully if they are referred to by +; a global that is dead. Make sure any globals they refer to die as well. + +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce | llvm-dis | not grep foo + +%b = internal global int ()* %foo ;; Unused, kills %foo + +%foo = internal global int 7 ;; Should die when function %foo is killed + +implementation + +internal int %foo() { ;; dies when %b dies. + %ret = load int* %foo + ret int %ret +} + diff --git a/test/Transforms/GlobalDCE/2002-08-17-WorkListTest.ll b/test/Transforms/GlobalDCE/2002-08-17-WorkListTest.ll new file mode 100644 index 0000000..493e30c --- /dev/null +++ b/test/Transforms/GlobalDCE/2002-08-17-WorkListTest.ll @@ -0,0 +1,14 @@ +; This testcase tests that a worklist is being used, and that globals can be +; removed if they are the subject of a constexpr and ConstantPointerRef + +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce | llvm-dis | not grep global + +%t0 = internal global [4 x sbyte] c"foo\00" +%t1 = internal global [4 x sbyte] c"bar\00" + +%s1 = internal global [1 x sbyte*] [sbyte* cast ([4 x sbyte]* %t0 to sbyte*)] +%s2 = internal global [1 x sbyte*] [sbyte* getelementptr ([4 x sbyte]* %t1, uint 0, uint 0 )] + +%b = internal global int* %a +%a = internal global int 7 + diff --git a/test/Transforms/GlobalDCE/2002-09-12-Redeletion.ll b/test/Transforms/GlobalDCE/2002-09-12-Redeletion.ll new file mode 100644 index 0000000..bc650d2 --- /dev/null +++ b/test/Transforms/GlobalDCE/2002-09-12-Redeletion.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce + +%foo = internal global int 7 ;; Should die when function %foo is killed + +%bar = internal global [2x { int *, int }] [ { int *, int } { int* %foo, int 7}, {int*, int} { int* %foo, int 1 }] + +implementation + +internal int %foo() { ;; dies when %b dies. + %ret = load int* %foo + ret int %ret +} + diff --git a/test/Transforms/GlobalDCE/2003-07-01-SelfReference.ll b/test/Transforms/GlobalDCE/2003-07-01-SelfReference.ll new file mode 100644 index 0000000..afdc1cd --- /dev/null +++ b/test/Transforms/GlobalDCE/2003-07-01-SelfReference.ll @@ -0,0 +1,11 @@ +; distilled from 255.vortex +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce | llvm-dis | not grep testfunc + +implementation + +declare bool()* %getfunc() +internal bool %testfunc() { + %F = call bool()*()* %getfunc() + %c = seteq bool()* %F, %testfunc + ret bool %c +} diff --git a/test/Transforms/GlobalDCE/2003-10-09-PreserveWeakGlobals.ll b/test/Transforms/GlobalDCE/2003-10-09-PreserveWeakGlobals.ll new file mode 100644 index 0000000..ff41163 --- /dev/null +++ b/test/Transforms/GlobalDCE/2003-10-09-PreserveWeakGlobals.ll @@ -0,0 +1,6 @@ +; Weak variables should be preserved by global DCE! + +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce | llvm-dis | grep @A + + +%A = weak global int 54 diff --git a/test/Transforms/GlobalDCE/basicvariabletest.ll b/test/Transforms/GlobalDCE/basicvariabletest.ll new file mode 100644 index 0000000..0b5c8b6 --- /dev/null +++ b/test/Transforms/GlobalDCE/basicvariabletest.ll @@ -0,0 +1,5 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globaldce | llvm-dis | not grep global + +%X = uninitialized global int +%Y = internal global int 7 + diff --git a/test/Transforms/GlobalDCE/dg.exp b/test/Transforms/GlobalDCE/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/GlobalDCE/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx b/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx new file mode 100644 index 0000000..8150c52 --- /dev/null +++ b/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.llx @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt + +%V = global float 12.0 +%G = internal global int* null + +int %user() { + %P = load int** %G + %Q = load int* %P + ret int %Q +} + +void %setter() { + %Vi = cast float* %V to int* + store int* %Vi, int** %G + ret void +} + diff --git a/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll b/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll new file mode 100644 index 0000000..19458c7 --- /dev/null +++ b/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output +; PR579 + +%g_40507551 = internal global short 31038 ; <short*> [#uses=1] + +void %main() { + %tmp.4.i.1 = load ubyte* getelementptr (ubyte* cast (short* %g_40507551 to ubyte*), int 1) + ret void +} diff --git a/test/Transforms/GlobalOpt/2005-09-27-Crash.ll b/test/Transforms/GlobalOpt/2005-09-27-Crash.ll new file mode 100644 index 0000000..9486877 --- /dev/null +++ b/test/Transforms/GlobalOpt/2005-09-27-Crash.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output + %RPyString = type { int, %arraytype.Char } + %arraytype.Char = type { int, [0 x sbyte] } + %arraytype.Signed = type { int, [0 x int] } + %functiontype.1 = type %RPyString* (int) + %structtype.test = type { int, %arraytype.Signed } +%structinstance.test = internal global { int, { int, [2 x int] } } { int 41, { int, [2 x int] } { int 2, [2 x int] [ int 100, int 101 ] } } ; <{ int, { int, [2 x int] } }*> [#uses=1] + +implementation ; Functions: + +fastcc void %pypy_array_constant() { +block0: + %tmp.9 = getelementptr %structtype.test* cast ({ int, { int, [2 x int] } }* %structinstance.test to %structtype.test*), int 0, uint 0 ; <int*> [#uses=0] + ret void +} + +fastcc void %new.varsizestruct.rpy_string() { + unreachable +} + +void %__entrypoint__pypy_array_constant() { + call fastcc void %pypy_array_constant( ) + ret void +} + +void %__entrypoint__raised_LLVMException() { + ret void +} diff --git a/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll b/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll new file mode 100644 index 0000000..61df345 --- /dev/null +++ b/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll @@ -0,0 +1,138 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output +; PR820 +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct..0FileDescriptor = type { int } + "struct.FlagDescription<int32>" = type { ubyte*, int*, bool, bool, int, ubyte* } + "struct.FlagRegisterer<bool>" = type { ubyte } + %struct.MutexLock = type { %struct..0FileDescriptor* } + "struct.std::DisabledRangeMap" = type { "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >" } + "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >" = type { "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >::_Rb_tree_impl<StringCmp,false>" } + "struct.std::_Rb_tree<const char*,std::pair<const char* const, FlagDescription<bool> >,std::_Select1st<std::pair<const char* const, FlagDescription<bool> > >,StringCmp,std::allocator<std::pair<const char* const, FlagDescription<bool> > > >::_Rb_tree_impl<StringCmp,false>" = type { "struct.FlagRegisterer<bool>", "struct.std::_Rb_tree_node_base", uint } + "struct.std::_Rb_tree_const_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" = type { "struct.std::_Rb_tree_node_base"* } + "struct.std::_Rb_tree_node_base" = type { uint, "struct.std::_Rb_tree_node_base"*, "struct.std::_Rb_tree_node_base"*, "struct.std::_Rb_tree_node_base"* } + "struct.std::_Vector_base<int,std::allocator<int> >" = type { "struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" } + "struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" = type { int*, int*, int* } + "struct.std::vector<int,std::allocator<int> >" = type { "struct.std::_Vector_base<int,std::allocator<int> >" } +%registry_lock = external global %struct..0FileDescriptor ; <%struct..0FileDescriptor*> [#uses=0] +%_ZN61FLAG__foo_int32_44FLAGS_E = external global "struct.FlagRegisterer<bool>" ; <"struct.FlagRegisterer<bool>"*> [#uses=0] +%llvm.global_ctors = appending global [20 x { int, void ()* }] [ { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN7ScannerC2Ev }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z11StripStringPSsPKcc }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_ }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN8Hasher325ResetEj }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z25ACLRv }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I_eventbuf }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE }, { int, void ()* } { int 65535, void ()* %_GLOBAL__I__checker_bcad_variable } ] ; <[20 x { int, void ()* }]*> [#uses=0] + +implementation ; Functions: + +declare void %_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E() + +declare void %_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E() + +declare void %_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv() + +declare void %_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E() + +declare void %_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E() + +void %_ZN14FlagRegistererIiEC1EPKcRK15FlagDescriptionIiE() { +entry: + call void %_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E( ) + ret void +} + +void %_Z12RegisterFlagIiEvPKcRK15FlagDescriptionIT_E() { +entry: + call void %_ZN9MutexLockC1EP5Mutex( ) + ret void +} + +declare void %_GLOBAL__I__ZN7ScannerC2Ev() + +declare void %_GLOBAL__I__Z11StripStringPSsPKcc() + +void %_ZNSt6vectorIiSaIiEEC1ERKS0_() { +entry: + unreachable +} + +declare void %_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_() + +declare void %_GLOBAL__I__ZN8Hasher325ResetEj() + +declare void %_GLOBAL__I__Z25ACLRv() + +void %_ZN9MutexLockC1EP5Mutex() { +entry: + call void %_ZN5Mutex4LockEv( ) + ret void +} + +void %_ZN5Mutex4LockEv() { +entry: + call void %_Z22Acquire_CASPViii( ) + ret void +} + +csretcc void %_ZNSt3mapIPKc15FlagDescriptionIiE9StringCmpSaISt4pairIKS1_S3_EEE3endEv("struct.std::_Rb_tree_const_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >"* %agg.result) { +entry: + unreachable +} + +declare void %_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E() + +void %_Z14CASPViii() { +entry: + %tmp3 = call int asm sideeffect "lock; cmpxchg $1,$2", "={ax},q,m,0,~{dirflag},~{fpsr},~{flags},~{memory}"( int 0, int* null, int 0 ) ; <int> [#uses=0] + unreachable +} + +declare void %_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E() + +declare void %_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E() + +void %_Z22Acquire_CASPViii() { +entry: + call void %_Z14CASPViii( ) + unreachable +} + +declare void %_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E() + +declare void %_GLOBAL__I_eventbuf() + +void %_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E() { +entry: + call void %_Z41__static_initialization_and_destruction_0ii1662( int 1, int 65535 ) + ret void +} + +void %_Z41__static_initialization_and_destruction_0ii1662(int %__initialize_p, int %__priority) { +entry: + %__initialize_p_addr = alloca int ; <int*> [#uses=2] + %__priority_addr = alloca int ; <int*> [#uses=2] + store int %__initialize_p, int* %__initialize_p_addr + store int %__priority, int* %__priority_addr + %tmp = load int* %__priority_addr ; <int> [#uses=1] + %tmp = seteq int %tmp, 65535 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_next14 + +cond_true: ; preds = %entry + %tmp8 = load int* %__initialize_p_addr ; <int> [#uses=1] + %tmp9 = seteq int %tmp8, 1 ; <bool> [#uses=1] + br bool %tmp9, label %cond_true10, label %cond_next14 + +cond_true10: ; preds = %cond_true + call void %_ZN14FlagRegistererIiEC1EPKcRK15FlagDescriptionIiE( ) + ret void + +cond_next14: ; preds = %cond_true, %entry + ret void +} + +declare void %_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E() + +void %_ZN9__gnu_cxx13new_allocatorIPNS_15_Hashtable_nodeIjEEEC2Ev() { +entry: + unreachable +} + +declare void %_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE() + +declare void %_GLOBAL__I__checker_bcad_variable() diff --git a/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll b/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll new file mode 100644 index 0000000..cd76681 --- /dev/null +++ b/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll @@ -0,0 +1,33 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -disable-output + %struct._list = type { int*, %struct._list* } + %struct._play = type { int, int*, %struct._list*, %struct._play* } +%nrow = internal global int 0 ; <int*> [#uses=2] + +implementation ; Functions: + +void %make_play() { +entry: + br label %cond_true16.i + +cond_true16.i: ; preds = %cond_true16.i, %entry + %low.0.in.i.0 = phi int* [ %nrow, %entry ], [ null, %cond_true16.i ] ; <int*> [#uses=1] + %low.0.i = load int* %low.0.in.i.0 ; <int> [#uses=0] + br label %cond_true16.i +} + +void %make_wanted() { +entry: + unreachable +} + +void %get_good_move() { +entry: + ret void +} + +void %main() { +entry: + store int 8, int* %nrow + tail call void %make_play( ) + ret void +} diff --git a/test/Transforms/GlobalOpt/2007-04-05-Crash.ll b/test/Transforms/GlobalOpt/2007-04-05-Crash.ll new file mode 100644 index 0000000..bf957b4 --- /dev/null +++ b/test/Transforms/GlobalOpt/2007-04-05-Crash.ll @@ -0,0 +1,34 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output + +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" +target triple = "thumb-apple-darwin8" +@replacementUnichar = internal global i16 -3 ; <i16*> [#uses=2] +@"L_OBJC_IMAGE_INFO" = internal global [2 x i32] zeroinitializer ; <[2 x i32]*> [#uses=1] +@llvm.used = appending global [1 x i8*] [ i8* bitcast ([2 x i32]* @"L_OBJC_IMAGE_INFO" to i8*) ] ; <[1 x i8*]*> [#uses=0] + +define i16 @__NSCharToUnicharCFWrapper(i8 zext %ch) zext { +entry: + %iftmp.0.0.in.in = select i1 false, i16* @replacementUnichar, i16* null ; <i16*> [#uses=1] + %iftmp.0.0.in = load i16* %iftmp.0.0.in.in ; <i16> [#uses=1] + ret i16 %iftmp.0.0.in +} + +define void @__NSASCIICharToUnichar() { +entry: + ret void +} + +define void @_NSDefaultCStringEncoding() { +entry: + call void @__NSSetCStringCharToUnichar( ) + br i1 false, label %cond_true6, label %cond_next8 + +cond_true6: ; preds = %entry + store i16 -2, i16* @replacementUnichar + ret void + +cond_next8: ; preds = %entry + ret void +} + +declare void @__NSSetCStringCharToUnichar() diff --git a/test/Transforms/GlobalOpt/2007-05-13-Crash.ll b/test/Transforms/GlobalOpt/2007-05-13-Crash.ll new file mode 100644 index 0000000..22fee77 --- /dev/null +++ b/test/Transforms/GlobalOpt/2007-05-13-Crash.ll @@ -0,0 +1,74 @@ +; RUN: llvm-as < %s | opt -globalopt -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-apple-darwin8" + %struct.SFLMutableListItem = type { i16 } + %struct.__CFDictionary = type opaque + %struct.__CFString = type opaque + %struct.__builtin_CFString = type { i32*, i32, i8*, i32 } +@_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=2] +@_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=7] +internal constant %struct.__builtin_CFString { + i32* getelementptr ([0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), + i32 1992, + i8* getelementptr ([14 x i8]* @.str, i32 0, i32 0), + i32 13 }, section "__DATA,__cfstring" ; <%struct.__builtin_CFString*>:0 [#uses=1] +@__CFConstantStringClassReference = external global [0 x i32] ; <[0 x i32]*> [#uses=1] +@.str = internal constant [14 x i8] c"AlwaysVisible\00" ; <[14 x i8]*> [#uses=1] +@_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey = internal global %struct.__CFString* null ; <%struct.__CFString**> [#uses=2] + +define %struct.__CFString* @_Z19SFLGetVisibilityKeyv() { +entry: + %tmp1 = load %struct.__CFString** @_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey ; <%struct.__CFString*> [#uses=1] + ret %struct.__CFString* %tmp1 +} + +define %struct.__CFString* @_Z22SFLGetAlwaysVisibleKeyv() { +entry: + %tmp1 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1] + %tmp2 = icmp eq %struct.__CFString* %tmp1, null ; <i1> [#uses=1] + br i1 %tmp2, label %cond_true, label %cond_next + +cond_true: ; preds = %entry + store %struct.__CFString* bitcast (%struct.__builtin_CFString* @0 to %struct.__CFString*), %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey + br label %cond_next + +cond_next: ; preds = %entry, %cond_true + %tmp4 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1] + ret %struct.__CFString* %tmp4 +} + +define %struct.__CFString* @_Z21SFLGetNeverVisibleKeyv() { +entry: + %tmp1 = load %struct.__CFString** @_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey ; <%struct.__CFString*> [#uses=1] + ret %struct.__CFString* %tmp1 +} + +define %struct.__CFDictionary* @_ZN18SFLMutableListItem18GetPrefsDictionaryEv(%struct.SFLMutableListItem* %this) { +entry: + %tmp4 = getelementptr %struct.SFLMutableListItem* %this, i32 0, i32 0 ; <i16*> [#uses=1] + %tmp5 = load i16* %tmp4 ; <i16> [#uses=1] + %tmp6 = icmp eq i16 %tmp5, 0 ; <i1> [#uses=1] + br i1 %tmp6, label %cond_next22, label %cond_true + +cond_true: ; preds = %entry + %tmp9 = load %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey ; <%struct.__CFString*> [#uses=1] + %tmp10 = icmp eq %struct.__CFString* %tmp9, null ; <i1> [#uses=1] + br i1 %tmp10, label %cond_true13, label %cond_next22 + +cond_true13: ; preds = %cond_true + store %struct.__CFString* bitcast (%struct.__builtin_CFString* @0 to %struct.__CFString*), %struct.__CFString** @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey + br label %cond_next22 + +cond_next22: ; preds = %entry, %cond_true13, %cond_true + %iftmp.1.0.in = phi %struct.__CFString** [ @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey, %cond_true ], [ @_ZZ22SFLGetAlwaysVisibleKeyvE22_kSFLLAlwaysVisibleKey, %cond_true13 ], [ @_ZZ21SFLGetNeverVisibleKeyvE21_kSFLLNeverVisibleKey, %entry ] ; <%struct.__CFString**> [#uses=1] + %iftmp.1.0 = load %struct.__CFString** %iftmp.1.0.in ; <%struct.__CFString*> [#uses=1] + %tmp24 = load %struct.__CFString** @_ZZ19SFLGetVisibilityKeyvE19_kSFLLVisibilityKey ; <%struct.__CFString*> [#uses=1] + %tmp2728 = bitcast %struct.__CFString* %tmp24 to i8* ; <i8*> [#uses=1] + %tmp2930 = bitcast %struct.__CFString* %iftmp.1.0 to i8* ; <i8*> [#uses=1] + call void @_Z20CFDictionaryAddValuePKvS0_( i8* %tmp2728, i8* %tmp2930 ) + ret %struct.__CFDictionary* undef +} + +declare void @_Z20CFDictionaryAddValuePKvS0_(i8*, i8*) + diff --git a/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll b/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll new file mode 100644 index 0000000..7394f04 --- /dev/null +++ b/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll @@ -0,0 +1,36 @@ +; RUN: llvm-as < %s | opt -globalopt -disable-output +; PR1491 + +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" + %"struct.__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, int> > >" = type <{ i8 }> + %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >" = type { %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >::_Rb_tree_impl<std::less<int>,false>" } + %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >::_Rb_tree_impl<std::less<int>,false>" = type { %"struct.__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, int> > >", %"struct.std::_Rb_tree_node_base", i32 } + %"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } + %"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" = type { %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >" } +@someMap = global %"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" zeroinitializer ; <%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >"*> [#uses=1] +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_someMap } ] ; <[1 x { i32, void ()* }]*> [#uses=0] +@llvm.global_dtors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__D_someMap } ] ; <[1 x { i32, void ()* }]*> [#uses=0] + +define void @_GLOBAL__I_someMap() { +entry: + call void @_Z41__static_initialization_and_destruction_0ii( i32 1, i32 65535 ) + ret void +} + +declare void @_GLOBAL__D_someMap() + +define void @_Z41__static_initialization_and_destruction_0ii(i32 %__initialize_p, i32 %__priority) { +entry: + %tmp1 = icmp eq i32 %__priority, 65535 ; <i1> [#uses=1] + %tmp4 = icmp eq i32 %__initialize_p, 1 ; <i1> [#uses=1] + %tmp7 = and i1 %tmp1, %tmp4 ; <i1> [#uses=1] + br i1 %tmp7, label %cond_true, label %cond_next + +cond_true: ; preds = %entry + store i8 0, i8* getelementptr (%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >"* @someMap, i32 0, i32 0, i32 0, i32 0, i32 0) + ret void + +cond_next: ; preds = %entry + ret void +} diff --git a/test/Transforms/GlobalOpt/basictest.llx b/test/Transforms/GlobalOpt/basictest.llx new file mode 100644 index 0000000..1f97fc0 --- /dev/null +++ b/test/Transforms/GlobalOpt/basictest.llx @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global + +%X = internal global int 4 + + +int %foo() { + %V = load int* %X + ret int %V +} diff --git a/test/Transforms/GlobalOpt/constantexpr-dangle.ll b/test/Transforms/GlobalOpt/constantexpr-dangle.ll new file mode 100644 index 0000000..6e33ae0 --- /dev/null +++ b/test/Transforms/GlobalOpt/constantexpr-dangle.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | opt -instcombine -globalopt | llvm-dis | \ +; RUN: grep {internal fastcc float @foo} + +define internal float @foo() { + ret float 0.000000e+00 +} + +define float @bar() { + %tmp1 = call float (...)* bitcast (float ()* @foo to float (...)*)( ) + %tmp2 = mul float %tmp1, 1.000000e+01 ; <float> [#uses=1] + ret float %tmp2 +} + diff --git a/test/Transforms/GlobalOpt/ctor-list-opt.ll b/test/Transforms/GlobalOpt/ctor-list-opt.ll new file mode 100644 index 0000000..6270f4f --- /dev/null +++ b/test/Transforms/GlobalOpt/ctor-list-opt.ll @@ -0,0 +1,97 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep CTOR + +%llvm.global_ctors = appending global [10 x { int, void ()* }] [ + { int, void ()* } { int 65535, void ()* %CTOR1 }, + { int, void ()* } { int 65535, void ()* %CTOR1 }, + { int, void ()* } { int 65535, void ()* %CTOR2 }, + { int, void ()* } { int 65535, void ()* %CTOR3 }, + { int, void ()* } { int 65535, void ()* %CTOR4 }, + { int, void ()* } { int 65535, void ()* %CTOR5 }, + { int, void ()* } { int 65535, void ()* %CTOR6 }, + { int, void ()* } { int 65535, void ()* %CTOR7 }, + { int, void ()* } { int 65535, void ()* %CTOR8 }, + { int, void ()* } { int 2147483647, void ()* null } +] + +%G = global int 0 +%G2 = global int 0 +%G3 = global int -123 +%X = global {int, [2 x int]} { int 0, [2 x int] [ int 17, int 21] } +%Y = global int -1 +%Z = global int 123 +%D = global double 0.0 + +%CTORGV = internal global bool false ;; Should become constant after eval + +implementation + +internal void %CTOR1() { ;; noop ctor, remove. + ret void +} + +internal void %CTOR2() { ;; evaluate the store + %A = add int 1, 23 + store int %A, int* %G + store bool true, bool* %CTORGV + ret void +} + +internal void %CTOR3() { + %X = or bool true, false + br label %Cont +Cont: + br bool %X, label %S, label %T +S: + store int 24, int* %G2 + ret void +T: + ret void +} + +internal void %CTOR4() { + %X = load int* %G3 + %Y = add int %X, 123 + store int %Y, int* %G3 + ret void +} + +internal void %CTOR5() { + %X.2p = getelementptr {int,[2 x int]}* %X, int 0, uint 1, int 0 + %X.2 = load int* %X.2p + %X.1p = getelementptr {int,[2 x int]}* %X, int 0, uint 0 + store int %X.2, int* %X.1p + store int 42, int* %X.2p + ret void +} + +internal void %CTOR6() { + %A = alloca int + %y = load int* %Y + store int %y, int* %A + %Av = load int* %A + %Av1 = add int %Av, 1 + store int %Av1, int* %Y + ret void +} + +internal void %CTOR7() { + call void %setto(int* %Z, int 0) + ret void +} + +void %setto(int* %P, int %V) { + store int %V, int* %P + ret void +} + +declare double %cos(double) + +internal void %CTOR8() { + %X = call double %cos(double 1.0) + store double %X, double* %D + ret void +} +bool %accessor() { + %V = load bool* %CTORGV ;; constant true + ret bool %V +} diff --git a/test/Transforms/GlobalOpt/deadglobal-2.llx b/test/Transforms/GlobalOpt/deadglobal-2.llx new file mode 100644 index 0000000..5fa9825 --- /dev/null +++ b/test/Transforms/GlobalOpt/deadglobal-2.llx @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep internal + +; This is a harder case to delete as the GEP has a variable index. + +%G = internal global [4 x int] zeroinitializer + +void %foo(int %X) { + %Ptr = getelementptr [4 x int]* %G, int 0, int %X + store int 1, int* %Ptr + ret void +} diff --git a/test/Transforms/GlobalOpt/deadglobal.llx b/test/Transforms/GlobalOpt/deadglobal.llx new file mode 100644 index 0000000..a7397bf --- /dev/null +++ b/test/Transforms/GlobalOpt/deadglobal.llx @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep internal + +%G = internal global int 123 + +void %foo() { + store int 1, int* %G + ret void +} diff --git a/test/Transforms/GlobalOpt/dg.exp b/test/Transforms/GlobalOpt/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/GlobalOpt/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/GlobalOpt/globalsra-partial.llx b/test/Transforms/GlobalOpt/globalsra-partial.llx new file mode 100644 index 0000000..e060565 --- /dev/null +++ b/test/Transforms/GlobalOpt/globalsra-partial.llx @@ -0,0 +1,23 @@ +; In this case, the global can only be broken up by one level. + +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep 12345 + +%G = internal global { int, [4 x float] } zeroinitializer + +void %onlystore() { + store int 12345, int* getelementptr ({ int, [4 x float] }* %G, int 0, uint 0) + ret void +} + +void %storeinit(int %i) { + %Ptr = getelementptr { int, [4 x float] }* %G, int 0, uint 1, int %i + store float 1.0, float* %Ptr + ret void +} + +float %readval(int %i) { + %Ptr = getelementptr { int, [4 x float] }* %G, int 0, uint 1, int %i + %V = load float* %Ptr + ret float %V +} + diff --git a/test/Transforms/GlobalOpt/globalsra.llx b/test/Transforms/GlobalOpt/globalsra.llx new file mode 100644 index 0000000..a87b954 --- /dev/null +++ b/test/Transforms/GlobalOpt/globalsra.llx @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global + +%G = internal global { int, float, {double} } { int 1, float 1.0, {double} {double 17.27} } + +void %onlystore() { + store int 123, int* getelementptr ({ int, float, {double} }* %G, int 0, uint 0) + ret void +} + +float %storeinit() { + store float 1.0, float* getelementptr ({ int, float, {double} }* %G, int 0, uint 1) + %X = load float* getelementptr ({ int, float, {double} }* %G, int 0, uint 1) + ret float %X +} + +double %constantize() { + %X = load double* getelementptr ({ int, float, {double} }* %G, int 0, uint 2, uint 0) + ret double %X +} diff --git a/test/Transforms/GlobalOpt/integer-bool.ll b/test/Transforms/GlobalOpt/integer-bool.ll new file mode 100644 index 0000000..eef2f72 --- /dev/null +++ b/test/Transforms/GlobalOpt/integer-bool.ll @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt -instcombine | \ +; RUN: llvm-dis | grep {ret i1 true} + +;; check that global opt turns integers that only hold 0 or 1 into bools. + +%G = internal global int 0 ;; This only holds 0 or 1. + +implementation + +void %set1() { + store int 0, int* %G + ret void +} +void %set2() { + store int 1, int* %G + ret void +} + +bool %get() { + %A = load int* %G + %C = setlt int %A, 2 ;; always true + ret bool %C +} diff --git a/test/Transforms/GlobalOpt/iterate.llx b/test/Transforms/GlobalOpt/iterate.llx new file mode 100644 index 0000000..e4e59c6 --- /dev/null +++ b/test/Transforms/GlobalOpt/iterate.llx @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep %G + +%G = internal global int 0 +%H = internal global { int* } { int* %G } + +int %loadg() { + %G = load int** getelementptr ({int*}* %H, int 0, uint 0) + %GV = load int* %G + ret int %GV +} diff --git a/test/Transforms/GlobalOpt/load-store-global.llx b/test/Transforms/GlobalOpt/load-store-global.llx new file mode 100644 index 0000000..bf5d3a2 --- /dev/null +++ b/test/Transforms/GlobalOpt/load-store-global.llx @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep G + +%G = internal global int 17 + +void %foo() { + %V = load int* %G + store int %V, int* %G ;; Doesn't change the value + ret void +} +int %bar() { + %X = load int* %G + ret int %X +} + diff --git a/test/Transforms/GlobalOpt/malloc-promote-1.llx b/test/Transforms/GlobalOpt/malloc-promote-1.llx new file mode 100644 index 0000000..068e96f --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-1.llx @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global + +%G = internal global int* null + +void %init() { + %P = malloc int + store int* %P, int** %G + + %GV = load int** %G + store int 0, int* %GV + ret void +} + +int %get() { + %GV = load int** %G + %V = load int* %GV + ret int %V +} diff --git a/test/Transforms/GlobalOpt/malloc-promote-2.llx b/test/Transforms/GlobalOpt/malloc-promote-2.llx new file mode 100644 index 0000000..12d4c6d --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-2.llx @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep malloc + +%G = internal global int* null + +void %init() { + %P = malloc int, uint 100 + store int* %P, int** %G + + %GV = load int** %G + %GVe = getelementptr int* %GV, int 40 + store int 20, int* %GVe + ret void +} + +int %get() { + %GV = load int** %G + %GVe = getelementptr int* %GV, int 40 + %V = load int* %GVe + ret int %V +} diff --git a/test/Transforms/GlobalOpt/malloc-promote-3.llx b/test/Transforms/GlobalOpt/malloc-promote-3.llx new file mode 100644 index 0000000..85ce6bd --- /dev/null +++ b/test/Transforms/GlobalOpt/malloc-promote-3.llx @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep malloc + +%G = internal global int* null + +void %init() { + %P = malloc int, uint 100 + store int* %P, int** %G + + %GV = load int** %G + %GVe = getelementptr int* %GV, int 40 + store int 20, int* %GVe + ret void +} + +int %get() { + %GV = load int** %G + %GVe = getelementptr int* %GV, int 40 + %V = load int* %GVe + ret int %V +} + +bool %check() { ;; Return true if init has been called + %GV = load int** %G + %V = seteq int* %GV, null + ret bool %V +} diff --git a/test/Transforms/GlobalOpt/memcpy.ll b/test/Transforms/GlobalOpt/memcpy.ll new file mode 100644 index 0000000..a110d40 --- /dev/null +++ b/test/Transforms/GlobalOpt/memcpy.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \ +; RUN: grep {G1 = internal constant} + +%G1 = internal global [58 x sbyte] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" + +implementation + +declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) + +void %foo() { + %Blah = alloca [58 x sbyte] ; <[58 x sbyte]*> [#uses=2] + %tmp.0 = getelementptr [58 x sbyte]* %Blah, int 0, int 0 ; <sbyte*> [#uses=1] + call void %llvm.memcpy.i32( sbyte* %tmp.0, sbyte* getelementptr ([58 x sbyte]* %G1, int 0, int 0), uint 58, uint 1 ) + ret void +} + + diff --git a/test/Transforms/GlobalOpt/memset.ll b/test/Transforms/GlobalOpt/memset.ll new file mode 100644 index 0000000..336a234 --- /dev/null +++ b/test/Transforms/GlobalOpt/memset.ll @@ -0,0 +1,23 @@ +; both globals are write only, delete them. + +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \ +; RUN: not grep internal + +%G0 = internal global [58 x sbyte] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" + +%G1 = internal global [4 x int] [ int 1, int 2, int 3, int 4] + +implementation ; Functions: + +declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) +declare void %llvm.memset.i32(sbyte*, ubyte, uint, uint) + +void %foo() { + %Blah = alloca [58 x sbyte] ; <[58 x sbyte]*> [#uses=2] + %tmp3 = cast [58 x sbyte]* %Blah to sbyte* + call void %llvm.memcpy.i32( sbyte* cast ([4 x int]* %G1 to sbyte*), sbyte* %tmp3, uint 16, uint 1) + call void %llvm.memset.i32( sbyte* getelementptr ([58 x sbyte]* %G0, int 0, int 0), ubyte 17, uint 58, uint 1) + ret void +} + + diff --git a/test/Transforms/GlobalOpt/phi-select.llx b/test/Transforms/GlobalOpt/phi-select.llx new file mode 100644 index 0000000..2389c0a --- /dev/null +++ b/test/Transforms/GlobalOpt/phi-select.llx @@ -0,0 +1,29 @@ +; Test that PHI nodes and select instructions do not necessarily make stuff +; non-constant. + +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global + +%X = internal global int 4 +%Y = internal global int 5 + +int %test1(bool %C) { + %P = select bool %C, int* %X, int* %Y + %V = load int* %P + ret int %V +} + + +int %test2(bool %C) { + br bool %C, label %T, label %Cont +T: + br label %Cont +Cont: + %P = phi int* [%X, %0], [%Y, %T] + %V = load int* %P + ret int %V +} + + + + + diff --git a/test/Transforms/GlobalOpt/storepointer-compare.llx b/test/Transforms/GlobalOpt/storepointer-compare.llx new file mode 100644 index 0000000..d85d97d --- /dev/null +++ b/test/Transforms/GlobalOpt/storepointer-compare.llx @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | \ +; RUN: grep {call void @Actual} + +; Check that a comparison does not prevent an indirect call from being made +; direct. The global will still remain, but indirect call elim is still good. + +%G = internal global void ()* null + +implementation + +internal void %Actual() { + ret void +} + +void %init() { + store void()* %Actual, void()** %G + ret void +} + +void %doit() { + %FP = load void()** %G + %CC = seteq void()* %FP, null + br bool %CC, label %isNull, label %DoCall +DoCall: + call void %FP() + ret void +isNull: + ret void +} diff --git a/test/Transforms/GlobalOpt/storepointer.llx b/test/Transforms/GlobalOpt/storepointer.llx new file mode 100644 index 0000000..a424d25 --- /dev/null +++ b/test/Transforms/GlobalOpt/storepointer.llx @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep global + +%G = internal global void ()* null + +implementation + +internal void %Actual() { + ret void +} + +void %init() { + store void()* %Actual, void()** %G + ret void +} + +void %doit() { + %FP = load void()** %G + call void %FP() + ret void +} diff --git a/test/Transforms/GlobalOpt/trivialstore.llx b/test/Transforms/GlobalOpt/trivialstore.llx new file mode 100644 index 0000000..8b1f1ce --- /dev/null +++ b/test/Transforms/GlobalOpt/trivialstore.llx @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep G + +%G = internal global int 17 + +void %foo() { + store int 17, int* %G ;; Doesn't change the value + ret void +} +int %bar() { + %X = load int* %G + ret int %X +} + +internal void %dead() { + store int 123, int* %G + ret void +} diff --git a/test/Transforms/GlobalOpt/undef-init.llx b/test/Transforms/GlobalOpt/undef-init.llx new file mode 100644 index 0000000..2f073c2 --- /dev/null +++ b/test/Transforms/GlobalOpt/undef-init.llx @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep store + +%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int, void ()* } { int 65535, void ()* %_GLOBAL__I__Z3foov } ] ; <[1 x { int, void ()* }]*> [#uses=0] +%X.0 = internal global int undef ; <int*> [#uses=2] + +implementation ; Functions: + +int %_Z3foov() { +entry: + %tmp.1 = load int* %X.0 ; <int> [#uses=1] + ret int %tmp.1 +} + +internal void %_GLOBAL__I__Z3foov() { +entry: + store int 1, int* %X.0 + ret void +} diff --git a/test/Transforms/IPConstantProp/deadarg.ll b/test/Transforms/IPConstantProp/deadarg.ll new file mode 100644 index 0000000..5e41ade --- /dev/null +++ b/test/Transforms/IPConstantProp/deadarg.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipconstprop -disable-output +implementation + +internal void %foo(int %X) { + call void %foo(int %X) + ret void +} diff --git a/test/Transforms/IPConstantProp/dg.exp b/test/Transforms/IPConstantProp/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/IPConstantProp/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/IPConstantProp/recursion.ll b/test/Transforms/IPConstantProp/recursion.ll new file mode 100644 index 0000000..10f18e5 --- /dev/null +++ b/test/Transforms/IPConstantProp/recursion.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipconstprop -deadargelim | llvm-dis | not grep %X + +implementation + +internal int %foo(int %X) { + %Y = call int %foo( int %X ) + %Z = add int %Y, 1 + ret int %Z +} + +void %bar() { + call int %foo( int 17 ) ; <int>:0 [#uses=0] + ret void +} diff --git a/test/Transforms/IPConstantProp/return-constant.ll b/test/Transforms/IPConstantProp/return-constant.ll new file mode 100644 index 0000000..36cd493 --- /dev/null +++ b/test/Transforms/IPConstantProp/return-constant.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipconstprop -instcombine | \ +; RUN: llvm-dis | grep {ret i1 true} +implementation + +internal int %foo(bool %C) { + br bool %C, label %T, label %F +T: + ret int 52 +F: + ret int 52 +} + +bool %caller(bool %C) { + %X = call int %foo(bool %C) + %Y = setne int %X, 0 + ret bool %Y +} diff --git a/test/Transforms/IndVarsSimplify/2002-09-09-PointerIndVar.ll b/test/Transforms/IndVarsSimplify/2002-09-09-PointerIndVar.ll new file mode 100644 index 0000000..4c80e48 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2002-09-09-PointerIndVar.ll @@ -0,0 +1,16 @@ +; Induction variable pass is doing bad things with pointer induction vars, +; trying to do arithmetic on them directly. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars +; +void %test(int %A, uint %S, sbyte* %S) { + + br label %Loop +Loop: + %PIV = phi sbyte* [%S, %0], [%PIVNext, %Loop] + + %PIV = cast sbyte* %PIV to ulong + %PIVNext = add ulong %PIV, 8 + %PIVNext = cast ulong %PIVNext to sbyte* + br label %Loop +} diff --git a/test/Transforms/IndVarsSimplify/2003-04-16-ExprAnalysis.ll b/test/Transforms/IndVarsSimplify/2003-04-16-ExprAnalysis.ll new file mode 100644 index 0000000..2f19825 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-04-16-ExprAnalysis.ll @@ -0,0 +1,14 @@ +; This is a test case for the expression analysis code, not really indvars. +; It was assuming any constant of int type was a ConstantInteger. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars + +%X = global int 7 + +void %test(int %A) { + br label %Loop +Loop: + %IV = phi int [%A, %0], [%IVNext, %Loop] + %IVNext = add int %IV, cast (int* %X to int) + br label %Loop +} diff --git a/test/Transforms/IndVarsSimplify/2003-09-12-MultiplePred.ll b/test/Transforms/IndVarsSimplify/2003-09-12-MultiplePred.ll new file mode 100644 index 0000000..ea1e585 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-09-12-MultiplePred.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep indvar + +int %test() { + br bool true, label %LoopHead, label %LoopHead + +LoopHead: + %A = phi int [7, %0], [7, %0], [%B, %LoopHead] + %B = add int %A, 1 + br bool false, label %LoopHead, label %Out +Out: + ret int %B +} diff --git a/test/Transforms/IndVarsSimplify/2003-09-23-NotAtTop.ll b/test/Transforms/IndVarsSimplify/2003-09-23-NotAtTop.ll new file mode 100644 index 0000000..d715f68 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-09-23-NotAtTop.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | %prcontext Loop: 1 | grep %indvar + +; The indvar simplification code should ensure that the first PHI in the block +; is the canonical one! + +int %test() { + br label %Loop +Loop: + %NonIndvar = phi int [200, %0], [%NonIndvarNext, %Loop] + %Canonical = phi int [0, %0], [%CanonicalNext, %Loop] + + %NonIndvarNext = div int %NonIndvar, 2 + %CanonicalNext = add int %Canonical, 1 + br label %Loop +} + diff --git a/test/Transforms/IndVarsSimplify/2003-12-10-IndVarDeadCode.ll b/test/Transforms/IndVarsSimplify/2003-12-10-IndVarDeadCode.ll new file mode 100644 index 0000000..ba67989 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-12-10-IndVarDeadCode.ll @@ -0,0 +1,24 @@ +; The induction variable canonicalization pass shouldn't leave dead +; instructions laying around! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | \ +; RUN: not grep {#uses=0} + +int %mul(int %x, int %y) { +entry: + br label %tailrecurse + +tailrecurse: ; preds = %entry, %endif + %accumulator.tr = phi int [ %x, %entry ], [ %tmp.9, %endif ] ; <int> [#uses=2] + %y.tr = phi int [ %y, %entry ], [ %tmp.8, %endif ] ; <int> [#uses=2] + %tmp.1 = seteq int %y.tr, 0 ; <bool> [#uses=1] + br bool %tmp.1, label %return, label %endif + +endif: ; preds = %tailrecurse + %tmp.8 = add int %y.tr, -1 ; <int> [#uses=1] + %tmp.9 = add int %accumulator.tr, %x ; <int> [#uses=1] + br label %tailrecurse + +return: ; preds = %tailrecurse + ret int %accumulator.tr +} diff --git a/test/Transforms/IndVarsSimplify/2003-12-10-RemoveInstrCrash.llx b/test/Transforms/IndVarsSimplify/2003-12-10-RemoveInstrCrash.llx new file mode 100644 index 0000000..09d384e --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-12-10-RemoveInstrCrash.llx @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +void %test() { +entry: + %inc.2 = add int 1, 1 ; <int> [#uses=1] + br bool false, label %no_exit, label %loopexit + +no_exit: ; preds = %entry, %no_exit + %j.0.pn = phi int [ %inc.3, %no_exit ], [ %inc.2, %entry ] ; <int> [#uses=1] + %k.0.pn = phi int [ %inc.4, %no_exit ], [ 1, %entry ] ; <int> [#uses=1] + %inc.3 = add int %j.0.pn, 1 ; <int> [#uses=1] + %inc.4 = add int %k.0.pn, 1 ; <int> [#uses=1] + br bool false, label %no_exit, label %loopexit + +loopexit: ; preds = %entry, %no_exit + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2003-12-15-Crash.llx b/test/Transforms/IndVarsSimplify/2003-12-15-Crash.llx new file mode 100644 index 0000000..3724728 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-12-15-Crash.llx @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output +void %_ZN17CoinFactorization7cleanupEv() { +entry: + br bool false, label %loopexit.14, label %cond_continue.3 + +cond_continue.3: ; preds = %entry + ret void + +loopexit.14: ; preds = %entry + %tmp.738 = sub int 0, 0 ; <int> [#uses=1] + br bool false, label %no_exit.15.preheader, label %loopexit.15 + +no_exit.15.preheader: ; preds = %loopexit.14 + br label %no_exit.15 + +no_exit.15: ; preds = %no_exit.15.preheader, %no_exit.15 + %highC.0 = phi int [ %tmp.738, %no_exit.15.preheader ], [ %dec.0, %no_exit.15 ] ; <int> [#uses=1] + %dec.0 = add int %highC.0, -1 ; <int> [#uses=1] + br bool false, label %no_exit.15, label %loopexit.15 + +loopexit.15: ; preds = %loopexit.14, %no_exit.15 + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2003-12-21-IndVarSize.ll b/test/Transforms/IndVarsSimplify/2003-12-21-IndVarSize.ll new file mode 100644 index 0000000..26fecf4 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2003-12-21-IndVarSize.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep indvar | not grep uint + +%G = global long 0 + +void %test() { + br label %Loop +Loop: + %X = phi long [1, %0], [%X.next, %Loop] + %X.next = add long %X, 1 + store long %X, long* %G + br label %Loop +} diff --git a/test/Transforms/IndVarsSimplify/2004-03-10-PHIInsertionBug.ll b/test/Transforms/IndVarsSimplify/2004-03-10-PHIInsertionBug.ll new file mode 100644 index 0000000..88c393e --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2004-03-10-PHIInsertionBug.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +implementation ; Functions: + +void %test() { + br label %endif.0.i + +endif.0.i: ; preds = %then.0.i + br bool false, label %then.3.i, label %endif.3.i + +then.3.i: ; preds = %endif.0.i + br label %endif.3.i + +endif.3.i: ; preds = %endif.0.i, %then.3.i + %inxm.0.i = phi int [ 8, %then.3.i ], [ 0, %endif.0.i ] + %doinner.1.i = phi int [ 0, %then.3.i ], [ 0, %endif.0.i ] + br label %loopentry.2.i + +loopentry.2.i: ; preds = %endif.3.i, %no_exit.2.i + %inxk.0.i = phi int [ %tmp.210.i, %no_exit.2.i ], [ 0, %endif.3.i ] + br label %no_exit.2.i + +no_exit.2.i: ; preds = %loopentry.2.i + %tmp.210.i = sub int %inxk.0.i, %inxm.0.i + %tmp.213.i = add int %tmp.210.i, 0 + br label %loopentry.2.i +} diff --git a/test/Transforms/IndVarsSimplify/2004-04-05-InvokeCastCrash.llx b/test/Transforms/IndVarsSimplify/2004-04-05-InvokeCastCrash.llx new file mode 100644 index 0000000..c0d8410 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2004-04-05-InvokeCastCrash.llx @@ -0,0 +1,286 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + + %struct.__false_type = type { ubyte } + "struct.__gnu_cxx::_Hashtable_node<const llvm::Constant*>" = type { "struct.__gnu_cxx::_Hashtable_node<const llvm::Constant*>"*, "struct.llvm::Constant"* } + "struct.__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >" = type { "struct.__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >"*, "struct.std::pair<const llvm::Value* const,int>" } + "struct.__gnu_cxx::hash_map<const llvm::Value*,int,__gnu_cxx::hash<const llvm::Value*>,std::equal_to<const llvm::Value*>,std::allocator<int> >" = type { "struct.__gnu_cxx::hashtable<std::pair<const llvm::Value* const, int>,const llvm::Value*,__gnu_cxx::hash<const llvm::Value*>,std::_Select1st<std::pair<const llvm::Value* const, int> >,std::equal_to<const llvm::Value*>,std::allocator<int> >" } + "struct.__gnu_cxx::hash_set<const llvm::Constant*,__gnu_cxx::hash<const llvm::Constant*>,std::equal_to<const llvm::Constant*>,std::allocator<const llvm::Constant*> >" = type { "struct.__gnu_cxx::hashtable<const llvm::Constant*,const llvm::Constant*,__gnu_cxx::hash<const llvm::Constant*>,std::_Identity<const llvm::Constant*>,std::equal_to<const llvm::Constant*>,std::allocator<const llvm::Constant*> >" } + "struct.__gnu_cxx::hashtable<const llvm::Constant*,const llvm::Constant*,__gnu_cxx::hash<const llvm::Constant*>,std::_Identity<const llvm::Constant*>,std::equal_to<const llvm::Constant*>,std::allocator<const llvm::Constant*> >" = type { %struct.__false_type, %struct.__false_type, %struct.__false_type, %struct.__false_type, "struct.std::vector<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*> >", uint } + "struct.__gnu_cxx::hashtable<std::pair<const llvm::Value* const, int>,const llvm::Value*,__gnu_cxx::hash<const llvm::Value*>,std::_Select1st<std::pair<const llvm::Value* const, int> >,std::equal_to<const llvm::Value*>,std::allocator<int> >" = type { %struct.__false_type, %struct.__false_type, %struct.__false_type, %struct.__false_type, "struct.std::vector<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int> >", uint } + "struct.llvm::AbstractTypeUser" = type { int (...)** } + "struct.llvm::Annotable" = type { int (...)**, "struct.llvm::Annotation"* } + "struct.llvm::Annotation" = type { int (...)**, "struct.llvm::AnnotationID", "struct.llvm::Annotation"* } + "struct.llvm::AnnotationID" = type { uint } + "struct.llvm::Argument" = type { "struct.llvm::Value", "struct.llvm::Function"*, "struct.llvm::Argument"*, "struct.llvm::Argument"* } + "struct.llvm::BasicBlock" = type { "struct.llvm::Value", "struct.llvm::iplist<llvm::Instruction,llvm::ilist_traits<llvm::Instruction> >", "struct.llvm::BasicBlock"*, "struct.llvm::BasicBlock"* } + "struct.llvm::Constant" = type opaque + "struct.llvm::DerivedType" = type { "struct.llvm::Type", "struct.llvm::AbstractTypeUser", "struct.std::vector<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*> >" } + "struct.llvm::Function" = type { "struct.llvm::GlobalValue", "struct.llvm::Annotable", "struct.llvm::iplist<llvm::BasicBlock,llvm::ilist_traits<llvm::BasicBlock> >", "struct.llvm::iplist<llvm::Argument,llvm::ilist_traits<llvm::Argument> >", "struct.llvm::SymbolTable"*, "struct.llvm::Function"*, "struct.llvm::Function"* } + "struct.llvm::FunctionPass" = type { "struct.llvm::Pass" } + "struct.llvm::FunctionType" = type { "struct.llvm::DerivedType", bool } + "struct.llvm::GlobalValue" = type { "struct.llvm::User", uint, "struct.llvm::Module"* } + "struct.llvm::Instruction" = type { "struct.llvm::User", "struct.llvm::Annotable", "struct.llvm::BasicBlock"*, "struct.llvm::Instruction"*, "struct.llvm::Instruction"*, uint } + "struct.llvm::IntrinsicLowering" = type opaque + "struct.llvm::MachineBasicBlock" = type { "struct.llvm::ilist<llvm::MachineInstr>", "struct.llvm::MachineBasicBlock"*, "struct.llvm::MachineBasicBlock"*, "struct.llvm::BasicBlock"* } + "struct.llvm::MachineConstantPool" = type opaque + "struct.llvm::MachineFrameInfo" = type opaque + "struct.llvm::MachineFunction" = type { "struct.llvm::Annotation", "struct.llvm::Function"*, "struct.llvm::TargetMachine"*, "struct.llvm::iplist<llvm::MachineBasicBlock,llvm::ilist_traits<llvm::MachineBasicBlock> >", "struct.llvm::SSARegMap"*, "struct.llvm::MachineFunctionInfo"*, "struct.llvm::MachineFrameInfo"*, "struct.llvm::MachineConstantPool"* } + "struct.llvm::MachineFunctionInfo" = type { "struct.__gnu_cxx::hash_set<const llvm::Constant*,__gnu_cxx::hash<const llvm::Constant*>,std::equal_to<const llvm::Constant*>,std::allocator<const llvm::Constant*> >", "struct.__gnu_cxx::hash_map<const llvm::Value*,int,__gnu_cxx::hash<const llvm::Value*>,std::equal_to<const llvm::Value*>,std::allocator<int> >", uint, uint, uint, uint, uint, uint, uint, bool, bool, bool, "struct.llvm::MachineFunction"* } + "struct.llvm::MachineFunctionPass" = type { "struct.llvm::FunctionPass" } + "struct.llvm::MachineInstr" = type { short, ubyte, "struct.std::vector<llvm::MachineOperand,std::allocator<llvm::MachineOperand> >", "struct.llvm::MachineInstr"*, "struct.llvm::MachineInstr"*, "struct.llvm::MachineBasicBlock"* } + "struct.llvm::MachineInstrBuilder" = type { "struct.llvm::MachineInstr"* } + "struct.llvm::MachineOperand" = type { "union.llvm::MachineOperand::._65", int, int } + "struct.llvm::Module" = type opaque + "struct.llvm::PATypeHandle" = type { "struct.llvm::Type"*, "struct.llvm::AbstractTypeUser"* } + "struct.llvm::PATypeHolder" = type { "struct.llvm::Type"* } + "struct.llvm::Pass" = type { int (...)**, "struct.llvm::AbstractTypeUser"*, "struct.llvm::PassInfo"*, "struct.std::vector<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> > >" } + "struct.llvm::PassInfo" = type { sbyte*, sbyte*, "struct.std::type_info"*, ubyte, "struct.std::vector<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*> >", "struct.llvm::Pass"* ()*, "struct.llvm::Pass"* ("struct.llvm::TargetMachine"*)* } + "struct.llvm::SSARegMap" = type opaque + "struct.llvm::SymbolTable" = type opaque + "struct.llvm::SymbolTableListTraits<llvm::Argument,llvm::Function,llvm::Function,llvm::ilist_traits<llvm::Argument> >" = type { "struct.llvm::Function"*, "struct.llvm::Function"* } + "struct.llvm::SymbolTableListTraits<llvm::Instruction,llvm::BasicBlock,llvm::Function,llvm::ilist_traits<llvm::Instruction> >" = type { "struct.llvm::Function"*, "struct.llvm::BasicBlock"* } + "struct.llvm::TargetData" = type { "struct.llvm::FunctionPass", bool, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + "struct.llvm::TargetFrameInfo" = type { int (...)**, uint, uint, int } + "struct.llvm::TargetInstrDescriptor" = type { sbyte*, int, int, uint, bool, uint, uint, uint, uint, uint, uint*, uint* } + "struct.llvm::TargetInstrInfo" = type { int (...)**, "struct.llvm::TargetInstrDescriptor"*, uint, uint } + "struct.llvm::TargetMachine" = type { int (...)**, "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >", "struct.llvm::TargetData", "struct.llvm::IntrinsicLowering"* } + "struct.llvm::TargetRegClassInfo" = type { int (...)**, uint, uint, uint } + "struct.llvm::TargetRegInfo" = type { int (...)**, "struct.std::vector<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*> >", "struct.llvm::TargetMachine"* } + "struct.llvm::Type" = type { "struct.llvm::Value", uint, uint, bool, uint, "struct.llvm::Type"*, "struct.std::vector<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle> >" } + "struct.llvm::Use" = type { "struct.llvm::Value"*, "struct.llvm::User"*, "struct.llvm::Use"*, "struct.llvm::Use"* } + "struct.llvm::User" = type { "struct.llvm::Value", "struct.std::vector<llvm::Use,std::allocator<llvm::Use> >" } + "struct.llvm::Value" = type { int (...)**, "struct.llvm::iplist<llvm::Use,llvm::ilist_traits<llvm::Use> >", "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >", "struct.llvm::PATypeHolder", uint } + "struct.llvm::_GLOBAL__N_::InsertPrologEpilogCode" = type { "struct.llvm::MachineFunctionPass" } + "struct.llvm::ilist<llvm::MachineInstr>" = type { "struct.llvm::iplist<llvm::MachineInstr,llvm::ilist_traits<llvm::MachineInstr> >" } + "struct.llvm::ilist_iterator<const llvm::MachineBasicBlock>" = type { "struct.llvm::MachineBasicBlock"* } + "struct.llvm::ilist_traits<llvm::Argument>" = type { "struct.llvm::SymbolTableListTraits<llvm::Argument,llvm::Function,llvm::Function,llvm::ilist_traits<llvm::Argument> >" } + "struct.llvm::ilist_traits<llvm::Instruction>" = type { "struct.llvm::SymbolTableListTraits<llvm::Instruction,llvm::BasicBlock,llvm::Function,llvm::ilist_traits<llvm::Instruction> >" } + "struct.llvm::iplist<llvm::Argument,llvm::ilist_traits<llvm::Argument> >" = type { "struct.llvm::ilist_traits<llvm::Argument>", "struct.llvm::Argument"*, "struct.llvm::Argument"* } + "struct.llvm::iplist<llvm::BasicBlock,llvm::ilist_traits<llvm::BasicBlock> >" = type { "struct.llvm::ilist_traits<llvm::Argument>", "struct.llvm::BasicBlock"*, "struct.llvm::BasicBlock"* } + "struct.llvm::iplist<llvm::Instruction,llvm::ilist_traits<llvm::Instruction> >" = type { "struct.llvm::ilist_traits<llvm::Instruction>", "struct.llvm::Instruction"*, "struct.llvm::Instruction"* } + "struct.llvm::iplist<llvm::MachineBasicBlock,llvm::ilist_traits<llvm::MachineBasicBlock> >" = type { "struct.llvm::MachineBasicBlock"*, "struct.llvm::MachineBasicBlock"* } + "struct.llvm::iplist<llvm::MachineInstr,llvm::ilist_traits<llvm::MachineInstr> >" = type { "struct.llvm::ilist_iterator<const llvm::MachineBasicBlock>", "struct.llvm::MachineInstr"*, "struct.llvm::MachineInstr"* } + "struct.llvm::iplist<llvm::Use,llvm::ilist_traits<llvm::Use> >" = type { "struct.llvm::Use"*, "struct.llvm::Use"* } + "struct.std::_Vector_alloc_base<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*>, true>" = type { "struct.__gnu_cxx::_Hashtable_node<const llvm::Constant*>"**, "struct.__gnu_cxx::_Hashtable_node<const llvm::Constant*>"**, "struct.__gnu_cxx::_Hashtable_node<const llvm::Constant*>"** } + "struct.std::_Vector_alloc_base<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int>, true>" = type { "struct.__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >"**, "struct.__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >"**, "struct.__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >"** } + "struct.std::_Vector_alloc_base<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*>, true>" = type { "struct.llvm::PassInfo"**, "struct.llvm::PassInfo"**, "struct.llvm::PassInfo"** } + "struct.std::_Vector_alloc_base<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*>, true>" = type { "struct.llvm::TargetRegClassInfo"**, "struct.llvm::TargetRegClassInfo"**, "struct.llvm::TargetRegClassInfo"** } + "struct.std::_Vector_alloc_base<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*>, true>" = type { "struct.llvm::AbstractTypeUser"**, "struct.llvm::AbstractTypeUser"**, "struct.llvm::AbstractTypeUser"** } + "struct.std::_Vector_alloc_base<llvm::MachineInstr*,std::allocator<llvm::MachineInstr*>, true>" = type { "struct.llvm::MachineInstr"**, "struct.llvm::MachineInstr"**, "struct.llvm::MachineInstr"** } + "struct.std::_Vector_alloc_base<llvm::MachineOperand,std::allocator<llvm::MachineOperand>, true>" = type { "struct.llvm::MachineOperand"*, "struct.llvm::MachineOperand"*, "struct.llvm::MachineOperand"* } + "struct.std::_Vector_alloc_base<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle>, true>" = type { "struct.llvm::PATypeHandle"*, "struct.llvm::PATypeHandle"*, "struct.llvm::PATypeHandle"* } + "struct.std::_Vector_alloc_base<llvm::Use,std::allocator<llvm::Use>, true>" = type { "struct.llvm::Use"*, "struct.llvm::Use"*, "struct.llvm::Use"* } + "struct.std::_Vector_alloc_base<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> >, true>" = type { "struct.std::pair<const llvm::PassInfo*,llvm::Pass*>"*, "struct.std::pair<const llvm::PassInfo*,llvm::Pass*>"*, "struct.std::pair<const llvm::PassInfo*,llvm::Pass*>"* } + "struct.std::_Vector_base<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*> >" = type { "struct.std::_Vector_alloc_base<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*>, true>" } + "struct.std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int> >" = type { "struct.std::_Vector_alloc_base<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int>, true>" } + "struct.std::_Vector_base<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*> >" = type { "struct.std::_Vector_alloc_base<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*>, true>" } + "struct.std::_Vector_base<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*> >" = type { "struct.std::_Vector_alloc_base<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*>, true>" } + "struct.std::_Vector_base<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*> >" = type { "struct.std::_Vector_alloc_base<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*>, true>" } + "struct.std::_Vector_base<llvm::MachineInstr*,std::allocator<llvm::MachineInstr*> >" = type { "struct.std::_Vector_alloc_base<llvm::MachineInstr*,std::allocator<llvm::MachineInstr*>, true>" } + "struct.std::_Vector_base<llvm::MachineOperand,std::allocator<llvm::MachineOperand> >" = type { "struct.std::_Vector_alloc_base<llvm::MachineOperand,std::allocator<llvm::MachineOperand>, true>" } + "struct.std::_Vector_base<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle> >" = type { "struct.std::_Vector_alloc_base<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle>, true>" } + "struct.std::_Vector_base<llvm::Use,std::allocator<llvm::Use> >" = type { "struct.std::_Vector_alloc_base<llvm::Use,std::allocator<llvm::Use>, true>" } + "struct.std::_Vector_base<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> > >" = type { "struct.std::_Vector_alloc_base<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> >, true>" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >" = type { "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Alloc_hider" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Alloc_hider" = type { sbyte* } + "struct.std::pair<const llvm::PassInfo*,llvm::Pass*>" = type { "struct.llvm::PassInfo"*, "struct.llvm::Pass"* } + "struct.std::pair<const llvm::Value* const,int>" = type { "struct.llvm::Value"*, int } + "struct.std::type_info" = type { int (...)**, sbyte* } + "struct.std::vector<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*> >" = type { "struct.std::_Vector_base<__gnu_cxx::_Hashtable_node<const llvm::Constant*>*,std::allocator<const llvm::Constant*> >" } + "struct.std::vector<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int> >" = type { "struct.std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<const llvm::Value* const, int> >*,std::allocator<int> >" } + "struct.std::vector<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*> >" = type { "struct.std::_Vector_base<const llvm::PassInfo*,std::allocator<const llvm::PassInfo*> >" } + "struct.std::vector<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*> >" = type { "struct.std::_Vector_base<const llvm::TargetRegClassInfo*,std::allocator<const llvm::TargetRegClassInfo*> >" } + "struct.std::vector<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*> >" = type { "struct.std::_Vector_base<llvm::AbstractTypeUser*,std::allocator<llvm::AbstractTypeUser*> >" } + "struct.std::vector<llvm::MachineInstr*,std::allocator<llvm::MachineInstr*> >" = type { "struct.std::_Vector_base<llvm::MachineInstr*,std::allocator<llvm::MachineInstr*> >" } + "struct.std::vector<llvm::MachineOperand,std::allocator<llvm::MachineOperand> >" = type { "struct.std::_Vector_base<llvm::MachineOperand,std::allocator<llvm::MachineOperand> >" } + "struct.std::vector<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle> >" = type { "struct.std::_Vector_base<llvm::PATypeHandle,std::allocator<llvm::PATypeHandle> >" } + "struct.std::vector<llvm::Use,std::allocator<llvm::Use> >" = type { "struct.std::_Vector_base<llvm::Use,std::allocator<llvm::Use> >" } + "struct.std::vector<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> > >" = type { "struct.std::_Vector_base<std::pair<const llvm::PassInfo*, llvm::Pass*>,std::allocator<std::pair<const llvm::PassInfo*, llvm::Pass*> > >" } + "union.llvm::MachineOperand::._65" = type { "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >"* } + +implementation ; Functions: + +declare void %_Znwj() + +declare void %_ZN4llvm12MachineInstrC1Esjbb() + +declare void %_ZNSt6vectorIPN4llvm12MachineInstrESaIS2_EE9push_backERKS2_() + +declare void %_ZNK4llvm8Function15getFunctionTypeEv() + +declare void %_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTypeE() + +declare void %_ZNK4llvm19MachineInstrBuilder7addSImmEi() + +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 = %entry, %invoke_cont.0.i, %tmp.7.i.noexc.i, %endif.0.i.i, %invoke_cont.1.i, %invoke_cont.2.i, %invoke_cont.3.i, %invoke_cont.4.i, %then.0.i, %invoke_cont.i.i, %invoke_cont.7.i, %invoke_cont.8.i, %invoke_cont.9.i, %endif.0.i, %then.1.i, %invoke_cont.34.i, %invoke_cont.35.i, %then.2.i, %invoke_cont.37.i, %invoke_cont.38.i, %invoke_cont.39.i, %invoke_cont.40.i, %invoke_cont.41.i, %invoke_cont.42.i, %invoke_cont.43.i, %invoke_cont.44.i, %no_exit.i, %invoke_cont.i53.i, %invoke_cont.47.i, %invoke_cont.48.i, %invoke_cont.49.i + ret void + +invoke_cont.0.i: ; preds = %entry + %tmp.7.i1.i = invoke "struct.llvm::TargetFrameInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %tmp.7.i.noexc.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetFrameInfo"*> [#uses=2] + +tmp.7.i.noexc.i: ; preds = %invoke_cont.0.i + %tmp.17.i2.i = invoke int null( "struct.llvm::TargetFrameInfo"* %tmp.7.i1.i ) + to label %endif.0.i.i unwind label %invoke_catch.0.i ; <int> [#uses=0] + +endif.0.i.i: ; preds = %tmp.7.i.noexc.i + %tmp.38.i4.i = invoke int null( "struct.llvm::TargetFrameInfo"* %tmp.7.i1.i ) + to label %tmp.38.i.noexc.i unwind label %invoke_catch.0.i ; <int> [#uses=0] + +tmp.38.i.noexc.i: ; preds = %endif.0.i.i + br bool false, label %invoke_cont.1.i, label %then.1.i.i + +then.1.i.i: ; preds = %tmp.38.i.noexc.i + ret void + +invoke_cont.1.i: ; preds = %tmp.38.i.noexc.i + %tmp.21.i = invoke "struct.llvm::TargetRegInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.2.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetRegInfo"*> [#uses=1] + +invoke_cont.2.i: ; preds = %invoke_cont.1.i + %tmp.28.i = invoke uint null( "struct.llvm::TargetRegInfo"* %tmp.21.i ) + to label %invoke_cont.3.i unwind label %invoke_catch.0.i ; <uint> [#uses=0] + +invoke_cont.3.i: ; preds = %invoke_cont.2.i + %tmp.36.i = invoke "struct.llvm::TargetInstrInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.4.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetInstrInfo"*> [#uses=1] + +invoke_cont.4.i: ; preds = %invoke_cont.3.i + %tmp.43.i = invoke bool null( "struct.llvm::TargetInstrInfo"* %tmp.36.i, short 383, long 0 ) + to label %invoke_cont.5.i unwind label %invoke_catch.0.i ; <bool> [#uses=1] + +invoke_cont.5.i: ; preds = %invoke_cont.4.i + br bool %tmp.43.i, label %then.0.i, label %else.i + +then.0.i: ; preds = %invoke_cont.5.i + invoke void %_Znwj( ) + to label %tmp.0.i.noexc.i unwind label %invoke_catch.0.i + +tmp.0.i.noexc.i: ; preds = %then.0.i + invoke void %_ZN4llvm12MachineInstrC1Esjbb( ) + to label %invoke_cont.i.i unwind label %cond_true.i.i + +cond_true.i.i: ; preds = %tmp.0.i.noexc.i + ret void + +invoke_cont.i.i: ; preds = %tmp.0.i.noexc.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTypeE( ) + to label %invoke_cont.7.i unwind label %invoke_catch.0.i + +invoke_cont.7.i: ; preds = %invoke_cont.i.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addSImmEi( ) + to label %invoke_cont.8.i unwind label %invoke_catch.0.i + +invoke_cont.8.i: ; preds = %invoke_cont.7.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTypeE( ) + to label %invoke_cont.9.i unwind label %invoke_catch.0.i + +invoke_cont.9.i: ; preds = %invoke_cont.8.i + invoke void %_ZNSt6vectorIPN4llvm12MachineInstrESaIS2_EE9push_backERKS2_( ) + to label %endif.0.i unwind label %invoke_catch.0.i + +else.i: ; preds = %invoke_cont.5.i + ret void + +endif.0.i: ; preds = %invoke_cont.9.i + invoke void %_ZNK4llvm8Function15getFunctionTypeEv( ) + to label %invoke_cont.33.i unwind label %invoke_catch.0.i + +invoke_cont.33.i: ; preds = %endif.0.i + br bool false, label %then.1.i, label %endif.1.i + +then.1.i: ; preds = %invoke_cont.33.i + invoke void %_ZNK4llvm8Function15getFunctionTypeEv( ) + to label %invoke_cont.34.i unwind label %invoke_catch.0.i + +invoke_cont.34.i: ; preds = %then.1.i + %tmp.121.i = invoke "struct.llvm::TargetRegInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.35.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetRegInfo"*> [#uses=1] + +invoke_cont.35.i: ; preds = %invoke_cont.34.i + %tmp.128.i = invoke uint null( "struct.llvm::TargetRegInfo"* %tmp.121.i ) + to label %invoke_cont.36.i unwind label %invoke_catch.0.i ; <uint> [#uses=0] + +invoke_cont.36.i: ; preds = %invoke_cont.35.i + br bool false, label %then.2.i, label %endif.1.i + +then.2.i: ; preds = %invoke_cont.36.i + %tmp.140.i = invoke "struct.llvm::TargetRegInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.37.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetRegInfo"*> [#uses=0] + +invoke_cont.37.i: ; preds = %then.2.i + %tmp.148.i = invoke "struct.llvm::TargetRegInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.38.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetRegInfo"*> [#uses=1] + +invoke_cont.38.i: ; preds = %invoke_cont.37.i + %tmp.155.i = invoke uint null( "struct.llvm::TargetRegInfo"* %tmp.148.i, "struct.llvm::Type"* null, bool false ) + to label %invoke_cont.39.i unwind label %invoke_catch.0.i ; <uint> [#uses=0] + +invoke_cont.39.i: ; preds = %invoke_cont.38.i + %tmp.163.i = invoke "struct.llvm::TargetFrameInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.40.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetFrameInfo"*> [#uses=1] + +invoke_cont.40.i: ; preds = %invoke_cont.39.i + %tmp.170.i = invoke int null( "struct.llvm::TargetFrameInfo"* %tmp.163.i ) + to label %invoke_cont.41.i unwind label %invoke_catch.0.i ; <int> [#uses=0] + +invoke_cont.41.i: ; preds = %invoke_cont.40.i + %tmp.177.i = invoke "struct.llvm::TargetFrameInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.42.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetFrameInfo"*> [#uses=1] + +invoke_cont.42.i: ; preds = %invoke_cont.41.i + %tmp.184.i = invoke int null( "struct.llvm::TargetFrameInfo"* %tmp.177.i ) + to label %invoke_cont.43.i unwind label %invoke_catch.0.i ; <int> [#uses=1] + +invoke_cont.43.i: ; preds = %invoke_cont.42.i + %tmp.191.i = invoke "struct.llvm::TargetFrameInfo"* null( "struct.llvm::TargetMachine"* null ) + to label %invoke_cont.44.i unwind label %invoke_catch.0.i ; <"struct.llvm::TargetFrameInfo"*> [#uses=1] + +invoke_cont.44.i: ; preds = %invoke_cont.43.i + %tmp.198.i = invoke int null( "struct.llvm::TargetFrameInfo"* %tmp.191.i, "struct.llvm::MachineFunction"* %F, bool* null ) + to label %invoke_cont.45.i unwind label %invoke_catch.0.i ; <int> [#uses=0] + +invoke_cont.45.i: ; preds = %invoke_cont.44.i + br bool false, label %no_exit.i, label %endif.1.i + +no_exit.i: ; preds = %invoke_cont.45.i, %invoke_cont.50.i + %nextArgOffset.0.i.1 = phi int [ %tmp.221.i, %invoke_cont.50.i ], [ 0, %invoke_cont.45.i ] ; <int> [#uses=1] + invoke void %_Znwj( ) + to label %tmp.0.i.noexc55.i unwind label %invoke_catch.0.i + +tmp.0.i.noexc55.i: ; preds = %no_exit.i + invoke void %_ZN4llvm12MachineInstrC1Esjbb( ) + to label %invoke_cont.i53.i unwind label %cond_true.i52.i + +cond_true.i52.i: ; preds = %tmp.0.i.noexc55.i + ret void + +invoke_cont.i53.i: ; preds = %tmp.0.i.noexc55.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTypeE( ) + to label %invoke_cont.47.i unwind label %invoke_catch.0.i + +invoke_cont.47.i: ; preds = %invoke_cont.i53.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addMRegEiNS_14MachineOperand7UseTypeE( ) + to label %invoke_cont.48.i unwind label %invoke_catch.0.i + +invoke_cont.48.i: ; preds = %invoke_cont.47.i + invoke void %_ZNK4llvm19MachineInstrBuilder7addSImmEi( ) + to label %invoke_cont.49.i unwind label %invoke_catch.0.i + +invoke_cont.49.i: ; preds = %invoke_cont.48.i + invoke void %_ZNSt6vectorIPN4llvm12MachineInstrESaIS2_EE9push_backERKS2_( ) + to label %invoke_cont.50.i unwind label %invoke_catch.0.i + +invoke_cont.50.i: ; preds = %invoke_cont.49.i + %tmp.221.i = add int %nextArgOffset.0.i.1, %tmp.184.i ; <int> [#uses=1] + br bool false, label %no_exit.i, label %endif.1.i + +endif.1.i: ; preds = %invoke_cont.33.i, %invoke_cont.36.i, %invoke_cont.45.i, %invoke_cont.50.i + ret void +} + diff --git a/test/Transforms/IndVarsSimplify/2004-04-07-ScalarEvolutionCrash.llx b/test/Transforms/IndVarsSimplify/2004-04-07-ScalarEvolutionCrash.llx new file mode 100644 index 0000000..82212d5 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2004-04-07-ScalarEvolutionCrash.llx @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +void %.outPlank_21() { +entry: + br bool false, label %loopexit.0, label %no_exit.0 + +no_exit.0: ; preds = %entry + ret void + +loopexit.0: ; preds = %entry + br bool false, label %no_exit.1, label %loopexit.1 + +no_exit.1: ; preds = %loopexit.0, %loopexit.2 + %i.0.0 = phi int [ %inc, %loopexit.2 ], [ 0, %loopexit.0 ] ; <int> [#uses=1] + br bool false, label %loopexit.2, label %no_exit.2 + +no_exit.2: ; preds = %no_exit.1 + ret void + +loopexit.2: ; preds = %no_exit.1 + %inc = add int %i.0.0, 1 ; <int> [#uses=1] + br bool false, label %no_exit.1, label %loopexit.1 + +loopexit.1: ; preds = %loopexit.0, %loopexit.2 + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2005-02-11-InvokeCrash.ll b/test/Transforms/IndVarsSimplify/2005-02-11-InvokeCrash.ll new file mode 100644 index 0000000..92a4830 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2005-02-11-InvokeCrash.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +void %_ZN5ArrayISt7complexIdEEC2ERK10dim_vector() { +entry: + %tmp.7 = invoke int %_ZN5ArrayISt7complexIdEE8get_sizeERK10dim_vector( ) + to label %invoke_cont.0 unwind label %cond_true.1 ; <int> [#uses=2] + +cond_true.1: ; preds = %entry + unwind + +invoke_cont.0: ; preds = %entry + %tmp.4.i = cast int %tmp.7 to uint ; <uint> [#uses=0] + %tmp.14.0.i5 = add int %tmp.7, -1 ; <int> [#uses=1] + br label %no_exit.i + +no_exit.i: ; preds = %no_exit.i, %invoke_cont.0 + %tmp.14.0.i.0 = phi int [ %tmp.14.0.i, %no_exit.i ], [ %tmp.14.0.i5, %invoke_cont.0 ] ; <int> [#uses=1] + %tmp.14.0.i = add int %tmp.14.0.i.0, -1 ; <int> [#uses=1] + br label %no_exit.i +} + +declare int %_ZN5ArrayISt7complexIdEE8get_sizeERK10dim_vector() diff --git a/test/Transforms/IndVarsSimplify/2005-02-17-TruncateExprCrash.ll b/test/Transforms/IndVarsSimplify/2005-02-17-TruncateExprCrash.ll new file mode 100644 index 0000000..5ba8bdb --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2005-02-17-TruncateExprCrash.ll @@ -0,0 +1,63 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +implementation ; Functions: + +declare void %q_atomic_increment() + +declare void %_Z9qt_assertPKcS0_i() + +void %_ZN13QMetaResourceC1EPKh() { +entry: + invoke void %_Z9qt_assertPKcS0_i( ) + to label %endif.1 unwind label %then.i.i551 + +then.i.i551: ; preds = %entry + ret void + +endif.1: ; preds = %entry + br bool false, label %then.2, label %then.i.i + +then.2: ; preds = %endif.1 + invoke void %q_atomic_increment( ) + to label %loopentry.0 unwind label %invoke_catch.6 + +invoke_catch.6: ; preds = %then.2 + ret void + +loopentry.0: ; preds = %then.2 + br bool false, label %shortcirc_next.i, label %endif.3 + +endif.3: ; preds = %loopentry.0 + ret void + +shortcirc_next.i: ; preds = %loopentry.0 + br bool false, label %_ZNK7QString2atEi.exit, label %then.i + +then.i: ; preds = %shortcirc_next.i + ret void + +_ZNK7QString2atEi.exit: ; preds = %shortcirc_next.i + br bool false, label %endif.4, label %then.4 + +then.4: ; preds = %_ZNK7QString2atEi.exit + ret void + +endif.4: ; preds = %_ZNK7QString2atEi.exit + %tmp.115 = load ubyte* null ; <ubyte> [#uses=1] + br bool false, label %loopexit.1, label %no_exit.0 + +no_exit.0: ; preds = %no_exit.0, %endif.4 + %bytes_in_len.4.5 = phi ubyte [ %dec, %no_exit.0 ], [ %tmp.115, %endif.4 ] ; <ubyte> [#uses=1] + %off.5.5.in = phi int [ %off.5.5, %no_exit.0 ], [ 0, %endif.4 ] ; <int> [#uses=1] + %off.5.5 = add int %off.5.5.in, 1 ; <int> [#uses=2] + %dec = add ubyte %bytes_in_len.4.5, 255 ; <ubyte> [#uses=2] + %tmp.123631 = seteq ubyte %dec, 0 ; <bool> [#uses=1] + br bool %tmp.123631, label %loopexit.1, label %no_exit.0 + +loopexit.1: ; preds = %no_exit.0, %endif.4 + %off.5.in.6 = phi int [ 0, %endif.4 ], [ %off.5.5, %no_exit.0 ] ; <int> [#uses=0] + ret void + +then.i.i: ; preds = %endif.1 + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2005-02-26-ExitValueCompute.ll b/test/Transforms/IndVarsSimplify/2005-02-26-ExitValueCompute.ll new file mode 100644 index 0000000..1356266 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2005-02-26-ExitValueCompute.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | \ +; RUN: grep {ret i32 152} + +int %main() { +entry: + br label %no_exit + +no_exit: ; preds = %no_exit, %entry + %i.1.0 = phi int [ 0, %entry ], [ %inc, %no_exit ] ; <int> [#uses=2] + %tmp.4 = setgt int %i.1.0, 50 ; <bool> [#uses=1] + %tmp.7 = select bool %tmp.4, int 100, int 0 ; <int> [#uses=1] + %i.0 = add int %i.1.0, 1 ; <int> [#uses=1] + %inc = add int %i.0, %tmp.7 ; <int> [#uses=3] + %tmp.1 = setlt int %inc, 100 ; <bool> [#uses=1] + br bool %tmp.1, label %no_exit, label %loopexit + +loopexit: ; preds = %no_exit + ret int %inc +} + diff --git a/test/Transforms/IndVarsSimplify/2005-06-15-InstMoveCrash.ll b/test/Transforms/IndVarsSimplify/2005-06-15-InstMoveCrash.ll new file mode 100644 index 0000000..896482c --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2005-06-15-InstMoveCrash.ll @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +void %main() { +entry: + br label %no_exit.1.outer + +no_exit.1.outer: ; preds = %endif.0, %entry + %l_14237116.1.0.ph = phi sbyte [ -46, %entry ], [ 0, %endif.0 ] ; <sbyte> [#uses=1] + %i.0.0.0.ph = phi int [ 0, %entry ], [ %inc.1, %endif.0 ] ; <int> [#uses=1] + br label %no_exit.1 + +no_exit.1: ; preds = %_Z13func_47880058cc.exit, %no_exit.1.outer + br bool false, label %_Z13func_47880058cc.exit, label %then.i + +then.i: ; preds = %no_exit.1 + br label %_Z13func_47880058cc.exit + +_Z13func_47880058cc.exit: ; preds = %then.i, %no_exit.1 + br bool false, label %then.0, label %no_exit.1 + +then.0: ; preds = %_Z13func_47880058cc.exit + %tmp.6 = cast sbyte %l_14237116.1.0.ph to ubyte ; <ubyte> [#uses=1] + br bool false, label %endif.0, label %then.1 + +then.1: ; preds = %then.0 + br label %endif.0 + +endif.0: ; preds = %then.1, %then.0 + %inc.1 = add int %i.0.0.0.ph, 1 ; <int> [#uses=2] + %tmp.2 = setgt int %inc.1, 99 ; <bool> [#uses=1] + br bool %tmp.2, label %loopexit.0, label %no_exit.1.outer + +loopexit.0: ; preds = %endif.0 + %tmp.28 = cast ubyte %tmp.6 to uint ; <uint> [#uses=0] + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2005-11-18-Crash.ll b/test/Transforms/IndVarsSimplify/2005-11-18-Crash.ll new file mode 100644 index 0000000..9960e5c --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2005-11-18-Crash.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +%fixtab = external global [29 x [29 x [2 x uint]]] ; <[29 x [29 x [2 x uint]]]*> [#uses=1] + +implementation ; Functions: + +void %init_optabs() { +entry: + br label %no_exit.0 + +no_exit.0: ; preds = %no_exit.0, %entry + %p.0.0 = phi uint* [ getelementptr ([29 x [29 x [2 x uint]]]* %fixtab, int 0, int 0, int 0, int 0), %entry ], [ %inc.0, %no_exit.0 ] ; <uint*> [#uses=1] + %inc.0 = getelementptr uint* %p.0.0, int 1 ; <uint*> [#uses=1] + br bool false, label %no_exit.0, label %no_exit.1 + +no_exit.1: ; preds = %no_exit.0 + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll b/test/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll new file mode 100644 index 0000000..b2860fd --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2006-03-31-NegativeStride.ll @@ -0,0 +1,22 @@ +; PR726 +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | \ +; RUN: grep {ret i32 27} + +; Make sure to compute the right exit value based on negative strides. + +int %test() { +entry: + br label %cond_true + +cond_true: ; preds = %cond_true, %entry + %a.0.0 = phi int [ 10, %entry ], [ %tmp4, %cond_true ] ; <int> [#uses=2] + %b.0.0 = phi int [ 0, %entry ], [ %tmp2, %cond_true ] ; <int> [#uses=1] + %tmp2 = add int %b.0.0, %a.0.0 ; <int> [#uses=2] + %tmp4 = add int %a.0.0, -1 ; <int> [#uses=2] + %tmp = setgt int %tmp4, 7 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %bb7 + +bb7: ; preds = %cond_true + ret int %tmp2 +} + diff --git a/test/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll b/test/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll new file mode 100644 index 0000000..1fe8026 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +void %get_block() { +endif.0: ; preds = %entry + br label %no_exit.30 + +no_exit.30: ; preds = %no_exit.30, %endif.0 + %x.12.0 = phi int [ %inc.28, %no_exit.30 ], [ -2, %endif.0 ] ; <int> [#uses=1] + %tmp.583 = load ushort* null ; <ushort> [#uses=1] + %tmp.584 = cast ushort %tmp.583 to int ; <int> [#uses=1] + %tmp.588 = load int* null ; <int> [#uses=1] + %tmp.589 = mul int %tmp.584, %tmp.588 ; <int> [#uses=1] + %tmp.591 = add int %tmp.589, 0 ; <int> [#uses=1] + %inc.28 = add int %x.12.0, 1 ; <int> [#uses=2] + %tmp.565 = setgt int %inc.28, 3 ; <bool> [#uses=1] + br bool %tmp.565, label %loopexit.30, label %no_exit.30 + +loopexit.30: ; preds = %no_exit.30 + %tmp.591.lcssa = phi int [ %tmp.591, %no_exit.30 ] ; <int> [#uses=0] + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2006-09-20-LFTR-Crash.ll b/test/Transforms/IndVarsSimplify/2006-09-20-LFTR-Crash.ll new file mode 100644 index 0000000..88872f6 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2006-09-20-LFTR-Crash.ll @@ -0,0 +1,46 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + + %struct.p7prior_s = type { int, int, [200 x float], [200 x [7 x float]], int, [200 x float], [200 x [20 x float]], int, [200 x float], [200 x [20 x float]] } + +implementation ; Functions: + +void %P7DefaultPrior() { +entry: + switch int 0, label %UnifiedReturnBlock [ + int 2, label %bb160 + int 3, label %bb + ] + +bb: ; preds = %entry + br bool false, label %cond_true.i, label %sre_malloc.exit + +cond_true.i: ; preds = %bb + unreachable + +sre_malloc.exit: ; preds = %bb + br label %cond_true + +cond_true: ; preds = %cond_true66, %cond_true, %sre_malloc.exit + %tmp59 = phi int [ 1, %sre_malloc.exit ], [ %phitmp, %cond_true66 ], [ %tmp59, %cond_true ] ; <int> [#uses=2] + %indvar245.0.ph = phi uint [ 0, %sre_malloc.exit ], [ %indvar.next246, %cond_true66 ], [ %indvar245.0.ph, %cond_true ] ; <uint> [#uses=2] + br bool false, label %bb57, label %cond_true + +bb57: ; preds = %cond_true + %tmp65 = setgt int 0, %tmp59 ; <bool> [#uses=1] + %indvar.next246 = add uint %indvar245.0.ph, 1 ; <uint> [#uses=2] + br bool %tmp65, label %cond_true66, label %bb69 + +cond_true66: ; preds = %bb57 + %q.1.0 = cast uint %indvar.next246 to int ; <int> [#uses=1] + %phitmp = add int %q.1.0, 1 ; <int> [#uses=1] + br label %cond_true + +bb69: ; preds = %bb57 + ret void + +bb160: ; preds = %entry + ret void + +UnifiedReturnBlock: ; preds = %entry + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2006-12-10-BitCast.ll b/test/Transforms/IndVarsSimplify/2006-12-10-BitCast.ll new file mode 100644 index 0000000..4d2a29b --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2006-12-10-BitCast.ll @@ -0,0 +1,38 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -disable-output + +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-apple-darwin8" + %struct.vorbis_dsp_state = type { int, %struct.vorbis_info*, float**, float**, int, int, int, int, int, int, int, int, int, long, long, long, long, long, long, sbyte* } + %struct.vorbis_info = type { int, int, int, int, int, int, int, sbyte* } + +implementation ; Functions: + +void %_ve_envelope_search() { +entry: + br bool false, label %cond_true27, label %bb137 + +cond_true27: ; preds = %entry + br bool false, label %cond_true52, label %bb80 + +cond_true52: ; preds = %cond_true27 + %tmp152.i = bitcast float 0.000000e+00 to uint ; <uint> [#uses=1] + br label %cond_next182.i + +cond_next182.i: ; preds = %cond_next182.i, %cond_true52 + %decay.i.0 = phi uint [ %tmp195.i, %cond_next182.i ], [ %tmp152.i, %cond_true52 ] ; <uint> [#uses=1] + %tmp194.i53 = bitcast uint %decay.i.0 to float ; <float> [#uses=1] + %tmp195.i = sub float %tmp194.i53, 8.000000e+00 ; <float> [#uses=1] + %tmp195.i = bitcast float %tmp195.i to uint ; <uint> [#uses=1] + br bool false, label %cond_next182.i, label %bb418.i.preheader + +bb418.i.preheader: ; preds = %cond_next182.i + ret void + +bb80: ; preds = %cond_true27 + ret void + +bb137: ; preds = %entry + ret void +} diff --git a/test/Transforms/IndVarsSimplify/2007-01-06-TripCount.ll b/test/Transforms/IndVarsSimplify/2007-01-06-TripCount.ll new file mode 100644 index 0000000..dd151e8 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2007-01-06-TripCount.ll @@ -0,0 +1,38 @@ +; PR1015 +; RUN: llvm-as < %s | opt -indvars | llvm-dis | not grep {ret i32 0} + +target datalayout = "e-p:32:32" +target triple = "i686-apple-darwin8" +@foo = internal constant [5 x i8] c"\00abc\00" ; <[5 x i8]*> [#uses=1] +@str = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1] + + +define i32 @test(i32 %J) { +entry: + br label %bb2 + +bb: ; preds = %cond_next, %cond_true + %tmp1 = add i32 %i.0, 1 ; <i32> [#uses=1] + br label %bb2 + +bb2: ; preds = %bb, %entry + %i.0 = phi i32 [ 0, %entry ], [ %tmp1, %bb ] ; <i32> [#uses=4] + %tmp = icmp eq i32 %i.0, 0 ; <i1> [#uses=1] + br i1 %tmp, label %cond_true, label %cond_next + +cond_true: ; preds = %bb2 + br label %bb + +cond_next: ; preds = %bb2 + %tmp2 = getelementptr [5 x i8]* @foo, i32 0, i32 %i.0 ; <i8*> [#uses=1] + %tmp3 = load i8* %tmp2 ; <i8> [#uses=1] + %tmp5 = icmp eq i8 %tmp3, 0 ; <i1> [#uses=1] + br i1 %tmp5, label %bb6, label %bb + +bb6: ; preds = %cond_next + br label %return + +return: ; preds = %bb6 + ret i32 %i.0 +} + diff --git a/test/Transforms/IndVarsSimplify/2007-01-08-X86-64-Pointer.ll b/test/Transforms/IndVarsSimplify/2007-01-08-X86-64-Pointer.ll new file mode 100644 index 0000000..f1d0187 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2007-01-08-X86-64-Pointer.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | llc -march=x86-64 | grep {(%rdi,%rax,8)} +; RUN: llvm-as < %s | llc -march=x86-64 | not grep {addq.*8} + +define void @foo(double* %y) { +entry: + br label %bb + +bb: + %i = phi i64 [ 0, %entry ], [ %k, %bb ] + %j = getelementptr double* %y, i64 %i + store double 0.000000e+00, double* %j + %k = add i64 %i, 1 + %n = icmp eq i64 %k, 0 + br i1 %n, label %return, label %bb + +return: + ret void +} + diff --git a/test/Transforms/IndVarsSimplify/2007-06-06-DeleteDanglesPtr.ll b/test/Transforms/IndVarsSimplify/2007-06-06-DeleteDanglesPtr.ll new file mode 100644 index 0000000..363c98c --- /dev/null +++ b/test/Transforms/IndVarsSimplify/2007-06-06-DeleteDanglesPtr.ll @@ -0,0 +1,117 @@ +; RUN: llvm-as < %s | opt -indvars -disable-output +; PR1487 + + %struct.AVClass = type { i8*, i8* (i8*)*, %struct.AVOption* } + %struct.AVCodec = type { i8*, i32, i32, i32, i32 (%struct.AVCodecContext*)*, i32 (%struct.AVCodecContext*, i8*, i32, i8*)*, i32 (%struct.AVCodecContext*)*, i32 (%struct.AVCodecContext*, i8*, i32*, i8*, i32)*, i32, %struct.AVCodec*, void (%struct.AVCodecContext*)*, %struct.AVCodecTag*, i32* } + %struct.AVCodecContext = type { %struct.AVClass*, i32, i32, i32, i32, i32, i8*, i32, %struct.AVCodecTag, i32, i32, i32, i32, i32, void (%struct.AVCodecContext*, %struct.AVFrame*, i32*, i32, i32, i32)*, i32, i32, i32, i32, i32, i32, i32, float, float, i32, i32, i32, i32, float, i32, i32, i32, %struct.AVCodec*, i8*, i32, i32, void (%struct.AVCodecContext*, i8*, i32, i32)*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8*, [32 x i8], i32, i32, i32, i32, i32, i32, i32, float, i32, i32 (%struct.AVCodecContext*, %struct.AVFrame*)*, void (%struct.AVCodecContext*, %struct.AVFrame*)*, i32, i32, i32, i32, i8*, i8*, float, float, i32, %struct.RcOverride*, i32, i8*, i32, i32, i32, float, float, float, float, i32, float, float, float, float, float, i32, i32, i32, i32*, i32, i32, i32, i32, %struct.AVCodecTag, %struct.AVFrame*, i32, i32, [4 x i64], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 (%struct.AVCodecContext*, i32*)*, i32, i32, i32, i32, i32, i32, i8*, i32, i32, i32, i32, i32, i32, i16*, i16*, i32, i32, i32, i32, %struct.AVPaletteControl*, i32, i32 (%struct.AVCodecContext*, %struct.AVFrame*)*, i32, i32, i32, i32, i32, i32, i32, i32 (%struct.AVCodecContext*, i32 (%struct.AVCodecContext*, i8*)*, i8**, i32*, i32)*, i8*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, i32, i32, i32, i32, i32, i32, i32, i32, float, i32, i32, i32, i32, i32, i32, float, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64 } + %struct.AVCodecTag = type { i32, i32 } + %struct.AVFrame = type { [4 x i8*], [4 x i32], [4 x i8*], i32, i32, i64, i32, i32, i32, i32, i32, i8*, i32, i8*, [2 x [2 x i16]*], i32*, i8, i8*, [4 x i64], i32, i32, i32, i32, i32, %struct.AVPanScan*, i32, i32, i16*, [2 x i8*] } + %struct.AVOption = type { i8*, i8*, i32, i32, double, double, double, i32, i8* } + %struct.AVPaletteControl = type { i32, [256 x i32] } + %struct.AVPanScan = type { i32, i32, i32, [3 x [2 x i16]] } + %struct.RcOverride = type { i32, i32, i32, float } + +define i32 @smc_decode_frame(%struct.AVCodecContext* %avctx, i8* %data, i32* %data_size, i8* %buf, i32 %buf_size) { +entry: + br i1 false, label %cond_next, label %cond_true + +cond_true: ; preds = %entry + ret i32 -1 + +cond_next: ; preds = %entry + br i1 false, label %bb.outer5.split.split.split.us, label %cond_true194.split + +bb.outer5.split.split.split.us: ; preds = %cond_next + br i1 false, label %cond_next188.us503.us, label %bb.us481 + +bb275.us493.us: ; preds = %cond_next188.us503.us, %cond_next188.us503.us + ret i32 0 + +cond_next188.us503.us: ; preds = %bb.outer5.split.split.split.us + switch i32 0, label %bb1401 [ + i32 0, label %cond_next202.bb215_crit_edge.split + i32 16, label %bb215 + i32 32, label %bb275.us493.us + i32 48, label %bb275.us493.us + i32 64, label %cond_next202.bb417_crit_edge.split + i32 80, label %bb417 + i32 96, label %cond_next202.bb615_crit_edge.split + i32 112, label %bb615 + i32 128, label %cond_next202.bb716_crit_edge.split + i32 144, label %bb716 + i32 160, label %cond_next202.bb882_crit_edge.split + i32 176, label %bb882 + i32 192, label %cond_next202.bb1062_crit_edge.split + i32 208, label %bb1062 + i32 224, label %bb1326.us.outer.outer + ] + +bb.us481: ; preds = %bb.outer5.split.split.split.us + ret i32 0 + +cond_true194.split: ; preds = %cond_next + ret i32 %buf_size + +cond_next202.bb1062_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +cond_next202.bb882_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +cond_next202.bb716_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +cond_next202.bb615_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +cond_next202.bb417_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +cond_next202.bb215_crit_edge.split: ; preds = %cond_next188.us503.us + ret i32 0 + +bb215: ; preds = %cond_next188.us503.us + ret i32 0 + +bb417: ; preds = %cond_next188.us503.us + ret i32 0 + +bb615: ; preds = %cond_next188.us503.us + ret i32 0 + +bb716: ; preds = %cond_next188.us503.us + ret i32 0 + +bb882: ; preds = %cond_next188.us503.us + ret i32 0 + +bb1062: ; preds = %cond_next188.us503.us + ret i32 0 + +bb1326.us: ; preds = %bb1326.us.outer.outer, %bb1347.loopexit.us, %bb1326.us + %pixel_y.162036.us.ph = phi i32 [ %tmp1352.us, %bb1347.loopexit.us ], [ 0, %bb1326.us.outer.outer ], [ %pixel_y.162036.us.ph, %bb1326.us ] ; <i32> [#uses=2] + %stream_ptr.142038.us.ph = phi i32 [ %tmp1339.us, %bb1347.loopexit.us ], [ %stream_ptr.142038.us.ph.ph, %bb1326.us.outer.outer ], [ %stream_ptr.142038.us.ph, %bb1326.us ] ; <i32> [#uses=2] + %pixel_x.232031.us = phi i32 [ %tmp1341.us, %bb1326.us ], [ 0, %bb1326.us.outer.outer ], [ 0, %bb1347.loopexit.us ] ; <i32> [#uses=3] + %block_ptr.222030.us = add i32 0, %pixel_x.232031.us ; <i32> [#uses=1] + %stream_ptr.132032.us = add i32 %pixel_x.232031.us, %stream_ptr.142038.us.ph ; <i32> [#uses=1] + %tmp1341.us = add i32 %pixel_x.232031.us, 1 ; <i32> [#uses=2] + %tmp1344.us = icmp slt i32 %tmp1341.us, 4 ; <i1> [#uses=1] + br i1 %tmp1344.us, label %bb1326.us, label %bb1347.loopexit.us + +bb1347.loopexit.us: ; preds = %bb1326.us + %tmp1339.us = add i32 %stream_ptr.132032.us, 1 ; <i32> [#uses=2] + %tmp1337.us = add i32 %block_ptr.222030.us, 1 ; <i32> [#uses=0] + %tmp1352.us = add i32 %pixel_y.162036.us.ph, 1 ; <i32> [#uses=2] + %tmp1355.us = icmp slt i32 %tmp1352.us, 4 ; <i1> [#uses=1] + br i1 %tmp1355.us, label %bb1326.us, label %bb1358 + +bb1358: ; preds = %bb1347.loopexit.us + br label %bb1326.us.outer.outer + +bb1326.us.outer.outer: ; preds = %bb1358, %cond_next188.us503.us + %stream_ptr.142038.us.ph.ph = phi i32 [ %tmp1339.us, %bb1358 ], [ 0, %cond_next188.us503.us ] ; <i32> [#uses=1] + br label %bb1326.us + +bb1401: ; preds = %cond_next188.us503.us + ret i32 0 +} diff --git a/test/Transforms/IndVarsSimplify/complex-scev.ll b/test/Transforms/IndVarsSimplify/complex-scev.ll new file mode 100644 index 0000000..773d71a2 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/complex-scev.ll @@ -0,0 +1,28 @@ +; 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: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep phi | wc -l | grep 1 + +void %foo() { +entry: + br label %bb6 + +bb6: ; preds = %cond_true, %entry + %j.0 = phi int [ 1, %entry ], [ %tmp5, %cond_true ] ; <int> [#uses=3] + %i.0 = phi int [ 0, %entry ], [ %j.0, %cond_true ] ; <int> [#uses=1] + %tmp7 = call int (...)* %foo2( ) ; <int> [#uses=1] + %tmp = setne int %tmp7, 0 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %return + +cond_true: ; preds = %bb6 + %tmp2 = call int (...)* %bar( int %i.0, int %j.0 ) ; <int> [#uses=0] + %tmp5 = add int %j.0, 1 ; <int> [#uses=1] + br label %bb6 + +return: ; preds = %bb6 + ret void +} + +declare int %bar(...) + +declare int %foo2(...) diff --git a/test/Transforms/IndVarsSimplify/dg.exp b/test/Transforms/IndVarsSimplify/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/IndVarsSimplify/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/IndVarsSimplify/exit_value_tests.llx b/test/Transforms/IndVarsSimplify/exit_value_tests.llx new file mode 100644 index 0000000..4e15fc3 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/exit_value_tests.llx @@ -0,0 +1,103 @@ +; Test that we can evaluate the exit values of various expression types. Since +; these loops all have predictable exit values we can replace the use outside +; of the loop with a closed-form computation, making the loop dead. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | \ +; RUN: llvm-dis | not grep br + +int %polynomial_constant() { + br label %Loop +Loop: + %A1 = phi int [0, %0], [%A2, %Loop] + %B1 = phi int [0, %0], [%B2, %Loop] + %A2 = add int %A1, 1 + %B2 = add int %B1, %A1 + + %C = seteq int %A1, 1000 + br bool %C, label %Out, label %Loop +Out: + ret int %B2 +} + +int %NSquare(int %N) { + br label %Loop +Loop: + %X = phi int [0, %0], [%X2, %Loop] + %X2 = add int %X, 1 + %c = seteq int %X, %N + br bool %c, label %Out, label %Loop +Out: + %Y = mul int %X, %X + ret int %Y +} + +int %NSquareOver2(int %N) { + br label %Loop +Loop: + %X = phi int [0, %0], [%X2, %Loop] + %Y = phi int [15, %0], [%Y2, %Loop] ;; include offset of 15 for yuks + + %Y2 = add int %Y, %X + + %X2 = add int %X, 1 + %c = seteq int %X, %N + br bool %c, label %Out, label %Loop +Out: + ret int %Y2 +} + +int %strength_reduced() { + br label %Loop +Loop: + %A1 = phi int [0, %0], [%A2, %Loop] + %B1 = phi int [0, %0], [%B2, %Loop] + %A2 = add int %A1, 1 + %B2 = add int %B1, %A1 + + %C = seteq int %A1, 1000 + br bool %C, label %Out, label %Loop +Out: + ret int %B2 +} + +int %chrec_equals() { +entry: + br label %no_exit +no_exit: + %i0 = phi int [ 0, %entry ], [ %i1, %no_exit ] + %ISq = mul int %i0, %i0 + %i1 = add int %i0, 1 + %tmp.1 = setne int %ISq, 10000 ; while (I*I != 1000) + br bool %tmp.1, label %no_exit, label %loopexit +loopexit: + ret int %i1 +} + +;; We should recognize B1 as being a recurrence, allowing us to compute the +;; trip count and eliminate the loop. +short %cast_chrec_test() { + br label %Loop +Loop: + %A1 = phi int [0, %0], [%A2, %Loop] + %B1 = cast int %A1 to short + %A2 = add int %A1, 1 + + %C = seteq short %B1, 1000 + br bool %C, label %Out, label %Loop +Out: + ret short %B1 +} + +uint %linear_div_fold() { ;; for (i = 4; i != 68; i += 8) (exit with i/2) +entry: + br label %loop +loop: + %i = phi uint [ 4, %entry ], [ %i.next, %loop ] + %i.next = add uint %i, 8 + %RV = div uint %i, 2 + %c = setne uint %i, 68 + br bool %c, label %loop, label %loopexit +loopexit: + ret uint %RV +} + diff --git a/test/Transforms/IndVarsSimplify/iterationCount_zext_or_trunc.ll b/test/Transforms/IndVarsSimplify/iterationCount_zext_or_trunc.ll new file mode 100644 index 0000000..0331f23 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/iterationCount_zext_or_trunc.ll @@ -0,0 +1,25 @@ +; RUN: llvm-as < %s | opt -indvars -disable-output + +; ModuleID = 'testcase.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" +target triple = "i686-pc-linux-gnu" + +define i32 @testcase(i5 zext %k) { +entry: + br label %bb2 + +bb: ; preds = %bb2 + %tmp1 = add i32 %tmp2, %result ; <i32> [#uses=1] + %indvar_next1 = add i5 %k_0, 1 ; <i5> [#uses=1] + br label %bb2 + +bb2: ; preds = %bb, %entry + %k_0 = phi i5 [ 0, %entry ], [ %indvar_next1, %bb ] ; <i5> [#uses=2] + %result = phi i32 [ 0, %entry ], [ %tmp1, %bb ] ; <i32> [#uses=2] + %tmp2 = zext i5 %k_0 to i32 ; <i32> [#uses=1] + %exitcond = icmp eq i32 %tmp2, 16 ; <i1> [#uses=1] + br i1 %exitcond, label %bb3, label %bb + +bb3: ; preds = %bb2 + ret i32 %result +} diff --git a/test/Transforms/IndVarsSimplify/lftr_simple.llx b/test/Transforms/IndVarsSimplify/lftr_simple.llx new file mode 100644 index 0000000..2265e57 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/lftr_simple.llx @@ -0,0 +1,23 @@ +; LFTR should eliminate the need for the computation of i*i completely. It +; is only used to compute the exit value. +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -dce | llvm-dis | not grep mul + +%A = external global int + +implementation + +int %quadratic_setlt() { ;; for (i = 7; i*i < 1000; ++i) +entry: + br label %loop +loop: + %i = phi int [ 7, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 1 + store int %i, int* %A + + %i2 = mul int %i, %i + %c = setlt int %i2, 1000 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + diff --git a/test/Transforms/IndVarsSimplify/loop_evaluate_1.ll b/test/Transforms/IndVarsSimplify/loop_evaluate_1.ll new file mode 100644 index 0000000..ead9b91 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/loop_evaluate_1.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | llvm-dis | not grep br +; +; Testcase distilled from 256.bzip2 + +int %main() { +entry: + br label %loopentry + +loopentry: ; preds = %entry, %loopentry + %indvar1 = phi uint [ 0, %entry ], [ %indvar.next2, %loopentry ] ; <uint> [#uses=1] + %h.0 = phi int [ %tmp.2, %loopentry ], [ 4, %entry ] ; <int> [#uses=1] + %tmp.1 = mul int %h.0, 3 ; <int> [#uses=1] + %tmp.2 = add int %tmp.1, 1 ; <int> [#uses=1] + %indvar.next2 = add uint %indvar1, 1 ; <uint> [#uses=2] + %exitcond3 = setne uint %indvar.next2, 4 ; <bool> [#uses=1] + br bool %exitcond3, label %loopentry, label %loopexit + +loopexit: ; preds = %loopentry + ret int %tmp.2 +} + diff --git a/test/Transforms/IndVarsSimplify/loop_evaluate_2.ll b/test/Transforms/IndVarsSimplify/loop_evaluate_2.ll new file mode 100644 index 0000000..c742691 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/loop_evaluate_2.ll @@ -0,0 +1,28 @@ +; RUN: llvm-as < %s | opt -indvars -adce -simplifycfg | llvm-dis | grep select +; RUN: llvm-as < %s | opt -indvars -adce -simplifycfg | llvm-dis | not grep br +; PR1179 + +define i32 @ltst(i32 %x) { +entry: + icmp sgt i32 %x, 0 ; <i1>:0 [#uses=1] + br i1 %0, label %bb.preheader, label %bb8 + +bb.preheader: ; preds = %entry + br label %bb + +bb: ; preds = %bb, %bb.preheader + %i.01.0 = phi i32 [ %tmp4, %bb ], [ 0, %bb.preheader ] ; <i32> [#uses=1] + %j.03.0 = phi i32 [ %tmp2, %bb ], [ 0, %bb.preheader ] ; <i32> [#uses=1] + %tmp4 = add i32 %i.01.0, 1 ; <i32> [#uses=2] + %tmp2 = add i32 %j.03.0, 1 ; <i32> [#uses=2] + icmp slt i32 %tmp4, %x ; <i1>:1 [#uses=1] + br i1 %1, label %bb, label %bb8.loopexit + +bb8.loopexit: ; preds = %bb + br label %bb8 + +bb8: ; preds = %bb8.loopexit, %entry + %j.03.1 = phi i32 [ 0, %entry ], [ %tmp2, %bb8.loopexit ] ; <i32> [#uses=1] + ret i32 %j.03.1 +} + diff --git a/test/Transforms/IndVarsSimplify/loop_evaluate_3.ll b/test/Transforms/IndVarsSimplify/loop_evaluate_3.ll new file mode 100644 index 0000000..2a2f69d --- /dev/null +++ b/test/Transforms/IndVarsSimplify/loop_evaluate_3.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep {ret i32 600000} +; PR1179 + +define i32 @foo() { +entry: + br label %bb5 + +bb5: ; preds = %bb5, %entry + %i.01.0 = phi i32 [ 0, %entry ], [ %tmp2, %bb5 ] ; <i32> [#uses=1] + %x.03.0 = phi i32 [ 0, %entry ], [ %tmp4, %bb5 ] ; <i32> [#uses=1] + %tmp2 = add i32 %i.01.0, 3 ; <i32> [#uses=2] + %tmp4 = add i32 %x.03.0, 1 ; <i32> [#uses=2] + icmp slt i32 %tmp4, 200000 ; <i1>:0 [#uses=1] + br i1 %0, label %bb5, label %bb7 + +bb7: ; preds = %bb5 + ret i32 %tmp2 +} + diff --git a/test/Transforms/IndVarsSimplify/loop_evaluate_4.ll b/test/Transforms/IndVarsSimplify/loop_evaluate_4.ll new file mode 100644 index 0000000..6c6a362 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/loop_evaluate_4.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep {ret i32 9900} +; PR1179 + +define i32 @test4() { +entry: + br label %bb7 + +bb7: ; preds = %bb7, %entry + %v.01.0 = phi i32 [ 0, %entry ], [ %tmp4, %bb7 ] ; <i32> [#uses=1] + %i.03.0 = phi i32 [ 0, %entry ], [ %tmp6, %bb7 ] ; <i32> [#uses=2] + %tmp2 = shl i32 %i.03.0, 1 ; <i32> [#uses=1] + %tmp4 = add i32 %tmp2, %v.01.0 ; <i32> [#uses=2] + %tmp6 = add i32 %i.03.0, 1 ; <i32> [#uses=2] + icmp slt i32 %tmp6, 100 ; <i1>:0 [#uses=1] + br i1 %0, label %bb7, label %bb9 + +bb9: ; preds = %bb7 + ret i32 %tmp4 +} + diff --git a/test/Transforms/IndVarsSimplify/pointer-indvars.ll b/test/Transforms/IndVarsSimplify/pointer-indvars.ll new file mode 100644 index 0000000..57f7d24 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/pointer-indvars.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep indvar + +%G = global int* null + +%Array = external global [40 x int] + +void %test() { + br label %Loop +Loop: + %X = phi int* [getelementptr ([40 x int]* %Array, long 0, long 0), %0], [%X.next, %Loop] + %X.next = getelementptr int* %X, long 1 + store int* %X, int** %G + br label %Loop +} diff --git a/test/Transforms/IndVarsSimplify/subtract.ll b/test/Transforms/IndVarsSimplify/subtract.ll new file mode 100644 index 0000000..9cff198 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/subtract.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep indvar + +%G = global long 0 + +void %test(long %V) { + br label %Loop +Loop: + %X = phi long [1, %0], [%X.next, %Loop] + %X.next = sub long %X, %V + store long %X, long* %G + br label %Loop +} diff --git a/test/Transforms/IndVarsSimplify/tripcount_compute.llx b/test/Transforms/IndVarsSimplify/tripcount_compute.llx new file mode 100644 index 0000000..733fa1d --- /dev/null +++ b/test/Transforms/IndVarsSimplify/tripcount_compute.llx @@ -0,0 +1,90 @@ +; These tests ensure that we can compute the trip count of various forms of +; loops. If the trip count of the loop is computable, then we will know what +; the exit value of the loop will be for some value, allowing us to substitute +; it directly into users outside of the loop, making the loop dead. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | llvm-dis | not grep br + +int %linear_setne() { ;; for (i = 0; i != 100; ++i) +entry: + br label %loop +loop: + %i = phi int [ 0, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 1 + %c = setne int %i, 100 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + +int %linear_setne_2() { ;; for (i = 0; i != 100; i += 2) +entry: + br label %loop +loop: + %i = phi int [ 0, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 2 + %c = setne int %i, 100 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + + +int %linear_setne_overflow() { ;; for (i = 1024; i != 0; i += 1024) +entry: + br label %loop +loop: + %i = phi int [ 1024, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 1024 + %c = setne int %i, 0 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + +int %linear_setlt() { ;; for (i = 0; i < 100; ++i) +entry: + br label %loop +loop: + %i = phi int [ 0, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 1 + %c = setlt int %i, 100 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + +int %quadratic_setlt() { ;; for (i = 7; i*i < 1000; i+=3) +entry: + br label %loop +loop: + %i = phi int [ 7, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 3 + %i2 = mul int %i, %i + %c = setlt int %i2, 1000 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + +;; Chained loop test - The exit value of the second loop depends on the exit +;; value of the first being computed. +int %chained() { +entry: + br label %loop +loop: ;; for (i = 0; i != 100; ++i) + %i = phi int [ 0, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 1 + %c = setne int %i, 100 + br bool %c, label %loop, label %loopexit +loopexit: + br label %loop2 +loop2: ;; for (j = i; j != 200; ++j) + %j = phi int [ %i, %loopexit ], [ %j.next, %loop2 ] + %j.next = add int %j, 1 + %c2 = setne int %j, 200 + br bool %c2, label %loop2, label %loopexit2 +loopexit2: + ret int %j +} + diff --git a/test/Transforms/IndVarsSimplify/tripcount_infinite.llx b/test/Transforms/IndVarsSimplify/tripcount_infinite.llx new file mode 100644 index 0000000..8a7b27c --- /dev/null +++ b/test/Transforms/IndVarsSimplify/tripcount_infinite.llx @@ -0,0 +1,32 @@ +; These tests have an infinite trip count. We obviously shouldn't remove the +; loops! :) +; +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | llvm-dis | grep icmp | wc -l > %t2 +; RUN: llvm-upgrade < %s | llvm-as | llvm-dis | grep icmp | wc -l > %t1 +; RUN: diff %t1 %t2 + +int %infinite_linear() { ;; test for (i = 1; i != 100; i += 2) +entry: + br label %loop +loop: + %i = phi int [ 1, %entry ], [ %i.next, %loop ] + %i.next = add int %i, 2 + %c = setne int %i, 100 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + +int %infinite_quadratic() { ;; test for (i = 1; i*i != 63; ++i) +entry: + br label %loop +loop: + %i = phi int [ 1, %entry ], [ %i.next, %loop ] + %isquare = mul int %i, %i + %i.next = add int %i, 1 + %c = setne int %isquare, 63 + br bool %c, label %loop, label %loopexit +loopexit: + ret int %i +} + diff --git a/test/Transforms/IndVarsSimplify/variable-stride-ivs.ll b/test/Transforms/IndVarsSimplify/variable-stride-ivs.ll new file mode 100644 index 0000000..e112757 --- /dev/null +++ b/test/Transforms/IndVarsSimplify/variable-stride-ivs.ll @@ -0,0 +1,43 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -instcombine | llvm-dis | \ +; RUN: grep {store i32 0} +; END. +; 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 +; cycles, allowing the tmp.21 subtraction to be eliminated. + +void %vnum_test8(int* %data) { +entry: + %tmp.1 = getelementptr int* %data, int 3 ; <int*> [#uses=1] + %tmp.2 = load int* %tmp.1 ; <int> [#uses=2] + %tmp.4 = getelementptr int* %data, int 4 ; <int*> [#uses=1] + %tmp.5 = load int* %tmp.4 ; <int> [#uses=2] + %tmp.8 = getelementptr int* %data, int 2 ; <int*> [#uses=1] + %tmp.9 = load int* %tmp.8 ; <int> [#uses=3] + %tmp.125 = setgt int %tmp.2, 0 ; <bool> [#uses=1] + br bool %tmp.125, label %no_exit.preheader, label %return + +no_exit.preheader: ; preds = %entry + %tmp.16 = getelementptr int* %data, int %tmp.9 ; <int*> [#uses=1] + br label %no_exit + +no_exit: ; preds = %no_exit, %no_exit.preheader + %iv.ui = phi uint [ 0, %no_exit.preheader ], [ %iv..inc.ui, %no_exit ] ; <uint> [#uses=1] + %iv. = phi int [ %tmp.5, %no_exit.preheader ], [ %iv..inc, %no_exit ] ; <int> [#uses=2] + %m.0.0 = phi int [ %tmp.5, %no_exit.preheader ], [ %tmp.24, %no_exit ] ; <int> [#uses=2] + store int 2, int* %tmp.16 + %tmp.21 = sub int %m.0.0, %iv. ; <int> [#uses=1] + store int %tmp.21, int* %data + %tmp.24 = add int %m.0.0, %tmp.9 ; <int> [#uses=1] + %iv..inc = add int %tmp.9, %iv. ; <int> [#uses=1] + %iv..inc.ui = add uint %iv.ui, 1 ; <uint> [#uses=2] + %iv..inc1 = cast uint %iv..inc.ui to int ; <int> [#uses=1] + %tmp.12 = setlt int %iv..inc1, %tmp.2 ; <bool> [#uses=1] + br bool %tmp.12, label %no_exit, label %return.loopexit + +return.loopexit: ; preds = %no_exit + br label %return + +return: ; preds = %return.loopexit, %entry + ret void +} + diff --git a/test/Transforms/Inline/2003-09-14-InlineValue.ll b/test/Transforms/Inline/2003-09-14-InlineValue.ll new file mode 100644 index 0000000..48d5633 --- /dev/null +++ b/test/Transforms/Inline/2003-09-14-InlineValue.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +declare int %External() + +implementation + +internal int %Callee() { + %I = call int %External() + %J = add int %I, %I + ret int %J +} + +int %Caller() { + %V = invoke int %Callee() to label %Ok except label %Bad +Ok: + ret int %V +Bad: + ret int 0 +} + diff --git a/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll b/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll new file mode 100644 index 0000000..6e4d1b3 --- /dev/null +++ b/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output +implementation + +int %main() { +entry: + invoke void %__main( ) + to label %LongJmpBlkPre except label %LongJmpBlkPre + +LongJmpBlkPre: + %i.3 = phi uint [ 0, %entry ], [ 0, %entry] + ret int 0 +} + +void %__main() { + ret void +} + diff --git a/test/Transforms/Inline/2003-09-22-PHINodesInExceptionDest.ll b/test/Transforms/Inline/2003-09-22-PHINodesInExceptionDest.ll new file mode 100644 index 0000000..e73199c --- /dev/null +++ b/test/Transforms/Inline/2003-09-22-PHINodesInExceptionDest.ll @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +implementation + +int %main() { +entry: + invoke void %__main( ) + to label %Call2Invoke except label %LongJmpBlkPre + +Call2Invoke: + br label %LongJmpBlkPre + +LongJmpBlkPre: + %i.3 = phi uint [ 0, %entry ], [ 0, %Call2Invoke ] ; <uint> [#uses=0] + ret int 0 +} + +void %__main() { + call void %__llvm_getGlobalCtors( ) + call void %__llvm_getGlobalDtors( ) + ret void +} + +declare void %__llvm_getGlobalCtors() + +declare void %__llvm_getGlobalDtors() diff --git a/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll b/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll new file mode 100644 index 0000000..774639b --- /dev/null +++ b/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output +implementation + +int %main() { +entry: + invoke void %__main( ) + to label %else except label %RethrowExcept + +else: + %i.2 = phi int [ 36, %entry ], [ %i.2, %LJDecisionBB ] + br label %LJDecisionBB + +LJDecisionBB: + br label %else + +RethrowExcept: + ret int 0 +} + +void %__main() { + ret void +} + + diff --git a/test/Transforms/Inline/2003-10-13-AllocaDominanceProblem.ll b/test/Transforms/Inline/2003-10-13-AllocaDominanceProblem.ll new file mode 100644 index 0000000..ca163ed --- /dev/null +++ b/test/Transforms/Inline/2003-10-13-AllocaDominanceProblem.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +implementation ; Functions: + +int %reload() { +reloadentry: + br label %A +A: + call void %callee( ) + ret int 0 +} + +internal void %callee() { +entry: + %X = alloca sbyte, uint 0 + %Y = cast int 0 to uint + %Z = alloca sbyte, uint %Y + ret void +} diff --git a/test/Transforms/Inline/2003-10-26-InlineInvokeExceptionDestPhi.ll b/test/Transforms/Inline/2003-10-26-InlineInvokeExceptionDestPhi.ll new file mode 100644 index 0000000..785a425 --- /dev/null +++ b/test/Transforms/Inline/2003-10-26-InlineInvokeExceptionDestPhi.ll @@ -0,0 +1,19 @@ +; The inliner is breaking inlining invoke instructions where there is a PHI +; node in the exception destination, and the inlined function contains an +; unwind instruction. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +implementation + +linkonce void %foo() { + unwind +} + +int %test() { +BB1: + invoke void %foo() to label %Cont except label %Cont +Cont: + %A = phi int [ 0, %BB1], [0, %BB1] + ret int %A +} diff --git a/test/Transforms/Inline/2004-04-15-InlineDeletesCall.ll b/test/Transforms/Inline/2004-04-15-InlineDeletesCall.ll new file mode 100644 index 0000000..e1ecaed --- /dev/null +++ b/test/Transforms/Inline/2004-04-15-InlineDeletesCall.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +; Inlining the first call caused the inliner function to delete the second +; call. Then the inliner tries to inline the second call, which no longer +; exists. + +implementation + +internal void %Callee1() { + unwind +} + +void %Callee2() { + ret void +} + +void %caller() { + call void %Callee1() + call void %Callee2() + ret void +} diff --git a/test/Transforms/Inline/2004-04-20-InlineLinkOnce.llx b/test/Transforms/Inline/2004-04-20-InlineLinkOnce.llx new file mode 100644 index 0000000..4fab1c9 --- /dev/null +++ b/test/Transforms/Inline/2004-04-20-InlineLinkOnce.llx @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -prune-eh -disable-output + +implementation + +linkonce void %caller() { + call void %callee() + ret void +} + +linkonce void %callee() { + ret void +} diff --git a/test/Transforms/Inline/2004-10-17-InlineFunctionWithoutReturn.ll b/test/Transforms/Inline/2004-10-17-InlineFunctionWithoutReturn.ll new file mode 100644 index 0000000..016fc5a --- /dev/null +++ b/test/Transforms/Inline/2004-10-17-InlineFunctionWithoutReturn.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output + +int %test() { + unwind +} + +int %caller() { + %X = call int %test() + ret int %X +} diff --git a/test/Transforms/Inline/2006-01-14-CallGraphUpdate.ll b/test/Transforms/Inline/2006-01-14-CallGraphUpdate.ll new file mode 100644 index 0000000..cb92411 --- /dev/null +++ b/test/Transforms/Inline/2006-01-14-CallGraphUpdate.ll @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -prune-eh -disable-output + + "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>" = type { "struct.std::locale::facet" } + "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >" = type { int (...)**, int*, int*, int*, int*, int*, int*, "struct.std::locale" } + "struct.std::ios_base" = type { int (...)**, int, int, uint, uint, uint, "struct.std::ios_base::_Callback_list"*, "struct.std::ios_base::_Words", [8 x "struct.std::ios_base::_Words"], int, "struct.std::ios_base::_Words"*, "struct.std::locale" } + "struct.std::ios_base::_Callback_list" = type { "struct.std::ios_base::_Callback_list"*, void (uint, "struct.std::ios_base"*, int)*, int, int } + "struct.std::ios_base::_Words" = type { sbyte*, int } + "struct.std::locale" = type { "struct.std::locale::_Impl"* } + "struct.std::locale::_Impl" = type { int, "struct.std::locale::facet"**, uint, "struct.std::locale::facet"**, sbyte** } + "struct.std::locale::facet" = type { int (...)**, int } + "struct.std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >"*, int } + +implementation ; Functions: + +void %_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl("struct.std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t> >"* %agg.result, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"* %this, "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >"* %__s.0__, int %__s.1__, "struct.std::ios_base"* %__io, int %__fill, int %__v) { +entry: + tail call fastcc void %_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_( ) + ret void +} + +fastcc void %_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_() { +entry: + %tmp.38 = shl uint 0, ubyte 3 ; <uint> [#uses=1] + %tmp.39 = alloca sbyte, uint %tmp.38 ; <sbyte*> [#uses=0] + ret void +} diff --git a/test/Transforms/Inline/2006-07-12-InlinePruneCGUpdate.ll b/test/Transforms/Inline/2006-07-12-InlinePruneCGUpdate.ll new file mode 100644 index 0000000..8429e7c --- /dev/null +++ b/test/Transforms/Inline/2006-07-12-InlinePruneCGUpdate.ll @@ -0,0 +1,843 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -prune-eh -disable-output +; PR827 + +%_ZTV8CRjii = internal global [1 x int (...)*] [ int (...)* %_ZN8CRjii12NlFeeEPN5Jr7sE ] ; <[1 x int (...)*]*> [#uses=0] + +implementation ; Functions: + +internal int %_ZN8CRjii12NlFeeEPN5Jr7sE(...) { +entry: + br bool false, label %cond_true, label %cond_false179 + +cond_true: ; preds = %entry + br label %bb9 + +bb: ; preds = %cond_true14 + br label %bb9 + +bb9: ; preds = %bb, %cond_true + br bool false, label %cond_true14, label %cond_false + +cond_true14: ; preds = %bb9 + br label %bb + +cond_false: ; preds = %bb9 + br label %bb15 + +cond_next: ; No predecessors! + br label %bb15 + +bb15: ; preds = %cond_next, %cond_false + br label %bb24 + +bb17: ; preds = %cond_true29 + br label %bb24 + +bb24: ; preds = %bb17, %bb15 + br bool false, label %cond_true29, label %cond_false30 + +cond_true29: ; preds = %bb24 + br label %bb17 + +cond_false30: ; preds = %bb24 + br label %bb32 + +cond_next31: ; No predecessors! + br label %bb32 + +bb32: ; preds = %cond_next31, %cond_false30 + br label %bb41 + +bb34: ; preds = %cond_true46 + br label %bb41 + +bb41: ; preds = %bb34, %bb32 + br bool false, label %cond_true46, label %cond_false47 + +cond_true46: ; preds = %bb41 + br label %bb34 + +cond_false47: ; preds = %bb41 + br label %bb49 + +cond_next48: ; No predecessors! + br label %bb49 + +bb49: ; preds = %cond_next48, %cond_false47 + br label %bb58 + +bb51: ; preds = %cond_true63 + br label %bb58 + +bb58: ; preds = %bb51, %bb49 + br bool false, label %cond_true63, label %cond_false64 + +cond_true63: ; preds = %bb58 + br label %bb51 + +cond_false64: ; preds = %bb58 + br label %bb66 + +cond_next65: ; No predecessors! + br label %bb66 + +bb66: ; preds = %cond_next65, %cond_false64 + br label %bb76 + +bb68: ; preds = %cond_true81 + br label %bb76 + +bb76: ; preds = %bb68, %bb66 + br bool false, label %cond_true81, label %cond_false82 + +cond_true81: ; preds = %bb76 + br label %bb68 + +cond_false82: ; preds = %bb76 + br label %bb84 + +cond_next83: ; No predecessors! + br label %bb84 + +bb84: ; preds = %cond_next83, %cond_false82 + br label %bb94 + +bb86: ; preds = %cond_true99 + br label %bb94 + +bb94: ; preds = %bb86, %bb84 + br bool false, label %cond_true99, label %cond_false100 + +cond_true99: ; preds = %bb94 + br label %bb86 + +cond_false100: ; preds = %bb94 + br label %bb102 + +cond_next101: ; No predecessors! + br label %bb102 + +bb102: ; preds = %cond_next101, %cond_false100 + br label %bb112 + +bb104: ; preds = %cond_true117 + br label %bb112 + +bb112: ; preds = %bb104, %bb102 + br bool false, label %cond_true117, label %cond_false118 + +cond_true117: ; preds = %bb112 + br label %bb104 + +cond_false118: ; preds = %bb112 + br label %bb120 + +cond_next119: ; No predecessors! + br label %bb120 + +bb120: ; preds = %cond_next119, %cond_false118 + br label %bb130 + +bb122: ; preds = %cond_true135 + br label %bb130 + +bb130: ; preds = %bb122, %bb120 + br bool false, label %cond_true135, label %cond_false136 + +cond_true135: ; preds = %bb130 + br label %bb122 + +cond_false136: ; preds = %bb130 + br label %bb138 + +cond_next137: ; No predecessors! + br label %bb138 + +bb138: ; preds = %cond_next137, %cond_false136 + br label %bb148 + +bb140: ; preds = %cond_true153 + call fastcc void %_Zjrf1( ) + br label %bb148 + +bb148: ; preds = %bb140, %bb138 + br bool false, label %cond_true153, label %cond_false154 + +cond_true153: ; preds = %bb148 + br label %bb140 + +cond_false154: ; preds = %bb148 + br label %bb156 + +cond_next155: ; No predecessors! + br label %bb156 + +bb156: ; preds = %cond_next155, %cond_false154 + br label %bb166 + +bb158: ; preds = %cond_true171 + br label %bb166 + +bb166: ; preds = %bb158, %bb156 + br bool false, label %cond_true171, label %cond_false172 + +cond_true171: ; preds = %bb166 + br label %bb158 + +cond_false172: ; preds = %bb166 + br label %bb174 + +cond_next173: ; No predecessors! + br label %bb174 + +bb174: ; preds = %cond_next173, %cond_false172 + br label %cleanup + +cleanup: ; preds = %bb174 + br label %finally + +finally: ; preds = %cleanup + br label %cond_next180 + +cond_false179: ; preds = %entry + br label %cond_next180 + +cond_next180: ; preds = %cond_false179, %finally + br label %return + +return: ; preds = %cond_next180 + ret int 0 +} + +internal fastcc void %_Zjrf2() { +entry: + br label %bb3 + +bb: ; preds = %cond_true + br label %bb3 + +bb3: ; preds = %bb, %entry + %tmp5 = load ubyte** null ; <ubyte*> [#uses=1] + %tmp = setne ubyte* null, %tmp5 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_false + +cond_true: ; preds = %bb3 + br label %bb + +cond_false: ; preds = %bb3 + br label %bb6 + +cond_next: ; No predecessors! + br label %bb6 + +bb6: ; preds = %cond_next, %cond_false + br label %return + +return: ; preds = %bb6 + ret void +} + +internal fastcc void %_Zjrf3() { +entry: + call fastcc void %_Zjrf2( ) + br label %return + +return: ; preds = %entry + ret void +} + +internal fastcc void %_Zjrf4() { +entry: + br label %bb6 + +bb: ; preds = %cond_true + br label %bb6 + +bb6: ; preds = %bb, %entry + br bool false, label %cond_true, label %cond_false + +cond_true: ; preds = %bb6 + br label %bb + +cond_false: ; preds = %bb6 + br label %bb8 + +cond_next: ; No predecessors! + br label %bb8 + +bb8: ; preds = %cond_next, %cond_false + br bool false, label %cond_true9, label %cond_false12 + +cond_true9: ; preds = %bb8 + call fastcc void %_Zjrf3( ) + br label %cond_next13 + +cond_false12: ; preds = %bb8 + br label %cond_next13 + +cond_next13: ; preds = %cond_false12, %cond_true9 + br label %return + +return: ; preds = %cond_next13 + ret void +} + +internal fastcc void %_Zjrf5() { +entry: + call fastcc void %_Zjrf4( ) + br label %return + +return: ; preds = %entry + ret void +} + +internal fastcc void %_Zjrf6() { +entry: + call fastcc void %_Zjrf5( ) + br label %return + +return: ; preds = %entry + ret void +} + +internal fastcc void %_Zjrf7() { +entry: + br label %cleanup + +cleanup: ; preds = %entry + br label %finally + +finally: ; preds = %cleanup + call fastcc void %_Zjrf6( ) + br label %cleanup9 + +cleanup9: ; preds = %finally + br label %finally8 + +finally8: ; preds = %cleanup9 + br label %cleanup11 + +cleanup11: ; preds = %finally8 + br label %finally10 + +finally10: ; preds = %cleanup11 + br label %finally23 + +finally23: ; preds = %finally10 + br label %return + +return: ; preds = %finally23 + ret void +} + +internal fastcc void %_Zjrf11() { +entry: + br label %bb7 + +bb: ; preds = %cond_true + br label %bb7 + +bb7: ; preds = %bb, %entry + br bool false, label %cond_true, label %cond_false + +cond_true: ; preds = %bb7 + br label %bb + +cond_false: ; preds = %bb7 + br label %bb9 + +cond_next: ; No predecessors! + br label %bb9 + +bb9: ; preds = %cond_next, %cond_false + br label %return + ; No predecessors! + br bool false, label %cond_true12, label %cond_false15 + +cond_true12: ; preds = %0 + call fastcc void %_Zjrf3( ) + br label %cond_next16 + +cond_false15: ; preds = %0 + br label %cond_next16 + +cond_next16: ; preds = %cond_false15, %cond_true12 + br label %return + +return: ; preds = %cond_next16, %bb9 + ret void +} + +internal fastcc void %_Zjrf9() { +entry: + call fastcc void %_Zjrf11( ) + br label %return + +return: ; preds = %entry + ret void +} + +internal fastcc void %_Zjrf10() { +entry: + call fastcc void %_Zjrf9( ) + br label %return + +return: ; preds = %entry + ret void +} + +internal fastcc void %_Zjrf8() { +entry: + br bool false, label %cond_true, label %cond_false201 + +cond_true: ; preds = %entry + br bool false, label %cond_true36, label %cond_false + +cond_true36: ; preds = %cond_true + br label %cleanup + +cleanup: ; preds = %cond_true36 + br label %finally + +finally: ; preds = %cleanup + br label %cond_next189 + +cond_false: ; preds = %cond_true + br bool false, label %cond_true99, label %cond_false137 + +cond_true99: ; preds = %cond_false + br label %cleanup136 + +cleanup136: ; preds = %cond_true99 + br label %finally135 + +finally135: ; preds = %cleanup136 + br label %cond_next + +cond_false137: ; preds = %cond_false + call fastcc void %_Zjrf10( ) + br label %cleanup188 + +cleanup188: ; preds = %cond_false137 + br label %finally187 + +finally187: ; preds = %cleanup188 + br label %cond_next + +cond_next: ; preds = %finally187, %finally135 + br label %cond_next189 + +cond_next189: ; preds = %cond_next, %finally + br label %cond_next202 + +cond_false201: ; preds = %entry + br label %cond_next202 + +cond_next202: ; preds = %cond_false201, %cond_next189 + br label %return + +return: ; preds = %cond_next202 + ret void +} + +internal fastcc void %_Zjrf1() { +entry: + br label %bb492 + +bb: ; preds = %cond_true499 + br label %cleanup + +cleanup: ; preds = %bb + br label %finally + +finally: ; preds = %cleanup + br label %cleanup11 + +cleanup11: ; preds = %finally + br label %finally10 + +finally10: ; preds = %cleanup11 + br bool false, label %cond_true, label %cond_false286 + +cond_true: ; preds = %finally10 + br label %cleanup26 + +cleanup26: ; preds = %cond_true + br label %finally25 + +finally25: ; preds = %cleanup26 + br label %bb30 + +bb27: ; preds = %cond_true37 + br label %bb30 + +bb30: ; preds = %bb27, %finally25 + br bool false, label %cond_true37, label %cond_false + +cond_true37: ; preds = %bb30 + br label %bb27 + +cond_false: ; preds = %bb30 + br label %bb38 + +cond_next: ; No predecessors! + br label %bb38 + +bb38: ; preds = %cond_next, %cond_false + br label %bb148 + +bb40: ; preds = %cond_true156 + br label %bb139 + +bb41: ; preds = %cond_true142 + call fastcc void %_Zjrf7( ) + br label %bb105 + +bb44: ; preds = %cond_true112 + br label %bb74 + +bb66: ; preds = %cond_true80 + br label %bb74 + +bb74: ; preds = %bb66, %bb44 + br bool false, label %cond_true80, label %cond_false81 + +cond_true80: ; preds = %bb74 + br label %bb66 + +cond_false81: ; preds = %bb74 + br label %bb83 + +cond_next82: ; No predecessors! + br label %bb83 + +bb83: ; preds = %cond_next82, %cond_false81 + br label %cleanup97 + +cleanup97: ; preds = %bb83 + br label %finally96 + +finally96: ; preds = %cleanup97 + br label %cleanup99 + +cleanup99: ; preds = %finally96 + br label %finally98 + +finally98: ; preds = %cleanup99 + br label %bb105 + +bb105: ; preds = %finally98, %bb41 + br bool false, label %cond_true112, label %cond_false113 + +cond_true112: ; preds = %bb105 + br label %bb44 + +cond_false113: ; preds = %bb105 + br label %bb115 + +cond_next114: ; No predecessors! + br label %bb115 + +bb115: ; preds = %cond_next114, %cond_false113 + br bool false, label %cond_true119, label %cond_false123 + +cond_true119: ; preds = %bb115 + call fastcc void %_Zjrf8( ) + br label %cond_next124 + +cond_false123: ; preds = %bb115 + br label %cond_next124 + +cond_next124: ; preds = %cond_false123, %cond_true119 + br bool false, label %cond_true131, label %cond_false132 + +cond_true131: ; preds = %cond_next124 + br label %cleanup135 + +cond_false132: ; preds = %cond_next124 + br label %cond_next133 + +cond_next133: ; preds = %cond_false132 + br label %cleanup136 + +cleanup135: ; preds = %cond_true131 + br label %done + +cleanup136: ; preds = %cond_next133 + br label %finally134 + +finally134: ; preds = %cleanup136 + br label %bb139 + +bb139: ; preds = %finally134, %bb40 + br bool false, label %cond_true142, label %cond_false143 + +cond_true142: ; preds = %bb139 + br label %bb41 + +cond_false143: ; preds = %bb139 + br label %bb145 + +cond_next144: ; No predecessors! + br label %bb145 + +bb145: ; preds = %cond_next144, %cond_false143 + br label %bb148 + +bb148: ; preds = %bb145, %bb38 + br bool false, label %cond_true156, label %cond_false157 + +cond_true156: ; preds = %bb148 + br label %bb40 + +cond_false157: ; preds = %bb148 + br label %bb159 + +cond_next158: ; No predecessors! + br label %bb159 + +bb159: ; preds = %cond_next158, %cond_false157 + br label %done + +done: ; preds = %bb159, %cleanup135 + br label %bb214 + +bb185: ; preds = %cond_true218 + br bool false, label %cond_true193, label %cond_false206 + +cond_true193: ; preds = %bb185 + br label %cond_next211 + +cond_false206: ; preds = %bb185 + br label %cond_next211 + +cond_next211: ; preds = %cond_false206, %cond_true193 + br label %bb214 + +bb214: ; preds = %cond_next211, %done + br bool false, label %cond_true218, label %cond_false219 + +cond_true218: ; preds = %bb214 + br label %bb185 + +cond_false219: ; preds = %bb214 + br label %bb221 + +cond_next220: ; No predecessors! + br label %bb221 + +bb221: ; preds = %cond_next220, %cond_false219 + br bool false, label %cond_true236, label %cond_false245 + +cond_true236: ; preds = %bb221 + br label %cond_next249 + +cond_false245: ; preds = %bb221 + br label %cond_next249 + +cond_next249: ; preds = %cond_false245, %cond_true236 + br bool false, label %cond_true272, label %cond_false277 + +cond_true272: ; preds = %cond_next249 + br label %cond_next278 + +cond_false277: ; preds = %cond_next249 + br label %cond_next278 + +cond_next278: ; preds = %cond_false277, %cond_true272 + br label %cleanup285 + +cleanup285: ; preds = %cond_next278 + br label %finally284 + +finally284: ; preds = %cleanup285 + br label %cond_next287 + +cond_false286: ; preds = %finally10 + br label %cond_next287 + +cond_next287: ; preds = %cond_false286, %finally284 + br bool false, label %cond_true317, label %cond_false319 + +cond_true317: ; preds = %cond_next287 + br label %cond_next321 + +cond_false319: ; preds = %cond_next287 + br label %cond_next321 + +cond_next321: ; preds = %cond_false319, %cond_true317 + br label %bb348 + +bb335: ; preds = %cond_true355 + br label %bb348 + +bb348: ; preds = %bb335, %cond_next321 + br bool false, label %cond_true355, label %cond_false356 + +cond_true355: ; preds = %bb348 + br label %bb335 + +cond_false356: ; preds = %bb348 + br label %bb358 + +cond_next357: ; No predecessors! + br label %bb358 + +bb358: ; preds = %cond_next357, %cond_false356 + br bool false, label %cond_true363, label %cond_false364 + +cond_true363: ; preds = %bb358 + br label %bb388 + +cond_false364: ; preds = %bb358 + br label %cond_next365 + +cond_next365: ; preds = %cond_false364 + br bool false, label %cond_true370, label %cond_false371 + +cond_true370: ; preds = %cond_next365 + br label %bb388 + +cond_false371: ; preds = %cond_next365 + br label %cond_next372 + +cond_next372: ; preds = %cond_false371 + br bool false, label %cond_true385, label %cond_false386 + +cond_true385: ; preds = %cond_next372 + br label %bb388 + +cond_false386: ; preds = %cond_next372 + br label %cond_next387 + +cond_next387: ; preds = %cond_false386 + br label %bb389 + +bb388: ; preds = %cond_true385, %cond_true370, %cond_true363 + br label %bb389 + +bb389: ; preds = %bb388, %cond_next387 + br bool false, label %cond_true392, label %cond_false443 + +cond_true392: ; preds = %bb389 + br label %bb419 + +bb402: ; preds = %cond_true425 + br bool false, label %cond_true406, label %cond_false412 + +cond_true406: ; preds = %bb402 + br label %cond_next416 + +cond_false412: ; preds = %bb402 + br label %cond_next416 + +cond_next416: ; preds = %cond_false412, %cond_true406 + br label %bb419 + +bb419: ; preds = %cond_next416, %cond_true392 + br bool false, label %cond_true425, label %cond_false426 + +cond_true425: ; preds = %bb419 + br label %bb402 + +cond_false426: ; preds = %bb419 + br label %bb428 + +cond_next427: ; No predecessors! + br label %bb428 + +bb428: ; preds = %cond_next427, %cond_false426 + br label %cond_next478 + +cond_false443: ; preds = %bb389 + br label %bb460 + +bb450: ; preds = %cond_true466 + br label %bb460 + +bb460: ; preds = %bb450, %cond_false443 + br bool false, label %cond_true466, label %cond_false467 + +cond_true466: ; preds = %bb460 + br label %bb450 + +cond_false467: ; preds = %bb460 + br label %bb469 + +cond_next468: ; No predecessors! + br label %bb469 + +bb469: ; preds = %cond_next468, %cond_false467 + br label %cond_next478 + +cond_next478: ; preds = %bb469, %bb428 + br label %cleanup485 + +cleanup485: ; preds = %cond_next478 + br label %finally484 + +finally484: ; preds = %cleanup485 + br label %cleanup487 + +cleanup487: ; preds = %finally484 + br label %finally486 + +finally486: ; preds = %cleanup487 + br label %cleanup489 + +cleanup489: ; preds = %finally486 + br label %finally488 + +finally488: ; preds = %cleanup489 + br label %bb492 + +bb492: ; preds = %finally488, %entry + br bool false, label %cond_true499, label %cond_false500 + +cond_true499: ; preds = %bb492 + br label %bb + +cond_false500: ; preds = %bb492 + br label %bb502 + +cond_next501: ; No predecessors! + br label %bb502 + +bb502: ; preds = %cond_next501, %cond_false500 + br label %return + +return: ; preds = %bb502 + ret void +} + +internal fastcc void %_ZSt26__unguarded_insertion_sortIN9__gnu_cxx17__normal_iteratorIPSsSt6vectorISsSaISsEEEEEvT_S7_() { +entry: + br label %bb12 + +bb: ; preds = %cond_true + br label %cleanup + +cleanup: ; preds = %bb + br label %finally + +finally: ; preds = %cleanup + br label %bb12 + +bb12: ; preds = %finally, %entry + br bool false, label %cond_true, label %cond_false + +cond_true: ; preds = %bb12 + br label %bb + +cond_false: ; preds = %bb12 + br label %bb14 + +cond_next: ; No predecessors! + br label %bb14 + +bb14: ; preds = %cond_next, %cond_false + br label %return + +return: ; preds = %bb14 + ret void +} diff --git a/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll b/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll new file mode 100644 index 0000000..705961b --- /dev/null +++ b/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll @@ -0,0 +1,248 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -prune-eh -disable-output +; PR993 +target endian = little +target pointersize = 32 +target triple = "i386-unknown-openbsd3.9" +deplibs = [ "stdc++", "c", "crtend" ] + "struct.__gnu_cxx::__normal_iterator<char*,std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" = type { sbyte* } + "struct.__gnu_cxx::char_producer<char>" = type { int (...)** } + %struct.__sFILE = type { ubyte*, int, int, short, short, %struct.__sbuf, int, sbyte*, int (sbyte*)*, int (sbyte*, sbyte*, int)*, long (sbyte*, long, int)*, int (sbyte*, sbyte*, int)*, %struct.__sbuf, ubyte*, int, [3 x ubyte], [1 x ubyte], %struct.__sbuf, int, long } + %struct.__sbuf = type { ubyte*, int } + "struct.std::__basic_file<char>" = type { %struct.__sFILE*, bool } + "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>" = type { "struct.std::locale::facet" } + "struct.std::bad_alloc" = type { "struct.__gnu_cxx::char_producer<char>" } + "struct.std::basic_filebuf<char,std::char_traits<char> >" = type { "struct.std::basic_streambuf<char,std::char_traits<char> >", int, "struct.std::__basic_file<char>", uint, %union.__mbstate_t, %union.__mbstate_t, sbyte*, uint, bool, bool, bool, bool, sbyte, sbyte*, sbyte*, bool, "struct.std::codecvt<char,char,__mbstate_t>"*, sbyte*, int, sbyte*, sbyte* } + "struct.std::basic_ios<char,std::char_traits<char> >" = type { "struct.std::ios_base", "struct.std::basic_ostream<char,std::char_traits<char> >"*, sbyte, bool, "struct.std::basic_streambuf<char,std::char_traits<char> >"*, "struct.std::ctype<char>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"* } + "struct.std::basic_iostream<char,std::char_traits<char> >" = type { "struct.std::locale::facet", "struct.__gnu_cxx::char_producer<char>", "struct.std::basic_ios<char,std::char_traits<char> >" } + "struct.std::basic_ofstream<char,std::char_traits<char> >" = type { "struct.__gnu_cxx::char_producer<char>", "struct.std::basic_filebuf<char,std::char_traits<char> >", "struct.std::basic_ios<char,std::char_traits<char> >" } + "struct.std::basic_ostream<char,std::char_traits<char> >" = type { int (...)**, "struct.std::basic_ios<char,std::char_traits<char> >" } + "struct.std::basic_streambuf<char,std::char_traits<char> >" = type { int (...)**, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, "struct.std::locale" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >" = type { "struct.__gnu_cxx::__normal_iterator<char*,std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep" = type { "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep_base" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep_base" = type { uint, uint, int } + "struct.std::codecvt<char,char,__mbstate_t>" = type { "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>", int* } + "struct.std::ctype<char>" = type { "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>", int*, bool, int*, int*, uint* } + "struct.std::domain_error" = type { "struct.std::logic_error" } + "struct.std::ios_base" = type { int (...)**, int, int, uint, uint, uint, "struct.std::ios_base::_Callback_list"*, "struct.std::ios_base::_Words", [8 x "struct.std::ios_base::_Words"], int, "struct.std::ios_base::_Words"*, "struct.std::locale" } + "struct.std::ios_base::_Callback_list" = type { "struct.std::ios_base::_Callback_list"*, void (uint, "struct.std::ios_base"*, int)*, int, int } + "struct.std::ios_base::_Words" = type { sbyte*, int } + "struct.std::locale" = type { "struct.std::locale::_Impl"* } + "struct.std::locale::_Impl" = type { int, "struct.std::locale::facet"**, uint, "struct.std::locale::facet"**, sbyte** } + "struct.std::locale::facet" = type { int (...)**, int } + "struct.std::logic_error" = type { "struct.__gnu_cxx::char_producer<char>", "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >" } + %union.__mbstate_t = type { long, [120 x ubyte] } +%.str_1 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_9 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] + +implementation ; Functions: + +void %main() { +entry: + call fastcc void %_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode( ) + ret void +} + +fastcc void %_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode() { +entry: + %tmp.6 = seteq "struct.std::basic_filebuf<char,std::char_traits<char> >"* null, null ; <bool> [#uses=1] + br bool %tmp.6, label %then, label %UnifiedReturnBlock + +then: ; preds = %entry + tail call fastcc void %_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate( ) + ret void + +UnifiedReturnBlock: ; preds = %entry + ret void +} + +fastcc void %_ZN10__cxxabiv111__terminateEPFvvE() { +entry: + unreachable +} + +void %_ZNSdD0Ev() { +entry: + unreachable +} + +void %_ZThn8_NSdD1Ev() { +entry: + ret void +} + +void %_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev() { +entry: + ret void +} + +void %_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi() { +entry: + unreachable +} + +fastcc void %_ZNSoD2Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate() { +entry: + tail call fastcc void %_ZSt19__throw_ios_failurePKc( ) + ret void +} + +declare fastcc void %_ZNSaIcED1Ev() + +fastcc void %_ZNSsC1EPKcRKSaIcE() { +entry: + tail call fastcc void %_ZNSs16_S_construct_auxIPKcEEPcT_S3_RKSaIcE12__false_type( ) + unreachable +} + +fastcc void %_ZSt14__convert_to_vIyEvPKcRT_RSt12_Ios_IostateRKPii() { +entry: + ret void +} + +fastcc void %_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej() { +entry: + ret void +} + +fastcc void %_ZSt19__throw_ios_failurePKc() { +entry: + call fastcc void %_ZNSsC1EPKcRKSaIcE( ) + unwind +} + +void %_GLOBAL__D__ZSt23lexicographical_compareIPKaS1_EbT_S2_T0_S3_() { +entry: + ret void +} + +void %_ZNSt9bad_allocD1Ev() { +entry: + unreachable +} + +fastcc void %_ZSt19__throw_logic_errorPKc() { +entry: + invoke fastcc void %_ZNSt11logic_errorC1ERKSs( ) + to label %try_exit.0 unwind label %try_catch.0 + +try_catch.0: ; preds = %entry + unreachable + +try_exit.0: ; preds = %entry + unwind +} + +fastcc void %_ZNSt11logic_errorC1ERKSs() { +entry: + call fastcc void %_ZNSsC1ERKSs( ) + ret void +} + +void %_ZNSt12domain_errorD1Ev() { +entry: + unreachable +} + +fastcc void %_ZSt20__throw_length_errorPKc() { +entry: + call fastcc void %_ZNSt12length_errorC1ERKSs( ) + unwind +} + +fastcc void %_ZNSt12length_errorC1ERKSs() { +entry: + invoke fastcc void %_ZNSsC1ERKSs( ) + to label %_ZNSt11logic_errorC2ERKSs.exit unwind label %invoke_catch.i + +invoke_catch.i: ; preds = %entry + unwind + +_ZNSt11logic_errorC2ERKSs.exit: ; preds = %entry + ret void +} + +fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE() { +entry: + call fastcc void %_ZSt20__throw_length_errorPKc( ) + unreachable +} + +fastcc void %_ZNSs12_S_constructIN9__gnu_cxx17__normal_iteratorIPcSsEEEES2_T_S4_RKSaIcESt20forward_iterator_tag() { +entry: + unreachable +} + +fastcc void %_ZNSs16_S_construct_auxIPKcEEPcT_S3_RKSaIcE12__false_type() { +entry: + br bool false, label %then.1.i, label %endif.1.i + +then.1.i: ; preds = %entry + call fastcc void %_ZSt19__throw_logic_errorPKc( ) + br label %endif.1.i + +endif.1.i: ; preds = %then.1.i, %entry + call fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE( ) + unreachable +} + +fastcc void %_ZNSsC1ERKSs() { +entry: + call fastcc void %_ZNSs4_Rep7_M_grabERKSaIcES2_( ) + invoke fastcc void %_ZNSaIcEC1ERKS_( ) + to label %invoke_cont.1 unwind label %invoke_catch.1 + +invoke_catch.1: ; preds = %entry + call fastcc void %_ZNSaIcED1Ev( ) + unwind + +invoke_cont.1: ; preds = %entry + call fastcc void %_ZNSaIcEC2ERKS_( ) + ret void +} + +fastcc void %_ZNSaIcEC1ERKS_() { +entry: + ret void +} + +fastcc void %_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc() { +entry: + ret void +} + +fastcc void %_ZNSs4_Rep7_M_grabERKSaIcES2_() { +entry: + br bool false, label %else.i, label %cond_true + +cond_true: ; preds = %entry + ret void + +else.i: ; preds = %entry + tail call fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE( ) + unreachable +} + +fastcc void %_ZNSaIcEC2ERKS_() { +entry: + ret void +} + +fastcc void %_ZN9__gnu_cxx12__pool_allocILb1ELi0EE8allocateEj() { +entry: + ret void +} + +fastcc void %_ZN9__gnu_cxx12__pool_allocILb1ELi0EE9_S_refillEj() { +entry: + unreachable +} diff --git a/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll b/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll new file mode 100644 index 0000000..1b137cf --- /dev/null +++ b/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll @@ -0,0 +1,342 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -prune-eh -disable-output +; PR992 +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +deplibs = [ "stdc++", "c", "crtend" ] + %struct._IO_FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct._IO_FILE*, int, int, int, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, int, [52 x sbyte] } + %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, int } + "struct.__cxxabiv1::__array_type_info" = type { "struct.std::type_info" } + "struct.__cxxabiv1::__si_class_type_info" = type { "struct.__cxxabiv1::__array_type_info", "struct.__cxxabiv1::__array_type_info"* } + "struct.__gnu_cxx::_Rope_rep_alloc_base<char,std::allocator<char>, true>" = type { uint } + "struct.__gnu_cxx::__normal_iterator<char*,std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" = type { sbyte* } + "struct.__gnu_cxx::__normal_iterator<const wchar_t*,std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >" = type { int* } + "struct.__gnu_cxx::char_producer<char>" = type { int (...)** } + "struct.__gnu_cxx::stdio_sync_filebuf<char,std::char_traits<char> >" = type { "struct.std::basic_streambuf<char,std::char_traits<char> >", %struct._IO_FILE*, int } + "struct.__gnu_cxx::stdio_sync_filebuf<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >", %struct._IO_FILE*, uint } + %struct.__locale_struct = type { [13 x %struct.locale_data*], ushort*, int*, int*, [13 x sbyte*] } + %struct.__mbstate_t = type { int, "struct.__gnu_cxx::_Rope_rep_alloc_base<char,std::allocator<char>, true>" } + %struct.locale_data = type opaque + "struct.std::__basic_file<char>" = type { %struct._IO_FILE*, bool } + "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>" = type { "struct.std::locale::facet" } + "struct.std::basic_filebuf<char,std::char_traits<char> >" = type { "struct.std::basic_streambuf<char,std::char_traits<char> >", int, "struct.std::__basic_file<char>", uint, %struct.__mbstate_t, %struct.__mbstate_t, sbyte*, uint, bool, bool, bool, bool, sbyte, sbyte*, sbyte*, bool, "struct.std::codecvt<char,char,__mbstate_t>"*, sbyte*, int, sbyte*, sbyte* } + "struct.std::basic_filebuf<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >", int, "struct.std::__basic_file<char>", uint, %struct.__mbstate_t, %struct.__mbstate_t, int*, uint, bool, bool, bool, bool, int, int*, int*, bool, "struct.std::codecvt<char,char,__mbstate_t>"*, sbyte*, int, sbyte*, sbyte* } + "struct.std::basic_fstream<char,std::char_traits<char> >" = type { { "struct.std::locale::facet", "struct.__gnu_cxx::char_producer<char>" }, "struct.std::basic_filebuf<char,std::char_traits<char> >", "struct.std::basic_ios<char,std::char_traits<char> >" } + "struct.std::basic_fstream<wchar_t,std::char_traits<wchar_t> >" = type { { "struct.std::locale::facet", "struct.__gnu_cxx::char_producer<char>" }, "struct.std::basic_filebuf<wchar_t,std::char_traits<wchar_t> >", "struct.std::basic_ios<wchar_t,std::char_traits<wchar_t> >" } + "struct.std::basic_ios<char,std::char_traits<char> >" = type { "struct.std::ios_base", "struct.std::basic_ostream<char,std::char_traits<char> >"*, sbyte, bool, "struct.std::basic_streambuf<char,std::char_traits<char> >"*, "struct.std::ctype<char>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"* } + "struct.std::basic_ios<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::ios_base", "struct.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >"*, int, bool, "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >"*, "struct.std::codecvt<char,char,__mbstate_t>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"*, "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>"* } + "struct.std::basic_iostream<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::locale::facet", "struct.__gnu_cxx::char_producer<char>", "struct.std::basic_ios<wchar_t,std::char_traits<wchar_t> >" } + "struct.std::basic_ostream<char,std::char_traits<char> >" = type { int (...)**, "struct.std::basic_ios<char,std::char_traits<char> >" } + "struct.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >" = type { int (...)**, "struct.std::basic_ios<wchar_t,std::char_traits<wchar_t> >" } + "struct.std::basic_streambuf<char,std::char_traits<char> >" = type { int (...)**, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, "struct.std::locale" } + "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >" = type { int (...)**, int*, int*, int*, int*, int*, int*, "struct.std::locale" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >" = type { "struct.__gnu_cxx::__normal_iterator<char*,std::basic_string<char, std::char_traits<char>, std::allocator<char> > >" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep" = type { "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep_base" } + "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep_base" = type { uint, uint, int } + "struct.std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >" = type { "struct.__gnu_cxx::__normal_iterator<const wchar_t*,std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >" } + "struct.std::codecvt<char,char,__mbstate_t>" = type { "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>", %struct.__locale_struct* } + "struct.std::collate<char>" = type { "struct.std::locale::facet", %struct.__locale_struct* } + "struct.std::collate_byname<char>" = type { "struct.std::collate<char>" } + "struct.std::ctype<char>" = type { "struct.std::__codecvt_abstract_base<char,char,__mbstate_t>", %struct.__locale_struct*, bool, int*, int*, ushort* } + "struct.std::ctype_byname<char>" = type { "struct.std::ctype<char>" } + "struct.std::domain_error" = type { "struct.std::logic_error" } + "struct.std::ios_base" = type { int (...)**, int, int, uint, uint, uint, "struct.std::ios_base::_Callback_list"*, "struct.std::ios_base::_Words", [8 x "struct.std::ios_base::_Words"], int, "struct.std::ios_base::_Words"*, "struct.std::locale" } + "struct.std::ios_base::_Callback_list" = type { "struct.std::ios_base::_Callback_list"*, void (uint, "struct.std::ios_base"*, int)*, int, int } + "struct.std::ios_base::_Words" = type { sbyte*, int } + "struct.std::istreambuf_iterator<char,std::char_traits<char> >" = type { "struct.std::basic_streambuf<char,std::char_traits<char> >"*, int } + "struct.std::istreambuf_iterator<wchar_t,std::char_traits<wchar_t> >" = type { "struct.std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >"*, uint } + "struct.std::locale" = type { "struct.std::locale::_Impl"* } + "struct.std::locale::_Impl" = type { int, "struct.std::locale::facet"**, uint, "struct.std::locale::facet"**, sbyte** } + "struct.std::locale::facet" = type { int (...)**, int } + "struct.std::logic_error" = type { "struct.__gnu_cxx::char_producer<char>", "struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >" } + "struct.std::type_info" = type { int (...)**, sbyte* } +%.str_11 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_9 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_1 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] + +implementation ; Functions: + +void %main() { +entry: + tail call fastcc void %_ZNSolsEi( ) + ret void +} + +fastcc void %_ZNSolsEi() { +entry: + %tmp.22 = seteq uint 0, 0 ; <bool> [#uses=1] + br bool %tmp.22, label %else, label %then + +then: ; preds = %entry + ret void + +else: ; preds = %entry + tail call fastcc void %_ZNSolsEl( ) + ret void +} + +void %_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_() { +entry: + ret void +} + +fastcc void %_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate() { +entry: + tail call fastcc void %_ZSt19__throw_ios_failurePKc( ) + ret void +} + +fastcc void %_ZNSo3putEc() { +entry: + ret void +} + +fastcc void %_ZNSolsEl() { +entry: + %tmp.21.i = seteq "struct.std::basic_ostream<char,std::char_traits<char> >"* null, null ; <bool> [#uses=1] + br bool %tmp.21.i, label %endif.0.i, label %shortcirc_next.i + +shortcirc_next.i: ; preds = %entry + ret void + +endif.0.i: ; preds = %entry + call fastcc void %_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate( ) + ret void +} + +fastcc void %_ZSt19__throw_ios_failurePKc() { +entry: + call fastcc void %_ZNSsC1EPKcRKSaIcE( ) + ret void +} + +fastcc void %_ZNSt8ios_baseD2Ev() { +entry: + unreachable +} + +void %_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE5uflowEv() { +entry: + unreachable +} + +void %_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED1Ev() { +entry: + unreachable +} + +void %_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci() { +entry: + ret void +} + +fastcc void %_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale() { +entry: + ret void +} + +declare fastcc void %_ZNSaIcED1Ev() + +fastcc void %_ZSt19__throw_logic_errorPKc() { +entry: + call fastcc void %_ZNSt11logic_errorC1ERKSs( ) + ret void +} + +fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE() { +entry: + br bool false, label %then.0, label %endif.0 + +then.0: ; preds = %entry + call fastcc void %_ZSt20__throw_length_errorPKc( ) + ret void + +endif.0: ; preds = %entry + ret void +} + +fastcc void %_ZSt20__throw_length_errorPKc() { +entry: + call fastcc void %_ZNSt12length_errorC1ERKSs( ) + unwind +} + +fastcc void %_ZNSs16_S_construct_auxIPKcEEPcT_S3_RKSaIcE12__false_type() { +entry: + br bool false, label %then.1.i, label %endif.1.i + +then.1.i: ; preds = %entry + call fastcc void %_ZSt19__throw_logic_errorPKc( ) + ret void + +endif.1.i: ; preds = %entry + call fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE( ) + unreachable +} + +fastcc void %_ZNSsC1ERKSs() { +entry: + call fastcc void %_ZNSs4_Rep7_M_grabERKSaIcES2_( ) + invoke fastcc void %_ZNSaIcEC1ERKS_( ) + to label %invoke_cont.1 unwind label %invoke_catch.1 + +invoke_catch.1: ; preds = %entry + call fastcc void %_ZNSaIcED1Ev( ) + unwind + +invoke_cont.1: ; preds = %entry + call fastcc void %_ZNSaIcEC2ERKS_( ) + ret void +} + +fastcc void %_ZNSs7reserveEj() { +entry: + ret void +} + +fastcc void %_ZNSaIcEC1ERKS_() { +entry: + ret void +} + +fastcc void %_ZNSs4_Rep7_M_grabERKSaIcES2_() { +entry: + br bool false, label %else.i, label %cond_true + +cond_true: ; preds = %entry + ret void + +else.i: ; preds = %entry + tail call fastcc void %_ZNSs4_Rep9_S_createEjRKSaIcE( ) + ret void +} + +fastcc void %_ZNSsC1EPKcRKSaIcE() { +entry: + tail call fastcc void %_ZNSs16_S_construct_auxIPKcEEPcT_S3_RKSaIcE12__false_type( ) + unreachable +} + +fastcc void %_ZNSaIcEC2ERKS_() { +entry: + ret void +} + +void %_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { +entry: + unreachable +} + +void %_ZNSt14collate_bynameIcED1Ev() { +entry: + unreachable +} + +void %_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy() { +entry: + ret void +} + +void %_ZNSt23__codecvt_abstract_baseIcc11__mbstate_tED1Ev() { +entry: + unreachable +} + +void %_ZNSt12ctype_bynameIcED0Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt8messagesIwEC1Ej() { +entry: + ret void +} + +fastcc void %_ZSt14__convert_to_vIlEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi() { +entry: + ret void +} + +fastcc void %_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej() { +entry: + ret void +} + +fastcc void %_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej() { +entry: + ret void +} + +fastcc void %_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs() { +entry: + unreachable +} + +fastcc void %_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_() { +entry: + ret void +} + +void %_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev() { +entry: + unreachable +} + +void %_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv() { +entry: + ret void +} + +void %_ZNSt9exceptionD0Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt11logic_errorC1ERKSs() { +entry: + call fastcc void %_ZNSsC1ERKSs( ) + ret void +} + +fastcc void %_ZNSt11logic_errorD2Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt12length_errorC1ERKSs() { +entry: + invoke fastcc void %_ZNSsC1ERKSs( ) + to label %_ZNSt11logic_errorC2ERKSs.exit unwind label %invoke_catch.i + +invoke_catch.i: ; preds = %entry + unwind + +_ZNSt11logic_errorC2ERKSs.exit: ; preds = %entry + ret void +} + +void %_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_() { +entry: + ret void +} + +fastcc void %_ZNSbIwSt11char_traitsIwESaIwEE16_S_construct_auxIPKwEEPwT_S7_RKS1_12__false_type() { +entry: + ret void +} + +void %_ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev() { +entry: + ret void +} + +void %_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev() { +entry: + unreachable +} + +fastcc void %_ZNSt5ctypeIcEC1EPKtbj() { +entry: + ret void +} diff --git a/test/Transforms/Inline/2007-04-15-InlineEH.ll b/test/Transforms/Inline/2007-04-15-InlineEH.ll new file mode 100644 index 0000000..73b0e21 --- /dev/null +++ b/test/Transforms/Inline/2007-04-15-InlineEH.ll @@ -0,0 +1,49 @@ +; RUN: llvm-as < %s | opt -inline -disable-output +; PR1335 + +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" + %struct.gnat__strings__string_access = type { i8*, %struct.string___XUB* } + %struct.string___XUB = type { i32, i32 } + +define void @bc__support__high_resolution_time__clock() { +entry: + call void asm "rdtsc\0A\09movl %eax, $0\0A\09movl %edx, $1", "=*imr,=*imr,~{dirflag},~{fpsr},~{flags},~{dx},~{ax}"( i32* null, i32* null ) + unreachable +} + +define fastcc void @bc__support__high_resolution_time__initialize_clock_rate() { +entry: + invoke void @gnat__os_lib__getenv( %struct.gnat__strings__string_access* null ) + to label %invcont unwind label %cleanup144 + +invcont: ; preds = %entry + invoke void @ada__calendar__delays__delay_for( ) + to label %invcont64 unwind label %cleanup144 + +invcont64: ; preds = %invcont + invoke void @ada__calendar__clock( ) + to label %invcont65 unwind label %cleanup144 + +invcont65: ; preds = %invcont64 + invoke void @bc__support__high_resolution_time__clock( ) + to label %invcont67 unwind label %cleanup144 + +invcont67: ; preds = %invcont65 + ret void + +cleanup144: ; preds = %invcont65, %invcont64, %invcont, %entry + unwind +} + +declare void @gnat__os_lib__getenv(%struct.gnat__strings__string_access*) + +declare void @ada__calendar__delays__delay_for() + +declare void @ada__calendar__clock() + +define void @bc__support__high_resolution_time___elabb() { +entry: + call fastcc void @bc__support__high_resolution_time__initialize_clock_rate( ) + ret void +} diff --git a/test/Transforms/Inline/2007-06-06-NoInline.ll b/test/Transforms/Inline/2007-06-06-NoInline.ll new file mode 100644 index 0000000..51bba07 --- /dev/null +++ b/test/Transforms/Inline/2007-06-06-NoInline.ll @@ -0,0 +1,46 @@ +; RUN: llvm-as < %s | opt -inline -f - | llvm-dis | grep "define internal i32 @bar" +@llvm.noinline = appending global [1 x i8*] [ i8* bitcast (i32 (i32, i32)* @bar to i8*) ], section "llvm.metadata" ; <[1 x i8*]*> [#uses=0] + +define internal i32 @bar(i32 %x, i32 %y) { +entry: + %x_addr = alloca i32 ; <i32*> [#uses=2] + %y_addr = alloca i32 ; <i32*> [#uses=2] + %retval = alloca i32, align 4 ; <i32*> [#uses=2] + %tmp = alloca i32, align 4 ; <i32*> [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + store i32 %x, i32* %x_addr + store i32 %y, i32* %y_addr + %tmp1 = load i32* %x_addr ; <i32> [#uses=1] + %tmp2 = load i32* %y_addr ; <i32> [#uses=1] + %tmp3 = add i32 %tmp1, %tmp2 ; <i32> [#uses=1] + store i32 %tmp3, i32* %tmp + %tmp4 = load i32* %tmp ; <i32> [#uses=1] + store i32 %tmp4, i32* %retval + br label %return + +return: ; preds = %entry + %retval5 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval5 +} + +define i32 @foo(i32 %a, i32 %b) { +entry: + %a_addr = alloca i32 ; <i32*> [#uses=2] + %b_addr = alloca i32 ; <i32*> [#uses=2] + %retval = alloca i32, align 4 ; <i32*> [#uses=2] + %tmp = alloca i32, align 4 ; <i32*> [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + store i32 %a, i32* %a_addr + store i32 %b, i32* %b_addr + %tmp1 = load i32* %b_addr ; <i32> [#uses=1] + %tmp2 = load i32* %a_addr ; <i32> [#uses=1] + %tmp3 = call i32 @bar( i32 %tmp1, i32 %tmp2 ) ; <i32> [#uses=1] + store i32 %tmp3, i32* %tmp + %tmp4 = load i32* %tmp ; <i32> [#uses=1] + store i32 %tmp4, i32* %retval + br label %return + +return: ; preds = %entry + %retval5 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval5 +} diff --git a/test/Transforms/Inline/2007-06-25-WeakInline.ll b/test/Transforms/Inline/2007-06-25-WeakInline.ll new file mode 100644 index 0000000..3cf758c --- /dev/null +++ b/test/Transforms/Inline/2007-06-25-WeakInline.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | opt -inline | llvm-dis | grep call + +; 'bar' can be overridden at link-time, don't inline it. + +define void @foo() { +entry: + tail call void @bar( ) ; <i32> [#uses=0] + ret void +} + +define weak void @bar() { + ret void +} + diff --git a/test/Transforms/Inline/alloca_test.ll b/test/Transforms/Inline/alloca_test.ll new file mode 100644 index 0000000..35ded4f --- /dev/null +++ b/test/Transforms/Inline/alloca_test.ll @@ -0,0 +1,20 @@ +; This test ensures that alloca instructions in the entry block for an inlined +; function are moved to the top of the function they are inlined into. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | %prcontext alloca 1 | grep Entry: + +int %func(int %i) { + %X = alloca int + store int %i, int* %X + ret int %i +} + +declare void %bar() + +int %main(int %argc) { +Entry: + call void %bar() + %X = call int %func(int 7) + %Y = add int %X, %argc + ret int %Y +} diff --git a/test/Transforms/Inline/basictest.ll b/test/Transforms/Inline/basictest.ll new file mode 100644 index 0000000..30d87b2 --- /dev/null +++ b/test/Transforms/Inline/basictest.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -disable-output -print + +int %func(int %i) { + ret int %i +} + +int %main(int %argc) { + %X = call int %func(int 7) + %Y = add int %X, %argc + ret int %Y +} diff --git a/test/Transforms/Inline/casts.ll b/test/Transforms/Inline/casts.ll new file mode 100644 index 0000000..340b978 --- /dev/null +++ b/test/Transforms/Inline/casts.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | grep {ret i32 1} +; ModuleID = 'short.opt.bc' + +implementation ; Functions: + +int %testBool(bool %X) { + %tmp = zext bool %X to int ; <int> [#uses=1] + ret int %tmp +} + +int %testByte(sbyte %X) { + %tmp = setne sbyte %X, 0 ; <bool> [#uses=1] + %tmp.i = zext bool %tmp to int ; <int> [#uses=1] + ret int %tmp.i +} + +int %main() { + %rslt = call int %testByte( sbyte 123) + ret int %rslt +} diff --git a/test/Transforms/Inline/cfg_preserve_test.ll b/test/Transforms/Inline/cfg_preserve_test.ll new file mode 100644 index 0000000..c444f3a --- /dev/null +++ b/test/Transforms/Inline/cfg_preserve_test.ll @@ -0,0 +1,15 @@ +; This test ensures that inlining an "empty" function does not destroy the CFG +; +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep br + +int %func(int %i) { + ret int %i +} + +declare void %bar() + +int %main(int %argc) { +Entry: + %X = call int %func(int 7) + ret int %X +} diff --git a/test/Transforms/Inline/dg.exp b/test/Transforms/Inline/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/Inline/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/Inline/dynamic_alloca_test.ll b/test/Transforms/Inline/dynamic_alloca_test.ll new file mode 100644 index 0000000..cccf2d9 --- /dev/null +++ b/test/Transforms/Inline/dynamic_alloca_test.ll @@ -0,0 +1,28 @@ +; Test that functions with dynamic allocas get inlined in a case where +; naively inlining it would result in a miscompilation. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: grep llvm.stacksave +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep callee + +declare void %ext(int*) +implementation + +internal void %callee(uint %N) { + %P = alloca int, uint %N ;; dynamic alloca + call void %ext(int* %P) + ret void +} + +void %foo(uint %N) { + br label %Loop +Loop: + %count = phi uint [0, %0], [%next, %Loop] + %next = add uint %count, 1 + call void %callee(uint %N) + %cond = seteq uint %count, 100000 + br bool %cond, label %out, label %Loop +out: + ret void +} + diff --git a/test/Transforms/Inline/inline-tail.ll b/test/Transforms/Inline/inline-tail.ll new file mode 100644 index 0000000..31e036f --- /dev/null +++ b/test/Transforms/Inline/inline-tail.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep tail + +implementation + +declare void %bar(int*) + +internal void %foo(int* %P) { ;; to be inlined + tail call void %bar(int* %P) + ret void +} + +void %caller() { + %A = alloca int + call void %foo(int* %A) ;; not a tail call + ret void +} diff --git a/test/Transforms/Inline/inline_cleanup.ll b/test/Transforms/Inline/inline_cleanup.ll new file mode 100644 index 0000000..2ec67ff --- /dev/null +++ b/test/Transforms/Inline/inline_cleanup.ll @@ -0,0 +1,66 @@ +; Test that the inliner doesn't leave around dead allocas, and that it folds +; uncond branches away after it is done specializing. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: not grep {alloca.*uses=0} +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: not grep {br label} + +%A = weak global int 0 ; <int*> [#uses=1] +%B = weak global int 0 ; <int*> [#uses=1] +%C = weak global int 0 ; <int*> [#uses=1] + +implementation ; Functions: + +internal fastcc void %foo(int %X) { +entry: + %ALL = alloca int, align 4 ; <int*> [#uses=1] + %tmp1 = and int %X, 1 ; <int> [#uses=1] + %tmp1 = seteq int %tmp1, 0 ; <bool> [#uses=1] + br bool %tmp1, label %cond_next, label %cond_true + +cond_true: ; preds = %entry + store int 1, int* %A + br label %cond_next + +cond_next: ; preds = %entry, %cond_true + %tmp4 = and int %X, 2 ; <int> [#uses=1] + %tmp4 = seteq int %tmp4, 0 ; <bool> [#uses=1] + br bool %tmp4, label %cond_next7, label %cond_true5 + +cond_true5: ; preds = %cond_next + store int 1, int* %B + br label %cond_next7 + +cond_next7: ; preds = %cond_next, %cond_true5 + %tmp10 = and int %X, 4 ; <int> [#uses=1] + %tmp10 = seteq int %tmp10, 0 ; <bool> [#uses=1] + br bool %tmp10, label %cond_next13, label %cond_true11 + +cond_true11: ; preds = %cond_next7 + store int 1, int* %C + br label %cond_next13 + +cond_next13: ; preds = %cond_next7, %cond_true11 + %tmp16 = and int %X, 8 ; <int> [#uses=1] + %tmp16 = seteq int %tmp16, 0 ; <bool> [#uses=1] + br bool %tmp16, label %UnifiedReturnBlock, label %cond_true17 + +cond_true17: ; preds = %cond_next13 + call void %ext( int* %ALL ) + ret void + +UnifiedReturnBlock: ; preds = %cond_next13 + ret void +} + +declare void %ext(int*) + +void %test() { +entry: + tail call fastcc void %foo( int 1 ) + tail call fastcc void %foo( int 2 ) + tail call fastcc void %foo( int 3 ) + tail call fastcc void %foo( int 8 ) + ret void +} diff --git a/test/Transforms/Inline/inline_constprop.ll b/test/Transforms/Inline/inline_constprop.ll new file mode 100644 index 0000000..4b183e2 --- /dev/null +++ b/test/Transforms/Inline/inline_constprop.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep callee +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep div + +implementation + +internal int %callee(int %A, int %B) { + %C = div int %A, %B + ret int %C +} + +int %test() { + %X = call int %callee(int 10, int 3) + ret int %X +} diff --git a/test/Transforms/Inline/inline_dce.ll b/test/Transforms/Inline/inline_dce.ll new file mode 100644 index 0000000..5cb118f --- /dev/null +++ b/test/Transforms/Inline/inline_dce.ll @@ -0,0 +1,26 @@ +; This checks to ensure that the inline pass deletes functions if they get +; inlined into all of their callers. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: not grep %reallysmall + +implementation + +internal int %reallysmall(int %A) { + ret int %A +} + +void %caller1() { + call int %reallysmall(int 5) + ret void +} + +void %caller2(int %A) { + call int %reallysmall(int %A) + ret void +} + +int %caller3(int %A) { + %B = call int %reallysmall(int %A) + ret int %B +} diff --git a/test/Transforms/Inline/inline_prune.ll b/test/Transforms/Inline/inline_prune.ll new file mode 100644 index 0000000..85a6343 --- /dev/null +++ b/test/Transforms/Inline/inline_prune.ll @@ -0,0 +1,40 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: not grep {callee\[12\](} +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep mul + +implementation + +internal int %callee1(int %A, int %B) { + %cond = seteq int %A, 123 + br bool %cond, label %T, label %F +T: + %C = mul int %B, %B + ret int %C +F: + ret int 0 +} + +internal int %callee2(int %A, int %B) { + switch int %A, label %T [ + int 10, label %F + int 1234, label %G + ] + %cond = seteq int %A, 123 + br bool %cond, label %T, label %F +T: + %C = mul int %B, %B + ret int %C +F: + ret int 0 +G: + %D = mul int %B, %B + %E = mul int %D, %B + ret int %E +} + +int %test(int %A) { + %X = call int %callee1(int 10, int %A) + %Y = call int %callee2(int 10, int %A) + %Z = add int %X, %Y + ret int %Z +} diff --git a/test/Transforms/Inline/invoke_test-1.ll b/test/Transforms/Inline/invoke_test-1.ll new file mode 100644 index 0000000..9e69018 --- /dev/null +++ b/test/Transforms/Inline/invoke_test-1.ll @@ -0,0 +1,23 @@ +; Test that we can inline a simple function, turning the calls in it into invoke +; instructions + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | \ +; RUN: not grep {call\[^e\]} + +declare void %might_throw() + +implementation + +internal void %callee() { + call void %might_throw() + ret void +} + +; caller returns true if might_throw throws an exception... +int %caller() { + invoke void %callee() to label %cont except label %exc +cont: + ret int 0 +exc: + ret int 1 +} diff --git a/test/Transforms/Inline/invoke_test-2.ll b/test/Transforms/Inline/invoke_test-2.ll new file mode 100644 index 0000000..9262090 --- /dev/null +++ b/test/Transforms/Inline/invoke_test-2.ll @@ -0,0 +1,28 @@ +; Test that if an invoked function is inlined, and if that function cannot +; throw, that the dead handler is now unreachable. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline -simplifycfg | llvm-dis | \ +; RUN: not grep UnreachableExceptionHandler + +declare void %might_throw() + +implementation + +internal int %callee() { + invoke void %might_throw() to label %cont except label %exc +cont: + ret int 0 +exc: + ; This just consumes the exception! + ret int 1 +} + +; caller returns true if might_throw throws an exception... callee cannot throw. +int %caller() { + %X = invoke int %callee() to label %cont + except label %UnreachableExceptionHandler +cont: + ret int %X +UnreachableExceptionHandler: + ret int -1 ; This is dead! +} diff --git a/test/Transforms/Inline/invoke_test-3.ll b/test/Transforms/Inline/invoke_test-3.ll new file mode 100644 index 0000000..b471afe --- /dev/null +++ b/test/Transforms/Inline/invoke_test-3.ll @@ -0,0 +1,28 @@ +; Test that any rethrown exceptions in an inlined function are automatically +; turned into branches to the invoke destination. + +; RUN: llvm-upgrade < %s | llvm-as | opt -inline | llvm-dis | not grep unwind$ + +declare void %might_throw() + +implementation + +internal int %callee() { + invoke void %might_throw() to label %cont except label %exc +cont: + ret int 0 +exc: ; This just rethrows the exception! + unwind +} + +; caller returns true if might_throw throws an exception... which gets +; propagated by callee. +int %caller() { + %X = invoke int %callee() to label %cont + except label %Handler +cont: + ret int %X +Handler: + ; This consumes an exception thrown by might_throw + ret int 1 +} diff --git a/test/Transforms/InstCombine/2002-03-11-InstCombineHang.ll b/test/Transforms/InstCombine/2002-03-11-InstCombineHang.ll new file mode 100644 index 0000000..dd683a3 --- /dev/null +++ b/test/Transforms/InstCombine/2002-03-11-InstCombineHang.ll @@ -0,0 +1,11 @@ +; This testcase causes instcombine to hang. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine + +implementation + +void "test"(int %X) +begin + %reg117 = add int %X, 0 + ret void +end diff --git a/test/Transforms/InstCombine/2002-05-14-SubFailure.ll b/test/Transforms/InstCombine/2002-05-14-SubFailure.ll new file mode 100644 index 0000000..34c2df6 --- /dev/null +++ b/test/Transforms/InstCombine/2002-05-14-SubFailure.ll @@ -0,0 +1,10 @@ +; Instcombine was missing a test that caused it to make illegal transformations +; sometimes. In this case, it transforms the sub into an add: +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep sub +; +define i32 @test(i32 %i, i32 %j) { + %A = mul i32 %i, %j + %B = sub i32 2, %A + ret i32 %B +} + diff --git a/test/Transforms/InstCombine/2002-05-14-TouchDeletedInst.ll b/test/Transforms/InstCombine/2002-05-14-TouchDeletedInst.ll new file mode 100644 index 0000000..5e6d63b --- /dev/null +++ b/test/Transforms/InstCombine/2002-05-14-TouchDeletedInst.ll @@ -0,0 +1,510 @@ +; This testcase, obviously distilled from a large program (bzip2 from +; Specint2000) caused instcombine to fail because it got the same instruction +; on it's worklist more than once (which is ok), but then deleted the +; instruction. Since the inst stayed on the worklist, as soon as it came back +; up to be processed, bad things happened, and opt asserted. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine +; END. +; + +%.LC0 = internal global [21 x sbyte] c"hbMakeCodeLengths(1)\00" ; <[21 x sbyte]*> [#uses=1] +%.LC1 = internal global [21 x sbyte] c"hbMakeCodeLengths(2)\00" ; <[21 x sbyte]*> [#uses=1] + +implementation ; Functions: + +void %hbMakeCodeLengths(ubyte* %len, int* %freq, int %alphaSize, int %maxLen) { +bb0: ;[#uses=0] + %len = alloca ubyte* ; <ubyte**> [#uses=2] + store ubyte* %len, ubyte** %len + %freq = alloca int* ; <int**> [#uses=2] + store int* %freq, int** %freq + %alphaSize = alloca int ; <int*> [#uses=2] + store int %alphaSize, int* %alphaSize + %maxLen = alloca int ; <int*> [#uses=2] + store int %maxLen, int* %maxLen + %heap = alloca int, uint 260 ; <int*> [#uses=27] + %weight = alloca int, uint 516 ; <int*> [#uses=18] + %parent = alloca int, uint 516 ; <int*> [#uses=7] + br label %bb1 + +bb1: ;[#uses=2] + %reg107 = load ubyte** %len ; <ubyte*> [#uses=1] + %reg108 = load int** %freq ; <int*> [#uses=1] + %reg109 = load int* %alphaSize ; <int> [#uses=10] + %reg110 = load int* %maxLen ; <int> [#uses=1] + %cond747 = setge int 0, %reg109 ; <bool> [#uses=1] + br bool %cond747, label %bb6, label %bb2 + +bb2: ;[#uses=2] + %reg591 = phi int [ %reg594, %bb5 ], [ 0, %bb1 ] ; <int> [#uses=3] + %reg591-idxcast1 = cast int %reg591 to uint ; <uint> [#uses=1] + %reg591-idxcast1-offset = add uint %reg591-idxcast1, 1 ; <uint> [#uses=1] + %reg591-idxcast1-offset = cast uint %reg591-idxcast1-offset to long ; <long> [#uses=1] + %reg126 = getelementptr int* %weight, long %reg591-idxcast1-offset ; <int*> [#uses=1] + %reg591-idxcast = cast int %reg591 to long ; <long> [#uses=1] + %reg132 = getelementptr int* %reg108, long %reg591-idxcast ; <int*> [#uses=1] + %reg133 = load int* %reg132 ; <int> [#uses=2] + %cond748 = seteq int %reg133, 0 ; <bool> [#uses=1] + br bool %cond748, label %bb4, label %bb3 + +bb3: ;[#uses=2] + %reg127 = shl int %reg133, ubyte 8 ; <int> [#uses=1] + br label %bb5 + +bb4: ;[#uses=2] + br label %bb5 + +bb5: ;[#uses=3] + %reg593 = phi int [ 256, %bb4 ], [ %reg127, %bb3 ] ; <int> [#uses=1] + store int %reg593, int* %reg126 + %reg594 = add int %reg591, 1 ; <int> [#uses=2] + %cond749 = setlt int %reg594, %reg109 ; <bool> [#uses=1] + br bool %cond749, label %bb2, label %bb6 + +bb6: ;[#uses=6] + store int 0, int* %heap + store int 0, int* %weight + store int -2, int* %parent + %cond750 = setgt int 1, %reg109 ; <bool> [#uses=1] + br bool %cond750, label %bb11, label %bb7 + +bb7: ;[#uses=3] + %reg597 = phi uint [ %reg598, %bb10 ], [ 0, %bb6 ] ; <uint> [#uses=5] + %reg597-casted = cast uint %reg597 to int ; <int> [#uses=1] + %reg596 = add int %reg597-casted, 1 ; <int> [#uses=3] + %reg597-offset = add uint %reg597, 1 ; <uint> [#uses=1] + %reg597-offset = cast uint %reg597-offset to long ; <long> [#uses=1] + %reg149 = getelementptr int* %parent, long %reg597-offset ; <int*> [#uses=1] + store int -1, int* %reg149 + %reg598 = add uint %reg597, 1 ; <uint> [#uses=3] + %reg597-offset1 = add uint %reg597, 1 ; <uint> [#uses=1] + %reg597-offset1 = cast uint %reg597-offset1 to long ; <long> [#uses=1] + %reg157 = getelementptr int* %heap, long %reg597-offset1 ; <int*> [#uses=1] + store int %reg596, int* %reg157 + br label %bb9 + +bb8: ;[#uses=2] + %reg599 = cast uint %reg599 to long ; <long> [#uses=1] + %reg198 = getelementptr int* %heap, long %reg599 ; <int*> [#uses=1] + store int %reg182, int* %reg198 + %cast938 = cast int %reg174 to uint ; <uint> [#uses=1] + br label %bb9 + +bb9: ;[#uses=2] + %reg599 = phi uint [ %cast938, %bb8 ], [ %reg598, %bb7 ] ; <uint> [#uses=3] + %cast807 = cast uint %reg599 to int ; <int> [#uses=1] + %reg597-offset2 = add uint %reg597, 1 ; <uint> [#uses=1] + %reg597-offset2 = cast uint %reg597-offset2 to long ; <long> [#uses=1] + %reg173 = getelementptr int* %weight, long %reg597-offset2 ; <int*> [#uses=1] + %reg174 = shr int %cast807, ubyte 1 ; <int> [#uses=2] + %reg174-idxcast = cast int %reg174 to uint ; <uint> [#uses=1] + cast uint %reg174-idxcast to long ; <long>:0 [#uses=1] + %reg181 = getelementptr int* %heap, long %0 ; <int*> [#uses=1] + %reg182 = load int* %reg181 ; <int> [#uses=2] + %reg182-idxcast = cast int %reg182 to uint ; <uint> [#uses=1] + cast uint %reg182-idxcast to long ; <long>:1 [#uses=1] + %reg189 = getelementptr int* %weight, long %1 ; <int*> [#uses=1] + %reg190 = load int* %reg173 ; <int> [#uses=1] + %reg191 = load int* %reg189 ; <int> [#uses=1] + %cond751 = setlt int %reg190, %reg191 ; <bool> [#uses=1] + br bool %cond751, label %bb8, label %bb10 + +bb10: ;[#uses=3] + cast uint %reg599 to long ; <long>:2 [#uses=1] + %reg214 = getelementptr int* %heap, long %2 ; <int*> [#uses=1] + store int %reg596, int* %reg214 + %reg601 = add int %reg596, 1 ; <int> [#uses=1] + %cond752 = setle int %reg601, %reg109 ; <bool> [#uses=1] + br bool %cond752, label %bb7, label %bb11 + +bb11: ;[#uses=2] + %reg602 = phi uint [ %reg598, %bb10 ], [ 0, %bb6 ] ; <uint> [#uses=3] + %cast819 = cast uint %reg602 to int ; <int> [#uses=1] + %cast818 = cast uint %reg602 to int ; <int> [#uses=1] + %cond753 = setle int %cast818, 259 ; <bool> [#uses=1] + br bool %cond753, label %bb13, label %bb12 + +bb12: ;[#uses=1] + cast uint 0 to long ; <long>:3 [#uses=1] + cast uint 0 to long ; <long>:4 [#uses=1] + %cast784 = getelementptr [21 x sbyte]* %.LC0, long %3, long %4 ; <sbyte*> [#uses=1] + call void %panic( sbyte* %cast784 ) + br label %bb13 + +bb13: ;[#uses=4] + %cond754 = setle int %cast819, 1 ; <bool> [#uses=1] + %cast918 = cast int %reg109 to uint ; <uint> [#uses=1] + %cast940 = cast uint %reg602 to int ; <int> [#uses=1] + %cast942 = cast int %reg109 to uint ; <uint> [#uses=1] + br bool %cond754, label %bb32, label %bb14 + +bb14: ;[#uses=5] + %cann-indvar1 = phi uint [ 0, %bb13 ], [ %add1-indvar1, %bb31 ] ; <uint> [#uses=3] + %cann-indvar1-casted = cast uint %cann-indvar1 to int ; <int> [#uses=1] + %reg603-scale = mul int %cann-indvar1-casted, -1 ; <int> [#uses=1] + %reg603 = add int %reg603-scale, %cast940 ; <int> [#uses=4] + %reg604 = add uint %cann-indvar1, %cast942 ; <uint> [#uses=4] + %add1-indvar1 = add uint %cann-indvar1, 1 ; <uint> [#uses=1] + cast uint 1 to long ; <long>:5 [#uses=1] + %reg7551 = getelementptr int* %heap, long %5 ; <int*> [#uses=1] + %reg113 = load int* %reg7551 ; <int> [#uses=2] + %reg603-idxcast = cast int %reg603 to uint ; <uint> [#uses=1] + cast uint %reg603-idxcast to long ; <long>:6 [#uses=1] + %reg222 = getelementptr int* %heap, long %6 ; <int*> [#uses=1] + %reg223 = load int* %reg222 ; <int> [#uses=1] + cast uint 1 to long ; <long>:7 [#uses=1] + %reg7561 = getelementptr int* %heap, long %7 ; <int*> [#uses=1] + store int %reg223, int* %reg7561 + %reg605 = add int %reg603, -1 ; <int> [#uses=4] + cast uint 1 to long ; <long>:8 [#uses=1] + %reg757 = getelementptr int* %heap, long %8 ; <int*> [#uses=1] + %reg226 = load int* %reg757 ; <int> [#uses=2] + %cond758 = setgt int 2, %reg605 ; <bool> [#uses=1] + br bool %cond758, label %bb20, label %bb15 + +bb15: ;[#uses=3] + %reg606 = phi int [ %reg611, %bb19 ], [ 2, %bb14 ] ; <int> [#uses=6] + %reg607 = phi int [ %reg609, %bb19 ], [ 1, %bb14 ] ; <int> [#uses=2] + %cond759 = setge int %reg606, %reg605 ; <bool> [#uses=1] + br bool %cond759, label %bb18, label %bb16 + +bb16: ;[#uses=2] + %reg606-idxcast = cast int %reg606 to uint ; <uint> [#uses=1] + %reg606-idxcast-offset = add uint %reg606-idxcast, 1 ; <uint> [#uses=1] + cast uint %reg606-idxcast-offset to long ; <long>:9 [#uses=1] + %reg241 = getelementptr int* %heap, long %9 ; <int*> [#uses=1] + %reg242 = load int* %reg241 ; <int> [#uses=1] + %reg242-idxcast = cast int %reg242 to uint ; <uint> [#uses=1] + cast uint %reg242-idxcast to long ; <long>:10 [#uses=1] + %reg249 = getelementptr int* %weight, long %10 ; <int*> [#uses=1] + %reg606-idxcast1 = cast int %reg606 to uint ; <uint> [#uses=1] + cast uint %reg606-idxcast1 to long ; <long>:11 [#uses=1] + %reg256 = getelementptr int* %heap, long %11 ; <int*> [#uses=1] + %reg257 = load int* %reg256 ; <int> [#uses=1] + %reg257-idxcast = cast int %reg257 to uint ; <uint> [#uses=1] + cast uint %reg257-idxcast to long ; <long>:12 [#uses=1] + %reg264 = getelementptr int* %weight, long %12 ; <int*> [#uses=1] + %reg265 = load int* %reg249 ; <int> [#uses=1] + %reg266 = load int* %reg264 ; <int> [#uses=1] + %cond760 = setge int %reg265, %reg266 ; <bool> [#uses=1] + br bool %cond760, label %bb18, label %bb17 + +bb17: ;[#uses=2] + %reg608 = add int %reg606, 1 ; <int> [#uses=1] + br label %bb18 + +bb18: ;[#uses=4] + %reg609 = phi int [ %reg608, %bb17 ], [ %reg606, %bb16 ], [ %reg606, %bb15 ] ; <int> [#uses=4] + %reg226-idxcast = cast int %reg226 to uint ; <uint> [#uses=1] + cast uint %reg226-idxcast to long ; <long>:13 [#uses=1] + %reg273 = getelementptr int* %weight, long %13 ; <int*> [#uses=1] + %reg609-idxcast = cast int %reg609 to uint ; <uint> [#uses=1] + cast uint %reg609-idxcast to long ; <long>:14 [#uses=1] + %reg280 = getelementptr int* %heap, long %14 ; <int*> [#uses=1] + %reg281 = load int* %reg280 ; <int> [#uses=2] + %reg281-idxcast = cast int %reg281 to uint ; <uint> [#uses=1] + cast uint %reg281-idxcast to long ; <long>:15 [#uses=1] + %reg288 = getelementptr int* %weight, long %15 ; <int*> [#uses=1] + %reg289 = load int* %reg273 ; <int> [#uses=1] + %reg290 = load int* %reg288 ; <int> [#uses=1] + %cond761 = setlt int %reg289, %reg290 ; <bool> [#uses=1] + br bool %cond761, label %bb20, label %bb19 + +bb19: ;[#uses=4] + %reg607-idxcast = cast int %reg607 to uint ; <uint> [#uses=1] + cast uint %reg607-idxcast to long ; <long>:16 [#uses=1] + %reg297 = getelementptr int* %heap, long %16 ; <int*> [#uses=1] + store int %reg281, int* %reg297 + %reg611 = shl int %reg609, ubyte 1 ; <int> [#uses=2] + %cond762 = setle int %reg611, %reg605 ; <bool> [#uses=1] + br bool %cond762, label %bb15, label %bb20 + +bb20: ;[#uses=6] + %reg612 = phi int [ %reg609, %bb19 ], [ %reg607, %bb18 ], [ 1, %bb14 ] ; <int> [#uses=1] + %reg612-idxcast = cast int %reg612 to uint ; <uint> [#uses=1] + cast uint %reg612-idxcast to long ; <long>:17 [#uses=1] + %reg312 = getelementptr int* %heap, long %17 ; <int*> [#uses=1] + store int %reg226, int* %reg312 + cast uint 1 to long ; <long>:18 [#uses=1] + %reg7631 = getelementptr int* %heap, long %18 ; <int*> [#uses=1] + %reg114 = load int* %reg7631 ; <int> [#uses=2] + %reg603-idxcast1 = cast int %reg603 to uint ; <uint> [#uses=1] + %reg603-idxcast1-offset = add uint %reg603-idxcast1, 1073741823 ; <uint> [#uses=1] + cast uint %reg603-idxcast1-offset to long ; <long>:19 [#uses=1] + %reg319 = getelementptr int* %heap, long %19 ; <int*> [#uses=1] + %reg320 = load int* %reg319 ; <int> [#uses=1] + cast uint 1 to long ; <long>:20 [#uses=1] + %reg7641 = getelementptr int* %heap, long %20 ; <int*> [#uses=1] + store int %reg320, int* %reg7641 + %reg613 = add int %reg605, -1 ; <int> [#uses=4] + cast uint 1 to long ; <long>:21 [#uses=1] + %reg765 = getelementptr int* %heap, long %21 ; <int*> [#uses=1] + %reg323 = load int* %reg765 ; <int> [#uses=2] + %cond766 = setgt int 2, %reg613 ; <bool> [#uses=1] + br bool %cond766, label %bb26, label %bb21 + +bb21: ;[#uses=3] + %reg614 = phi int [ %reg619, %bb25 ], [ 2, %bb20 ] ; <int> [#uses=6] + %reg615 = phi int [ %reg617, %bb25 ], [ 1, %bb20 ] ; <int> [#uses=2] + %cond767 = setge int %reg614, %reg613 ; <bool> [#uses=1] + br bool %cond767, label %bb24, label %bb22 + +bb22: ;[#uses=2] + %reg614-idxcast = cast int %reg614 to uint ; <uint> [#uses=1] + %reg614-idxcast-offset = add uint %reg614-idxcast, 1 ; <uint> [#uses=1] + cast uint %reg614-idxcast-offset to long ; <long>:22 [#uses=1] + %reg338 = getelementptr int* %heap, long %22 ; <int*> [#uses=1] + %reg339 = load int* %reg338 ; <int> [#uses=1] + %reg339-idxcast = cast int %reg339 to uint ; <uint> [#uses=1] + cast uint %reg339-idxcast to long ; <long>:23 [#uses=1] + %reg346 = getelementptr int* %weight, long %23 ; <int*> [#uses=1] + %reg614-idxcast1 = cast int %reg614 to uint ; <uint> [#uses=1] + cast uint %reg614-idxcast1 to long ; <long>:24 [#uses=1] + %reg353 = getelementptr int* %heap, long %24 ; <int*> [#uses=1] + %reg354 = load int* %reg353 ; <int> [#uses=1] + %reg354-idxcast = cast int %reg354 to uint ; <uint> [#uses=1] + cast uint %reg354-idxcast to long ; <long>:25 [#uses=1] + %reg361 = getelementptr int* %weight, long %25 ; <int*> [#uses=1] + %reg362 = load int* %reg346 ; <int> [#uses=1] + %reg363 = load int* %reg361 ; <int> [#uses=1] + %cond768 = setge int %reg362, %reg363 ; <bool> [#uses=1] + br bool %cond768, label %bb24, label %bb23 + +bb23: ;[#uses=2] + %reg616 = add int %reg614, 1 ; <int> [#uses=1] + br label %bb24 + +bb24: ;[#uses=4] + %reg617 = phi int [ %reg616, %bb23 ], [ %reg614, %bb22 ], [ %reg614, %bb21 ] ; <int> [#uses=4] + %reg323-idxcast = cast int %reg323 to uint ; <uint> [#uses=1] + cast uint %reg323-idxcast to long ; <long>:26 [#uses=1] + %reg370 = getelementptr int* %weight, long %26 ; <int*> [#uses=1] + %reg617-idxcast = cast int %reg617 to uint ; <uint> [#uses=1] + cast uint %reg617-idxcast to long ; <long>:27 [#uses=1] + %reg377 = getelementptr int* %heap, long %27 ; <int*> [#uses=1] + %reg378 = load int* %reg377 ; <int> [#uses=2] + %reg378-idxcast = cast int %reg378 to uint ; <uint> [#uses=1] + cast uint %reg378-idxcast to long ; <long>:28 [#uses=1] + %reg385 = getelementptr int* %weight, long %28 ; <int*> [#uses=1] + %reg386 = load int* %reg370 ; <int> [#uses=1] + %reg387 = load int* %reg385 ; <int> [#uses=1] + %cond769 = setlt int %reg386, %reg387 ; <bool> [#uses=1] + br bool %cond769, label %bb26, label %bb25 + +bb25: ;[#uses=4] + %reg615-idxcast = cast int %reg615 to uint ; <uint> [#uses=1] + cast uint %reg615-idxcast to long ; <long>:29 [#uses=1] + %reg394 = getelementptr int* %heap, long %29 ; <int*> [#uses=1] + store int %reg378, int* %reg394 + %reg619 = shl int %reg617, ubyte 1 ; <int> [#uses=2] + %cond770 = setle int %reg619, %reg613 ; <bool> [#uses=1] + br bool %cond770, label %bb21, label %bb26 + +bb26: ;[#uses=4] + %reg620 = phi int [ %reg617, %bb25 ], [ %reg615, %bb24 ], [ 1, %bb20 ] ; <int> [#uses=1] + %reg620-idxcast = cast int %reg620 to uint ; <uint> [#uses=1] + cast uint %reg620-idxcast to long ; <long>:30 [#uses=1] + %reg409 = getelementptr int* %heap, long %30 ; <int*> [#uses=1] + store int %reg323, int* %reg409 + %reg621 = add uint %reg604, 1 ; <uint> [#uses=5] + %reg113-idxcast = cast int %reg113 to uint ; <uint> [#uses=1] + cast uint %reg113-idxcast to long ; <long>:31 [#uses=1] + %reg416 = getelementptr int* %parent, long %31 ; <int*> [#uses=1] + %reg114-idxcast = cast int %reg114 to uint ; <uint> [#uses=1] + cast uint %reg114-idxcast to long ; <long>:32 [#uses=1] + %reg423 = getelementptr int* %parent, long %32 ; <int*> [#uses=1] + %cast889 = cast uint %reg621 to int ; <int> [#uses=1] + store int %cast889, int* %reg423 + %cast890 = cast uint %reg621 to int ; <int> [#uses=1] + store int %cast890, int* %reg416 + %reg604-offset = add uint %reg604, 1 ; <uint> [#uses=1] + cast uint %reg604-offset to long ; <long>:33 [#uses=1] + %reg431 = getelementptr int* %weight, long %33 ; <int*> [#uses=1] + %reg113-idxcast2 = cast int %reg113 to uint ; <uint> [#uses=1] + cast uint %reg113-idxcast2 to long ; <long>:34 [#uses=1] + %reg4381 = getelementptr int* %weight, long %34 ; <int*> [#uses=1] + %reg439 = load int* %reg4381 ; <int> [#uses=2] + %reg440 = and int %reg439, -256 ; <int> [#uses=1] + %reg114-idxcast2 = cast int %reg114 to uint ; <uint> [#uses=1] + cast uint %reg114-idxcast2 to long ; <long>:35 [#uses=1] + %reg4471 = getelementptr int* %weight, long %35 ; <int*> [#uses=1] + %reg448 = load int* %reg4471 ; <int> [#uses=2] + %reg449 = and int %reg448, -256 ; <int> [#uses=1] + %reg450 = add int %reg440, %reg449 ; <int> [#uses=1] + %reg460 = and int %reg439, 255 ; <int> [#uses=2] + %reg451 = and int %reg448, 255 ; <int> [#uses=2] + %cond771 = setge int %reg451, %reg460 ; <bool> [#uses=1] + br bool %cond771, label %bb28, label %bb27 + +bb27: ;[#uses=2] + br label %bb28 + +bb28: ;[#uses=3] + %reg623 = phi int [ %reg460, %bb27 ], [ %reg451, %bb26 ] ; <int> [#uses=1] + %reg469 = add int %reg623, 1 ; <int> [#uses=1] + %reg470 = or int %reg450, %reg469 ; <int> [#uses=1] + store int %reg470, int* %reg431 + %reg604-offset1 = add uint %reg604, 1 ; <uint> [#uses=1] + cast uint %reg604-offset1 to long ; <long>:36 [#uses=1] + %reg4771 = getelementptr int* %parent, long %36 ; <int*> [#uses=1] + store int -1, int* %reg4771 + %reg624 = add int %reg613, 1 ; <int> [#uses=2] + %reg603-idxcast2 = cast int %reg603 to uint ; <uint> [#uses=1] + %reg603-idxcast2-offset = add uint %reg603-idxcast2, 1073741823 ; <uint> [#uses=1] + cast uint %reg603-idxcast2-offset to long ; <long>:37 [#uses=1] + %reg485 = getelementptr int* %heap, long %37 ; <int*> [#uses=1] + %cast902 = cast uint %reg621 to int ; <int> [#uses=1] + store int %cast902, int* %reg485 + br label %bb30 + +bb29: ;[#uses=2] + %reg625-idxcast = cast int %reg625 to uint ; <uint> [#uses=1] + cast uint %reg625-idxcast to long ; <long>:38 [#uses=1] + %reg526 = getelementptr int* %heap, long %38 ; <int*> [#uses=1] + store int %reg510, int* %reg526 + br label %bb30 + +bb30: ;[#uses=2] + %reg625 = phi int [ %reg502, %bb29 ], [ %reg624, %bb28 ] ; <int> [#uses=3] + %reg604-offset2 = add uint %reg604, 1 ; <uint> [#uses=1] + cast uint %reg604-offset2 to long ; <long>:39 [#uses=1] + %reg501 = getelementptr int* %weight, long %39 ; <int*> [#uses=1] + %reg502 = shr int %reg625, ubyte 1 ; <int> [#uses=2] + %reg502-idxcast = cast int %reg502 to uint ; <uint> [#uses=1] + cast uint %reg502-idxcast to long ; <long>:40 [#uses=1] + %reg509 = getelementptr int* %heap, long %40 ; <int*> [#uses=1] + %reg510 = load int* %reg509 ; <int> [#uses=2] + %reg510-idxcast = cast int %reg510 to uint ; <uint> [#uses=1] + cast uint %reg510-idxcast to long ; <long>:41 [#uses=1] + %reg517 = getelementptr int* %weight, long %41 ; <int*> [#uses=1] + %reg518 = load int* %reg501 ; <int> [#uses=1] + %reg519 = load int* %reg517 ; <int> [#uses=1] + %cond772 = setlt int %reg518, %reg519 ; <bool> [#uses=1] + br bool %cond772, label %bb29, label %bb31 + +bb31: ;[#uses=3] + %reg625-idxcast1 = cast int %reg625 to uint ; <uint> [#uses=1] + cast uint %reg625-idxcast1 to long ; <long>:42 [#uses=1] + %reg542 = getelementptr int* %heap, long %42 ; <int*> [#uses=1] + %cast916 = cast uint %reg621 to int ; <int> [#uses=1] + store int %cast916, int* %reg542 + %cond773 = setgt int %reg624, 1 ; <bool> [#uses=1] + br bool %cond773, label %bb14, label %bb32 + +bb32: ;[#uses=2] + %reg627 = phi uint [ %reg621, %bb31 ], [ %cast918, %bb13 ] ; <uint> [#uses=1] + %cast919 = cast uint %reg627 to int ; <int> [#uses=1] + %cond774 = setle int %cast919, 515 ; <bool> [#uses=1] + br bool %cond774, label %bb34, label %bb33 + +bb33: ;[#uses=1] + cast uint 0 to long ; <long>:43 [#uses=1] + cast uint 0 to long ; <long>:44 [#uses=1] + %cast785 = getelementptr [21 x sbyte]* %.LC1, long %43, long %44 ; <sbyte*> [#uses=1] + call void %panic( sbyte* %cast785 ) + br label %bb34 + +bb34: ;[#uses=5] + %cond775 = setgt int 1, %reg109 ; <bool> [#uses=1] + br bool %cond775, label %bb40, label %bb35 + +bb35: ;[#uses=5] + %reg629 = phi ubyte [ %reg639, %bb39 ], [ 0, %bb34 ] ; <ubyte> [#uses=1] + %cann-indvar = phi uint [ 0, %bb34 ], [ %add1-indvar, %bb39 ] ; <uint> [#uses=4] + %cann-indvar-casted = cast uint %cann-indvar to int ; <int> [#uses=1] + %reg630 = add int %cann-indvar-casted, 1 ; <int> [#uses=2] + %add1-indvar = add uint %cann-indvar, 1 ; <uint> [#uses=1] + %cann-indvar-offset1 = add uint %cann-indvar, 1 ; <uint> [#uses=1] + cast uint %cann-indvar-offset1 to long ; <long>:45 [#uses=1] + %reg589 = getelementptr int* %parent, long %45 ; <int*> [#uses=1] + %reg590 = load int* %reg589 ; <int> [#uses=1] + %cond776 = setlt int %reg590, 0 ; <bool> [#uses=1] + %parent-idxcast = cast int* %parent to uint ; <uint> [#uses=1] + %cast948 = cast int %reg630 to uint ; <uint> [#uses=1] + br bool %cond776, label %bb37, label %bb36 + +bb36: ;[#uses=5] + %reg632 = phi uint [ %reg634, %bb36 ], [ %cast948, %bb35 ] ; <uint> [#uses=1] + %reg633 = phi uint [ %reg635, %bb36 ], [ 0, %bb35 ] ; <uint> [#uses=3] + %reg633-casted = cast uint %reg633 to sbyte* ; <sbyte*> [#uses=0] + %reg631-scale = mul uint %reg633, 0 ; <uint> [#uses=1] + %reg631-scale = cast uint %reg631-scale to sbyte* ; <sbyte*> [#uses=1] + cast uint %parent-idxcast to long ; <long>:46 [#uses=1] + %reg6311 = getelementptr sbyte* %reg631-scale, long %46 ; <sbyte*> [#uses=2] + %reg632-scale = mul uint %reg632, 4 ; <uint> [#uses=1] + cast uint %reg632-scale to long ; <long>:47 [#uses=1] + %reg5581 = getelementptr sbyte* %reg6311, long %47 ; <sbyte*> [#uses=1] + %cast924 = cast sbyte* %reg5581 to uint* ; <uint*> [#uses=1] + %reg634 = load uint* %cast924 ; <uint> [#uses=2] + %reg635 = add uint %reg633, 1 ; <uint> [#uses=2] + %reg634-scale = mul uint %reg634, 4 ; <uint> [#uses=1] + cast uint %reg634-scale to long ; <long>:48 [#uses=1] + %reg5501 = getelementptr sbyte* %reg6311, long %48 ; <sbyte*> [#uses=1] + %cast925 = cast sbyte* %reg5501 to int* ; <int*> [#uses=1] + %reg551 = load int* %cast925 ; <int> [#uses=1] + %cond777 = setge int %reg551, 0 ; <bool> [#uses=1] + br bool %cond777, label %bb36, label %bb37 + +bb37: ;[#uses=3] + %reg637 = phi uint [ %reg635, %bb36 ], [ 0, %bb35 ] ; <uint> [#uses=2] + %cast928 = cast uint %reg637 to int ; <int> [#uses=1] + %cann-indvar-offset = add uint %cann-indvar, 1 ; <uint> [#uses=1] + cast uint %cann-indvar-offset to long ; <long>:49 [#uses=1] + %reg561 = getelementptr ubyte* %reg107, long %49 ; <ubyte*> [#uses=1] + cast uint 4294967295 to long ; <long>:50 [#uses=1] + %reg778 = getelementptr ubyte* %reg561, long %50 ; <ubyte*> [#uses=1] + %cast788 = cast uint %reg637 to ubyte ; <ubyte> [#uses=1] + store ubyte %cast788, ubyte* %reg778 + %cond779 = setle int %cast928, %reg110 ; <bool> [#uses=1] + br bool %cond779, label %bb39, label %bb38 + +bb38: ;[#uses=2] + br label %bb39 + +bb39: ;[#uses=5] + %reg639 = phi ubyte [ 1, %bb38 ], [ %reg629, %bb37 ] ; <ubyte> [#uses=2] + %reg640 = add int %reg630, 1 ; <int> [#uses=1] + %cond780 = setle int %reg640, %reg109 ; <bool> [#uses=1] + br bool %cond780, label %bb35, label %bb40 + +bb40: ;[#uses=2] + %reg641 = phi ubyte [ %reg639, %bb39 ], [ 0, %bb34 ] ; <ubyte> [#uses=1] + %cond781 = seteq ubyte %reg641, 0 ; <bool> [#uses=1] + br bool %cond781, label %bb44, label %bb41 + +bb41: ;[#uses=2] + %cond782 = setge int 1, %reg109 ; <bool> [#uses=1] + br bool %cond782, label %bb6, label %bb42 + +bb42: ;[#uses=3] + %cann-indvar2 = phi int [ 0, %bb41 ], [ %add1-indvar2, %bb42 ] ; <int> [#uses=3] + %reg643 = add int %cann-indvar2, 1 ; <int> [#uses=1] + %add1-indvar2 = add int %cann-indvar2, 1 ; <int> [#uses=1] + %cann-indvar2-idxcast = cast int %cann-indvar2 to uint ; <uint> [#uses=1] + %cann-indvar2-idxcast-offset = add uint %cann-indvar2-idxcast, 1 ; <uint> [#uses=1] + cast uint %cann-indvar2-idxcast-offset to long ; <long>:51 [#uses=1] + %reg569 = getelementptr int* %weight, long %51 ; <int*> [#uses=2] + %reg570 = load int* %reg569 ; <int> [#uses=2] + %reg644 = shr int %reg570, ubyte 8 ; <int> [#uses=1] + %reg572 = shr int %reg570, ubyte 31 ; <int> [#uses=1] + %cast933 = cast int %reg572 to uint ; <uint> [#uses=1] + %reg573 = shr uint %cast933, ubyte 31 ; <uint> [#uses=1] + %cast934 = cast uint %reg573 to int ; <int> [#uses=1] + %reg574 = add int %reg644, %cast934 ; <int> [#uses=1] + %reg571 = shr int %reg574, ubyte 1 ; <int> [#uses=1] + %reg645 = add int %reg571, 1 ; <int> [#uses=1] + %reg582 = shl int %reg645, ubyte 8 ; <int> [#uses=1] + store int %reg582, int* %reg569 + %reg646 = add int %reg643, 1 ; <int> [#uses=1] + %cond783 = setlt int %reg646, %reg109 ; <bool> [#uses=1] + br bool %cond783, label %bb42, label %bb43 + +bb43: ;[#uses=1] + br label %bb6 + +bb44: ;[#uses=1] + ret void +} + +declare void %panic(sbyte*) diff --git a/test/Transforms/InstCombine/2002-08-02-CastTest.ll b/test/Transforms/InstCombine/2002-08-02-CastTest.ll new file mode 100644 index 0000000..23284a6 --- /dev/null +++ b/test/Transforms/InstCombine/2002-08-02-CastTest.ll @@ -0,0 +1,11 @@ +; This testcase is incorrectly getting completely eliminated. There should be +; SOME instruction named %c here, even if it's a bitwise and. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep %c +; +ulong %test3(ulong %A) { + %c1 = cast ulong %A to ubyte + %c2 = cast ubyte %c1 to ulong + ret ulong %c2 +} + diff --git a/test/Transforms/InstCombine/2002-09-17-GetElementPtrCrash.ll b/test/Transforms/InstCombine/2002-09-17-GetElementPtrCrash.ll new file mode 100644 index 0000000..69bec19 --- /dev/null +++ b/test/Transforms/InstCombine/2002-09-17-GetElementPtrCrash.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine + +%bob = type { int } + +int %alias() { + %pbob1 = alloca %bob + %pbob2 = getelementptr %bob* %pbob1 + %pbobel = getelementptr %bob* %pbob2, long 0, uint 0 + %rval = load int* %pbobel + ret int %rval +} + diff --git a/test/Transforms/InstCombine/2002-12-05-MissedConstProp.ll b/test/Transforms/InstCombine/2002-12-05-MissedConstProp.ll new file mode 100644 index 0000000..6233e50 --- /dev/null +++ b/test/Transforms/InstCombine/2002-12-05-MissedConstProp.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep add + +int %test(int %A) { + %A.neg = sub int 0, %A + %.neg = sub int 0, 1 + %X = add int %.neg, 1 + %Y.neg.ra = add int %A, %X + %r = add int %A.neg, %Y.neg.ra + ret int %r +} diff --git a/test/Transforms/InstCombine/2003-05-26-CastMiscompile.ll b/test/Transforms/InstCombine/2003-05-26-CastMiscompile.ll new file mode 100644 index 0000000..4532589 --- /dev/null +++ b/test/Transforms/InstCombine/2003-05-26-CastMiscompile.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep 4294967295 + +ulong %test(ulong %Val) { + %tmp.3 = cast ulong %Val to uint ; <uint> [#uses=1] + %tmp.8 = cast uint %tmp.3 to ulong ; <ulong> [#uses=1] + ret ulong %tmp.8 +} diff --git a/test/Transforms/InstCombine/2003-05-27-ConstExprCrash.ll b/test/Transforms/InstCombine/2003-05-27-ConstExprCrash.ll new file mode 100644 index 0000000..6222169 --- /dev/null +++ b/test/Transforms/InstCombine/2003-05-27-ConstExprCrash.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +%X = global int 5 +long %test() { + %C = add long 1, 2 + %V = add long cast(int* %X to long), %C + ret long %V +} diff --git a/test/Transforms/InstCombine/2003-06-05-BranchInvertInfLoop.ll b/test/Transforms/InstCombine/2003-06-05-BranchInvertInfLoop.ll new file mode 100644 index 0000000..ae823d6 --- /dev/null +++ b/test/Transforms/InstCombine/2003-06-05-BranchInvertInfLoop.ll @@ -0,0 +1,14 @@ +; This testcase causes an infinite loop in the instruction combiner, +; because it things that the constant value is a not expression... and +; constantly inverts the branch back and forth. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +ubyte %test19(bool %c) { + br bool true, label %True, label %False +True: + ret ubyte 1 +False: + ret ubyte 3 +} + diff --git a/test/Transforms/InstCombine/2003-06-22-ConstantExprCrash.ll b/test/Transforms/InstCombine/2003-06-22-ConstantExprCrash.ll new file mode 100644 index 0000000..92a32d5 --- /dev/null +++ b/test/Transforms/InstCombine/2003-06-22-ConstantExprCrash.ll @@ -0,0 +1,12 @@ +; This is a bug in the VMcode library, not instcombine, it's just convenient +; to expose it here. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +%A = global int 1 +%B = global int 2 + +bool %test() { + %C = setlt int* getelementptr (int* %A, long 1), getelementptr (int* %B, long 2) ; Will get promoted to constantexpr + ret bool %C +} diff --git a/test/Transforms/InstCombine/2003-07-21-ExternalConstant.ll b/test/Transforms/InstCombine/2003-07-21-ExternalConstant.ll new file mode 100644 index 0000000..a3c30a8 --- /dev/null +++ b/test/Transforms/InstCombine/2003-07-21-ExternalConstant.ll @@ -0,0 +1,47 @@ +; +; Test: ExternalConstant +; +; Description: +; This regression test helps check whether the instruction combining +; optimization pass correctly handles global variables which are marked +; as external and constant. +; +; If a problem occurs, we should die on an assert(). Otherwise, we +; should pass through the optimizer without failure. +; +; Extra code: +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine +; END. +; + +target endian = little +target pointersize = 32 +%silly = external constant int ; <int*> [#uses=1] + +implementation ; Functions: + +declare void %bzero(sbyte*, uint) + +declare void %bcopy(sbyte*, sbyte*, uint) + +declare int %bcmp(sbyte*, sbyte*, uint) + +declare int %fputs(sbyte*, sbyte*) + +declare int %fputs_unlocked(sbyte*, sbyte*) + +int %function(int %a.1) { +entry: ; No predecessors! + %a.0 = alloca int ; <int*> [#uses=2] + %result = alloca int ; <int*> [#uses=2] + store int %a.1, int* %a.0 + %tmp.0 = load int* %a.0 ; <int> [#uses=1] + %tmp.1 = load int* %silly ; <int> [#uses=1] + %tmp.2 = add int %tmp.0, %tmp.1 ; <int> [#uses=1] + store int %tmp.2, int* %result + br label %return + +return: ; preds = %entry + %tmp.3 = load int* %result ; <int> [#uses=1] + ret int %tmp.3 +} diff --git a/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll b/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll new file mode 100644 index 0000000..81594db --- /dev/null +++ b/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll @@ -0,0 +1,23 @@ +; This testcase can be simplified by "realizing" that alloca can never return +; null. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -simplifycfg | \ +; RUN: llvm-dis | not grep br + +implementation ; Functions: + +declare int %bitmap_clear(...) + +int %oof() { +entry: + %live_head = alloca int ; <int*> [#uses=2] + %tmp.1 = setne int* %live_head, null ; <bool> [#uses=1] + br bool %tmp.1, label %then, label %UnifiedExitNode + +then: + %tmp.4 = call int (...)* %bitmap_clear( int* %live_head ) ; <int> [#uses=0] + br label %UnifiedExitNode + +UnifiedExitNode: + ret int 0 +} + diff --git a/test/Transforms/InstCombine/2003-09-09-VolatileLoadElim.ll b/test/Transforms/InstCombine/2003-09-09-VolatileLoadElim.ll new file mode 100644 index 0000000..adb1474 --- /dev/null +++ b/test/Transforms/InstCombine/2003-09-09-VolatileLoadElim.ll @@ -0,0 +1,5 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep load +void %test(int* %P) { + %X = volatile load int* %P ; Dead but not deletable! + ret void +} diff --git a/test/Transforms/InstCombine/2003-10-23-InstcombineNullFail.ll b/test/Transforms/InstCombine/2003-10-23-InstcombineNullFail.ll new file mode 100644 index 0000000..837494f --- /dev/null +++ b/test/Transforms/InstCombine/2003-10-23-InstcombineNullFail.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep false +; +; This actually looks like a constant propagation bug + +%X = type { [10 x int], float } + +implementation + +bool %test() { + %A = getelementptr %X* null, long 0, uint 0, long 0 + %B = setne int* %A, null + ret bool %B +} diff --git a/test/Transforms/InstCombine/2003-10-29-CallSiteResolve.ll b/test/Transforms/InstCombine/2003-10-29-CallSiteResolve.ll new file mode 100644 index 0000000..d23dc32 --- /dev/null +++ b/test/Transforms/InstCombine/2003-10-29-CallSiteResolve.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +declare int* %bar() + +float* %foo() { + %tmp.11 = invoke float* cast (int* ()* %bar to float* ()*)() + to label %invoke_cont except label %X + +invoke_cont: + ret float *%tmp.11 +X: + ret float *null +} diff --git a/test/Transforms/InstCombine/2003-11-03-VarargsCallBug.ll b/test/Transforms/InstCombine/2003-11-03-VarargsCallBug.ll new file mode 100644 index 0000000..a2e28d9 --- /dev/null +++ b/test/Transforms/InstCombine/2003-11-03-VarargsCallBug.ll @@ -0,0 +1,13 @@ +; The cast in this testcase is not eliminable on a 32-bit target! +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep inttoptr + +target endian = little +target pointersize = 32 + +declare void %foo(...) + +void %test(long %X) { + %Y = cast long %X to int* + call void (...)* %foo(int* %Y) + ret void +} diff --git a/test/Transforms/InstCombine/2003-11-13-ConstExprCastCall.ll b/test/Transforms/InstCombine/2003-11-13-ConstExprCastCall.ll new file mode 100644 index 0000000..d257286 --- /dev/null +++ b/test/Transforms/InstCombine/2003-11-13-ConstExprCastCall.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep call | notcast + +declare void %free(sbyte*) + +void %test(int* %X) { + call int (...)* cast (void (sbyte*)* %free to int (...)*)(int * %X) + ret void +} + diff --git a/test/Transforms/InstCombine/2004-01-13-InstCombineInvokePHI.ll b/test/Transforms/InstCombine/2004-01-13-InstCombineInvokePHI.ll new file mode 100644 index 0000000..ff90c32 --- /dev/null +++ b/test/Transforms/InstCombine/2004-01-13-InstCombineInvokePHI.ll @@ -0,0 +1,24 @@ +; Test for a problem afflicting several C++ programs in the testsuite. The +; instcombine pass is trying to get rid of the cast in the invoke instruction, +; inserting a cast of the return value after the PHI instruction, but which is +; used by the PHI instruction. This is bad: because of the semantics of the +; invoke instruction, we really cannot perform this transformation at all at +; least without splitting the critical edge. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +declare sbyte* %test() + +int %foo() { +entry: + br bool true, label %cont, label %call +call: + %P = invoke int*()* cast (sbyte*()* %test to int*()*)() + to label %cont except label %N +cont: + %P2 = phi int* [%P, %call], [null, %entry] + %V = load int* %P2 + ret int %V +N: + ret int 0 +} diff --git a/test/Transforms/InstCombine/2004-02-23-ShiftShiftOverflow.ll b/test/Transforms/InstCombine/2004-02-23-ShiftShiftOverflow.ll new file mode 100644 index 0000000..85095bf --- /dev/null +++ b/test/Transforms/InstCombine/2004-02-23-ShiftShiftOverflow.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep 34 + +int %test(int %X) { + ; Do not fold into shr X, 34, as this uses undefined behavior! + %Y = shr int %X, ubyte 17 + %Z = shr int %Y, ubyte 17 + ret int %Z +} + +int %test2(int %X) { + ; Do not fold into shl X, 34, as this uses undefined behavior! + %Y = shl int %X, ubyte 17 + %Z = shl int %Y, ubyte 17 + ret int %Z +} diff --git a/test/Transforms/InstCombine/2004-03-13-InstCombineInfLoop.ll b/test/Transforms/InstCombine/2004-03-13-InstCombineInfLoop.ll new file mode 100644 index 0000000..fd7a2e3 --- /dev/null +++ b/test/Transforms/InstCombine/2004-03-13-InstCombineInfLoop.ll @@ -0,0 +1,13 @@ +; This testcase caused the combiner to go into an infinite loop, moving the +; cast back and forth, changing the seteq to operate on int vs uint and back. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +bool %test(uint %A, int %B) { + %C = sub uint 0, %A + %Cc = cast uint %C to int + %D = sub int 0, %B + %E = seteq int %Cc, %D + ret bool %E +} + diff --git a/test/Transforms/InstCombine/2004-04-04-InstCombineReplaceAllUsesWith.ll b/test/Transforms/InstCombine/2004-04-04-InstCombineReplaceAllUsesWith.ll new file mode 100644 index 0000000..4c6ff1b --- /dev/null +++ b/test/Transforms/InstCombine/2004-04-04-InstCombineReplaceAllUsesWith.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +int %test() { + ret int 0 +Loop: + %X = add int %X, 1 + br label %Loop +} diff --git a/test/Transforms/InstCombine/2004-05-07-UnsizedCastLoad.ll b/test/Transforms/InstCombine/2004-05-07-UnsizedCastLoad.ll new file mode 100644 index 0000000..8e8f019 --- /dev/null +++ b/test/Transforms/InstCombine/2004-05-07-UnsizedCastLoad.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +%Ty = type opaque + +int %test(%Ty *%X) { + %Y = cast %Ty* %X to int* + %Z = load int* %Y + ret int %Z +} diff --git a/test/Transforms/InstCombine/2004-07-27-ConstantExprMul.ll b/test/Transforms/InstCombine/2004-07-27-ConstantExprMul.ll new file mode 100644 index 0000000..7994d45 --- /dev/null +++ b/test/Transforms/InstCombine/2004-07-27-ConstantExprMul.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +%p = weak global int 0 + +int %test(int %x) { + %y = mul int %x, cast (int* %p to int) + ret int %y +} diff --git a/test/Transforms/InstCombine/2004-08-09-RemInfLoop.llx b/test/Transforms/InstCombine/2004-08-09-RemInfLoop.llx new file mode 100644 index 0000000..98b35fe --- /dev/null +++ b/test/Transforms/InstCombine/2004-08-09-RemInfLoop.llx @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine + +; This testcase should not send the instcombiner into an infinite loop! + +int %test(int %X) { + %Y = rem int %X, 0 + ret int %Y +} diff --git a/test/Transforms/InstCombine/2004-08-10-BoolSetCC.ll b/test/Transforms/InstCombine/2004-08-10-BoolSetCC.ll new file mode 100644 index 0000000..e87e42c --- /dev/null +++ b/test/Transforms/InstCombine/2004-08-10-BoolSetCC.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i1 false} +bool %test(bool %V) { + %Y = setlt bool %V, false + ret bool %Y +} + diff --git a/test/Transforms/InstCombine/2004-09-20-BadLoadCombine.llx b/test/Transforms/InstCombine/2004-09-20-BadLoadCombine.llx new file mode 100644 index 0000000..ddc4039 --- /dev/null +++ b/test/Transforms/InstCombine/2004-09-20-BadLoadCombine.llx @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -mem2reg | llvm-dis | \ +; RUN: not grep {int 1} + +; When propagating the load through the select, make sure that the load is +; inserted where the original load was, not where the select is. Not doing +; so could produce incorrect results! + +implementation + +int %test(bool %C) { + %X = alloca int + %X2 = alloca int + store int 1, int* %X + store int 2, int* %X2 + + %Y = select bool %C, int* %X, int* %X2 + store int 3, int* %X + %Z = load int* %Y + ret int %Z +} + diff --git a/test/Transforms/InstCombine/2004-09-20-BadLoadCombine2.llx b/test/Transforms/InstCombine/2004-09-20-BadLoadCombine2.llx new file mode 100644 index 0000000..c3478a8 --- /dev/null +++ b/test/Transforms/InstCombine/2004-09-20-BadLoadCombine2.llx @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -mem2reg -simplifycfg | \ +; RUN: llvm-dis | grep -v store | not grep {int 1} + +; Test to make sure that instcombine does not accidentally propagate the load +; into the PHI, which would break the program. + +int %test(bool %C) { +entry: + %X = alloca int + %X2 = alloca int + store int 1, int* %X + store int 2, int* %X2 + br bool %C, label %cond_true.i, label %cond_continue.i + +cond_true.i: + br label %cond_continue.i + +cond_continue.i: + %mem_tmp.i.0 = phi int* [ %X, %cond_true.i ], [ %X2, %entry ] + store int 3, int* %X + %tmp.3 = load int* %mem_tmp.i.0 + ret int %tmp.3 +} + diff --git a/test/Transforms/InstCombine/2004-09-28-BadShiftAndSetCC.llx b/test/Transforms/InstCombine/2004-09-28-BadShiftAndSetCC.llx new file mode 100644 index 0000000..bb55b5c --- /dev/null +++ b/test/Transforms/InstCombine/2004-09-28-BadShiftAndSetCC.llx @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep -- -65536 + +bool %test(int %tmp.124) { + %tmp.125 = shl int %tmp.124, ubyte 8 + %tmp.126.mask = and int %tmp.125, -16777216 ; <int> [#uses=1] + %tmp.128 = seteq int %tmp.126.mask, 167772160 ; <bool> [#uses=1] + ret bool %tmp.128 +} + diff --git a/test/Transforms/InstCombine/2004-11-22-Missed-and-fold.ll b/test/Transforms/InstCombine/2004-11-22-Missed-and-fold.ll new file mode 100644 index 0000000..1a741c9 --- /dev/null +++ b/test/Transforms/InstCombine/2004-11-22-Missed-and-fold.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep and + +sbyte %test21(sbyte %A) { + %C = shr sbyte %A, ubyte 7 ;; sign extend + %D = and sbyte %C, 1 ;; chop off sign + ret sbyte %D +} + diff --git a/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll b/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll new file mode 100644 index 0000000..7e12bbf --- /dev/null +++ b/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll @@ -0,0 +1,136 @@ +; This test case tests the InstructionCombining optimization that +; reduces things like: +; %Y = cast sbyte %X to uint +; %C = setlt uint %Y, 1024 +; to +; %C = bool true +; It includes test cases for different constant values, signedness of the +; cast operands, and types of setCC operators. In all cases, the cast should +; be eliminated. In many cases the setCC is also eliminated based on the +; constant value and the range of the casted value. +; +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: notcast .*int +; END. + +implementation ; Functions: + +bool %lt_signed_to_large_unsigned(sbyte %SB) { + %Y = cast sbyte %SB to uint ; <uint> [#uses=1] + %C = setlt uint %Y, 1024 ; <bool> [#uses=1] + ret bool %C +} + +bool %lt_signed_to_large_signed(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setlt int %Y, 1024 + ret bool %C +} + +bool %lt_signed_to_large_negative(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setlt int %Y, -1024 + ret bool %C +} + +bool %lt_signed_to_small_signed(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setlt int %Y, 17 + ret bool %C +} + +bool %lt_signed_to_small_negative(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setlt int %Y, -17 + ret bool %C +} + +bool %lt_unsigned_to_large_unsigned(ubyte %SB) { + %Y = cast ubyte %SB to uint ; <uint> [#uses=1] + %C = setlt uint %Y, 1024 ; <bool> [#uses=1] + ret bool %C +} + +bool %lt_unsigned_to_large_signed(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setlt int %Y, 1024 + ret bool %C +} + +bool %lt_unsigned_to_large_negative(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setlt int %Y, -1024 + ret bool %C +} + +bool %lt_unsigned_to_small_unsigned(ubyte %SB) { + %Y = cast ubyte %SB to uint ; <uint> [#uses=1] + %C = setlt uint %Y, 17 ; <bool> [#uses=1] + ret bool %C +} + +bool %lt_unsigned_to_small_negative(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setlt int %Y, -17 + ret bool %C +} + +bool %gt_signed_to_large_unsigned(sbyte %SB) { + %Y = cast sbyte %SB to uint ; <uint> [#uses=1] + %C = setgt uint %Y, 1024 ; <bool> [#uses=1] + ret bool %C +} + +bool %gt_signed_to_large_signed(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setgt int %Y, 1024 + ret bool %C +} + +bool %gt_signed_to_large_negative(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setgt int %Y, -1024 + ret bool %C +} + +bool %gt_signed_to_small_signed(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setgt int %Y, 17 + ret bool %C +} + +bool %gt_signed_to_small_negative(sbyte %SB) { + %Y = cast sbyte %SB to int + %C = setgt int %Y, -17 + ret bool %C +} + +bool %gt_unsigned_to_large_unsigned(ubyte %SB) { + %Y = cast ubyte %SB to uint ; <uint> [#uses=1] + %C = setgt uint %Y, 1024 ; <bool> [#uses=1] + ret bool %C +} + +bool %gt_unsigned_to_large_signed(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setgt int %Y, 1024 + ret bool %C +} + +bool %gt_unsigned_to_large_negative(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setgt int %Y, -1024 + ret bool %C +} + +bool %gt_unsigned_to_small_unsigned(ubyte %SB) { + %Y = cast ubyte %SB to uint ; <uint> [#uses=1] + %C = setgt uint %Y, 17 ; <bool> [#uses=1] + ret bool %C +} + +bool %gt_unsigned_to_small_negative(ubyte %SB) { + %Y = cast ubyte %SB to int + %C = setgt int %Y, -17 + ret bool %C +} diff --git a/test/Transforms/InstCombine/2004-12-08-InstCombineCrash.ll b/test/Transforms/InstCombine/2004-12-08-InstCombineCrash.ll new file mode 100644 index 0000000..6e241f4 --- /dev/null +++ b/test/Transforms/InstCombine/2004-12-08-InstCombineCrash.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine + + %struct.llvm_java_object_base = type opaque + "java/lang/Object" = type { %struct.llvm_java_object_base } + "java/lang/StringBuffer" = type { "java/lang/Object", int, { "java/lang/Object", uint, [0 x ushort] }*, bool } + +implementation ; Functions: + +void "java/lang/StringBuffer/append(Ljava/lang/String;)Ljava/lang/StringBuffer;"() { +bc0: + %tmp53 = getelementptr "java/lang/StringBuffer"* null, int 0, uint 1 ; <int*> [#uses=1] + store int 0, int* %tmp53 + ret void +} diff --git a/test/Transforms/InstCombine/2004-12-08-RemInfiniteLoop.ll b/test/Transforms/InstCombine/2004-12-08-RemInfiniteLoop.ll new file mode 100644 index 0000000..fb18ea2 --- /dev/null +++ b/test/Transforms/InstCombine/2004-12-08-RemInfiniteLoop.ll @@ -0,0 +1,6 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine + +int %test(int %X) { + %Y = rem int %X, undef + ret int %Y +} diff --git a/test/Transforms/InstCombine/2005-03-04-ShiftOverflow.ll b/test/Transforms/InstCombine/2005-03-04-ShiftOverflow.ll new file mode 100644 index 0000000..9a754d8 --- /dev/null +++ b/test/Transforms/InstCombine/2005-03-04-ShiftOverflow.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {ret bool false} + +bool %test(ulong %tmp.169) { + %tmp.1710 = shr ulong %tmp.169, ubyte 1 + %tmp.1912 = setgt ulong %tmp.1710, 0 + ret bool %tmp.1912 +} + diff --git a/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll b/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll new file mode 100644 index 0000000..8e523d3 --- /dev/null +++ b/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +uint %test(bool %C, uint %tmp.15) { + %tmp.16 = select bool %C, uint 8, uint 1 + %tmp.18 = div uint %tmp.15, %tmp.16 + ret uint %tmp.18 +} diff --git a/test/Transforms/InstCombine/2005-06-15-DivSelectCrash.ll b/test/Transforms/InstCombine/2005-06-15-DivSelectCrash.ll new file mode 100644 index 0000000..fa862fe --- /dev/null +++ b/test/Transforms/InstCombine/2005-06-15-DivSelectCrash.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +int %_Z13func_31585107li(int %l_39521025, int %l_59244666) { + %shortcirc_val = select bool false, uint 1, uint 0 ; <uint> [#uses=1] + %tmp.8 = div uint 0, %shortcirc_val ; <uint> [#uses=1] + %tmp.9 = seteq uint %tmp.8, 0 ; <bool> [#uses=1] + %retval = select bool %tmp.9, int %l_59244666, int -1621308501 ; <int> [#uses=1] + ret int %retval +} diff --git a/test/Transforms/InstCombine/2005-06-15-ShiftSetCCCrash.ll b/test/Transforms/InstCombine/2005-06-15-ShiftSetCCCrash.ll new file mode 100644 index 0000000..deb6124 --- /dev/null +++ b/test/Transforms/InstCombine/2005-06-15-ShiftSetCCCrash.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; PR577 + +bool %test() { + %tmp.3 = shl int 0, ubyte 41 ; <int> [#uses=1] + %tmp.4 = setne int %tmp.3, 0 ; <bool> [#uses=1] + ret bool %tmp.4 +} diff --git a/test/Transforms/InstCombine/2005-06-16-RangeCrash.ll b/test/Transforms/InstCombine/2005-06-16-RangeCrash.ll new file mode 100644 index 0000000..ef44301 --- /dev/null +++ b/test/Transforms/InstCombine/2005-06-16-RangeCrash.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; PR585 +bool %test() { + %tmp.26 = div int 0, -2147483648 ; <int> [#uses=1] + %tmp.27 = seteq int %tmp.26, 0 ; <bool> [#uses=1] + ret bool %tmp.27 +} diff --git a/test/Transforms/InstCombine/2005-06-16-SetCCOrSetCCMiscompile.ll b/test/Transforms/InstCombine/2005-06-16-SetCCOrSetCCMiscompile.ll new file mode 100644 index 0000000..764b035 --- /dev/null +++ b/test/Transforms/InstCombine/2005-06-16-SetCCOrSetCCMiscompile.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i1 true} +; PR586 + +%g_07918478 = external global uint ; <uint*> [#uses=1] + +implementation ; Functions: + +bool %test() { + %tmp.0 = load uint* %g_07918478 ; <uint> [#uses=2] + %tmp.1 = setne uint %tmp.0, 0 ; <bool> [#uses=1] + %tmp.4 = setlt uint %tmp.0, 4111 ; <bool> [#uses=1] + %bothcond = or bool %tmp.1, %tmp.4 ; <bool> [#uses=1] + ret bool %bothcond +} + diff --git a/test/Transforms/InstCombine/2005-07-07-DeadPHILoop.ll b/test/Transforms/InstCombine/2005-07-07-DeadPHILoop.ll new file mode 100644 index 0000000..be9837d --- /dev/null +++ b/test/Transforms/InstCombine/2005-07-07-DeadPHILoop.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +; This example caused instcombine to spin into an infinite loop. + +void %test(int *%P) { + ret void +Dead: + %X = phi int [%Y, %Dead] + %Y = div int %X, 10 + store int %Y, int* %P + br label %Dead +} + diff --git a/test/Transforms/InstCombine/2006-02-07-SextZextCrash.ll b/test/Transforms/InstCombine/2006-02-07-SextZextCrash.ll new file mode 100644 index 0000000..e06dca9 --- /dev/null +++ b/test/Transforms/InstCombine/2006-02-07-SextZextCrash.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + + %struct.rtx_const = type { uint, { %union.real_extract } } + %struct.rtx_def = type { int, [1 x %union.rtunion_def] } + %union.real_extract = type { double } + %union.rtunion_def = type { uint } + +implementation ; Functions: + +fastcc void %decode_rtx_const(%struct.rtx_def* %x, %struct.rtx_const* %value) { + %tmp.54 = getelementptr %struct.rtx_const* %value, int 0, uint 0 ; <uint*> [#uses=1] + %tmp.56 = getelementptr %struct.rtx_def* %x, int 0, uint 0 ; <int*> [#uses=1] + %tmp.57 = load int* %tmp.56 ; <int> [#uses=1] + %tmp.58 = shl int %tmp.57, ubyte 8 ; <int> [#uses=1] + %tmp.59 = shr int %tmp.58, ubyte 24 ; <int> [#uses=1] + %tmp.60 = cast int %tmp.59 to ushort ; <ushort> [#uses=1] + %tmp.61 = cast ushort %tmp.60 to uint ; <uint> [#uses=1] + %tmp.62 = shl uint %tmp.61, ubyte 16 ; <uint> [#uses=1] + %tmp.65 = or uint 0, %tmp.62 ; <uint> [#uses=1] + store uint %tmp.65, uint* %tmp.54 + ret void +} diff --git a/test/Transforms/InstCombine/2006-02-13-DemandedMiscompile.ll b/test/Transforms/InstCombine/2006-02-13-DemandedMiscompile.ll new file mode 100644 index 0000000..73ad700 --- /dev/null +++ b/test/Transforms/InstCombine/2006-02-13-DemandedMiscompile.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep undef + +int %test(sbyte %A) { + %B = cast sbyte %A to int + %C = shr int %B, ubyte 8 + ret int %C +} + diff --git a/test/Transforms/InstCombine/2006-02-28-Crash.ll b/test/Transforms/InstCombine/2006-02-28-Crash.ll new file mode 100644 index 0000000..241c254 --- /dev/null +++ b/test/Transforms/InstCombine/2006-02-28-Crash.ll @@ -0,0 +1,6 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +int %test() { + %tmp203 = seteq uint 1, 2 ; <bool> [#uses=1] + %tmp203 = cast bool %tmp203 to int ; <int> [#uses=1] + ret int %tmp203 +} diff --git a/test/Transforms/InstCombine/2006-03-30-ExtractElement.ll b/test/Transforms/InstCombine/2006-03-30-ExtractElement.ll new file mode 100644 index 0000000..3149460 --- /dev/null +++ b/test/Transforms/InstCombine/2006-03-30-ExtractElement.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output + +float %test(<4 x float> %V) { + %V2 = insertelement <4 x float> %V, float 1.0, uint 3 + %R = extractelement <4 x float> %V2, uint 2 + ret float %R +} diff --git a/test/Transforms/InstCombine/2006-04-01-InfLoop.ll b/test/Transforms/InstCombine/2006-04-01-InfLoop.ll new file mode 100644 index 0000000..81c1690 --- /dev/null +++ b/test/Transforms/InstCombine/2006-04-01-InfLoop.ll @@ -0,0 +1,442 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; END. + + %struct.DecRefPicMarking_s = type { int, int, int, int, int, %struct.DecRefPicMarking_s* } + %struct.datapartition = type { %typedef.Bitstream*, %typedef.DecodingEnvironment, int (%struct.syntaxelement*, %struct.img_par*, %struct.inp_par*, %struct.datapartition*)* } + %struct.img_par = type { int, uint, uint, int, int*, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, [16 x [16 x ushort]], [6 x [32 x int]], [16 x [16 x int]], [4 x [12 x [4 x [4 x int]]]], [16 x int], int**, int*, int***, int**, int, int, int, int, %typedef.Slice*, %struct.macroblock*, int, int, int, int, int, int, int**, %struct.DecRefPicMarking_s*, int, int, int, int, int, int, int, uint, int, int, int, uint, uint, uint, uint, int, [3 x int], int, uint, int, uint, int, int, int, uint, uint, int, int, int, int, uint, uint, int***, int***, int****, int, int, uint, int, int, int, int, uint, uint, uint, uint, uint, uint, uint, int, int, int, int, int, int, int, int, int, int, int, uint, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, %struct.timeb, %struct.timeb, int, int, int, int, int, uint, int, int } + %struct.inp_par = type { [100 x sbyte], [100 x sbyte], [100 x sbyte], int, int, int, int, int, int, int } + %struct.macroblock = type { int, int, int, %struct.macroblock*, %struct.macroblock*, int, [2 x [4 x [4 x [2 x int]]]], int, long, long, int, int, [4 x int], [4 x int], int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int } + %struct.pix_pos = type { int, int, int, int, int, int } + %struct.storable_picture = type { uint, int, int, int, int, [50 x [6 x [33 x long]]], [50 x [6 x [33 x long]]], [50 x [6 x [33 x long]]], [50 x [6 x [33 x long]]], uint, int, int, int, int, int, int, int, short, int, int, int, int, int, int, int, uint, uint, ushort**, ushort***, ubyte*, short**, sbyte***, long***, long***, short****, ubyte**, ubyte**, %struct.storable_picture*, %struct.storable_picture*, %struct.storable_picture*, int, int, int, int, int, int, int, int, int, int, int, int, int, [2 x int], int, %struct.DecRefPicMarking_s*, int } + %struct.syntaxelement = type { int, int, int, int, int, uint, int, int, void (int, int, int*, int*)*, void (%struct.syntaxelement*, %struct.inp_par*, %struct.img_par*, %typedef.DecodingEnvironment*)* } + %struct.timeb = type { int, ushort, short, short } + %typedef.BiContextType = type { ushort, ubyte } + %typedef.Bitstream = type { int, int, int, int, ubyte*, int } + %typedef.DecodingEnvironment = type { uint, uint, uint, uint, int, ubyte*, int* } + %typedef.MotionInfoContexts = type { [4 x [11 x %typedef.BiContextType]], [2 x [9 x %typedef.BiContextType]], [2 x [10 x %typedef.BiContextType]], [2 x [6 x %typedef.BiContextType]], [4 x %typedef.BiContextType], [4 x %typedef.BiContextType], [3 x %typedef.BiContextType] } + %typedef.Slice = type { int, int, int, int, uint, int, int, int, int, %struct.datapartition*, %typedef.MotionInfoContexts*, %typedef.TextureInfoContexts*, int, int*, int*, int*, int, int*, int*, int*, int (%struct.img_par*, %struct.inp_par*)*, int, int, int, int } + %typedef.TextureInfoContexts = type { [2 x %typedef.BiContextType], [4 x %typedef.BiContextType], [3 x [4 x %typedef.BiContextType]], [10 x [4 x %typedef.BiContextType]], [10 x [15 x %typedef.BiContextType]], [10 x [15 x %typedef.BiContextType]], [10 x [5 x %typedef.BiContextType]], [10 x [5 x %typedef.BiContextType]], [10 x [15 x %typedef.BiContextType]], [10 x [15 x %typedef.BiContextType]] } +%dec_picture = external global %struct.storable_picture* ; <%struct.storable_picture**> [#uses=1] +%last_dquant = external global int ; <int*> [#uses=1] + +implementation ; Functions: + +void %readCBP_CABAC(%struct.syntaxelement* %se, %struct.inp_par* %inp, %struct.img_par* %img.1, %typedef.DecodingEnvironment* %dep_dp) { +entry: + %block_a = alloca %struct.pix_pos ; <%struct.pix_pos*> [#uses=5] + %tmp.1 = getelementptr %struct.img_par* %img.1, int 0, uint 37 ; <%typedef.Slice**> [#uses=1] + %tmp.2 = load %typedef.Slice** %tmp.1 ; <%typedef.Slice*> [#uses=1] + %tmp.3 = getelementptr %typedef.Slice* %tmp.2, int 0, uint 11 ; <%typedef.TextureInfoContexts**> [#uses=1] + %tmp.4 = load %typedef.TextureInfoContexts** %tmp.3 ; <%typedef.TextureInfoContexts*> [#uses=3] + %tmp.6 = getelementptr %struct.img_par* %img.1, int 0, uint 38 ; <%struct.macroblock**> [#uses=1] + %tmp.7 = load %struct.macroblock** %tmp.6 ; <%struct.macroblock*> [#uses=1] + %tmp.9 = getelementptr %struct.img_par* %img.1, int 0, uint 1 ; <uint*> [#uses=1] + %tmp.10 = load uint* %tmp.9 ; <uint> [#uses=1] + %tmp.11 = cast uint %tmp.10 to int ; <int> [#uses=1] + %tmp.12 = getelementptr %struct.macroblock* %tmp.7, int %tmp.11 ; <%struct.macroblock*> [#uses=18] + br label %loopentry.0 + +loopentry.0: ; preds = %loopexit.1, %entry + %mask.1 = phi int [ undef, %entry ], [ %mask.0, %loopexit.1 ] ; <int> [#uses=1] + %cbp_bit.1 = phi int [ undef, %entry ], [ %cbp_bit.0, %loopexit.1 ] ; <int> [#uses=1] + %cbp.2 = phi int [ 0, %entry ], [ %cbp.1, %loopexit.1 ] ; <int> [#uses=5] + %curr_cbp_ctx.1 = phi int [ undef, %entry ], [ %curr_cbp_ctx.0, %loopexit.1 ] ; <int> [#uses=1] + %b.2 = phi int [ undef, %entry ], [ %b.1, %loopexit.1 ] ; <int> [#uses=1] + %a.2 = phi int [ undef, %entry ], [ %a.1, %loopexit.1 ] ; <int> [#uses=1] + %mb_y.0 = phi int [ 0, %entry ], [ %tmp.152, %loopexit.1 ] ; <int> [#uses=7] + %mb_x.0 = phi int [ undef, %entry ], [ %mb_x.1, %loopexit.1 ] ; <int> [#uses=0] + %tmp.14 = setle int %mb_y.0, 3 ; <bool> [#uses=2] + %tmp.15 = cast bool %tmp.14 to int ; <int> [#uses=0] + br bool %tmp.14, label %no_exit.0, label %loopexit.0 + +no_exit.0: ; preds = %loopentry.0 + br label %loopentry.1 + +loopentry.1: ; preds = %endif.7, %no_exit.0 + %mask.0 = phi int [ %mask.1, %no_exit.0 ], [ %tmp.131, %endif.7 ] ; <int> [#uses=1] + %cbp_bit.0 = phi int [ %cbp_bit.1, %no_exit.0 ], [ %tmp.142, %endif.7 ] ; <int> [#uses=1] + %cbp.1 = phi int [ %cbp.2, %no_exit.0 ], [ %cbp.0, %endif.7 ] ; <int> [#uses=5] + %curr_cbp_ctx.0 = phi int [ %curr_cbp_ctx.1, %no_exit.0 ], [ %tmp.125, %endif.7 ] ; <int> [#uses=1] + %b.1 = phi int [ %b.2, %no_exit.0 ], [ %b.0, %endif.7 ] ; <int> [#uses=1] + %a.1 = phi int [ %a.2, %no_exit.0 ], [ %a.0, %endif.7 ] ; <int> [#uses=1] + %mb_x.1 = phi int [ 0, %no_exit.0 ], [ %tmp.150, %endif.7 ] ; <int> [#uses=9] + %tmp.17 = setle int %mb_x.1, 3 ; <bool> [#uses=2] + %tmp.18 = cast bool %tmp.17 to int ; <int> [#uses=0] + br bool %tmp.17, label %no_exit.1, label %loopexit.1 + +no_exit.1: ; preds = %loopentry.1 + %tmp.20 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 12 ; <[4 x int]*> [#uses=1] + %tmp.22 = div int %mb_x.1, 2 ; <int> [#uses=1] + %tmp.24 = add int %tmp.22, %mb_y.0 ; <int> [#uses=1] + %tmp.25 = getelementptr [4 x int]* %tmp.20, int 0, int %tmp.24 ; <int*> [#uses=1] + %tmp.26 = load int* %tmp.25 ; <int> [#uses=1] + %tmp.27 = seteq int %tmp.26, 11 ; <bool> [#uses=2] + %tmp.28 = cast bool %tmp.27 to int ; <int> [#uses=0] + br bool %tmp.27, label %then.0, label %else.0 + +then.0: ; preds = %no_exit.1 + br label %endif.0 + +else.0: ; preds = %no_exit.1 + br label %endif.0 + +endif.0: ; preds = %else.0, %then.0 + %tmp.30 = seteq int %mb_y.0, 0 ; <bool> [#uses=2] + %tmp.31 = cast bool %tmp.30 to int ; <int> [#uses=0] + br bool %tmp.30, label %then.1, label %else.1 + +then.1: ; preds = %endif.0 + %tmp.33 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.34 = load %struct.macroblock** %tmp.33 ; <%struct.macroblock*> [#uses=1] + %tmp.35 = cast %struct.macroblock* %tmp.34 to sbyte* ; <sbyte*> [#uses=1] + %tmp.36 = seteq sbyte* %tmp.35, null ; <bool> [#uses=2] + %tmp.37 = cast bool %tmp.36 to int ; <int> [#uses=0] + br bool %tmp.36, label %then.2, label %else.2 + +then.2: ; preds = %then.1 + br label %endif.1 + +else.2: ; preds = %then.1 + %tmp.39 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.40 = load %struct.macroblock** %tmp.39 ; <%struct.macroblock*> [#uses=1] + %tmp.41 = getelementptr %struct.macroblock* %tmp.40, int 0, uint 5 ; <int*> [#uses=1] + %tmp.42 = load int* %tmp.41 ; <int> [#uses=1] + %tmp.43 = seteq int %tmp.42, 14 ; <bool> [#uses=2] + %tmp.44 = cast bool %tmp.43 to int ; <int> [#uses=0] + br bool %tmp.43, label %then.3, label %else.3 + +then.3: ; preds = %else.2 + br label %endif.1 + +else.3: ; preds = %else.2 + %tmp.46 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.47 = load %struct.macroblock** %tmp.46 ; <%struct.macroblock*> [#uses=1] + %tmp.48 = getelementptr %struct.macroblock* %tmp.47, int 0, uint 7 ; <int*> [#uses=1] + %tmp.49 = load int* %tmp.48 ; <int> [#uses=1] + %tmp.51 = div int %mb_x.1, 2 ; <int> [#uses=1] + %tmp.52 = add int %tmp.51, 2 ; <int> [#uses=1] + %tmp.53 = cast int %tmp.52 to ubyte ; <ubyte> [#uses=1] + %tmp.54 = shr int %tmp.49, ubyte %tmp.53 ; <int> [#uses=1] + %tmp.55 = cast int %tmp.54 to uint ; <uint> [#uses=1] + %tmp.57 = xor uint %tmp.55, 1 ; <uint> [#uses=1] + %tmp.58 = cast uint %tmp.57 to int ; <int> [#uses=1] + %tmp.59 = and int %tmp.58, 1 ; <int> [#uses=1] + br label %endif.1 + +else.1: ; preds = %endif.0 + %tmp.62 = div int %mb_x.1, 2 ; <int> [#uses=1] + %tmp.63 = cast int %tmp.62 to ubyte ; <ubyte> [#uses=1] + %tmp.64 = shr int %cbp.1, ubyte %tmp.63 ; <int> [#uses=1] + %tmp.65 = cast int %tmp.64 to uint ; <uint> [#uses=1] + %tmp.67 = xor uint %tmp.65, 1 ; <uint> [#uses=1] + %tmp.68 = cast uint %tmp.67 to int ; <int> [#uses=1] + %tmp.69 = and int %tmp.68, 1 ; <int> [#uses=1] + br label %endif.1 + +endif.1: ; preds = %else.1, %else.3, %then.3, %then.2 + %b.0 = phi int [ 0, %then.2 ], [ 0, %then.3 ], [ %tmp.59, %else.3 ], [ %tmp.69, %else.1 ] ; <int> [#uses=2] + %tmp.71 = seteq int %mb_x.1, 0 ; <bool> [#uses=2] + %tmp.72 = cast bool %tmp.71 to int ; <int> [#uses=0] + br bool %tmp.71, label %then.4, label %else.4 + +then.4: ; preds = %endif.1 + %tmp.74 = getelementptr %struct.img_par* %img.1, int 0, uint 1 ; <uint*> [#uses=1] + %tmp.75 = load uint* %tmp.74 ; <uint> [#uses=1] + %tmp.76 = cast uint %tmp.75 to int ; <int> [#uses=1] + call void %getLuma4x4Neighbour( int %tmp.76, int %mb_x.1, int %mb_y.0, int -1, int 0, %struct.pix_pos* %block_a ) + %tmp.79 = getelementptr %struct.pix_pos* %block_a, int 0, uint 0 ; <int*> [#uses=1] + %tmp.80 = load int* %tmp.79 ; <int> [#uses=1] + %tmp.81 = setne int %tmp.80, 0 ; <bool> [#uses=2] + %tmp.82 = cast bool %tmp.81 to int ; <int> [#uses=0] + br bool %tmp.81, label %then.5, label %else.5 + +then.5: ; preds = %then.4 + %tmp.84 = getelementptr %struct.img_par* %img.1, int 0, uint 38 ; <%struct.macroblock**> [#uses=1] + %tmp.85 = load %struct.macroblock** %tmp.84 ; <%struct.macroblock*> [#uses=1] + %tmp.86 = getelementptr %struct.pix_pos* %block_a, int 0, uint 1 ; <int*> [#uses=1] + %tmp.87 = load int* %tmp.86 ; <int> [#uses=1] + %tmp.88 = getelementptr %struct.macroblock* %tmp.85, int %tmp.87 ; <%struct.macroblock*> [#uses=1] + %tmp.89 = getelementptr %struct.macroblock* %tmp.88, int 0, uint 5 ; <int*> [#uses=1] + %tmp.90 = load int* %tmp.89 ; <int> [#uses=1] + %tmp.91 = seteq int %tmp.90, 14 ; <bool> [#uses=2] + %tmp.92 = cast bool %tmp.91 to int ; <int> [#uses=0] + br bool %tmp.91, label %then.6, label %else.6 + +then.6: ; preds = %then.5 + br label %endif.4 + +else.6: ; preds = %then.5 + %tmp.94 = getelementptr %struct.img_par* %img.1, int 0, uint 38 ; <%struct.macroblock**> [#uses=1] + %tmp.95 = load %struct.macroblock** %tmp.94 ; <%struct.macroblock*> [#uses=1] + %tmp.96 = getelementptr %struct.pix_pos* %block_a, int 0, uint 1 ; <int*> [#uses=1] + %tmp.97 = load int* %tmp.96 ; <int> [#uses=1] + %tmp.98 = getelementptr %struct.macroblock* %tmp.95, int %tmp.97 ; <%struct.macroblock*> [#uses=1] + %tmp.99 = getelementptr %struct.macroblock* %tmp.98, int 0, uint 7 ; <int*> [#uses=1] + %tmp.100 = load int* %tmp.99 ; <int> [#uses=1] + %tmp.101 = getelementptr %struct.pix_pos* %block_a, int 0, uint 3 ; <int*> [#uses=1] + %tmp.102 = load int* %tmp.101 ; <int> [#uses=1] + %tmp.103 = div int %tmp.102, 2 ; <int> [#uses=1] + %tmp.104 = mul int %tmp.103, 2 ; <int> [#uses=1] + %tmp.105 = add int %tmp.104, 1 ; <int> [#uses=1] + %tmp.106 = cast int %tmp.105 to ubyte ; <ubyte> [#uses=1] + %tmp.107 = shr int %tmp.100, ubyte %tmp.106 ; <int> [#uses=1] + %tmp.108 = cast int %tmp.107 to uint ; <uint> [#uses=1] + %tmp.110 = xor uint %tmp.108, 1 ; <uint> [#uses=1] + %tmp.111 = cast uint %tmp.110 to int ; <int> [#uses=1] + %tmp.112 = and int %tmp.111, 1 ; <int> [#uses=1] + br label %endif.4 + +else.5: ; preds = %then.4 + br label %endif.4 + +else.4: ; preds = %endif.1 + %tmp.115 = cast int %mb_y.0 to ubyte ; <ubyte> [#uses=1] + %tmp.116 = shr int %cbp.1, ubyte %tmp.115 ; <int> [#uses=1] + %tmp.117 = cast int %tmp.116 to uint ; <uint> [#uses=1] + %tmp.119 = xor uint %tmp.117, 1 ; <uint> [#uses=1] + %tmp.120 = cast uint %tmp.119 to int ; <int> [#uses=1] + %tmp.121 = and int %tmp.120, 1 ; <int> [#uses=1] + br label %endif.4 + +endif.4: ; preds = %else.4, %else.5, %else.6, %then.6 + %a.0 = phi int [ 0, %then.6 ], [ %tmp.112, %else.6 ], [ 0, %else.5 ], [ %tmp.121, %else.4 ] ; <int> [#uses=2] + %tmp.123 = mul int %b.0, 2 ; <int> [#uses=1] + %tmp.125 = add int %tmp.123, %a.0 ; <int> [#uses=2] + %tmp.127 = div int %mb_x.1, 2 ; <int> [#uses=1] + %tmp.129 = add int %tmp.127, %mb_y.0 ; <int> [#uses=1] + %tmp.130 = cast int %tmp.129 to ubyte ; <ubyte> [#uses=1] + %tmp.131 = shl int 1, ubyte %tmp.130 ; <int> [#uses=2] + %tmp.135 = getelementptr %typedef.TextureInfoContexts* %tmp.4, int 0, uint 2 ; <[3 x [4 x %typedef.BiContextType]]*> [#uses=1] + %tmp.136 = getelementptr [3 x [4 x %typedef.BiContextType]]* %tmp.135, int 0, int 0 ; <[4 x %typedef.BiContextType]*> [#uses=1] + %tmp.137 = getelementptr [4 x %typedef.BiContextType]* %tmp.136, int 0, int 0 ; <%typedef.BiContextType*> [#uses=1] + %tmp.139 = cast int %tmp.125 to uint ; <uint> [#uses=1] + %tmp.140 = cast uint %tmp.139 to int ; <int> [#uses=1] + %tmp.141 = getelementptr %typedef.BiContextType* %tmp.137, int %tmp.140 ; <%typedef.BiContextType*> [#uses=1] + %tmp.132 = call uint %biari_decode_symbol( %typedef.DecodingEnvironment* %dep_dp, %typedef.BiContextType* %tmp.141 ) ; <uint> [#uses=1] + %tmp.142 = cast uint %tmp.132 to int ; <int> [#uses=2] + %tmp.144 = setne int %tmp.142, 0 ; <bool> [#uses=2] + %tmp.145 = cast bool %tmp.144 to int ; <int> [#uses=0] + br bool %tmp.144, label %then.7, label %endif.7 + +then.7: ; preds = %endif.4 + %tmp.148 = add int %cbp.1, %tmp.131 ; <int> [#uses=1] + br label %endif.7 + +endif.7: ; preds = %then.7, %endif.4 + %cbp.0 = phi int [ %tmp.148, %then.7 ], [ %cbp.1, %endif.4 ] ; <int> [#uses=1] + %tmp.150 = add int %mb_x.1, 2 ; <int> [#uses=1] + br label %loopentry.1 + +loopexit.1: ; preds = %loopentry.1 + %tmp.152 = add int %mb_y.0, 2 ; <int> [#uses=1] + br label %loopentry.0 + +loopexit.0: ; preds = %loopentry.0 + %tmp.153 = load %struct.storable_picture** %dec_picture ; <%struct.storable_picture*> [#uses=1] + %tmp.154 = getelementptr %struct.storable_picture* %tmp.153, int 0, uint 45 ; <int*> [#uses=1] + %tmp.155 = load int* %tmp.154 ; <int> [#uses=1] + %tmp.156 = setne int %tmp.155, 0 ; <bool> [#uses=2] + %tmp.157 = cast bool %tmp.156 to int ; <int> [#uses=0] + br bool %tmp.156, label %then.8, label %endif.8 + +then.8: ; preds = %loopexit.0 + %tmp.159 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.160 = load %struct.macroblock** %tmp.159 ; <%struct.macroblock*> [#uses=1] + %tmp.161 = cast %struct.macroblock* %tmp.160 to sbyte* ; <sbyte*> [#uses=1] + %tmp.162 = setne sbyte* %tmp.161, null ; <bool> [#uses=2] + %tmp.163 = cast bool %tmp.162 to int ; <int> [#uses=0] + br bool %tmp.162, label %then.9, label %endif.9 + +then.9: ; preds = %then.8 + %tmp.165 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.166 = load %struct.macroblock** %tmp.165 ; <%struct.macroblock*> [#uses=1] + %tmp.167 = getelementptr %struct.macroblock* %tmp.166, int 0, uint 5 ; <int*> [#uses=1] + %tmp.168 = load int* %tmp.167 ; <int> [#uses=1] + %tmp.169 = seteq int %tmp.168, 14 ; <bool> [#uses=2] + %tmp.170 = cast bool %tmp.169 to int ; <int> [#uses=0] + br bool %tmp.169, label %then.10, label %else.7 + +then.10: ; preds = %then.9 + br label %endif.9 + +else.7: ; preds = %then.9 + %tmp.172 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.173 = load %struct.macroblock** %tmp.172 ; <%struct.macroblock*> [#uses=1] + %tmp.174 = getelementptr %struct.macroblock* %tmp.173, int 0, uint 7 ; <int*> [#uses=1] + %tmp.175 = load int* %tmp.174 ; <int> [#uses=1] + %tmp.176 = setgt int %tmp.175, 15 ; <bool> [#uses=1] + %tmp.177 = cast bool %tmp.176 to int ; <int> [#uses=1] + br label %endif.9 + +endif.9: ; preds = %else.7, %then.10, %then.8 + %b.4 = phi int [ 1, %then.10 ], [ %tmp.177, %else.7 ], [ 0, %then.8 ] ; <int> [#uses=1] + %tmp.179 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.180 = load %struct.macroblock** %tmp.179 ; <%struct.macroblock*> [#uses=1] + %tmp.181 = cast %struct.macroblock* %tmp.180 to sbyte* ; <sbyte*> [#uses=1] + %tmp.182 = setne sbyte* %tmp.181, null ; <bool> [#uses=2] + %tmp.183 = cast bool %tmp.182 to int ; <int> [#uses=0] + br bool %tmp.182, label %then.11, label %endif.11 + +then.11: ; preds = %endif.9 + %tmp.185 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.186 = load %struct.macroblock** %tmp.185 ; <%struct.macroblock*> [#uses=1] + %tmp.187 = getelementptr %struct.macroblock* %tmp.186, int 0, uint 5 ; <int*> [#uses=1] + %tmp.188 = load int* %tmp.187 ; <int> [#uses=1] + %tmp.189 = seteq int %tmp.188, 14 ; <bool> [#uses=2] + %tmp.190 = cast bool %tmp.189 to int ; <int> [#uses=0] + br bool %tmp.189, label %then.12, label %else.8 + +then.12: ; preds = %then.11 + br label %endif.11 + +else.8: ; preds = %then.11 + %tmp.192 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.193 = load %struct.macroblock** %tmp.192 ; <%struct.macroblock*> [#uses=1] + %tmp.194 = getelementptr %struct.macroblock* %tmp.193, int 0, uint 7 ; <int*> [#uses=1] + %tmp.195 = load int* %tmp.194 ; <int> [#uses=1] + %tmp.196 = setgt int %tmp.195, 15 ; <bool> [#uses=1] + %tmp.197 = cast bool %tmp.196 to int ; <int> [#uses=1] + br label %endif.11 + +endif.11: ; preds = %else.8, %then.12, %endif.9 + %a.4 = phi int [ 1, %then.12 ], [ %tmp.197, %else.8 ], [ 0, %endif.9 ] ; <int> [#uses=1] + %tmp.199 = mul int %b.4, 2 ; <int> [#uses=1] + %tmp.201 = add int %tmp.199, %a.4 ; <int> [#uses=1] + %tmp.205 = getelementptr %typedef.TextureInfoContexts* %tmp.4, int 0, uint 2 ; <[3 x [4 x %typedef.BiContextType]]*> [#uses=1] + %tmp.206 = getelementptr [3 x [4 x %typedef.BiContextType]]* %tmp.205, int 0, int 1 ; <[4 x %typedef.BiContextType]*> [#uses=1] + %tmp.207 = getelementptr [4 x %typedef.BiContextType]* %tmp.206, int 0, int 0 ; <%typedef.BiContextType*> [#uses=1] + %tmp.209 = cast int %tmp.201 to uint ; <uint> [#uses=1] + %tmp.210 = cast uint %tmp.209 to int ; <int> [#uses=1] + %tmp.211 = getelementptr %typedef.BiContextType* %tmp.207, int %tmp.210 ; <%typedef.BiContextType*> [#uses=1] + %tmp.202 = call uint %biari_decode_symbol( %typedef.DecodingEnvironment* %dep_dp, %typedef.BiContextType* %tmp.211 ) ; <uint> [#uses=1] + %tmp.212 = cast uint %tmp.202 to int ; <int> [#uses=1] + %tmp.214 = setne int %tmp.212, 0 ; <bool> [#uses=2] + %tmp.215 = cast bool %tmp.214 to int ; <int> [#uses=0] + br bool %tmp.214, label %then.13, label %endif.8 + +then.13: ; preds = %endif.11 + %tmp.217 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.218 = load %struct.macroblock** %tmp.217 ; <%struct.macroblock*> [#uses=1] + %tmp.219 = cast %struct.macroblock* %tmp.218 to sbyte* ; <sbyte*> [#uses=1] + %tmp.220 = setne sbyte* %tmp.219, null ; <bool> [#uses=2] + %tmp.221 = cast bool %tmp.220 to int ; <int> [#uses=0] + br bool %tmp.220, label %then.14, label %endif.14 + +then.14: ; preds = %then.13 + %tmp.223 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.224 = load %struct.macroblock** %tmp.223 ; <%struct.macroblock*> [#uses=1] + %tmp.225 = getelementptr %struct.macroblock* %tmp.224, int 0, uint 5 ; <int*> [#uses=1] + %tmp.226 = load int* %tmp.225 ; <int> [#uses=1] + %tmp.227 = seteq int %tmp.226, 14 ; <bool> [#uses=2] + %tmp.228 = cast bool %tmp.227 to int ; <int> [#uses=0] + br bool %tmp.227, label %then.15, label %else.9 + +then.15: ; preds = %then.14 + br label %endif.14 + +else.9: ; preds = %then.14 + %tmp.230 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.231 = load %struct.macroblock** %tmp.230 ; <%struct.macroblock*> [#uses=1] + %tmp.232 = getelementptr %struct.macroblock* %tmp.231, int 0, uint 7 ; <int*> [#uses=1] + %tmp.233 = load int* %tmp.232 ; <int> [#uses=1] + %tmp.234 = setgt int %tmp.233, 15 ; <bool> [#uses=2] + %tmp.235 = cast bool %tmp.234 to int ; <int> [#uses=0] + br bool %tmp.234, label %then.16, label %endif.14 + +then.16: ; preds = %else.9 + %tmp.237 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 3 ; <%struct.macroblock**> [#uses=1] + %tmp.238 = load %struct.macroblock** %tmp.237 ; <%struct.macroblock*> [#uses=1] + %tmp.239 = getelementptr %struct.macroblock* %tmp.238, int 0, uint 7 ; <int*> [#uses=1] + %tmp.240 = load int* %tmp.239 ; <int> [#uses=1] + %tmp.242 = shr int %tmp.240, ubyte 4 ; <int> [#uses=1] + %tmp.243 = seteq int %tmp.242, 2 ; <bool> [#uses=1] + %tmp.244 = cast bool %tmp.243 to int ; <int> [#uses=1] + br label %endif.14 + +endif.14: ; preds = %then.16, %else.9, %then.15, %then.13 + %b.5 = phi int [ 1, %then.15 ], [ %tmp.244, %then.16 ], [ 0, %else.9 ], [ 0, %then.13 ] ; <int> [#uses=1] + %tmp.246 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.247 = load %struct.macroblock** %tmp.246 ; <%struct.macroblock*> [#uses=1] + %tmp.248 = cast %struct.macroblock* %tmp.247 to sbyte* ; <sbyte*> [#uses=1] + %tmp.249 = setne sbyte* %tmp.248, null ; <bool> [#uses=2] + %tmp.250 = cast bool %tmp.249 to int ; <int> [#uses=0] + br bool %tmp.249, label %then.17, label %endif.17 + +then.17: ; preds = %endif.14 + %tmp.252 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.253 = load %struct.macroblock** %tmp.252 ; <%struct.macroblock*> [#uses=1] + %tmp.254 = getelementptr %struct.macroblock* %tmp.253, int 0, uint 5 ; <int*> [#uses=1] + %tmp.255 = load int* %tmp.254 ; <int> [#uses=1] + %tmp.256 = seteq int %tmp.255, 14 ; <bool> [#uses=2] + %tmp.257 = cast bool %tmp.256 to int ; <int> [#uses=0] + br bool %tmp.256, label %then.18, label %else.10 + +then.18: ; preds = %then.17 + br label %endif.17 + +else.10: ; preds = %then.17 + %tmp.259 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.260 = load %struct.macroblock** %tmp.259 ; <%struct.macroblock*> [#uses=1] + %tmp.261 = getelementptr %struct.macroblock* %tmp.260, int 0, uint 7 ; <int*> [#uses=1] + %tmp.262 = load int* %tmp.261 ; <int> [#uses=1] + %tmp.263 = setgt int %tmp.262, 15 ; <bool> [#uses=2] + %tmp.264 = cast bool %tmp.263 to int ; <int> [#uses=0] + br bool %tmp.263, label %then.19, label %endif.17 + +then.19: ; preds = %else.10 + %tmp.266 = getelementptr %struct.macroblock* %tmp.12, int 0, uint 4 ; <%struct.macroblock**> [#uses=1] + %tmp.267 = load %struct.macroblock** %tmp.266 ; <%struct.macroblock*> [#uses=1] + %tmp.268 = getelementptr %struct.macroblock* %tmp.267, int 0, uint 7 ; <int*> [#uses=1] + %tmp.269 = load int* %tmp.268 ; <int> [#uses=1] + %tmp.271 = shr int %tmp.269, ubyte 4 ; <int> [#uses=1] + %tmp.272 = seteq int %tmp.271, 2 ; <bool> [#uses=1] + %tmp.273 = cast bool %tmp.272 to int ; <int> [#uses=1] + br label %endif.17 + +endif.17: ; preds = %then.19, %else.10, %then.18, %endif.14 + %a.5 = phi int [ 1, %then.18 ], [ %tmp.273, %then.19 ], [ 0, %else.10 ], [ 0, %endif.14 ] ; <int> [#uses=1] + %tmp.275 = mul int %b.5, 2 ; <int> [#uses=1] + %tmp.277 = add int %tmp.275, %a.5 ; <int> [#uses=1] + %tmp.281 = getelementptr %typedef.TextureInfoContexts* %tmp.4, int 0, uint 2 ; <[3 x [4 x %typedef.BiContextType]]*> [#uses=1] + %tmp.282 = getelementptr [3 x [4 x %typedef.BiContextType]]* %tmp.281, int 0, int 2 ; <[4 x %typedef.BiContextType]*> [#uses=1] + %tmp.283 = getelementptr [4 x %typedef.BiContextType]* %tmp.282, int 0, int 0 ; <%typedef.BiContextType*> [#uses=1] + %tmp.285 = cast int %tmp.277 to uint ; <uint> [#uses=1] + %tmp.286 = cast uint %tmp.285 to int ; <int> [#uses=1] + %tmp.287 = getelementptr %typedef.BiContextType* %tmp.283, int %tmp.286 ; <%typedef.BiContextType*> [#uses=1] + %tmp.278 = call uint %biari_decode_symbol( %typedef.DecodingEnvironment* %dep_dp, %typedef.BiContextType* %tmp.287 ) ; <uint> [#uses=1] + %tmp.288 = cast uint %tmp.278 to int ; <int> [#uses=1] + %tmp.290 = seteq int %tmp.288, 1 ; <bool> [#uses=2] + %tmp.291 = cast bool %tmp.290 to int ; <int> [#uses=0] + br bool %tmp.290, label %cond_true, label %cond_false + +cond_true: ; preds = %endif.17 + %tmp.293 = add int %cbp.2, 32 ; <int> [#uses=1] + br label %cond_continue + +cond_false: ; preds = %endif.17 + %tmp.295 = add int %cbp.2, 16 ; <int> [#uses=1] + br label %cond_continue + +cond_continue: ; preds = %cond_false, %cond_true + %mem_tmp.0 = phi int [ %tmp.293, %cond_true ], [ %tmp.295, %cond_false ] ; <int> [#uses=1] + br label %endif.8 + +endif.8: ; preds = %cond_continue, %endif.11, %loopexit.0 + %cbp.3 = phi int [ %mem_tmp.0, %cond_continue ], [ %cbp.2, %endif.11 ], [ %cbp.2, %loopexit.0 ] ; <int> [#uses=2] + %tmp.298 = getelementptr %struct.syntaxelement* %se, int 0, uint 1 ; <int*> [#uses=1] + store int %cbp.3, int* %tmp.298 + %tmp.301 = seteq int %cbp.3, 0 ; <bool> [#uses=2] + %tmp.302 = cast bool %tmp.301 to int ; <int> [#uses=0] + br bool %tmp.301, label %then.20, label %return + +then.20: ; preds = %endif.8 + store int 0, int* %last_dquant + ret void + +return: ; preds = %endif.8 + ret void +} + +declare uint %biari_decode_symbol(%typedef.DecodingEnvironment*, %typedef.BiContextType*) + +declare void %getLuma4x4Neighbour(int, int, int, int, int, %struct.pix_pos*) diff --git a/test/Transforms/InstCombine/2006-04-28-ShiftShiftLongLong.ll b/test/Transforms/InstCombine/2006-04-28-ShiftShiftLongLong.ll new file mode 100644 index 0000000..6e25d79 --- /dev/null +++ b/test/Transforms/InstCombine/2006-04-28-ShiftShiftLongLong.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep shl +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | notcast + +; This cannot be turned into a sign extending cast! + +long %test(long %X) { + %Y = shl long %X, ubyte 16 + %Z = shr long %Y, ubyte 16 + ret long %Z +} diff --git a/test/Transforms/InstCombine/2006-05-04-DemandedBitCrash.ll b/test/Transforms/InstCombine/2006-05-04-DemandedBitCrash.ll new file mode 100644 index 0000000..3e72a18 --- /dev/null +++ b/test/Transforms/InstCombine/2006-05-04-DemandedBitCrash.ll @@ -0,0 +1,51 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; END. + +void %test() { +bb38.i: + %varspec.0.i1014 = cast long 123814269237067777 to ulong ; <ulong> [#uses=1] + %locspec.0.i1015 = cast int 1 to uint ; <uint> [#uses=2] + %tmp51391.i1018 = shr ulong %varspec.0.i1014, ubyte 16 ; <ulong> [#uses=1] + %tmp51392.i1019 = cast ulong %tmp51391.i1018 to uint ; <uint> [#uses=2] + %tmp51392.mask.i1020 = shr uint %tmp51392.i1019, ubyte 29 ; <uint> [#uses=1] + %tmp7.i1021 = and uint %tmp51392.mask.i1020, 1 ; <uint> [#uses=2] + %tmp18.i1026 = shr uint %tmp51392.i1019, ubyte 31 ; <uint> [#uses=2] + %tmp18.i1027 = cast uint %tmp18.i1026 to ubyte ; <ubyte> [#uses=1] + br bool false, label %cond_false1148.i1653, label %bb377.i1259 + +bb377.i1259: ; preds = %bb38.i + br bool false, label %cond_true541.i1317, label %cond_false1148.i1653 + +cond_true541.i1317: ; preds = %bb377.i1259 + %tmp545.i1318 = shr uint %locspec.0.i1015, ubyte 10 ; <uint> [#uses=1] + %tmp550.i1319 = shr uint %locspec.0.i1015, ubyte 4 ; <uint> [#uses=1] + %tmp550551.i1320 = and uint %tmp550.i1319, 63 ; <uint> [#uses=1] + %tmp553.i1321 = setlt uint %tmp550551.i1320, 4 ; <bool> [#uses=1] + %tmp558.i1322 = seteq uint %tmp7.i1021, 0 ; <bool> [#uses=1] + %bothcond.i1326 = or bool %tmp553.i1321, false ; <bool> [#uses=1] + %bothcond1.i1327 = or bool %bothcond.i1326, false ; <bool> [#uses=1] + %bothcond2.not.i1328 = or bool %bothcond1.i1327, false ; <bool> [#uses=1] + %bothcond3.i1329 = or bool %bothcond2.not.i1328, %tmp558.i1322 ; <bool> [#uses=0] + br bool false, label %cond_true583.i1333, label %cond_next592.i1337 + +cond_true583.i1333: ; preds = %cond_true541.i1317 + br bool false, label %cond_true586.i1335, label %cond_next592.i1337 + +cond_true586.i1335: ; preds = %cond_true583.i1333 + br label %cond_true.i + +cond_next592.i1337: ; preds = %cond_true583.i1333, %cond_true541.i1317 + %mask_z.0.i1339 = phi uint [ %tmp18.i1026, %cond_true541.i1317 ], [ 0, %cond_true583.i1333 ] ; <uint> [#uses=0] + %tmp594.i1340 = and uint %tmp545.i1318, 15 ; <uint> [#uses=0] + br label %cond_true.i + +cond_false1148.i1653: ; preds = %bb377.i1259, %bb38.i + %tmp1150.i1654 = seteq uint %tmp7.i1021, 0 ; <bool> [#uses=1] + %tmp1160.i1656 = seteq ubyte %tmp18.i1027, 0 ; <bool> [#uses=1] + %bothcond8.i1658 = or bool %tmp1150.i1654, %tmp1160.i1656 ; <bool> [#uses=1] + %bothcond9.i1659 = or bool %bothcond8.i1658, false ; <bool> [#uses=0] + br label %cond_true.i + +cond_true.i: ; preds = %cond_false1148.i1653, %cond_next592.i1337, %cond_true586.i1335 + ret void +} diff --git a/test/Transforms/InstCombine/2006-05-06-Infloop.ll b/test/Transforms/InstCombine/2006-05-06-Infloop.ll new file mode 100644 index 0000000..4458d97 --- /dev/null +++ b/test/Transforms/InstCombine/2006-05-06-Infloop.ll @@ -0,0 +1,523 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; END. + + %struct.gs_matrix = type { float, int, float, int, float, int, float, int, float, int, float, int } + %struct.gx_bitmap = type { ubyte*, int, int, int } + %struct.gx_device = type { int, %struct.gx_device_procs*, sbyte*, int, int, float, float, int, ushort, int, int } + %struct.gx_device_memory = type { int, %struct.gx_device_procs*, sbyte*, int, int, float, float, int, ushort, int, int, %struct.gs_matrix, int, ubyte*, ubyte**, int (%struct.gx_device_memory*, int, int, int, int, int)*, int, int, ubyte* } + %struct.gx_device_procs = type { int (%struct.gx_device*)*, void (%struct.gx_device*, %struct.gs_matrix*)*, int (%struct.gx_device*)*, int (%struct.gx_device*)*, int (%struct.gx_device*)*, uint (%struct.gx_device*, ushort, ushort, ushort)*, int (%struct.gx_device*, uint, ushort*)*, int (%struct.gx_device*, int, int, int, int, uint)*, int (%struct.gx_device*, %struct.gx_bitmap*, int, int, int, int, uint, uint)*, int (%struct.gx_device*, ubyte*, int, int, int, int, int, int, uint, uint)*, int (%struct.gx_device*, ubyte*, int, int, int, int, int, int)*, int (%struct.gx_device*, int, int, int, int, uint)*, int (%struct.gx_device*, int, int, int, int, int, int, uint)*, int (%struct.gx_device*, %struct.gx_bitmap*, int, int, int, int, int, int, uint, uint)* } + +implementation ; Functions: + +int %mem_mono_copy_mono(%struct.gx_device* %dev, ubyte* %base, int %sourcex, int %raster, int %x, int %y, int %w, int %h, uint %zero, uint %one) { +entry: + %raster = cast int %raster to uint ; <uint> [#uses=3] + %tmp = seteq uint %one, %zero ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_next + +cond_true: ; preds = %entry + %tmp6 = tail call int %mem_mono_fill_rectangle( %struct.gx_device* %dev, int %x, int %y, int %w, int %h, uint %zero ) ; <int> [#uses=1] + ret int %tmp6 + +cond_next: ; preds = %entry + %tmp8 = cast %struct.gx_device* %dev to %struct.gx_device_memory* ; <%struct.gx_device_memory*> [#uses=6] + %tmp = getelementptr %struct.gx_device_memory* %tmp8, int 0, uint 15 ; <int (%struct.gx_device_memory*, int, int, int, int, int)**> [#uses=1] + %tmp = load int (%struct.gx_device_memory*, int, int, int, int, int)** %tmp ; <int (%struct.gx_device_memory*, int, int, int, int, int)*> [#uses=2] + %tmp9 = seteq int (%struct.gx_device_memory*, int, int, int, int, int)* %tmp, %mem_no_fault_proc ; <bool> [#uses=1] + br bool %tmp9, label %cond_next46, label %cond_true10 + +cond_true10: ; preds = %cond_next + %tmp16 = add int %x, 7 ; <int> [#uses=1] + %tmp17 = add int %tmp16, %w ; <int> [#uses=1] + %tmp18 = shr int %tmp17, ubyte 3 ; <int> [#uses=1] + %tmp20 = shr int %x, ubyte 3 ; <int> [#uses=2] + %tmp21 = sub int %tmp18, %tmp20 ; <int> [#uses=1] + %tmp27 = tail call int %tmp( %struct.gx_device_memory* %tmp8, int %tmp20, int %y, int %tmp21, int %h, int 1 ) ; <int> [#uses=2] + %tmp29 = setlt int %tmp27, 0 ; <bool> [#uses=1] + br bool %tmp29, label %cond_true30, label %cond_next46 + +cond_true30: ; preds = %cond_true10 + %tmp41 = tail call int %mem_copy_mono_recover( %struct.gx_device* %dev, ubyte* %base, int %sourcex, int %raster, int %x, int %y, int %w, int %h, uint %zero, uint %one, int %tmp27 ) ; <int> [#uses=1] + ret int %tmp41 + +cond_next46: ; preds = %cond_true10, %cond_next + %tmp48 = setgt int %w, 0 ; <bool> [#uses=1] + %tmp53 = setgt int %h, 0 ; <bool> [#uses=1] + %bothcond = and bool %tmp53, %tmp48 ; <bool> [#uses=1] + br bool %bothcond, label %bb58, label %return + +bb58: ; preds = %cond_next46 + %tmp60 = setlt int %x, 0 ; <bool> [#uses=1] + br bool %tmp60, label %return, label %cond_next63 + +cond_next63: ; preds = %bb58 + %tmp65 = getelementptr %struct.gx_device_memory* %tmp8, int 0, uint 3 ; <int*> [#uses=1] + %tmp66 = load int* %tmp65 ; <int> [#uses=1] + %tmp68 = sub int %tmp66, %w ; <int> [#uses=1] + %tmp70 = setlt int %tmp68, %x ; <bool> [#uses=1] + %tmp75 = setlt int %y, 0 ; <bool> [#uses=1] + %bothcond1 = or bool %tmp70, %tmp75 ; <bool> [#uses=1] + br bool %bothcond1, label %return, label %cond_next78 + +cond_next78: ; preds = %cond_next63 + %tmp80 = getelementptr %struct.gx_device_memory* %tmp8, int 0, uint 4 ; <int*> [#uses=1] + %tmp81 = load int* %tmp80 ; <int> [#uses=1] + %tmp83 = sub int %tmp81, %h ; <int> [#uses=1] + %tmp85 = setlt int %tmp83, %y ; <bool> [#uses=1] + br bool %tmp85, label %return, label %bb91 + +bb91: ; preds = %cond_next78 + %tmp93 = shr int %x, ubyte 3 ; <int> [#uses=4] + %tmp = getelementptr %struct.gx_device_memory* %tmp8, int 0, uint 14 ; <ubyte***> [#uses=1] + %tmp = load ubyte*** %tmp ; <ubyte**> [#uses=1] + %tmp96 = getelementptr ubyte** %tmp, int %y ; <ubyte**> [#uses=4] + %tmp98 = load ubyte** %tmp96 ; <ubyte*> [#uses=1] + %tmp100 = getelementptr ubyte* %tmp98, int %tmp93 ; <ubyte*> [#uses=3] + %tmp102 = shr int %sourcex, ubyte 3 ; <int> [#uses=3] + %tmp106 = and int %sourcex, 7 ; <int> [#uses=1] + %tmp107 = sub int 8, %tmp106 ; <int> [#uses=4] + %tmp109 = and int %x, 7 ; <int> [#uses=3] + %tmp110 = sub int 8, %tmp109 ; <int> [#uses=8] + %tmp112 = sub int 8, %tmp110 ; <int> [#uses=1] + %tmp112 = cast int %tmp112 to ubyte ; <ubyte> [#uses=1] + %tmp113464 = shr uint 255, ubyte %tmp112 ; <uint> [#uses=4] + %tmp116 = setgt int %tmp110, %w ; <bool> [#uses=1] + %tmp132 = getelementptr %struct.gx_device_memory* %tmp8, int 0, uint 16 ; <int*> [#uses=2] + br bool %tmp116, label %cond_true117, label %cond_false123 + +cond_true117: ; preds = %bb91 + %tmp119 = cast int %w to ubyte ; <ubyte> [#uses=1] + %tmp120 = shr uint %tmp113464, ubyte %tmp119 ; <uint> [#uses=1] + %tmp122 = sub uint %tmp113464, %tmp120 ; <uint> [#uses=2] + %tmp13315 = load int* %tmp132 ; <int> [#uses=1] + %tmp13416 = seteq int %tmp13315, 0 ; <bool> [#uses=1] + br bool %tmp13416, label %cond_next151, label %cond_true135 + +cond_false123: ; preds = %bb91 + %tmp126 = sub int %w, %tmp110 ; <int> [#uses=1] + %tmp126 = cast int %tmp126 to ubyte ; <ubyte> [#uses=1] + %tmp127 = and ubyte %tmp126, 7 ; <ubyte> [#uses=1] + %tmp128 = shr uint 255, ubyte %tmp127 ; <uint> [#uses=1] + %tmp1295 = sub uint 255, %tmp128 ; <uint> [#uses=2] + %tmp133 = load int* %tmp132 ; <int> [#uses=1] + %tmp134 = seteq int %tmp133, 0 ; <bool> [#uses=1] + br bool %tmp134, label %cond_next151, label %cond_true135 + +cond_true135: ; preds = %cond_false123, %cond_true117 + %rmask.0.0 = phi uint [ undef, %cond_true117 ], [ %tmp1295, %cond_false123 ] ; <uint> [#uses=2] + %mask.1.0 = phi uint [ %tmp122, %cond_true117 ], [ %tmp113464, %cond_false123 ] ; <uint> [#uses=2] + %not.tmp137 = setne uint %zero, 4294967295 ; <bool> [#uses=1] + %tmp140 = cast bool %not.tmp137 to uint ; <uint> [#uses=1] + %zero_addr.0 = xor uint %tmp140, %zero ; <uint> [#uses=2] + %tmp144 = seteq uint %one, 4294967295 ; <bool> [#uses=1] + br bool %tmp144, label %cond_next151, label %cond_true145 + +cond_true145: ; preds = %cond_true135 + %tmp147 = xor uint %one, 1 ; <uint> [#uses=1] + br label %cond_next151 + +cond_next151: ; preds = %cond_true145, %cond_true135, %cond_false123, %cond_true117 + %rmask.0.1 = phi uint [ %rmask.0.0, %cond_true145 ], [ undef, %cond_true117 ], [ %tmp1295, %cond_false123 ], [ %rmask.0.0, %cond_true135 ] ; <uint> [#uses=4] + %mask.1.1 = phi uint [ %mask.1.0, %cond_true145 ], [ %tmp122, %cond_true117 ], [ %tmp113464, %cond_false123 ], [ %mask.1.0, %cond_true135 ] ; <uint> [#uses=4] + %one_addr.0 = phi uint [ %tmp147, %cond_true145 ], [ %one, %cond_true117 ], [ %one, %cond_false123 ], [ %one, %cond_true135 ] ; <uint> [#uses=2] + %zero_addr.1 = phi uint [ %zero_addr.0, %cond_true145 ], [ %zero, %cond_true117 ], [ %zero, %cond_false123 ], [ %zero_addr.0, %cond_true135 ] ; <uint> [#uses=2] + %tmp153 = seteq uint %zero_addr.1, 1 ; <bool> [#uses=2] + %tmp158 = seteq uint %one_addr.0, 0 ; <bool> [#uses=2] + %bothcond2 = or bool %tmp153, %tmp158 ; <bool> [#uses=1] + %iftmp.35.0 = select bool %bothcond2, uint 4294967295, uint 0 ; <uint> [#uses=8] + %tmp167 = seteq uint %zero_addr.1, 0 ; <bool> [#uses=1] + %bothcond3 = or bool %tmp167, %tmp158 ; <bool> [#uses=1] + %iftmp.36.0 = select bool %bothcond3, uint 0, uint 4294967295 ; <uint> [#uses=4] + %tmp186 = seteq uint %one_addr.0, 1 ; <bool> [#uses=1] + %bothcond4 = or bool %tmp153, %tmp186 ; <bool> [#uses=1] + %iftmp.37.0 = select bool %bothcond4, uint 4294967295, uint 0 ; <uint> [#uses=6] + %tmp196 = seteq int %tmp107, %tmp110 ; <bool> [#uses=1] + br bool %tmp196, label %cond_true197, label %cond_false299 + +cond_true197: ; preds = %cond_next151 + %tmp29222 = add int %h, -1 ; <int> [#uses=3] + %tmp29424 = setlt int %tmp29222, 0 ; <bool> [#uses=1] + br bool %tmp29424, label %return, label %cond_true295.preheader + +cond_true249.preheader: ; preds = %cond_true295 + br label %cond_true249 + +cond_true249: ; preds = %cond_true249, %cond_true249.preheader + %indvar = phi uint [ 0, %cond_true249.preheader ], [ %indvar.next, %cond_true249 ] ; <uint> [#uses=2] + %optr.3.2 = phi ubyte* [ %tmp232, %cond_true249 ], [ %dest.1.0, %cond_true249.preheader ] ; <ubyte*> [#uses=1] + %bptr.3.2 = phi ubyte* [ %tmp226, %cond_true249 ], [ %line.1.0, %cond_true249.preheader ] ; <ubyte*> [#uses=1] + %tmp. = add int %tmp109, %w ; <int> [#uses=1] + %indvar = cast uint %indvar to int ; <int> [#uses=1] + %tmp.58 = mul int %indvar, -8 ; <int> [#uses=1] + %tmp.57 = add int %tmp., -16 ; <int> [#uses=1] + %tmp246.2 = add int %tmp.58, %tmp.57 ; <int> [#uses=1] + %tmp225 = cast ubyte* %bptr.3.2 to uint ; <uint> [#uses=1] + %tmp226 = add uint %tmp225, 1 ; <uint> [#uses=1] + %tmp226 = cast uint %tmp226 to ubyte* ; <ubyte*> [#uses=3] + %tmp228 = load ubyte* %tmp226 ; <ubyte> [#uses=1] + %tmp228 = cast ubyte %tmp228 to uint ; <uint> [#uses=1] + %tmp230 = xor uint %tmp228, %iftmp.35.0 ; <uint> [#uses=2] + %tmp231 = cast ubyte* %optr.3.2 to uint ; <uint> [#uses=1] + %tmp232 = add uint %tmp231, 1 ; <uint> [#uses=1] + %tmp232 = cast uint %tmp232 to ubyte* ; <ubyte*> [#uses=4] + %tmp235 = or uint %tmp230, %iftmp.36.0 ; <uint> [#uses=1] + %tmp235 = cast uint %tmp235 to ubyte ; <ubyte> [#uses=1] + %tmp237 = load ubyte* %tmp232 ; <ubyte> [#uses=1] + %tmp238 = and ubyte %tmp235, %tmp237 ; <ubyte> [#uses=1] + %tmp241 = and uint %tmp230, %iftmp.37.0 ; <uint> [#uses=1] + %tmp241 = cast uint %tmp241 to ubyte ; <ubyte> [#uses=1] + %tmp242 = or ubyte %tmp238, %tmp241 ; <ubyte> [#uses=1] + store ubyte %tmp242, ubyte* %tmp232 + %tmp24629 = add int %tmp246.2, -8 ; <int> [#uses=2] + %tmp24831 = setlt int %tmp24629, 0 ; <bool> [#uses=1] + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] + br bool %tmp24831, label %bb252.loopexit, label %cond_true249 + +bb252.loopexit: ; preds = %cond_true249 + br label %bb252 + +bb252: ; preds = %cond_true295, %bb252.loopexit + %optr.3.3 = phi ubyte* [ %dest.1.0, %cond_true295 ], [ %tmp232, %bb252.loopexit ] ; <ubyte*> [#uses=1] + %bptr.3.3 = phi ubyte* [ %line.1.0, %cond_true295 ], [ %tmp226, %bb252.loopexit ] ; <ubyte*> [#uses=1] + %tmp246.3 = phi int [ %tmp246, %cond_true295 ], [ %tmp24629, %bb252.loopexit ] ; <int> [#uses=1] + %tmp254 = setgt int %tmp246.3, -8 ; <bool> [#uses=1] + br bool %tmp254, label %cond_true255, label %cond_next280 + +cond_true255: ; preds = %bb252 + %tmp256 = cast ubyte* %bptr.3.3 to uint ; <uint> [#uses=1] + %tmp257 = add uint %tmp256, 1 ; <uint> [#uses=1] + %tmp257 = cast uint %tmp257 to ubyte* ; <ubyte*> [#uses=1] + %tmp259 = load ubyte* %tmp257 ; <ubyte> [#uses=1] + %tmp259 = cast ubyte %tmp259 to uint ; <uint> [#uses=1] + %tmp261 = xor uint %tmp259, %iftmp.35.0 ; <uint> [#uses=2] + %tmp262 = cast ubyte* %optr.3.3 to uint ; <uint> [#uses=1] + %tmp263 = add uint %tmp262, 1 ; <uint> [#uses=1] + %tmp263 = cast uint %tmp263 to ubyte* ; <ubyte*> [#uses=2] + %tmp265 = cast uint %tmp261 to ubyte ; <ubyte> [#uses=1] + %tmp268 = or ubyte %tmp266, %tmp265 ; <ubyte> [#uses=1] + %tmp270 = load ubyte* %tmp263 ; <ubyte> [#uses=1] + %tmp271 = and ubyte %tmp268, %tmp270 ; <ubyte> [#uses=1] + %tmp276 = and uint %tmp274, %tmp261 ; <uint> [#uses=1] + %tmp276 = cast uint %tmp276 to ubyte ; <ubyte> [#uses=1] + %tmp277 = or ubyte %tmp271, %tmp276 ; <ubyte> [#uses=1] + store ubyte %tmp277, ubyte* %tmp263 + br label %cond_next280 + +cond_next280: ; preds = %cond_true255, %bb252 + %tmp281 = cast ubyte** %dest_line.1.0 to uint ; <uint> [#uses=1] + %tmp282 = add uint %tmp281, 4 ; <uint> [#uses=1] + %tmp282 = cast uint %tmp282 to ubyte** ; <ubyte**> [#uses=2] + %tmp284 = load ubyte** %tmp282 ; <ubyte*> [#uses=1] + %tmp286 = getelementptr ubyte* %tmp284, int %tmp93 ; <ubyte*> [#uses=1] + %tmp292 = add int %tmp292.0, -1 ; <int> [#uses=1] + %tmp294 = setlt int %tmp292, 0 ; <bool> [#uses=1] + %indvar.next61 = add uint %indvar60, 1 ; <uint> [#uses=1] + br bool %tmp294, label %return.loopexit, label %cond_true295 + +cond_true295.preheader: ; preds = %cond_true197 + %tmp200 = sub int %w, %tmp110 ; <int> [#uses=1] + %tmp209 = cast uint %mask.1.1 to ubyte ; <ubyte> [#uses=1] + %tmp209not = xor ubyte %tmp209, 255 ; <ubyte> [#uses=1] + %tmp212 = cast uint %iftmp.36.0 to ubyte ; <ubyte> [#uses=2] + %tmp211 = or ubyte %tmp212, %tmp209not ; <ubyte> [#uses=2] + %tmp219 = and uint %iftmp.37.0, %mask.1.1 ; <uint> [#uses=2] + %tmp246 = add int %tmp200, -8 ; <int> [#uses=3] + %tmp248 = setlt int %tmp246, 0 ; <bool> [#uses=1] + %tmp264 = cast uint %rmask.0.1 to ubyte ; <ubyte> [#uses=1] + %tmp264not = xor ubyte %tmp264, 255 ; <ubyte> [#uses=1] + %tmp266 = or ubyte %tmp212, %tmp264not ; <ubyte> [#uses=2] + %tmp274 = and uint %iftmp.37.0, %rmask.0.1 ; <uint> [#uses=2] + br bool %tmp248, label %cond_true295.preheader.split.us, label %cond_true295.preheader.split + +cond_true295.preheader.split.us: ; preds = %cond_true295.preheader + br label %cond_true295.us + +cond_true295.us: ; preds = %cond_next280.us, %cond_true295.preheader.split.us + %indvar86 = phi uint [ 0, %cond_true295.preheader.split.us ], [ %indvar.next87, %cond_next280.us ] ; <uint> [#uses=3] + %dest.1.0.us = phi ubyte* [ %tmp286.us, %cond_next280.us ], [ %tmp100, %cond_true295.preheader.split.us ] ; <ubyte*> [#uses=3] + %dest_line.1.0.us = phi ubyte** [ %tmp282.us, %cond_next280.us ], [ %tmp96, %cond_true295.preheader.split.us ] ; <ubyte**> [#uses=1] + %tmp.89 = sub uint 0, %indvar86 ; <uint> [#uses=1] + %tmp.89 = cast uint %tmp.89 to int ; <int> [#uses=1] + %tmp292.0.us = add int %tmp.89, %tmp29222 ; <int> [#uses=1] + %tmp.91 = mul uint %indvar86, %raster ; <uint> [#uses=1] + %tmp.91 = cast uint %tmp.91 to int ; <int> [#uses=1] + %tmp104.sum101 = add int %tmp102, %tmp.91 ; <int> [#uses=1] + %line.1.0.us = getelementptr ubyte* %base, int %tmp104.sum101 ; <ubyte*> [#uses=2] + %tmp.us = load ubyte* %line.1.0.us ; <ubyte> [#uses=1] + %tmp206.us = cast ubyte %tmp.us to uint ; <uint> [#uses=1] + %tmp208.us = xor uint %tmp206.us, %iftmp.35.0 ; <uint> [#uses=2] + %tmp210.us = cast uint %tmp208.us to ubyte ; <ubyte> [#uses=1] + %tmp213.us = or ubyte %tmp211, %tmp210.us ; <ubyte> [#uses=1] + %tmp215.us = load ubyte* %dest.1.0.us ; <ubyte> [#uses=1] + %tmp216.us = and ubyte %tmp213.us, %tmp215.us ; <ubyte> [#uses=1] + %tmp221.us = and uint %tmp219, %tmp208.us ; <uint> [#uses=1] + %tmp221.us = cast uint %tmp221.us to ubyte ; <ubyte> [#uses=1] + %tmp222.us = or ubyte %tmp216.us, %tmp221.us ; <ubyte> [#uses=1] + store ubyte %tmp222.us, ubyte* %dest.1.0.us + br bool true, label %bb252.us, label %cond_true249.preheader.us + +cond_next280.us: ; preds = %bb252.us, %cond_true255.us + %tmp281.us = cast ubyte** %dest_line.1.0.us to uint ; <uint> [#uses=1] + %tmp282.us = add uint %tmp281.us, 4 ; <uint> [#uses=1] + %tmp282.us = cast uint %tmp282.us to ubyte** ; <ubyte**> [#uses=2] + %tmp284.us = load ubyte** %tmp282.us ; <ubyte*> [#uses=1] + %tmp286.us = getelementptr ubyte* %tmp284.us, int %tmp93 ; <ubyte*> [#uses=1] + %tmp292.us = add int %tmp292.0.us, -1 ; <int> [#uses=1] + %tmp294.us = setlt int %tmp292.us, 0 ; <bool> [#uses=1] + %indvar.next87 = add uint %indvar86, 1 ; <uint> [#uses=1] + br bool %tmp294.us, label %return.loopexit.us, label %cond_true295.us + +cond_true255.us: ; preds = %bb252.us + %tmp256.us = cast ubyte* %bptr.3.3.us to uint ; <uint> [#uses=1] + %tmp257.us = add uint %tmp256.us, 1 ; <uint> [#uses=1] + %tmp257.us = cast uint %tmp257.us to ubyte* ; <ubyte*> [#uses=1] + %tmp259.us = load ubyte* %tmp257.us ; <ubyte> [#uses=1] + %tmp259.us = cast ubyte %tmp259.us to uint ; <uint> [#uses=1] + %tmp261.us = xor uint %tmp259.us, %iftmp.35.0 ; <uint> [#uses=2] + %tmp262.us = cast ubyte* %optr.3.3.us to uint ; <uint> [#uses=1] + %tmp263.us = add uint %tmp262.us, 1 ; <uint> [#uses=1] + %tmp263.us = cast uint %tmp263.us to ubyte* ; <ubyte*> [#uses=2] + %tmp265.us = cast uint %tmp261.us to ubyte ; <ubyte> [#uses=1] + %tmp268.us = or ubyte %tmp266, %tmp265.us ; <ubyte> [#uses=1] + %tmp270.us = load ubyte* %tmp263.us ; <ubyte> [#uses=1] + %tmp271.us = and ubyte %tmp268.us, %tmp270.us ; <ubyte> [#uses=1] + %tmp276.us = and uint %tmp274, %tmp261.us ; <uint> [#uses=1] + %tmp276.us = cast uint %tmp276.us to ubyte ; <ubyte> [#uses=1] + %tmp277.us = or ubyte %tmp271.us, %tmp276.us ; <ubyte> [#uses=1] + store ubyte %tmp277.us, ubyte* %tmp263.us + br label %cond_next280.us + +bb252.us: ; preds = %bb252.loopexit.us, %cond_true295.us + %optr.3.3.us = phi ubyte* [ %dest.1.0.us, %cond_true295.us ], [ undef, %bb252.loopexit.us ] ; <ubyte*> [#uses=1] + %bptr.3.3.us = phi ubyte* [ %line.1.0.us, %cond_true295.us ], [ undef, %bb252.loopexit.us ] ; <ubyte*> [#uses=1] + %tmp246.3.us = phi int [ %tmp246, %cond_true295.us ], [ undef, %bb252.loopexit.us ] ; <int> [#uses=1] + %tmp254.us = setgt int %tmp246.3.us, -8 ; <bool> [#uses=1] + br bool %tmp254.us, label %cond_true255.us, label %cond_next280.us + +cond_true249.us: ; preds = %cond_true249.preheader.us, %cond_true249.us + br bool undef, label %bb252.loopexit.us, label %cond_true249.us + +cond_true249.preheader.us: ; preds = %cond_true295.us + br label %cond_true249.us + +bb252.loopexit.us: ; preds = %cond_true249.us + br label %bb252.us + +return.loopexit.us: ; preds = %cond_next280.us + br label %return.loopexit.split + +cond_true295.preheader.split: ; preds = %cond_true295.preheader + br label %cond_true295 + +cond_true295: ; preds = %cond_true295.preheader.split, %cond_next280 + %indvar60 = phi uint [ 0, %cond_true295.preheader.split ], [ %indvar.next61, %cond_next280 ] ; <uint> [#uses=3] + %dest.1.0 = phi ubyte* [ %tmp286, %cond_next280 ], [ %tmp100, %cond_true295.preheader.split ] ; <ubyte*> [#uses=4] + %dest_line.1.0 = phi ubyte** [ %tmp282, %cond_next280 ], [ %tmp96, %cond_true295.preheader.split ] ; <ubyte**> [#uses=1] + %tmp.63 = sub uint 0, %indvar60 ; <uint> [#uses=1] + %tmp.63 = cast uint %tmp.63 to int ; <int> [#uses=1] + %tmp292.0 = add int %tmp.63, %tmp29222 ; <int> [#uses=1] + %tmp.65 = mul uint %indvar60, %raster ; <uint> [#uses=1] + %tmp.65 = cast uint %tmp.65 to int ; <int> [#uses=1] + %tmp104.sum97 = add int %tmp102, %tmp.65 ; <int> [#uses=1] + %line.1.0 = getelementptr ubyte* %base, int %tmp104.sum97 ; <ubyte*> [#uses=3] + %tmp = load ubyte* %line.1.0 ; <ubyte> [#uses=1] + %tmp206 = cast ubyte %tmp to uint ; <uint> [#uses=1] + %tmp208 = xor uint %tmp206, %iftmp.35.0 ; <uint> [#uses=2] + %tmp210 = cast uint %tmp208 to ubyte ; <ubyte> [#uses=1] + %tmp213 = or ubyte %tmp211, %tmp210 ; <ubyte> [#uses=1] + %tmp215 = load ubyte* %dest.1.0 ; <ubyte> [#uses=1] + %tmp216 = and ubyte %tmp213, %tmp215 ; <ubyte> [#uses=1] + %tmp221 = and uint %tmp219, %tmp208 ; <uint> [#uses=1] + %tmp221 = cast uint %tmp221 to ubyte ; <ubyte> [#uses=1] + %tmp222 = or ubyte %tmp216, %tmp221 ; <ubyte> [#uses=1] + store ubyte %tmp222, ubyte* %dest.1.0 + br bool false, label %bb252, label %cond_true249.preheader + +cond_false299: ; preds = %cond_next151 + %tmp302 = sub int %tmp107, %tmp110 ; <int> [#uses=1] + %tmp303 = and int %tmp302, 7 ; <int> [#uses=3] + %tmp305 = sub int 8, %tmp303 ; <int> [#uses=1] + %tmp45438 = add int %h, -1 ; <int> [#uses=2] + %tmp45640 = setlt int %tmp45438, 0 ; <bool> [#uses=1] + br bool %tmp45640, label %return, label %cond_true457.preheader + +cond_true316: ; preds = %cond_true457 + %tmp318 = cast ubyte %tmp318 to uint ; <uint> [#uses=1] + %tmp320 = shr uint %tmp318, ubyte %tmp319 ; <uint> [#uses=1] + br label %cond_next340 + +cond_false321: ; preds = %cond_true457 + %tmp3188 = cast ubyte %tmp318 to uint ; <uint> [#uses=1] + %tmp325 = shl uint %tmp3188, ubyte %tmp324 ; <uint> [#uses=2] + %tmp326 = cast ubyte* %line.3.0 to uint ; <uint> [#uses=1] + %tmp327 = add uint %tmp326, 1 ; <uint> [#uses=1] + %tmp327 = cast uint %tmp327 to ubyte* ; <ubyte*> [#uses=3] + br bool %tmp330, label %cond_true331, label %cond_next340 + +cond_true331: ; preds = %cond_false321 + %tmp333 = load ubyte* %tmp327 ; <ubyte> [#uses=1] + %tmp333 = cast ubyte %tmp333 to uint ; <uint> [#uses=1] + %tmp335 = shr uint %tmp333, ubyte %tmp319 ; <uint> [#uses=1] + %tmp337 = add uint %tmp335, %tmp325 ; <uint> [#uses=1] + br label %cond_next340 + +cond_next340: ; preds = %cond_true331, %cond_false321, %cond_true316 + %bits.0 = phi uint [ %tmp320, %cond_true316 ], [ %tmp337, %cond_true331 ], [ %tmp325, %cond_false321 ] ; <uint> [#uses=1] + %bptr307.3 = phi ubyte* [ %line.3.0, %cond_true316 ], [ %tmp327, %cond_true331 ], [ %tmp327, %cond_false321 ] ; <ubyte*> [#uses=2] + %tmp343 = xor uint %bits.0, %iftmp.35.0 ; <uint> [#uses=2] + %tmp345 = cast uint %tmp343 to ubyte ; <ubyte> [#uses=1] + %tmp348 = or ubyte %tmp346, %tmp345 ; <ubyte> [#uses=1] + %tmp350 = load ubyte* %dest.3.0 ; <ubyte> [#uses=1] + %tmp351 = and ubyte %tmp348, %tmp350 ; <ubyte> [#uses=1] + %tmp356 = and uint %tmp354, %tmp343 ; <uint> [#uses=1] + %tmp356 = cast uint %tmp356 to ubyte ; <ubyte> [#uses=1] + %tmp357 = or ubyte %tmp351, %tmp356 ; <ubyte> [#uses=1] + store ubyte %tmp357, ubyte* %dest.3.0 + %tmp362 = cast ubyte* %dest.3.0 to uint ; <uint> [#uses=1] + %optr309.3.in51 = add uint %tmp362, 1 ; <uint> [#uses=2] + %optr309.353 = cast uint %optr309.3.in51 to ubyte* ; <ubyte*> [#uses=2] + br bool %tmp39755, label %cond_true398.preheader, label %bb401 + +cond_true398.preheader: ; preds = %cond_next340 + br label %cond_true398 + +cond_true398: ; preds = %cond_true398, %cond_true398.preheader + %indvar66 = phi uint [ 0, %cond_true398.preheader ], [ %indvar.next67, %cond_true398 ] ; <uint> [#uses=3] + %bptr307.4.0 = phi ubyte* [ %tmp370, %cond_true398 ], [ %bptr307.3, %cond_true398.preheader ] ; <ubyte*> [#uses=2] + %optr309.3.0 = phi ubyte* [ %optr309.3, %cond_true398 ], [ %optr309.353, %cond_true398.preheader ] ; <ubyte*> [#uses=2] + %optr309.3.in.0 = add uint %indvar66, %optr309.3.in51 ; <uint> [#uses=1] + %tmp.70 = add int %tmp109, %w ; <int> [#uses=1] + %indvar66 = cast uint %indvar66 to int ; <int> [#uses=1] + %tmp.72 = mul int %indvar66, -8 ; <int> [#uses=1] + %tmp.71 = add int %tmp.70, -8 ; <int> [#uses=1] + %count308.3.0 = add int %tmp.72, %tmp.71 ; <int> [#uses=1] + %tmp366 = load ubyte* %bptr307.4.0 ; <ubyte> [#uses=1] + %tmp366 = cast ubyte %tmp366 to uint ; <uint> [#uses=1] + %tmp369 = cast ubyte* %bptr307.4.0 to uint ; <uint> [#uses=1] + %tmp370 = add uint %tmp369, 1 ; <uint> [#uses=1] + %tmp370 = cast uint %tmp370 to ubyte* ; <ubyte*> [#uses=3] + %tmp372 = load ubyte* %tmp370 ; <ubyte> [#uses=1] + %tmp372 = cast ubyte %tmp372 to uint ; <uint> [#uses=1] + %tmp374463 = shr uint %tmp372, ubyte %tmp319 ; <uint> [#uses=1] + %tmp368 = shl uint %tmp366, ubyte %tmp324 ; <uint> [#uses=1] + %tmp377 = add uint %tmp374463, %tmp368 ; <uint> [#uses=1] + %tmp379 = xor uint %tmp377, %iftmp.35.0 ; <uint> [#uses=2] + %tmp382 = or uint %tmp379, %iftmp.36.0 ; <uint> [#uses=1] + %tmp382 = cast uint %tmp382 to ubyte ; <ubyte> [#uses=1] + %tmp384 = load ubyte* %optr309.3.0 ; <ubyte> [#uses=1] + %tmp385 = and ubyte %tmp382, %tmp384 ; <ubyte> [#uses=1] + %tmp388 = and uint %tmp379, %iftmp.37.0 ; <uint> [#uses=1] + %tmp388 = cast uint %tmp388 to ubyte ; <ubyte> [#uses=1] + %tmp389 = or ubyte %tmp385, %tmp388 ; <ubyte> [#uses=1] + store ubyte %tmp389, ubyte* %optr309.3.0 + %tmp392 = add int %count308.3.0, -8 ; <int> [#uses=2] + %optr309.3.in = add uint %optr309.3.in.0, 1 ; <uint> [#uses=1] + %optr309.3 = cast uint %optr309.3.in to ubyte* ; <ubyte*> [#uses=2] + %tmp397 = setgt int %tmp392, 7 ; <bool> [#uses=1] + %indvar.next67 = add uint %indvar66, 1 ; <uint> [#uses=1] + br bool %tmp397, label %cond_true398, label %bb401.loopexit + +bb401.loopexit: ; preds = %cond_true398 + br label %bb401 + +bb401: ; preds = %bb401.loopexit, %cond_next340 + %count308.3.1 = phi int [ %tmp361, %cond_next340 ], [ %tmp392, %bb401.loopexit ] ; <int> [#uses=2] + %bptr307.4.1 = phi ubyte* [ %bptr307.3, %cond_next340 ], [ %tmp370, %bb401.loopexit ] ; <ubyte*> [#uses=2] + %optr309.3.1 = phi ubyte* [ %optr309.353, %cond_next340 ], [ %optr309.3, %bb401.loopexit ] ; <ubyte*> [#uses=2] + %tmp403 = setgt int %count308.3.1, 0 ; <bool> [#uses=1] + br bool %tmp403, label %cond_true404, label %cond_next442 + +cond_true404: ; preds = %bb401 + %tmp406 = load ubyte* %bptr307.4.1 ; <ubyte> [#uses=1] + %tmp406 = cast ubyte %tmp406 to int ; <int> [#uses=1] + %tmp408 = shl int %tmp406, ubyte %tmp324 ; <int> [#uses=2] + %tmp413 = setgt int %count308.3.1, %tmp303 ; <bool> [#uses=1] + br bool %tmp413, label %cond_true414, label %cond_next422 + +cond_true414: ; preds = %cond_true404 + %tmp409 = cast ubyte* %bptr307.4.1 to uint ; <uint> [#uses=1] + %tmp410 = add uint %tmp409, 1 ; <uint> [#uses=1] + %tmp410 = cast uint %tmp410 to ubyte* ; <ubyte*> [#uses=1] + %tmp416 = load ubyte* %tmp410 ; <ubyte> [#uses=1] + %tmp416 = cast ubyte %tmp416 to uint ; <uint> [#uses=1] + %tmp418 = shr uint %tmp416, ubyte %tmp319 ; <uint> [#uses=1] + %tmp418 = cast uint %tmp418 to int ; <int> [#uses=1] + %tmp420 = add int %tmp418, %tmp408 ; <int> [#uses=1] + br label %cond_next422 + +cond_next422: ; preds = %cond_true414, %cond_true404 + %bits.6 = phi int [ %tmp420, %cond_true414 ], [ %tmp408, %cond_true404 ] ; <int> [#uses=1] + %tmp425 = xor int %bits.6, %iftmp.35.0 ; <int> [#uses=1] + %tmp427 = cast int %tmp425 to ubyte ; <ubyte> [#uses=2] + %tmp430 = or ubyte %tmp428, %tmp427 ; <ubyte> [#uses=1] + %tmp432 = load ubyte* %optr309.3.1 ; <ubyte> [#uses=1] + %tmp433 = and ubyte %tmp430, %tmp432 ; <ubyte> [#uses=1] + %tmp438 = and ubyte %tmp436, %tmp427 ; <ubyte> [#uses=1] + %tmp439 = or ubyte %tmp433, %tmp438 ; <ubyte> [#uses=1] + store ubyte %tmp439, ubyte* %optr309.3.1 + br label %cond_next442 + +cond_next442: ; preds = %cond_next422, %bb401 + %tmp443 = cast ubyte** %dest_line.3.0 to uint ; <uint> [#uses=1] + %tmp444 = add uint %tmp443, 4 ; <uint> [#uses=1] + %tmp444 = cast uint %tmp444 to ubyte** ; <ubyte**> [#uses=2] + %tmp446 = load ubyte** %tmp444 ; <ubyte*> [#uses=1] + %tmp448 = getelementptr ubyte* %tmp446, int %tmp93 ; <ubyte*> [#uses=1] + %tmp454 = add int %tmp454.0, -1 ; <int> [#uses=1] + %tmp456 = setlt int %tmp454, 0 ; <bool> [#uses=1] + %indvar.next75 = add uint %indvar74, 1 ; <uint> [#uses=1] + br bool %tmp456, label %return.loopexit56, label %cond_true457 + +cond_true457.preheader: ; preds = %cond_false299 + %tmp315 = setlt int %tmp107, %tmp110 ; <bool> [#uses=1] + %tmp319 = cast int %tmp303 to ubyte ; <ubyte> [#uses=4] + %tmp324 = cast int %tmp305 to ubyte ; <ubyte> [#uses=3] + %tmp330 = setlt int %tmp107, %w ; <bool> [#uses=1] + %tmp344 = cast uint %mask.1.1 to ubyte ; <ubyte> [#uses=1] + %tmp344not = xor ubyte %tmp344, 255 ; <ubyte> [#uses=1] + %tmp347 = cast uint %iftmp.36.0 to ubyte ; <ubyte> [#uses=2] + %tmp346 = or ubyte %tmp347, %tmp344not ; <ubyte> [#uses=1] + %tmp354 = and uint %iftmp.37.0, %mask.1.1 ; <uint> [#uses=1] + %tmp361 = sub int %w, %tmp110 ; <int> [#uses=2] + %tmp39755 = setgt int %tmp361, 7 ; <bool> [#uses=1] + %iftmp.35.0 = cast uint %iftmp.35.0 to int ; <int> [#uses=1] + %tmp426 = cast uint %rmask.0.1 to ubyte ; <ubyte> [#uses=1] + %tmp426not = xor ubyte %tmp426, 255 ; <ubyte> [#uses=1] + %tmp428 = or ubyte %tmp347, %tmp426not ; <ubyte> [#uses=1] + %tmp436 = and uint %iftmp.37.0, %rmask.0.1 ; <uint> [#uses=1] + %tmp436 = cast uint %tmp436 to ubyte ; <ubyte> [#uses=1] + br label %cond_true457 + +cond_true457: ; preds = %cond_true457.preheader, %cond_next442 + %indvar74 = phi uint [ 0, %cond_true457.preheader ], [ %indvar.next75, %cond_next442 ] ; <uint> [#uses=3] + %dest.3.0 = phi ubyte* [ %tmp448, %cond_next442 ], [ %tmp100, %cond_true457.preheader ] ; <ubyte*> [#uses=3] + %dest_line.3.0 = phi ubyte** [ %tmp444, %cond_next442 ], [ %tmp96, %cond_true457.preheader ] ; <ubyte**> [#uses=1] + %tmp.77 = sub uint 0, %indvar74 ; <uint> [#uses=1] + %tmp.77 = cast uint %tmp.77 to int ; <int> [#uses=1] + %tmp454.0 = add int %tmp.77, %tmp45438 ; <int> [#uses=1] + %tmp.79 = mul uint %indvar74, %raster ; <uint> [#uses=1] + %tmp.79 = cast uint %tmp.79 to int ; <int> [#uses=1] + %tmp104.sum = add int %tmp102, %tmp.79 ; <int> [#uses=1] + %line.3.0 = getelementptr ubyte* %base, int %tmp104.sum ; <ubyte*> [#uses=3] + %tmp318 = load ubyte* %line.3.0 ; <ubyte> [#uses=2] + br bool %tmp315, label %cond_false321, label %cond_true316 + +return.loopexit: ; preds = %cond_next280 + br label %return.loopexit.split + +return.loopexit.split: ; preds = %return.loopexit, %return.loopexit.us + br label %return + +return.loopexit56: ; preds = %cond_next442 + br label %return + +return: ; preds = %return.loopexit56, %return.loopexit.split, %cond_false299, %cond_true197, %cond_next78, %cond_next63, %bb58, %cond_next46 + %retval.0 = phi int [ 0, %cond_next46 ], [ -1, %bb58 ], [ -1, %cond_next63 ], [ -1, %cond_next78 ], [ 0, %cond_true197 ], [ 0, %cond_false299 ], [ 0, %return.loopexit.split ], [ 0, %return.loopexit56 ] ; <int> [#uses=1] + ret int %retval.0 +} + +declare int %mem_no_fault_proc(%struct.gx_device_memory*, int, int, int, int, int) + +declare int %mem_mono_fill_rectangle(%struct.gx_device*, int, int, int, int, uint) + +declare int %mem_copy_mono_recover(%struct.gx_device*, ubyte*, int, int, int, int, int, int, uint, uint, int) diff --git a/test/Transforms/InstCombine/2006-06-28-infloop.ll b/test/Transforms/InstCombine/2006-06-28-infloop.ll new file mode 100644 index 0000000..bd1dbd0 --- /dev/null +++ b/test/Transforms/InstCombine/2006-06-28-infloop.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8" + +implementation ; Functions: + +void %test() { +entry: + %tmp = getelementptr { long, long, long, long }* null, int 0, uint 3 + %tmp = load long* %tmp ; <long> [#uses=1] + %tmp8.ui = load ulong* null ; <ulong> [#uses=1] + %tmp8 = cast ulong %tmp8.ui to long ; <long> [#uses=1] + %tmp9 = and long %tmp8, %tmp ; <long> [#uses=1] + %sext = cast long %tmp9 to int ; <int> [#uses=1] + %tmp27.i = cast int %sext to long ; <long> [#uses=1] + tail call void %foo( uint 0, long %tmp27.i ) + unreachable +} + +declare void %foo(uint, long) diff --git a/test/Transforms/InstCombine/2006-09-11-EmptyStructCrash.ll b/test/Transforms/InstCombine/2006-09-11-EmptyStructCrash.ll new file mode 100644 index 0000000..61f01ce --- /dev/null +++ b/test/Transforms/InstCombine/2006-09-11-EmptyStructCrash.ll @@ -0,0 +1,48 @@ +; PR905 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; END. + + %RPYTHON_EXCEPTION = type { %RPYTHON_EXCEPTION_VTABLE* } + %RPYTHON_EXCEPTION_VTABLE = type { %RPYTHON_EXCEPTION_VTABLE*, int, int, %RPyOpaque_RuntimeTypeInfo*, %arraytype_Char*, %functiontype_12* } + %RPyOpaque_RuntimeTypeInfo = type opaque* + %arraytype_Char = type { int, [0 x sbyte] } + %fixarray_array1019 = type [1019 x sbyte*] + %functiontype_12 = type %RPYTHON_EXCEPTION* () + %functiontype_14 = type void (%structtype_pypy.rpython.memory.gc.MarkSweepGC*) + %structtype_AddressLinkedListChunk = type { %structtype_AddressLinkedListChunk*, int, %fixarray_array1019 } + %structtype_exceptions.Exception = type { %RPYTHON_EXCEPTION } + %structtype_gc_pool = type { } + %structtype_gc_pool_node = type { %structtype_header*, %structtype_gc_pool_node* } + %structtype_header = type { int, %structtype_header* } + %structtype_pypy.rpython.memory.gc.MarkSweepGC = type { %structtype_exceptions.Exception, int, int, bool, %structtype_gc_pool*, int, %structtype_header*, %structtype_header*, %structtype_gc_pool_node*, double, double } + +implementation ; Functions: + +fastcc void %pypy_MarkSweepGC.collect() { +block0: + %v1221 = load %structtype_AddressLinkedListChunk** null ; <%structtype_AddressLinkedListChunk*> [#uses=1] + %v1222 = setne %structtype_AddressLinkedListChunk* %v1221, null ; <bool> [#uses=1] + br bool %v1222, label %block79, label %block4 + +block4: ; preds = %block0 + ret void + +block22: ; preds = %block79 + ret void + +block67: ; preds = %block79 + %v1459 = load %structtype_gc_pool** null ; <%structtype_gc_pool*> [#uses=1] + %v1460 = cast %structtype_gc_pool* %v1459 to sbyte* ; <sbyte*> [#uses=1] + %tmp_873 = cast sbyte* %v1460 to int ; <int> [#uses=1] + %tmp_874 = sub int %tmp_873, 0 ; <int> [#uses=1] + %v1461 = cast int %tmp_874 to sbyte* ; <sbyte*> [#uses=1] + %v1462 = cast sbyte* %v1461 to %structtype_header* ; <%structtype_header*> [#uses=1] + %tmp_876 = getelementptr %structtype_header* %v1462, int 0, uint 0 ; <int*> [#uses=1] + store int 0, int* %tmp_876 + ret void + +block79: ; preds = %block0 + %v1291 = load %structtype_gc_pool** null ; <%structtype_gc_pool*> [#uses=1] + %v1292 = setne %structtype_gc_pool* %v1291, null ; <bool> [#uses=1] + br bool %v1292, label %block67, label %block22 +} diff --git a/test/Transforms/InstCombine/2006-09-15-CastToBool.ll b/test/Transforms/InstCombine/2006-09-15-CastToBool.ll new file mode 100644 index 0000000..051d91f --- /dev/null +++ b/test/Transforms/InstCombine/2006-09-15-CastToBool.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep and +; PR913 + +int %test(int* %tmp1) { + %tmp.i = load int* %tmp1 ; <int> [#uses=1] + %tmp = cast int %tmp.i to uint ; <uint> [#uses=1] + %tmp2.ui = shr uint %tmp, ubyte 5 ; <uint> [#uses=1] + %tmp2 = cast uint %tmp2.ui to int ; <int> [#uses=1] + %tmp3 = and int %tmp2, 1 ; <int> [#uses=1] + %tmp3 = cast int %tmp3 to bool ; <bool> [#uses=1] + %tmp34 = cast bool %tmp3 to int ; <int> [#uses=1] + ret int %tmp34 +} + diff --git a/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst-2.ll b/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst-2.ll new file mode 100644 index 0000000..58c847f --- /dev/null +++ b/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst-2.ll @@ -0,0 +1,10 @@ +; The optimizer should be able to remove cast operation here. +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep sext.*i32 + +bool %eq_signed_to_small_unsigned(sbyte %SB) { + %Y = cast sbyte %SB to uint ; <uint> [#uses=1] + %C = seteq uint %Y, 17 ; <bool> [#uses=1] + ret bool %C + } + diff --git a/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst.ll b/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst.ll new file mode 100644 index 0000000..3ada90d --- /dev/null +++ b/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst.ll @@ -0,0 +1,10 @@ +; This test case is reduced from llvmAsmParser.cpp +; The optimizer should not remove the cast here. +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep sext.*i32 + +bool %test(short %X) { + %A = cast short %X to uint + %B = setgt uint %A, 1330 + ret bool %B +} diff --git a/test/Transforms/InstCombine/2006-10-20-mask.ll b/test/Transforms/InstCombine/2006-10-20-mask.ll new file mode 100644 index 0000000..8e829a7 --- /dev/null +++ b/test/Transforms/InstCombine/2006-10-20-mask.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep and +ulong %foo(ulong %tmp, ulong %tmp2) { + %tmp = cast ulong %tmp to uint + %tmp2 = cast ulong %tmp2 to uint + %tmp3 = and uint %tmp, %tmp2 + %tmp4 = cast uint %tmp3 to ulong + ret ulong %tmp4 +} diff --git a/test/Transforms/InstCombine/2006-10-26-VectorReassoc.ll b/test/Transforms/InstCombine/2006-10-26-VectorReassoc.ll new file mode 100644 index 0000000..2c53224e --- /dev/null +++ b/test/Transforms/InstCombine/2006-10-26-VectorReassoc.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep mul | wc -l | grep 2 + + +<4 x float> %test(<4 x float> %V) { + %Y = mul <4 x float> %V, <float 1.0, float 2.0, float 3.0, float 4.0> + %Z = mul <4 x float> %Y, <float 1.0, float 200000.0, float -3.0, float 4.0> + ret <4 x float> %Z +} diff --git a/test/Transforms/InstCombine/2006-11-03-Memmove64.ll b/test/Transforms/InstCombine/2006-11-03-Memmove64.ll new file mode 100644 index 0000000..550c2eb --- /dev/null +++ b/test/Transforms/InstCombine/2006-11-03-Memmove64.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep memmove.i32 +; Instcombine was trying to turn this into a memmove.i32 + +target datalayout = "e-p:64:64" +target endian = little +target pointersize = 64 +target triple = "alphaev67-unknown-linux-gnu" +%str10 = internal constant [1 x sbyte] zeroinitializer ; <[1 x sbyte]*> [#uses=1] + +implementation ; Functions: + +void %do_join(sbyte* %b) { +entry: + call void %llvm.memmove.i64( sbyte* %b, sbyte* getelementptr ([1 x sbyte]* %str10, int 0, ulong 0), ulong 1, uint 1 ) + ret void +} + +declare void %llvm.memmove.i64(sbyte*, sbyte*, ulong, uint) diff --git a/test/Transforms/InstCombine/2006-11-10-ashr-miscompile.ll b/test/Transforms/InstCombine/2006-11-10-ashr-miscompile.ll new file mode 100644 index 0000000..1809d3c --- /dev/null +++ b/test/Transforms/InstCombine/2006-11-10-ashr-miscompile.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep lshr +; Verify this is not turned into -1. + +int %test(ubyte %amt) { + %B = lshr int -1, ubyte %amt + ret int %B +} diff --git a/test/Transforms/InstCombine/2006-11-27-XorBug.ll b/test/Transforms/InstCombine/2006-11-27-XorBug.ll new file mode 100644 index 0000000..7cbd18e --- /dev/null +++ b/test/Transforms/InstCombine/2006-11-27-XorBug.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep and.*32 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep or.*153 +; PR1014 + +int %test(int %tmp1) { + %ovm = and int %tmp1, 32 ; <int> [#uses=1] + %ov3 = add int %ovm, 145 ; <int> [#uses=2] + %ov110 = xor int %ov3, 153 + ret int %ov110 +} + diff --git a/test/Transforms/InstCombine/2006-12-01-BadFPVectorXform.ll b/test/Transforms/InstCombine/2006-12-01-BadFPVectorXform.ll new file mode 100644 index 0000000..e2cdf31 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-01-BadFPVectorXform.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep sub +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep add + +<4 x float> %test(<4 x float> %tmp26, <4 x float> %tmp53) { + ; (X+Y)-Y != X for fp vectors. + %tmp64 = add <4 x float> %tmp26, %tmp53 + %tmp75 = sub <4 x float> %tmp64, %tmp53 + ret <4 x float> %tmp75 +} diff --git a/test/Transforms/InstCombine/2006-12-05-fp-to-int-ext.ll b/test/Transforms/InstCombine/2006-12-05-fp-to-int-ext.ll new file mode 100644 index 0000000..4661dfe --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-05-fp-to-int-ext.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep zext + +; Never merge these two conversions, even though it's possible: this is +; significantly more expensive than the two conversions on some targets +; and it causes libgcc to be compile __fixunsdfdi into a recursive +; function. + + +long %test(double %D) { + %A = fptoui double %D to uint + %B = zext uint %A to long + ret long %B +} diff --git a/test/Transforms/InstCombine/2006-12-08-ICmp-Combining.ll b/test/Transforms/InstCombine/2006-12-08-ICmp-Combining.ll new file mode 100644 index 0000000..db4b9e2 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-08-ICmp-Combining.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {%bothcond =} +bool %Doit_bb(int %i.0) { +bb: ; preds = %newFuncRoot + %tmp = setgt int %i.0, 0 ; <bool> [#uses=1] + %tmp.not = xor bool %tmp, true ; <bool> [#uses=1] + %tmp2 = setgt int %i.0, 8 ; <bool> [#uses=1] + %bothcond = or bool %tmp.not, %tmp2 ; <bool> [#uses=1] + br bool %bothcond, label %exitTrue, label %exitFalse + +exitTrue: ; preds = %bb + ret bool true + +exitFalse: ; preds = %bb + ret bool false + +} diff --git a/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll b/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll new file mode 100644 index 0000000..0965623 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll @@ -0,0 +1,57 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {icmp sgt} +; END. + +; ModuleID = 'visible.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.point = type { int, int } + +implementation ; Functions: + +int %visible(int %direction, long %p1.0, long %p2.0, long %p3.0) { +entry: + %p1_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + %p2_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + %p3_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + "alloca point" = bitcast int 0 to int ; <int> [#uses=0] + %tmp = bitcast %struct.point* %p1_addr to { long }* ; <{ long }*> [#uses=1] + %tmp = getelementptr { long }* %tmp, uint 0, uint 0 ; <long*> [#uses=1] + store long %p1.0, long* %tmp + %tmp1 = bitcast %struct.point* %p2_addr to { long }* ; <{ long }*> [#uses=1] + %tmp2 = getelementptr { long }* %tmp1, uint 0, uint 0 ; <long*> [#uses=1] + store long %p2.0, long* %tmp2 + %tmp3 = bitcast %struct.point* %p3_addr to { long }* ; <{ long }*> [#uses=1] + %tmp4 = getelementptr { long }* %tmp3, uint 0, uint 0 ; <long*> [#uses=1] + store long %p3.0, long* %tmp4 + %tmp = seteq int %direction, 0 ; <bool> [#uses=1] + %tmp5 = bitcast %struct.point* %p1_addr to { long }* ; <{ long }*> [#uses=1] + %tmp6 = getelementptr { long }* %tmp5, uint 0, uint 0 ; <long*> [#uses=1] + %tmp = load long* %tmp6 ; <long> [#uses=1] + %tmp7 = bitcast %struct.point* %p2_addr to { long }* ; <{ long }*> [#uses=1] + %tmp8 = getelementptr { long }* %tmp7, uint 0, uint 0 ; <long*> [#uses=1] + %tmp9 = load long* %tmp8 ; <long> [#uses=1] + %tmp10 = bitcast %struct.point* %p3_addr to { long }* ; <{ long }*> [#uses=1] + %tmp11 = getelementptr { long }* %tmp10, uint 0, uint 0 ; <long*> [#uses=1] + %tmp12 = load long* %tmp11 ; <long> [#uses=1] + %tmp13 = call int %determinant( long %tmp, long %tmp9, long %tmp12 ) ; <int> [#uses=2] + br bool %tmp, label %cond_true, label %cond_false + +cond_true: ; preds = %entry + %tmp14 = setlt int %tmp13, 0 ; <bool> [#uses=1] + %tmp14 = zext bool %tmp14 to int ; <int> [#uses=1] + br label %return + +cond_false: ; preds = %entry + %tmp26 = setgt int %tmp13, 0 ; <bool> [#uses=1] + %tmp26 = zext bool %tmp26 to int ; <int> [#uses=1] + br label %return + +return: ; preds = %cond_false, %cond_true + %retval.0 = phi int [ %tmp14, %cond_true ], [ %tmp26, %cond_false ] ; <int> [#uses=1] + ret int %retval.0 +} + +declare int %determinant(long, long, long) diff --git a/test/Transforms/InstCombine/2006-12-08-Select-ICmp.ll b/test/Transforms/InstCombine/2006-12-08-Select-ICmp.ll new file mode 100644 index 0000000..466fa60 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-08-Select-ICmp.ll @@ -0,0 +1,44 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep select +; END. + +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.point = type { int, int } + +implementation ; Functions: + +int %visible(int %direction, long %p1.0, long %p2.0, long %p3.0) { +entry: + %p1_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + %p2_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + %p3_addr = alloca %struct.point ; <%struct.point*> [#uses=2] + %tmp = bitcast %struct.point* %p1_addr to { long }* ; <{ long }*> [#uses=1] + %tmp = getelementptr { long }* %tmp, int 0, uint 0 ; <long*> [#uses=1] + store long %p1.0, long* %tmp + %tmp1 = bitcast %struct.point* %p2_addr to { long }* ; <{ long }*> [#uses=1] + %tmp2 = getelementptr { long }* %tmp1, int 0, uint 0 ; <long*> [#uses=1] + store long %p2.0, long* %tmp2 + %tmp3 = bitcast %struct.point* %p3_addr to { long }* ; <{ long }*> [#uses=1] + %tmp4 = getelementptr { long }* %tmp3, int 0, uint 0 ; <long*> [#uses=1] + store long %p3.0, long* %tmp4 + %tmp = seteq int %direction, 0 ; <bool> [#uses=1] + %tmp5 = bitcast %struct.point* %p1_addr to { long }* ; <{ long }*> [#uses=1] + %tmp6 = getelementptr { long }* %tmp5, int 0, uint 0 ; <long*> [#uses=1] + %tmp = load long* %tmp6 ; <long> [#uses=1] + %tmp7 = bitcast %struct.point* %p2_addr to { long }* ; <{ long }*> [#uses=1] + %tmp8 = getelementptr { long }* %tmp7, int 0, uint 0 ; <long*> [#uses=1] + %tmp9 = load long* %tmp8 ; <long> [#uses=1] + %tmp10 = bitcast %struct.point* %p3_addr to { long }* ; <{ long }*> [#uses=1] + %tmp11 = getelementptr { long }* %tmp10, int 0, uint 0 ; <long*> [#uses=1] + %tmp12 = load long* %tmp11 ; <long> [#uses=1] + %tmp13 = call int %determinant( long %tmp, long %tmp9, long %tmp12 ) ; <int> [#uses=2] + %tmp14 = setlt int %tmp13, 0 ; <bool> [#uses=1] + %tmp26 = setgt int %tmp13, 0 ; <bool> [#uses=1] + %retval.0.in = select bool %tmp, bool %tmp14, bool %tmp26 ; <bool> [#uses=1] + %retval.0 = zext bool %retval.0.in to int ; <int> [#uses=1] + ret int %retval.0 +} + +declare int %determinant(long, long, long) diff --git a/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll b/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll new file mode 100644 index 0000000..1343a4f --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll @@ -0,0 +1,167 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v {icmp ult int} +; END. + +; ModuleID = 'good.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.edgeBox = type { short, short, short, short, short, short } +%qsz = external global int ; <int*> [#uses=12] +%thresh = external global int ; <int*> [#uses=2] +%mthresh = external global int ; <int*> [#uses=1] + +implementation ; Functions: + +int %qsorte(sbyte* %base, int %n, int %size) { +entry: + %tmp = setgt int %n, 1 ; <bool> [#uses=1] + br bool %tmp, label %cond_next, label %return + +cond_next: ; preds = %entry + store int %size, int* %qsz + %tmp3 = shl int %size, ubyte 2 ; <int> [#uses=1] + store int %tmp3, int* %thresh + %tmp4 = load int* %qsz ; <int> [#uses=1] + %tmp5 = mul int %tmp4, 6 ; <int> [#uses=1] + store int %tmp5, int* %mthresh + %tmp6 = load int* %qsz ; <int> [#uses=1] + %tmp8 = mul int %tmp6, %n ; <int> [#uses=1] + %tmp9 = getelementptr sbyte* %base, int %tmp8 ; <sbyte*> [#uses=3] + %tmp11 = setgt int %n, 3 ; <bool> [#uses=1] + br bool %tmp11, label %cond_true12, label %bb30 + +cond_true12: ; preds = %cond_next + %tmp156 = call int %qste( sbyte* %base, sbyte* %tmp9 ) ; <int> [#uses=0] + %tmp16 = load int* %thresh ; <int> [#uses=1] + %tmp18 = getelementptr sbyte* %base, int %tmp16 ; <sbyte*> [#uses=2] + %tmp3117 = load int* %qsz ; <int> [#uses=1] + %tmp3318 = getelementptr sbyte* %base, int %tmp3117 ; <sbyte*> [#uses=2] + %tmp3621 = setlt sbyte* %tmp3318, %tmp18 ; <bool> [#uses=1] + br bool %tmp3621, label %bb, label %bb37 + +bb: ; preds = %bb30, %cond_true12 + %hi.0.0 = phi sbyte* [ %tmp18, %cond_true12 ], [ %hi.0, %bb30 ] ; <sbyte*> [#uses=4] + %j.1.0 = phi sbyte* [ %base, %cond_true12 ], [ %j.1, %bb30 ] ; <sbyte*> [#uses=4] + %tmp33.0 = phi sbyte* [ %tmp3318, %cond_true12 ], [ %tmp33, %bb30 ] ; <sbyte*> [#uses=6] + %tmp3 = bitcast sbyte* %j.1.0 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp4 = bitcast sbyte* %tmp33.0 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp255 = call int %comparee( %struct.edgeBox* %tmp3, %struct.edgeBox* %tmp4 ) ; <int> [#uses=1] + %tmp26 = setgt int %tmp255, 0 ; <bool> [#uses=1] + br bool %tmp26, label %cond_true27, label %bb30 + +cond_true27: ; preds = %bb + br label %bb30 + +bb30: ; preds = %cond_true27, %bb, %cond_next + %hi.0.3 = phi sbyte* [ %hi.0.0, %cond_true27 ], [ %hi.0.0, %bb ], [ undef, %cond_next ] ; <sbyte*> [#uses=0] + %j.1.3 = phi sbyte* [ %j.1.0, %cond_true27 ], [ %j.1.0, %bb ], [ undef, %cond_next ] ; <sbyte*> [#uses=0] + %tmp33.3 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %tmp33.0, %bb ], [ undef, %cond_next ] ; <sbyte*> [#uses=0] + %hi.0 = phi sbyte* [ %tmp9, %cond_next ], [ %hi.0.0, %bb ], [ %hi.0.0, %cond_true27 ] ; <sbyte*> [#uses=2] + %lo.1 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %tmp33.0, %bb ], [ %base, %cond_next ] ; <sbyte*> [#uses=1] + %j.1 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %j.1.0, %bb ], [ %base, %cond_next ] ; <sbyte*> [#uses=2] + %tmp31 = load int* %qsz ; <int> [#uses=1] + %tmp33 = getelementptr sbyte* %lo.1, int %tmp31 ; <sbyte*> [#uses=2] + %tmp36 = setlt sbyte* %tmp33, %hi.0 ; <bool> [#uses=1] + br bool %tmp36, label %bb, label %bb37 + +bb37: ; preds = %bb30, %cond_true12 + %j.1.1 = phi sbyte* [ %j.1, %bb30 ], [ %base, %cond_true12 ] ; <sbyte*> [#uses=4] + %tmp40 = seteq sbyte* %j.1.1, %base ; <bool> [#uses=1] + br bool %tmp40, label %bb115, label %cond_true41 + +cond_true41: ; preds = %bb37 + %tmp43 = load int* %qsz ; <int> [#uses=1] + %tmp45 = getelementptr sbyte* %base, int %tmp43 ; <sbyte*> [#uses=2] + %tmp6030 = setlt sbyte* %base, %tmp45 ; <bool> [#uses=1] + br bool %tmp6030, label %bb46, label %bb115 + +bb46: ; preds = %bb46, %cond_true41 + %j.2.0 = phi sbyte* [ %j.1.1, %cond_true41 ], [ %tmp52, %bb46 ] ; <sbyte*> [#uses=3] + %i.2.0 = phi sbyte* [ %base, %cond_true41 ], [ %tmp56, %bb46 ] ; <sbyte*> [#uses=3] + %tmp = load sbyte* %j.2.0 ; <sbyte> [#uses=2] + %tmp49 = load sbyte* %i.2.0 ; <sbyte> [#uses=1] + store sbyte %tmp49, sbyte* %j.2.0 + %tmp52 = getelementptr sbyte* %j.2.0, int 1 ; <sbyte*> [#uses=2] + store sbyte %tmp, sbyte* %i.2.0 + %tmp56 = getelementptr sbyte* %i.2.0, int 1 ; <sbyte*> [#uses=3] + %tmp60 = setlt sbyte* %tmp56, %tmp45 ; <bool> [#uses=1] + br bool %tmp60, label %bb46, label %bb115 + +bb66: ; preds = %bb115, %bb66 + %hi.3 = phi sbyte* [ %tmp118, %bb115 ], [ %tmp70, %bb66 ] ; <sbyte*> [#uses=2] + %tmp67 = load int* %qsz ; <int> [#uses=2] + %tmp68 = sub int 0, %tmp67 ; <int> [#uses=1] + %tmp70 = getelementptr sbyte* %hi.3, int %tmp68 ; <sbyte*> [#uses=2] + %tmp = bitcast sbyte* %tmp70 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp1 = bitcast sbyte* %tmp118 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp732 = call int %comparee( %struct.edgeBox* %tmp, %struct.edgeBox* %tmp1 ) ; <int> [#uses=1] + %tmp74 = setgt int %tmp732, 0 ; <bool> [#uses=1] + br bool %tmp74, label %bb66, label %bb75 + +bb75: ; preds = %bb66 + %tmp76 = load int* %qsz ; <int> [#uses=1] + %tmp70.sum = sub int %tmp76, %tmp67 ; <int> [#uses=1] + %tmp78 = getelementptr sbyte* %hi.3, int %tmp70.sum ; <sbyte*> [#uses=3] + %tmp81 = seteq sbyte* %tmp78, %tmp118 ; <bool> [#uses=1] + br bool %tmp81, label %bb115, label %cond_true82 + +cond_true82: ; preds = %bb75 + %tmp83 = load int* %qsz ; <int> [#uses=1] + %tmp118.sum = add int %tmp116, %tmp83 ; <int> [#uses=1] + %tmp85 = getelementptr sbyte* %min.1, int %tmp118.sum ; <sbyte*> [#uses=1] + %tmp10937 = getelementptr sbyte* %tmp85, int -1 ; <sbyte*> [#uses=3] + %tmp11239 = setlt sbyte* %tmp10937, %tmp118 ; <bool> [#uses=1] + br bool %tmp11239, label %bb115, label %bb86 + +bb86: ; preds = %bb104, %cond_true82 + %tmp109.0 = phi sbyte* [ %tmp10937, %cond_true82 ], [ %tmp109, %bb104 ] ; <sbyte*> [#uses=5] + %i.5.2 = phi sbyte* [ %i.5.3, %cond_true82 ], [ %i.5.1, %bb104 ] ; <sbyte*> [#uses=0] + %tmp100.2 = phi sbyte* [ %tmp100.3, %cond_true82 ], [ %tmp100.1, %bb104 ] ; <sbyte*> [#uses=0] + %tmp88 = load sbyte* %tmp109.0 ; <sbyte> [#uses=2] + %tmp9746 = load int* %qsz ; <int> [#uses=1] + %tmp9847 = sub int 0, %tmp9746 ; <int> [#uses=1] + %tmp10048 = getelementptr sbyte* %tmp109.0, int %tmp9847 ; <sbyte*> [#uses=3] + %tmp10350 = setlt sbyte* %tmp10048, %tmp78 ; <bool> [#uses=1] + br bool %tmp10350, label %bb104, label %bb91 + +bb91: ; preds = %bb91, %bb86 + %i.5.0 = phi sbyte* [ %tmp109.0, %bb86 ], [ %tmp100.0, %bb91 ] ; <sbyte*> [#uses=1] + %tmp100.0 = phi sbyte* [ %tmp10048, %bb86 ], [ %tmp100, %bb91 ] ; <sbyte*> [#uses=4] + %tmp93 = load sbyte* %tmp100.0 ; <sbyte> [#uses=1] + store sbyte %tmp93, sbyte* %i.5.0 + %tmp97 = load int* %qsz ; <int> [#uses=1] + %tmp98 = sub int 0, %tmp97 ; <int> [#uses=1] + %tmp100 = getelementptr sbyte* %tmp100.0, int %tmp98 ; <sbyte*> [#uses=3] + %tmp103 = setlt sbyte* %tmp100, %tmp78 ; <bool> [#uses=1] + br bool %tmp103, label %bb104, label %bb91 + +bb104: ; preds = %bb91, %bb86 + %i.5.1 = phi sbyte* [ %tmp109.0, %bb86 ], [ %tmp100.0, %bb91 ] ; <sbyte*> [#uses=4] + %tmp100.1 = phi sbyte* [ %tmp10048, %bb86 ], [ %tmp100, %bb91 ] ; <sbyte*> [#uses=3] + store sbyte %tmp88, sbyte* %i.5.1 + %tmp109 = getelementptr sbyte* %tmp109.0, int -1 ; <sbyte*> [#uses=3] + %tmp112 = setlt sbyte* %tmp109, %tmp118 ; <bool> [#uses=1] + br bool %tmp112, label %bb115, label %bb86 + +bb115: ; preds = %bb104, %cond_true82, %bb75, %bb46, %cond_true41, %bb37 + %tmp109.1 = phi sbyte* [ undef, %bb37 ], [ %tmp109.1, %bb75 ], [ %tmp10937, %cond_true82 ], [ %tmp109, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; <sbyte*> [#uses=1] + %i.5.3 = phi sbyte* [ undef, %bb37 ], [ %i.5.3, %bb75 ], [ %i.5.3, %cond_true82 ], [ %i.5.1, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; <sbyte*> [#uses=3] + %tmp100.3 = phi sbyte* [ undef, %bb37 ], [ %tmp100.3, %bb75 ], [ %tmp100.3, %cond_true82 ], [ %tmp100.1, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; <sbyte*> [#uses=3] + %min.1 = phi sbyte* [ %tmp118, %bb104 ], [ %tmp118, %bb75 ], [ %base, %bb37 ], [ %base, %bb46 ], [ %base, %cond_true41 ], [ %tmp118, %cond_true82 ] ; <sbyte*> [#uses=2] + %j.5 = phi sbyte* [ %tmp100.1, %bb104 ], [ %j.5, %bb75 ], [ %tmp52, %bb46 ], [ %j.1.1, %bb37 ], [ %j.1.1, %cond_true41 ], [ %j.5, %cond_true82 ] ; <sbyte*> [#uses=2] + %i.4 = phi sbyte* [ %i.5.1, %bb104 ], [ %i.4, %bb75 ], [ %tmp56, %bb46 ], [ undef, %bb37 ], [ %base, %cond_true41 ], [ %i.4, %cond_true82 ] ; <sbyte*> [#uses=2] + %c.4 = phi sbyte [ %tmp88, %bb104 ], [ %c.4, %bb75 ], [ %tmp, %bb46 ], [ undef, %bb37 ], [ undef, %cond_true41 ], [ %c.4, %cond_true82 ] ; <sbyte> [#uses=2] + %tmp116 = load int* %qsz ; <int> [#uses=2] + %tmp118 = getelementptr sbyte* %min.1, int %tmp116 ; <sbyte*> [#uses=9] + %tmp122 = setlt sbyte* %tmp118, %tmp9 ; <bool> [#uses=1] + br bool %tmp122, label %bb66, label %return + +return: ; preds = %bb115, %entry + ret int undef +} + +declare int %qste(sbyte*, sbyte*) + +declare int %comparee(%struct.edgeBox*, %struct.edgeBox*) diff --git a/test/Transforms/InstCombine/2006-12-15-Range-Test.ll b/test/Transforms/InstCombine/2006-12-15-Range-Test.ll new file mode 100644 index 0000000..cf253a9 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-15-Range-Test.ll @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep icmp | wc -l | grep 1 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {icmp ugt} | wc -l | grep 1 +; END. + +; ModuleID = 'bugpoint-tooptimize.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +%r = external global [17 x int] ; <[17 x int]*> [#uses=1] + +implementation ; Functions: + +bool %print_pgm_cond_true(int %tmp12.reload, int* %tmp16.out) { +newFuncRoot: + br label %cond_true + +bb27.exitStub: ; preds = %cond_true + store int %tmp16, int* %tmp16.out + ret bool true + +cond_next23.exitStub: ; preds = %cond_true + store int %tmp16, int* %tmp16.out + ret bool false + +cond_true: ; preds = %newFuncRoot + %tmp15 = getelementptr [17 x int]* %r, int 0, int %tmp12.reload ; <int*> [#uses=1] + %tmp16 = load int* %tmp15 ; <int> [#uses=4] + %tmp18 = icmp slt int %tmp16, -31 ; <bool> [#uses=1] + %tmp21 = icmp sgt int %tmp16, 31 ; <bool> [#uses=1] + %bothcond = or bool %tmp18, %tmp21 ; <bool> [#uses=1] + br bool %bothcond, label %bb27.exitStub, label %cond_next23.exitStub +} + diff --git a/test/Transforms/InstCombine/2006-12-23-Select-Cmp-Cmp.ll b/test/Transforms/InstCombine/2006-12-23-Select-Cmp-Cmp.ll new file mode 100644 index 0000000..044b945 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-23-Select-Cmp-Cmp.ll @@ -0,0 +1,35 @@ +; For PR1065. This causes an assertion in instcombine if a select with two cmp +; operands is encountered. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output +; END. + +; ModuleID = 'PR1065.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.internal_state = type { int } + %struct.mng_data = type { uint, sbyte*, uint, uint, uint, uint, uint, uint, uint, uint, uint, ubyte, uint, uint, uint, sbyte, uint, uint, uint, uint, ushort, ushort, ushort, sbyte, sbyte, double, double, double, sbyte, sbyte, sbyte, sbyte, uint, uint, uint, uint, int, sbyte, int, int, sbyte*, sbyte* (uint)*, void (sbyte*, uint)*, void (sbyte*, sbyte*, uint)*, sbyte (%struct.mng_data*)*, sbyte (%struct.mng_data*)*, sbyte (%struct.mng_data*, sbyte*, uint, uint*)*, sbyte (%struct.mng_data*, sbyte*, uint, uint*)*, sbyte (%struct.mng_data*, int, sbyte, int, uint, int, int, sbyte*)*, sbyte (%struct.mng_data*, int, int, sbyte*)*, sbyte (%struct.mng_data*, uint, uint)*, sbyte (%struct.mng_data*, ubyte, sbyte*, sbyte*, sbyte*, sbyte*)*, sbyte (%struct.mng_data*)*, sbyte (%struct.mng_data*, sbyte*)*, sbyte (%struct.mng_data*, sbyte*)*, sbyte (%struct.mng_data*, uint, uint)*, sbyte (%struct.mng_data*, int, uint, sbyte*)*, sbyte (%struct.mng_data*, ubyte, ubyte, uint, uint)*, sbyte* (%struct.mng_data*, uint)*, sbyte* (%struct.mng_data*, uint)*, sbyte* (%struct.mng_data*, uint)*, sbyte (%struct.mng_data*, uint, uint, uint, uint)*, uint (%struct.mng_data*)*, sbyte (%struct.mng_data*, uint)*, sbyte (%struct.mng_data*, uint)*, sbyte (%struct.mng_data*, uint, uint, uint, uint, uint, uint, uint, uint)*, sbyte (%struct.mng_data*, ubyte)*, sbyte (%struct.mng_data*, uint, sbyte*)*, sbyte (%struct.mng_data*, uint, sbyte, sbyte*)*, sbyte, int, uint, sbyte*, sbyte*, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, uint, uint, ubyte, ubyte, ubyte, ubyte, ubyte, uint, sbyte, sbyte, sbyte, uint, ubyte*, uint, ubyte*, uint, sbyte, ubyte, sbyte, uint, ubyte*, ubyte*, uint, uint, ubyte*, ubyte*, %struct.mng_pushdata*, %struct.mng_pushdata*, %struct.mng_pushdata*, %struct.mng_pushdata*, sbyte, sbyte, int, uint, ubyte*, sbyte, sbyte, uint, uint, uint, uint, uint, uint, sbyte, sbyte, sbyte, sbyte, int, int, sbyte*, uint, uint, uint, sbyte, sbyte, uint, uint, uint, uint, sbyte, sbyte, ubyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, uint, sbyte*, sbyte*, sbyte*, uint, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct.mng_savedata*, uint, uint, uint, uint, sbyte, int, int, int, int, int, int, int, int, int, int, int, int, uint, uint, uint, uint, ubyte*, ubyte*, ubyte*, sbyte, sbyte, int, int, int, int, int, int, int, int, int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, [256 x ubyte], double, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, ushort, sbyte, ubyte, sbyte, ubyte, sbyte, int, int, sbyte, int, int, int, int, ushort, ushort, ushort, ubyte, ushort, ubyte, int, int, uint, uint, ubyte, uint, uint, sbyte, int, int, int, int, ubyte, uint, uint, sbyte, int, int, int, int, uint, sbyte, uint, ubyte, ushort, ushort, ushort, short, uint, [256 x %struct.mng_palette8e], uint, [256 x ubyte], uint, uint, uint, uint, uint, uint, uint, uint, uint, ubyte, uint, sbyte*, ushort, ushort, ushort, sbyte*, ubyte, ubyte, uint, uint, uint, uint, sbyte, void ()*, void ()*, void ()*, void ()*, void ()*, void ()*, sbyte*, ubyte, ubyte, ubyte, uint, sbyte*, sbyte*, ushort, ushort, ushort, ushort, int, int, sbyte*, %struct.z_stream, int, int, int, int, int, uint, sbyte, sbyte, [256 x uint], sbyte } + %struct.mng_palette8e = type { ubyte, ubyte, ubyte } + %struct.mng_pushdata = type { sbyte*, sbyte*, uint, sbyte, ubyte*, uint } + %struct.mng_savedata = type { sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, ushort, ushort, ushort, ubyte, ushort, ubyte, ubyte, uint, uint, sbyte, int, int, int, int, uint, [256 x %struct.mng_palette8e], uint, [256 x ubyte], uint, uint, uint, uint, uint, uint, uint, uint, uint, ubyte, uint, sbyte*, ushort, ushort, ushort } + %struct.z_stream = type { ubyte*, uint, uint, ubyte*, uint, uint, sbyte*, %struct.internal_state*, sbyte* (sbyte*, uint, uint)*, void (sbyte*, sbyte*)*, sbyte*, int, uint, uint } + +implementation ; Functions: + +void %mng_write_basi() { +entry: + %tmp = load ubyte* null ; <ubyte> [#uses=1] + %tmp = icmp ugt ubyte %tmp, 8 ; <bool> [#uses=1] + %tmp = load ushort* null ; <ushort> [#uses=2] + %tmp3 = icmp eq ushort %tmp, 255 ; <bool> [#uses=1] + %tmp7 = icmp eq ushort %tmp, -1 ; <bool> [#uses=1] + %bOpaque.0.in = select bool %tmp, bool %tmp7, bool %tmp3 ; <bool> [#uses=1] + br bool %bOpaque.0.in, label %cond_next90, label %bb95 + +cond_next90: ; preds = %entry + ret void + +bb95: ; preds = %entry + ret void +} diff --git a/test/Transforms/InstCombine/2007-01-13-ExtCompareMiscompile.ll b/test/Transforms/InstCombine/2007-01-13-ExtCompareMiscompile.ll new file mode 100644 index 0000000..a5ee87b --- /dev/null +++ b/test/Transforms/InstCombine/2007-01-13-ExtCompareMiscompile.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep zext +; PR1107 + +define i1 @test(i8 %A, i8 %B) { + %a = zext i8 %A to i32 + %b = zext i8 %B to i32 + %c = icmp sgt i32 %a, %b + ret i1 %c +} diff --git a/test/Transforms/InstCombine/2007-01-14-FcmpSelf.ll b/test/Transforms/InstCombine/2007-01-14-FcmpSelf.ll new file mode 100644 index 0000000..073d3a1 --- /dev/null +++ b/test/Transforms/InstCombine/2007-01-14-FcmpSelf.ll @@ -0,0 +1,6 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {fcmp uno.*0.0} +; PR1111 +define i1 @test(double %X) { + %tmp = fcmp une double %X, %X + ret i1 %tmp +} diff --git a/test/Transforms/InstCombine/2007-01-18-VectorInfLoop.ll b/test/Transforms/InstCombine/2007-01-18-VectorInfLoop.ll new file mode 100644 index 0000000..83d05d9 --- /dev/null +++ b/test/Transforms/InstCombine/2007-01-18-VectorInfLoop.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output + +define <4 x i32> @test(<4 x i32> %A) { + %B = xor <4 x i32> %A, < i32 -1, i32 -1, i32 -1, i32 -1 > + %C = and <4 x i32> %B, < i32 -1, i32 -1, i32 -1, i32 -1 > + ret <4 x i32> %C +} diff --git a/test/Transforms/InstCombine/2007-01-27-AndICmp.ll b/test/Transforms/InstCombine/2007-01-27-AndICmp.ll new file mode 100644 index 0000000..0e8c5b1 --- /dev/null +++ b/test/Transforms/InstCombine/2007-01-27-AndICmp.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ugt.*, 1} + +define i1 @test(i32 %tmp1030) { + %tmp1037 = icmp ne i32 %tmp1030, 40 ; <i1> [#uses=1] + %tmp1039 = icmp ne i32 %tmp1030, 41 ; <i1> [#uses=1] + %tmp1042 = and i1 %tmp1037, %tmp1039 ; <i1> [#uses=1] + ret i1 %tmp1042 +} diff --git a/test/Transforms/InstCombine/2007-02-01-LoadSinkAlloca.ll b/test/Transforms/InstCombine/2007-02-01-LoadSinkAlloca.ll new file mode 100644 index 0000000..e559cdd --- /dev/null +++ b/test/Transforms/InstCombine/2007-02-01-LoadSinkAlloca.ll @@ -0,0 +1,45 @@ +; RUN: llvm-as < %s | opt -instcombine -mem2reg | llvm-dis | grep {%A = alloca} +; RUN: llvm-as < %s | opt -instcombine -mem2reg | llvm-dis | \ +; RUN: not grep {%B = alloca} +; END. + +; Ensure that instcombine doesn't sink the loads in entry/cond_true into +; cond_next. Doing so prevents mem2reg from promoting the B alloca. + +define i32 @test2(i32 %C) { +entry: + %A = alloca i32 + %B = alloca i32 + %tmp = call i32 (...)* @bar( i32* %A ) ; <i32> [#uses=0] + %T = load i32* %A ; <i32> [#uses=1] + %tmp2 = icmp eq i32 %C, 0 ; <i1> [#uses=1] + br i1 %tmp2, label %cond_next, label %cond_true + +cond_true: ; preds = %entry + store i32 123, i32* %B + call i32 @test2( i32 123 ) ; <i32>:0 [#uses=0] + %T1 = load i32* %B ; <i32> [#uses=1] + br label %cond_next + +cond_next: ; preds = %cond_true, %entry + %tmp1.0 = phi i32 [ %T1, %cond_true ], [ %T, %entry ] ; <i32> [#uses=1] + %tmp7 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp8 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp9 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp10 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp11 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp12 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp13 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp14 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp15 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp16 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp17 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp18 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp19 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + %tmp20 = call i32 (...)* @baq( ) ; <i32> [#uses=0] + ret i32 %tmp1.0 +} + +declare i32 @bar(...) + +declare i32 @baq(...) diff --git a/test/Transforms/InstCombine/2007-02-07-PointerCast.ll b/test/Transforms/InstCombine/2007-02-07-PointerCast.ll new file mode 100644 index 0000000..f38b4c1 --- /dev/null +++ b/test/Transforms/InstCombine/2007-02-07-PointerCast.ll @@ -0,0 +1,26 @@ +;RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep zext + +; Make sure the uint isn't removed. Instcombine in llvm 1.9 was dropping the +; uint cast which was causing a sign extend. This only affected code with +; pointers in the high half of memory, so it wasn't noticed much +; compile a kernel though... + +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 + +%str = internal constant [6 x sbyte] c"%llx\0A\00" + +implementation ; Functions: + +declare int %printf(sbyte*, ...) + +int %main(int %x, sbyte** %a) { +entry: + %tmp = getelementptr [6 x sbyte]* %str, int 0, uint 0 + %tmp1 = load sbyte** %a + %tmp2 = cast sbyte* %tmp1 to uint ; <uint> [#uses=1] + %tmp3 = cast uint %tmp2 to long ; <long> [#uses=1] + %tmp = call int (sbyte*, ...)* %printf( sbyte* %tmp, long %tmp3 ) + ret int 0 +} diff --git a/test/Transforms/InstCombine/2007-02-23-PhiFoldInfLoop.ll b/test/Transforms/InstCombine/2007-02-23-PhiFoldInfLoop.ll new file mode 100644 index 0000000..d60da44 --- /dev/null +++ b/test/Transforms/InstCombine/2007-02-23-PhiFoldInfLoop.ll @@ -0,0 +1,31 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep ret +; PR1217 + +target datalayout = "e-p:32:32" +target triple = "i686-pc-linux-gnu" + %struct.termbox = type { %struct.termbox*, i32, i32, i32, i32, i32 } + + +define void @ggenorien() { +entry: + %tmp68 = icmp eq %struct.termbox* null, null ; <i1> [#uses=1] + br i1 %tmp68, label %cond_next448, label %bb80 + +bb80: ; preds = %entry + ret void + +cond_next448: ; preds = %entry + br i1 false, label %bb756, label %bb595 + +bb595: ; preds = %cond_next448 + br label %bb609 + +bb609: ; preds = %bb756, %bb595 + %termnum.6240.0 = phi i32 [ 2, %bb595 ], [ %termnum.6, %bb756 ] ; <i32> [#uses=1] + %tmp755 = add i32 %termnum.6240.0, 1 ; <i32> [#uses=1] + br label %bb756 + +bb756: ; preds = %bb609, %cond_next448 + %termnum.6 = phi i32 [ %tmp755, %bb609 ], [ 2, %cond_next448 ] ; <i32> [#uses=1] + br label %bb609 +} diff --git a/test/Transforms/InstCombine/2007-03-13-CompareMerge.ll b/test/Transforms/InstCombine/2007-03-13-CompareMerge.ll new file mode 100644 index 0000000..d101050 --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-13-CompareMerge.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {icmp sle} +; PR1244 + +define i1 @test(i32 %c.3.i, i32 %d.292.2.i) { + %tmp266.i = icmp slt i32 %c.3.i, %d.292.2.i + %tmp276.i = icmp eq i32 %c.3.i, %d.292.2.i + %sel_tmp80 = or i1 %tmp266.i, %tmp276.i + ret i1 %sel_tmp80 +} diff --git a/test/Transforms/InstCombine/2007-03-19-BadTruncChangePR1261.ll b/test/Transforms/InstCombine/2007-03-19-BadTruncChangePR1261.ll new file mode 100644 index 0000000..da58dec --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-19-BadTruncChangePR1261.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as %s -o - | opt -instcombine | llvm-dis | grep zext +; PR1261. + +define i16 @test(i31 %zzz) { + %A = sext i31 %zzz to i32 + %B = add i32 %A, 16384 + %C = lshr i32 %B, 15 + %D = trunc i32 %C to i16 + ret i16 %D +} diff --git a/test/Transforms/InstCombine/2007-03-21-SignedRangeTest.ll b/test/Transforms/InstCombine/2007-03-21-SignedRangeTest.ll new file mode 100644 index 0000000..c8dafd1 --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-21-SignedRangeTest.ll @@ -0,0 +1,7 @@ +; For PR1248 +; RUN: llvm-as %s -o - | opt -instcombine | llvm-dis | grep {ugt i32 .*, 11} +define i1 @test(i32 %tmp6) { + %tmp7 = sdiv i32 %tmp6, 12 ; <i32> [#uses=1] + icmp ne i32 %tmp7, -6 ; <i1>:1 [#uses=1] + ret i1 %1 +} diff --git a/test/Transforms/InstCombine/2007-03-25-BadShiftMask.ll b/test/Transforms/InstCombine/2007-03-25-BadShiftMask.ll new file mode 100644 index 0000000..0b05f7c --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-25-BadShiftMask.ll @@ -0,0 +1,29 @@ +; PR1271 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep {icmp eq i32 .tmp.*, 2146435072} +%struct..0anon = type { i32, i32 } +%struct..1anon = type { double } + +define i32 @main() { +entry: + %u = alloca %struct..1anon, align 8 ; <%struct..1anon*> [#uses=4] + %tmp1 = getelementptr %struct..1anon* %u, i32 0, i32 0 ; <double*> [#uses=1] + store double 0x7FF0000000000000, double* %tmp1 + %tmp3 = getelementptr %struct..1anon* %u, i32 0, i32 0 ; <double*> [#uses=1] + %tmp34 = bitcast double* %tmp3 to %struct..0anon* ; <%struct..0anon*> [#uses=1] + %tmp5 = getelementptr %struct..0anon* %tmp34, i32 0, i32 1 ; <i32*> [#uses=1] + %tmp6 = load i32* %tmp5 ; <i32> [#uses=1] + %tmp7 = shl i32 %tmp6, 1 ; <i32> [#uses=1] + %tmp8 = lshr i32 %tmp7, 21 ; <i32> [#uses=1] + %tmp89 = trunc i32 %tmp8 to i16 ; <i16> [#uses=1] + icmp ne i16 %tmp89, 2047 ; <i1>:0 [#uses=1] + zext i1 %0 to i8 ; <i8>:1 [#uses=1] + icmp ne i8 %1, 0 ; <i1>:2 [#uses=1] + br i1 %2, label %cond_true, label %cond_false + +cond_true: ; preds = %entry + ret i32 0 + +cond_false: ; preds = %entry + ret i32 1 +} diff --git a/test/Transforms/InstCombine/2007-03-25-DoubleShift.ll b/test/Transforms/InstCombine/2007-03-25-DoubleShift.ll new file mode 100644 index 0000000..d67e1a1 --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-25-DoubleShift.ll @@ -0,0 +1,9 @@ +; PR1271 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep and +define i1 @test(i32 %tmp13) { +entry: + %tmp14 = shl i32 %tmp13, 12 ; <i32> [#uses=1] + %tmp15 = lshr i32 %tmp14, 12 ; <i32> [#uses=1] + %res = icmp ne i32 %tmp15, 0 ; <i1>:3 [#uses=1] + ret i1 %res +} diff --git a/test/Transforms/InstCombine/2007-03-26-BadShiftMask.ll b/test/Transforms/InstCombine/2007-03-26-BadShiftMask.ll new file mode 100644 index 0000000..4a2e60e --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-26-BadShiftMask.ll @@ -0,0 +1,36 @@ +; PR1271 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep {ashr i32 %.mp137, 2} +; END. + +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" + + +define i1 @test(i32* %tmp141, i32* %tmp145, + i32 %b8, i32 %iftmp.430.0, i32* %tmp134.out, i32* %tmp137.out) +{ +newFuncRoot: + %tmp133 = and i32 %b8, 1 ; <i32> [#uses=1] + %tmp134 = shl i32 %tmp133, 3 ; <i32> [#uses=3] + %tmp136 = ashr i32 %b8, 1 ; <i32> [#uses=1] + %tmp137 = shl i32 %tmp136, 3 ; <i32> [#uses=3] + %tmp139 = ashr i32 %tmp134, 2 ; <i32> [#uses=1] + store i32 %tmp139, i32* %tmp141 + %tmp143 = ashr i32 %tmp137, 2 ; <i32> [#uses=1] + store i32 %tmp143, i32* %tmp145 + icmp eq i32 %iftmp.430.0, 0 ; <i1>:0 [#uses=1] + zext i1 %0 to i8 ; <i8>:1 [#uses=1] + icmp ne i8 %1, 0 ; <i1>:2 [#uses=1] + br i1 %2, label %cond_true147.exitStub, label %cond_false252.exitStub + +cond_true147.exitStub: ; preds = %newFuncRoot + store i32 %tmp134, i32* %tmp134.out + store i32 %tmp137, i32* %tmp137.out + ret i1 true + +cond_false252.exitStub: ; preds = %newFuncRoot + store i32 %tmp134, i32* %tmp134.out + store i32 %tmp137, i32* %tmp137.out + ret i1 false +} diff --git a/test/Transforms/InstCombine/2007-03-27-PR1280.ll b/test/Transforms/InstCombine/2007-03-27-PR1280.ll new file mode 100644 index 0000000..6cb9aae --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-27-PR1280.ll @@ -0,0 +1,15 @@ +; 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: llvm-as < %s | opt -instcombine | llvm-dis | 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/2007-03-31-InfiniteLoop.ll b/test/Transforms/InstCombine/2007-03-31-InfiniteLoop.ll new file mode 100644 index 0000000..640f6d5 --- /dev/null +++ b/test/Transforms/InstCombine/2007-03-31-InfiniteLoop.ll @@ -0,0 +1,302 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output +; END. + +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-apple-darwin8" + %struct.ZZIP_FILE = type { %struct.zzip_dir*, i32, i32, i32, i32, i32, i32, i64, i8*, i64, %struct.z_stream, %struct.zzip_plugin_io* } + %struct.anon = type { %struct.ZZIP_FILE*, i8* } + %struct.internal_state = type { i32 } + %struct.z_stream = type { i8*, i32, i32, i8*, i32, i32, i8*, %struct.internal_state*, i8* (i8*, i32, i32)*, void (i8*, i8*)*, i8*, i32, i32, i32 } + %struct.zzip_dir = type { i32, i32, i32, %struct.anon, %struct.zzip_dir_hdr*, %struct.zzip_dir_hdr*, %struct.ZZIP_FILE*, %struct.zzip_dirent, i8*, i8*, i8**, %struct.zzip_plugin_io* } + %struct.zzip_dir_hdr = type { i32, i32, i32, i32, i16, i16, i8, i16, [1 x i8] } + %struct.zzip_dirent = type { i32, i32, i32, i16, i8*, i32, i32 } + %struct.zzip_plugin_io = type { i32 (i8*, i32, ...)*, i32 (i32)*, i32 (i32, i8*, i32)*, i64 (i32, i64, i32)*, i64 (i32)*, i32 } + +define %struct.ZZIP_FILE* @zzip_open_shared_io(%struct.ZZIP_FILE* %stream, i8* %filename, i32 %o_flags, i32 %o_modes, i8** %ext, %struct.zzip_plugin_io* %io) { +entry: + %basename = alloca [1024 x i8], align 16 ; <[1024 x i8]*> [#uses=5] + %e = alloca i32, align 4 ; <i32*> [#uses=4] + icmp eq %struct.ZZIP_FILE* %stream, null ; <i1>:0 [#uses=1] + br i1 %0, label %cond_next22, label %cond_true + +cond_true: ; preds = %entry + %tmp3 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp4 = load %struct.zzip_dir** %tmp3 ; <%struct.zzip_dir*> [#uses=1] + icmp eq %struct.zzip_dir* %tmp4, null ; <i1>:1 [#uses=1] + br i1 %1, label %cond_next22, label %cond_true5 + +cond_true5: ; preds = %cond_true + icmp eq i8** %ext, null ; <i1>:2 [#uses=1] + br i1 %2, label %cond_true7, label %cond_next + +cond_true7: ; preds = %cond_true5 + %tmp9 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp10 = load %struct.zzip_dir** %tmp9 ; <%struct.zzip_dir*> [#uses=1] + %tmp11 = getelementptr %struct.zzip_dir* %tmp10, i32 0, i32 10 ; <i8***> [#uses=1] + %tmp12 = load i8*** %tmp11 ; <i8**> [#uses=1] + br label %cond_next + +cond_next: ; preds = %cond_true7, %cond_true5 + %ext_addr.0 = phi i8** [ %ext, %cond_true5 ], [ %tmp12, %cond_true7 ] ; <i8**> [#uses=2] + icmp eq %struct.zzip_plugin_io* %io, null ; <i1>:3 [#uses=1] + br i1 %3, label %cond_true14, label %cond_next22 + +cond_true14: ; preds = %cond_next + %tmp16 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp17 = load %struct.zzip_dir** %tmp16 ; <%struct.zzip_dir*> [#uses=1] + %tmp18 = getelementptr %struct.zzip_dir* %tmp17, i32 0, i32 11 ; <%struct.zzip_plugin_io**> [#uses=1] + %tmp19 = load %struct.zzip_plugin_io** %tmp18 ; <%struct.zzip_plugin_io*> [#uses=1] + br label %cond_next22 + +cond_next22: ; preds = %cond_true14, %cond_next, %cond_true, %entry + %io_addr.0 = phi %struct.zzip_plugin_io* [ %io, %entry ], [ %io, %cond_true ], [ %io, %cond_next ], [ %tmp19, %cond_true14 ] ; <%struct.zzip_plugin_io*> [#uses=2] + %ext_addr.1 = phi i8** [ %ext, %entry ], [ %ext, %cond_true ], [ %ext_addr.0, %cond_next ], [ %ext_addr.0, %cond_true14 ] ; <i8**> [#uses=2] + icmp eq %struct.zzip_plugin_io* %io_addr.0, null ; <i1>:4 [#uses=1] + br i1 %4, label %cond_true24, label %cond_next26 + +cond_true24: ; preds = %cond_next22 + %tmp25 = call %struct.zzip_plugin_io* @zzip_get_default_io( ) ; <%struct.zzip_plugin_io*> [#uses=1] + br label %cond_next26 + +cond_next26: ; preds = %cond_true24, %cond_next22 + %io_addr.1 = phi %struct.zzip_plugin_io* [ %io_addr.0, %cond_next22 ], [ %tmp25, %cond_true24 ] ; <%struct.zzip_plugin_io*> [#uses=4] + %tmp28 = and i32 %o_modes, 81920 ; <i32> [#uses=1] + icmp eq i32 %tmp28, 0 ; <i1>:5 [#uses=1] + br i1 %5, label %try_real, label %try_zzip + +try_real: ; preds = %bb223, %cond_next26 + %fd160.2 = phi i32 [ undef, %cond_next26 ], [ %fd160.0, %bb223 ] ; <i32> [#uses=1] + %len.2 = phi i32 [ undef, %cond_next26 ], [ %len.0, %bb223 ] ; <i32> [#uses=1] + %o_flags_addr.1 = phi i32 [ %o_flags, %cond_next26 ], [ %o_flags_addr.0, %bb223 ] ; <i32> [#uses=2] + %tmp33348 = and i32 %o_modes, 262144 ; <i32> [#uses=1] + icmp eq i32 %tmp33348, 0 ; <i1>:6 [#uses=1] + br i1 %6, label %cond_next38, label %cond_true35 + +cond_true35: ; preds = %try_real + %tmp36 = call %struct.zzip_plugin_io* @zzip_get_default_io( ) ; <%struct.zzip_plugin_io*> [#uses=1] + br label %cond_next38 + +cond_next38: ; preds = %cond_true35, %try_real + %iftmp.21.0 = phi %struct.zzip_plugin_io* [ %tmp36, %cond_true35 ], [ %io_addr.1, %try_real ] ; <%struct.zzip_plugin_io*> [#uses=3] + %tmp41 = getelementptr %struct.zzip_plugin_io* %iftmp.21.0, i32 0, i32 0 ; <i32 (i8*, i32, ...)**> [#uses=1] + %tmp42 = load i32 (i8*, i32, ...)** %tmp41 ; <i32 (i8*, i32, ...)*> [#uses=1] + %tmp45 = call i32 (i8*, i32, ...)* %tmp42( i8* %filename, i32 %o_flags_addr.1 ) ; <i32> [#uses=3] + icmp eq i32 %tmp45, -1 ; <i1>:7 [#uses=1] + br i1 %7, label %cond_next67, label %cond_true47 + +cond_true47: ; preds = %cond_next38 + %tmp48 = call i8* @cli_calloc( i32 1, i32 108 ) ; <i8*> [#uses=2] + %tmp4849 = bitcast i8* %tmp48 to %struct.ZZIP_FILE* ; <%struct.ZZIP_FILE*> [#uses=3] + icmp eq i8* %tmp48, null ; <i1>:8 [#uses=1] + br i1 %8, label %cond_true51, label %cond_next58 + +cond_true51: ; preds = %cond_true47 + %tmp53 = getelementptr %struct.zzip_plugin_io* %iftmp.21.0, i32 0, i32 1 ; <i32 (i32)**> [#uses=1] + %tmp54 = load i32 (i32)** %tmp53 ; <i32 (i32)*> [#uses=1] + %tmp56 = call i32 %tmp54( i32 %tmp45 ) ; <i32> [#uses=0] + ret %struct.ZZIP_FILE* null + +cond_next58: ; preds = %cond_true47 + %tmp60 = getelementptr %struct.ZZIP_FILE* %tmp4849, i32 0, i32 1 ; <i32*> [#uses=1] + store i32 %tmp45, i32* %tmp60 + %tmp63 = getelementptr %struct.ZZIP_FILE* %tmp4849, i32 0, i32 11 ; <%struct.zzip_plugin_io**> [#uses=1] + store %struct.zzip_plugin_io* %iftmp.21.0, %struct.zzip_plugin_io** %tmp63 + ret %struct.ZZIP_FILE* %tmp4849 + +cond_next67: ; preds = %cond_next38 + %tmp70716 = and i32 %o_modes, 16384 ; <i32> [#uses=1] + icmp eq i32 %tmp70716, 0 ; <i1>:9 [#uses=1] + br i1 %9, label %try_zzip, label %return + +try_zzip: ; preds = %cond_next67, %cond_next26 + %fd160.3 = phi i32 [ %fd160.2, %cond_next67 ], [ undef, %cond_next26 ] ; <i32> [#uses=6] + %len.3 = phi i32 [ %len.2, %cond_next67 ], [ undef, %cond_next26 ] ; <i32> [#uses=3] + %o_flags_addr.3 = phi i32 [ %o_flags_addr.1, %cond_next67 ], [ %o_flags, %cond_next26 ] ; <i32> [#uses=4] + %tmp76 = and i32 %o_flags_addr.3, 513 ; <i32> [#uses=1] + icmp eq i32 %tmp76, 0 ; <i1>:10 [#uses=1] + br i1 %10, label %cond_next80, label %cond_true77 + +cond_true77: ; preds = %try_zzip + %tmp78 = call i32* @__error( ) ; <i32*> [#uses=1] + store i32 22, i32* %tmp78 + ret %struct.ZZIP_FILE* null + +cond_next80: ; preds = %try_zzip + %tmp83844 = and i32 %o_flags_addr.3, 2 ; <i32> [#uses=1] + icmp eq i32 %tmp83844, 0 ; <i1>:11 [#uses=1] + %tmp87 = xor i32 %o_flags_addr.3, 2 ; <i32> [#uses=1] + %o_flags_addr.0 = select i1 %11, i32 %o_flags_addr.3, i32 %tmp87 ; <i32> [#uses=2] + %basename90 = getelementptr [1024 x i8]* %basename, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp92 = call i8* @strcpy( i8* %basename90, i8* %filename ) ; <i8*> [#uses=0] + icmp eq %struct.ZZIP_FILE* %stream, null ; <i1>:12 [#uses=1] + br i1 %12, label %bb219, label %cond_true94 + +cond_true94: ; preds = %cond_next80 + %tmp96 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp97 = load %struct.zzip_dir** %tmp96 ; <%struct.zzip_dir*> [#uses=1] + icmp eq %struct.zzip_dir* %tmp97, null ; <i1>:13 [#uses=1] + br i1 %13, label %bb219, label %cond_true98 + +cond_true98: ; preds = %cond_true94 + %tmp100 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp101 = load %struct.zzip_dir** %tmp100 ; <%struct.zzip_dir*> [#uses=1] + %tmp102 = getelementptr %struct.zzip_dir* %tmp101, i32 0, i32 9 ; <i8**> [#uses=1] + %tmp103 = load i8** %tmp102 ; <i8*> [#uses=1] + icmp eq i8* %tmp103, null ; <i1>:14 [#uses=1] + br i1 %14, label %bb219, label %cond_true104 + +cond_true104: ; preds = %cond_true98 + %tmp106 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp107 = load %struct.zzip_dir** %tmp106 ; <%struct.zzip_dir*> [#uses=1] + %tmp108 = getelementptr %struct.zzip_dir* %tmp107, i32 0, i32 9 ; <i8**> [#uses=1] + %tmp109 = load i8** %tmp108 ; <i8*> [#uses=1] + %tmp110 = call i32 @strlen( i8* %tmp109 ) ; <i32> [#uses=7] + %tmp112 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp113 = load %struct.zzip_dir** %tmp112 ; <%struct.zzip_dir*> [#uses=1] + %tmp114 = getelementptr %struct.zzip_dir* %tmp113, i32 0, i32 9 ; <i8**> [#uses=1] + %tmp115 = load i8** %tmp114 ; <i8*> [#uses=1] + %tmp118 = call i32 @memcmp( i8* %filename, i8* %tmp115, i32 %tmp110 ) ; <i32> [#uses=1] + icmp eq i32 %tmp118, 0 ; <i1>:15 [#uses=1] + br i1 %15, label %cond_true119, label %bb219 + +cond_true119: ; preds = %cond_true104 + %tmp122 = getelementptr i8* %filename, i32 %tmp110 ; <i8*> [#uses=1] + %tmp123 = load i8* %tmp122 ; <i8> [#uses=1] + icmp eq i8 %tmp123, 47 ; <i1>:16 [#uses=1] + br i1 %16, label %cond_true124, label %bb219 + +cond_true124: ; preds = %cond_true119 + %tmp126 = add i32 %tmp110, 1 ; <i32> [#uses=1] + %tmp128 = getelementptr i8* %filename, i32 %tmp126 ; <i8*> [#uses=1] + %tmp129 = load i8* %tmp128 ; <i8> [#uses=1] + icmp eq i8 %tmp129, 0 ; <i1>:17 [#uses=1] + br i1 %17, label %bb219, label %cond_true130 + +cond_true130: ; preds = %cond_true124 + %tmp134.sum = add i32 %tmp110, 1 ; <i32> [#uses=1] + %tmp135 = getelementptr i8* %filename, i32 %tmp134.sum ; <i8*> [#uses=1] + %tmp137 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp138 = load %struct.zzip_dir** %tmp137 ; <%struct.zzip_dir*> [#uses=1] + %tmp140 = call %struct.ZZIP_FILE* @zzip_file_open( %struct.zzip_dir* %tmp138, i8* %tmp135, i32 %o_modes, i32 -1 ) ; <%struct.ZZIP_FILE*> [#uses=3] + icmp eq %struct.ZZIP_FILE* %tmp140, null ; <i1>:18 [#uses=1] + br i1 %18, label %cond_true142, label %return + +cond_true142: ; preds = %cond_true130 + %tmp144 = getelementptr %struct.ZZIP_FILE* %stream, i32 0, i32 0 ; <%struct.zzip_dir**> [#uses=1] + %tmp145 = load %struct.zzip_dir** %tmp144 ; <%struct.zzip_dir*> [#uses=1] + %tmp146 = getelementptr %struct.zzip_dir* %tmp145, i32 0, i32 1 ; <i32*> [#uses=1] + %tmp147 = load i32* %tmp146 ; <i32> [#uses=1] + %tmp148 = call i32 @zzip_errno( i32 %tmp147 ) ; <i32> [#uses=1] + %tmp149 = call i32* @__error( ) ; <i32*> [#uses=1] + store i32 %tmp148, i32* %tmp149 + ret %struct.ZZIP_FILE* %tmp140 + +bb: ; preds = %bb219 + store i32 0, i32* %e + store i8 0, i8* %tmp221 + %basename162 = getelementptr [1024 x i8]* %basename, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp166 = call i32 @__zzip_try_open( i8* %basename162, i32 %o_flags_addr.0, i8** %ext_addr.1, %struct.zzip_plugin_io* %io_addr.1 ) ; <i32> [#uses=4] + icmp eq i32 %tmp166, -1 ; <i1>:19 [#uses=1] + br i1 %19, label %bb219, label %cond_next169 + +cond_next169: ; preds = %bb + %tmp173 = call %struct.zzip_dir* @zzip_dir_fdopen_ext_io( i32 %tmp166, i32* %e, i8** %ext_addr.1, %struct.zzip_plugin_io* %io_addr.1 ) ; <%struct.zzip_dir*> [#uses=7] + %tmp174 = load i32* %e ; <i32> [#uses=1] + icmp eq i32 %tmp174, 0 ; <i1>:20 [#uses=1] + br i1 %20, label %cond_next185, label %cond_true175 + +cond_true175: ; preds = %cond_next169 + %tmp176 = load i32* %e ; <i32> [#uses=1] + %tmp177 = call i32 @zzip_errno( i32 %tmp176 ) ; <i32> [#uses=1] + %tmp178 = call i32* @__error( ) ; <i32*> [#uses=1] + store i32 %tmp177, i32* %tmp178 + %tmp180 = getelementptr %struct.zzip_plugin_io* %io_addr.1, i32 0, i32 1 ; <i32 (i32)**> [#uses=1] + %tmp181 = load i32 (i32)** %tmp180 ; <i32 (i32)*> [#uses=1] + %tmp183 = call i32 %tmp181( i32 %tmp166 ) ; <i32> [#uses=0] + ret %struct.ZZIP_FILE* null + +cond_next185: ; preds = %cond_next169 + %tmp186187 = ptrtoint i8* %tmp221 to i32 ; <i32> [#uses=1] + %basename188189 = ptrtoint [1024 x i8]* %basename to i32 ; <i32> [#uses=1] + %tmp190 = sub i32 %tmp186187, %basename188189 ; <i32> [#uses=1] + %tmp192.sum = add i32 %tmp190, 1 ; <i32> [#uses=1] + %tmp193 = getelementptr i8* %filename, i32 %tmp192.sum ; <i8*> [#uses=1] + %tmp196 = call %struct.ZZIP_FILE* @zzip_file_open( %struct.zzip_dir* %tmp173, i8* %tmp193, i32 %o_modes, i32 -1 ) ; <%struct.ZZIP_FILE*> [#uses=4] + icmp eq %struct.ZZIP_FILE* %tmp196, null ; <i1>:21 [#uses=1] + br i1 %21, label %cond_true198, label %cond_false204 + +cond_true198: ; preds = %cond_next185 + %tmp200 = getelementptr %struct.zzip_dir* %tmp173, i32 0, i32 1 ; <i32*> [#uses=1] + %tmp201 = load i32* %tmp200 ; <i32> [#uses=1] + %tmp202 = call i32 @zzip_errno( i32 %tmp201 ) ; <i32> [#uses=1] + %tmp203 = call i32* @__error( ) ; <i32*> [#uses=1] + store i32 %tmp202, i32* %tmp203 + %tmp2169 = call i32 @zzip_dir_close( %struct.zzip_dir* %tmp173 ) ; <i32> [#uses=0] + ret %struct.ZZIP_FILE* %tmp196 + +cond_false204: ; preds = %cond_next185 + %tmp206 = getelementptr %struct.zzip_dir* %tmp173, i32 0, i32 9 ; <i8**> [#uses=1] + %tmp207 = load i8** %tmp206 ; <i8*> [#uses=1] + icmp eq i8* %tmp207, null ; <i1>:22 [#uses=1] + br i1 %22, label %cond_true208, label %cond_next214 + +cond_true208: ; preds = %cond_false204 + %basename209 = getelementptr [1024 x i8]* %basename, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp210 = call i8* @strdup( i8* %basename209 ) ; <i8*> [#uses=1] + %tmp212 = getelementptr %struct.zzip_dir* %tmp173, i32 0, i32 9 ; <i8**> [#uses=1] + store i8* %tmp210, i8** %tmp212 + %tmp21610 = call i32 @zzip_dir_close( %struct.zzip_dir* %tmp173 ) ; <i32> [#uses=0] + ret %struct.ZZIP_FILE* %tmp196 + +cond_next214: ; preds = %cond_false204 + %tmp216 = call i32 @zzip_dir_close( %struct.zzip_dir* %tmp173 ) ; <i32> [#uses=0] + ret %struct.ZZIP_FILE* %tmp196 + +bb219: ; preds = %bb, %cond_true124, %cond_true119, %cond_true104, %cond_true98, %cond_true94, %cond_next80 + %fd160.0 = phi i32 [ %fd160.3, %cond_next80 ], [ %tmp166, %bb ], [ %fd160.3, %cond_true94 ], [ %fd160.3, %cond_true98 ], [ %fd160.3, %cond_true104 ], [ %fd160.3, %cond_true119 ], [ %fd160.3, %cond_true124 ] ; <i32> [#uses=1] + %len.0 = phi i32 [ %len.3, %cond_next80 ], [ %len.0, %bb ], [ %len.3, %cond_true94 ], [ %len.3, %cond_true98 ], [ %tmp110, %cond_true104 ], [ %tmp110, %cond_true119 ], [ %tmp110, %cond_true124 ] ; <i32> [#uses=2] + %basename220 = getelementptr [1024 x i8]* %basename, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp221 = call i8* @strrchr( i8* %basename220, i32 47 ) ; <i8*> [#uses=3] + icmp eq i8* %tmp221, null ; <i1>:23 [#uses=1] + br i1 %23, label %bb223, label %bb + +bb223: ; preds = %bb219 + %tmp2262272 = and i32 %o_modes, 16384 ; <i32> [#uses=1] + icmp eq i32 %tmp2262272, 0 ; <i1>:24 [#uses=1] + br i1 %24, label %cond_next229, label %try_real + +cond_next229: ; preds = %bb223 + %tmp230 = call i32* @__error( ) ; <i32*> [#uses=1] + store i32 2, i32* %tmp230 + ret %struct.ZZIP_FILE* null + +return: ; preds = %cond_true130, %cond_next67 + %retval.0 = phi %struct.ZZIP_FILE* [ null, %cond_next67 ], [ %tmp140, %cond_true130 ] ; <%struct.ZZIP_FILE*> [#uses=1] + ret %struct.ZZIP_FILE* %retval.0 +} + +declare i32 @zzip_dir_close(%struct.zzip_dir*) + +declare i8* @strrchr(i8*, i32) + +declare %struct.ZZIP_FILE* @zzip_file_open(%struct.zzip_dir*, i8*, i32, i32) + +declare i8* @cli_calloc(i32, i32) + +declare i32 @zzip_errno(i32) + +declare i32* @__error() + +declare %struct.zzip_plugin_io* @zzip_get_default_io() + +declare i8* @strcpy(i8*, i8*) + +declare i32 @strlen(i8*) + +declare i32 @memcmp(i8*, i8*, i32) + +declare i32 @__zzip_try_open(i8*, i32, i8**, %struct.zzip_plugin_io*) + +declare %struct.zzip_dir* @zzip_dir_fdopen_ext_io(i32, i32*, i8**, %struct.zzip_plugin_io*) + +declare i8* @strdup(i8*) diff --git a/test/Transforms/InstCombine/2007-04-04-BadFoldBitcastIntoMalloc.ll b/test/Transforms/InstCombine/2007-04-04-BadFoldBitcastIntoMalloc.ll new file mode 100644 index 0000000..e738635 --- /dev/null +++ b/test/Transforms/InstCombine/2007-04-04-BadFoldBitcastIntoMalloc.ll @@ -0,0 +1,19 @@ +; In the presence of a negative offset (the -8 below), a fold of a bitcast into +; a malloc messes up the element count, causing an extra 4GB to be allocated on +; 64-bit targets. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {= add } + +target datalayout = "e-p:64:64:64-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 = "x86_64-unknown-freebsd6.2" + +define i1 @test(i32 %tmp141, double** %tmp145) +{ + %tmp133 = add i32 %tmp141, 1 + %tmp134 = shl i32 %tmp133, 3 + %tmp135 = add i32 %tmp134, -8 + %tmp136 = malloc i8, i32 %tmp135 + %tmp137 = bitcast i8* %tmp136 to double* + store double* %tmp137, double** %tmp145 + ret i1 false +} diff --git a/test/Transforms/InstCombine/2007-04-08-SingleEltVectorCrash.ll b/test/Transforms/InstCombine/2007-04-08-SingleEltVectorCrash.ll new file mode 100644 index 0000000..34322a2 --- /dev/null +++ b/test/Transforms/InstCombine/2007-04-08-SingleEltVectorCrash.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output +; PR1304 + +define i64 @bork(<1 x i64> %vec) { + %tmp = extractelement <1 x i64> %vec, i32 0 + ret i64 %tmp +} diff --git a/test/Transforms/InstCombine/2007-05-04-Crash.ll b/test/Transforms/InstCombine/2007-05-04-Crash.ll new file mode 100644 index 0000000..5ad7919 --- /dev/null +++ b/test/Transforms/InstCombine/2007-05-04-Crash.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output +; PR1384 + +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-apple-darwin8" + %struct.CFRuntimeBase = type { i32, [4 x i8] } + %struct.CGColor = type opaque + %struct.CGColorSpace = type { %struct.CFRuntimeBase, i8, i8, i8, i32, i32, i32, %struct.CGColor*, float*, %struct.CGMD5Signature, %struct.CGMD5Signature*, [0 x %struct.CGColorSpaceDescriptor] } + %struct.CGColorSpaceCalibratedRGBData = type { [3 x float], [3 x float], [3 x float], [9 x float] } + %struct.CGColorSpaceDescriptor = type { %struct.CGColorSpaceCalibratedRGBData } + %struct.CGColorSpaceLabData = type { [3 x float], [3 x float], [4 x float] } + %struct.CGMD5Signature = type { [16 x i8], i8 } + +declare fastcc %struct.CGColorSpace* @CGColorSpaceCreate(i32, i32) + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +define %struct.CGColorSpace* @CGColorSpaceCreateLab(float* %whitePoint, float* %blackPoint, float* %range) { +entry: + %tmp17 = call fastcc %struct.CGColorSpace* @CGColorSpaceCreate( i32 5, i32 3 ) ; <%struct.CGColorSpace*> [#uses=2] + %tmp28 = getelementptr %struct.CGColorSpace* %tmp17, i32 0, i32 11 ; <[0 x %struct.CGColorSpaceDescriptor]*> [#uses=1] + %tmp29 = getelementptr [0 x %struct.CGColorSpaceDescriptor]* %tmp28, i32 0, i32 0 ; <%struct.CGColorSpaceDescriptor*> [#uses=1] + %tmp30 = getelementptr %struct.CGColorSpaceDescriptor* %tmp29, i32 0, i32 0 ; <%struct.CGColorSpaceCalibratedRGBData*> [#uses=1] + %tmp3031 = bitcast %struct.CGColorSpaceCalibratedRGBData* %tmp30 to %struct.CGColorSpaceLabData* ; <%struct.CGColorSpaceLabData*> [#uses=1] + %tmp45 = getelementptr %struct.CGColorSpaceLabData* %tmp3031, i32 0, i32 2 ; <[4 x float]*> [#uses=1] + %tmp46 = getelementptr [4 x float]* %tmp45, i32 0, i32 0 ; <float*> [#uses=1] + %tmp4648 = bitcast float* %tmp46 to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %tmp4648, i8* null, i32 16, i32 4 ) + ret %struct.CGColorSpace* %tmp17 +} diff --git a/test/Transforms/InstCombine/2007-05-10-icmp-or.ll b/test/Transforms/InstCombine/2007-05-10-icmp-or.ll new file mode 100644 index 0000000..8769ded --- /dev/null +++ b/test/Transforms/InstCombine/2007-05-10-icmp-or.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output +define i1 @test(i32 %tmp9) { + %tmp20 = icmp ugt i32 %tmp9, 255 ; <i1> [#uses=1] + %tmp11.not = icmp sgt i32 %tmp9, 255 ; <i1> [#uses=1] + %bothcond = or i1 %tmp20, %tmp11.not ; <i1> [#uses=1] + ret i1 %bothcond +} + diff --git a/test/Transforms/InstCombine/2007-05-14-Crash.ll b/test/Transforms/InstCombine/2007-05-14-Crash.ll new file mode 100644 index 0000000..ececd35 --- /dev/null +++ b/test/Transforms/InstCombine/2007-05-14-Crash.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -instcombine -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 = "powerpc-apple-darwin8.8.0" + +%struct.abc = type { i32, [32 x i8] } +%struct.def = type { i8**, %struct.abc } + %struct.anon = type <{ }> + +define i8* @foo(%struct.anon* %deviceRef, %struct.abc* %pCap) { +entry: + %tmp1 = bitcast %struct.anon* %deviceRef to %struct.def* + %tmp3 = getelementptr %struct.def* %tmp1, i32 0, i32 1 + %tmp35 = bitcast %struct.abc* %tmp3 to i8* + ret i8* %tmp35 +} + + diff --git a/test/Transforms/InstCombine/2007-05-18-CastFoldBug.ll b/test/Transforms/InstCombine/2007-05-18-CastFoldBug.ll new file mode 100644 index 0000000..55bfac5 --- /dev/null +++ b/test/Transforms/InstCombine/2007-05-18-CastFoldBug.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {call.*sret} +; Make sure instcombine doesn't drop the sret attribute. + +define void @blah(i16* %tmp10) { +entry: + call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend_stret to void (i16* sret )*)( i16* %tmp10 sret ) + ret void +} + +declare i8* @objc_msgSend_stret(i8*, i8*, ...) diff --git a/test/Transforms/InstCombine/2007-06-06-AshrSignBit.ll b/test/Transforms/InstCombine/2007-06-06-AshrSignBit.ll new file mode 100644 index 0000000..482c608 --- /dev/null +++ b/test/Transforms/InstCombine/2007-06-06-AshrSignBit.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ashr} +; PR1499 + +define void @av_cmp_q_cond_true(i32* %retval, i32* %tmp9, i64* %tmp10) { +newFuncRoot: + br label %cond_true + +return.exitStub: ; preds = %cond_true + ret void + +cond_true: ; preds = %newFuncRoot + %tmp30 = load i64* %tmp10 ; <i64> [#uses=1] + %.cast = zext i32 63 to i64 ; <i64> [#uses=1] + %tmp31 = ashr i64 %tmp30, %.cast ; <i64> [#uses=1] + %tmp3132 = trunc i64 %tmp31 to i32 ; <i32> [#uses=1] + %tmp33 = or i32 %tmp3132, 1 ; <i32> [#uses=1] + store i32 %tmp33, i32* %tmp9 + %tmp34 = load i32* %tmp9 ; <i32> [#uses=1] + store i32 %tmp34, i32* %retval + br label %return.exitStub +} + diff --git a/test/Transforms/InstCombine/2007-06-21-DivCompareMiscomp.ll b/test/Transforms/InstCombine/2007-06-21-DivCompareMiscomp.ll new file mode 100644 index 0000000..ffc4026 --- /dev/null +++ b/test/Transforms/InstCombine/2007-06-21-DivCompareMiscomp.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i1 true} +; rdar://5278853 + +define i1 @test(i32 %tmp468) { + %tmp470 = udiv i32 %tmp468, 4 ; <i32> [#uses=2] + %tmp475 = icmp ult i32 %tmp470, 1073741824 ; <i1> [#uses=1] + ret i1 %tmp475 +} + diff --git a/test/Transforms/InstCombine/CPP_min_max.llx b/test/Transforms/InstCombine/CPP_min_max.llx new file mode 100644 index 0000000..2818fa7 --- /dev/null +++ b/test/Transforms/InstCombine/CPP_min_max.llx @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep select | not grep {i32\\*} +; END. + +; This testcase corresponds to PR362, which notices that this horrible code +; is generated by the C++ front-end and LLVM optimizers, which has lots of +; loads and other stuff that are unneeded. +; +; Instcombine should propagate the load through the select instructions to +; allow elimination of the extra stuff by the mem2reg pass. + +implementation ; Functions: + +void %_Z5test1RiS_(int* %x, int* %y) { +entry: + %tmp.1.i = load int* %y ; <int> [#uses=1] + %tmp.3.i = load int* %x ; <int> [#uses=1] + %tmp.4.i = setlt int %tmp.1.i, %tmp.3.i ; <bool> [#uses=1] + %retval.i = select bool %tmp.4.i, int* %y, int* %x ; <int*> [#uses=1] + %tmp.4 = load int* %retval.i ; <int> [#uses=1] + store int %tmp.4, int* %x + ret void +} + +void %_Z5test2RiS_(int* %x, int* %y) { +entry: + %tmp.0 = alloca int ; <int*> [#uses=2] + %tmp.2 = load int* %x ; <int> [#uses=2] + store int %tmp.2, int* %tmp.0 + %tmp.3.i = load int* %y ; <int> [#uses=1] + %tmp.4.i = setlt int %tmp.2, %tmp.3.i ; <bool> [#uses=1] + %retval.i = select bool %tmp.4.i, int* %y, int* %tmp.0 ; <int*> [#uses=1] + %tmp.6 = load int* %retval.i ; <int> [#uses=1] + store int %tmp.6, int* %y + ret void +} diff --git a/test/Transforms/InstCombine/GEPIdxCanon.ll b/test/Transforms/InstCombine/GEPIdxCanon.ll new file mode 100644 index 0000000..bf0ab79 --- /dev/null +++ b/test/Transforms/InstCombine/GEPIdxCanon.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -gcse -instcombine | \ +; RUN: llvm-dis | not grep getelementptr + +bool %test(int* %A) { + %B = getelementptr int* %A, int 1 + %C = getelementptr int* %A, uint 1 + %V = seteq int* %B, %C + ret bool %V +} diff --git a/test/Transforms/InstCombine/IntPtrCast.ll b/test/Transforms/InstCombine/IntPtrCast.ll new file mode 100644 index 0000000..7ff71c8 --- /dev/null +++ b/test/Transforms/InstCombine/IntPtrCast.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | notcast +target endian = little +target pointersize = 32 + +int *%test(int *%P) { + %V = cast int* %P to int + %P2 = cast int %V to int* + ret int* %P2 +} diff --git a/test/Transforms/InstCombine/JavaCompare.ll b/test/Transforms/InstCombine/JavaCompare.ll new file mode 100644 index 0000000..4ed064c --- /dev/null +++ b/test/Transforms/InstCombine/JavaCompare.ll @@ -0,0 +1,15 @@ +; This is the sequence of stuff that the Java front-end expands for a single +; <= comparison. Check to make sure we turn it into a <= (only) + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v {icmp sle} | not grep #uses + +bool %le(int %A, int %B) { + %c1 = setgt int %A, %B; + %tmp = select bool %c1, int 1, int 0; + %c2 = setlt int %A, %B; + %result = select bool %c2, int -1, int %tmp; + %c3 = setle int %result, 0; + ret bool %c3; +} + diff --git a/test/Transforms/InstCombine/README.txt b/test/Transforms/InstCombine/README.txt new file mode 100644 index 0000000..de043c7 --- /dev/null +++ b/test/Transforms/InstCombine/README.txt @@ -0,0 +1,4 @@ +This directory contains test cases for the instcombine transformation. The +dated tests are actual bug tests, whereas the named tests are used to test +for features that the this pass should be capable of performing. + diff --git a/test/Transforms/InstCombine/add.ll b/test/Transforms/InstCombine/add.ll new file mode 100644 index 0000000..df99e96 --- /dev/null +++ b/test/Transforms/InstCombine/add.ll @@ -0,0 +1,251 @@ +; This test makes sure that add instructions are properly eliminated. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v OK | not grep add +; END. + +implementation + +int %test1(int %A) { + %B = add int %A, 0 + ret int %B +} + +int %test2(int %A) { + %B = add int %A, 5 + %C = add int %B, -5 + ret int %C +} + +int %test3(int %A) { + %B = add int %A, 5 + %C = sub int %B, 5 ;; This should get converted to an add + ret int %C +} + +int %test4(int %A, int %B) { + %C = sub int 0, %A + %D = add int %B, %C ; D = B + -A = B - A + ret int %D +} + +int %test5(int %A, int %B) { + %C = sub int 0, %A + %D = add int %C, %B ; D = -A + B = B - A + ret int %D +} + +int %test6(int %A) { + %B = mul int 7, %A + %C = add int %B, %A ; C = 7*A+A == 8*A == A << 3 + ret int %C +} + +int %test7(int %A) { + %B = mul int 7, %A + %C = add int %A, %B ; C = A+7*A == 8*A == A << 3 + ret int %C +} + +; (A & C1)+(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0 +int %test8(int %A, int %B) { + %A1 = and int %A, 7 + %B1 = and int %B, 128 + %C = add int %A1, %B1 + ret int %C +} + +int %test9(int %A) { + %B = shl int %A, ubyte 4 + %C = add int %B, %B ; === shl int %A, 5 + ret int %C +} + +bool %test10(ubyte %A, ubyte %b) { + %B = add ubyte %A, %b + %c = setne ubyte %B, 0 ; === A != -b + ret bool %c +} + +bool %test11(ubyte %A) { + %B = add ubyte %A, 255 + %c = setne ubyte %B, 0 ; === A != 1 + ret bool %c +} + +int %test12(int %A, int %B) { + %C_OK = add int %B, %A ; Should be transformed into shl A, 1 + br label %X +X: + %D = add int %C_OK, %A + ret int %D +} + +int %test13(int %A, int %B, int %C) { + %D_OK = add int %A, %B + %E_OK = add int %D_OK, %C + %F = add int %E_OK, %A ;; shl A, 1 + ret int %F +} + +uint %test14(uint %offset, uint %difference) { + %tmp.2 = and uint %difference, 3 + %tmp.3_OK = add uint %tmp.2, %offset + %tmp.5.mask = and uint %difference, 4294967292 + %tmp.8 = add uint %tmp.3_OK, %tmp.5.mask ; == add %offset, %difference + ret uint %tmp.8 +} + +ubyte %test15(ubyte %A) { + %B = add ubyte %A, 192 ; Does not effect result + %C = and ubyte %B, 16 ; Only one bit set + ret ubyte %C +} + +ubyte %test16(ubyte %A) { + %B = add ubyte %A, 16 ; Turn this into a XOR + %C = and ubyte %B, 16 ; Only one bit set + ret ubyte %C +} + +int %test17(int %A) { + %B = xor int %A, -1 + %C = add int %B, 1 ; == sub int 0, %A + ret int %C +} + +ubyte %test18(ubyte %A) { + %B = xor ubyte %A, 255 + %C = add ubyte %B, 17 ; == sub ubyte 16, %A + ret ubyte %C +} + +int %test19(bool %C) { + %A = select bool %C, int 1000, int 10 + %V = add int %A, 123 + ret int %V +} + +int %test20(int %x) { + %tmp.2 = xor int %x, -2147483648 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add int %tmp.2, -2147483648 + ret int %tmp.4 +} + +bool %test21(uint %x) { + %t = add uint %x, 4 + %y = seteq uint %t, 123 + ret bool %y +} + +int %test22(uint %V) { + %V2 = add uint %V, 10 + switch uint %V2, label %Default [ + uint 20, label %Lab1 + uint 30, label %Lab2 + ] +Default: + ret int 123 +Lab1: + ret int 12312 +Lab2: + ret int 1231231 +} + +int %test23(bool %C, int %a) { +entry: + br bool %C, label %endif, label %else + +else: + br label %endif + +endif: + %b.0 = phi int [ 0, %entry ], [ 1, %else ] + %tmp.4 = add int %b.0, 1 + ret int %tmp.4 +} + +int %test24(int %A) { + %B = add int %A, 1 + %C = shl int %B, ubyte 1 + %D = sub int %C, 2 + ret int %D ;; A << 1 +} + +long %test25(long %Y) { + %tmp.4 = shl long %Y, ubyte 2 + %tmp.12 = shl long %Y, ubyte 2 + %tmp.8 = add long %tmp.4, %tmp.12 ;; Y << 3 + ret long %tmp.8 +} + +int %test26(int %A, int %B) { + %C = add int %A, %B + %D = sub int %C, %B + ret int %D +} + +int %test27(bool %C, int %X, int %Y) { + %A = add int %X, %Y + %B = add int %Y, 123 + %C = select bool %C, int %A, int %B ;; Fold add through select. + %D = sub int %C, %Y + ret int %D +} + +int %test28(int %X) { + %Y = add int %X, 1234 + %Z = sub int 42, %Y + ret int %Z +} + +uint %test29(uint %X, uint %x) { + %tmp.2 = sub uint %X, %x + %tmp.2.mask = and uint %tmp.2, 63 ; <uint> [#uses=1] + %tmp.6 = add uint %tmp.2.mask, %x ; <uint> [#uses=1] + %tmp.7 = and uint %tmp.6, 63 ; <uint> [#uses=1] + %tmp.9 = and uint %tmp.2, 4294967232 ; <uint> [#uses=1] + %tmp.10 = or uint %tmp.7, %tmp.9 ; <uint> [#uses=1] + ret uint %tmp.10 +} + +long %test30(long %x) { + %tmp.2 = xor long %x, -9223372036854775808 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add long %tmp.2, -9223372036854775808 + ret long %tmp.4 +} + +int %test31(int %A) { + %B = add int %A, 4 + %C = mul int %B, 5 + %D = sub int %C, 20 + ret int %D +} + +int %test32(int %A) { + %B = add int %A, 4 + %C = shl int %B, ubyte 2 + %D = sub int %C, 16 + ret int %D +} + +ubyte %test33(ubyte %A) { ;; OR A, 1 + %B = and ubyte %A, 254 + %C = add ubyte %B, 1 + ret ubyte %C +} + +ubyte %test34(ubyte %A) { + %B = add ubyte %A, 64 ;; dead + %C = and ubyte %B, 12 + ret ubyte %C +} + +int %test35(int %a) { ;; -> -1 + %tmpnot = xor int %a, -1 + %tmp2 = add int %tmpnot, %a + ret int %tmp2 +} + diff --git a/test/Transforms/InstCombine/add2.ll b/test/Transforms/InstCombine/add2.ll new file mode 100644 index 0000000..ff89946 --- /dev/null +++ b/test/Transforms/InstCombine/add2.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep -v OK | not grep add + +define i64 @test1(i64 %A, i32 %B) { + %tmp12 = zext i32 %B to i64 + %tmp3 = shl i64 %tmp12, 32 + %tmp5 = add i64 %tmp3, %A + %tmp6 = and i64 %tmp5, 123 + ret i64 %tmp6 +} + diff --git a/test/Transforms/InstCombine/alloca.ll b/test/Transforms/InstCombine/alloca.ll new file mode 100644 index 0000000..43e4e32 --- /dev/null +++ b/test/Transforms/InstCombine/alloca.ll @@ -0,0 +1,29 @@ +; Zero byte allocas should be deleted. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep alloca +; END. + +declare void %use(...) +void %test() { + %X = alloca [0 x int] + call void(...)* %use([0 x int] *%X) + %Y = alloca int, uint 0 + call void(...)* %use(int* %Y) + %Z = alloca {} + call void(...)* %use({}* %Z) + ret void +} + +void %test2() { + %A = alloca int ;; dead. + store int 123, int* %A + ret void +} + +void %test3() { + %A = alloca {int} ;; dead. + %B = getelementptr {int}* %A, int 0, uint 0 + store int 123, int* %B + ret void +} diff --git a/test/Transforms/InstCombine/and-compare.ll b/test/Transforms/InstCombine/and-compare.ll new file mode 100644 index 0000000..5980631 --- /dev/null +++ b/test/Transforms/InstCombine/and-compare.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep and | wc -l | grep 1 + +; Should be optimized to one and. +bool %test1(uint %a, uint %b) { + %tmp1 = and uint %a, 65280 + %tmp3 = and uint %b, 65280 + %tmp = setne uint %tmp1, %tmp3 + ret bool %tmp +} + diff --git a/test/Transforms/InstCombine/and-or-and.ll b/test/Transforms/InstCombine/and-or-and.ll new file mode 100644 index 0000000..ea7a87f --- /dev/null +++ b/test/Transforms/InstCombine/and-or-and.ll @@ -0,0 +1,56 @@ +; If we have an 'and' of the result of an 'or', and one of the 'or' operands +; cannot have contributed any of the resultant bits, delete the or. This +; occurs for very common C/C++ code like this: +; +; struct foo { int A : 16; int B : 16; }; +; void test(struct foo *F, int X, int Y) { +; F->A = X; F->B = Y; +; } +; +; Which corresponds to test1. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {or } +; END. + +int %test1(int %X, int %Y) { + %A = and int %X, 7 + %B = and int %Y, 8 + %C = or int %A, %B + %D = and int %C, 7 ;; This cannot include any bits from %Y! + ret int %D +} + +int %test2(int %X, ubyte %Y) { + %B = cast ubyte %Y to int + %C = or int %X, %B + %D = and int %C, 65536 ;; This cannot include any bits from %Y! + ret int %D +} + +int %test3(int %X, int %Y) { + %B = shl int %Y, ubyte 1 + %C = or int %X, %B + %D = and int %C, 1 ;; This cannot include any bits from %Y! + ret int %D +} + +uint %test4(uint %X, uint %Y) { + %B = shr uint %Y, ubyte 31 + %C = or uint %X, %B + %D = and uint %C, 2 ;; This cannot include any bits from %Y! + ret uint %D +} + +int %or_test1(int %X, int %Y) { + %A = and int %X, 1 + %B = or int %A, 1 ;; This cannot include any bits from X! + ret int %B +} + +ubyte %or_test2(ubyte %X, ubyte %Y) { + %A = shl ubyte %X, ubyte 7 + %B = or ubyte %A, 128 ;; This cannot include any bits from X! + ret ubyte %B +} + diff --git a/test/Transforms/InstCombine/and-or-not.ll b/test/Transforms/InstCombine/and-or-not.ll new file mode 100644 index 0000000..e9c7b12 --- /dev/null +++ b/test/Transforms/InstCombine/and-or-not.ll @@ -0,0 +1,46 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep xor | wc -l | grep 4 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep and +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep { or} + +; PR1510 + +; These are all equivelent to A^B + +define i32 @test1(i32 %a, i32 %b) { +entry: + %tmp3 = or i32 %b, %a ; <i32> [#uses=1] + %tmp3not = xor i32 %tmp3, -1 ; <i32> [#uses=1] + %tmp6 = and i32 %b, %a ; <i32> [#uses=1] + %tmp7 = or i32 %tmp6, %tmp3not ; <i32> [#uses=1] + %tmp7not = xor i32 %tmp7, -1 ; <i32> [#uses=1] + ret i32 %tmp7not +} + +define i32 @test2(i32 %a, i32 %b) { +entry: + %tmp3 = or i32 %b, %a ; <i32> [#uses=1] + %tmp6 = and i32 %b, %a ; <i32> [#uses=1] + %tmp6not = xor i32 %tmp6, -1 ; <i32> [#uses=1] + %tmp7 = and i32 %tmp3, %tmp6not ; <i32> [#uses=1] + ret i32 %tmp7 +} + +define <4 x i32> @test3(<4 x i32> %a, <4 x i32> %b) { +entry: + %tmp3 = or <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] + %tmp3not = xor <4 x i32> %tmp3, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] + %tmp6 = and <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] + %tmp7 = or <4 x i32> %tmp6, %tmp3not ; <<4 x i32>> [#uses=1] + %tmp7not = xor <4 x i32> %tmp7, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] + ret <4 x i32> %tmp7not +} + +define <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) { +entry: + %tmp3 = or <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] + %tmp6 = and <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] + %tmp6not = xor <4 x i32> %tmp6, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] + %tmp7 = and <4 x i32> %tmp3, %tmp6not ; <<4 x i32>> [#uses=1] + ret <4 x i32> %tmp7 +} + diff --git a/test/Transforms/InstCombine/and-xor-merge.ll b/test/Transforms/InstCombine/and-xor-merge.ll new file mode 100644 index 0000000..c53ebc6 --- /dev/null +++ b/test/Transforms/InstCombine/and-xor-merge.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep and | wc -l | grep 1 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep xor | wc -l | grep 2 + +; (x&z) ^ (y&z) -> (x^y)&z +define i32 @test1(i32 %x, i32 %y, i32 %z) { + %tmp3 = and i32 %z, %x + %tmp6 = and i32 %z, %y + %tmp7 = xor i32 %tmp3, %tmp6 + ret i32 %tmp7 +} + +; (x & y) ^ (x|y) -> x^y +define i32 @test2(i32 %x, i32 %y, i32 %z) { + %tmp3 = and i32 %y, %x + %tmp6 = or i32 %y, %x + %tmp7 = xor i32 %tmp3, %tmp6 + ret i32 %tmp7 +} + diff --git a/test/Transforms/InstCombine/and.ll b/test/Transforms/InstCombine/and.ll new file mode 100644 index 0000000..7b08975 --- /dev/null +++ b/test/Transforms/InstCombine/and.ll @@ -0,0 +1,229 @@ +; This test makes sure that these instructions are properly eliminated. +; + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep and +; END. + +implementation + +int %test1(int %A) { + %B = and int %A, 0 ; zero result + ret int %B +} + +int %test2(int %A) { + %B = and int %A, -1 ; noop + ret int %B +} + +bool %test3(bool %A) { + %B = and bool %A, false ; always = false + ret bool %B +} + +bool %test4(bool %A) { + %B = and bool %A, true ; noop + ret bool %B +} + +int %test5(int %A) { + %B = and int %A, %A + ret int %B +} + +bool %test6(bool %A) { + %B = and bool %A, %A + ret bool %B +} + +int %test7(int %A) { ; A & ~A == 0 + %NotA = xor int %A, -1 + %B = and int %A, %NotA + ret int %B +} + +ubyte %test8(ubyte %A) { ; AND associates + %B = and ubyte %A, 3 + %C = and ubyte %B, 4 + ret ubyte %C +} + +bool %test9(int %A) { + %B = and int %A, -2147483648 ; Test of sign bit, convert to setle %A, 0 + %C = setne int %B, 0 + ret bool %C +} + +bool %test9(uint %A) { + %B = and uint %A, 2147483648 ; Test of sign bit, convert to setle %A, 0 + %C = setne uint %B, 0 + ret bool %C +} + +uint %test10(uint %A) { + %B = and uint %A, 12 + %C = xor uint %B, 15 + %D = and uint %C, 1 ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2) + ret uint %D +} + +uint %test11(uint %A, uint* %P) { + %B = or uint %A, 3 + %C = xor uint %B, 12 + store uint %C, uint* %P ; additional use of C + %D = and uint %C, 3 ; %C = and uint %B, 3 --> 3 + ret uint %D +} + +bool %test12(uint %A, uint %B) { + %C1 = setlt uint %A, %B + %C2 = setle uint %A, %B + %D = and bool %C1, %C2 ; (A < B) & (A <= B) === (A < B) + ret bool %D +} + +bool %test13(uint %A, uint %B) { + %C1 = setlt uint %A, %B + %C2 = setgt uint %A, %B + %D = and bool %C1, %C2 ; (A < B) & (A > B) === false + ret bool %D +} + +bool %test14(ubyte %A) { + %B = and ubyte %A, 128 + %C = setne ubyte %B, 0 + ret bool %C +} + +ubyte %test15(ubyte %A) { + %B = shr ubyte %A, ubyte 7 + %C = and ubyte %B, 2 ; Always equals zero + ret ubyte %C +} + +ubyte %test16(ubyte %A) { + %B = shl ubyte %A, ubyte 2 + %C = and ubyte %B, 3 + ret ubyte %C +} + +sbyte %test17(sbyte %X, sbyte %Y) { ;; ~(~X & Y) --> (X | ~Y) + %B = xor sbyte %X, -1 + %C = and sbyte %B, %Y + %D = xor sbyte %C, -1 + ret sbyte %D +} + +bool %test18(int %A) { + %B = and int %A, -128 + %C = setne int %B, 0 ;; C >= 128 + ret bool %C +} + +bool %test18a(ubyte %A) { + %B = and ubyte %A, 254 + %C = seteq ubyte %B, 0 + ret bool %C +} + +int %test19(int %A) { + %B = shl int %A, ubyte 3 + %C = and int %B, -2 ;; Clearing a zero bit + ret int %C +} + +ubyte %test20(ubyte %A) { + %C = shr ubyte %A, ubyte 7 + %D = and ubyte %C, 1 ;; Unneeded + ret ubyte %D +} + +bool %test22(int %A) { + %B = seteq int %A, 1 + %C = setge int %A, 3 + %D = and bool %B, %C ;; False + ret bool %D +} + +bool %test23(int %A) { + %B = setgt int %A, 1 + %C = setle int %A, 2 + %D = and bool %B, %C ;; A == 2 + ret bool %D +} + +bool %test24(int %A) { + %B = setgt int %A, 1 + %C = setne int %A, 2 + %D = and bool %B, %C ;; A > 2 + ret bool %D +} + +bool %test25(int %A) { + %B = setge int %A, 50 + %C = setlt int %A, 100 + %D = and bool %B, %C ;; (A-50) <u 50 + ret bool %D +} + +bool %test26(int %A) { + %B = setne int %A, 50 + %C = setne int %A, 51 + %D = and bool %B, %C ;; (A-50) > 1 + ret bool %D +} + +ubyte %test27(ubyte %A) { + %B = and ubyte %A, 4 + %C = sub ubyte %B, 16 + %D = and ubyte %C, 240 ;; 0xF0 + %E = add ubyte %D, 16 + ret ubyte %E +} + +int %test28(int %X) { ;; This is juse a zero extending shr. + %Y = shr int %X, ubyte 24 ;; Sign extend + %Z = and int %Y, 255 ;; Mask out sign bits + ret int %Z +} + +int %test29(ubyte %X) { + %Y = cast ubyte %X to int + %Z = and int %Y, 255 ;; Zero extend makes this unneeded. + ret int %Z +} + +int %test30(bool %X) { + %Y = cast bool %X to int + %Z = and int %Y, 1 + ret int %Z +} + +uint %test31(bool %X) { + %Y = cast bool %X to uint + %Z = shl uint %Y, ubyte 4 + %A = and uint %Z, 16 + ret uint %A +} + +uint %test32(uint %In) { + %Y = and uint %In, 16 + %Z = shr uint %Y, ubyte 2 + %A = and uint %Z, 1 + ret uint %A +} + +uint %test33(uint %b) { ;; Code corresponding to one-bit bitfield ^1. + %tmp.4.mask = and uint %b, 1 + %tmp.10 = xor uint %tmp.4.mask, 1 + %tmp.12 = and uint %b, 4294967294 + %tmp.13 = or uint %tmp.12, %tmp.10 + ret uint %tmp.13 +} + +int %test34(int %A, int %B) { + %tmp.2 = or int %B, %A + %tmp.4 = and int %tmp.2, %B + ret int %tmp.4 +} + diff --git a/test/Transforms/InstCombine/apint-add1.ll b/test/Transforms/InstCombine/apint-add1.ll new file mode 100644 index 0000000..74280ee --- /dev/null +++ b/test/Transforms/InstCombine/apint-add1.ll @@ -0,0 +1,34 @@ +; This test makes sure that add instructions are properly eliminated. +; This test is for Integer BitWidth <= 64 && BitWidth % 8 != 0. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep -v OK | not grep add + + +define i1 @test1(i1 %x) { + %tmp.2 = xor i1 %x, 1 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add i1 %tmp.2, 1 + ret i1 %tmp.4 +} + +define i47 @test2(i47 %x) { + %tmp.2 = xor i47 %x, 70368744177664 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add i47 %tmp.2, 70368744177664 + ret i47 %tmp.4 +} + +define i15 @test3(i15 %x) { + %tmp.2 = xor i15 %x, 16384 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add i15 %tmp.2, 16384 + ret i15 %tmp.4 +} + +define i49 @test6(i49 %x) { + ;; (x & 254)+1 -> (x & 254)|1 + %tmp.2 = and i49 %x, 562949953421310 + %tmp.4 = add i49 %tmp.2, 1 + ret i49 %tmp.4 +} diff --git a/test/Transforms/InstCombine/apint-add2.ll b/test/Transforms/InstCombine/apint-add2.ll new file mode 100644 index 0000000..0ddfcc0 --- /dev/null +++ b/test/Transforms/InstCombine/apint-add2.ll @@ -0,0 +1,46 @@ +; This test makes sure that add instructions are properly eliminated. +; This test is for Integer BitWidth > 64 && BitWidth <= 1024. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep -v OK | not grep add +; END. + +define i111 @test1(i111 %x) { + %tmp.2 = shl i111 1, 110 + %tmp.4 = xor i111 %x, %tmp.2 + ;; Add of sign bit -> xor of sign bit. + %tmp.6 = add i111 %tmp.4, %tmp.2 + ret i111 %tmp.6 +} + +define i65 @test2(i65 %x) { + %tmp.0 = shl i65 1, 64 + %tmp.2 = xor i65 %x, %tmp.0 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add i65 %tmp.2, %tmp.0 + ret i65 %tmp.4 +} + +define i1024 @test3(i1024 %x) { + %tmp.0 = shl i1024 1, 1023 + %tmp.2 = xor i1024 %x, %tmp.0 + ;; Add of sign bit -> xor of sign bit. + %tmp.4 = add i1024 %tmp.2, %tmp.0 + ret i1024 %tmp.4 +} + +define i128 @test4(i128 %x) { + ;; If we have ADD(XOR(AND(X, 0xFF), 0xF..F80), 0x80), it's a sext. + %tmp.5 = shl i128 1, 127 + %tmp.1 = ashr i128 %tmp.5, 120 + %tmp.2 = xor i128 %x, %tmp.1 + %tmp.4 = add i128 %tmp.2, %tmp.5 + ret i128 %tmp.4 +} + +define i77 @test6(i77 %x) { + ;; (x & 254)+1 -> (x & 254)|1 + %tmp.2 = and i77 %x, 562949953421310 + %tmp.4 = add i77 %tmp.2, 1 + ret i77 %tmp.4 +} diff --git a/test/Transforms/InstCombine/apint-and-compare.ll b/test/Transforms/InstCombine/apint-and-compare.ll new file mode 100644 index 0000000..4d250a0 --- /dev/null +++ b/test/Transforms/InstCombine/apint-and-compare.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep and | wc -l | grep 2 + +; Should be optimized to one and. +define i1 @test1(i33 %a, i33 %b) { + %tmp1 = and i33 %a, 65280 + %tmp3 = and i33 %b, 65280 + %tmp = icmp ne i33 %tmp1, %tmp3 + ret i1 %tmp +} + +define i1 @test2(i999 %a, i999 %b) { + %tmp1 = and i999 %a, 65280 + %tmp3 = and i999 %b, 65280 + %tmp = icmp ne i999 %tmp1, %tmp3 + ret i1 %tmp +} diff --git a/test/Transforms/InstCombine/apint-and-or-and.ll b/test/Transforms/InstCombine/apint-and-or-and.ll new file mode 100644 index 0000000..4630f28 --- /dev/null +++ b/test/Transforms/InstCombine/apint-and-or-and.ll @@ -0,0 +1,50 @@ +; If we have an 'and' of the result of an 'or', and one of the 'or' operands +; cannot have contributed any of the resultant bits, delete the or. This +; occurs for very common C/C++ code like this: +; +; struct foo { int A : 16; int B : 16; }; +; void test(struct foo *F, int X, int Y) { +; F->A = X; F->B = Y; +; } +; +; Which corresponds to test1. +; +; This tests arbitrary precision integers. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {or } +; END. + +define i17 @test1(i17 %X, i17 %Y) { + %A = and i17 %X, 7 + %B = and i17 %Y, 8 + %C = or i17 %A, %B + %D = and i17 %C, 7 ;; This cannot include any bits from %Y! + ret i17 %D +} + +define i49 @test3(i49 %X, i49 %Y) { + %B = shl i49 %Y, 1 + %C = or i49 %X, %B + %D = and i49 %C, 1 ;; This cannot include any bits from %Y! + ret i49 %D +} + +define i67 @test4(i67 %X, i67 %Y) { + %B = lshr i67 %Y, 66 + %C = or i67 %X, %B + %D = and i67 %C, 2 ;; This cannot include any bits from %Y! + ret i67 %D +} + +define i231 @or_test1(i231 %X, i231 %Y) { + %A = and i231 %X, 1 + %B = or i231 %A, 1 ;; This cannot include any bits from X! + ret i231 %B +} + +define i7 @or_test2(i7 %X, i7 %Y) { + %A = shl i7 %X, 6 + %B = or i7 %A, 64 ;; This cannot include any bits from X! + ret i7 %B +} + diff --git a/test/Transforms/InstCombine/apint-and-xor-merge.ll b/test/Transforms/InstCombine/apint-and-xor-merge.ll new file mode 100644 index 0000000..665a643 --- /dev/null +++ b/test/Transforms/InstCombine/apint-and-xor-merge.ll @@ -0,0 +1,22 @@ +; This test case checks that the merge of and/xor can work on arbitrary +; precision integers. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep and | wc -l | grep 1 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep xor | wc -l | grep 2 + +; (x &z ) ^ (y & z) -> (x ^ y) & z +define i57 @test1(i57 %x, i57 %y, i57 %z) { + %tmp3 = and i57 %z, %x + %tmp6 = and i57 %z, %y + %tmp7 = xor i57 %tmp3, %tmp6 + ret i57 %tmp7 +} + +; (x & y) ^ (x | y) -> x ^ y +define i23 @test2(i23 %x, i23 %y, i23 %z) { + %tmp3 = and i23 %y, %x + %tmp6 = or i23 %y, %x + %tmp7 = xor i23 %tmp3, %tmp6 + ret i23 %tmp7 +} + diff --git a/test/Transforms/InstCombine/apint-and1.ll b/test/Transforms/InstCombine/apint-and1.ll new file mode 100644 index 0000000..eb3b1a6 --- /dev/null +++ b/test/Transforms/InstCombine/apint-and1.ll @@ -0,0 +1,57 @@ +; This test makes sure that and instructions are properly eliminated. +; This test is for Integer BitWidth <= 64 && BitWidth % 8 != 0. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {and } +; END. + +define i39 @test0(i39 %A) { + %B = and i39 %A, 0 ; zero result + ret i39 %B +} + +define i47 @test1(i47 %A, i47 %B) { + ;; (~A & ~B) == (~(A | B)) - De Morgan's Law + %NotA = xor i47 %A, -1 + %NotB = xor i47 %B, -1 + %C1 = and i47 %NotA, %NotB + ret i47 %C1 +} + +define i15 @test2(i15 %x) { + %tmp.2 = and i15 %x, -1 ; noop + ret i15 %tmp.2 +} + +define i23 @test3(i23 %x) { + %tmp.0 = and i23 %x, 127 + %tmp.2 = and i23 %tmp.0, 128 + ret i23 %tmp.2 +} + +define i1 @test4(i37 %x) { + %A = and i37 %x, -2147483648 + %B = icmp ne i37 %A, 0 + ret i1 %B +} + +define i7 @test5(i7 %A, i7* %P) { + %B = or i7 %A, 3 + %C = xor i7 %B, 12 + store i7 %C, i7* %P + %r = and i7 %C, 3 + ret i7 %r +} + +define i7 @test6(i7 %A, i7 %B) { + ;; ~(~X & Y) --> (X | ~Y) + %t0 = xor i7 %A, -1 + %t1 = and i7 %t0, %B + %r = xor i7 %t1, -1 + ret i7 %r +} + +define i47 @test7(i47 %A) { + %X = ashr i47 %A, 39 ;; sign extend + %C1 = and i47 %X, 255 + ret i47 %C1 +} diff --git a/test/Transforms/InstCombine/apint-and2.ll b/test/Transforms/InstCombine/apint-and2.ll new file mode 100644 index 0000000..f7b3934 --- /dev/null +++ b/test/Transforms/InstCombine/apint-and2.ll @@ -0,0 +1,82 @@ +; This test makes sure that and instructions are properly eliminated. +; This test is for Integer BitWidth > 64 && BitWidth <= 1024. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {and } +; END. + + +define i999 @test0(i999 %A) { + %B = and i999 %A, 0 ; zero result + ret i999 %B +} + +define i477 @test1(i477 %A, i477 %B) { + ;; (~A & ~B) == (~(A | B)) - De Morgan's Law + %NotA = xor i477 %A, -1 + %NotB = xor i477 %B, -1 + %C1 = and i477 %NotA, %NotB + ret i477 %C1 +} + +define i129 @tst(i129 %A, i129 %B) { + ;; (~A & ~B) == (~(A | B)) - De Morgan's Law + %NotA = xor i129 %A, -1 + %NotB = xor i129 %B, -1 + %C1 = and i129 %NotA, %NotB + ret i129 %C1 +} + +define i65 @test(i65 %A, i65 %B) { + ;; (~A & ~B) == (~(A | B)) - De Morgan's Law + %NotA = xor i65 %A, -1 + %NotB = xor i65 -1, %B + %C1 = and i65 %NotA, %NotB + ret i65 %C1 +} + +define i66 @tes(i66 %A, i66 %B) { + ;; (~A & ~B) == (~(A | B)) - De Morgan's Law + %NotA = xor i66 %A, -1 + %NotB = xor i66 %B, -1 + %C1 = and i66 %NotA, %NotB + ret i66 %C1 +} + +define i1005 @test2(i1005 %x) { + %tmp.2 = and i1005 %x, -1 ; noop + ret i1005 %tmp.2 +} + +define i123 @test3(i123 %x) { + %tmp.0 = and i123 %x, 127 + %tmp.2 = and i123 %tmp.0, 128 + ret i123 %tmp.2 +} + +define i1 @test4(i737 %x) { + %A = and i737 %x, -2147483648 + %B = icmp ne i737 %A, 0 + ret i1 %B +} + +define i117 @test5(i117 %A, i117* %P) { + %B = or i117 %A, 3 + %C = xor i117 %B, 12 + store i117 %C, i117* %P + %r = and i117 %C, 3 + ret i117 %r +} + +define i117 @test6(i117 %A, i117 %B) { + ;; ~(~X & Y) --> (X | ~Y) + %t0 = xor i117 %A, -1 + %t1 = and i117 %t0, %B + %r = xor i117 %t1, -1 + ret i117 %r +} + +define i1024 @test7(i1024 %A) { + %X = ashr i1024 %A, 1016 ;; sign extend + %C1 = and i1024 %X, 255 + ret i1024 %C1 +} diff --git a/test/Transforms/InstCombine/apint-call-cast-target.ll b/test/Transforms/InstCombine/apint-call-cast-target.ll new file mode 100644 index 0000000..0f87a53 --- /dev/null +++ b/test/Transforms/InstCombine/apint-call-cast-target.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep call | not grep bitcast + +target datalayout = "e-p:32:32" +target triple = "i686-pc-linux-gnu" + + +define i32 @main() { +entry: + %tmp = call i32 bitcast (i7* (i999*)* @ctime to i32 (i99*)*)( i99* null ) + ret i32 %tmp +} + +declare i7* @ctime(i999*) diff --git a/test/Transforms/InstCombine/apint-cast-and-cast.ll b/test/Transforms/InstCombine/apint-cast-and-cast.ll new file mode 100644 index 0000000..337fd7c --- /dev/null +++ b/test/Transforms/InstCombine/apint-cast-and-cast.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep bitcast + +define i19 @test1(i43 %val) { + %t1 = bitcast i43 %val to i43 + %t2 = and i43 %t1, 1 + %t3 = trunc i43 %t2 to i19 + ret i19 %t3 +} + +define i73 @test2(i677 %val) { + %t1 = bitcast i677 %val to i677 + %t2 = and i677 %t1, 1 + %t3 = trunc i677 %t2 to i73 + ret i73 %t3 +} diff --git a/test/Transforms/InstCombine/apint-cast-cast-to-and.ll b/test/Transforms/InstCombine/apint-cast-cast-to-and.ll new file mode 100644 index 0000000..29a8869 --- /dev/null +++ b/test/Transforms/InstCombine/apint-cast-cast-to-and.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep i41 + +define i61 @test1(i61 %X) { + %Y = trunc i61 %X to i41 ;; Turn i61o an AND + %Z = zext i41 %Y to i61 + ret i61 %Z +} + diff --git a/test/Transforms/InstCombine/apint-cast.ll b/test/Transforms/InstCombine/apint-cast.ll new file mode 100644 index 0000000..dd00146 --- /dev/null +++ b/test/Transforms/InstCombine/apint-cast.ll @@ -0,0 +1,20 @@ +; Tests to make sure elimination of casts is working correctly +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast + +define i17 @test1(i17 %a) { + %tmp = zext i17 %a to i37 ; <i37> [#uses=2] + %tmp21 = lshr i37 %tmp, 8 ; <i37> [#uses=1] + %tmp5 = shl i37 %tmp, 8 ; <i37> [#uses=1] + %tmp.upgrd.32 = or i37 %tmp21, %tmp5 ; <i37> [#uses=1] + %tmp.upgrd.3 = trunc i37 %tmp.upgrd.32 to i17 ; <i17> [#uses=1] + ret i17 %tmp.upgrd.3 +} + +define i167 @test2(i167 %a) { + %tmp = zext i167 %a to i577 ; <i577> [#uses=2] + %tmp21 = lshr i577 %tmp, 9 ; <i577> [#uses=1] + %tmp5 = shl i577 %tmp, 8 ; <i577> [#uses=1] + %tmp.upgrd.32 = or i577 %tmp21, %tmp5 ; <i577> [#uses=1] + %tmp.upgrd.3 = trunc i577 %tmp.upgrd.32 to i167 ; <i167> [#uses=1] + ret i167 %tmp.upgrd.3 +} diff --git a/test/Transforms/InstCombine/apint-div1.ll b/test/Transforms/InstCombine/apint-div1.ll new file mode 100644 index 0000000..e9aa579 --- /dev/null +++ b/test/Transforms/InstCombine/apint-div1.ll @@ -0,0 +1,22 @@ +; This test makes sure that div instructions are properly eliminated. +; This test is for Integer BitWidth < 64 && BitWidth % 2 != 0. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep div + + +define i33 @test1(i33 %X) { + %Y = udiv i33 %X, 4096 + ret i33 %Y +} + +define i49 @test2(i49 %X) { + %tmp.0 = shl i49 4096, 17 + %Y = udiv i49 %X, %tmp.0 + ret i49 %Y +} + +define i59 @test3(i59 %X, i1 %C) { + %V = select i1 %C, i59 1024, i59 4096 + %R = udiv i59 %X, %V + ret i59 %R +} diff --git a/test/Transforms/InstCombine/apint-div2.ll b/test/Transforms/InstCombine/apint-div2.ll new file mode 100644 index 0000000..2aa2c3a --- /dev/null +++ b/test/Transforms/InstCombine/apint-div2.ll @@ -0,0 +1,22 @@ +; This test makes sure that div instructions are properly eliminated. +; This test is for Integer BitWidth >= 64 && BitWidth <= 1024. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep div + + +define i333 @test1(i333 %X) { + %Y = udiv i333 %X, 70368744177664 + ret i333 %Y +} + +define i499 @test2(i499 %X) { + %tmp.0 = shl i499 4096, 197 + %Y = udiv i499 %X, %tmp.0 + ret i499 %Y +} + +define i599 @test3(i599 %X, i1 %C) { + %V = select i1 %C, i599 70368744177664, i599 4096 + %R = udiv i599 %X, %V + ret i599 %R +} diff --git a/test/Transforms/InstCombine/apint-elim-logicalops.ll b/test/Transforms/InstCombine/apint-elim-logicalops.ll new file mode 100644 index 0000000..13d032c --- /dev/null +++ b/test/Transforms/InstCombine/apint-elim-logicalops.ll @@ -0,0 +1,39 @@ +; Test that elimination of logical operators works with +; arbitrary precision integers. +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: not grep {(and\|xor\|add\|shl\|shr)} +; END. + +define i33 @test1(i33 %x) { + %tmp.1 = and i33 %x, 65535 ; <i33> [#uses=1] + %tmp.2 = xor i33 %tmp.1, -32768 ; <i33> [#uses=1] + %tmp.3 = add i33 %tmp.2, 32768 ; <i33> [#uses=1] + ret i33 %tmp.3 +} + +define i33 @test2(i33 %x) { + %tmp.1 = and i33 %x, 65535 ; <i33> [#uses=1] + %tmp.2 = xor i33 %tmp.1, 32768 ; <i33> [#uses=1] + %tmp.3 = add i33 %tmp.2, -32768 ; <i33> [#uses=1] + ret i33 %tmp.3 +} + +define i33 @test3(i16 %P) { + %tmp.1 = zext i16 %P to i33 ; <i33> [#uses=1] + %tmp.4 = xor i33 %tmp.1, 32768 ; <i33> [#uses=1] + %tmp.5 = add i33 %tmp.4, -32768 ; <i33> [#uses=1] + ret i33 %tmp.5 +} + +define i33 @test5(i33 %x) { + %tmp.1 = and i33 %x, 254 + %tmp.2 = xor i33 %tmp.1, 128 + %tmp.3 = add i33 %tmp.2, -128 + ret i33 %tmp.3 +} + +define i33 @test6(i33 %x) { + %tmp.2 = shl i33 %x, 16 ; <i33> [#uses=1] + %tmp.4 = lshr i33 %tmp.2, 16 ; <i33> [#uses=1] + ret i33 %tmp.4 +} diff --git a/test/Transforms/InstCombine/apint-mul1.ll b/test/Transforms/InstCombine/apint-mul1.ll new file mode 100644 index 0000000..36b1102 --- /dev/null +++ b/test/Transforms/InstCombine/apint-mul1.ll @@ -0,0 +1,11 @@ +; This test makes sure that mul instructions are properly eliminated. +; This test is for Integer BitWidth < 64 && BitWidth % 2 != 0. +; + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep mul + + +define i17 @test1(i17 %X) { + %Y = mul i17 %X, 1024 + ret i17 %Y +} diff --git a/test/Transforms/InstCombine/apint-mul2.ll b/test/Transforms/InstCombine/apint-mul2.ll new file mode 100644 index 0000000..72fd97a --- /dev/null +++ b/test/Transforms/InstCombine/apint-mul2.ll @@ -0,0 +1,12 @@ +; This test makes sure that mul instructions are properly eliminated. +; This test is for Integer BitWidth >= 64 && BitWidth % 2 >= 1024. +; + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep mul + + +define i177 @test1(i177 %X) { + %C = shl i177 1, 155 + %Y = mul i177 %X, %C + ret i177 %Y +} diff --git a/test/Transforms/InstCombine/apint-not.ll b/test/Transforms/InstCombine/apint-not.ll new file mode 100644 index 0000000..f557fa8 --- /dev/null +++ b/test/Transforms/InstCombine/apint-not.ll @@ -0,0 +1,42 @@ +; This test makes sure that the xor instructions are properly eliminated +; when arbitrary precision integers are used. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep xor + +define i33 @test1(i33 %A) { + %B = xor i33 %A, -1 + %C = xor i33 %B, -1 + ret i33 %C +} + +define i1 @test2(i52 %A, i52 %B) { + %cond = icmp ule i52 %A, %B ; Can change into uge + %Ret = xor i1 %cond, true + ret i1 %Ret +} + +; Test that demorgans law can be instcombined +define i47 @test3(i47 %A, i47 %B) { + %a = xor i47 %A, -1 + %b = xor i47 %B, -1 + %c = and i47 %a, %b + %d = xor i47 %c, -1 + ret i47 %d +} + +; Test that demorgens law can work with constants +define i61 @test4(i61 %A, i61 %B) { + %a = xor i61 %A, -1 + %c = and i61 %a, 5 ; 5 = ~c2 + %d = xor i61 %c, -1 + ret i61 %d +} + +; test the mirror of demorgans law... +define i71 @test5(i71 %A, i71 %B) { + %a = xor i71 %A, -1 + %b = xor i71 %B, -1 + %c = or i71 %a, %b + %d = xor i71 %c, -1 + ret i71 %d +} diff --git a/test/Transforms/InstCombine/apint-or1.ll b/test/Transforms/InstCombine/apint-or1.ll new file mode 100644 index 0000000..51b87fe --- /dev/null +++ b/test/Transforms/InstCombine/apint-or1.ll @@ -0,0 +1,36 @@ +; This test makes sure that or instructions are properly eliminated. +; This test is for Integer BitWidth <= 64 && BitWidth % 2 != 0. +; + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep or + + +define i7 @test0(i7 %X) { + %Y = or i7 %X, 0 + ret i7 %Y +} + +define i17 @test1(i17 %X) { + %Y = or i17 %X, -1 + ret i17 %Y +} + +define i23 @test2(i23 %A) { + ;; A | ~A == -1 + %NotA = xor i23 -1, %A + %B = or i23 %A, %NotA + ret i23 %B +} + +define i39 @test3(i39 %V, i39 %M) { + ;; If we have: ((V + N) & C1) | (V & C2) + ;; .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0 + ;; replace with V+N. + %C1 = xor i39 274877906943, -1 ;; C2 = 274877906943 + %N = and i39 %M, 274877906944 + %A = add i39 %V, %N + %B = and i39 %A, %C1 + %D = and i39 %V, 274877906943 + %R = or i39 %B, %D + ret i39 %R +} diff --git a/test/Transforms/InstCombine/apint-or2.ll b/test/Transforms/InstCombine/apint-or2.ll new file mode 100644 index 0000000..21dc565 --- /dev/null +++ b/test/Transforms/InstCombine/apint-or2.ll @@ -0,0 +1,35 @@ +; This test makes sure that or instructions are properly eliminated. +; This test is for Integer BitWidth > 64 && BitWidth <= 1024. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep or + + +define i777 @test0(i777 %X) { + %Y = or i777 %X, 0 + ret i777 %Y +} + +define i117 @test1(i117 %X) { + %Y = or i117 %X, -1 + ret i117 %Y +} + +define i1023 @test2(i1023 %A) { + ;; A | ~A == -1 + %NotA = xor i1023 -1, %A + %B = or i1023 %A, %NotA + ret i1023 %B +} + +define i399 @test3(i399 %V, i399 %M) { + ;; If we have: ((V + N) & C1) | (V & C2) + ;; .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0 + ;; replace with V+N. + %C1 = xor i399 274877906943, -1 ;; C2 = 274877906943 + %N = and i399 %M, 18446742974197923840 + %A = add i399 %V, %N + %B = and i399 %A, %C1 + %D = and i399 %V, 274877906943 + %R = or i399 %B, %D + ret i399 %R +} diff --git a/test/Transforms/InstCombine/apint-rem1.ll b/test/Transforms/InstCombine/apint-rem1.ll new file mode 100644 index 0000000..2ec8c74 --- /dev/null +++ b/test/Transforms/InstCombine/apint-rem1.ll @@ -0,0 +1,22 @@ +; This test makes sure that these instructions are properly eliminated. +; This test is for Integer BitWidth < 64 && BitWidth % 2 != 0. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep rem + + +define i33 @test1(i33 %A) { + %B = urem i33 %A, 4096 + ret i33 %B +} + +define i49 @test2(i49 %A) { + %B = shl i49 4096, 11 + %Y = urem i49 %A, %B + ret i49 %Y +} + +define i59 @test3(i59 %X, i1 %C) { + %V = select i1 %C, i59 70368744177664, i59 4096 + %R = urem i59 %X, %V + ret i59 %R +} diff --git a/test/Transforms/InstCombine/apint-rem2.ll b/test/Transforms/InstCombine/apint-rem2.ll new file mode 100644 index 0000000..4d22c22 --- /dev/null +++ b/test/Transforms/InstCombine/apint-rem2.ll @@ -0,0 +1,22 @@ +; This test makes sure that these instructions are properly eliminated. +; This test is for Integer BitWidth >= 64 && BitWidth <= 1024. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep rem + + +define i333 @test1(i333 %A) { + %B = urem i333 %A, 70368744177664 + ret i333 %B +} + +define i499 @test2(i499 %A) { + %B = shl i499 4096, 111 + %Y = urem i499 %A, %B + ret i499 %Y +} + +define i599 @test3(i599 %X, i1 %C) { + %V = select i1 %C, i599 70368744177664, i599 4096 + %R = urem i599 %X, %V + ret i599 %R +} diff --git a/test/Transforms/InstCombine/apint-select.ll b/test/Transforms/InstCombine/apint-select.ll new file mode 100644 index 0000000..c2399fb --- /dev/null +++ b/test/Transforms/InstCombine/apint-select.ll @@ -0,0 +1,44 @@ +; This test makes sure that these instructions are properly eliminated. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep select + + +define i41 @test1(i1 %C) { + %V = select i1 %C, i41 1, i41 0 ; V = C + ret i41 %V +} + +define i999 @test2(i1 %C) { + %V = select i1 %C, i999 0, i999 1 ; V = C + ret i999 %V +} + +define i41 @test3(i41 %X) { + ;; (x <s 0) ? -1 : 0 -> ashr x, 31 + %t = icmp slt i41 %X, 0 + %V = select i1 %t, i41 -1, i41 0 + ret i41 %V +} + +define i1023 @test4(i1023 %X) { + ;; (x <s 0) ? -1 : 0 -> ashr x, 31 + %t = icmp slt i1023 %X, 0 + %V = select i1 %t, i1023 -1, i1023 0 + ret i1023 %V +} + +define i41 @test5(i41 %X) { + ;; ((X & 27) ? 27 : 0) + %Y = and i41 %X, 32 + %t = icmp ne i41 %Y, 0 + %V = select i1 %t, i41 32, i41 0 + ret i41 %V +} + +define i1023 @test6(i1023 %X) { + ;; ((X & 27) ? 27 : 0) + %Y = and i1023 %X, 64 + %t = icmp ne i1023 %Y, 0 + %V = select i1 %t, i1023 64, i1023 0 + ret i1023 %V +} diff --git a/test/Transforms/InstCombine/apint-shift-simplify.ll b/test/Transforms/InstCombine/apint-shift-simplify.ll new file mode 100644 index 0000000..4c352cf --- /dev/null +++ b/test/Transforms/InstCombine/apint-shift-simplify.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: egrep {shl|lshr|ashr} | wc -l | grep 3 + +define i41 @test0(i41 %A, i41 %B, i41 %C) { + %X = shl i41 %A, %C + %Y = shl i41 %B, %C + %Z = and i41 %X, %Y + ret i41 %Z +} + +define i57 @test1(i57 %A, i57 %B, i57 %C) { + %X = lshr i57 %A, %C + %Y = lshr i57 %B, %C + %Z = or i57 %X, %Y + ret i57 %Z +} + +define i49 @test2(i49 %A, i49 %B, i49 %C) { + %X = ashr i49 %A, %C + %Y = ashr i49 %B, %C + %Z = xor i49 %X, %Y + ret i49 %Z +} diff --git a/test/Transforms/InstCombine/apint-shift.ll b/test/Transforms/InstCombine/apint-shift.ll new file mode 100644 index 0000000..afc5360 --- /dev/null +++ b/test/Transforms/InstCombine/apint-shift.ll @@ -0,0 +1,191 @@ +; This test makes sure that shit instructions are properly eliminated +; even with arbitrary precision integers. +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep sh +; END. + +define i47 @test1(i47 %A) { + %B = shl i47 %A, 0 ; <i47> [#uses=1] + ret i47 %B +} + +define i41 @test2(i7 %X) { + %A = zext i7 %X to i41 ; <i41> [#uses=1] + %B = shl i41 0, %A ; <i41> [#uses=1] + ret i41 %B +} + +define i41 @test3(i41 %A) { + %B = ashr i41 %A, 0 ; <i41> [#uses=1] + ret i41 %B +} + +define i39 @test4(i7 %X) { + %A = zext i7 %X to i39 ; <i39> [#uses=1] + %B = ashr i39 0, %A ; <i39> [#uses=1] + ret i39 %B +} + +define i55 @test5(i55 %A) { + %B = lshr i55 %A, 55 ; <i55> [#uses=1] + ret i55 %B +} + +define i32 @test5a(i32 %A) { + %B = shl i32 %A, 32 ; <i32> [#uses=1] + ret i32 %B +} + +define i55 @test6(i55 %A) { + %B = shl i55 %A, 1 ; <i55> [#uses=1] + %C = mul i55 %B, 3 ; <i55> [#uses=1] + ret i55 %C +} + +define i29 @test7(i8 %X) { + %A = zext i8 %X to i29 ; <i29> [#uses=1] + %B = ashr i29 -1, %A ; <i29> [#uses=1] + ret i29 %B +} + +define i7 @test8(i7 %A) { + %B = shl i7 %A, 4 ; <i7> [#uses=1] + %C = shl i7 %B, 3 ; <i7> [#uses=1] + ret i7 %C +} + +define i17 @test9(i17 %A) { + %B = shl i17 %A, 16 ; <i17> [#uses=1] + %C = lshr i17 %B, 16 ; <i17> [#uses=1] + ret i17 %C +} + +define i19 @test10(i19 %A) { + %B = lshr i19 %A, 18 ; <i19> [#uses=1] + %C = shl i19 %B, 18 ; <i19> [#uses=1] + ret i19 %C +} + +define i23 @test11(i23 %A) { + %a = mul i23 %A, 3 ; <i23> [#uses=1] + %B = lshr i23 %a, 11 ; <i23> [#uses=1] + %C = shl i23 %B, 12 ; <i23> [#uses=1] + ret i23 %C +} + +define i47 @test12(i47 %A) { + %B = ashr i47 %A, 8 ; <i47> [#uses=1] + %C = shl i47 %B, 8 ; <i47> [#uses=1] + ret i47 %C +} + +define i18 @test13(i18 %A) { + %a = mul i18 %A, 3 ; <i18> [#uses=1] + %B = ashr i18 %a, 8 ; <i18> [#uses=1] + %C = shl i18 %B, 9 ; <i18> [#uses=1] + ret i18 %C +} + +define i35 @test14(i35 %A) { + %B = lshr i35 %A, 4 ; <i35> [#uses=1] + %C = or i35 %B, 1234 ; <i35> [#uses=1] + %D = shl i35 %C, 4 ; <i35> [#uses=1] + ret i35 %D +} + +define i79 @test14a(i79 %A) { + %B = shl i79 %A, 4 ; <i79> [#uses=1] + %C = and i79 %B, 1234 ; <i79> [#uses=1] + %D = lshr i79 %C, 4 ; <i79> [#uses=1] + ret i79 %D +} + +define i45 @test15(i1 %C) { + %A = select i1 %C, i45 3, i45 1 ; <i45> [#uses=1] + %V = shl i45 %A, 2 ; <i45> [#uses=1] + ret i45 %V +} + +define i53 @test15a(i1 %X) { + %A = select i1 %X, i8 3, i8 1 ; <i8> [#uses=1] + %B = zext i8 %A to i53 ; <i53> [#uses=1] + %V = shl i53 64, %B ; <i53> [#uses=1] + ret i53 %V +} + +define i1 @test16(i84 %X) { + %tmp.3 = ashr i84 %X, 4 ; <i84> [#uses=1] + %tmp.6 = and i84 %tmp.3, 1 ; <i84> [#uses=1] + %tmp.7 = icmp ne i84 %tmp.6, 0 ; <i1> [#uses=1] + ret i1 %tmp.7 +} + +define i1 @test17(i106 %A) { + %B = lshr i106 %A, 3 ; <i106> [#uses=1] + %C = icmp eq i106 %B, 1234 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test18(i11 %A) { + %B = lshr i11 %A, 10 ; <i11> [#uses=1] + %C = icmp eq i11 %B, 123 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test19(i37 %A) { + %B = ashr i37 %A, 2 ; <i37> [#uses=1] + %C = icmp eq i37 %B, 0 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test19a(i39 %A) { + %B = ashr i39 %A, 2 ; <i39> [#uses=1] + %C = icmp eq i39 %B, -1 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test20(i13 %A) { + %B = ashr i13 %A, 12 ; <i13> [#uses=1] + %C = icmp eq i13 %B, 123 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test21(i12 %A) { + %B = shl i12 %A, 6 ; <i12> [#uses=1] + %C = icmp eq i12 %B, -128 ; <i1> [#uses=1] + ret i1 %C +} + +define i1 @test22(i14 %A) { + %B = shl i14 %A, 7 ; <i14> [#uses=1] + %C = icmp eq i14 %B, 0 ; <i1> [#uses=1] + ret i1 %C +} + +define i11 @test23(i44 %A) { + %B = shl i44 %A, 33 ; <i44> [#uses=1] + %C = ashr i44 %B, 33 ; <i44> [#uses=1] + %D = trunc i44 %C to i11 ; <i8> [#uses=1] + ret i11 %D +} + +define i17 @test24(i17 %X) { + %Y = and i17 %X, -5 ; <i17> [#uses=1] + %Z = shl i17 %Y, 9 ; <i17> [#uses=1] + %Q = ashr i17 %Z, 9 ; <i17> [#uses=1] + ret i17 %Q +} + +define i37 @test25(i37 %tmp.2, i37 %AA) { + %x = lshr i37 %AA, 17 ; <i37> [#uses=1] + %tmp.3 = lshr i37 %tmp.2, 17 ; <i37> [#uses=1] + %tmp.5 = add i37 %tmp.3, %x ; <i37> [#uses=1] + %tmp.6 = shl i37 %tmp.5, 17 ; <i37> [#uses=1] + ret i37 %tmp.6 +} + +define i40 @test26(i40 %A) { + %B = lshr i40 %A, 1 ; <i40> [#uses=1] + %C = bitcast i40 %B to i40 ; <i40> [#uses=1] + %D = shl i40 %C, 1 ; <i40> [#uses=1] + ret i40 %D +} diff --git a/test/Transforms/InstCombine/apint-shl-trunc.ll b/test/Transforms/InstCombine/apint-shl-trunc.ll new file mode 100644 index 0000000..a9cffde --- /dev/null +++ b/test/Transforms/InstCombine/apint-shl-trunc.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep shl +; END. + +define i1 @test0(i39 %X, i39 %A) { + %B = lshr i39 %X, %A + %D = trunc i39 %B to i1 + ret i1 %D +} + +define i1 @test1(i799 %X, i799 %A) { + %B = lshr i799 %X, %A + %D = trunc i799 %B to i1 + ret i1 %D +} diff --git a/test/Transforms/InstCombine/apint-sub.ll b/test/Transforms/InstCombine/apint-sub.ll new file mode 100644 index 0000000..12f366d --- /dev/null +++ b/test/Transforms/InstCombine/apint-sub.ll @@ -0,0 +1,139 @@ +; This test makes sure that sub instructions are properly eliminated +; even with arbitrary precision integers. +; + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep -v {sub i19 %Cok, %Bok} | not grep sub +; END. + +define i23 @test1(i23 %A) { + %B = sub i23 %A, %A ; <i23> [#uses=1] + ret i23 %B +} + +define i47 @test2(i47 %A) { + %B = sub i47 %A, 0 ; <i47> [#uses=1] + ret i47 %B +} + +define i97 @test3(i97 %A) { + %B = sub i97 0, %A ; <i97> [#uses=1] + %C = sub i97 0, %B ; <i97> [#uses=1] + ret i97 %C +} + +define i108 @test4(i108 %A, i108 %x) { + %B = sub i108 0, %A ; <i108> [#uses=1] + %C = sub i108 %x, %B ; <i108> [#uses=1] + ret i108 %C +} + +define i19 @test5(i19 %A, i19 %Bok, i19 %Cok) { + %D = sub i19 %Bok, %Cok ; <i19> [#uses=1] + %E = sub i19 %A, %D ; <i19> [#uses=1] + ret i19 %E +} + +define i57 @test6(i57 %A, i57 %B) { + %C = and i57 %A, %B ; <i57> [#uses=1] + %D = sub i57 %A, %C ; <i57> [#uses=1] + ret i57 %D +} + +define i77 @test7(i77 %A) { + %B = sub i77 -1, %A ; <i77> [#uses=1] + ret i77 %B +} + +define i27 @test8(i27 %A) { + %B = mul i27 9, %A ; <i27> [#uses=1] + %C = sub i27 %B, %A ; <i27> [#uses=1] + ret i27 %C +} + +define i42 @test9(i42 %A) { + %B = mul i42 3, %A ; <i42> [#uses=1] + %C = sub i42 %A, %B ; <i42> [#uses=1] + ret i42 %C +} + +define i124 @test10(i124 %A, i124 %B) { + %C = sub i124 0, %A ; <i124> [#uses=1] + %D = sub i124 0, %B ; <i124> [#uses=1] + %E = mul i124 %C, %D ; <i124> [#uses=1] + ret i124 %E +} + +define i55 @test10a(i55 %A) { + %C = sub i55 0, %A ; <i55> [#uses=1] + %E = mul i55 %C, 7 ; <i55> [#uses=1] + ret i55 %E +} + +define i1 @test11(i9 %A, i9 %B) { + %C = sub i9 %A, %B ; <i9> [#uses=1] + %cD = icmp ne i9 %C, 0 ; <i1> [#uses=1] + ret i1 %cD +} + +define i43 @test12(i43 %A) { + %B = ashr i43 %A, 42 ; <i43> [#uses=1] + %C = sub i43 0, %B ; <i43> [#uses=1] + ret i43 %C +} + +define i79 @test13(i79 %A) { + %B = lshr i79 %A, 78 ; <i79> [#uses=1] + %C = sub i79 0, %B ; <i79> [#uses=1] + ret i79 %C +} + +define i1024 @test14(i1024 %A) { + %B = lshr i1024 %A, 1023 ; <i1024> [#uses=1] + %C = bitcast i1024 %B to i1024 ; <i1024> [#uses=1] + %D = sub i1024 0, %C ; <i1024> [#uses=1] + ret i1024 %D +} + +define i14 @test15(i14 %A, i14 %B) { + %C = sub i14 0, %A ; <i14> [#uses=1] + %D = srem i14 %B, %C ; <i14> [#uses=1] + ret i14 %D +} + +define i51 @test16(i51 %A) { + %X = sdiv i51 %A, 1123 ; <i51> [#uses=1] + %Y = sub i51 0, %X ; <i51> [#uses=1] + ret i51 %Y +} + +define i25 @test17(i25 %A) { + %B = sub i25 0, %A ; <i25> [#uses=1] + %C = sdiv i25 %B, 1234 ; <i25> [#uses=1] + ret i25 %C +} + +define i128 @test18(i128 %Y) { + %tmp.4 = shl i128 %Y, 2 ; <i128> [#uses=1] + %tmp.12 = shl i128 %Y, 2 ; <i128> [#uses=1] + %tmp.8 = sub i128 %tmp.4, %tmp.12 ; <i128> [#uses=1] + ret i128 %tmp.8 +} + +define i39 @test19(i39 %X, i39 %Y) { + %Z = sub i39 %X, %Y ; <i39> [#uses=1] + %Q = add i39 %Z, %Y ; <i39> [#uses=1] + ret i39 %Q +} + +define i1 @test20(i33 %g, i33 %h) { + %tmp.2 = sub i33 %g, %h ; <i33> [#uses=1] + %tmp.4 = icmp ne i33 %tmp.2, %g ; <i1> [#uses=1] + ret i1 %tmp.4 +} + +define i1 @test21(i256 %g, i256 %h) { + %tmp.2 = sub i256 %g, %h ; <i256> [#uses=1] + %tmp.4 = icmp ne i256 %tmp.2, %g; <i1> [#uses=1] + ret i1 %tmp.4 +} diff --git a/test/Transforms/InstCombine/apint-xor1.ll b/test/Transforms/InstCombine/apint-xor1.ll new file mode 100644 index 0000000..5ddf5cf --- /dev/null +++ b/test/Transforms/InstCombine/apint-xor1.ll @@ -0,0 +1,50 @@ +; This test makes sure that xor instructions are properly eliminated. +; This test is for Integer BitWidth <= 64 && BitWidth % 8 != 0. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {xor } + + +define i47 @test1(i47 %A, i47 %B) { + ;; (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0 + %A1 = and i47 %A, 70368744177664 + %B1 = and i47 %B, 70368744177661 + %C1 = xor i47 %A1, %B1 + ret i47 %C1 +} + +define i15 @test2(i15 %x) { + %tmp.2 = xor i15 %x, 0 + ret i15 %tmp.2 +} + +define i23 @test3(i23 %x) { + %tmp.2 = xor i23 %x, %x + ret i23 %tmp.2 +} + +define i37 @test4(i37 %x) { + ; x ^ ~x == -1 + %NotX = xor i37 -1, %x + %B = xor i37 %x, %NotX + ret i37 %B +} + +define i7 @test5(i7 %A) { + ;; (A|B)^B == A & (~B) + %t1 = or i7 %A, 23 + %r = xor i7 %t1, 23 + ret i7 %r +} + +define i7 @test6(i7 %A) { + %t1 = xor i7 %A, 23 + %r = xor i7 %t1, 23 + ret i7 %r +} + +define i47 @test7(i47 %A) { + ;; (A | C1) ^ C2 -> (A | C1) & ~C2 iff (C1&C2) == C2 + %B1 = or i47 %A, 70368744177663 + %C1 = xor i47 %B1, 703687463 + ret i47 %C1 +} diff --git a/test/Transforms/InstCombine/apint-xor2.ll b/test/Transforms/InstCombine/apint-xor2.ll new file mode 100644 index 0000000..4d2d415 --- /dev/null +++ b/test/Transforms/InstCombine/apint-xor2.ll @@ -0,0 +1,51 @@ +; This test makes sure that xor instructions are properly eliminated. +; This test is for Integer BitWidth > 64 && BitWidth <= 1024. + +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {xor } +; END. + + +define i447 @test1(i447 %A, i447 %B) { + ;; (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0 + %A1 = and i447 %A, 70368744177664 + %B1 = and i447 %B, 70368744177663 + %C1 = xor i447 %A1, %B1 + ret i447 %C1 +} + +define i1005 @test2(i1005 %x) { + %tmp.2 = xor i1005 %x, 0 + ret i1005 %tmp.2 +} + +define i123 @test3(i123 %x) { + %tmp.2 = xor i123 %x, %x + ret i123 %tmp.2 +} + +define i737 @test4(i737 %x) { + ; x ^ ~x == -1 + %NotX = xor i737 -1, %x + %B = xor i737 %x, %NotX + ret i737 %B +} + +define i700 @test5(i700 %A) { + ;; (A|B)^B == A & (~B) + %t1 = or i700 %A, 288230376151711743 + %r = xor i700 %t1, 288230376151711743 + ret i700 %r +} + +define i77 @test6(i77 %A) { + %t1 = xor i77 %A, 23 + %r = xor i77 %t1, 23 + ret i77 %r +} + +define i1023 @test7(i1023 %A) { + ;; (A | C1) ^ C2 -> (A | C1) & ~C2 iff (C1&C2) == C2 + %B1 = or i1023 %A, 70368744177663 + %C1 = xor i1023 %B1, 703687463 + ret i1023 %C1 +} diff --git a/test/Transforms/InstCombine/apint-zext1.ll b/test/Transforms/InstCombine/apint-zext1.ll new file mode 100644 index 0000000..03330c7 --- /dev/null +++ b/test/Transforms/InstCombine/apint-zext1.ll @@ -0,0 +1,9 @@ +; Tests to make sure elimination of casts is working correctly +; This test is for Integer BitWidth <= 64 && BitWidth % 2 != 0. +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast {} {%c1.*} + +define i47 @test_sext_zext(i11 %A) { + %c1 = zext i11 %A to i39 + %c2 = sext i39 %c1 to i47 + ret i47 %c2 +} diff --git a/test/Transforms/InstCombine/apint-zext2.ll b/test/Transforms/InstCombine/apint-zext2.ll new file mode 100644 index 0000000..8350d10 --- /dev/null +++ b/test/Transforms/InstCombine/apint-zext2.ll @@ -0,0 +1,9 @@ +; Tests to make sure elimination of casts is working correctly +; This test is for Integer BitWidth > 64 && BitWidth <= 1024. +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast {} {%c1.*} + +define i1024 @test_sext_zext(i77 %A) { + %c1 = zext i77 %A to i533 + %c2 = sext i533 %c1 to i1024 + ret i1024 %c2 +} diff --git a/test/Transforms/InstCombine/binop-cast.ll b/test/Transforms/InstCombine/binop-cast.ll new file mode 100644 index 0000000..ea5299b --- /dev/null +++ b/test/Transforms/InstCombine/binop-cast.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast + +define i32 @testAdd(i32 %X, i32 %Y) { + %tmp = add i32 %X, %Y + %tmp.l = bitcast i32 %tmp to i32 + ret i32 %tmp.l +} diff --git a/test/Transforms/InstCombine/bit-tracking.ll b/test/Transforms/InstCombine/bit-tracking.ll new file mode 100644 index 0000000..2575ae5 --- /dev/null +++ b/test/Transforms/InstCombine/bit-tracking.ll @@ -0,0 +1,26 @@ +; This file contains various testcases that require tracking whether bits are +; set or cleared by various instructions. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -instcombine | llvm-dis |\ +; RUN: not grep %ELIM + +; Reduce down to a single XOR +int %test3(int %B) { + %ELIMinc = and int %B, 1 + %tmp.5 = xor int %ELIMinc, 1 + %ELIM7 = and int %B, -2 + %tmp.8 = or int %tmp.5, %ELIM7 + ret int %tmp.8 +} + +; Finally, a bigger case where we chain things together. This corresponds to +; incrementing a single-bit bitfield, which should become just an xor. +int %test4(int %B) { + %ELIM3 = shl int %B, ubyte 31 + %ELIM4 = shr int %ELIM3, ubyte 31 + %inc = add int %ELIM4, 1 + %ELIM5 = and int %inc, 1 + %ELIM7 = and int %B, -2 + %tmp.8 = or int %ELIM5, %ELIM7 + ret int %tmp.8 +} + diff --git a/test/Transforms/InstCombine/bitcast-gep.ll b/test/Transforms/InstCombine/bitcast-gep.ll new file mode 100644 index 0000000..5a514ab --- /dev/null +++ b/test/Transforms/InstCombine/bitcast-gep.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep bitcast +; RUN: llvm-as < %s | opt -instcombine -scalarrepl | llvm-dis | grep {ret i8. %v} +; PR1345 + +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 = "powerpc-apple-darwin8.8.0" + +define i8* @test(i8* %v) { + %A = alloca [4 x i8*], align 16 ; <[4 x i8*]*> [#uses=3] + %B = getelementptr [4 x i8*]* %A, i32 0, i32 0 ; <i8**> [#uses=1] + store i8* null, i8** %B + %C = bitcast [4 x i8*]* %A to { [16 x i8] }* ; <{ [16 x i8] }*> [#uses=1] + %D = getelementptr { [16 x i8] }* %C, i32 0, i32 0, i32 8 ; <i8*> [#uses=1] + %E = bitcast i8* %D to i8** ; <i8**> [#uses=1] + store i8* %v, i8** %E + %F = getelementptr [4 x i8*]* %A, i32 0, i32 2 ; <i8**> [#uses=1] + %G = load i8** %F ; <i8*> [#uses=1] + ret i8* %G +} diff --git a/test/Transforms/InstCombine/bitcount.ll b/test/Transforms/InstCombine/bitcount.ll new file mode 100644 index 0000000..da53920 --- /dev/null +++ b/test/Transforms/InstCombine/bitcount.ll @@ -0,0 +1,17 @@ +; Tests to make sure bit counts of constants are folded +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 19} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep -v declare | not grep llvm.ct + +declare i32 @llvm.ctpop.i31(i31 %val) +declare i32 @llvm.cttz.i32(i32 %val) +declare i32 @llvm.ctlz.i33(i33 %val) + +define i32 @test(i32 %A) { + %c1 = call i32 @llvm.ctpop.i31(i31 12415124) + %c2 = call i32 @llvm.cttz.i32(i32 87359874) + %c3 = call i32 @llvm.ctlz.i33(i33 87359874) + %r1 = add i32 %c1, %c2 + %r2 = add i32 %r1, %c3 + ret i32 %r2 +} diff --git a/test/Transforms/InstCombine/bittest.ll b/test/Transforms/InstCombine/bittest.ll new file mode 100644 index 0000000..1ba4289 --- /dev/null +++ b/test/Transforms/InstCombine/bittest.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -simplifycfg | llvm-dis |\ +; RUN: not grep {call void %abort} + +%b_rec.0 = external global int + +void %_Z12h000007_testv(uint *%P) { +entry: + %tmp.2 = load int* %b_rec.0 ; <int> [#uses=1] + %tmp.9 = or int %tmp.2, -989855744 ; <int> [#uses=2] + %tmp.16 = and int %tmp.9, -805306369 ; <int> [#uses=2] + %tmp.17 = and int %tmp.9, -973078529 ; <int> [#uses=1] + store int %tmp.17, int* %b_rec.0 + %tmp.17.shrunk = cast int %tmp.16 to uint ; <uint> [#uses=1] + %tmp.22 = and uint %tmp.17.shrunk, 3221225472 ; <uint> [#uses=1] + %tmp.23 = seteq uint %tmp.22, 3221225472 ; <bool> [#uses=1] + br bool %tmp.23, label %endif.0, label %then.0 + +then.0: ; preds = %entry + tail call void %abort( ) + unreachable + +endif.0: ; preds = %entry + %tmp.17.shrunk2 = cast int %tmp.16 to uint ; <uint> [#uses=1] + %tmp.27.mask = and uint %tmp.17.shrunk2, 100663295 ; <uint> [#uses=1] + store uint %tmp.27.mask, uint* %P + ret void +} + +declare void %abort() diff --git a/test/Transforms/InstCombine/bswap-fold.ll b/test/Transforms/InstCombine/bswap-fold.ll new file mode 100644 index 0000000..1552386 --- /dev/null +++ b/test/Transforms/InstCombine/bswap-fold.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep ret | wc -l | grep 3 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep call.*bswap + +bool %test1(ushort %tmp2) { + %tmp10 = call ushort %llvm.bswap.i16( ushort %tmp2 ) + %tmp = seteq ushort %tmp10, 1 + ret bool %tmp +} + +bool %test2(uint %tmp) { + %tmp34 = tail call uint %llvm.bswap.i32( uint %tmp ) + %tmp = seteq uint %tmp34, 1 + ret bool %tmp +} + +declare uint %llvm.bswap.i32(uint) + +bool %test3(ulong %tmp) { + %tmp34 = tail call ulong %llvm.bswap.i64( ulong %tmp ) + %tmp = seteq ulong %tmp34, 1 + ret bool %tmp +} + +declare ulong %llvm.bswap.i64(ulong) + +declare ushort %llvm.bswap.i16(ushort) diff --git a/test/Transforms/InstCombine/bswap.ll b/test/Transforms/InstCombine/bswap.ll new file mode 100644 index 0000000..fde5ff0 --- /dev/null +++ b/test/Transforms/InstCombine/bswap.ll @@ -0,0 +1,62 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {call.*llvm.bswap} | wc -l | grep 5 +; END. + +uint %test1(uint %i) { + %tmp1 = shr uint %i, ubyte 24 ; <uint> [#uses=1] + %tmp3 = shr uint %i, ubyte 8 ; <uint> [#uses=1] + %tmp4 = and uint %tmp3, 65280 ; <uint> [#uses=1] + %tmp5 = or uint %tmp1, %tmp4 ; <uint> [#uses=1] + %tmp7 = shl uint %i, ubyte 8 ; <uint> [#uses=1] + %tmp8 = and uint %tmp7, 16711680 ; <uint> [#uses=1] + %tmp9 = or uint %tmp5, %tmp8 ; <uint> [#uses=1] + %tmp11 = shl uint %i, ubyte 24 ; <uint> [#uses=1] + %tmp12 = or uint %tmp9, %tmp11 ; <uint> [#uses=1] + ret uint %tmp12 +} + +uint %test2(uint %arg) { + %tmp2 = shl uint %arg, ubyte 24 ; <uint> [#uses=1] + %tmp4 = shl uint %arg, ubyte 8 ; <uint> [#uses=1] + %tmp5 = and uint %tmp4, 16711680 ; <uint> [#uses=1] + %tmp6 = or uint %tmp2, %tmp5 ; <uint> [#uses=1] + %tmp8 = shr uint %arg, ubyte 8 ; <uint> [#uses=1] + %tmp9 = and uint %tmp8, 65280 ; <uint> [#uses=1] + %tmp10 = or uint %tmp6, %tmp9 ; <uint> [#uses=1] + %tmp12 = shr uint %arg, ubyte 24 ; <uint> [#uses=1] + %tmp14 = or uint %tmp10, %tmp12 ; <uint> [#uses=1] + ret uint %tmp14 +} + +ushort %test3(ushort %s) { + %tmp2 = shr ushort %s, ubyte 8 + %tmp4 = shl ushort %s, ubyte 8 + %tmp5 = or ushort %tmp2, %tmp4 + ret ushort %tmp5 +} + +ushort %test4(ushort %s) { + %tmp2 = shr ushort %s, ubyte 8 + %tmp4 = shl ushort %s, ubyte 8 + %tmp5 = or ushort %tmp4, %tmp2 + ret ushort %tmp5 +} + +; unsigned short test5(unsigned short a) { +; return ((a & 0xff00) >> 8 | (a & 0x00ff) << 8); +;} +ushort %test5(ushort %a) { + %tmp = zext ushort %a to int + %tmp1 = and int %tmp, 65280 + %tmp2 = ashr int %tmp1, ubyte 8 + %tmp2 = trunc int %tmp2 to short + %tmp4 = and int %tmp, 255 + %tmp5 = shl int %tmp4, ubyte 8 + %tmp5 = trunc int %tmp5 to short + %tmp = or short %tmp2, %tmp5 + %tmp6 = bitcast short %tmp to ushort + %tmp6 = zext ushort %tmp6 to int + %retval = trunc int %tmp6 to ushort + ret ushort %retval +} + diff --git a/test/Transforms/InstCombine/call-cast-target.ll b/test/Transforms/InstCombine/call-cast-target.ll new file mode 100644 index 0000000..6d96490 --- /dev/null +++ b/test/Transforms/InstCombine/call-cast-target.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep call | not grep bitcast + +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + +implementation ; Functions: + +int %main() { +entry: + %tmp = call int cast (sbyte* (int*)* %ctime to int (int*)*)( int* null ) + ret int %tmp +} + +declare sbyte* %ctime(int*) diff --git a/test/Transforms/InstCombine/call-intrinsics.ll b/test/Transforms/InstCombine/call-intrinsics.ll new file mode 100644 index 0000000..e854998 --- /dev/null +++ b/test/Transforms/InstCombine/call-intrinsics.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis + +declare void %llvm.memmove.i32(sbyte*, sbyte*, uint, uint) +declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) +declare void %llvm.memset.i32(sbyte*, ubyte, uint, uint) + +%X = global sbyte 0 +%Y = global sbyte 12 + +void %zero_byte_test() { + ; These process zero bytes, so they are a noop. + call void %llvm.memmove.i32(sbyte* %X, sbyte* %Y, uint 0, uint 100) + call void %llvm.memcpy.i32(sbyte* %X, sbyte* %Y, uint 0, uint 100) + call void %llvm.memset.i32(sbyte* %X, ubyte 123, uint 0, uint 100) + ret void +} + diff --git a/test/Transforms/InstCombine/call.ll b/test/Transforms/InstCombine/call.ll new file mode 100644 index 0000000..1570165 --- /dev/null +++ b/test/Transforms/InstCombine/call.ll @@ -0,0 +1,58 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep call | notcast +; END. + +implementation + +; Simple case, argument translatable without changing the value +declare void %test1a(sbyte *%A) +void %test1(int *%A) { + call void(int*)* cast (void(sbyte*)* %test1a to void(int*)*)(int* %A) + ret void +} + +; More complex case, translate argument because of resolution. This is safe +; because we have the body of the function +void %test2a(sbyte %A) { ret void } +int %test2(int %A) { + call void(int)* cast (void(sbyte)* %test2a to void(int)*)(int %A) + ret int %A +} + +; Resolving this should insert a cast from sbyte to int, following the C +; promotion rules. +declare void %test3a(sbyte %A, ...) +void %test3(sbyte %A, sbyte %B) { + call void(sbyte, sbyte)* cast (void(sbyte,...)* %test3a to void(sbyte,sbyte)*)(sbyte %A, sbyte %B) + ret void +} + +; test conversion of return value... +sbyte %test4a() { ret sbyte 0 } +int %test4() { + %X = call int()* cast (sbyte()* %test4a to int()*)() + ret int %X +} + +; test conversion of return value... no value conversion occurs so we can do +; this with just a prototype... +declare uint %test5a() +int %test5() { + %X = call int()* cast (uint()* %test5a to int()*)() + ret int %X +} + +; test addition of new arguments... +declare int %test6a(int %X) +int %test6() { + %X = call int()* cast (int(int)* %test6a to int()*)() + ret int %X +} + +; test removal of arguments, only can happen with a function body +void %test7a() { ret void } +void %test7() { + call void(int)* cast (void()* %test7a to void(int)*)(int 5) + ret void +} + diff --git a/test/Transforms/InstCombine/call2.ll b/test/Transforms/InstCombine/call2.ll new file mode 100644 index 0000000..4ba840f --- /dev/null +++ b/test/Transforms/InstCombine/call2.ll @@ -0,0 +1,27 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis + +; This used to crash trying to do a double-to-pointer conversion +define i32 @bar() { +entry: + %retval = alloca i32, align 4 ; <i32*> [#uses=1] + "alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + %tmp = call i32 (...)* bitcast (i32 (i8*)* @f to i32 (...)*)( double 3.000000e+00 ) ; <i32> [#uses=0] + br label %return + +return: ; preds = %entry + %retval1 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval1 +} + +define i32 @f(i8* %p) { +entry: + %p_addr = alloca i8* ; <i8**> [#uses=1] + %retval = alloca i32, align 4 ; <i32*> [#uses=1] + "alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + store i8* %p, i8** %p_addr + br label %return + +return: ; preds = %entry + %retval1 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval1 +} diff --git a/test/Transforms/InstCombine/canonicalize_branch.ll b/test/Transforms/InstCombine/canonicalize_branch.ll new file mode 100644 index 0000000..032e293 --- /dev/null +++ b/test/Transforms/InstCombine/canonicalize_branch.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {setne\|setle\|setge} + +int %test1(uint %X, uint %Y) { + %C = setne uint %X, %Y + br bool %C, label %T, label %F +T: + ret int 12 +F: + ret int 123 +} + +int %test2(uint %X, uint %Y) { + %C = setle uint %X, %Y + br bool %C, label %T, label %F +T: + ret int 12 +F: + ret int 123 +} +int %test3(uint %X, uint %Y) { + %C = setge uint %X, %Y + br bool %C, label %T, label %F +T: + ret int 12 +F: + ret int 123 +} diff --git a/test/Transforms/InstCombine/cast-and-cast.ll b/test/Transforms/InstCombine/cast-and-cast.ll new file mode 100644 index 0000000..8da9d33 --- /dev/null +++ b/test/Transforms/InstCombine/cast-and-cast.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep bitcast + +bool %test1(uint %val) { + %t1 = bitcast uint %val to int + %t2 = and int %t1, 1 + %t3 = trunc int %t2 to bool + ret bool %t3 +} + +short %test1(uint %val) { + %t1 = bitcast uint %val to int + %t2 = and int %t1, 1 + %t3 = trunc int %t2 to short + ret short %t3 +} diff --git a/test/Transforms/InstCombine/cast-cast-to-and.ll b/test/Transforms/InstCombine/cast-cast-to-and.ll new file mode 100644 index 0000000..97386bb --- /dev/null +++ b/test/Transforms/InstCombine/cast-cast-to-and.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep ubyte + +int %test1(uint %X) { + %Y = cast uint %X to ubyte ;; Turn into an AND + %Z = cast ubyte %Y to int + ret int %Z +} + diff --git a/test/Transforms/InstCombine/cast-load-gep.ll b/test/Transforms/InstCombine/cast-load-gep.ll new file mode 100644 index 0000000..4fa63dd --- /dev/null +++ b/test/Transforms/InstCombine/cast-load-gep.ll @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -globaldce | llvm-dis | \ +; RUN: not grep Array + +; Pulling the cast out of the load allows us to eliminate the load, and then +; the whole array. + +%unop = type {int } +%op = type {float} + +%Array = internal constant [1 x %op* (%op*)*] [ %op* (%op*)* %foo ] + +implementation + +%op* %foo(%op* %X) { + ret %op* %X +} + +%unop* %caller(%op* %O) { + %tmp = load %unop* (%op*)** cast ([1 x %op* (%op*)*]* %Array to %unop* (%op*)**) + %tmp.2 = call %unop* (%op*)* %tmp(%op* %O) + ret %unop* %tmp.2 +} + diff --git a/test/Transforms/InstCombine/cast-malloc.ll b/test/Transforms/InstCombine/cast-malloc.ll new file mode 100644 index 0000000..565787c --- /dev/null +++ b/test/Transforms/InstCombine/cast-malloc.ll @@ -0,0 +1,13 @@ +; test that casted mallocs get converted to malloc of the right type +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep bitcast + +; The target datalayout is important for this test case. We have to tell +; instcombine that the ABI alignment for a long is 4-bytes, not 8, otherwise +; it won't do the transform. +target datalayout = "e-i64:32:64" +int* %test(uint %size) { + %X = malloc long, uint %size + %ret = bitcast long* %X to int* + ret int* %ret +} diff --git a/test/Transforms/InstCombine/cast-propagate.ll b/test/Transforms/InstCombine/cast-propagate.ll new file mode 100644 index 0000000..d556473 --- /dev/null +++ b/test/Transforms/InstCombine/cast-propagate.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -mem2reg | llvm-dis | \ +; RUN: not grep load + +int %test1(uint* %P) { + %A = alloca uint + store uint 123, uint* %A + %Q = cast uint* %A to int* ; Cast the result of the load not the source + %V = load int* %Q + ret int %V +} diff --git a/test/Transforms/InstCombine/cast-set.ll b/test/Transforms/InstCombine/cast-set.ll new file mode 100644 index 0000000..801aa1b --- /dev/null +++ b/test/Transforms/InstCombine/cast-set.ll @@ -0,0 +1,49 @@ +; This tests for various complex cast elimination cases instcombine should +; handle. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | notcast + +bool %test1(int %X) { + %A = cast int %X to uint + %c = setne uint %A, 12 ; Convert to setne int %X, 12 + ret bool %c +} + +bool %test2(int %X, int %Y) { + %A = cast int %X to uint + %B = cast int %Y to uint + %c = setne uint %A, %B ; Convert to setne int %X, %Y + ret bool %c +} + +int %test4(int %A) { + %B = cast int %A to uint + %C = shl uint %B, ubyte 2 + %D = cast uint %C to int + ret int %D +} + +short %test5(short %A) { + %B = cast short %A to uint + %C = and uint %B, 15 + %D = cast uint %C to short + ret short %D +} + +bool %test6(bool %A) { + %B = cast bool %A to int + %C = setne int %B, 0 + ret bool %C +} + +bool %test6a(bool %A) { + %B = cast bool %A to int + %C = setne int %B, -1 ; Always true! + ret bool %C +} + +bool %test7(sbyte* %A) { + %B = cast sbyte* %A to int* + %C = seteq int* %B, null + ret bool %C +} diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll new file mode 100644 index 0000000..156886f --- /dev/null +++ b/test/Transforms/InstCombine/cast.ll @@ -0,0 +1,230 @@ +; Tests to make sure elimination of casts is working correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep %c | notcast +; END. + +%inbuf = external global [32832 x ubyte] + +implementation + +int %test1(int %A) { + %c1 = cast int %A to uint + %c2 = cast uint %c1 to int + ret int %c2 +} + +ulong %test2(ubyte %A) { + %c1 = cast ubyte %A to ushort + %c2 = cast ushort %c1 to uint + %Ret = cast uint %c2 to ulong + ret ulong %Ret +} + +ulong %test3(ulong %A) { ; This function should just use bitwise AND + %c1 = cast ulong %A to ubyte + %c2 = cast ubyte %c1 to ulong + ret ulong %c2 +} + +uint %test4(int %A, int %B) { + %COND = setlt int %A, %B + %c = cast bool %COND to ubyte ; Booleans are unsigned integrals + %result = cast ubyte %c to uint ; for the cast elim purpose + ret uint %result +} + +int %test5(bool %B) { + %c = cast bool %B to ubyte ; This cast should get folded into + %result = cast ubyte %c to int ; this cast + ret int %result +} + +int %test6(ulong %A) { + %c1 = cast ulong %A to uint + %res = cast uint %c1 to int + ret int %res +} + +long %test7(bool %A) { + %c1 = cast bool %A to int + %res = cast int %c1 to long + ret long %res +} + +long %test8(sbyte %A) { + %c1 = cast sbyte %A to ulong + %res = cast ulong %c1 to long + ret long %res +} + +short %test9(short %A) { + %c1 = cast short %A to int + %c2 = cast int %c1 to short + ret short %c2 +} + +short %test10(short %A) { + %c1 = cast short %A to uint + %c2 = cast uint %c1 to short + ret short %c2 +} + +declare void %varargs(int, ...) + +void %test11(int* %P) { + %c = cast int* %P to short* + call void(int, ...)* %varargs(int 5, short* %c) + ret void +} + +int* %test12() { + %p = malloc [4 x sbyte] + %c = cast [4 x sbyte]* %p to int* + ret int* %c +} + +ubyte *%test13(long %A) { + %c = getelementptr [0 x ubyte]* cast ([32832 x ubyte]* %inbuf to [0 x ubyte]*), long 0, long %A + ret ubyte* %c +} + +bool %test14(sbyte %A) { + %c = cast sbyte %A to ubyte + %X = setlt ubyte %c, 128 ; setge %A, 0 + ret bool %X +} + +; This just won't occur when there's no difference between ubyte and sbyte +;bool %test15(ubyte %A) { +; %c = cast ubyte %A to sbyte +; %X = setlt sbyte %c, 0 ; setgt %A, 127 +; ret bool %X +;} + +bool %test16(int* %P) { + %c = cast int* %P to bool ;; setne P, null + ret bool %c +} + +short %test17(bool %tmp3) { + %c = cast bool %tmp3 to int + %t86 = cast int %c to short + ret short %t86 +} + +short %test18(sbyte %tmp3) { + %c = cast sbyte %tmp3 to int + %t86 = cast int %c to short + ret short %t86 +} + +bool %test19(int %X) { + %c = cast int %X to long + %Z = setlt long %c, 12345 + ret bool %Z +} + +bool %test20(bool %B) { + %c = cast bool %B to int + %D = setlt int %c, -1 + ret bool %D ;; false +} + +uint %test21(uint %X) { + %c1 = cast uint %X to sbyte + %c2 = cast sbyte %c1 to uint ;; sext -> zext -> and -> nop + %RV = and uint %c2, 255 + ret uint %RV +} + +uint %test22(uint %X) { + %c1 = cast uint %X to sbyte + %c2 = cast sbyte %c1 to uint ;; sext -> zext -> and -> nop + %RV = shl uint %c2, ubyte 24 + ret uint %RV +} + +int %test23(int %X) { + %c1 = cast int %X to ushort ;; Turn into an AND even though X + %c2 = cast ushort %c1 to int ;; and Z are signed. + ret int %c2 +} + +bool %test24(bool %C) { + %X = select bool %C, uint 14, uint 1234 + %c = cast uint %X to bool ;; Fold cast into select + ret bool %c +} + +void %test25(int** %P) { + %c = cast int** %P to float** + store float* null, float** %c ;; Fold cast into null + ret void +} + +int %test26(float %F) { + %c = cast float %F to double ;; no need to cast from float->double. + %D = cast double %c to int + ret int %D +} + +[4 x float]* %test27([9 x [4 x float]]* %A) { + %c = cast [9 x [4 x float]]* %A to [4 x float]* + ret [4 x float]* %c +} + +float* %test28([4 x float]* %A) { + %c = cast [4 x float]* %A to float* + ret float* %c +} + +uint %test29(uint %c1, uint %c2) { + %tmp1 = cast uint %c1 to ubyte + %tmp4.mask = cast uint %c2 to ubyte + %tmp = or ubyte %tmp4.mask, %tmp1 + %tmp10 = cast ubyte %tmp to uint + ret uint %tmp10 +} + +uint %test30(uint %c1) { + %c2 = cast uint %c1 to ubyte + %c3 = xor ubyte %c2, 1 + %c4 = cast ubyte %c3 to uint + ret uint %c4 +} + +bool %test31(ulong %A) { + %B = cast ulong %A to int + %C = and int %B, 42 + %D = seteq int %C, 10 + ret bool %D +} + + +void %test32(double** %tmp) { + %tmp8 = malloc [16 x sbyte] + %tmp8 = cast [16 x sbyte]* %tmp8 to double* + store double* %tmp8, double** %tmp + ret void +} + +uint %test33(uint %c1) { + %x = bitcast uint %c1 to float + %y = bitcast float %x to uint + ret uint %y +} + +ushort %test34(ushort %a) { + %c1 = zext ushort %a to int + %tmp21 = lshr int %c1, ubyte 8 + %c2 = trunc int %tmp21 to ushort + ret ushort %c2 +} + +ushort %test35(ushort %a) { + %c1 = bitcast ushort %a to short + %tmp2 = lshr short %c1, ubyte 8 + %c2 = bitcast short %tmp2 to ushort + ret ushort %c2 +} + diff --git a/test/Transforms/InstCombine/cast2.ll b/test/Transforms/InstCombine/cast2.ll new file mode 100644 index 0000000..5cc9087 --- /dev/null +++ b/test/Transforms/InstCombine/cast2.ll @@ -0,0 +1,29 @@ +; Tests to make sure elimination of casts is working correctly +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast + +define i16 @test1(i16 %a) { + %tmp = zext i16 %a to i32 ; <i32> [#uses=2] + %tmp21 = lshr i32 %tmp, 8 ; <i32> [#uses=1] + %tmp5 = shl i32 %tmp, 8 ; <i32> [#uses=1] + %tmp.upgrd.32 = or i32 %tmp21, %tmp5 ; <i32> [#uses=1] + %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16 ; <i16> [#uses=1] + ret i16 %tmp.upgrd.3 +} + +define i16 @test2(i16 %a) { + %tmp = zext i16 %a to i32 ; <i32> [#uses=2] + %tmp21 = lshr i32 %tmp, 9 ; <i32> [#uses=1] + %tmp5 = shl i32 %tmp, 8 ; <i32> [#uses=1] + %tmp.upgrd.32 = or i32 %tmp21, %tmp5 ; <i32> [#uses=1] + %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16 ; <i16> [#uses=1] + ret i16 %tmp.upgrd.3 +} + +; PR1263 +define i32* @test3(i32* %tmp1) { + %tmp64 = bitcast i32* %tmp1 to { i32 }* ; <{ i32 }*> [#uses=1] + %tmp65 = getelementptr { i32 }* %tmp64, i32 0, i32 0 ; <i32*> [#uses=1] + ret i32* %tmp65 +} + + diff --git a/test/Transforms/InstCombine/cast_ptr.ll b/test/Transforms/InstCombine/cast_ptr.ll new file mode 100644 index 0000000..c067988 --- /dev/null +++ b/test/Transforms/InstCombine/cast_ptr.ll @@ -0,0 +1,20 @@ +; Tests to make sure elimination of casts is working correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | notcast + +target pointersize = 32 + +implementation + +sbyte* %test1(sbyte* %t) { + %tmpc = cast sbyte* %t to uint + %tmpa = add uint %tmpc, 32 + %tv = cast uint %tmpa to sbyte* + ret sbyte* %tv +} + +bool %test2(sbyte* %a, sbyte* %b) { +%tmpa = cast sbyte* %a to uint +%tmpb = cast sbyte* %b to uint +%r = seteq uint %tmpa, %tmpb +ret bool %r +} diff --git a/test/Transforms/InstCombine/deadcode.ll b/test/Transforms/InstCombine/deadcode.ll new file mode 100644 index 0000000..370390a --- /dev/null +++ b/test/Transforms/InstCombine/deadcode.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i32 %A} + +int %test(int %A) { + %X = or bool false, false + br bool %X, label %T, label %C +T: + %B = add int %A, 1 + br label %C +C: + %C = phi int [%B, %T], [%A, %0] + ret int %C +} diff --git a/test/Transforms/InstCombine/dg.exp b/test/Transforms/InstCombine/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/InstCombine/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/InstCombine/div.ll b/test/Transforms/InstCombine/div.ll new file mode 100644 index 0000000..97f331c --- /dev/null +++ b/test/Transforms/InstCombine/div.ll @@ -0,0 +1,69 @@ +; This test makes sure that div instructions are properly eliminated. +; + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep div +; END. + +implementation + +int %test1(int %A) { + %B = div int %A, 1 + ret int %B +} + +uint %test2(uint %A) { + %B = div uint %A, 8 ; => Shift + ret uint %B +} + +int %test3(int %A) { + %B = div int 0, %A ; => 0, don't need to keep traps + ret int %B +} + +int %test4(int %A) { + %B = div int %A, -1 ; 0-A + ret int %B +} + +uint %test5(uint %A) { + %B = div uint %A, 4294967280 + %C = div uint %B, 4294967292 + ret uint %C +} + +bool %test6(uint %A) { + %B = div uint %A, 123 + %C = seteq uint %B, 0 ; A < 123 + ret bool %C +} + +bool %test7(uint %A) { + %B = div uint %A, 10 + %C = seteq uint %B, 2 ; A >= 20 && A < 30 + ret bool %C +} + +bool %test8(ubyte %A) { + %B = div ubyte %A, 123 + %C = seteq ubyte %B, 2 ; A >= 246 + ret bool %C +} + +bool %test9(ubyte %A) { + %B = div ubyte %A, 123 + %C = setne ubyte %B, 2 ; A < 246 + ret bool %C +} + +uint %test10(uint %X, bool %C) { + %V = select bool %C, uint 64, uint 8 + %R = udiv uint %X, %V + ret uint %R +} + +int %test11(int %X, bool %C) { + %A = select bool %C, int 1024, int 32 + %B = udiv int %X, %A + ret int %B +} diff --git a/test/Transforms/InstCombine/fpcast.ll b/test/Transforms/InstCombine/fpcast.ll new file mode 100644 index 0000000..0c38767 --- /dev/null +++ b/test/Transforms/InstCombine/fpcast.ll @@ -0,0 +1,14 @@ +; Test some floating point casting cases +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | notcast +; RUN: llvm-upgrade %s -o - | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: egrep {ret i8 \(-1\)\|\(255\)} + +sbyte %test1() { + %x = fptoui float 255.0 to sbyte + ret sbyte %x +} + +ubyte %test2() { + %x = fptosi float -1.0 to ubyte + ret ubyte %x +} diff --git a/test/Transforms/InstCombine/getelementptr-setcc.ll b/test/Transforms/InstCombine/getelementptr-setcc.ll new file mode 100644 index 0000000..55102f4 --- /dev/null +++ b/test/Transforms/InstCombine/getelementptr-setcc.ll @@ -0,0 +1,34 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep getelementptr +; END. + +bool %test1(short* %P, int %I, int %J) { + %X = getelementptr short* %P, int %I + %Y = getelementptr short* %P, int %J + + %C = setlt short* %X, %Y + ret bool %C +} + +bool %test2(short* %P, int %I) { + %X = getelementptr short* %P, int %I + + %C = setlt short* %X, %P + ret bool %C +} + +int %test3(int* %P, int %A, int %B) { + %tmp.4 = getelementptr int* %P, int %A ; <int*> [#uses=1] + %tmp.9 = getelementptr int* %P, int %B ; <int*> [#uses=1] + %tmp.10 = seteq int* %tmp.4, %tmp.9 ; <bool> [#uses=1] + %tmp.11 = cast bool %tmp.10 to int ; <int> [#uses=1] + ret int %tmp.11 +} + +int %test4(int* %P, int %A, int %B) { + %tmp.4 = getelementptr int* %P, int %A ; <int*> [#uses=1] + %tmp.6 = seteq int* %tmp.4, %P ; <bool> [#uses=1] + %tmp.7 = cast bool %tmp.6 to int ; <int> [#uses=1] + ret int %tmp.7 +} + diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll new file mode 100644 index 0000000..7e88092 --- /dev/null +++ b/test/Transforms/InstCombine/getelementptr.ll @@ -0,0 +1,76 @@ +; The %A getelementptr instruction should be eliminated here + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v %B | not grep getelementptr +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep foo1 +; END. + +%Global = constant [10 x sbyte] c"helloworld" + +implementation + +int *%foo1(int* %I) { ; Test noop elimination + %A = getelementptr int* %I, long 0 + ret int * %A +} + +int* %foo2(int* %I) { ; Test noop elimination + %A = getelementptr int* %I + ret int* %A +} +int* %foo3(int * %I) { ; Test that two array indexing geps fold + %A = getelementptr int* %I, long 17 + %B = getelementptr int* %A, long 4 + ret int* %B +} + +int* %foo4({int} *%I) { ; Test that two getelementptr insts fold + %A = getelementptr {int}* %I, long 1 + %B = getelementptr {int}* %A, long 0, uint 0 + ret int* %B +} + +void %foo5(sbyte %B) { + ; This should be turned into a constexpr instead of being an instruction + %A = getelementptr [10 x sbyte]* %Global, long 0, long 4 + store sbyte %B, sbyte* %A + ret void +} + +int* %foo6() { + %M = malloc [4 x int] + %A = getelementptr [4 x int]* %M, long 0, long 0 + %B = getelementptr int* %A, long 2 + ret int* %B +} + +int* %foo7(int* %I, long %C, long %D) { + %A = getelementptr int* %I, long %C + %B = getelementptr int* %A, long %D + ret int* %B +} + +sbyte* %foo8([10 x int]* %X) { + %A = getelementptr [10 x int]* %X, long 0, long 0 ;; Fold into the cast. + %B = cast int* %A to sbyte* + ret sbyte * %B +} + +int %test9() { + %A = getelementptr {int, double}* null, int 0, uint 1 + %B = cast double* %A to int + ret int %B +} + +bool %test10({int, int} * %x, {int, int} * %y) { + %tmp.1 = getelementptr {int,int}* %x, int 0, uint 1 + %tmp.3 = getelementptr {int,int}* %y, int 0, uint 1 + %tmp.4 = seteq int* %tmp.1, %tmp.3 ;; seteq x, y + ret bool %tmp.4 +} + +bool %test11({int,int} *%X) { + %P = getelementptr {int,int}* %X, int 0, uint 0 + %Q = seteq int* %P, null + ret bool %Q +} diff --git a/test/Transforms/InstCombine/getelementptr_cast.ll b/test/Transforms/InstCombine/getelementptr_cast.ll new file mode 100644 index 0000000..5a0d132 --- /dev/null +++ b/test/Transforms/InstCombine/getelementptr_cast.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: notcast {} {getelementptr.*} + +%G = external global [3 x sbyte] + +implementation + +ubyte *%foo(uint %Idx) { + %tmp = getelementptr ubyte* cast ([3 x sbyte]* %G to ubyte*), uint %Idx + ret ubyte* %tmp +} diff --git a/test/Transforms/InstCombine/getelementptr_const.ll b/test/Transforms/InstCombine/getelementptr_const.ll new file mode 100644 index 0000000..e4265f4 --- /dev/null +++ b/test/Transforms/InstCombine/getelementptr_const.ll @@ -0,0 +1,14 @@ +; Test folding of constantexpr geps into normal geps. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -gcse -instcombine | \ +; RUN: llvm-dis | not grep getelementptr + +%Array = external global [40 x int] + +int %test(long %X) { + %A = getelementptr int* getelementptr ([40 x int]* %Array, long 0, long 0), long %X + %B = getelementptr [40 x int]* %Array, long 0, long %X + %a = cast int* %A to int + %b = cast int* %B to int + %c = sub int %a, %b + ret int %c +} diff --git a/test/Transforms/InstCombine/getelementptr_index.ll b/test/Transforms/InstCombine/getelementptr_index.ll new file mode 100644 index 0000000..c4a7317 --- /dev/null +++ b/test/Transforms/InstCombine/getelementptr_index.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep trunc + +target endian = little +target pointersize = 32 + +int* %test(int* %X, long %Idx) { + ; Should insert a cast to int on this target + %R = getelementptr int* %X, long %Idx + ret int* %R +} diff --git a/test/Transforms/InstCombine/hoist_instr.ll b/test/Transforms/InstCombine/hoist_instr.ll new file mode 100644 index 0000000..cfe704d --- /dev/null +++ b/test/Transforms/InstCombine/hoist_instr.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: %prcontext div 1 | grep then: + +;; This tests that the div is hoisted into the then block. + +int %foo(bool %C, int %A, int %B) { +entry: + br bool %C, label %then, label %endif + +then: + br label %endif + +endif: + %X = phi int [%A, %then], [15, %entry] + %Y = div int %X, 42 + ret int %Y +} diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll new file mode 100644 index 0000000..bb69ba3 --- /dev/null +++ b/test/Transforms/InstCombine/icmp.ll @@ -0,0 +1,31 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep icmp +; END. + +define i32 @test1(i32 %X) { +entry: + icmp slt i32 %X, 0 ; <i1>:0 [#uses=1] + zext i1 %0 to i32 ; <i32>:1 [#uses=1] + ret i32 %1 +} + +define i32 @test2(i32 %X) { +entry: + icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1] + zext i1 %0 to i32 ; <i32>:1 [#uses=1] + ret i32 %1 +} + +define i32 @test3(i32 %X) { +entry: + icmp slt i32 %X, 0 ; <i1>:0 [#uses=1] + sext i1 %0 to i32 ; <i32>:1 [#uses=1] + ret i32 %1 +} + +define i32 @test4(i32 %X) { +entry: + icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1] + sext i1 %0 to i32 ; <i32>:1 [#uses=1] + ret i32 %1 +} + diff --git a/test/Transforms/InstCombine/load.ll b/test/Transforms/InstCombine/load.ll new file mode 100644 index 0000000..d1b8eda --- /dev/null +++ b/test/Transforms/InstCombine/load.ll @@ -0,0 +1,74 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep load +; END. + +%X = constant int 42 +%X2 = constant int 47 +%Y = constant [2 x { int, float }] [ { int, float } { int 12, float 1.0 }, + { int, float } { int 37, float 1.2312 } ] +%Z = constant [2 x { int, float }] zeroinitializer + +int %test1() { + %B = load int* %X + ret int %B +} + +float %test2() { + %A = getelementptr [2 x { int, float}]* %Y, long 0, long 1, uint 1 + %B = load float* %A + ret float %B +} + + +int %test3() { + %A = getelementptr [2 x { int, float}]* %Y, long 0, long 0, uint 0 + %B = load int* %A + ret int %B +} + +int %test4() { + %A = getelementptr [2 x { int, float}]* %Z, long 0, long 1, uint 0 + %B = load int* %A + ret int %B +} + +; load (select (Cond, &V1, &V2)) --> select(Cond, load &V1, load &V2) +int %test5(bool %C) { + %Y = select bool %C, int* %X, int* %X2 + %Z = load int* %Y + ret int %Z +} + +int %test7(int %X) { + %V = getelementptr int* null, int %X + %R = load int* %V + ret int %R +} + +int %test8(int* %P) { + store int 1, int* %P + %X = load int* %P ;; Trivial store->load forwarding + ret int %X +} + +int %test9(int* %P) { + %X = load int* %P ;; Trivial load cse + %Y = load int* %P + %Z = sub int %X, %Y + ret int %Z +} + +int %test10(bool %C, int* %P, int* %Q) { + br bool %C, label %T, label %F +T: + store int 1, int* %Q + store int 0, int* %P + br label %C +F: + store int 0, int* %P + br label %C +C: + %V = load int* %P ;; always 0 + ret int %V +} diff --git a/test/Transforms/InstCombine/malloc-free-delete.ll b/test/Transforms/InstCombine/malloc-free-delete.ll new file mode 100644 index 0000000..24f793f --- /dev/null +++ b/test/Transforms/InstCombine/malloc-free-delete.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 0} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep malloc +; PR1201 +define i32 @main(i32 %argc, i8** %argv) { + %c_19 = alloca i8* ; <i8**> [#uses=2] + %malloc_206 = malloc i8, i32 10 ; <i8*> [#uses=1] + store i8* %malloc_206, i8** %c_19 + %tmp_207 = load i8** %c_19 ; <i8*> [#uses=1] + free i8* %tmp_207 + ret i32 0 +} diff --git a/test/Transforms/InstCombine/malloc.ll b/test/Transforms/InstCombine/malloc.ll new file mode 100644 index 0000000..6a4601a --- /dev/null +++ b/test/Transforms/InstCombine/malloc.ll @@ -0,0 +1,7 @@ +; test that malloc's with a constant argument are promoted to array allocations +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep getelementptr + +define i32* @test() { + %X = malloc i32, i32 4 + ret i32* %X +} diff --git a/test/Transforms/InstCombine/malloc2.ll b/test/Transforms/InstCombine/malloc2.ll new file mode 100644 index 0000000..eb7c9ab --- /dev/null +++ b/test/Transforms/InstCombine/malloc2.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 0} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep malloc +; PR1313 + +define i32 @test1(i32 %argc, i8* %argv, i8* %envp) { + %tmp15.i.i.i23 = malloc [2564 x i32] ; <[2564 x i32]*> [#uses=1] + %c = icmp eq [2564 x i32]* %tmp15.i.i.i23, null ; <i1>:0 [#uses=1] + %retval = zext i1 %c to i32 ; <i32> [#uses=1] + ret i32 %retval +} + +define i32 @test2(i32 %argc, i8* %argv, i8* %envp) { + %tmp15.i.i.i23 = malloc [2564 x i32] ; <[2564 x i32]*> [#uses=1] + %X = bitcast [2564 x i32]* %tmp15.i.i.i23 to i32* + %c = icmp ne i32* %X, null + %retval = zext i1 %c to i32 ; <i32> [#uses=1] + ret i32 %retval +} + diff --git a/test/Transforms/InstCombine/memmove.ll b/test/Transforms/InstCombine/memmove.ll new file mode 100644 index 0000000..52ed592 --- /dev/null +++ b/test/Transforms/InstCombine/memmove.ll @@ -0,0 +1,23 @@ +; This test makes sure that memmove instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {call void @llvm.memmove} + +%S = internal constant [33 x sbyte] c"panic: restorelist inconsistency\00" + +implementation + +declare void %llvm.memmove.i32(sbyte*, sbyte*, uint, uint) + +void %test1(sbyte* %A, sbyte* %B, uint %N) { + ;; 0 bytes -> noop. + call void %llvm.memmove.i32(sbyte* %A, sbyte* %B, uint 0, uint 1) + ret void +} + +void %test2(sbyte *%A, uint %N) { + ;; dest can't alias source since we can't write to source! + call void %llvm.memmove.i32(sbyte* %A, sbyte* getelementptr ([33 x sbyte]* %S, int 0, int 0), + uint %N, uint 1) + ret void +} diff --git a/test/Transforms/InstCombine/mul.ll b/test/Transforms/InstCombine/mul.ll new file mode 100644 index 0000000..1d5c286 --- /dev/null +++ b/test/Transforms/InstCombine/mul.ll @@ -0,0 +1,74 @@ +; This test makes sure that mul instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep mul +; END. + +implementation + +int %test1(int %A) { + %B = mul int %A, 1 + ret int %B +} + +int %test2(int %A) { + %B = mul int %A, 2 ; Should convert to an add instruction + ret int %B +} + +int %test3(int %A) { + %B = mul int %A, 0 ; This should disappear entirely + ret int %B +} + +double %test4(double %A) { + %B = mul double 1.0, %A ; This is safe for FP + ret double %B +} + +int %test5(int %A) { + %B = mul int %A, 8 + ret int %B +} + +ubyte %test6(ubyte %A) { + %B = mul ubyte %A, 8 + %C = mul ubyte %B, 8 + ret ubyte %C +} + +int %test7(int %i) { + %tmp = mul int %i, -1 ; %tmp = sub 0, %i + ret int %tmp +} + +ulong %test8(ulong %i) { + %j = mul ulong %i, 18446744073709551615 ; tmp = sub 0, %i + ret ulong %j +} + +uint %test9(uint %i) { + %j = mul uint %i, 4294967295 ; %j = sub 0, %i + ret uint %j +} + +uint %test10(int %a, uint %b) { + %c = setlt int %a, 0 + %d = cast bool %c to uint + %e = mul uint %d, %b ; e = b & (a >> 31) + ret uint %e +} + +uint %test11(int %a, uint %b) { + %c = setle int %a, -1 + %d = cast bool %c to uint + %e = mul uint %d, %b ; e = b & (a >> 31) + ret uint %e +} + +uint %test12(ubyte %a, uint %b) { + %c = setgt ubyte %a, 127 + %d = cast bool %c to uint + %e = mul uint %d, %b ; e = b & (a >> 31) + ret uint %e +} + diff --git a/test/Transforms/InstCombine/narrow.ll b/test/Transforms/InstCombine/narrow.ll new file mode 100644 index 0000000..02d7e31 --- /dev/null +++ b/test/Transforms/InstCombine/narrow.ll @@ -0,0 +1,17 @@ +; This file contains various testcases that check to see that instcombine +; is narrowing computations when possible. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i1 false} + +; test1 - Eliminating the casts in this testcase (by narrowing the AND +; operation) allows instcombine to realize the function always returns false. +; +bool %test1(int %A, int %B) { + %C1 = setlt int %A, %B + %ELIM1 = zext bool %C1 to uint + %C2 = setgt int %A, %B + %ELIM2 = zext bool %C2 to uint + %C3 = and uint %ELIM1, %ELIM2 + %ELIM3 = trunc uint %C3 to bool + ret bool %ELIM3 +} diff --git a/test/Transforms/InstCombine/not.ll b/test/Transforms/InstCombine/not.ll new file mode 100644 index 0000000..3e85692 --- /dev/null +++ b/test/Transforms/InstCombine/not.ll @@ -0,0 +1,45 @@ +; This test makes sure that these instructions are properly eliminated. +; + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep xor + +implementation + +int %test1(int %A) { + %B = xor int %A, -1 + %C = xor int %B, -1 + ret int %C +} + +bool %test2(int %A, int %B) { + %cond = setle int %A, %B ; Can change into setge + %Ret = xor bool %cond, true + ret bool %Ret +} + + +; Test that demorgans law can be instcombined +int %test3(int %A, int %B) { + %a = xor int %A, -1 + %b = xor int %B, -1 + %c = and int %a, %b + %d = xor int %c, -1 + ret int %d +} + +; Test that demorgens law can work with constants +int %test4(int %A, int %B) { + %a = xor int %A, -1 + %c = and int %a, 5 ; 5 = ~c2 + %d = xor int %c, -1 + ret int %d +} + +; test the mirror of demorgans law... +int %test5(int %A, int %B) { + %a = xor int %A, -1 + %b = xor int %B, -1 + %c = or int %a, %b + %d = xor int %c, -1 + ret int %d +} diff --git a/test/Transforms/InstCombine/or.ll b/test/Transforms/InstCombine/or.ll new file mode 100644 index 0000000..3fc225a --- /dev/null +++ b/test/Transforms/InstCombine/or.ll @@ -0,0 +1,158 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v xor | not grep {or } +; END. + +implementation + +int %test1(int %A) { + %B = or int %A, 0 + ret int %B +} + +int %test2(int %A) { + %B = or int %A, -1 + ret int %B +} + +ubyte %test2a(ubyte %A) { + %B = or ubyte %A, 255 + ret ubyte %B +} + +bool %test3(bool %A) { + %B = or bool %A, false + ret bool %B +} + +bool %test4(bool %A) { + %B = or bool %A, true + ret bool %B +} + +bool %test5(bool %A) { + %B = or bool %A, %A + ret bool %B +} + +int %test6(int %A) { + %B = or int %A, %A + ret int %B +} + +int %test7(int %A) { ; A | ~A == -1 + %NotA = xor int -1, %A + %B = or int %A, %NotA + ret int %B +} + +ubyte %test8(ubyte %A) { + %B = or ubyte %A, 254 + %C = or ubyte %B, 1 + ret ubyte %C +} + +ubyte %test9(ubyte %A, ubyte %B) { ; Test that (A|c1)|(B|c2) == (A|B)|(c1|c2) + %C = or ubyte %A, 1 + %D = or ubyte %B, 254 + %E = or ubyte %C, %D + ret ubyte %E +} + +ubyte %test10(ubyte %A) { + %B = or ubyte %A, 1 + %C = and ubyte %B, 254 + %D = or ubyte %C, 254 ; (X & C1) | C2 --> (X | C2) & (C1|C2) + ret ubyte %D +} + +ubyte %test11(ubyte %A) { + %B = or ubyte %A, 254 + %C = xor ubyte %B, 13 + %D = or ubyte %C, 1 ; (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2) + %E = xor ubyte %D, 12 + ret ubyte %E +} + +uint %test12(uint %A) { + %B = or uint %A, 4 ; Should be eliminated + %C = and uint %B, 8 + ret uint %C +} + +uint %test13(uint %A) { + %B = or uint %A, 12 + %C = and uint %B, 8 ; Always equal to 8 + ret uint %C +} + +bool %test14(uint %A, uint %B) { + %C1 = setlt uint %A, %B + %C2 = setgt uint %A, %B + %D = or bool %C1, %C2 ; (A < B) | (A > B) === A != B + ret bool %D +} + +bool %test15(uint %A, uint %B) { + %C1 = setlt uint %A, %B + %C2 = seteq uint %A, %B + %D = or bool %C1, %C2 ; (A < B) | (A == B) === A <= B + ret bool %D +} + +int %test16(int %A) { + %B = and int %A, 1 + %C = and int %A, -2 ; -2 = ~1 + %D = or int %B, %C ; %D = and int %B, -1 == %B + ret int %D +} + +int %test17(int %A) { + %B = and int %A, 1 + %C = and int %A, 4 + %D = or int %B, %C ; %D = and int %B, 5 + ret int %D +} + +bool %test18(int %A) { + %B = setge int %A, 100 + %C = setlt int %A, 50 + %D = or bool %B, %C ;; (A-50) >u 50 + ret bool %D +} + +bool %test19(int %A) { + %B = seteq int %A, 50 + %C = seteq int %A, 51 + %D = or bool %B, %C ;; (A-50) < 2 + ret bool %D +} + +int %test20(int %x) { + %y = and int %x, 123 + %z = or int %y, %x + ret int %z +} + +uint %test21(uint %tmp.1) { + %tmp.1.mask1 = add uint %tmp.1, 2 + %tmp.3 = and uint %tmp.1.mask1, 4294967294 + %tmp.5 = and uint %tmp.1, 1 + %tmp.6 = or uint %tmp.5, %tmp.3 ;; add tmp.1, 2 + ret uint %tmp.6 +} + +int %test22(int %B) { + %ELIM41 = and int %B, 1 ; <int> [#uses=1] + %ELIM7 = and int %B, -2 ; <int> [#uses=1] + %ELIM5 = or int %ELIM41, %ELIM7 ; <int> [#uses=1] + ret int %ELIM5 +} + +ushort %test23(ushort %A) { + %B = shr ushort %A, ubyte 1 + %C = or ushort %B, 32768 ;; fold or into xor + %D = xor ushort %C, 8193 + ret ushort %D +} diff --git a/test/Transforms/InstCombine/or2.ll b/test/Transforms/InstCombine/or2.ll new file mode 100644 index 0000000..c632a5d --- /dev/null +++ b/test/Transforms/InstCombine/or2.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep { or} + +define i32 @test1(i32 %b, i32 %c, i32 %d) { + %tmp3 = and i32 %c, %b + %tmp4not = xor i32 %b, -1 + %tmp6 = and i32 %d, %tmp4not + %tmp7 = or i32 %tmp6, %tmp3 + ret i32 %tmp7 +} + diff --git a/test/Transforms/InstCombine/phi.ll b/test/Transforms/InstCombine/phi.ll new file mode 100644 index 0000000..a51e90e --- /dev/null +++ b/test/Transforms/InstCombine/phi.ll @@ -0,0 +1,78 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep phi +; END. + +implementation + +int %test1(int %A, bool %b) { +BB0: br bool %b, label %BB1, label %BB2 +BB1: + %B = phi int [%A, %BB0] ; Combine away one argument PHI nodes + ret int %B +BB2: + ret int %A +} + +int %test2(int %A, bool %b) { +BB0: br bool %b, label %BB1, label %BB2 +BB1: + br label %BB2 +BB2: + %B = phi int [%A, %BB0], [%A, %BB1] ; Combine away PHI nodes with same values + ret int %B +} + +int %test3(int %A, bool %b) { +BB0: br label %Loop + +Loop: + %B = phi int [%A, %BB0], [%B, %Loop] ; PHI has same value always. + br bool %b, label %Loop, label %Exit +Exit: + ret int %B +} + +int %test4(bool %b) { +BB0: ret int 7 ; Loop is unreachable + +Loop: + %B = phi int [%B, %L2], [%B, %Loop] ; PHI has same value always. + br bool %b, label %L2, label %Loop +L2: + br label %Loop +} + +int %test5(int %A, bool %b) { +BB0: br label %Loop + +Loop: + %B = phi int [%A, %BB0], [undef, %Loop] ; PHI has same value always. + br bool %b, label %Loop, label %Exit +Exit: + ret int %B +} + +uint %test6(int %A, bool %b) { +BB0: + %X = cast int %A to uint + br bool %b, label %BB1, label %BB2 +BB1: + %Y = cast int %A to uint + br label %BB2 +BB2: + %B = phi uint [%X, %BB0], [%Y, %BB1] ;; Suck casts into phi + ret uint %B +} + +int %test7(int %A, bool %b) { +BB0: br label %Loop + +Loop: + %B = phi int [%A, %BB0], [%C, %Loop] ; PHI is dead. + %C = add int %B, 123 + br bool %b, label %Loop, label %Exit +Exit: + ret int 0 +} + diff --git a/test/Transforms/InstCombine/rem.ll b/test/Transforms/InstCombine/rem.ll new file mode 100644 index 0000000..987d3c3 --- /dev/null +++ b/test/Transforms/InstCombine/rem.ll @@ -0,0 +1,79 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep rem +; END. + +implementation + +int %test1(int %A) { + %B = rem int %A, 1 ; ISA constant 0 + ret int %B +} + +int %test2(int %A) { ; 0 % X = 0, we don't need to preserve traps + %B = rem int 0, %A + ret int %B +} + +uint %test3(uint %A) { + %B = rem uint %A, 8 ; & 7 + ret uint %B +} + +bool %test3a(int %A) { + %B = rem int %A, -8 ; & 7 + %C = setne int %B, 0 + ret bool %C +} + +uint %test4(uint %X, bool %C) { + %V = select bool %C, uint 1, uint 8 + %R = rem uint %X, %V + ret uint %R +} + +uint %test5(uint %X, ubyte %B) { + %Amt = shl uint 32, ubyte %B + %V = rem uint %X, %Amt + ret uint %V +} + +int %test6(int %A) { + %B = rem int %A, 0 ;; undef + ret int %B +} + +int %test7(int %A) { + %B = mul int %A, 26 + %C = rem int %B, 13 + ret int %C +} + +int %test8(int %A) { + %B = shl int %A, ubyte 4 + %C = rem int %B, 8 + ret int %C +} + +uint %test9(uint %A) { + %B = mul uint %A, 124 + %C = rem uint %B, 62 + ret uint %C +} + +int %test10(ubyte %c) { + %tmp.1 = cast ubyte %c to int + %tmp.2 = mul int %tmp.1, 3 + %tmp.3 = cast int %tmp.2 to ulong + %tmp.5 = rem ulong %tmp.3, 3 + %tmp.6 = cast ulong %tmp.5 to int + ret int %tmp.6 +} + +int %test11(int %i) { + %tmp.1 = and int %i, -2 + %tmp.3 = mul int %tmp.1, 3 + %tmp.5 = rem int %tmp.3, 6 + ret int %tmp.5 +} + diff --git a/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine/select.ll new file mode 100644 index 0000000..ccc63c2 --- /dev/null +++ b/test/Transforms/InstCombine/select.ll @@ -0,0 +1,182 @@ +; This test makes sure that these instructions are properly eliminated. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep select +; END. + +implementation + +int %test1(int %A, int %B) { + %C = select bool false, int %A, int %B + ret int %C +} + +int %test2(int %A, int %B) { + %C = select bool true, int %A, int %B + ret int %C +} + +int %test3(bool %C, int %I) { + %V = select bool %C, int %I, int %I ; V = I + ret int %V +} + +bool %test4(bool %C) { + %V = select bool %C, bool true, bool false ; V = C + ret bool %V +} + +bool %test5(bool %C) { + %V = select bool %C, bool false, bool true ; V = !C + ret bool %V +} + +int %test6(bool %C) { + %V = select bool %C, int 1, int 0 ; V = cast C to int + ret int %V +} + +bool %test7(bool %C, bool %X) { + %R = select bool %C, bool true, bool %X ; R = or C, X + ret bool %R +} + +bool %test8(bool %C, bool %X) { + %R = select bool %C, bool %X, bool false ; R = and C, X + ret bool %R +} + +bool %test9(bool %C, bool %X) { + %R = select bool %C, bool false, bool %X ; R = and !C, X + ret bool %R +} + +bool %test10(bool %C, bool %X) { + %R = select bool %C, bool %X, bool true ; R = or !C, X + ret bool %R +} + +int %test11(int %a) { + %C = seteq int %a, 0 + %R = select bool %C, int 0, int 1 + ret int %R +} + +int %test12(bool %cond, int %a) { + %b = or int %a, 1 + %c = select bool %cond, int %b, int %a + ret int %c +} + +int %test12a(bool %cond, int %a) { + %b = shr int %a, ubyte 1 + %c = select bool %cond, int %b, int %a + ret int %c +} + +int %test12b(bool %cond, int %a) { + %b = shr int %a, ubyte 1 + %c = select bool %cond, int %a, int %b + ret int %c +} + +int %test13(int %a, int %b) { + %C = seteq int %a, %b + %V = select bool %C, int %a, int %b + ret int %V +} + +int %test13a(int %a, int %b) { + %C = setne int %a, %b + %V = select bool %C, int %a, int %b + ret int %V +} + +int %test13b(int %a, int %b) { + %C = seteq int %a, %b + %V = select bool %C, int %b, int %a + ret int %V +} + +bool %test14a(bool %C, int %X) { + %V = select bool %C, int %X, int 0 + %R = setlt int %V, 1 ; (X < 1) | !C + ret bool %R +} + +bool %test14b(bool %C, int %X) { + %V = select bool %C, int 0, int %X + %R = setlt int %V, 1 ; (X < 1) | C + ret bool %R +} + +int %test15a(int %X) { ;; Code sequence for (X & 16) ? 16 : 0 + %t1 = and int %X, 16 + %t2 = seteq int %t1, 0 + %t3 = select bool %t2, int 0, int 16 ;; X & 16 + ret int %t3 +} + +int %test15b(int %X) { ;; Code sequence for (X & 32) ? 0 : 24 + %t1 = and int %X, 32 + %t2 = seteq int %t1, 0 + %t3 = select bool %t2, int 32, int 0 ;; ~X & 32 + ret int %t3 +} + +int %test15c(int %X) { ;; Alternate code sequence for (X & 16) ? 16 : 0 + %t1 = and int %X, 16 + %t2 = seteq int %t1, 16 + %t3 = select bool %t2, int 16, int 0 ;; X & 16 + ret int %t3 +} + +int %test15d(int %X) { ;; Alternate code sequence for (X & 16) ? 16 : 0 + %t1 = and int %X, 16 + %t2 = setne int %t1, 0 + %t3 = select bool %t2, int 16, int 0 ;; X & 16 + ret int %t3 +} + +int %test16(bool %C, int* %P) { + %P2 = select bool %C, int* %P, int* null + %V = load int* %P2 + ret int %V +} + +bool %test17(int* %X, bool %C) { + %R = select bool %C, int* %X, int* null + %RV = seteq int* %R, null + ret bool %RV +} + +int %test18(int %X, int %Y, bool %C) { + %R = select bool %C, int %X, int 0 + %V = div int %Y, %R ; div Y,X + ret int %V +} + +int %test19(uint %x) { + %tmp = setgt uint %x, 2147483647 + %retval = select bool %tmp, int -1, int 0 + ret int %retval +} + +int %test20(int %x) { + %tmp = setlt int %x, 0 + %retval = select bool %tmp, int -1, int 0 + ret int %retval +} + +long %test21(int %x) { + %tmp = setlt int %x, 0 + %retval = select bool %tmp, long -1, long 0 + ret long %retval +} + +short %test22(int %x) { + %tmp = setlt int %x, 0 + %retval = select bool %tmp, short -1, short 0 + ret short %retval +} + diff --git a/test/Transforms/InstCombine/set.ll b/test/Transforms/InstCombine/set.ll new file mode 100644 index 0000000..51cffbe --- /dev/null +++ b/test/Transforms/InstCombine/set.ll @@ -0,0 +1,152 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep icmp +; END. + +%X = uninitialized global int + +bool %test1(int %A) { + %B = seteq int %A, %A + %C = seteq int* %X, null ; Never true + %D = and bool %B, %C + ret bool %D +} + +bool %test2(int %A) { + %B = setne int %A, %A + %C = setne int* %X, null ; Never false + %D = or bool %B, %C + ret bool %D +} + +bool %test3(int %A) { + %B = setlt int %A, %A + ret bool %B +} + +bool %test4(int %A) { + %B = setgt int %A, %A + ret bool %B +} + +bool %test5(int %A) { + %B = setle int %A, %A + ret bool %B +} + +bool %test6(int %A) { + %B = setge int %A, %A + ret bool %B +} + +bool %test7(uint %A) { + %B = setge uint %A, 0 ; true + ret bool %B +} + +bool %test8(uint %A) { + %B = setlt uint %A, 0 ; false + ret bool %B +} + +;; test operations on boolean values these should all be eliminated$a +bool %test9(bool %A) { + %B = setlt bool %A, false ; false + ret bool %B +} +bool %test10(bool %A) { + %B = setgt bool %A, true ; false + ret bool %B +} +bool %test11(bool %A) { + %B = setle bool %A, true ; true + ret bool %B +} +bool %test12(bool %A) { + %B = setge bool %A, false ; true + ret bool %B +} +bool %test13(bool %A, bool %B) { + %C = setge bool %A, %B ; A | ~B + ret bool %C +} +bool %test14(bool %A, bool %B) { + %C = seteq bool %A, %B ; ~(A ^ B) + ret bool %C +} + +bool %test16(uint %A) { + %B = and uint %A, 5 + %C = seteq uint %B, 8 ; Is never true + ret bool %C +} + +bool %test17(ubyte %A) { + %B = or ubyte %A, 1 + %C = seteq ubyte %B, 2 ; Always false + ret bool %C +} + +bool %test18(bool %C, int %a) { +entry: + br bool %C, label %endif, label %else + +else: + br label %endif + +endif: + %b.0 = phi int [ 0, %entry ], [ 1, %else ] + %tmp.4 = setlt int %b.0, 123 + ret bool %tmp.4 +} + +bool %test19(bool %A, bool %B) { + %a = cast bool %A to int + %b = cast bool %B to int + %C = seteq int %a, %b + ret bool %C +} + +uint %test20(uint %A) { + %B = and uint %A, 1 + %C = setne uint %B, 0 + %D = cast bool %C to uint + ret uint %D +} + +int %test21(int %a) { + %tmp.6 = and int %a, 4 + %not.tmp.7 = setne int %tmp.6, 0 + %retval = cast bool %not.tmp.7 to int + ret int %retval +} + +bool %test22(uint %A, int %X) { + %B = and uint %A, 100663295 + %C = setlt uint %B, 268435456 + %Y = and int %X, 7 + %Z = setgt int %Y, -1 + %R = or bool %C, %Z + ret bool %R +} + +int %test23(int %a) { + %tmp.1 = and int %a, 1 + %tmp.2 = seteq int %tmp.1, 0 + %tmp.3 = cast bool %tmp.2 to int ;; xor tmp1, 1 + ret int %tmp.3 +} + +int %test24(uint %a) { + %tmp1 = and uint %a, 4 + %tmp.1 = shr uint %tmp1, ubyte 2 + %tmp.2 = seteq uint %tmp.1, 0 + %tmp.3 = cast bool %tmp.2 to int ;; xor tmp1, 1 + ret int %tmp.3 +} + +bool %test25(uint %A) { + %B = and uint %A, 2 + %C = setgt uint %B, 2 + ret bool %C +} diff --git a/test/Transforms/InstCombine/setcc-cast-cast.ll b/test/Transforms/InstCombine/setcc-cast-cast.ll new file mode 100644 index 0000000..903f0b4 --- /dev/null +++ b/test/Transforms/InstCombine/setcc-cast-cast.ll @@ -0,0 +1,45 @@ +; This test case was reduced from MultiSource/Applications/hbd. It makes sure +; that folding doesn't happen in case a zext is applied where a sext should have +; been when a setcc is used with two casts. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {br bool false} +; END. + +int %bug(ubyte %inbuff) { +entry: + %tmp = bitcast ubyte %inbuff to sbyte ; <sbyte> [#uses=1] + %tmp = sext sbyte %tmp to int ; <int> [#uses=3] + %tmp = seteq int %tmp, 1 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_next + +cond_true: ; preds = %entry + br label %bb + +cond_next: ; preds = %entry + %tmp3 = seteq int %tmp, -1 ; <bool> [#uses=1] + br bool %tmp3, label %cond_true4, label %cond_next5 + +cond_true4: ; preds = %cond_next + br label %bb + +cond_next5: ; preds = %cond_next + %tmp7 = setgt int %tmp, 1 ; <bool> [#uses=1] + br bool %tmp7, label %cond_true8, label %cond_false + +cond_true8: ; preds = %cond_next5 + br label %cond_next9 + +cond_false: ; preds = %cond_next5 + br label %cond_next9 + +cond_next9: ; preds = %cond_false, %cond_true8 + %iftmp.1.0 = phi int [ 42, %cond_true8 ], [ 23, %cond_false ] ; <int> [#uses=1] + br label %return + +bb: ; preds = %cond_true4, %cond_true + br label %return + +return: ; preds = %bb, %cond_next9 + %retval.0 = phi int [ 17, %bb ], [ %iftmp.1.0, %cond_next9 ] ; <int> [#uses=1] + ret int %retval.0 +} diff --git a/test/Transforms/InstCombine/setcc-strength-reduce.ll b/test/Transforms/InstCombine/setcc-strength-reduce.ll new file mode 100644 index 0000000..b5ea837 --- /dev/null +++ b/test/Transforms/InstCombine/setcc-strength-reduce.ll @@ -0,0 +1,32 @@ +; This test ensures that "strength reduction" of conditional expressions are +; working. Basically this boils down to converting setlt,gt,le,ge instructions +; into equivalent setne,eq instructions. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v {icmp eq} | grep -v {icmp ne} | not grep icmp +; END. + +bool %test1(uint %A) { + %B = setge uint %A, 1 ; setne %A, 0 + ret bool %B +} + +bool %test2(uint %A) { + %B = setgt uint %A, 0 ; setne %A, 0 + ret bool %B +} + +bool %test3(sbyte %A) { + %B = setge sbyte %A, -127 ; setne %A, -128 + ret bool %B +} + +bool %test4(sbyte %A) { + %B = setle sbyte %A, 126 ; setne %A, 127 + ret bool %B +} + +bool %test5(sbyte %A) { + %B = setlt sbyte %A, 127 ; setne %A, 127 + ret bool %B +} diff --git a/test/Transforms/InstCombine/shift-simplify.ll b/test/Transforms/InstCombine/shift-simplify.ll new file mode 100644 index 0000000..e028385 --- /dev/null +++ b/test/Transforms/InstCombine/shift-simplify.ll @@ -0,0 +1,42 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: egrep {shl|lshr|ashr} | wc -l | grep 3 + +define i32 @test0(i32 %A, i32 %B, i32 %C) { + %X = shl i32 %A, %C + %Y = shl i32 %B, %C + %Z = and i32 %X, %Y + ret i32 %Z +} + +define i32 @test1(i32 %A, i32 %B, i32 %C) { + %X = lshr i32 %A, %C + %Y = lshr i32 %B, %C + %Z = or i32 %X, %Y + ret i32 %Z +} + +define i32 @test2(i32 %A, i32 %B, i32 %C) { + %X = ashr i32 %A, %C + %Y = ashr i32 %B, %C + %Z = xor i32 %X, %Y + ret i32 %Z +} + +define i1 @test3(i32 %X) { + %tmp1 = shl i32 %X, 7 + %tmp2 = icmp slt i32 %tmp1, 0 + ret i1 %tmp2 +} + +define i1 @test4(i32 %X) { + %tmp1 = lshr i32 %X, 7 + %tmp2 = icmp slt i32 %tmp1, 0 + ret i1 %tmp2 +} + +define i1 @test5(i32 %X) { + %tmp1 = ashr i32 %X, 7 + %tmp2 = icmp slt i32 %tmp1, 0 + ret i1 %tmp2 +} + diff --git a/test/Transforms/InstCombine/shift-sra.ll b/test/Transforms/InstCombine/shift-sra.ll new file mode 100644 index 0000000..f390772 --- /dev/null +++ b/test/Transforms/InstCombine/shift-sra.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {lshr i32} | wc -l | grep 2 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep ashr + +int %test1(int %X, ubyte %A) { + %Y = shr int %X, ubyte %A ; can be logical shift. + %Z = and int %Y, 1 + ret int %Z +} + +int %test2(ubyte %tmp) { + %tmp3 = cast ubyte %tmp to int + %tmp4 = add int %tmp3, 7 + %tmp5 = ashr int %tmp4, ubyte 3 ; lshr + ret int %tmp5 +} + diff --git a/test/Transforms/InstCombine/shift.ll b/test/Transforms/InstCombine/shift.ll new file mode 100644 index 0000000..5ce8070 --- /dev/null +++ b/test/Transforms/InstCombine/shift.ll @@ -0,0 +1,189 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep sh +; END. + +implementation + +int %test1(int %A) { + %B = shl int %A, ubyte 0 + ret int %B +} + +int %test2(ubyte %A) { + %B = shl int 0, ubyte %A + ret int %B +} + +int %test3(int %A) { + %B = shr int %A, ubyte 0 + ret int %B +} + +int %test4(ubyte %A) { + %B = shr int 0, ubyte %A + ret int %B +} + +uint %test5(uint %A) { + %B = shr uint %A, ubyte 32 ;; shift all bits out + ret uint %B +} + +uint %test5a(uint %A) { + %B = shl uint %A, ubyte 32 ;; shift all bits out + ret uint %B +} + +uint %test6(uint %A) { + %B = shl uint %A, ubyte 1 ;; convert to an mul instruction + %C = mul uint %B, 3 + ret uint %C +} + +int %test7(ubyte %A) { + %B = shr int -1, ubyte %A ;; Always equal to -1 + ret int %B +} + +ubyte %test8(ubyte %A) { ;; (A << 5) << 3 === A << 8 == 0 + %B = shl ubyte %A, ubyte 5 + %C = shl ubyte %B, ubyte 3 + ret ubyte %C +} + +ubyte %test9(ubyte %A) { ;; (A << 7) >> 7 === A & 1 + %B = shl ubyte %A, ubyte 7 + %C = shr ubyte %B, ubyte 7 + ret ubyte %C +} + +ubyte %test10(ubyte %A) { ;; (A >> 7) << 7 === A & 128 + %B = shr ubyte %A, ubyte 7 + %C = shl ubyte %B, ubyte 7 + ret ubyte %C +} + +ubyte %test11(ubyte %A) { ;; (A >> 3) << 4 === (A & 0x1F) << 1 + %a = mul ubyte %A, 3 + %B = shr ubyte %a, ubyte 3 + %C = shl ubyte %B, ubyte 4 + ret ubyte %C +} + +int %test12(int %A) { + %B = shr int %A, ubyte 8 ;; (A >> 8) << 8 === A & -256 + %C = shl int %B, ubyte 8 + ret int %C +} + +sbyte %test13(sbyte %A) { ;; (A >> 3) << 4 === (A & -8) * 2 + %a = mul sbyte %A, 3 + %B = shr sbyte %a, ubyte 3 + %C = shl sbyte %B, ubyte 4 + ret sbyte %C +} + +uint %test14(uint %A) { + %B = shr uint %A, ubyte 4 + %C = or uint %B, 1234 + %D = shl uint %C, ubyte 4 ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) + ret uint %D +} +uint %test14a(uint %A) { + %B = shl uint %A, ubyte 4 + %C = and uint %B, 1234 + %D = shr uint %C, ubyte 4 ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) + ret uint %D +} + +int %test15(bool %C) { + %A = select bool %C, int 3, int 1 + %V = shl int %A, ubyte 2 + ret int %V +} + +int %test15a(bool %C) { + %A = select bool %C, ubyte 3, ubyte 1 + %V = shl int 64, ubyte %A + ret int %V +} + +bool %test16(int %X) { + %tmp.3 = shr int %X, ubyte 4 + %tmp.6 = and int %tmp.3, 1 + %tmp.7 = setne int %tmp.6, 0 ;; X & 16 != 0 + ret bool %tmp.7 +} + +bool %test17(uint %A) { + %B = shr uint %A, ubyte 3 + %C = seteq uint %B, 1234 + ret bool %C +} + +bool %test18(ubyte %A) { + %B = shr ubyte %A, ubyte 7 + %C = seteq ubyte %B, 123 ;; false + ret bool %C +} + +bool %test19(int %A) { + %B = shr int %A, ubyte 2 + %C = seteq int %B, 0 ;; (X & -4) == 0 + ret bool %C +} + +bool %test19a(int %A) { + %B = shr int %A, ubyte 2 + %C = seteq int %B, -1 ;; (X & -4) == -4 + ret bool %C +} + +bool %test20(sbyte %A) { + %B = shr sbyte %A, ubyte 7 + %C = seteq sbyte %B, 123 ;; false + ret bool %C +} + +bool %test21(ubyte %A) { + %B = shl ubyte %A, ubyte 4 + %C = seteq ubyte %B, 128 + ret bool %C +} + +bool %test22(ubyte %A) { + %B = shl ubyte %A, ubyte 4 + %C = seteq ubyte %B, 0 + ret bool %C +} + +sbyte %test23(int %A) { + %B = shl int %A, ubyte 24 ;; casts not needed + %C = shr int %B, ubyte 24 + %D = cast int %C to sbyte + ret sbyte %D +} + +sbyte %test24(sbyte %X) { + %Y = and sbyte %X, -5 ; ~4 + %Z = shl sbyte %Y, ubyte 5 + %Q = shr sbyte %Z, ubyte 5 + ret sbyte %Q +} + +uint %test25(uint %tmp.2, uint %AA) { + %x = shr uint %AA, ubyte 17 + %tmp.3 = shr uint %tmp.2, ubyte 17 ; <uint> [#uses=1] + %tmp.5 = add uint %tmp.3, %x ; <uint> [#uses=1] + %tmp.6 = shl uint %tmp.5, ubyte 17 ; <uint> [#uses=1] + ret uint %tmp.6 +} + +int %test26(uint %A) { ;; handle casts between shifts. + %B = shr uint %A, ubyte 1 + %C = cast uint %B to int + %D = shl int %C, ubyte 1 + ret int %D +} + diff --git a/test/Transforms/InstCombine/shl-trunc.ll b/test/Transforms/InstCombine/shl-trunc.ll new file mode 100644 index 0000000..bfd41a8 --- /dev/null +++ b/test/Transforms/InstCombine/shl-trunc.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep shl + +bool %test(int %X, ubyte %A) { + %B = lshr int %X, ubyte %A + %D = trunc int %B to bool + ret bool %D +} diff --git a/test/Transforms/InstCombine/signext.ll b/test/Transforms/InstCombine/signext.ll new file mode 100644 index 0000000..f69cbc0 --- /dev/null +++ b/test/Transforms/InstCombine/signext.ll @@ -0,0 +1,44 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {(and\|xor\|add\|shl\|shr)} +; END. + +int %test1(int %x) { + %tmp.1 = and int %x, 65535 ; <int> [#uses=1] + %tmp.2 = xor int %tmp.1, -32768 ; <int> [#uses=1] + %tmp.3 = add int %tmp.2, 32768 ; <int> [#uses=1] + ret int %tmp.3 +} + +int %test2(int %x) { + %tmp.1 = and int %x, 65535 ; <int> [#uses=1] + %tmp.2 = xor int %tmp.1, 32768 ; <int> [#uses=1] + %tmp.3 = add int %tmp.2, -32768 ; <int> [#uses=1] + ret int %tmp.3 +} + +int %test3(ushort %P) { + %tmp.1 = cast ushort %P to int ; <int> [#uses=1] + %tmp.4 = xor int %tmp.1, 32768 ; <int> [#uses=1] + %tmp.5 = add int %tmp.4, -32768 ; <int> [#uses=1] + ret int %tmp.5 +} + +uint %test4(ushort %P) { + %tmp.1 = cast ushort %P to uint ; <uint> [#uses=1] + %tmp.4 = xor uint %tmp.1, 32768 ; <uint> [#uses=1] + %tmp.5 = add uint %tmp.4, 4294934528 ; <uint> [#uses=1] + ret uint %tmp.5 +} + +int %test5(int %x) { + %tmp.1 = and int %x, 254 + %tmp.2 = xor int %tmp.1, 128 + %tmp.3 = add int %tmp.2, -128 + ret int %tmp.3 +} + +int %test6(int %x) { + %tmp.2 = shl int %x, ubyte 16 ; <int> [#uses=1] + %tmp.4 = shr int %tmp.2, ubyte 16 ; <int> [#uses=1] + ret int %tmp.4 +} diff --git a/test/Transforms/InstCombine/sink_instruction.ll b/test/Transforms/InstCombine/sink_instruction.ll new file mode 100644 index 0000000..93519ff --- /dev/null +++ b/test/Transforms/InstCombine/sink_instruction.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: %prcontext div 1 | grep ret + +;; This tests that the instructions in the entry blocks are sunk into each +;; arm of the 'if'. + +int %foo(bool %C, int %A, int %B) { +entry: + %tmp.2 = div int %A, %B + %tmp.9 = add int %B, %A + br bool %C, label %then, label %endif + +then: + ret int %tmp.9 + +endif: + ret int %tmp.2 +} diff --git a/test/Transforms/InstCombine/stacksaverestore.ll b/test/Transforms/InstCombine/stacksaverestore.ll new file mode 100644 index 0000000..f9cc9c2 --- /dev/null +++ b/test/Transforms/InstCombine/stacksaverestore.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep call + +;; Test that llvm.stackrestore is removed when possible. + +int* %test1(uint %P) { + %tmp = call sbyte* %llvm.stacksave() + call void %llvm.stackrestore(sbyte* %tmp) ;; not restoring anything + %A = alloca int, uint %P + ret int* %A +} + +void %test2(sbyte* %X) { + call void %llvm.stackrestore(sbyte* %X) ;; no allocas before return. + ret void +} + +declare sbyte* %llvm.stacksave() + +declare void %llvm.stackrestore(sbyte*) diff --git a/test/Transforms/InstCombine/store-merge.ll b/test/Transforms/InstCombine/store-merge.ll new file mode 100644 index 0000000..4df30e4 --- /dev/null +++ b/test/Transforms/InstCombine/store-merge.ll @@ -0,0 +1,37 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep {ret i32 %.toremerge} | wc -l | grep 2 +;; Simple sinking tests + +; "if then else" +define i32 @test1(i1 %C) { + %A = alloca i32 + br i1 %C, label %Cond, label %Cond2 + +Cond: + store i32 -987654321, i32* %A + br label %Cont + +Cond2: + store i32 47, i32* %A + br label %Cont + +Cont: + %V = load i32* %A + ret i32 %V +} + +; "if then" +define i32 @test2(i1 %C) { + %A = alloca i32 + store i32 47, i32* %A + br i1 %C, label %Cond, label %Cont + +Cond: + store i32 -987654321, i32* %A + br label %Cont + +Cont: + %V = load i32* %A + ret i32 %V +} + diff --git a/test/Transforms/InstCombine/store.ll b/test/Transforms/InstCombine/store.ll new file mode 100644 index 0000000..0b7d12f --- /dev/null +++ b/test/Transforms/InstCombine/store.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v {store.*,.*null} | not grep store + +void %test1(int* %P) { + store int undef, int* %P + store int 123, int* undef + store int 124, int* null + ret void +} + +void %test2(int* %P) { + %X = load int* %P + %Y = add int %X, 0 + store int %Y, int* %P + ret void +} diff --git a/test/Transforms/InstCombine/sub.ll b/test/Transforms/InstCombine/sub.ll new file mode 100644 index 0000000..dfee312 --- /dev/null +++ b/test/Transforms/InstCombine/sub.ll @@ -0,0 +1,139 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v {sub i32 %Cok, %Bok} | not grep sub + +implementation + +int %test1(int %A) { + %B = sub int %A, %A ; ISA constant 0 + ret int %B +} + +int %test2(int %A) { + %B = sub int %A, 0 + ret int %B +} + +int %test3(int %A) { + %B = sub int 0, %A ; B = -A + %C = sub int 0, %B ; C = -B = A + ret int %C +} + +int %test4(int %A, int %x) { + %B = sub int 0, %A + %C = sub int %x, %B + ret int %C +} + +int %test5(int %A, int %Bok, int %Cok) { + %D = sub int %Bok, %Cok + %E = sub int %A, %D + ret int %E +} + +int %test6(int %A, int %B) { + %C = and int %A, %B ; A - (A & B) => A & ~B + %D = sub int %A, %C + ret int %D +} + +int %test7(int %A) { + %B = sub int -1, %A ; B = ~A + ret int %B +} + +int %test8(int %A) { + %B = mul int 9, %A + %C = sub int %B, %A ; C = 9*A-A == A*8 == A << 3 + ret int %C +} + +int %test9(int %A) { + %B = mul int 3, %A + %C = sub int %A, %B ; C = A-3*A == A*-2 + ret int %C +} + +int %test10(int %A, int %B) { ; -A*-B == A*B + %C = sub int 0, %A + %D = sub int 0, %B + %E = mul int %C, %D + ret int %E +} + +int %test10(int %A) { ; -A *c1 == A * -c1 + %C = sub int 0, %A + %E = mul int %C, 7 + ret int %E +} + +bool %test11(ubyte %A, ubyte %B) { + %C = sub ubyte %A, %B + %cD = setne ubyte %C, 0 ; == setne A, B + ret bool %cD +} + +int %test12(int %A) { + %B = shr int %A, ubyte 31 + %C = sub int 0, %B ; == ushr A, 31 + ret int %C +} + +uint %test13(uint %A) { + %B = shr uint %A, ubyte 31 + %C = sub uint 0, %B ; == sar A, 31 + ret uint %C +} + +int %test14(uint %A) { + %B = shr uint %A, ubyte 31 + %C = cast uint %B to int + %D = sub int 0, %C + ret int %D +} + +int %test15(int %A, int %B) { + %C = sub int 0, %A + %D = rem int %B, %C ;; X % -Y === X % Y + ret int %D +} + +int %test16(int %A) { + %X = div int %A, 1123 + %Y = sub int 0, %X + ret int %Y +} + +int %test17(int %A) { + %B = sub int 0, %A + %C = div int %B, 1234 + ret int %C +} + +long %test18(long %Y) { + %tmp.4 = shl long %Y, ubyte 2 + %tmp.12 = shl long %Y, ubyte 2 + %tmp.8 = sub long %tmp.4, %tmp.12 ;; 0 + ret long %tmp.8 +} + +int %test19(int %X, int %Y) { + %Z = sub int %X, %Y + %Q = add int %Z, %Y + ret int %Q +} + +bool %test20(int %g, int %h) { + %tmp.2 = sub int %g, %h + %tmp.4 = setne int %tmp.2, %g + ret bool %tmp.4 +} + +bool %test21(int %g, int %h) { + %tmp.2 = sub int %g, %h + %tmp.4 = setne int %tmp.2, %g + ret bool %tmp.4 +} + diff --git a/test/Transforms/InstCombine/udiv_select_to_select_shift.ll b/test/Transforms/InstCombine/udiv_select_to_select_shift.ll new file mode 100644 index 0000000..fe05741 --- /dev/null +++ b/test/Transforms/InstCombine/udiv_select_to_select_shift.ll @@ -0,0 +1,17 @@ +; Test that this transform works: +; udiv X, (Select Cond, C1, C2) --> Select Cond, (shr X, C1), (shr X, C2) +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis -f -o %t +; RUN: grep select %t | wc -l | grep 1 +; RUN: grep lshr %t | wc -l | grep 2 +; RUN: ignore grep udiv %t | wc -l | grep 0 + +define i64 @test(i64 %X, i1 %Cond ) { +entry: + %divisor1 = select i1 %Cond, i64 8, i64 16 + %quotient1 = udiv i64 %X, %divisor1 + %divisor2 = select i1 %Cond, i64 8, i64 0 + %quotient2 = udiv i64 %X, %divisor2 + %sum = add i64 %quotient1, %quotient2 + ret i64 %sum +} diff --git a/test/Transforms/InstCombine/vec_demanded_elts.ll b/test/Transforms/InstCombine/vec_demanded_elts.ll new file mode 100644 index 0000000..03e070f --- /dev/null +++ b/test/Transforms/InstCombine/vec_demanded_elts.ll @@ -0,0 +1,47 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep {sub float} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: grep {mul float} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: not grep {insertelement.*0.00} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: not grep {call.*llvm.x86.sse.mul} +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: not grep {call.*llvm.x86.sse.sub} +; END. + +define i16 @test1(float %f) { +entry: + %tmp = insertelement <4 x float> undef, float %f, i32 0 ; <<4 x float>> [#uses=1] + %tmp10 = insertelement <4 x float> %tmp, float 0.000000e+00, i32 1 ; <<4 x float>> [#uses=1] + %tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 2 ; <<4 x float>> [#uses=1] + %tmp12 = insertelement <4 x float> %tmp11, float 0.000000e+00, i32 3 ; <<4 x float>> [#uses=1] + %tmp28 = tail call <4 x float> @llvm.x86.sse.sub.ss( <4 x float> %tmp12, <4 x float> < float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00 > ) ; <<4 x float>> [#uses=1] + %tmp37 = tail call <4 x float> @llvm.x86.sse.mul.ss( <4 x float> %tmp28, <4 x float> < float 5.000000e-01, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00 > ) ; <<4 x float>> [#uses=1] + %tmp48 = tail call <4 x float> @llvm.x86.sse.min.ss( <4 x float> %tmp37, <4 x float> < float 6.553500e+04, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00 > ) ; <<4 x float>> [#uses=1] + %tmp59 = tail call <4 x float> @llvm.x86.sse.max.ss( <4 x float> %tmp48, <4 x float> zeroinitializer ) ; <<4 x float>> [#uses=1] + %tmp.upgrd.1 = tail call i32 @llvm.x86.sse.cvttss2si( <4 x float> %tmp59 ) ; <i32> [#uses=1] + %tmp69 = trunc i32 %tmp.upgrd.1 to i16 ; <i16> [#uses=1] + ret i16 %tmp69 +} + +define i32 @test2(float %f) { + %tmp5 = mul float %f, %f + %tmp9 = insertelement <4 x float> undef, float %tmp5, i32 0 + %tmp10 = insertelement <4 x float> %tmp9, float 0.000000e+00, i32 1 + %tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 2 + %tmp12 = insertelement <4 x float> %tmp11, float 0.000000e+00, i32 3 + %tmp19 = bitcast <4 x float> %tmp12 to <4 x i32> + %tmp21 = extractelement <4 x i32> %tmp19, i32 0 + ret i32 %tmp21 +} + +declare <4 x float> @llvm.x86.sse.sub.ss(<4 x float>, <4 x float>) + +declare <4 x float> @llvm.x86.sse.mul.ss(<4 x float>, <4 x float>) + +declare <4 x float> @llvm.x86.sse.min.ss(<4 x float>, <4 x float>) + +declare <4 x float> @llvm.x86.sse.max.ss(<4 x float>, <4 x float>) + +declare i32 @llvm.x86.sse.cvttss2si(<4 x float>) diff --git a/test/Transforms/InstCombine/vec_extract_elt.ll b/test/Transforms/InstCombine/vec_extract_elt.ll new file mode 100644 index 0000000..30b2f1d --- /dev/null +++ b/test/Transforms/InstCombine/vec_extract_elt.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep extractelement + +define i32 @test(float %f) { + %tmp7 = insertelement <4 x float> undef, float %f, i32 0 ; <<4 x float>> [#uses=1] + %tmp17 = bitcast <4 x float> %tmp7 to <4 x i32> ; <<4 x i32>> [#uses=1] + %tmp19 = extractelement <4 x i32> %tmp17, i32 0 ; <i32> [#uses=1] + ret i32 %tmp19 +} + diff --git a/test/Transforms/InstCombine/vec_insert_to_shuffle.ll b/test/Transforms/InstCombine/vec_insert_to_shuffle.ll new file mode 100644 index 0000000..54ac882 --- /dev/null +++ b/test/Transforms/InstCombine/vec_insert_to_shuffle.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep shufflevec | wc -l | grep 1 +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep insertelement +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep extractelement +; END. + +<4 x float> %test(<4 x float> %tmp, <4 x float> %tmp1) { + %tmp4 = extractelement <4 x float> %tmp, uint 1 ; <float> [#uses=1] + %tmp2 = extractelement <4 x float> %tmp, uint 3 ; <float> [#uses=1] + %tmp1 = extractelement <4 x float> %tmp1, uint 0 ; <float> [#uses=1] + %tmp128 = insertelement <4 x float> undef, float %tmp4, uint 0 ; <<4 x float>> [#uses=1] + %tmp130 = insertelement <4 x float> %tmp128, float undef, uint 1 ; <<4 x float>> [#uses=1] + %tmp132 = insertelement <4 x float> %tmp130, float %tmp2, uint 2 ; <<4 x float>> [#uses=1] + %tmp134 = insertelement <4 x float> %tmp132, float %tmp1, uint 3 ; <<4 x float>> [#uses=1] + ret <4 x float> %tmp134 +} diff --git a/test/Transforms/InstCombine/vec_insertelt.ll b/test/Transforms/InstCombine/vec_insertelt.ll new file mode 100644 index 0000000..9be154b --- /dev/null +++ b/test/Transforms/InstCombine/vec_insertelt.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret <4 x i32> %A} + +; PR1286 +define <4 x i32> @test1(<4 x i32> %A) { + %B = insertelement <4 x i32> %A, i32 undef, i32 1 + ret <4 x i32> %B +} diff --git a/test/Transforms/InstCombine/vec_narrow.ll b/test/Transforms/InstCombine/vec_narrow.ll new file mode 100644 index 0000000..ca94b08 --- /dev/null +++ b/test/Transforms/InstCombine/vec_narrow.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {add float} + +%V = type <4 x float> + +float %test(%V %A, %V %B, float %f) { + %C = insertelement %V %A, float %f, uint 0 + %D = add %V %C, %B + %E = extractelement %V %D, uint 0 + ret float %E +} + diff --git a/test/Transforms/InstCombine/vec_shuffle.ll b/test/Transforms/InstCombine/vec_shuffle.ll new file mode 100644 index 0000000..aaaee3f --- /dev/null +++ b/test/Transforms/InstCombine/vec_shuffle.ll @@ -0,0 +1,47 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep vector_shuffle +; END. + +%T = type <4 x float> + + +define %T @test1(%T %v1) { + %v2 = shufflevector %T %v1, %T undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> + ret %T %v2 +} + +define %T @test2(%T %v1) { + %v2 = shufflevector %T %v1, %T %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7> + ret %T %v2 +} + +define float @test3(%T %A, %T %B, float %f) { + %C = insertelement %T %A, float %f, i32 0 + %D = shufflevector %T %C, %T %B, <4 x i32> <i32 5, i32 0, i32 2, i32 7> + %E = extractelement %T %D, i32 1 + ret float %E +} + +define i32 @test4(<4 x i32> %X) { + %tmp152.i53899.i = shufflevector <4 x i32> %X, <4 x i32> undef, <4 x i32> zeroinitializer + %tmp34 = extractelement <4 x i32> %tmp152.i53899.i, i32 0 + ret i32 %tmp34 +} + +define i32 @test5(<4 x i32> %X) { + %tmp152.i53899.i = shufflevector <4 x i32> %X, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 undef, i32 undef> + %tmp34 = extractelement <4 x i32> %tmp152.i53899.i, i32 0 + ret i32 %tmp34 +} + +define float @test6(<4 x float> %X) { + %X1 = bitcast <4 x float> %X to <4 x i32> + %tmp152.i53899.i = shufflevector <4 x i32> %X1, <4 x i32> undef, <4 x i32> zeroinitializer + %tmp152.i53900.i = bitcast <4 x i32> %tmp152.i53899.i to <4 x float> + %tmp34 = extractelement <4 x float> %tmp152.i53900.i, i32 0 + ret float %tmp34 +} + +define <4 x float> @test7(<4 x float> %tmp45.i) { + %tmp1642.i = shufflevector <4 x float> %tmp45.i, <4 x float> undef, <4 x i32> < i32 0, i32 1, i32 6, i32 7 > + ret <4 x float> %tmp1642.i +} diff --git a/test/Transforms/InstCombine/xor.ll b/test/Transforms/InstCombine/xor.ll new file mode 100644 index 0000000..e201149 --- /dev/null +++ b/test/Transforms/InstCombine/xor.ll @@ -0,0 +1,198 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: not grep {xor } +; END. + +%G1 = global uint 0 +%G2 = global uint 0 + +implementation + +bool %test0(bool %A) { + %B = xor bool %A, false + ret bool %B +} + +int %test1(int %A) { + %B = xor int %A, 0 + ret int %B +} + +bool %test2(bool %A) { + %B = xor bool %A, %A + ret bool %B +} + +int %test3(int %A) { + %B = xor int %A, %A + ret int %B +} + +int %test4(int %A) { ; A ^ ~A == -1 + %NotA = xor int -1, %A + %B = xor int %A, %NotA + ret int %B +} + +uint %test5(uint %A) { ; (A|B)^B == A & (~B) + %t1 = or uint %A, 123 + %r = xor uint %t1, 123 + ret uint %r +} + +ubyte %test6(ubyte %A) { + %B = xor ubyte %A, 17 + %C = xor ubyte %B, 17 + ret ubyte %C +} + +; (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0 +int %test7(int %A, int %B) { + + %A1 = and int %A, 7 + %B1 = and int %B, 128 + %C1 = xor int %A1, %B1 + ret int %C1 +} + +ubyte %test8(bool %c) { + %d = xor bool %c, true ; invert the condition + br bool %d, label %True, label %False +True: + ret ubyte 1 +False: + ret ubyte 3 +} + +bool %test9(ubyte %A) { + %B = xor ubyte %A, 123 ; xor can be eliminated + %C = seteq ubyte %B, 34 + ret bool %C +} + +ubyte %test10(ubyte %A) { + %B = and ubyte %A, 3 + %C = xor ubyte %B, 4 ; transform into an OR + ret ubyte %C +} + +ubyte %test11(ubyte %A) { + %B = or ubyte %A, 12 + %C = xor ubyte %B, 4 ; transform into an AND + ret ubyte %C +} + +bool %test12(ubyte %A) { + %B = xor ubyte %A, 4 + %c = setne ubyte %B, 0 + ret bool %c +} + +bool %test13(ubyte %A, ubyte %B) { + %C = setlt ubyte %A, %B + %D = setgt ubyte %A, %B + %E = xor bool %C, %D ; E = setne %A, %B + ret bool %E +} + +bool %test14(ubyte %A, ubyte %B) { + %C = seteq ubyte %A, %B + %D = setne ubyte %B, %A + %E = xor bool %C, %D ; E = true + ret bool %E +} + +uint %test15(uint %A) { ; ~(X-1) == -X + %B = add uint %A, 4294967295 + %C = xor uint %B, 4294967295 + ret uint %C +} + +uint %test16(uint %A) { ; ~(X+c) == (-c-1)-X + %B = add uint %A, 123 ; A generalization of the previous case + %C = xor uint %B, 4294967295 + ret uint %C +} + +uint %test17(uint %A) { ; ~(c-X) == X-(c-1) == X+(-c+1) + %B = sub uint 123, %A + %C = xor uint %B, 4294967295 + ret uint %C +} + +uint %test18(uint %A) { ; C - ~X == X + (1+C) + %B = xor uint %A, 4294967295; -~X == 0 - ~X == X+1 + %C = sub uint 123, %B + ret uint %C +} + +uint %test19(uint %A, uint %B) { + %C = xor uint %A, %B + %D = xor uint %C, %A ; A terms cancel, D = B + ret uint %D +} + +void %test20(uint %A, uint %B) { ; The "swap idiom" + %tmp.2 = xor uint %B, %A + %tmp.5 = xor uint %tmp.2, %B + %tmp.8 = xor uint %tmp.5, %tmp.2 + store uint %tmp.8, uint* %G1 ; tmp.8 = B + store uint %tmp.5, uint* %G2 ; tmp.5 = A + ret void +} + +int %test21(bool %C, int %A, int %B) { + %C2 = xor bool %C, true + %D = select bool %C2, int %A, int %B + ret int %D +} + +int %test22(bool %X) { + %Y = xor bool %X, true + %Z = cast bool %Y to int + %Q = xor int %Z, 1 + ret int %Q +} + +bool %test23(int %a, int %b) { + %tmp.2 = xor int %b, %a + %tmp.4 = seteq int %tmp.2, %a + ret bool %tmp.4 +} + +bool %test24(int %c, int %d) { + %tmp.2 = xor int %d, %c + %tmp.4 = setne int %tmp.2, %c + ret bool %tmp.4 +} + +int %test25(int %g, int %h) { + %h2 = xor int %h, -1 + %tmp2 = and int %h2, %g + %tmp4 = xor int %tmp2, %g ; (h2&g)^g -> ~h2 & g -> h & g + ret int %tmp4 +} + +int %test26(int %a, int %b) { + %b2 = xor int %b, -1 + %tmp2 = xor int %a, %b2 + %tmp4 = and int %tmp2, %a ; (a^b2)&a -> ~b2 & a -> b & a + ret int %tmp4 +} + + +int %test27(int %b, int %c, int %d) { + %tmp2 = xor int %d, %b + %tmp5 = xor int %d, %c + %tmp = icmp eq int %tmp2, %tmp5 + %tmp6 = zext bool %tmp to int + ret int %tmp6 +} + +int %test28(int %indvar) { + %tmp7 = add int %indvar, -2147483647 + %tmp214 = xor int %tmp7, -2147483648 + ret int %tmp214 +} + diff --git a/test/Transforms/InstCombine/xor2.ll b/test/Transforms/InstCombine/xor2.ll new file mode 100644 index 0000000..efb3146 --- /dev/null +++ b/test/Transforms/InstCombine/xor2.ll @@ -0,0 +1,17 @@ +; This test makes sure that these instructions are properly eliminated. +; +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {xor } + +; PR1253 +define i1 @test0(i32 %A) { + %B = xor i32 %A, -2147483648 + %C = icmp sgt i32 %B, -1 + ret i1 %C +} + +define i1 @test1(i32 %A) { + %B = xor i32 %A, 12345 + %C = icmp slt i32 %B, 0 + ret i1 %C +} + diff --git a/test/Transforms/InstCombine/zeroext-and-reduce.ll b/test/Transforms/InstCombine/zeroext-and-reduce.ll new file mode 100644 index 0000000..aac8c3b --- /dev/null +++ b/test/Transforms/InstCombine/zeroext-and-reduce.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep {and i32 %Y, 8} + +int %test1(ubyte %X) { + %Y = cast ubyte %X to int + %Z = and int %Y, 65544 ;; Prune this to and Y, 8 + ret int %Z +} + diff --git a/test/Transforms/InstCombine/zext.ll b/test/Transforms/InstCombine/zext.ll new file mode 100644 index 0000000..cd1f1f8 --- /dev/null +++ b/test/Transforms/InstCombine/zext.ll @@ -0,0 +1,9 @@ +; Tests to make sure elimination of casts is working correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: notcast {} {%c1.*} + +long %test_sext_zext(short %A) { + %c1 = zext short %A to uint + %c2 = sext uint %c1 to long + ret long %c2 +} diff --git a/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll b/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll new file mode 100644 index 0000000..e7cfd76 --- /dev/null +++ b/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: grep {%SJE.0.0.lcssa = phi .struct.SetJmpMapEntry} +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: grep {%SJE.0.0.lcssa1 = phi .struct.SetJmpMapEntry} + +%struct.SetJmpMapEntry = type { sbyte*, uint, %struct.SetJmpMapEntry* } + +implementation ; Functions: + +void %__llvm_sjljeh_try_catching_longjmp_exception() { +entry: + br bool false, label %UnifiedReturnBlock, label %no_exit + +no_exit: ; preds = %endif, %entry + %SJE.0.0 = phi %struct.SetJmpMapEntry* [ %tmp.24, %endif ], [ null, %entry ] ; <%struct.SetJmpMapEntry*> [#uses=1] + br bool false, label %then, label %endif + +then: ; preds = %no_exit + %tmp.20 = getelementptr %struct.SetJmpMapEntry* %SJE.0.0, int 0, uint 1 ; <uint*> [#uses=0] + ret void + +endif: ; preds = %no_exit + %tmp.24 = load %struct.SetJmpMapEntry** null ; <%struct.SetJmpMapEntry*> [#uses=1] + br bool false, label %UnifiedReturnBlock, label %no_exit + +UnifiedReturnBlock: ; preds = %endif, %entry + ret void +} diff --git a/test/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll b/test/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll new file mode 100644 index 0000000..02765dc --- /dev/null +++ b/test/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll @@ -0,0 +1,30 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: grep {%X.1.lcssa} +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: not grep {%X.1.lcssa1} + +declare bool %c1() +declare bool %c2() + +int %foo() { +entry: + br label %loop_begin + +loop_begin: + br bool true, label %loop_body.1, label %loop_exit2 + +loop_body.1: + %X.1 = add int 0, 1 + %rel.1 = call bool %c1() + br bool %rel.1, label %loop_exit, label %loop_body.2 + +loop_body.2: + %rel.2 = call bool %c2() + br bool %rel.2, label %loop_exit, label %loop_begin + +loop_exit: + ret int %X.1 + +loop_exit2: + ret int 1 +} diff --git a/test/Transforms/LCSSA/2006-07-09-NoDominator.ll b/test/Transforms/LCSSA/2006-07-09-NoDominator.ll new file mode 100644 index 0000000..f90f664 --- /dev/null +++ b/test/Transforms/LCSSA/2006-07-09-NoDominator.ll @@ -0,0 +1,31 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa + + %struct.SetJmpMapEntry = type { sbyte*, uint, %struct.SetJmpMapEntry* } + +implementation ; Functions: + +void %__llvm_sjljeh_try_catching_longjmp_exception() { +entry: + br label %loopentry + +loopentry: ; preds = %endif, %entry + %SJE.0 = phi %struct.SetJmpMapEntry* [ null, %entry ], [ %tmp.25, %endif ] ; <%struct.SetJmpMapEntry*> [#uses=1] + br bool false, label %no_exit, label %loopexit + +no_exit: ; preds = %loopentry + br bool false, label %then, label %endif + +then: ; preds = %no_exit + %tmp.21 = getelementptr %struct.SetJmpMapEntry* %SJE.0, int 0, uint 1 ; <uint*> [#uses=0] + br label %return + +endif: ; preds = %after_ret.0, %no_exit + %tmp.25 = load %struct.SetJmpMapEntry** null ; <%struct.SetJmpMapEntry*> [#uses=1] + br label %loopentry + +loopexit: ; preds = %loopentry + br label %return + +return: ; preds = %after_ret.1, %loopexit, %then + ret void +} diff --git a/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll new file mode 100644 index 0000000..ac40ad5 --- /dev/null +++ b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll @@ -0,0 +1,210 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa -disable-output +; PR977 + +declare int %opost_block() + +void %write_chan() { +entry: + br bool false, label %shortcirc_next.0, label %shortcirc_done.0 + +shortcirc_next.0: ; preds = %entry + br label %shortcirc_done.0 + +shortcirc_done.0: ; preds = %shortcirc_next.0, %entry + br bool false, label %shortcirc_next.1, label %shortcirc_done.1 + +shortcirc_next.1: ; preds = %shortcirc_done.0 + br label %shortcirc_done.1 + +shortcirc_done.1: ; preds = %shortcirc_next.1, %shortcirc_done.0 + br bool false, label %then.0, label %endif.0 + +then.0: ; preds = %shortcirc_done.1 + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %then.0 + br label %return + +after_ret.0: ; No predecessors! + br label %endif.1 + +endif.1: ; preds = %after_ret.0, %then.0 + br label %endif.0 + +endif.0: ; preds = %endif.1, %shortcirc_done.1 + br label %loopentry.0 + +loopentry.0: ; preds = %endif.12, %endif.0 + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %loopentry.0 + br label %loopexit.0 + +dead_block_after_break.0: ; No predecessors! + br label %endif.2 + +endif.2: ; preds = %dead_block_after_break.0, %loopentry.0 + br bool false, label %shortcirc_done.2, label %shortcirc_next.2 + +shortcirc_next.2: ; preds = %endif.2 + br bool false, label %shortcirc_next.3, label %shortcirc_done.3 + +shortcirc_next.3: ; preds = %shortcirc_next.2 + br label %shortcirc_done.3 + +shortcirc_done.3: ; preds = %shortcirc_next.3, %shortcirc_next.2 + br label %shortcirc_done.2 + +shortcirc_done.2: ; preds = %shortcirc_done.3, %endif.2 + br bool false, label %then.3, label %endif.3 + +then.3: ; preds = %shortcirc_done.2 + br label %loopexit.0 + +dead_block_after_break.1: ; No predecessors! + br label %endif.3 + +endif.3: ; preds = %dead_block_after_break.1, %shortcirc_done.2 + br bool false, label %shortcirc_next.4, label %shortcirc_done.4 + +shortcirc_next.4: ; preds = %endif.3 + br label %shortcirc_done.4 + +shortcirc_done.4: ; preds = %shortcirc_next.4, %endif.3 + br bool false, label %then.4, label %else + +then.4: ; preds = %shortcirc_done.4 + br label %loopentry.1 + +loopentry.1: ; preds = %endif.8, %then.4 + br bool false, label %no_exit, label %loopexit.1 + +no_exit: ; preds = %loopentry.1 + %tmp.94 = call int %opost_block( ) ; <int> [#uses=1] + br bool false, label %then.5, label %endif.5 + +then.5: ; preds = %no_exit + br bool false, label %then.6, label %endif.6 + +then.6: ; preds = %then.5 + br label %loopexit.1 + +dead_block_after_break.2: ; No predecessors! + br label %endif.6 + +endif.6: ; preds = %dead_block_after_break.2, %then.5 + br label %break_out + +dead_block_after_goto.0: ; No predecessors! + br label %endif.5 + +endif.5: ; preds = %dead_block_after_goto.0, %no_exit + br bool false, label %then.7, label %endif.7 + +then.7: ; preds = %endif.5 + br label %loopexit.1 + +dead_block_after_break.3: ; No predecessors! + br label %endif.7 + +endif.7: ; preds = %dead_block_after_break.3, %endif.5 + switch uint 1, label %switchexit [ + uint 4, label %label.2 + uint 2, label %label.1 + uint 1, label %label.0 + ] + +label.0: ; preds = %endif.7 + br label %switchexit + +dead_block_after_break.4: ; No predecessors! + br label %label.1 + +label.1: ; preds = %dead_block_after_break.4, %endif.7 + br label %switchexit + +dead_block_after_break.5: ; No predecessors! + br label %label.2 + +label.2: ; preds = %dead_block_after_break.5, %endif.7 + br label %switchexit + +dead_block_after_break.6: ; No predecessors! + br label %switchexit + +switchexit: ; preds = %dead_block_after_break.6, %label.2, %label.1, %label.0, %endif.7 + br bool false, label %then.8, label %endif.8 + +then.8: ; preds = %switchexit + br label %loopexit.1 + +dead_block_after_break.7: ; No predecessors! + br label %endif.8 + +endif.8: ; preds = %dead_block_after_break.7, %switchexit + br label %loopentry.1 + +loopexit.1: ; preds = %then.8, %then.7, %then.6, %loopentry.1 + br bool false, label %then.9, label %endif.9 + +then.9: ; preds = %loopexit.1 + br label %endif.9 + +endif.9: ; preds = %then.9, %loopexit.1 + br label %endif.4 + +else: ; preds = %shortcirc_done.4 + br bool false, label %then.10, label %endif.10 + +then.10: ; preds = %else + br label %break_out + +dead_block_after_goto.1: ; No predecessors! + br label %endif.10 + +endif.10: ; preds = %dead_block_after_goto.1, %else + br label %endif.4 + +endif.4: ; preds = %endif.10, %endif.9 + br bool false, label %then.11, label %endif.11 + +then.11: ; preds = %endif.4 + br label %loopexit.0 + +dead_block_after_break.8: ; No predecessors! + br label %endif.11 + +endif.11: ; preds = %dead_block_after_break.8, %endif.4 + br bool false, label %then.12, label %endif.12 + +then.12: ; preds = %endif.11 + br label %loopexit.0 + +dead_block_after_break.9: ; No predecessors! + br label %endif.12 + +endif.12: ; preds = %dead_block_after_break.9, %endif.11 + br label %loopentry.0 + +loopexit.0: ; preds = %then.12, %then.11, %then.3, %then.2 + br label %break_out + +break_out: ; preds = %loopexit.0, %then.10, %endif.6 + %retval.3 = phi int [ 0, %loopexit.0 ], [ %tmp.94, %endif.6 ], [ 0, %then.10 ] ; <int> [#uses=0] + br bool false, label %cond_true, label %cond_false + +cond_true: ; preds = %break_out + br label %cond_continue + +cond_false: ; preds = %break_out + br label %cond_continue + +cond_continue: ; preds = %cond_false, %cond_true + br label %return + +after_ret.1: ; No predecessors! + br label %return + +return: ; preds = %after_ret.1, %cond_continue, %then.1 + ret void +} diff --git a/test/Transforms/LCSSA/2006-10-31-UnreachableBlock.ll b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock.ll new file mode 100644 index 0000000..9178411 --- /dev/null +++ b/test/Transforms/LCSSA/2006-10-31-UnreachableBlock.ll @@ -0,0 +1,270 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa -disable-output +; PR977 + +void %process_backlog() { +entry: + br label %loopentry.preheader + +loopentry.preheader: ; preds = %dead_block_after_break, %entry + %work.0.ph = phi int [ %inc, %dead_block_after_break ], [ 0, %entry ] ; <int> [#uses=0] + br label %loopentry + +loopentry: ; preds = %endif.1, %loopentry.preheader + br bool false, label %then.i, label %loopentry.__skb_dequeue67.exit_crit_edge + +loopentry.__skb_dequeue67.exit_crit_edge: ; preds = %loopentry + br label %__skb_dequeue67.exit + +then.i: ; preds = %loopentry + br label %__skb_dequeue67.exit + +__skb_dequeue67.exit: ; preds = %then.i, %loopentry.__skb_dequeue67.exit_crit_edge + br bool false, label %then.0, label %__skb_dequeue67.exit.endif.0_crit_edge + +__skb_dequeue67.exit.endif.0_crit_edge: ; preds = %__skb_dequeue67.exit + br label %endif.0 + +then.0: ; preds = %__skb_dequeue67.exit + br label %job_done + +dead_block_after_goto: ; No predecessors! + unreachable + +endif.0: ; preds = %__skb_dequeue67.exit.endif.0_crit_edge + br bool false, label %then.0.i, label %endif.0.endif.0.i_crit_edge + +endif.0.endif.0.i_crit_edge: ; preds = %endif.0 + br label %endif.0.i + +then.0.i: ; preds = %endif.0 + br label %endif.0.i + +endif.0.i: ; preds = %then.0.i, %endif.0.endif.0.i_crit_edge + br bool false, label %then.i.i, label %endif.0.i.skb_bond.exit.i_crit_edge + +endif.0.i.skb_bond.exit.i_crit_edge: ; preds = %endif.0.i + br label %skb_bond.exit.i + +then.i.i: ; preds = %endif.0.i + br label %skb_bond.exit.i + +skb_bond.exit.i: ; preds = %then.i.i, %endif.0.i.skb_bond.exit.i_crit_edge + br label %loopentry.0.i + +loopentry.0.i: ; preds = %loopentry.0.i.backedge, %skb_bond.exit.i + br bool false, label %loopentry.0.i.no_exit.0.i_crit_edge, label %loopentry.0.i.loopexit.0.i_crit_edge + +loopentry.0.i.loopexit.0.i_crit_edge: ; preds = %loopentry.0.i + br label %loopexit.0.i + +loopentry.0.i.no_exit.0.i_crit_edge: ; preds = %loopentry.0.i + br label %no_exit.0.i + +no_exit.0.i: ; preds = %then.3.i.no_exit.0.i_crit_edge, %loopentry.0.i.no_exit.0.i_crit_edge + br bool false, label %no_exit.0.i.shortcirc_done.0.i_crit_edge, label %shortcirc_next.0.i + +no_exit.0.i.shortcirc_done.0.i_crit_edge: ; preds = %no_exit.0.i + br label %shortcirc_done.0.i + +shortcirc_next.0.i: ; preds = %no_exit.0.i + br label %shortcirc_done.0.i + +shortcirc_done.0.i: ; preds = %shortcirc_next.0.i, %no_exit.0.i.shortcirc_done.0.i_crit_edge + br bool false, label %then.1.i, label %endif.1.i + +then.1.i: ; preds = %shortcirc_done.0.i + br bool false, label %then.2.i, label %then.1.i.endif.2.i_crit_edge + +then.1.i.endif.2.i_crit_edge: ; preds = %then.1.i + br label %endif.2.i + +then.2.i: ; preds = %then.1.i + br bool false, label %then.3.i, label %else.0.i + +then.3.i: ; preds = %then.2.i + br bool false, label %then.3.i.no_exit.0.i_crit_edge, label %then.3.i.loopexit.0.i_crit_edge + +then.3.i.loopexit.0.i_crit_edge: ; preds = %then.3.i + br label %loopexit.0.i + +then.3.i.no_exit.0.i_crit_edge: ; preds = %then.3.i + br label %no_exit.0.i + +else.0.i: ; preds = %then.2.i + br label %endif.2.i + +endif.3.i: ; No predecessors! + unreachable + +endif.2.i: ; preds = %else.0.i, %then.1.i.endif.2.i_crit_edge + br label %loopentry.0.i.backedge + +endif.1.i: ; preds = %shortcirc_done.0.i + br label %loopentry.0.i.backedge + +loopentry.0.i.backedge: ; preds = %endif.1.i, %endif.2.i + br label %loopentry.0.i + +loopexit.0.i: ; preds = %then.3.i.loopexit.0.i_crit_edge, %loopentry.0.i.loopexit.0.i_crit_edge + br label %loopentry.1.i + +loopentry.1.i: ; preds = %loopentry.1.i.backedge, %loopexit.0.i + br bool false, label %loopentry.1.i.no_exit.1.i_crit_edge, label %loopentry.1.i.loopexit.1.i_crit_edge + +loopentry.1.i.loopexit.1.i_crit_edge: ; preds = %loopentry.1.i + br label %loopexit.1.i + +loopentry.1.i.no_exit.1.i_crit_edge: ; preds = %loopentry.1.i + br label %no_exit.1.i + +no_exit.1.i: ; preds = %then.6.i.no_exit.1.i_crit_edge, %loopentry.1.i.no_exit.1.i_crit_edge + br bool false, label %shortcirc_next.1.i, label %no_exit.1.i.shortcirc_done.1.i_crit_edge + +no_exit.1.i.shortcirc_done.1.i_crit_edge: ; preds = %no_exit.1.i + br label %shortcirc_done.1.i + +shortcirc_next.1.i: ; preds = %no_exit.1.i + br bool false, label %shortcirc_next.1.i.shortcirc_done.2.i_crit_edge, label %shortcirc_next.2.i + +shortcirc_next.1.i.shortcirc_done.2.i_crit_edge: ; preds = %shortcirc_next.1.i + br label %shortcirc_done.2.i + +shortcirc_next.2.i: ; preds = %shortcirc_next.1.i + br label %shortcirc_done.2.i + +shortcirc_done.2.i: ; preds = %shortcirc_next.2.i, %shortcirc_next.1.i.shortcirc_done.2.i_crit_edge + br label %shortcirc_done.1.i + +shortcirc_done.1.i: ; preds = %shortcirc_done.2.i, %no_exit.1.i.shortcirc_done.1.i_crit_edge + br bool false, label %then.4.i, label %endif.4.i + +then.4.i: ; preds = %shortcirc_done.1.i + br bool false, label %then.5.i, label %then.4.i.endif.5.i_crit_edge + +then.4.i.endif.5.i_crit_edge: ; preds = %then.4.i + br label %endif.5.i + +then.5.i: ; preds = %then.4.i + br bool false, label %then.6.i, label %else.1.i + +then.6.i: ; preds = %then.5.i + br bool false, label %then.6.i.no_exit.1.i_crit_edge, label %then.6.i.loopexit.1.i_crit_edge + +then.6.i.loopexit.1.i_crit_edge: ; preds = %then.6.i + br label %loopexit.1.i + +then.6.i.no_exit.1.i_crit_edge: ; preds = %then.6.i + br label %no_exit.1.i + +else.1.i: ; preds = %then.5.i + br label %endif.5.i + +endif.6.i: ; No predecessors! + unreachable + +endif.5.i: ; preds = %else.1.i, %then.4.i.endif.5.i_crit_edge + br label %loopentry.1.i.backedge + +endif.4.i: ; preds = %shortcirc_done.1.i + br label %loopentry.1.i.backedge + +loopentry.1.i.backedge: ; preds = %endif.4.i, %endif.5.i + br label %loopentry.1.i + +loopexit.1.i: ; preds = %then.6.i.loopexit.1.i_crit_edge, %loopentry.1.i.loopexit.1.i_crit_edge + br bool false, label %then.7.i, label %else.2.i + +then.7.i: ; preds = %loopexit.1.i + br bool false, label %then.8.i, label %else.3.i + +then.8.i: ; preds = %then.7.i + br label %netif_receive_skb.exit + +else.3.i: ; preds = %then.7.i + br label %netif_receive_skb.exit + +endif.8.i: ; No predecessors! + unreachable + +else.2.i: ; preds = %loopexit.1.i + br bool false, label %else.2.i.shortcirc_done.i.i_crit_edge, label %shortcirc_next.i.i + +else.2.i.shortcirc_done.i.i_crit_edge: ; preds = %else.2.i + br label %shortcirc_done.i.i + +shortcirc_next.i.i: ; preds = %else.2.i + br label %shortcirc_done.i.i + +shortcirc_done.i.i: ; preds = %shortcirc_next.i.i, %else.2.i.shortcirc_done.i.i_crit_edge + br bool false, label %then.i1.i, label %shortcirc_done.i.i.kfree_skb65.exit.i_crit_edge + +shortcirc_done.i.i.kfree_skb65.exit.i_crit_edge: ; preds = %shortcirc_done.i.i + br label %kfree_skb65.exit.i + +then.i1.i: ; preds = %shortcirc_done.i.i + br label %kfree_skb65.exit.i + +kfree_skb65.exit.i: ; preds = %then.i1.i, %shortcirc_done.i.i.kfree_skb65.exit.i_crit_edge + br label %netif_receive_skb.exit + +netif_receive_skb.exit: ; preds = %kfree_skb65.exit.i, %else.3.i, %then.8.i + br bool false, label %then.i1, label %netif_receive_skb.exit.dev_put69.exit_crit_edge + +netif_receive_skb.exit.dev_put69.exit_crit_edge: ; preds = %netif_receive_skb.exit + br label %dev_put69.exit + +then.i1: ; preds = %netif_receive_skb.exit + br label %dev_put69.exit + +dev_put69.exit: ; preds = %then.i1, %netif_receive_skb.exit.dev_put69.exit_crit_edge + %inc = add int 0, 1 ; <int> [#uses=1] + br bool false, label %dev_put69.exit.shortcirc_done_crit_edge, label %shortcirc_next + +dev_put69.exit.shortcirc_done_crit_edge: ; preds = %dev_put69.exit + br label %shortcirc_done + +shortcirc_next: ; preds = %dev_put69.exit + br label %shortcirc_done + +shortcirc_done: ; preds = %shortcirc_next, %dev_put69.exit.shortcirc_done_crit_edge + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %shortcirc_done + ret void + +dead_block_after_break: ; No predecessors! + br label %loopentry.preheader + +endif.1: ; preds = %shortcirc_done + br label %loopentry + +loopexit: ; No predecessors! + unreachable + +after_ret.0: ; No predecessors! + br label %job_done + +job_done: ; preds = %after_ret.0, %then.0 + br label %loopentry.i + +loopentry.i: ; preds = %no_exit.i, %job_done + br bool false, label %no_exit.i, label %clear_bit62.exit + +no_exit.i: ; preds = %loopentry.i + br label %loopentry.i + +clear_bit62.exit: ; preds = %loopentry.i + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %clear_bit62.exit + ret void + +endif.2: ; preds = %clear_bit62.exit + ret void + +after_ret.1: ; No predecessors! + ret void + +return: ; No predecessors! + unreachable +} diff --git a/test/Transforms/LCSSA/basictest.ll b/test/Transforms/LCSSA/basictest.ll new file mode 100644 index 0000000..4dc1f54 --- /dev/null +++ b/test/Transforms/LCSSA/basictest.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: grep {X3.lcssa = phi i32} +; RUN: llvm-upgrade < %s | llvm-as | opt -lcssa | llvm-dis | \ +; RUN: grep {X4 = add i32 3, %X3.lcssa} + +void %lcssa(bool %S2) { +entry: + br label %loop.interior + +loop.interior: ; preds = %entry + br bool %S2, label %if.true, label %if.false + +if.true: + %X1 = add int 0, 0 + br label %post.if + +if.false: + %X2 = add int 0, 1 + br label %post.if + +post.if: + %X3 = phi int [%X1, %if.true], [%X2, %if.false] + br bool %S2, label %loop.exit, label %loop.interior + +loop.exit: + %X4 = add int 3, %X3 + ret void +} diff --git a/test/Transforms/LCSSA/dg.exp b/test/Transforms/LCSSA/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LCSSA/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll b/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll new file mode 100644 index 0000000..b437034 --- /dev/null +++ b/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -licm -disable-output + +;%MoveArray = external global [64 x ulong] + +implementation ; Functions: + +void %InitMoveArray() { +bb3: ; No predecessors! + %X = alloca [2 x ulong] + br bool false, label %bb13, label %bb4 + +bb4: ; preds = %bb3 + %reg3011 = getelementptr [2 x ulong]* %X, long 0, long 0 + br label %bb8 + +bb8: ; preds = %bb8, %bb4 + store ulong 0, ulong* %reg3011 + br bool false, label %bb8, label %bb13 + +bb13: ; preds = %bb8, %bb3 + ret void +} diff --git a/test/Transforms/LICM/2003-02-27-NestedLoopExitBlocks.ll b/test/Transforms/LICM/2003-02-27-NestedLoopExitBlocks.ll new file mode 100644 index 0000000..d0830bc --- /dev/null +++ b/test/Transforms/LICM/2003-02-27-NestedLoopExitBlocks.ll @@ -0,0 +1,22 @@ +; Exit blocks need to be updated for all nested loops... + +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify + +implementation ; Functions: + +int %yyparse() { +bb0: ; No predecessors! + br bool false, label %UnifiedExitNode, label %bb19 + +bb19: ; preds = %bb28, %bb0 + br bool false, label %bb28, label %UnifiedExitNode + +bb28: ; preds = %bb32, %bb19 + br bool false, label %bb32, label %bb19 + +bb32: ; preds = %bb28 + br bool false, label %UnifiedExitNode, label %bb28 + +UnifiedExitNode: ; preds = %bb32, %bb19, %bb0 + ret int 0 +} diff --git a/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll b/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll new file mode 100644 index 0000000..224116f --- /dev/null +++ b/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll @@ -0,0 +1,19 @@ +; This testcase fails because preheader insertion is not updating exit node +; information for loops. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm + +int %main(int %argc, sbyte** %argv) { +bb0: ; No predecessors! + br bool false, label %bb7, label %bb5 + +bb5: ; preds = %bb5, %bb0 + br bool false, label %bb5, label %bb7 + +bb7: ; preds = %bb7, %bb5, %bb0 + br bool false, label %bb7, label %bb10 + +bb10: ; preds = %bb7 + ret int 0 +} + diff --git a/test/Transforms/LICM/2003-02-27-PreheaderProblem.ll b/test/Transforms/LICM/2003-02-27-PreheaderProblem.ll new file mode 100644 index 0000000..365cb1f --- /dev/null +++ b/test/Transforms/LICM/2003-02-27-PreheaderProblem.ll @@ -0,0 +1,26 @@ +; Here we have a case where there are two loops and LICM is hoisting an +; instruction from one loop into the other loop! This is obviously bad and +; happens because preheader insertion doesn't insert a preheader for this +; case... bad. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -adce -simplifycfg | llvm-dis | \ +; RUN: not grep {br } + +int %main(int %argc) { + br label %bb5 + +bb5: ; preds = %bb5, %0 + %I = phi int [0, %0], [%I2, %bb5] + %I2 = add int %I, 1 + %c = seteq int %I2, 10 + br bool %c, label %bb5, label %bb8 + +bb8: ; preds = %bb8, %bb5 + %cann-indvar = phi uint [ 0, %bb8 ], [ 0, %bb5 ] + %X = add int %argc, %argc ; Loop invariant + br bool false, label %bb8, label %bb10 + +bb10: ; preds = %bb8 + ret int %X +} + diff --git a/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll b/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll new file mode 100644 index 0000000..caf50eb --- /dev/null +++ b/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll @@ -0,0 +1,13 @@ +; LICM is adding stores before phi nodes. bad. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm + +bool %test(bool %c) { + br bool %c, label %Loop, label %Out +Loop: + store int 0, int* null + br bool %c, label %Loop, label %Out +Out: + %X = phi bool [%c, %0], [true, %Loop] + ret bool %X +} diff --git a/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll b/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll new file mode 100644 index 0000000..360871b --- /dev/null +++ b/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll @@ -0,0 +1,15 @@ +; Test that hoisting is disabled for pointers of different types... +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm + +void %test(int* %P) { + br label %Loop +Loop: + store int 5, int* %P + %P2 = cast int* %P to sbyte* + store sbyte 4, sbyte* %P2 + br bool true, label %Loop, label %Out +Out: + ret void +} + diff --git a/test/Transforms/LICM/2003-05-02-LoadHoist.ll b/test/Transforms/LICM/2003-05-02-LoadHoist.ll new file mode 100644 index 0000000..ce13e6d --- /dev/null +++ b/test/Transforms/LICM/2003-05-02-LoadHoist.ll @@ -0,0 +1,21 @@ +; This testcase tests for a problem where LICM hoists loads out of a loop +; despite the fact that calls to unknown functions may modify what is being +; loaded from. Basically if the load gets hoisted, the subtract gets turned +; into a constant zero. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -load-vn -gcse -instcombine | llvm-dis | grep load + +%X = global int 7 +declare void %foo() + +int %test(bool %c) { + %A = load int *%X + br label %Loop +Loop: + call void %foo() + %B = load int *%X ;; Should not hoist this load! + br bool %c, label %Loop, label %Out +Out: + %C = sub int %A, %B + ret int %C +} diff --git a/test/Transforms/LICM/2003-08-04-TrappingInstHoist.ll b/test/Transforms/LICM/2003-08-04-TrappingInstHoist.ll new file mode 100644 index 0000000..63a4ac0 --- /dev/null +++ b/test/Transforms/LICM/2003-08-04-TrappingInstHoist.ll @@ -0,0 +1,27 @@ +; This testcase tests for a problem where LICM hoists +; potentially trapping instructions when they are not guaranteed to execute. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext "IfUnEqual" 2 | grep div + +%X = global int 0 +declare void %foo() + +int %test(bool %c) { + %A = load int *%X + br label %Loop +Loop: + call void %foo() + br bool %c, label %LoopTail, label %IfUnEqual + +IfUnEqual: + %B1 = div int 4, %A ;; Should not hoist this div! + br label %LoopTail + +LoopTail: + %B = phi int [ 0, %Loop ], [ %B1, %IfUnEqual] + br bool %c, label %Loop, label %Out + +Out: + %C = sub int %A, %B + ret int %C +} diff --git a/test/Transforms/LICM/2003-08-04-TrappingInstOkHoist.ll b/test/Transforms/LICM/2003-08-04-TrappingInstOkHoist.ll new file mode 100644 index 0000000..2c784c0 --- /dev/null +++ b/test/Transforms/LICM/2003-08-04-TrappingInstOkHoist.ll @@ -0,0 +1,20 @@ +; This testcase tests to make sure a trapping instruction is hoisted when +; it is guaranteed to execute. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext "test" 2 | grep div + +%X = global int 0 +declare void %foo(int) + +int %test(bool %c) { + %A = load int *%X + br label %Loop +Loop: + %B = div int 4, %A ;; Should have hoisted this div! + call void %foo(int %B) + br bool %c, label %Loop, label %Out + +Out: + %C = sub int %A, %B + ret int %C +} diff --git a/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll b/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll new file mode 100644 index 0000000..955e70b --- /dev/null +++ b/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | lli + +implementation ; Functions: + +int %main() { +entry: + br label %Loop + +Loop: + br bool true, label %LoopCont, label %Out +LoopCont: + %X = add int 1, 0 + br bool true, label %Out, label %Loop + +Out: + %V = phi int [ 2, %Loop], [ %X, %LoopCont] + %V2 = sub int %V, 1 + ret int %V2 +} + diff --git a/test/Transforms/LICM/2003-12-13-VolatilePromote.ll b/test/Transforms/LICM/2003-12-13-VolatilePromote.ll new file mode 100644 index 0000000..916a6e3 --- /dev/null +++ b/test/Transforms/LICM/2003-12-13-VolatilePromote.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext volatile 1 | grep Loop + +%X = global int 7 + +void %testfunc(int %i) { + br label %Loop + +Loop: + %x = volatile load int* %X ; Should not promote this to a register + %x2 = add int %x, 1 + store int %x2, int* %X + br bool true, label %Out, label %Loop + +Out: + ret void +} + diff --git a/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.llx b/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.llx new file mode 100644 index 0000000..f4dd108 --- /dev/null +++ b/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.llx @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -globalsmodref-aa -licm -disable-output + +%PL_regcomp_parse = internal global sbyte* null + +implementation + +void %test() { + br label %Outer +Outer: + br label %Inner +Inner: + %tmp.114.i.i.i = load sbyte** %PL_regcomp_parse + %tmp.115.i.i.i = load sbyte* %tmp.114.i.i.i + + store sbyte* null, sbyte** %PL_regcomp_parse + + br bool false, label %Inner, label %Next +Next: + br bool false, label %Outer, label %Exit +Exit: + ret void +} diff --git a/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll b/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll new file mode 100644 index 0000000..848dd46 --- /dev/null +++ b/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output + + %struct.roadlet = type { sbyte*, %struct.vehicle*, [8 x %struct.roadlet*], [8 x %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)*] } + %struct.vehicle = type { %struct.roadlet*, sbyte*, int, int, %union.._631., int } + %union.._631. = type { int } + +implementation ; Functions: + +declare %struct.roadlet* %_Z11return_nullP7roadletP7vehicle9direction(%struct.roadlet*, %struct.vehicle*, int) + +declare %struct.roadlet* %_Z14lane_switch_okP7roadletP7vehicle9direction(%struct.roadlet*, %struct.vehicle*, int) + +void %main() { +__main.entry: ; preds = %invoke_cont.1 + br label %invoke_cont.3 + +invoke_cont.3: ; preds = %__main.entry, %invoke_cont.3 + %tmp.34.i.i502.7 = getelementptr %struct.roadlet* null, int 0, uint 3, int 7 ; <%struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)**> [#uses=1] + store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)* %_Z11return_nullP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)** %tmp.34.i.i502.7 + store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)* %_Z14lane_switch_okP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)** null + %tmp.4.i.i339 = getelementptr %struct.roadlet* null, int 0, uint 3, int undef ; <%struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)**> [#uses=1] + store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)* %_Z11return_nullP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, int)** %tmp.4.i.i339 + br label %invoke_cont.3 +} diff --git a/test/Transforms/LICM/2005-03-24-LICM-Aggregate-Crash.ll b/test/Transforms/LICM/2005-03-24-LICM-Aggregate-Crash.ll new file mode 100644 index 0000000..544dee3 --- /dev/null +++ b/test/Transforms/LICM/2005-03-24-LICM-Aggregate-Crash.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output + +void %test({int}* %P) { + br label %Loop + +Loop: + free {int}* %P + br label %Loop +} + diff --git a/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll b/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll new file mode 100644 index 0000000..8eca08c --- /dev/null +++ b/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll @@ -0,0 +1,215 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output +; PR908 + + %struct.alloc_chain = type { sbyte*, %struct.alloc_chain* } + %struct.oggpack_buffer = type { int, int, ubyte*, ubyte*, int } + %struct.vorbis_block = type { float**, %struct.oggpack_buffer, int, int, int, int, int, int, long, long, %struct.vorbis_dsp_state*, sbyte*, int, int, int, %struct.alloc_chain*, int, int, int, int, sbyte* } + %struct.vorbis_dsp_state = type { int, %struct.vorbis_info*, float**, float**, int, int, int, int, int, int, int, int, int, long, long, long, long, long, long, sbyte* } + %struct.vorbis_info = type { int, int, int, int, int, int, int, sbyte* } + +implementation ; Functions: + +fastcc void %_01forward() { +entry: + br bool false, label %bb222.preheader, label %bb241 + +cond_true67: ; preds = %cond_true87 + br label %cond_next80 + +cond_next80: ; preds = %cond_true87, %cond_true67 + br label %bb83 + +bb83.preheader: ; preds = %cond_true226 + br bool false, label %bb83.us.preheader, label %bb83.preheader1 + +bb83.us.preheader: ; preds = %bb83.preheader + br label %bb83.us + +bb83.us: ; preds = %cond_next80.us, %bb83.us.preheader + br bool false, label %cond_true87.us, label %cond_next92.loopexit2 + +cond_next80.us: ; preds = %bb59.loopexit.us, %cond_true67.us + br label %bb83.us + +cond_true67.us: ; preds = %bb59.loopexit.us + br label %cond_next80.us + +cond_next.us: ; preds = %cond_true56.us, %cond_true38.us + br bool false, label %cond_true56.us, label %bb59.loopexit.us + +cond_true38.us: ; preds = %cond_true56.us + br label %cond_next.us + +cond_true56.us: ; preds = %cond_true87.us, %cond_next.us + br bool false, label %cond_true38.us, label %cond_next.us + +cond_true87.us: ; preds = %bb83.us + br label %cond_true56.us + +bb59.loopexit.us: ; preds = %cond_next.us + br bool false, label %cond_true67.us, label %cond_next80.us + +bb83.preheader1: ; preds = %bb83.preheader + br label %bb83 + +bb83: ; preds = %bb83.preheader1, %cond_next80 + br bool false, label %cond_next92.loopexit, label %cond_true87 + +cond_true87: ; preds = %bb83 + br bool false, label %cond_true67, label %cond_next80 + +cond_next92.loopexit: ; preds = %bb83 + br label %cond_next92 + +cond_next92.loopexit2: ; preds = %bb83.us + br label %cond_next92 + +cond_next92: ; preds = %cond_true226, %cond_next92.loopexit2, %cond_next92.loopexit + br bool false, label %cond_true218.loopexit, label %bb222 + +cond_true139: ; preds = %cond_true202 + br bool false, label %cond_next195, label %cond_true155 + +cond_true155: ; preds = %cond_true139 + br bool false, label %cond_true249.i.preheader, label %_encodepart.exit + +cond_true.i: ; preds = %cond_true115.i + br bool false, label %bb60.i.preheader, label %cond_next97.i + +bb60.i.preheader: ; preds = %cond_true.i + br label %bb60.i + +bb60.i: ; preds = %cond_true63.i, %bb60.i.preheader + br bool false, label %cond_true63.i, label %cond_next97.i.loopexit + +cond_true63.i: ; preds = %bb60.i + br bool false, label %bb60.i, label %cond_next97.i.loopexit + +bb86.i.preheader: ; preds = %cond_true115.i + br label %bb86.i + +bb86.i: ; preds = %cond_true93.i, %bb86.i.preheader + br bool false, label %cond_true93.i, label %cond_next97.i.loopexit3 + +cond_true93.i: ; preds = %bb86.i + br bool false, label %cond_next97.i.loopexit3, label %bb86.i + +cond_next97.i.loopexit: ; preds = %cond_true63.i, %bb60.i + br label %cond_next97.i + +cond_next97.i.loopexit3: ; preds = %cond_true93.i, %bb86.i + br label %cond_next97.i + +cond_next97.i: ; preds = %cond_next97.i.loopexit3, %cond_next97.i.loopexit, %cond_true.i + br bool false, label %bb118.i.loopexit, label %cond_true115.i + +cond_true115.i.preheader: ; preds = %cond_true249.i + br label %cond_true115.i + +cond_true115.i: ; preds = %cond_true115.i.preheader, %cond_next97.i + br bool false, label %cond_true.i, label %bb86.i.preheader + +bb118.i.loopexit: ; preds = %cond_next97.i + br label %bb118.i + +bb118.i: ; preds = %cond_true249.i, %bb118.i.loopexit + br bool false, label %cond_next204.i, label %cond_true128.i + +cond_true128.i: ; preds = %bb118.i + br bool false, label %cond_true199.i.preheader, label %cond_next204.i + +cond_true199.i.preheader: ; preds = %cond_true128.i + br label %cond_true199.i + +cond_true199.i.us: ; No predecessors! + br bool false, label %cond_true167.i.us, label %cond_next187.i.us + +cond_next187.i.us: ; preds = %bb170.i.loopexit.us, %bb170.i.us.cond_next187.i.us_crit_edge, %cond_true199.i.us + unreachable + +bb170.i.us.cond_next187.i.us_crit_edge: ; preds = %bb170.i.loopexit.us + br label %cond_next187.i.us + +cond_true167.i.us: ; preds = %cond_true167.i.us, %cond_true199.i.us + br bool false, label %cond_true167.i.us, label %bb170.i.loopexit.us + +bb170.i.loopexit.us: ; preds = %cond_true167.i.us + br bool false, label %cond_next187.i.us, label %bb170.i.us.cond_next187.i.us_crit_edge + +cond_true199.i: ; preds = %cond_true199.i, %cond_true199.i.preheader + br bool false, label %cond_next204.i.loopexit, label %cond_true199.i + +cond_next204.i.loopexit: ; preds = %cond_true199.i + br label %cond_next204.i + +cond_next204.i: ; preds = %cond_next204.i.loopexit, %cond_true128.i, %bb118.i + br label %bb233.i + +cond_true230.i: ; No predecessors! + %exitcond155 = seteq uint 0, %tmp16.i ; <bool> [#uses=0] + unreachable + +bb233.i: ; preds = %cond_next204.i + br bool false, label %_encodepart.exit.loopexit, label %cond_true249.i + +cond_true249.i.preheader: ; preds = %cond_true155 + br label %cond_true249.i + +cond_true249.i: ; preds = %cond_true249.i.preheader, %bb233.i + %tmp16.i = cast int 0 to uint ; <uint> [#uses=1] + br bool false, label %cond_true115.i.preheader, label %bb118.i + +_encodepart.exit.loopexit: ; preds = %bb233.i + br label %_encodepart.exit + +_encodepart.exit: ; preds = %_encodepart.exit.loopexit, %cond_true155 + br label %cond_next195 + +cond_next195: ; preds = %cond_true202, %_encodepart.exit, %cond_true139 + br bool false, label %bb205.loopexit, label %cond_true202 + +cond_true202.preheader: ; preds = %cond_true218 + br label %cond_true202 + +cond_true202: ; preds = %cond_true202.preheader, %cond_next195 + br bool false, label %cond_next195, label %cond_true139 + +bb205.loopexit: ; preds = %cond_next195 + br label %bb205 + +bb205: ; preds = %cond_true218, %bb205.loopexit + br bool false, label %cond_true218, label %bb222.outer105.loopexit + +cond_true218.loopexit: ; preds = %cond_next92 + br label %cond_true218 + +cond_true218: ; preds = %cond_true218.loopexit, %bb205 + br bool false, label %cond_true202.preheader, label %bb205 + +bb222.preheader: ; preds = %entry + br label %bb222.outer + +bb222.outer: ; preds = %bb229, %bb222.preheader + br label %bb222.outer105 + +bb222.outer105.loopexit: ; preds = %bb205 + br label %bb222.outer105 + +bb222.outer105: ; preds = %bb222.outer105.loopexit, %bb222.outer + br label %bb222 + +bb222: ; preds = %bb222.outer105, %cond_next92 + br bool false, label %cond_true226, label %bb229 + +cond_true226: ; preds = %bb222 + br bool false, label %bb83.preheader, label %cond_next92 + +bb229: ; preds = %bb222 + br bool false, label %bb222.outer, label %bb241.loopexit + +bb241.loopexit: ; preds = %bb229 + br label %bb241 + +bb241: ; preds = %bb241.loopexit, %entry + ret void +} diff --git a/test/Transforms/LICM/2007-05-22-VolatileSink.ll b/test/Transforms/LICM/2007-05-22-VolatileSink.ll new file mode 100644 index 0000000..bf5d7bc --- /dev/null +++ b/test/Transforms/LICM/2007-05-22-VolatileSink.ll @@ -0,0 +1,56 @@ +; RUN: llvm-as < %s | opt -licm | llvm-dis | grep {volatile store} +; PR1435 +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-apple-darwin8" + +define void @Transpose(i32* %DataIn, i32* %DataOut) { +entry: + %buffer = alloca [64 x i32], align 16 ; <[64 x i32]*> [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + br label %bb6 + +bb: ; preds = %bb6 + %tmp2 = volatile load i32* %DataIn ; <i32> [#uses=1] + %tmp3 = getelementptr [64 x i32]* %buffer, i32 0, i32 %i.0 ; <i32*> [#uses=1] + store i32 %tmp2, i32* %tmp3 + %tmp5 = add i32 %i.0, 1 ; <i32> [#uses=1] + br label %bb6 + +bb6: ; preds = %bb, %entry + %i.0 = phi i32 [ 0, %entry ], [ %tmp5, %bb ] ; <i32> [#uses=3] + %tmp8 = icmp sle i32 %i.0, 63 ; <i1> [#uses=1] + %tmp89 = zext i1 %tmp8 to i8 ; <i8> [#uses=1] + %toBool = icmp ne i8 %tmp89, 0 ; <i1> [#uses=1] + br i1 %toBool, label %bb, label %bb30 + +bb12: ; preds = %bb22 + %tmp14 = mul i32 %j.1, 8 ; <i32> [#uses=1] + %tmp16 = add i32 %tmp14, %i.1 ; <i32> [#uses=1] + %tmp17 = getelementptr [64 x i32]* %buffer, i32 0, i32 %tmp16 ; <i32*> [#uses=1] + %tmp18 = load i32* %tmp17 ; <i32> [#uses=1] + volatile store i32 %tmp18, i32* %DataOut + %tmp21 = add i32 %j.1, 1 ; <i32> [#uses=1] + br label %bb22 + +bb22: ; preds = %bb30, %bb12 + %j.1 = phi i32 [ %tmp21, %bb12 ], [ 0, %bb30 ] ; <i32> [#uses=4] + %tmp24 = icmp sle i32 %j.1, 7 ; <i1> [#uses=1] + %tmp2425 = zext i1 %tmp24 to i8 ; <i8> [#uses=1] + %toBool26 = icmp ne i8 %tmp2425, 0 ; <i1> [#uses=1] + br i1 %toBool26, label %bb12, label %bb27 + +bb27: ; preds = %bb22 + %tmp29 = add i32 %i.1, 1 ; <i32> [#uses=1] + br label %bb30 + +bb30: ; preds = %bb27, %bb6 + %j.0 = phi i32 [ %j.1, %bb27 ], [ undef, %bb6 ] ; <i32> [#uses=0] + %i.1 = phi i32 [ %tmp29, %bb27 ], [ 0, %bb6 ] ; <i32> [#uses=3] + %tmp32 = icmp sle i32 %i.1, 7 ; <i1> [#uses=1] + %tmp3233 = zext i1 %tmp32 to i8 ; <i8> [#uses=1] + %toBool34 = icmp ne i8 %tmp3233, 0 ; <i1> [#uses=1] + br i1 %toBool34, label %bb22, label %return + +return: ; preds = %bb30 + ret void +} diff --git a/test/Transforms/LICM/basictest.ll b/test/Transforms/LICM/basictest.ll new file mode 100644 index 0000000..6458f03 --- /dev/null +++ b/test/Transforms/LICM/basictest.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis + +void "testfunc"(int %i) { + + br label %Loop + +Loop: + %j = phi uint [0, %0], [%Next, %Loop] + %i = cast int %i to uint + %i2 = mul uint %i, 17 + %Next = add uint %j, %i2 + %cond = seteq uint %Next, 0 + br bool %cond, label %Out, label %Loop + +Out: + ret void +} diff --git a/test/Transforms/LICM/call_sink_const_function.ll b/test/Transforms/LICM/call_sink_const_function.ll new file mode 100644 index 0000000..a8a4b72 --- /dev/null +++ b/test/Transforms/LICM/call_sink_const_function.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -licm | llvm-dis | %prcontext sin 1 | grep Out: +declare double %sin(double) +declare void %foo() + +double %test(double %X) { + br label %Loop + +Loop: + call void %foo() ;; Unknown effects! + + %A = call double %sin(double %X) ;; Can still hoist/sink call + br bool true, label %Loop, label %Out + +Out: + ret double %A +} diff --git a/test/Transforms/LICM/call_sink_pure_function.ll b/test/Transforms/LICM/call_sink_pure_function.ll new file mode 100644 index 0000000..e5857a6 --- /dev/null +++ b/test/Transforms/LICM/call_sink_pure_function.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -licm | llvm-dis | %prcontext strlen 1 | grep Out: +declare int %strlen(sbyte*) +declare void %foo() + +int %test(sbyte* %P) { + br label %Loop + +Loop: + %A = call int %strlen(sbyte* %P) ;; Can hoist/sink call + br bool false, label %Loop, label %Out + +Out: + ret int %A +} diff --git a/test/Transforms/LICM/dg.exp b/test/Transforms/LICM/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LICM/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LICM/no-preheader-test.ll b/test/Transforms/LICM/no-preheader-test.ll new file mode 100644 index 0000000..7f4b51a --- /dev/null +++ b/test/Transforms/LICM/no-preheader-test.ll @@ -0,0 +1,21 @@ +; Test that LICM works when there is not a loop-preheader +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis + +void "testfunc"(int %i.s, bool %ifcond) { + br bool %ifcond, label %Then, label %Else +Then: + br label %Loop +Else: + br label %Loop + +Loop: + %j = phi uint [0, %Then], [12, %Else], [%Next, %Loop] + %i = cast int %i.s to uint + %i2 = mul uint %i, 17 + %Next = add uint %j, %i2 + %cond = seteq uint %Next, 0 + br bool %cond, label %Out, label %Loop + +Out: + ret void +} diff --git a/test/Transforms/LICM/scalar_promote.ll b/test/Transforms/LICM/scalar_promote.ll new file mode 100644 index 0000000..7bc4f06 --- /dev/null +++ b/test/Transforms/LICM/scalar_promote.ll @@ -0,0 +1,37 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -stats |& \ +; RUN: grep {memory locations promoted to register} + +%X = global int 7 + +void %testfunc(int %i) { + br label %Loop + +Loop: + %j = phi uint [0, %0], [%Next, %Loop] + + %x = load int* %X ; Should promote this to a register inside of loop! + %x2 = add int %x, 1 + store int %x2, int* %X + + %Next = add uint %j, 1 + %cond = seteq uint %Next, 0 + br bool %cond, label %Out, label %Loop + +Out: + ret void +} + +void %testhard(int %i) { + br label %Loop +Loop: + %X1 = getelementptr int* %X, long 0 + %A = load int* %X1 ; Aliases X, needs to be rewritten + %V = add int %A, 1 + %X2 = getelementptr int* %X, long 0 + store int %V, int* %X2 + br bool false, label %Loop, label %Exit + +Exit: + ret void + +} diff --git a/test/Transforms/LICM/sink_critical_edge.ll b/test/Transforms/LICM/sink_critical_edge.ll new file mode 100644 index 0000000..bc8f2b2 --- /dev/null +++ b/test/Transforms/LICM/sink_critical_edge.ll @@ -0,0 +1,19 @@ +; This testcase checks to make sure the sinker does not cause problems with +; critical edges. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext add 1 | grep Exit + +implementation ; Functions: + +void %test() { +Entry: + br bool false, label %Loop, label %Exit + +Loop: + %X = add int 0, 1 + br bool false, label %Loop, label %Exit + +Exit: + %Y = phi int [ 0, %Entry ], [ %X, %Loop ] + ret void +} diff --git a/test/Transforms/LICM/sink_inst.ll b/test/Transforms/LICM/sink_inst.ll new file mode 100644 index 0000000..82d9357 --- /dev/null +++ b/test/Transforms/LICM/sink_inst.ll @@ -0,0 +1,19 @@ +; If the result of an instruction is only used outside of the loop, sink +; the instruction to the exit blocks instead of executing it on every +; iteration of the loop. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext mul 1 | grep Out: + +int %test(int %N) { +Entry: + br label %Loop +Loop: + %N_addr.0.pn = phi int [ %dec, %Loop ], [ %N, %Entry ] + %tmp.6 = mul int %N, %N_addr.0.pn + %tmp.7 = sub int %tmp.6, %N + %dec = add int %N_addr.0.pn, -1 + %tmp.1 = setne int %N_addr.0.pn, 1 + br bool %tmp.1, label %Loop, label %Out +Out: + ret int %tmp.7 +} diff --git a/test/Transforms/LICM/sink_load.ll b/test/Transforms/LICM/sink_load.ll new file mode 100644 index 0000000..5b19b6f --- /dev/null +++ b/test/Transforms/LICM/sink_load.ll @@ -0,0 +1,20 @@ +; To reduce register pressure, if a load is hoistable out of the loop, and the +; result of the load is only used outside of the loop, sink the load instead of +; hoisting it! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext load 1 | grep Out: + +%X = global int 5 + +int %test(int %N) { +Entry: + br label %Loop +Loop: + %N_addr.0.pn = phi int [ %dec, %Loop ], [ %N, %Entry ] + %tmp.6 = load int* %X + %dec = add int %N_addr.0.pn, -1 + %tmp.1 = setne int %N_addr.0.pn, 1 + br bool %tmp.1, label %Loop, label %Out +Out: + ret int %tmp.6 +} diff --git a/test/Transforms/LICM/sink_multiple.ll b/test/Transforms/LICM/sink_multiple.ll new file mode 100644 index 0000000..49b35b6 --- /dev/null +++ b/test/Transforms/LICM/sink_multiple.ll @@ -0,0 +1,20 @@ +; The loop sinker was running from the bottom of the loop to the top, causing +; it to miss opportunities to sink instructions that depended on sinking other +; instructions from the loop. Instead they got hoisted, which is better than +; leaving them in the loop, but increases register pressure pointlessly. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | \ +; RUN: %prcontext getelementptr 1 | grep Out: + +%Ty = type { int, int } +%X = external global %Ty + +int %test() { + br label %Loop +Loop: + %dead = getelementptr %Ty* %X, long 0, uint 0 + %sunk2 = load int* %dead + br bool false, label %Loop, label %Out +Out: + ret int %sunk2 +} diff --git a/test/Transforms/LICM/sink_multiple_exits.ll b/test/Transforms/LICM/sink_multiple_exits.ll new file mode 100644 index 0000000..75cfed7 --- /dev/null +++ b/test/Transforms/LICM/sink_multiple_exits.ll @@ -0,0 +1,23 @@ +; This testcase ensures that we can sink instructions from loops with +; multiple exits. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | \ +; RUN: %prcontext mul 1 | grep {Out\[12\]:} + +int %test(int %N, bool %C) { +Entry: + br label %Loop +Loop: + %N_addr.0.pn = phi int [ %dec, %ContLoop ], [ %N, %Entry ] + %tmp.6 = mul int %N, %N_addr.0.pn + %tmp.7 = sub int %tmp.6, %N + %dec = add int %N_addr.0.pn, -1 + br bool %C, label %ContLoop, label %Out1 +ContLoop: + %tmp.1 = setne int %N_addr.0.pn, 1 + br bool %tmp.1, label %Loop, label %Out2 +Out1: + ret int %tmp.7 +Out2: + ret int %tmp.7 +} diff --git a/test/Transforms/LICM/sink_only_some_exits.ll b/test/Transforms/LICM/sink_only_some_exits.ll new file mode 100644 index 0000000..ae11fe8 --- /dev/null +++ b/test/Transforms/LICM/sink_only_some_exits.ll @@ -0,0 +1,26 @@ +; This testcase checks to make sure we can sink values which are only live on +; some exits out of the loop, and that we can do so without breaking dominator +; info. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | \ +; RUN: %prcontext add 1 | grep exit2: + +implementation ; Functions: + +int %test(bool %C1, bool %C2, int *%P, int* %Q) { +Entry: + br label %Loop + +Loop: + br bool %C1, label %Cont, label %exit1 +Cont: + %X = load int* %P + store int %X, int* %Q + %V = add int %X, 1 + br bool %C2, label %Loop, label %exit2 + +exit1: + ret int 0 +exit2: + ret int %V +} diff --git a/test/Transforms/LICM/sink_phi_node_use.ll b/test/Transforms/LICM/sink_phi_node_use.ll new file mode 100644 index 0000000..d50f54e --- /dev/null +++ b/test/Transforms/LICM/sink_phi_node_use.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext add 1 | grep preheader.loopexit: + +implementation + +void %test() { +loopentry.2.i: + br bool false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader + +no_exit.1.i.preheader: + br label %no_exit.1.i + +no_exit.1.i: + br bool false, label %return.i, label %endif.8.i + +endif.8.i: + %inc.1.i = add int 0, 1 + br bool false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit + +loopentry.3.i.preheader.loopexit: + br label %loopentry.3.i.preheader + +loopentry.3.i.preheader: + %arg_num.0.i.ph13000 = phi int [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ] + ret void + +return.i: + ret void +} diff --git a/test/Transforms/LICM/sink_trapping_inst.ll b/test/Transforms/LICM/sink_trapping_inst.ll new file mode 100644 index 0000000..8e67c00 --- /dev/null +++ b/test/Transforms/LICM/sink_trapping_inst.ll @@ -0,0 +1,17 @@ +; Potentially trapping instructions may be sunk as long as they are guaranteed +; to be executed. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -licm | llvm-dis | %prcontext div 1 | grep Out: + +int %test(int %N) { +Entry: + br label %Loop +Loop: + %N_addr.0.pn = phi int [ %dec, %Loop ], [ %N, %Entry ] + %tmp.6 = div int %N, %N_addr.0.pn + %dec = add int %N_addr.0.pn, -1 + %tmp.1 = setne int %N_addr.0.pn, 0 + br bool %tmp.1, label %Loop, label %Out +Out: + ret int %tmp.6 +} diff --git a/test/Transforms/LoopRotate/LRAnalysis.ll b/test/Transforms/LoopRotate/LRAnalysis.ll new file mode 100644 index 0000000..3dc6eda --- /dev/null +++ b/test/Transforms/LoopRotate/LRAnalysis.ll @@ -0,0 +1,21 @@ +; RUN: llvm-as < %s | opt -loop-rotate -loop-unswitch -disable-output + +define i32 @stringSearch_Clib(i32 %count) { +entry: + br i1 false, label %bb36, label %bb44 + +cond_true20: ; preds = %bb36 + %tmp33 = add i32 0, 0 ; <i32> [#uses=1] + br label %bb36 + +bb36: ; preds = %cond_true20, %entry + %c.2 = phi i32 [ %tmp33, %cond_true20 ], [ 0, %entry ] ; <i32> [#uses=1] + br i1 false, label %cond_true20, label %bb41 + +bb41: ; preds = %bb36 + %c.2.lcssa = phi i32 [ %c.2, %bb36 ] ; <i32> [#uses=0] + ret i32 0 + +bb44: ; preds = %entry + ret i32 0 +} diff --git a/test/Transforms/LoopRotate/LRCrash-1.ll b/test/Transforms/LoopRotate/LRCrash-1.ll new file mode 100644 index 0000000..0149482 --- /dev/null +++ b/test/Transforms/LoopRotate/LRCrash-1.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-rotate -disable-output + + + %struct.relation = type { [4 x i16], i32, [4 x i16], i32, i32 } + + + + + + +void @findAllPairs() { +entry: + br i1 false, label %bb139, label %bb10.i44 + +bb10.i44: ; preds = %entry + ret void + +bb127: ; preds = %bb139 + br label %bb139 + +bb139: ; preds = %bb127, %entry + br i1 false, label %bb127, label %bb142 + +bb142: ; preds = %bb139 + %r91.0.lcssa = phi %struct.relation* [ null, %bb139 ] ; <%struct.relation*> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopRotate/LRCrash-2.ll b/test/Transforms/LoopRotate/LRCrash-2.ll new file mode 100644 index 0000000..bceeb91 --- /dev/null +++ b/test/Transforms/LoopRotate/LRCrash-2.ll @@ -0,0 +1,30 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-rotate -disable-output + +void @findAllPairs() { +entry: + br i1 false, label %bb139, label %cond_true + +cond_true: ; preds = %entry + ret void + +bb90: ; preds = %bb139 + br i1 false, label %bb136, label %cond_next121 + +cond_next121: ; preds = %bb90 + br i1 false, label %bb136, label %bb127 + +bb127: ; preds = %cond_next121 + br label %bb136 + +bb136: ; preds = %bb127, %cond_next121, %bb90 + %changes.1 = phi i32 [ %changes.2, %bb90 ], [ %changes.2, %cond_next121 ], [ 1, %bb127 ] ; <i32> [#uses=1] + br label %bb139 + +bb139: ; preds = %bb136, %entry + %changes.2 = phi i32 [ %changes.1, %bb136 ], [ 0, %entry ] ; <i32> [#uses=3] + br i1 false, label %bb90, label %bb142 + +bb142: ; preds = %bb139 + %changes.2.lcssa = phi i32 [ %changes.2, %bb139 ] ; <i32> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopRotate/LRCrash-3.ll b/test/Transforms/LoopRotate/LRCrash-3.ll new file mode 100644 index 0000000..e927035 --- /dev/null +++ b/test/Transforms/LoopRotate/LRCrash-3.ll @@ -0,0 +1,41 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-rotate -disable-output + + + + +void @_ZN9Classfile4readEv() { +entry: + br i1 false, label %cond_false485, label %bb405 + +bb405: ; preds = %entry + ret void + +cond_false485: ; preds = %entry + br label %bb830 + +bb511: ; preds = %bb830 + br i1 false, label %bb816, label %bb830 + +cond_next667: ; preds = %bb816 + br i1 false, label %cond_next695, label %bb680 + +bb676: ; preds = %bb680 + br label %bb680 + +bb680: ; preds = %bb676, %cond_next667 + %iftmp.68.0 = zext i1 false to i8 ; <i8> [#uses=1] + br i1 false, label %bb676, label %cond_next695 + +cond_next695: ; preds = %bb680, %cond_next667 + %iftmp.68.2 = phi i8 [ %iftmp.68.0, %bb680 ], [ undef, %cond_next667 ] ; <i8> [#uses=0] + ret void + +bb816: ; preds = %bb816, %bb511 + br i1 false, label %cond_next667, label %bb816 + +bb830: ; preds = %bb511, %cond_false485 + br i1 false, label %bb511, label %bb835 + +bb835: ; preds = %bb830 + ret void +} diff --git a/test/Transforms/LoopRotate/LRCrash-4.ll b/test/Transforms/LoopRotate/LRCrash-4.ll new file mode 100644 index 0000000..721132d --- /dev/null +++ b/test/Transforms/LoopRotate/LRCrash-4.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-rotate -disable-output + + +void @InterpretSEIMessage(i8* %msg) { +entry: + br label %bb15 + +bb6: ; preds = %bb15 + %tmp11 = getelementptr i8* %msg, i32 %offset.1 ; <i8*> [#uses=0] + br label %bb15 + +bb15: ; preds = %bb6, %entry + %offset.1 = add i32 0, 1 ; <i32> [#uses=2] + br i1 false, label %bb6, label %bb17 + +bb17: ; preds = %bb15 + %offset.1.lcssa = phi i32 [ %offset.1, %bb15 ] ; <i32> [#uses=0] + %payload_type.1.lcssa = phi i32 [ 0, %bb15 ] ; <i32> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopRotate/PhiRename-1.ll b/test/Transforms/LoopRotate/PhiRename-1.ll new file mode 100644 index 0000000..573e396 --- /dev/null +++ b/test/Transforms/LoopRotate/PhiRename-1.ll @@ -0,0 +1,95 @@ +; RUN: llvm-as < %s | opt -loop-rotate | llvm-dis | not grep {\\\[ .tmp224} +; END. +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" + + %struct.FILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } + %struct.Index_Map = type { i32, %struct.item_set** } + %struct.Item = type { [4 x i16], %struct.rule* } + %struct.__sFILEX = type opaque + %struct.__sbuf = type { i8*, i32 } + %struct.dimension = type { i16*, %struct.Index_Map, %struct.mapping*, i32, %struct.plankMap* } + %struct.item_set = type { i32, i32, %struct.operator*, [2 x %struct.item_set*], %struct.item_set*, i16*, %struct.Item*, %struct.Item* } + %struct.list = type { i8*, %struct.list* } + %struct.mapping = type { %struct.list**, i32, i32, i32, %struct.item_set** } + %struct.nonterminal = type { i8*, i32, i32, i32, %struct.plankMap*, %struct.rule* } + %struct.operator = type { i8*, i8, i32, i32, i32, i32, %struct.table* } + %struct.pattern = type { %struct.nonterminal*, %struct.operator*, [2 x %struct.nonterminal*] } + %struct.plank = type { i8*, %struct.list*, i32 } + %struct.plankMap = type { %struct.list*, i32, %struct.stateMap* } + %struct.rule = type { [4 x i16], i32, i32, i32, %struct.nonterminal*, %struct.pattern*, i8 } + %struct.stateMap = type { i8*, %struct.plank*, i32, i16* } + %struct.table = type { %struct.operator*, %struct.list*, i16*, [2 x %struct.dimension*], %struct.item_set** } +@outfile = external global %struct.FILE* ; <%struct.FILE**> [#uses=1] +@str1 = external constant [11 x i8] ; <[11 x i8]*> [#uses=1] +@operators = weak global %struct.list* null ; <%struct.list**> [#uses=1] + + + +define i32 @opsOfArity(i32 %arity) { +entry: + %arity_addr = alloca i32 ; <i32*> [#uses=2] + %retval = alloca i32, align 4 ; <i32*> [#uses=2] + %tmp = alloca i32, align 4 ; <i32*> [#uses=2] + %c = alloca i32, align 4 ; <i32*> [#uses=4] + %l = alloca %struct.list*, align 4 ; <%struct.list**> [#uses=5] + %op = alloca %struct.operator*, align 4 ; <%struct.operator**> [#uses=3] + "alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + store i32 %arity, i32* %arity_addr + store i32 0, i32* %c + %tmp1 = load %struct.list** @operators ; <%struct.list*> [#uses=1] + store %struct.list* %tmp1, %struct.list** %l + br label %bb21 + +bb: ; preds = %bb21 + %tmp3 = getelementptr %struct.list* %tmp22, i32 0, i32 0 ; <i8**> [#uses=1] + %tmp4 = load i8** %tmp3 ; <i8*> [#uses=1] + %tmp45 = bitcast i8* %tmp4 to %struct.operator* ; <%struct.operator*> [#uses=1] + store %struct.operator* %tmp45, %struct.operator** %op + %tmp6 = load %struct.operator** %op ; <%struct.operator*> [#uses=1] + %tmp7 = getelementptr %struct.operator* %tmp6, i32 0, i32 5 ; <i32*> [#uses=1] + %tmp8 = load i32* %tmp7 ; <i32> [#uses=1] + %tmp9 = load i32* %arity_addr ; <i32> [#uses=1] + icmp eq i32 %tmp8, %tmp9 ; <i1>:0 [#uses=1] + zext i1 %0 to i8 ; <i8>:1 [#uses=1] + icmp ne i8 %1, 0 ; <i1>:2 [#uses=1] + br i1 %2, label %cond_true, label %cond_next + +cond_true: ; preds = %bb + %tmp10 = load %struct.operator** %op ; <%struct.operator*> [#uses=1] + %tmp11 = getelementptr %struct.operator* %tmp10, i32 0, i32 2 ; <i32*> [#uses=1] + %tmp12 = load i32* %tmp11 ; <i32> [#uses=1] + %tmp13 = load %struct.FILE** @outfile ; <%struct.FILE*> [#uses=1] + %tmp14 = getelementptr [11 x i8]* @str1, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp15 = call i32 (%struct.FILE*, i8*, ...)* @fprintf( %struct.FILE* %tmp13, i8* %tmp14, i32 %tmp12 ) ; <i32> [#uses=0] + %tmp16 = load i32* %c ; <i32> [#uses=1] + %tmp17 = add i32 %tmp16, 1 ; <i32> [#uses=1] + store i32 %tmp17, i32* %c + br label %cond_next + +cond_next: ; preds = %cond_true, %bb + %tmp19 = getelementptr %struct.list* %tmp22, i32 0, i32 1 ; <%struct.list**> [#uses=1] + %tmp20 = load %struct.list** %tmp19 ; <%struct.list*> [#uses=1] + store %struct.list* %tmp20, %struct.list** %l + br label %bb21 + +bb21: ; preds = %cond_next, %entry + %l.in = phi %struct.list** [ @operators, %entry ], [ %tmp19, %cond_next ] ; + %tmp22 = load %struct.list** %l.in ; <%struct.list*> [#uses=1] + icmp ne %struct.list* %tmp22, null ; <i1>:3 [#uses=1] + zext i1 %3 to i8 ; <i8>:4 [#uses=1] + icmp ne i8 %4, 0 ; <i1>:5 [#uses=1] + br i1 %5, label %bb, label %bb23 + +bb23: ; preds = %bb21 + %tmp24 = load i32* %c ; <i32> [#uses=1] + store i32 %tmp24, i32* %tmp + %tmp25 = load i32* %tmp ; <i32> [#uses=1] + store i32 %tmp25, i32* %retval + br label %return + +return: ; preds = %bb23 + %retval26 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval26 +} + +declare i32 @fprintf(%struct.FILE*, i8*, ...) diff --git a/test/Transforms/LoopRotate/PhiSelfRefernce-1.ll b/test/Transforms/LoopRotate/PhiSelfRefernce-1.ll new file mode 100644 index 0000000..a55704b --- /dev/null +++ b/test/Transforms/LoopRotate/PhiSelfRefernce-1.ll @@ -0,0 +1,39 @@ +; RUN: llvm-as < %s | opt -loop-rotate -disable-output +; ModuleID = 'PhiSelfRefernce-1.bc' + +define void @snrm2(i32 %incx) { +entry: + br i1 false, label %START, label %return + +START: ; preds = %entry + br i1 false, label %bb85, label %cond_false93 + +bb52: ; preds = %bb85 + br i1 false, label %bb307, label %cond_next71 + +cond_next71: ; preds = %bb52 + ret void + +bb85: ; preds = %START + br i1 false, label %bb52, label %bb88 + +bb88: ; preds = %bb85 + ret void + +cond_false93: ; preds = %START + ret void + +bb243: ; preds = %bb307 + br label %bb307 + +bb307: ; preds = %bb243, %bb52 + %sx_addr.2.pn = phi float* [ %sx_addr.5, %bb243 ], [ null, %bb52 ] ; <float*> [#uses=1] + %sx_addr.5 = getelementptr float* %sx_addr.2.pn, i32 %incx ; <float*> [#uses=1] + br i1 false, label %bb243, label %bb310 + +bb310: ; preds = %bb307 + ret void + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/LoopRotate/dg.exp b/test/Transforms/LoopRotate/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LoopRotate/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LoopRotate/pr1154.ll b/test/Transforms/LoopRotate/pr1154.ll new file mode 100644 index 0000000..09c9405 --- /dev/null +++ b/test/Transforms/LoopRotate/pr1154.ll @@ -0,0 +1,128 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -std-compile-opts | llvm-dis | \ +; RUN: %prcontext strstr 2 | grep -v declare | grep bb36.outer: +; END. + +@str = internal constant [68 x i8] c"Dot. date. datum. 123. Some more doubtful demonstration dummy data.\00" ; <[68 x i8]*> [#uses=1] +@str1 = internal constant [5 x i8] c"ummy\00" ; <[5 x i8]*> [#uses=1] +@str2 = internal constant [6 x i8] c" data\00" ; <[6 x i8]*> [#uses=1] +@str3 = internal constant [3 x i8] c"by\00" ; <[3 x i8]*> [#uses=1] + +i32 @stringSearch_Clib(i32 %count) { +entry: + %count_addr = alloca i32 ; <i32*> [#uses=2] + %retval = alloca i32, align 4 ; <i32*> [#uses=2] + %tmp = alloca i32, align 4 ; <i32*> [#uses=2] + %i = alloca i32, align 4 ; <i32*> [#uses=5] + %c = alloca i32, align 4 ; <i32*> [#uses=9] + %j = alloca i32, align 4 ; <i32*> [#uses=4] + %p = alloca i8*, align 4 ; <i8**> [#uses=6] + %b = alloca [68 x i8], align 16 ; <[68 x i8]*> [#uses=6] + "alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] + store i32 %count, i32* %count_addr + store i32 0, i32* %c + %b1 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %tmp2 = getelementptr [68 x i8]* @str, i32 0, i32 0 ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %b1, i8* %tmp2, i32 68, i32 1 ) + store i32 0, i32* %j + br label %bb41 + +bb: ; preds = %bb41 + store i32 0, i32* %i + %tmp3 = load i32* %i ; <i32> [#uses=1] + store i32 %tmp3, i32* %c + br label %bb36 + +bb4: ; preds = %bb36 + %b5 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %tmp6 = getelementptr [5 x i8]* @str1, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp7 = call i8* @strstr( i8* %b5, i8* %tmp6 ) ; <i8*> [#uses=1] + store i8* %tmp7, i8** %p + %tmp8 = load i8** %p ; <i8*> [#uses=1] + %ttmp8 = icmp ne i8* %tmp8, null ; <i1>:0 [#uses=1] + %ttmp10 = zext i1 %ttmp8 to i8 ; <i8>:1 [#uses=1] + %ttmp7 = icmp ne i8 %ttmp10, 0 ; <i1>:2 [#uses=1] + br i1 %ttmp7, label %cond_true, label %cond_next + +cond_true: ; preds = %bb4 + %tmp9 = load i8** %p ; <i8*> [#uses=1] + %tmp910 = ptrtoint i8* %tmp9 to i32 ; <i32> [#uses=1] + %b11 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %b1112 = ptrtoint i8* %b11 to i32 ; <i32> [#uses=1] + %tmp13 = sub i32 %tmp910, %b1112 ; <i32> [#uses=1] + %tmp14 = load i32* %c ; <i32> [#uses=1] + %tmp15 = add i32 %tmp13, %tmp14 ; <i32> [#uses=1] + store i32 %tmp15, i32* %c + br label %cond_next + +cond_next: ; preds = %cond_true, %bb4 + %b16 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %tmp17 = getelementptr [6 x i8]* @str2, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp18 = call i8* @strstr( i8* %b16, i8* %tmp17 ) ; <i8*> [#uses=1] + store i8* %tmp18, i8** %p + %tmp19 = load i8** %p ; <i8*> [#uses=1] + %ttmp6 = icmp ne i8* %tmp19, null ; <i1>:3 [#uses=1] + %ttmp9 = zext i1 %ttmp6 to i8 ; <i8>:4 [#uses=1] + %ttmp4 = icmp ne i8 %ttmp9, 0 ; <i1>:5 [#uses=1] + br i1 %ttmp4, label %cond_true20, label %cond_next28 + +cond_true20: ; preds = %cond_next + %tmp21 = load i8** %p ; <i8*> [#uses=1] + %tmp2122 = ptrtoint i8* %tmp21 to i32 ; <i32> [#uses=1] + %b23 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %b2324 = ptrtoint i8* %b23 to i32 ; <i32> [#uses=1] + %tmp25 = sub i32 %tmp2122, %b2324 ; <i32> [#uses=1] + %tmp26 = load i32* %c ; <i32> [#uses=1] + %tmp27 = add i32 %tmp25, %tmp26 ; <i32> [#uses=1] + store i32 %tmp27, i32* %c + br label %cond_next28 + +cond_next28: ; preds = %cond_true20, %cond_next + %b29 = bitcast [68 x i8]* %b to i8* ; <i8*> [#uses=1] + %tmp30 = getelementptr [3 x i8]* @str3, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp31 = call i32 @strcspn( i8* %b29, i8* %tmp30 ) ; <i32> [#uses=1] + %tmp32 = load i32* %c ; <i32> [#uses=1] + %tmp33 = add i32 %tmp31, %tmp32 ; <i32> [#uses=1] + store i32 %tmp33, i32* %c + %tmp34 = load i32* %i ; <i32> [#uses=1] + %tmp35 = add i32 %tmp34, 1 ; <i32> [#uses=1] + store i32 %tmp35, i32* %i + br label %bb36 + +bb36: ; preds = %cond_next28, %bb + %tmp37 = load i32* %i ; <i32> [#uses=1] + %ttmp3= icmp sle i32 %tmp37, 249 ; <i1>:6 [#uses=1] + %ttmp12 = zext i1 %ttmp3 to i8 ; <i8>:7 [#uses=1] + %ttmp1 = icmp ne i8 %ttmp12, 0 ; <i1>:8 [#uses=1] + br i1 %ttmp1, label %bb4, label %bb38 + +bb38: ; preds = %bb36 + %tmp39 = load i32* %j ; <i32> [#uses=1] + %tmp40 = add i32 %tmp39, 1 ; <i32> [#uses=1] + store i32 %tmp40, i32* %j + br label %bb41 + +bb41: ; preds = %bb38, %entry + %tmp42 = load i32* %j ; <i32> [#uses=1] + %tmp43 = load i32* %count_addr ; <i32> [#uses=1] + %ttmp2 = icmp slt i32 %tmp42, %tmp43 ; <i1>:9 [#uses=1] + %ttmp11 = zext i1 %ttmp2 to i8 ; <i8>:10 [#uses=1] + %ttmp5 = icmp ne i8 %ttmp11, 0 ; <i1>:11 [#uses=1] + br i1 %ttmp5, label %bb, label %bb44 + +bb44: ; preds = %bb41 + %tmp45 = load i32* %c ; <i32> [#uses=1] + store i32 %tmp45, i32* %tmp + %tmp46 = load i32* %tmp ; <i32> [#uses=1] + store i32 %tmp46, i32* %retval + br label %return + +return: ; preds = %bb44 + %retval47 = load i32* %retval ; <i32> [#uses=1] + ret i32 %retval47 +} + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +declare i8* @strstr(i8*, i8*) + +declare i32 @strcspn(i8*, i8*) diff --git a/test/Transforms/LoopSimplify/2003-04-25-AssertFail.ll b/test/Transforms/LoopSimplify/2003-04-25-AssertFail.ll new file mode 100644 index 0000000..90de721 --- /dev/null +++ b/test/Transforms/LoopSimplify/2003-04-25-AssertFail.ll @@ -0,0 +1,25 @@ +; This testcase exposed a problem with the loop identification pass (LoopInfo). +; Basically, it was incorrectly calculating the loop nesting information. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify + +implementation ; Functions: + +int %yylex() { ; No predecessors! + br label %loopentry.0 + +loopentry.0: ; preds = %0, %yy_find_action, %else.4 + br label %loopexit.2 + +loopexit.2: ; preds = %loopentry.0, %else.4, %loopexit.2 + br bool false, label %loopexit.2, label %else.4 + +yy_find_action: ; preds = %loopexit.2, %else.4 + br label %else.4 + +else.4: ; preds = %yy_find_action + switch uint 0, label %loopexit.2 [ + uint 2, label %yy_find_action + uint 0, label %loopentry.0 + ] +} diff --git a/test/Transforms/LoopSimplify/2003-05-12-PreheaderExitOfChild.ll b/test/Transforms/LoopSimplify/2003-05-12-PreheaderExitOfChild.ll new file mode 100644 index 0000000..0880da6 --- /dev/null +++ b/test/Transforms/LoopSimplify/2003-05-12-PreheaderExitOfChild.ll @@ -0,0 +1,57 @@ +; This (complex) testcase causes an assertion failure because a preheader is +; inserted for the "fail" loop, but the exit block of a loop is not updated +; to be the preheader instead of the exit loop itself. + +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify + +int %re_match_2() { + br label %loopentry.1 + +loopentry.1: ; preds = %then.6, %endif.7, %loopexit.20, %endif.83 + br label %shortcirc_done.36 + +shortcirc_done.36: ; preds = %label.13, %shortcirc_next.36 + br bool false, label %fail, label %endif.40 + +endif.40: ; preds = %shortcirc_done.36 + br label %loopexit.20 + +loopentry.20: ; preds = %shortcirc_done.40, %endif.46 + br label %loopexit.20 + +loopexit.20: ; preds = %loopentry.20 + br label %loopentry.21 + +loopentry.21: ; preds = %loopexit.20, %no_exit.19 + br bool false, label %no_exit.19, label %loopexit.21 + +no_exit.19: ; preds = %loopentry.21 + br bool false, label %fail, label %loopentry.21 + +loopexit.21: ; preds = %loopentry.21 + br label %endif.45 + +endif.45: ; preds = %loopexit.21 + br label %cond_true.15 + +cond_true.15: ; preds = %endif.45 + br bool false, label %fail, label %endif.46 + +endif.46: ; preds = %cond_true.15 + br label %loopentry.20 + +fail: ; preds = %shortcirc_done.36, %loopexit.37, %cond_true.15, %no_exit.19 + br label %then.80 + +then.80: ; preds = %fail + br label %endif.81 + +endif.81: ; preds = %then.80 + br label %loopexit.37 + +loopexit.37: ; preds = %endif.81 + br bool false, label %fail, label %endif.82 + +endif.82: ; preds = %loopexit.37 + br label %loopentry.1 +} diff --git a/test/Transforms/LoopSimplify/2003-08-15-PreheadersFail.ll b/test/Transforms/LoopSimplify/2003-08-15-PreheadersFail.ll new file mode 100644 index 0000000..59f49e3 --- /dev/null +++ b/test/Transforms/LoopSimplify/2003-08-15-PreheadersFail.ll @@ -0,0 +1,65 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -instcombine -simplifycfg -licm -disable-output + +target endian = little +target pointersize = 32 +%yy_base = external global [787 x short] ; <[787 x short]*> [#uses=1] +%yy_state_ptr = external global int* ; <int**> [#uses=3] +%yy_state_buf = external global [16386 x int] ; <[16386 x int]*> [#uses=1] +%yy_lp = external global int ; <int*> [#uses=1] + +implementation ; Functions: + +int %_yylex() { ; No predecessors! + br label %loopentry.0 + +loopentry.0: ; preds = %0, %else.26 + store int* getelementptr ([16386 x int]* %yy_state_buf, long 0, long 0), int** %yy_state_ptr + %tmp.35 = load int** %yy_state_ptr ; <int*> [#uses=2] + %inc.0 = getelementptr int* %tmp.35, long 1 ; <int*> [#uses=1] + store int* %inc.0, int** %yy_state_ptr + %tmp.36 = load int* null ; <int> [#uses=1] + store int %tmp.36, int* %tmp.35 + br label %loopexit.2 + +loopexit.2: ; preds = %loopentry.0, %else.26, %loopexit.2 + store sbyte* null, sbyte** null + %tmp.91 = load int* null ; <int> [#uses=1] + %tmp.92 = cast int %tmp.91 to long ; <long> [#uses=1] + %tmp.93 = getelementptr [787 x short]* %yy_base, long 0, long %tmp.92 ; <short*> [#uses=1] + %tmp.94 = load short* %tmp.93 ; <short> [#uses=1] + %tmp.95 = setne short %tmp.94, 4394 ; <bool> [#uses=1] + br bool %tmp.95, label %loopexit.2, label %yy_find_action + +yy_find_action: ; preds = %loopexit.2, %else.26 + br label %loopentry.3 + +loopentry.3: ; preds = %yy_find_action, %shortcirc_done.0, %then.9 + %tmp.105 = load int* %yy_lp ; <int> [#uses=1] + %tmp.106 = setne int %tmp.105, 0 ; <bool> [#uses=1] + br bool %tmp.106, label %shortcirc_next.0, label %shortcirc_done.0 + +shortcirc_next.0: ; preds = %loopentry.3 + %tmp.114 = load short* null ; <short> [#uses=1] + %tmp.115 = cast short %tmp.114 to int ; <int> [#uses=1] + %tmp.116 = setlt int 0, %tmp.115 ; <bool> [#uses=1] + br label %shortcirc_done.0 + +shortcirc_done.0: ; preds = %loopentry.3, %shortcirc_next.0 + %shortcirc_val.0 = phi bool [ false, %loopentry.3 ], [ %tmp.116, %shortcirc_next.0 ] ; <bool> [#uses=1] + br bool %shortcirc_val.0, label %else.0, label %loopentry.3 + +else.0: ; preds = %shortcirc_done.0 + %tmp.144 = load int* null ; <int> [#uses=1] + %tmp.145 = and int %tmp.144, 8192 ; <int> [#uses=1] + %tmp.146 = setne int %tmp.145, 0 ; <bool> [#uses=1] + br bool %tmp.146, label %then.9, label %else.26 + +then.9: ; preds = %else.0 + br label %loopentry.3 + +else.26: ; preds = %else.1 + switch uint 0, label %loopentry.0 [ + uint 2, label %yy_find_action + uint 0, label %loopexit.2 + ] +} diff --git a/test/Transforms/LoopSimplify/2003-12-10-ExitBlocksProblem.ll b/test/Transforms/LoopSimplify/2003-12-10-ExitBlocksProblem.ll new file mode 100644 index 0000000..e47112b --- /dev/null +++ b/test/Transforms/LoopSimplify/2003-12-10-ExitBlocksProblem.ll @@ -0,0 +1,42 @@ +; LoopSimplify is breaking LICM on this testcase because the exit blocks from +; the loop are reachable from more than just the exit nodes: the exit blocks +; have predecessors from outside of the loop! +; +; This is distilled from a monsterous crafty example. + +; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output + +%G = weak global int 0 ; <int*> [#uses=13] + +implementation ; Functions: + +int %main() { +entry: + store int 123, int* %G + br label %loopentry.i + +loopentry.i: ; preds = %entry, %endif.1.i + %tmp.0.i = load int* %G ; <int> [#uses=1] + %tmp.1.i = seteq int %tmp.0.i, 123 ; <bool> [#uses=1] + br bool %tmp.1.i, label %Out.i, label %endif.0.i + +endif.0.i: ; preds = %loopentry.i + %tmp.3.i = load int* %G ; <int> [#uses=1] + %tmp.4.i = seteq int %tmp.3.i, 126 ; <bool> [#uses=1] + br bool %tmp.4.i, label %ExitBlock.i, label %endif.1.i + +endif.1.i: ; preds = %endif.0.i + %tmp.6.i = load int* %G ; <int> [#uses=1] + %inc.i = add int %tmp.6.i, 1 ; <int> [#uses=1] + store int %inc.i, int* %G + br label %loopentry.i + +Out.i: ; preds = %loopentry.i + store int 0, int* %G + br label %ExitBlock.i + +ExitBlock.i: ; preds = %endif.0.i, %Out.i + %tmp.7.i = load int* %G ; <int> [#uses=1] + ret int %tmp.7.i +} + diff --git a/test/Transforms/LoopSimplify/2004-02-05-DominatorInfoCorruption.ll b/test/Transforms/LoopSimplify/2004-02-05-DominatorInfoCorruption.ll new file mode 100644 index 0000000..f25460e --- /dev/null +++ b/test/Transforms/LoopSimplify/2004-02-05-DominatorInfoCorruption.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify -verify -licm -disable-output +implementation ; Functions: + +void %.subst_48() { +entry: + br label %loopentry.0 + +loopentry.0: ; preds = %entry, %loopentry.0 + br bool false, label %loopentry.0, label %loopentry.2 + +loopentry.2: ; preds = %loopentry.0, %loopentry.2 + %tmp.968 = setle int 0, 3 ; <bool> [#uses=1] + br bool %tmp.968, label %loopentry.2, label %UnifiedReturnBlock + +UnifiedReturnBlock: ; preds = %entry, %loopentry.2 + ret void +} diff --git a/test/Transforms/LoopSimplify/2004-03-15-IncorrectDomUpdate.ll b/test/Transforms/LoopSimplify/2004-03-15-IncorrectDomUpdate.ll new file mode 100644 index 0000000..607f1fe --- /dev/null +++ b/test/Transforms/LoopSimplify/2004-03-15-IncorrectDomUpdate.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify -licm -disable-output +void %main() { +entry: + br bool false, label %Out, label %loop + +loop: + %LI = setgt int 0, 0 + br bool %LI, label %loop, label %Out + +Out: + ret void +} diff --git a/test/Transforms/LoopSimplify/2004-04-01-IncorrectDomUpdate.ll b/test/Transforms/LoopSimplify/2004-04-01-IncorrectDomUpdate.ll new file mode 100644 index 0000000..b984313 --- /dev/null +++ b/test/Transforms/LoopSimplify/2004-04-01-IncorrectDomUpdate.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify -licm -disable-output + +; This is PR306 + +void %NormalizeCoeffsVecFFE() { +entry: + br label %loopentry.0 + +loopentry.0: ; preds = %entry, %no_exit.0 + br bool false, label %loopentry.1, label %no_exit.0 + +no_exit.0: ; preds = %loopentry.0 + br bool false, label %loopentry.0, label %loopentry.1 + +loopentry.1: ; preds = %loopentry.0, %no_exit.0, %no_exit.1 + br bool false, label %no_exit.1, label %loopexit.1 + +no_exit.1: ; preds = %loopentry.1 + %tmp.43 = seteq ushort 0, 0 ; <bool> [#uses=1] + br bool %tmp.43, label %loopentry.1, label %loopexit.1 + +loopexit.1: ; preds = %loopentry.1, %no_exit.1 + ret void +} diff --git a/test/Transforms/LoopSimplify/2004-04-12-LoopSimplify-SwitchBackedges.ll b/test/Transforms/LoopSimplify/2004-04-12-LoopSimplify-SwitchBackedges.ll new file mode 100644 index 0000000..12250b7 --- /dev/null +++ b/test/Transforms/LoopSimplify/2004-04-12-LoopSimplify-SwitchBackedges.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify -disable-output + +implementation + +void %test() { +loopentry.0: + br label %loopentry.1 + +loopentry.1: + %pixel.4 = phi int [ 0, %loopentry.0 ], [ %pixel.4, %loopentry.1], [ %tmp.370, %then.6 ], [ %tmp.370, %then.6 ] + br bool false, label %then.6, label %loopentry.1 + +then.6: + %tmp.370 = add int 0, 0 ; <int> [#uses=2] + switch uint 0, label %label.7 [ + uint 6408, label %loopentry.1 + uint 32841, label %loopentry.1 + ] + +label.7: ; preds = %then.6 + ret void +} diff --git a/test/Transforms/LoopSimplify/2004-04-13-LoopSimplifyUpdateDomFrontier.ll b/test/Transforms/LoopSimplify/2004-04-13-LoopSimplifyUpdateDomFrontier.ll new file mode 100644 index 0000000..7f16400 --- /dev/null +++ b/test/Transforms/LoopSimplify/2004-04-13-LoopSimplifyUpdateDomFrontier.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -loopsimplify -licm -disable-output + +implementation ; Functions: + +void %inflate() { +entry: + br label %loopentry.0.outer1111 + +loopentry.0.outer1111: ; preds = %entry, %loopentry.0.outer1111, %label.11, %then.41 + %left.0.ph1107 = phi uint [ %tmp.1172, %then.41 ], [ 0, %entry ], [ %tmp.1172, %label.11 ], [ %left.0.ph1107, %loopentry.0.outer1111 ] ; <uint> [#uses=2] + %tmp.1172 = sub uint %left.0.ph1107, 0 ; <uint> [#uses=2] + switch uint 0, label %label.11 [ + uint 23, label %loopentry.0.outer1111 + uint 13, label %then.41 + ] + +label.11: ; preds = %loopentry.0.outer1111 + br label %loopentry.0.outer1111 + +then.41: ; preds = %loopentry.0.outer1111 + br label %loopentry.0.outer1111 +} diff --git a/test/Transforms/LoopSimplify/basictest.ll b/test/Transforms/LoopSimplify/basictest.ll new file mode 100644 index 0000000..2b01b47 --- /dev/null +++ b/test/Transforms/LoopSimplify/basictest.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify + +implementation + +; This function should get a preheader inserted before BB3, that is jumped +; to by BB1 & BB2 +; +void "test"() +begin + br bool true, label %BB1, label %BB2 +BB1: br label %BB3 +BB2: br label %BB3 + + +BB3: + br label %BB3 +end diff --git a/test/Transforms/LoopSimplify/dg.exp b/test/Transforms/LoopSimplify/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LoopSimplify/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LoopSimplify/hardertest.ll b/test/Transforms/LoopSimplify/hardertest.ll new file mode 100644 index 0000000..a4465b7 --- /dev/null +++ b/test/Transforms/LoopSimplify/hardertest.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify + +void %foo(bool %C) { + br bool %C, label %T, label %F +T: + br label %Loop +F: + br label %Loop + +Loop: ; Two backedges, two incoming edges. + %Val = phi int [0, %T], [1, %F], [2, %Loop], [3, %L2] + + br bool %C, label %Loop, label %L2 + +L2: + br label %Loop +} diff --git a/test/Transforms/LoopSimplify/phi-node-simplify.ll b/test/Transforms/LoopSimplify/phi-node-simplify.ll new file mode 100644 index 0000000..aa52d66 --- /dev/null +++ b/test/Transforms/LoopSimplify/phi-node-simplify.ll @@ -0,0 +1,59 @@ +; Loop Simplify should turn phi nodes like X = phi [X, Y] into just Y, eliminating them. +; RUN: llvm-upgrade < %s | llvm-as | opt -loopsimplify | llvm-dis | grep phi | wc -l | grep 6 + +%A = weak global [3000000 x int] zeroinitializer ; <[3000000 x int]*> [#uses=1] +%B = weak global [20000 x int] zeroinitializer ; <[20000 x int]*> [#uses=1] +%C = weak global [100 x int] zeroinitializer ; <[100 x int]*> [#uses=1] +%Z = weak global int 0 ; <int*> [#uses=2] + +implementation ; Functions: + +int %main() { +entry: + tail call void %__main( ) + br label %loopentry.1 + +loopentry.1: ; preds = %loopexit.1, %entry + %indvar20 = phi uint [ 0, %entry ], [ %indvar.next21, %loopexit.1 ] ; <uint> [#uses=1] + %a.1 = phi int* [ getelementptr ([3000000 x int]* %A, int 0, int 0), %entry ], [ %inc.0, %loopexit.1 ] ; <int*> [#uses=1] + br label %no_exit.2 + +no_exit.2: ; preds = %loopexit.2, %no_exit.2, %loopentry.1 + %a.0.4.ph = phi int* [ %a.1, %loopentry.1 ], [ %inc.0, %loopexit.2 ], [ %a.0.4.ph, %no_exit.2 ] ; <int*> [#uses=3] + %b.1.4.ph = phi int* [ getelementptr ([20000 x int]* %B, int 0, int 0), %loopentry.1 ], [ %inc.1, %loopexit.2 ], [ %b.1.4.ph, %no_exit.2 ] ; <int*> [#uses=3] + %indvar17 = phi uint [ 0, %loopentry.1 ], [ %indvar.next18, %loopexit.2 ], [ %indvar17, %no_exit.2 ] ; <uint> [#uses=2] + %indvar = phi uint [ %indvar.next, %no_exit.2 ], [ 0, %loopexit.2 ], [ 0, %loopentry.1 ] ; <uint> [#uses=5] + %b.1.4.rec = cast uint %indvar to int ; <int> [#uses=1] + %c.2.4 = getelementptr [100 x int]* %C, int 0, uint %indvar ; <int*> [#uses=1] + %a.0.4 = getelementptr int* %a.0.4.ph, uint %indvar ; <int*> [#uses=1] + %b.1.4 = getelementptr int* %b.1.4.ph, uint %indvar ; <int*> [#uses=1] + %inc.0.rec = add int %b.1.4.rec, 1 ; <int> [#uses=2] + %inc.0 = getelementptr int* %a.0.4.ph, int %inc.0.rec ; <int*> [#uses=2] + %tmp.13 = load int* %a.0.4 ; <int> [#uses=1] + %inc.1 = getelementptr int* %b.1.4.ph, int %inc.0.rec ; <int*> [#uses=1] + %tmp.15 = load int* %b.1.4 ; <int> [#uses=1] + %tmp.18 = load int* %c.2.4 ; <int> [#uses=1] + %tmp.16 = mul int %tmp.15, %tmp.13 ; <int> [#uses=1] + %tmp.19 = mul int %tmp.16, %tmp.18 ; <int> [#uses=1] + %tmp.20 = load int* %Z ; <int> [#uses=1] + %tmp.21 = add int %tmp.19, %tmp.20 ; <int> [#uses=1] + store int %tmp.21, int* %Z + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=2] + %exitcond = seteq uint %indvar.next, 100 ; <bool> [#uses=1] + br bool %exitcond, label %loopexit.2, label %no_exit.2 + +loopexit.2: ; preds = %no_exit.2 + %indvar.next18 = add uint %indvar17, 1 ; <uint> [#uses=2] + %exitcond19 = seteq uint %indvar.next18, 200 ; <bool> [#uses=1] + br bool %exitcond19, label %loopexit.1, label %no_exit.2 + +loopexit.1: ; preds = %loopexit.2 + %indvar.next21 = add uint %indvar20, 1 ; <uint> [#uses=2] + %exitcond22 = seteq uint %indvar.next21, 300 ; <bool> [#uses=1] + br bool %exitcond22, label %return, label %loopentry.1 + +return: ; preds = %loopexit.1 + ret int undef +} + +declare void %__main() diff --git a/test/Transforms/LoopSimplify/single-backedge.ll b/test/Transforms/LoopSimplify/single-backedge.ll new file mode 100644 index 0000000..53a6ffb --- /dev/null +++ b/test/Transforms/LoopSimplify/single-backedge.ll @@ -0,0 +1,17 @@ +; The loop canonicalization pass should guarantee that there is one backedge +; for all loops. This allows the -indvars pass to recognize the %IV +; induction variable in this testcase. + +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars | llvm-dis | grep indvar + +int %test(bool %C) { + br label %Loop +Loop: + %IV = phi uint [1, %0], [%IV2, %BE1], [%IV2, %BE2] + %IV2 = add uint %IV, 2 + br bool %C, label %BE1, label %BE2 +BE1: + br label %Loop +BE2: + br label %Loop +} diff --git a/test/Transforms/LoopStrengthReduce/2005-08-15-AddRecIV.ll b/test/Transforms/LoopStrengthReduce/2005-08-15-AddRecIV.ll new file mode 100644 index 0000000..b210405 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2005-08-15-AddRecIV.ll @@ -0,0 +1,77 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output + +void %try_swap() { +entry: + br bool false, label %cond_continue.0.i, label %cond_false.0.i + +cond_false.0.i: ; preds = %entry + ret void + +cond_continue.0.i: ; preds = %entry + br bool false, label %cond_continue.1.i, label %cond_false.1.i + +cond_false.1.i: ; preds = %cond_continue.0.i + ret void + +cond_continue.1.i: ; preds = %cond_continue.0.i + br bool false, label %endif.3.i, label %else.0.i + +endif.3.i: ; preds = %cond_continue.1.i + br bool false, label %my_irand.exit82, label %endif.0.i62 + +else.0.i: ; preds = %cond_continue.1.i + ret void + +endif.0.i62: ; preds = %endif.3.i + ret void + +my_irand.exit82: ; preds = %endif.3.i + br bool false, label %else.2, label %then.4 + +then.4: ; preds = %my_irand.exit82 + ret void + +else.2: ; preds = %my_irand.exit82 + br bool false, label %find_affected_nets.exit, label %loopentry.1.i107.outer.preheader + +loopentry.1.i107.outer.preheader: ; preds = %else.2 + ret void + +find_affected_nets.exit: ; preds = %else.2 + br bool false, label %save_region_occ.exit, label %loopentry.1 + +save_region_occ.exit: ; preds = %find_affected_nets.exit + br bool false, label %no_exit.1.preheader, label %loopexit.1 + +loopentry.1: ; preds = %find_affected_nets.exit + ret void + +no_exit.1.preheader: ; preds = %save_region_occ.exit + ret void + +loopexit.1: ; preds = %save_region_occ.exit + br bool false, label %then.10, label %loopentry.3 + +then.10: ; preds = %loopexit.1 + ret void + +loopentry.3: ; preds = %endif.16, %loopexit.1 + %indvar342 = phi uint [ %indvar.next343, %endif.16 ], [ 0, %loopexit.1 ] ; <uint> [#uses=2] + br bool false, label %loopexit.3, label %endif.16 + +endif.16: ; preds = %loopentry.3 + %indvar.next343 = add uint %indvar342, 1 ; <uint> [#uses=1] + br label %loopentry.3 + +loopexit.3: ; preds = %loopentry.3 + br label %loopentry.4 + +loopentry.4: ; preds = %loopentry.4, %loopexit.3 + %indvar340 = phi uint [ 0, %loopexit.3 ], [ %indvar.next341, %loopentry.4 ] ; <uint> [#uses=2] + %tmp. = add uint %indvar340, %indvar342 ; <uint> [#uses=1] + %tmp.526 = load int** null ; <int*> [#uses=1] + %tmp.528 = getelementptr int* %tmp.526, uint %tmp. ; <int*> [#uses=1] + store int 0, int* %tmp.528 + %indvar.next341 = add uint %indvar340, 1 ; <uint> [#uses=1] + br label %loopentry.4 +} diff --git a/test/Transforms/LoopStrengthReduce/2005-08-17-OutOfLoopVariant.ll b/test/Transforms/LoopStrengthReduce/2005-08-17-OutOfLoopVariant.ll new file mode 100644 index 0000000..5724bad --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2005-08-17-OutOfLoopVariant.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output + +int %image_to_texture(uint %indvar454) { +loopentry.1.outer: + %j.2.1.ph = cast uint %indvar454 to int ; <int> [#uses=1] + br label %loopentry.1 + +loopentry.1: ; preds = %label.5, %loopentry.1.outer + %i.3 = phi int [ 0, %loopentry.1.outer ], [ %i.3.be, %loopentry.1 ] + %tmp.390 = load int* null ; <int> [#uses=1] + %tmp.392 = mul int %tmp.390, %j.2.1.ph ; <int> [#uses=1] + %tmp.394 = add int %tmp.392, %i.3 ; <int> [#uses=1] + %i.3.be = add int %i.3, 1 ; <int> [#uses=1] + br bool false, label %loopentry.1, label %label.6 + +label.6: ; preds = %no_exit.1 + ret int %tmp.394 +} diff --git a/test/Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll b/test/Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll new file mode 100644 index 0000000..81d3c25 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll @@ -0,0 +1,43 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output + +void %main() { +entry: + br label %loopentry.0 + +loopentry.0: ; preds = %then.5, %entry + %arg_index.1.ph = phi int [ 1, %entry ], [ %arg_index.1.ph.be, %then.5 ] ; <int> [#uses=1] + br bool false, label %no_exit.0, label %loopexit.0 + +no_exit.0: ; preds = %loopentry.0 + %arg_index.1.1 = add int 0, %arg_index.1.ph ; <int> [#uses=2] + br bool false, label %then.i55, label %endif.i61 + +then.i55: ; preds = %no_exit.0 + br bool false, label %then.4, label %else.1 + +endif.i61: ; preds = %no_exit.0 + ret void + +then.4: ; preds = %then.i55 + %tmp.19993 = add int %arg_index.1.1, 2 ; <int> [#uses=0] + ret void + +else.1: ; preds = %then.i55 + br bool false, label %then.i86, label %loopexit.i97 + +then.i86: ; preds = %else.1 + ret void + +loopexit.i97: ; preds = %else.1 + br bool false, label %then.5, label %else.2 + +then.5: ; preds = %loopexit.i97 + %arg_index.1.ph.be = add int %arg_index.1.1, 2 ; <int> [#uses=1] + br label %loopentry.0 + +else.2: ; preds = %loopexit.i97 + ret void + +loopexit.0: ; preds = %loopentry.0 + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll b/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll new file mode 100644 index 0000000..2d2dade --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll @@ -0,0 +1,71 @@ +; RUN: llvm-as < %s | opt -loop-reduce -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-apple-darwin9" + +define i8* @foo( i8* %ABC) { +entry: + switch i8 0, label %bb129 [ + i8 0, label %UnifiedReturnBlock + i8 9, label %UnifiedReturnBlock + i8 32, label %UnifiedReturnBlock + i8 35, label %UnifiedReturnBlock + i8 37, label %bb16.preheader + ] + +bb16.preheader: ; preds = %entry + br label %bb16 + +bb16: ; preds = %cond_next102, %bb16.preheader + %indvar = phi i32 [ %indvar.next, %cond_next102 ], [ 0, %bb16.preheader ] ; <i32> [#uses=2] + %ABC.2146.0.rec = mul i32 %indvar, 3 ; <i32> [#uses=1] + br i1 false, label %UnifiedReturnBlock.loopexit, label %cond_next102 + +cond_next102: ; preds = %bb16 + %tmp138145.rec = add i32 %ABC.2146.0.rec, 3 ; <i32> [#uses=1] + %tmp138145 = getelementptr i8* %ABC, i32 %tmp138145.rec ; <i8*> [#uses=4] + %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1] + switch i8 0, label %bb129.loopexit [ + i8 0, label %UnifiedReturnBlock.loopexit + i8 9, label %UnifiedReturnBlock.loopexit + i8 32, label %UnifiedReturnBlock.loopexit + i8 35, label %UnifiedReturnBlock.loopexit + i8 37, label %bb16 + ] + +bb129.loopexit: ; preds = %cond_next102 + br label %bb129 + +bb129: ; preds = %bb129.loopexit, %entry + ret i8* null + +UnifiedReturnBlock.loopexit: ; preds = %cond_next102, %cond_next102, %cond_next102, %cond_next102, %bb16 + %UnifiedRetVal.ph = phi i8* [ %tmp138145, %cond_next102 ], [ %tmp138145, %cond_next102 ], [ %tmp138145, %cond_next102 ], [ %tmp138145, %cond_next102 ], [ null, %bb16 ] ; <i8*> [#uses=0] + br label %UnifiedReturnBlock + +UnifiedReturnBlock: ; preds = %UnifiedReturnBlock.loopexit, %entry, %entry, %entry, %entry + ret i8* null +} + +define i8* @bar() { +entry: + switch i8 0, label %bb158 [ + i8 37, label %bb74 + i8 58, label %cond_true + i8 64, label %bb11 + ] + +bb11: ; preds = %entry + ret i8* null + +cond_true: ; preds = %entry + ret i8* null + +bb74: ; preds = %entry + ret i8* null + +bb158: ; preds = %entry + ret i8* null +} + diff --git a/test/Transforms/LoopStrengthReduce/dg.exp b/test/Transforms/LoopStrengthReduce/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LoopStrengthReduce/different-type-ivs.ll b/test/Transforms/LoopStrengthReduce/different-type-ivs.ll new file mode 100644 index 0000000..1383fd6 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/different-type-ivs.ll @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output +; Test to make sure that loop-reduce never crashes on IV's +; with different types but identical strides. + +void %foo() { +entry: + br label %no_exit + +no_exit: ; preds = %no_exit, %entry + %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ] ; <uint> [#uses=3] + %indvar = cast uint %indvar to short ; <short> [#uses=1] + %X.0.0 = mul short %indvar, 1234 ; <short> [#uses=1] + %tmp. = mul uint %indvar, 1234 ; <uint> [#uses=1] + %tmp.5 = cast short %X.0.0 to int ; <int> [#uses=1] + %tmp.3 = call int (...)* %bar( int %tmp.5, uint %tmp. ) ; <int> [#uses=0] + %tmp.0 = call bool %pred( ) ; <int> [#uses=1] + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] + br bool %tmp.0, label %return, label %no_exit + +return: + ret void +} + +declare bool %pred() + +declare int %bar(...) diff --git a/test/Transforms/LoopStrengthReduce/dont-hoist-simple-loop-constants.ll b/test/Transforms/LoopStrengthReduce/dont-hoist-simple-loop-constants.ll new file mode 100644 index 0000000..3c1003b --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/dont-hoist-simple-loop-constants.ll @@ -0,0 +1,26 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: not grep {cast uint 1 to uint} +; END. +; The setlt wants to use a value that is incremented one more than the dominant +; IV. Don't insert the 1 outside the loop, preventing folding it into the add. + +implementation ; Functions: + +void %test([700 x int]* %nbeaux_.0__558, int* %i_.16574) { +then.0: + br label %no_exit.2 + +no_exit.2: ; preds = %no_exit.2, %then.0 + %indvar630 = phi uint [ 0, %then.0 ], [ %indvar.next631, %no_exit.2 ] ; <uint> [#uses=3] + %indvar630 = cast uint %indvar630 to int ; <int> [#uses=1] + %tmp.38 = getelementptr [700 x int]* %nbeaux_.0__558, int 0, uint %indvar630 ; <int*> [#uses=1] + store int 0, int* %tmp.38 + %inc.2 = add int %indvar630, 2 ; <int> [#uses=2] + %tmp.34 = setlt int %inc.2, 701 ; <bool> [#uses=1] + %indvar.next631 = add uint %indvar630, 1 ; <uint> [#uses=1] + br bool %tmp.34, label %no_exit.2, label %loopexit.2.loopexit + +loopexit.2.loopexit: ; preds = %no_exit.2 + store int %inc.2, int* %i_.16574 + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/dont_insert_redundant_ops.ll b/test/Transforms/LoopStrengthReduce/dont_insert_redundant_ops.ll new file mode 100644 index 0000000..aecade8 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/dont_insert_redundant_ops.ll @@ -0,0 +1,40 @@ +; Check that this test makes INDVAR and related stuff dead. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | grep phi | wc -l | grep 2 + +declare bool %pred() + +void %test1({ int, int }* %P) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %gep1 = getelementptr { int, int}* %P, int %INDVAR, uint 0 + store int 0, int* %gep1 + + %gep2 = getelementptr { int, int}* %P, int %INDVAR, uint 1 + store int 0, int* %gep2 + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} + +void %test2([2 x int]* %P) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %gep1 = getelementptr [2 x int]* %P, int %INDVAR, uint 0 + store int 0, int* %gep1 + + %gep2 = getelementptr [2 x int]* %P, int %INDVAR, uint 1 + store int 0, int* %gep2 + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/dont_reduce_bytes.ll b/test/Transforms/LoopStrengthReduce/dont_reduce_bytes.ll new file mode 100644 index 0000000..2c67980 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/dont_reduce_bytes.ll @@ -0,0 +1,21 @@ +; Don't reduce the byte access to P[i], at least not on targets that +; support an efficient 'mem[r1+r2]' addressing mode. + +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output + +declare bool %pred(int) + +void %test(sbyte* %PTR) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %STRRED = getelementptr sbyte* %PTR, int %INDVAR + store sbyte 0, sbyte* %STRRED + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred(int %INDVAR2) ;; cannot eliminate indvar + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll b/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll new file mode 100644 index 0000000..4c31a98 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll @@ -0,0 +1,21 @@ +; Make sure that the compare instruction occurs after the increment to avoid +; having overlapping live ranges that result in copies. We want the setcc +; instruction immediately before the conditional branch. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: %prcontext {br i1} 1 | grep icmp + +void %foo(float* %D, uint %E) { +entry: + br label %no_exit + +no_exit: + %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ] + volatile store float 0.0, float* %D + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=2] + %exitcond = seteq uint %indvar.next, %E ; <bool> [#uses=1] + br bool %exitcond, label %loopexit, label %no_exit + +loopexit: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/invariant_value_first.ll b/test/Transforms/LoopStrengthReduce/invariant_value_first.ll new file mode 100644 index 0000000..f2b75a2 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/invariant_value_first.ll @@ -0,0 +1,22 @@ +; Check that the index of 'P[outer]' is pulled out of the loop. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: not grep {getelementptr.*%outer.*%INDVAR} + +declare bool %pred() +declare int %foo() + +void %test([10000 x int]* %P) { + %outer = call int %foo() + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %STRRED = getelementptr [10000 x int]* %P, int %outer, int %INDVAR + store int 0, int* %STRRED + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/invariant_value_first_arg.ll b/test/Transforms/LoopStrengthReduce/invariant_value_first_arg.ll new file mode 100644 index 0000000..6e90512 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/invariant_value_first_arg.ll @@ -0,0 +1,20 @@ +; Check that the index of 'P[outer]' is pulled out of the loop. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: not grep {getelementptr.*%outer.*%INDVAR} + +declare bool %pred() + +void %test([10000 x int]* %P, int %outer) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %STRRED = getelementptr [10000 x int]* %P, int %outer, int %INDVAR + store int 0, int* %STRRED + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/nested-reduce.ll b/test/Transforms/LoopStrengthReduce/nested-reduce.ll new file mode 100644 index 0000000..6f709e3 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/nested-reduce.ll @@ -0,0 +1,56 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | not grep mul + +; Make sure we don't get a multiply by 6 in this loop. + +int %foo(int %A, int %B, int %C, int %D) { +entry: + %tmp.5 = setgt int %C, 0 ; <bool> [#uses=1] + %tmp.25 = and int %A, 1 ; <int> [#uses=1] + br label %loopentry.1 + +loopentry.1: ; preds = %loopexit.1, %entry + %indvar20 = phi uint [ 0, %entry ], [ %indvar.next21, %loopexit.1 ] ; <uint> [#uses=2] + %k.1 = phi int [ 0, %entry ], [ %k.1.3, %loopexit.1 ] ; <int> [#uses=2] + br bool %tmp.5, label %no_exit.1.preheader, label %loopexit.1 + +no_exit.1.preheader: ; preds = %loopentry.1 + %i.0.0 = cast uint %indvar20 to int ; <int> [#uses=1] + %tmp.9 = mul int %i.0.0, 6 ; <int> [#uses=1] + br label %no_exit.1.outer + +no_exit.1.outer: ; preds = %cond_true, %no_exit.1.preheader + %k.1.2.ph = phi int [ %k.1, %no_exit.1.preheader ], [ %k.09, %cond_true ] ; <int> [#uses=2] + %j.1.2.ph = phi int [ 0, %no_exit.1.preheader ], [ %inc.1, %cond_true ] ; <int> [#uses=1] + br label %no_exit.1 + +no_exit.1: ; preds = %cond_continue, %no_exit.1.outer + %indvar.ui = phi uint [ 0, %no_exit.1.outer ], [ %indvar.next, %cond_continue ] ; <uint> [#uses=2] + %indvar = cast uint %indvar.ui to int ; <int> [#uses=1] + %j.1.2 = add int %indvar, %j.1.2.ph ; <int> [#uses=2] + %tmp.11 = add int %j.1.2, %tmp.9 ; <int> [#uses=1] + %tmp.12 = cast int %tmp.11 to ubyte ; <ubyte> [#uses=1] + %tmp.13 = shl int %D, ubyte %tmp.12 ; <int> [#uses=2] + %tmp.15 = seteq int %tmp.13, %B ; <bool> [#uses=1] + %inc.1 = add int %j.1.2, 1 ; <int> [#uses=3] + br bool %tmp.15, label %cond_true, label %cond_continue + +cond_true: ; preds = %no_exit.1 + %tmp.26 = and int %tmp.25, %tmp.13 ; <int> [#uses=1] + %k.09 = add int %tmp.26, %k.1.2.ph ; <int> [#uses=2] + %tmp.517 = setlt int %inc.1, %C ; <bool> [#uses=1] + br bool %tmp.517, label %no_exit.1.outer, label %loopexit.1 + +cond_continue: ; preds = %no_exit.1 + %tmp.519 = setlt int %inc.1, %C ; <bool> [#uses=1] + %indvar.next = add uint %indvar.ui, 1 ; <uint> [#uses=1] + br bool %tmp.519, label %no_exit.1, label %loopexit.1 + +loopexit.1: ; preds = %cond_continue, %cond_true, %loopentry.1 + %k.1.3 = phi int [ %k.1, %loopentry.1 ], [ %k.09, %cond_true ], [ %k.1.2.ph, %cond_continue ] ; <int> [#uses=2] + %indvar.next21 = add uint %indvar20, 1 ; <uint> [#uses=2] + %exitcond = seteq uint %indvar.next21, 4 ; <bool> [#uses=1] + br bool %exitcond, label %loopexit.0, label %loopentry.1 + +loopexit.0: ; preds = %loopexit.1 + ret int %k.1.3 +} diff --git a/test/Transforms/LoopStrengthReduce/ops_after_indvar.ll b/test/Transforms/LoopStrengthReduce/ops_after_indvar.ll new file mode 100644 index 0000000..59da48b --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/ops_after_indvar.ll @@ -0,0 +1,22 @@ +; Check that this test makes INDVAR and related stuff dead, because P[indvar] +; gets reduced, making INDVAR dead. + +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | not grep INDVAR + +declare bool %pred() +declare int %getidx() + +void %test([10000 x int]* %P) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + %idx = call int %getidx() + %STRRED = getelementptr [10000 x int]* %P, int %INDVAR, int %idx + store int 0, int* %STRRED + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll b/test/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll new file mode 100644 index 0000000..cd0afe1 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce -disable-output +; LSR should not crash on this. + +fastcc void %loadloop() { +entry: + switch sbyte 0, label %shortcirc_next [ + sbyte 32, label %loopexit.2 + sbyte 59, label %loopexit.2 + ] + +shortcirc_next: ; preds = %no_exit.2, %entry + %indvar37 = phi uint [ 0, %entry ], [ %indvar.next38, %no_exit.2 ] ; <uint> [#uses=3] + %wp.2.4 = getelementptr sbyte* null, uint %indvar37 ; <sbyte*> [#uses=1] + br bool false, label %loopexit.2, label %no_exit.2 + +no_exit.2: ; preds = %shortcirc_next + %wp.2.4.rec = cast uint %indvar37 to int ; <int> [#uses=1] + %inc.1.rec = add int %wp.2.4.rec, 1 ; <int> [#uses=1] + %inc.1 = getelementptr sbyte* null, int %inc.1.rec ; <sbyte*> [#uses=2] + %indvar.next38 = add uint %indvar37, 1 ; <uint> [#uses=1] + switch sbyte 0, label %shortcirc_next [ + sbyte 32, label %loopexit.2 + sbyte 59, label %loopexit.2 + ] + +loopexit.2: ; preds = %no_exit.2, %no_exit.2, %shortcirc_next, %entry, %entry + %wp.2.7 = phi sbyte* [ null, %entry ], [ null, %entry ], [ %wp.2.4, %shortcirc_next ], [ %inc.1, %no_exit.2 ], [ %inc.1, %no_exit.2 ] ; <sbyte*> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/related_indvars.ll b/test/Transforms/LoopStrengthReduce/related_indvars.ll new file mode 100644 index 0000000..533279b --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/related_indvars.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | grep phi | wc -l | grep 1 + +; This should only result in one PHI node! + +; void foo(double *D, double *E, double F) { +; while (D != E) +; *D++ = F; +; } + +void %foo(double* %D, double* %E, double %F) { +entry: + %tmp.24 = seteq double* %D, %E ; <bool> [#uses=1] + br bool %tmp.24, label %return, label %no_exit + +no_exit: ; preds = %no_exit, %entry + %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ] ; <uint> [#uses=3] + %D_addr.0.0.rec = cast uint %indvar to int ; <int> [#uses=1] + %D_addr.0.0 = getelementptr double* %D, int %D_addr.0.0.rec ; <double*> [#uses=1] + %inc.rec = add int %D_addr.0.0.rec, 1 ; <int> [#uses=1] + %inc = getelementptr double* %D, int %inc.rec ; <double*> [#uses=1] + store double %F, double* %D_addr.0.0 + %tmp.2 = seteq double* %inc, %E ; <bool> [#uses=1] + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] + br bool %tmp.2, label %return, label %no_exit + +return: ; preds = %no_exit, %entry + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/remove_indvar.ll b/test/Transforms/LoopStrengthReduce/remove_indvar.ll new file mode 100644 index 0000000..517180b --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/remove_indvar.ll @@ -0,0 +1,19 @@ +; Check that this test makes INDVAR and related stuff dead. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | not grep INDVAR + +declare bool %pred() + +void %test(int* %P) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + + %STRRED = getelementptr int* %P, int %INDVAR + store int 0, int* %STRRED + + %INDVAR2 = add int %INDVAR, 1 + %cond = call bool %pred() + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/share_code_in_preheader.ll b/test/Transforms/LoopStrengthReduce/share_code_in_preheader.ll new file mode 100644 index 0000000..d8316a5 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/share_code_in_preheader.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | grep mul | wc -l | grep 1 +; LSR should not make two copies of the Q*L expression in the preheader! + +sbyte %test(sbyte* %A, sbyte* %B, int %L, int %Q, int %N.s) { +entry: + %tmp.6 = mul int %Q, %L ; <int> [#uses=1] + %N = cast int %N.s to uint ; <uint> [#uses=1] + br label %no_exit + +no_exit: ; preds = %no_exit, %no_exit.preheader + %indvar.ui = phi uint [ 0, %entry], [ %indvar.next, %no_exit ] ; <uint> [#uses=2] + %Sum.0.0 = phi sbyte [ 0, %entry], [ %tmp.21, %no_exit ] ; <sbyte> [#uses=1] + %indvar = cast uint %indvar.ui to int ; <int> [#uses=1] + %N_addr.0.0 = sub int %N.s, %indvar ; <int> [#uses=1] + %tmp.8 = add int %N_addr.0.0, %tmp.6 ; <int> [#uses=2] + %tmp.9 = getelementptr sbyte* %A, int %tmp.8 ; <sbyte*> [#uses=1] + %tmp.10 = load sbyte* %tmp.9 ; <sbyte> [#uses=1] + %tmp.17 = getelementptr sbyte* %B, int %tmp.8 ; <sbyte*> [#uses=1] + %tmp.18 = load sbyte* %tmp.17 ; <sbyte> [#uses=1] + %tmp.19 = sub sbyte %tmp.10, %tmp.18 ; <sbyte> [#uses=1] + %tmp.21 = add sbyte %tmp.19, %Sum.0.0 ; <sbyte> [#uses=2] + %indvar.next = add uint %indvar.ui, 1 ; <uint> [#uses=2] + %exitcond = seteq uint %indvar.next, %N ; <bool> [#uses=1] + br bool %exitcond, label %loopexit, label %no_exit + +loopexit: + ret sbyte %tmp.21 +} diff --git a/test/Transforms/LoopStrengthReduce/share_ivs.ll b/test/Transforms/LoopStrengthReduce/share_ivs.ll new file mode 100644 index 0000000..76bfe1d --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/share_ivs.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | grep phi | wc -l | grep 1 + +; This testcase should have ONE stride 18 indvar, the other use should have a +; loop invariant value (B) added to it inside of the loop, instead of having +; a whole indvar based on B for it. + +declare bool %cond(uint) + +void %test(uint %B) { + br label %Loop +Loop: + %IV = phi uint [0, %0], [%IVn, %Loop] + + %C = mul uint %IV, 18 + %D = mul uint %IV, 18 + %E = add uint %D, %B + + %cnd = call bool %cond(uint %E) + call bool %cond(uint %C) + %IVn = add uint %IV, 1 + br bool %cnd, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/use_postinc_value_outside_loop.ll b/test/Transforms/LoopStrengthReduce/use_postinc_value_outside_loop.ll new file mode 100644 index 0000000..195f0b2 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/use_postinc_value_outside_loop.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: grep {add i32 %iv.*inc, 1} +; +; Make sure that the use of the IV outside of the loop (the store) uses the +; post incremented value of the IV, not the preincremented value. This +; prevents the loop from having to keep the post and pre-incremented value +; around for the duration of the loop, adding a copy and an extra register +; to the loop. + +declare bool %pred(int %X) + +void %test([700 x int]* %nbeaux_.0__558, int* %i_.16574) { +then.0: + br label %no_exit.2 + +no_exit.2: ; preds = %no_exit.2, %then.0 + %indvar630.ui = phi uint [ 0, %then.0 ], [ %indvar.next631, %no_exit.2 ] ; <uint> [#uses=3] + %indvar630 = cast uint %indvar630.ui to int ; <int> [#uses=1] + %tmp.38 = getelementptr [700 x int]* %nbeaux_.0__558, int 0, uint %indvar630.ui ; <int*> [#uses=1] + store int 0, int* %tmp.38 + %inc.2 = add int %indvar630, 2 ; <int> [#uses=2] + %tmp.34 = call bool %pred(int %indvar630) + %indvar.next631 = add uint %indvar630.ui, 1 ; <uint> [#uses=1] + br bool %tmp.34, label %no_exit.2, label %loopexit.2.loopexit + +loopexit.2.loopexit: ; preds = %no_exit.2 + store int %inc.2, int* %i_.16574 + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/var_stride_used_by_compare.ll b/test/Transforms/LoopStrengthReduce/var_stride_used_by_compare.ll new file mode 100644 index 0000000..1daa403 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/var_stride_used_by_compare.ll @@ -0,0 +1,49 @@ +; Base should not be i*3, it should be i*2. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: not grep {mul.*%i, 3} + +; Indvar should not start at zero: +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | \ +; RUN: not grep {phi uint .* 0} +; END. + +; mul uint %i, 3 + +; ModuleID = 't.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-apple-darwin8" +%flags2 = external global [8193 x sbyte], align 32 ; <[8193 x sbyte]*> [#uses=1] + +implementation ; Functions: + +void %foo(int %k, int %i.s) { +entry: + %i = cast int %i.s to uint ; <uint> [#uses=2] + %k_addr.012 = shl int %i.s, ubyte 1 ; <int> [#uses=1] + %tmp14 = setgt int %k_addr.012, 8192 ; <bool> [#uses=1] + br bool %tmp14, label %return, label %bb.preheader + +bb.preheader: ; preds = %entry + %tmp. = shl uint %i, ubyte 1 ; <uint> [#uses=1] + br label %bb + +bb: ; preds = %bb, %bb.preheader + %indvar = phi uint [ %indvar.next, %bb ], [ 0, %bb.preheader ] ; <uint> [#uses=2] + %tmp.15 = mul uint %indvar, %i ; <uint> [#uses=1] + %tmp.16 = add uint %tmp.15, %tmp. ; <uint> [#uses=2] + %k_addr.0.0 = cast uint %tmp.16 to int ; <int> [#uses=1] + %tmp = getelementptr [8193 x sbyte]* %flags2, int 0, uint %tmp.16 ; <sbyte*> [#uses=1] + store sbyte 0, sbyte* %tmp + %k_addr.0 = add int %k_addr.0.0, %i.s ; <int> [#uses=1] + %tmp = setgt int %k_addr.0, 8192 ; <bool> [#uses=1] + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] + br bool %tmp, label %return.loopexit, label %bb + +return.loopexit: ; preds = %bb + br label %return + +return: ; preds = %return.loopexit, %entry + ret void +} diff --git a/test/Transforms/LoopStrengthReduce/variable_stride.ll b/test/Transforms/LoopStrengthReduce/variable_stride.ll new file mode 100644 index 0000000..1af2a12 --- /dev/null +++ b/test/Transforms/LoopStrengthReduce/variable_stride.ll @@ -0,0 +1,17 @@ +; Check that variable strides are reduced to adds instead of multiplies. +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-reduce | llvm-dis | not grep mul + +declare bool %pred(int) + +void %test([10000 x int]* %P, int %STRIDE) { + br label %Loop +Loop: + %INDVAR = phi int [0, %0], [%INDVAR2, %Loop] + %Idx = mul int %INDVAR, %STRIDE + + %cond = call bool %pred(int %Idx) + %INDVAR2 = add int %INDVAR, 1 + br bool %cond, label %Loop, label %Out +Out: + ret void +} diff --git a/test/Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll b/test/Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll new file mode 100644 index 0000000..8c3e697 --- /dev/null +++ b/test/Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unroll -disable-output + +int %main() { +entry: + br label %no_exit + +no_exit: ; preds = %entry, %no_exit + %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ] ; <uint> [#uses=1] + %indvar.next = add uint %indvar, 1 ; <uint> [#uses=2] + %exitcond = setne uint %indvar.next, 2147483648 ; <bool> [#uses=1] + br bool %exitcond, label %no_exit, label %loopexit + +loopexit: ; preds = %no_exit + ret int 0 +} diff --git a/test/Transforms/LoopUnroll/2005-03-06-BadLoopInfoUpdate.ll b/test/Transforms/LoopUnroll/2005-03-06-BadLoopInfoUpdate.ll new file mode 100644 index 0000000..1681506 --- /dev/null +++ b/test/Transforms/LoopUnroll/2005-03-06-BadLoopInfoUpdate.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unroll -loopsimplify -disable-output + +implementation ; Functions: + +void %print_board() { +entry: + br label %no_exit.1 + +no_exit.1: ; preds = %cond_false.2, %entry + br label %no_exit.2 + +no_exit.2: ; preds = %no_exit.2, %no_exit.1 + %indvar1 = phi uint [ 0, %no_exit.1 ], [ %indvar.next2, %no_exit.2 ] ; <uint> [#uses=1] + %indvar.next2 = add uint %indvar1, 1 ; <uint> [#uses=2] + %exitcond3 = setne uint %indvar.next2, 7 ; <bool> [#uses=1] + br bool %exitcond3, label %no_exit.2, label %loopexit.2 + +loopexit.2: ; preds = %no_exit.2 + br bool false, label %cond_true.2, label %cond_false.2 + +cond_true.2: ; preds = %loopexit.2 + ret void + +cond_false.2: ; preds = %loopexit.2 + br bool false, label %no_exit.1, label %loopexit.1 + +loopexit.1: ; preds = %cond_false.2 + ret void +} diff --git a/test/Transforms/LoopUnroll/2006-08-24-MultiBlockLoop.ll b/test/Transforms/LoopUnroll/2006-08-24-MultiBlockLoop.ll new file mode 100644 index 0000000..42ff3fa --- /dev/null +++ b/test/Transforms/LoopUnroll/2006-08-24-MultiBlockLoop.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unroll | llvm-dis | grep bb72.2 + +void %vorbis_encode_noisebias_setup() { +entry: + br label %cond_true.outer + +cond_true.outer: + %indvar1.ph = phi uint [ 0, %entry ], [ %indvar.next2, %bb72 ] + br label %bb72 + +bb72: + %indvar.next2 = add uint %indvar1.ph, 1 + %exitcond3 = seteq uint %indvar.next2, 3 + br bool %exitcond3, label %cond_true138, label %cond_true.outer + +cond_true138: + ret void +} diff --git a/test/Transforms/LoopUnroll/2007-04-16-PhiUpdate.ll b/test/Transforms/LoopUnroll/2007-04-16-PhiUpdate.ll new file mode 100644 index 0000000..c30d838 --- /dev/null +++ b/test/Transforms/LoopUnroll/2007-04-16-PhiUpdate.ll @@ -0,0 +1,18 @@ +; PR 1334 +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unroll -disable-output + +void @sal__math_float_manipulator_7__math__joint_array_dcv_ops__Omultiply__3([6 x float]* %agg.result) { +entry: + %tmp282911 = zext i8 0 to i32 ; <i32> [#uses=1] + br label %cond_next + +cond_next: ; preds = %cond_next, %entry + %indvar = phi i8 [ 0, %entry ], [ %indvar.next, %cond_next ] ; <i8> [#uses=1] + %indvar.next = add i8 %indvar, 1 ; <i8> [#uses=2] + %exitcond = icmp eq i8 %indvar.next, 7 ; <i1> [#uses=1] + br i1 %exitcond, label %bb27, label %cond_next + +bb27: ; preds = %cond_next + %tmp282911.lcssa = phi i32 [ %tmp282911, %cond_next ] ; <i32> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopUnroll/2007-05-05-UnrollMiscomp.ll b/test/Transforms/LoopUnroll/2007-05-05-UnrollMiscomp.ll new file mode 100644 index 0000000..44890a6 --- /dev/null +++ b/test/Transforms/LoopUnroll/2007-05-05-UnrollMiscomp.ll @@ -0,0 +1,36 @@ +; RUN: llvm-as < %s | opt -loop-unroll | llvm-dis | not grep undef +; PR1385 + +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-apple-darwin8" + %struct.__mpz_struct = type { i32, i32, i32* } + + +define void @Foo(%struct.__mpz_struct* %base) { +entry: + %want = alloca [1 x %struct.__mpz_struct], align 16 ; <[1 x %struct.__mpz_struct]*> [#uses=4] + %want1 = getelementptr [1 x %struct.__mpz_struct]* %want, i32 0, i32 0 ; <%struct.__mpz_struct*> [#uses=1] + call void @__gmpz_init( %struct.__mpz_struct* %want1 ) + %want27 = getelementptr [1 x %struct.__mpz_struct]* %want, i32 0, i32 0 ; <%struct.__mpz_struct*> [#uses=1] + %want3 = getelementptr [1 x %struct.__mpz_struct]* %want, i32 0, i32 0 ; <%struct.__mpz_struct*> [#uses=1] + %want2 = getelementptr [1 x %struct.__mpz_struct]* %want, i32 0, i32 0 ; <%struct.__mpz_struct*> [#uses=2] + br label %bb + +bb: ; preds = %bb, %entry + %i.01.0 = phi i32 [ 0, %entry ], [ %indvar.next, %bb ] ; <i32> [#uses=1] + %want23.0 = phi %struct.__mpz_struct* [ %want27, %entry ], [ %want2, %bb ] ; <%struct.__mpz_struct*> [#uses=1] + call void @__gmpz_mul( %struct.__mpz_struct* %want23.0, %struct.__mpz_struct* %want3, %struct.__mpz_struct* %base ) + %indvar.next = add i32 %i.01.0, 1 ; <i32> [#uses=2] + %exitcond = icmp ne i32 %indvar.next, 2 ; <i1> [#uses=1] + br i1 %exitcond, label %bb, label %bb10 + +bb10: ; preds = %bb + %want2.lcssa = phi %struct.__mpz_struct* [ %want2, %bb ] ; <%struct.__mpz_struct*> [#uses=1] + call void @__gmpz_clear( %struct.__mpz_struct* %want2.lcssa ) + ret void +} + +declare void @__gmpz_init(%struct.__mpz_struct*) +declare void @__gmpz_mul(%struct.__mpz_struct*, %struct.__mpz_struct*, %struct.__mpz_struct*) +declare void @__gmpz_clear(%struct.__mpz_struct*) + diff --git a/test/Transforms/LoopUnroll/2007-05-09-UnknownTripCount.ll b/test/Transforms/LoopUnroll/2007-05-09-UnknownTripCount.ll new file mode 100644 index 0000000..2086e96 --- /dev/null +++ b/test/Transforms/LoopUnroll/2007-05-09-UnknownTripCount.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -loop-unroll -unroll-count=3 | llvm-dis | grep bb72.2 + +define void @foo(i32 %trips) { +entry: + br label %cond_true.outer + +cond_true.outer: + %indvar1.ph = phi i32 [ 0, %entry ], [ %indvar.next2, %bb72 ] + br label %bb72 + +bb72: + %indvar.next2 = add i32 %indvar1.ph, 1 + %exitcond3 = icmp eq i32 %indvar.next2, %trips + br i1 %exitcond3, label %cond_true138, label %cond_true.outer + +cond_true138: + ret void +} diff --git a/test/Transforms/LoopUnroll/dg.exp b/test/Transforms/LoopUnroll/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LoopUnroll/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll b/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll new file mode 100644 index 0000000..38df259 --- /dev/null +++ b/test/Transforms/LoopUnswitch/2006-02-14-LoopSimplifyCrash.ll @@ -0,0 +1,1705 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unswitch -disable-output + +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8.2.0" +deplibs = [ "c", "crtend" ] + %struct.__sFILE = type { ubyte*, int, int, short, short, %struct.__sbuf, int, sbyte*, int (sbyte*)*, int (sbyte*, sbyte*, int)*, long (sbyte*, long, int)*, int (sbyte*, sbyte*, int)*, %struct.__sbuf, %struct.__sFILEX*, int, [3 x ubyte], [1 x ubyte], %struct.__sbuf, int, long } + %struct.__sFILEX = type opaque + %struct.__sbuf = type { ubyte*, int } + %struct.fd_set = type { [32 x int] } + %struct.timeval = type { int, int } + %struct.tm = type { int, int, int, int, int, int, int, int, int, int, sbyte* } + %typedef.CHESS_PATH = type { [65 x int], ubyte, ubyte, ubyte } + %typedef.CHESS_POSITION = type { ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, uint, int, sbyte, sbyte, [64 x sbyte], sbyte, sbyte, sbyte, sbyte, sbyte } + %typedef.HASH_ENTRY = type { ulong, ulong } + %typedef.NEXT_MOVE = type { int, int, int* } + %typedef.PAWN_HASH_ENTRY = type { uint, short, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %typedef.SEARCH_POSITION = type { ubyte, sbyte, sbyte, ubyte } + %union.doub0. = type { ulong } +%search = external global %typedef.CHESS_POSITION ; <%typedef.CHESS_POSITION*> [#uses=1] +%w_pawn_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_pawn_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%knight_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%bishop_attacks_rl45 = external global [64 x [256 x ulong]] ; <[64 x [256 x ulong]]*> [#uses=0] +%bishop_shift_rl45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%bishop_attacks_rr45 = external global [64 x [256 x ulong]] ; <[64 x [256 x ulong]]*> [#uses=0] +%bishop_shift_rr45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%rook_attacks_r0 = external global [64 x [256 x ulong]] ; <[64 x [256 x ulong]]*> [#uses=0] +%rook_attacks_rl90 = external global [64 x [256 x ulong]] ; <[64 x [256 x ulong]]*> [#uses=0] +%king_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%set_mask = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%first_ones = external global [65536 x ubyte] ; <[65536 x ubyte]*> [#uses=0] +%last_ones = external global [65536 x ubyte] ; <[65536 x ubyte]*> [#uses=0] +%draw_score_is_zero = external global int ; <int*> [#uses=0] +%default_draw_score = external global int ; <int*> [#uses=0] +%opening = external global int ; <int*> [#uses=0] +%middle_game = external global int ; <int*> [#uses=0] +%tc_increment = external global int ; <int*> [#uses=0] +%tc_time_remaining_opponent = external global int ; <int*> [#uses=0] +%.ctor_1 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%input_stream = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%__sF = external global [0 x %struct.__sFILE] ; <[0 x %struct.__sFILE]*> [#uses=1] +%xboard = external global int ; <int*> [#uses=0] +%.str_1 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_2 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%buffer = external global [512 x sbyte] ; <[512 x sbyte]*> [#uses=0] +%nargs = external global int ; <int*> [#uses=0] +%args = external global [32 x sbyte*] ; <[32 x sbyte*]*> [#uses=0] +%.str_3 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_4 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_5 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_6 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_7 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_8 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_9 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_10 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_11 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_12 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_14 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%position = external global [67 x %typedef.SEARCH_POSITION] ; <[67 x %typedef.SEARCH_POSITION]*> [#uses=0] +%log_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%move_number = external global int ; <int*> [#uses=0] +%rephead_b = external global ulong* ; <ulong**> [#uses=0] +%replist_b = external global [82 x ulong] ; <[82 x ulong]*> [#uses=0] +%rephead_w = external global ulong* ; <ulong**> [#uses=0] +%replist_w = external global [82 x ulong] ; <[82 x ulong]*> [#uses=0] +%moves_out_of_book = external global int ; <int*> [#uses=0] +%largest_positional_score = external global int ; <int*> [#uses=0] +%end_game = external global int ; <int*> [#uses=0] +%p_values = external global [15 x int] ; <[15 x int]*> [#uses=0] +%clear_mask = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%directions = external global [64 x [64 x sbyte]] ; <[64 x [64 x sbyte]]*> [#uses=0] +%root_wtm = external global int ; <int*> [#uses=0] +%all_pawns = external global ulong ; <ulong*> [#uses=0] +%pawn_score = external global %typedef.PAWN_HASH_ENTRY ; <%typedef.PAWN_HASH_ENTRY*> [#uses=0] +%pawn_probes = external global int ; <int*> [#uses=0] +%pawn_hits = external global int ; <int*> [#uses=0] +%outside_passed = external global [128 x int] ; <[128 x int]*> [#uses=0] +%root_total_black_pieces = external global int ; <int*> [#uses=0] +%root_total_white_pawns = external global int ; <int*> [#uses=0] +%root_total_white_pieces = external global int ; <int*> [#uses=0] +%root_total_black_pawns = external global int ; <int*> [#uses=0] +%mask_A7H7 = external global ulong ; <ulong*> [#uses=0] +%mask_B6B7 = external global ulong ; <ulong*> [#uses=0] +%mask_G6G7 = external global ulong ; <ulong*> [#uses=0] +%mask_A2H2 = external global ulong ; <ulong*> [#uses=0] +%mask_B2B3 = external global ulong ; <ulong*> [#uses=0] +%mask_G2G3 = external global ulong ; <ulong*> [#uses=0] +%king_defects_w = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%good_bishop_kw = external global ulong ; <ulong*> [#uses=0] +%mask_F3H3 = external global ulong ; <ulong*> [#uses=0] +%file_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%good_bishop_qw = external global ulong ; <ulong*> [#uses=0] +%mask_A3C3 = external global ulong ; <ulong*> [#uses=0] +%king_defects_b = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%good_bishop_kb = external global ulong ; <ulong*> [#uses=0] +%mask_F6H6 = external global ulong ; <ulong*> [#uses=0] +%good_bishop_qb = external global ulong ; <ulong*> [#uses=0] +%mask_A6C6 = external global ulong ; <ulong*> [#uses=0] +%square_color = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%evaluations = external global uint ; <uint*> [#uses=0] +%king_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%rank_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%mask_kr_trapped_w = external global [3 x ulong] ; <[3 x ulong]*> [#uses=0] +%mask_qr_trapped_w = external global [3 x ulong] ; <[3 x ulong]*> [#uses=0] +%king_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%mask_kr_trapped_b = external global [3 x ulong] ; <[3 x ulong]*> [#uses=0] +%mask_qr_trapped_b = external global [3 x ulong] ; <[3 x ulong]*> [#uses=0] +%white_outpost = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%mask_no_pawn_attacks_b = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%knight_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%black_outpost = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%mask_no_pawn_attacks_w = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%knight_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%bishop_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%bishop_mobility_rl45 = external global [64 x [256 x int]] ; <[64 x [256 x int]]*> [#uses=0] +%bishop_mobility_rr45 = external global [64 x [256 x int]] ; <[64 x [256 x int]]*> [#uses=0] +%bishop_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%rook_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%plus8dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%mask_abs7_w = external global ulong ; <ulong*> [#uses=0] +%rook_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%minus8dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%mask_abs7_b = external global ulong ; <ulong*> [#uses=0] +%queen_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%queen_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%white_minor_pieces = external global ulong ; <ulong*> [#uses=0] +%black_minor_pieces = external global ulong ; <ulong*> [#uses=0] +%not_rook_pawns = external global ulong ; <ulong*> [#uses=0] +%dark_squares = external global ulong ; <ulong*> [#uses=0] +%b_n_mate_dark_squares = external global [64 x int] ; <[64 x int]*> [#uses=0] +%b_n_mate_light_squares = external global [64 x int] ; <[64 x int]*> [#uses=0] +%mate = external global [64 x int] ; <[64 x int]*> [#uses=0] +%first_ones_8bit = external global [256 x ubyte] ; <[256 x ubyte]*> [#uses=0] +%reduced_material_passer = external global [20 x int] ; <[20 x int]*> [#uses=0] +%supported_passer = external global [8 x int] ; <[8 x int]*> [#uses=0] +%passed_pawn_value = external global [8 x int] ; <[8 x int]*> [#uses=0] +%connected_passed = external global [256 x ubyte] ; <[256 x ubyte]*> [#uses=0] +%black_pawn_race_btm = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%white_pawn_race_wtm = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%black_pawn_race_wtm = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%white_pawn_race_btm = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%obstructed = external global [64 x [64 x ulong]] ; <[64 x [64 x ulong]]*> [#uses=0] +%pawn_hash_table = external global %typedef.PAWN_HASH_ENTRY* ; <%typedef.PAWN_HASH_ENTRY**> [#uses=0] +%pawn_hash_mask = external global uint ; <uint*> [#uses=0] +%pawn_value_w = external global [64 x int] ; <[64 x int]*> [#uses=0] +%mask_pawn_isolated = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_pawn_passed_w = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_pawn_protected_w = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%pawn_value_b = external global [64 x int] ; <[64 x int]*> [#uses=0] +%mask_pawn_passed_b = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_pawn_protected_b = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%unblocked_pawns = external global [9 x int] ; <[9 x int]*> [#uses=0] +%mask_wk_4th = external global ulong ; <ulong*> [#uses=0] +%mask_wk_5th = external global ulong ; <ulong*> [#uses=0] +%mask_wq_4th = external global ulong ; <ulong*> [#uses=0] +%mask_wq_5th = external global ulong ; <ulong*> [#uses=0] +%stonewall_white = external global ulong ; <ulong*> [#uses=0] +%mask_bk_4th = external global ulong ; <ulong*> [#uses=0] +%mask_bk_5th = external global ulong ; <ulong*> [#uses=0] +%mask_bq_5th = external global ulong ; <ulong*> [#uses=0] +%mask_bq_4th = external global ulong ; <ulong*> [#uses=0] +%stonewall_black = external global ulong ; <ulong*> [#uses=0] +%last_ones_8bit = external global [256 x ubyte] ; <[256 x ubyte]*> [#uses=0] +%right_side_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%left_side_empty_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%left_side_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%right_side_empty_mask = external global [8 x ulong] ; <[8 x ulong]*> [#uses=0] +%pv = external global [65 x %typedef.CHESS_PATH] ; <[65 x %typedef.CHESS_PATH]*> [#uses=0] +%history_w = external global [4096 x int] ; <[4096 x int]*> [#uses=0] +%history_b = external global [4096 x int] ; <[4096 x int]*> [#uses=0] +%killer_move1 = external global [65 x int] ; <[65 x int]*> [#uses=0] +%killer_count1 = external global [65 x int] ; <[65 x int]*> [#uses=0] +%killer_move2 = external global [65 x int] ; <[65 x int]*> [#uses=0] +%killer_count2 = external global [65 x int] ; <[65 x int]*> [#uses=0] +%current_move = external global [65 x int] ; <[65 x int]*> [#uses=0] +%init_r90 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%init_l90 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%init_l45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%init_ul45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%init_r45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%init_ur45 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%diagonal_length = external global [64 x int] ; <[64 x int]*> [#uses=0] +%last = external global [65 x int*] ; <[65 x int*]*> [#uses=0] +%move_list = external global [5120 x int] ; <[5120 x int]*> [#uses=0] +%history_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%.str_1 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_2 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_3 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_5 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_6 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%trans_ref_wa = external global %typedef.HASH_ENTRY* ; <%typedef.HASH_ENTRY**> [#uses=0] +%hash_table_size = external global int ; <int*> [#uses=0] +%trans_ref_wb = external global %typedef.HASH_ENTRY* ; <%typedef.HASH_ENTRY**> [#uses=0] +%trans_ref_ba = external global %typedef.HASH_ENTRY* ; <%typedef.HASH_ENTRY**> [#uses=0] +%trans_ref_bb = external global %typedef.HASH_ENTRY* ; <%typedef.HASH_ENTRY**> [#uses=0] +%pawn_hash_table_size = external global int ; <int*> [#uses=0] +%.str_9 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%log_hash = external global int ; <int*> [#uses=0] +%log_pawn_hash = external global int ; <int*> [#uses=0] +%hash_maska = external global int ; <int*> [#uses=0] +%hash_maskb = external global int ; <int*> [#uses=0] +%mask_1 = external global ulong ; <ulong*> [#uses=0] +%bishop_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%queen_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%plus7dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%plus9dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%minus7dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%minus9dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%plus1dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%minus1dir = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%rook_attacks = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%king_attacks_1 = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%king_attacks_2 = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%.ctor_1 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%.ctor_2 = external global [64 x int] ; <[64 x int]*> [#uses=0] +%rook_mobility_r0 = external global [64 x [256 x int]] ; <[64 x [256 x int]]*> [#uses=0] +%rook_mobility_rl90 = external global [64 x [256 x int]] ; <[64 x [256 x int]]*> [#uses=0] +%initial_position = external global [80 x sbyte] ; <[80 x sbyte]*> [#uses=5] +"a1.0__" = external global [80 x sbyte] ; <[80 x sbyte]*> [#uses=0] +"a2.1__" = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +"a3.2__" = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +"a4.3__" = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +"a5.4__" = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +"args.5__" = external global [16 x sbyte*] ; <[16 x sbyte*]*> [#uses=0] +%.str_10 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%w_pawn_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%w_pawn_random32 = external global [64 x uint] ; <[64 x uint]*> [#uses=0] +%b_pawn_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_pawn_random32 = external global [64 x uint] ; <[64 x uint]*> [#uses=0] +%w_knight_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_knight_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%w_bishop_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_bishop_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%w_rook_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_rook_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%w_queen_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_queen_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%w_king_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%b_king_random = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%enpassant_random = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%castle_random_w = external global [2 x ulong] ; <[2 x ulong]*> [#uses=0] +%castle_random_b = external global [2 x ulong] ; <[2 x ulong]*> [#uses=0] +%set_mask_rl90 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%set_mask_rl45 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%set_mask_rr45 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%transposition_id = external global sbyte ; <sbyte*> [#uses=0] +%mask_2 = external global ulong ; <ulong*> [#uses=0] +%mask_3 = external global ulong ; <ulong*> [#uses=0] +%mask_4 = external global ulong ; <ulong*> [#uses=0] +%mask_8 = external global ulong ; <ulong*> [#uses=0] +%mask_16 = external global ulong ; <ulong*> [#uses=0] +%mask_32 = external global ulong ; <ulong*> [#uses=0] +%mask_72 = external global ulong ; <ulong*> [#uses=0] +%mask_80 = external global ulong ; <ulong*> [#uses=0] +%mask_85 = external global ulong ; <ulong*> [#uses=0] +%mask_96 = external global ulong ; <ulong*> [#uses=0] +%mask_107 = external global ulong ; <ulong*> [#uses=0] +%mask_108 = external global ulong ; <ulong*> [#uses=0] +%mask_112 = external global ulong ; <ulong*> [#uses=0] +%mask_118 = external global ulong ; <ulong*> [#uses=0] +%mask_120 = external global ulong ; <ulong*> [#uses=0] +%mask_121 = external global ulong ; <ulong*> [#uses=0] +%mask_127 = external global ulong ; <ulong*> [#uses=0] +%mask_clear_entry = external global ulong ; <ulong*> [#uses=0] +%clear_mask_rl45 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%clear_mask_rr45 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%clear_mask_rl90 = external global [65 x ulong] ; <[65 x ulong]*> [#uses=0] +%right_half_mask = external global ulong ; <ulong*> [#uses=0] +%left_half_mask = external global ulong ; <ulong*> [#uses=0] +%mask_not_rank8 = external global ulong ; <ulong*> [#uses=0] +%mask_not_rank1 = external global ulong ; <ulong*> [#uses=0] +%center = external global ulong ; <ulong*> [#uses=0] +%mask_pawn_connected = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_eptest = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_kingside_attack_w1 = external global ulong ; <ulong*> [#uses=0] +%mask_kingside_attack_w2 = external global ulong ; <ulong*> [#uses=0] +%mask_queenside_attack_w1 = external global ulong ; <ulong*> [#uses=0] +%mask_queenside_attack_w2 = external global ulong ; <ulong*> [#uses=0] +%mask_kingside_attack_b1 = external global ulong ; <ulong*> [#uses=0] +%mask_kingside_attack_b2 = external global ulong ; <ulong*> [#uses=0] +%mask_queenside_attack_b1 = external global ulong ; <ulong*> [#uses=0] +%mask_queenside_attack_b2 = external global ulong ; <ulong*> [#uses=0] +%pawns_cramp_black = external global ulong ; <ulong*> [#uses=0] +%pawns_cramp_white = external global ulong ; <ulong*> [#uses=0] +%light_squares = external global ulong ; <ulong*> [#uses=0] +%mask_left_edge = external global ulong ; <ulong*> [#uses=0] +%mask_right_edge = external global ulong ; <ulong*> [#uses=0] +%mask_advance_2_w = external global ulong ; <ulong*> [#uses=0] +%mask_advance_2_b = external global ulong ; <ulong*> [#uses=0] +%mask_corner_squares = external global ulong ; <ulong*> [#uses=0] +%mask_promotion_threat_w = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%mask_promotion_threat_b = external global [64 x ulong] ; <[64 x ulong]*> [#uses=0] +%promote_mask_w = external global ulong ; <ulong*> [#uses=0] +%promote_mask_b = external global ulong ; <ulong*> [#uses=0] +%mask_a1_corner = external global ulong ; <ulong*> [#uses=0] +%mask_h1_corner = external global ulong ; <ulong*> [#uses=0] +%mask_a8_corner = external global ulong ; <ulong*> [#uses=0] +%mask_h8_corner = external global ulong ; <ulong*> [#uses=0] +%white_center_pawns = external global ulong ; <ulong*> [#uses=0] +%black_center_pawns = external global ulong ; <ulong*> [#uses=0] +%wtm_random = external global [2 x ulong] ; <[2 x ulong]*> [#uses=0] +%endgame_random_w = external global ulong ; <ulong*> [#uses=0] +%endgame_random_b = external global ulong ; <ulong*> [#uses=0] +%w_rooks_random = external global ulong ; <ulong*> [#uses=0] +%b_rooks_random = external global ulong ; <ulong*> [#uses=0] +%.ctor_11 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.ctor_2 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_1 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_2 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_32 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_4 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_5 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_6 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_7 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_8 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_9 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_10 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_11 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_12 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_13 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%num_ponder_moves = external global int ; <int*> [#uses=0] +%ponder_moves = external global [220 x int] ; <[220 x int]*> [#uses=0] +%.str_14 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_15 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_16 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%auto232 = external global int ; <int*> [#uses=0] +%puzzling = external global sbyte ; <sbyte*> [#uses=0] +%abort_search = external global sbyte ; <sbyte*> [#uses=0] +%.str_24 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%wtm = external global int ; <int*> [#uses=0] +%.str_3 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_4 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%end_time = external global uint ; <uint*> [#uses=0] +%time_type = external global uint ; <uint*> [#uses=0] +%start_time = external global uint ; <uint*> [#uses=0] +%.str_6 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_7 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%nodes_searched = external global uint ; <uint*> [#uses=0] +%iteration_depth = external global int ; <int*> [#uses=0] +%searched_this_root_move = external global [256 x sbyte] ; <[256 x sbyte]*> [#uses=0] +%.str_9 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_10 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_11 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_12 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_14 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_16 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%thinking = external global sbyte ; <sbyte*> [#uses=0] +%time_abort = external global int ; <int*> [#uses=0] +%.str_17 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%analyze_move_read = external global int ; <int*> [#uses=0] +%analyze_mode = external global int ; <int*> [#uses=0] +%pondering = external global sbyte ; <sbyte*> [#uses=0] +%auto232_delay = external global int ; <int*> [#uses=0] +%auto_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%.str_19 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_20 = external global [11 x sbyte] ; <[11 x sbyte]*> [#uses=0] +%.str_21 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%ponder_move = external global int ; <int*> [#uses=0] +%predicted = external global int ; <int*> [#uses=0] +%made_predicted_move = external global int ; <int*> [#uses=0] +%opponent_end_time = external global uint ; <uint*> [#uses=0] +%program_start_time = external global uint ; <uint*> [#uses=0] +%.str_23 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_24 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_25 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_26 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_28 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%book_move = external global int ; <int*> [#uses=0] +%elapsed_start = external global uint ; <uint*> [#uses=0] +%burp = external global int ; <int*> [#uses=0] +%cpu_percent = external global int ; <int*> [#uses=0] +%next_time_check = external global int ; <int*> [#uses=0] +%nodes_between_time_checks = external global int ; <int*> [#uses=0] +%transposition_hits = external global int ; <int*> [#uses=0] +%transposition_probes = external global int ; <int*> [#uses=0] +%tb_probes = external global int ; <int*> [#uses=0] +%tb_probes_successful = external global int ; <int*> [#uses=0] +%check_extensions_done = external global int ; <int*> [#uses=0] +%recapture_extensions_done = external global int ; <int*> [#uses=0] +%passed_pawn_extensions_done = external global int ; <int*> [#uses=0] +%one_reply_extensions_done = external global int ; <int*> [#uses=0] +%program_end_time = external global uint ; <uint*> [#uses=0] +%root_value = external global int ; <int*> [#uses=0] +%last_search_value = external global int ; <int*> [#uses=0] +%.str_1 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_2 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%booking = external global sbyte ; <sbyte*> [#uses=0] +%annotate_mode = external global int ; <int*> [#uses=0] +%.str_4 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_5 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%last_pv = external global %typedef.CHESS_PATH ; <%typedef.CHESS_PATH*> [#uses=0] +%.str_8 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%root_alpha = external global int ; <int*> [#uses=0] +%last_value = external global int ; <int*> [#uses=0] +%root_beta = external global int ; <int*> [#uses=0] +%root_nodes = external global [256 x uint] ; <[256 x uint]*> [#uses=0] +%trace_level = external global int ; <int*> [#uses=0] +%.str_9 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_10 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%search_failed_high = external global int ; <int*> [#uses=0] +%search_failed_low = external global int ; <int*> [#uses=0] +%nodes_per_second = external global int ; <int*> [#uses=0] +%time_limit = external global int ; <int*> [#uses=0] +%easy_move = external global int ; <int*> [#uses=0] +%noise_level = external global uint ; <uint*> [#uses=0] +%.str_12 = external global [34 x sbyte] ; <[34 x sbyte]*> [#uses=0] +%.str_136 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%solution_type = external global int ; <int*> [#uses=0] +%number_of_solutions = external global int ; <int*> [#uses=0] +%solutions = external global [10 x int] ; <[10 x int]*> [#uses=0] +%early_exit = external global int ; <int*> [#uses=0] +%.str_14 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_15 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_16 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%whisper_value = external global int ; <int*> [#uses=0] +%.str_17 = external global [29 x sbyte] ; <[29 x sbyte]*> [#uses=0] +%.str_19 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%last_mate_score = external global int ; <int*> [#uses=0] +%search_depth = external global int ; <int*> [#uses=0] +%elapsed_end = external global uint ; <uint*> [#uses=0] +%.str_20 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_21 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_22 = external global [13 x sbyte] ; <[13 x sbyte]*> [#uses=0] +%.str_23 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_24 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_25 = external global [67 x sbyte] ; <[67 x sbyte]*> [#uses=0] +%.str_26 = external global [69 x sbyte] ; <[69 x sbyte]*> [#uses=0] +%hash_move = external global [65 x int] ; <[65 x int]*> [#uses=0] +%version = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%mode = external global uint ; <uint*> [#uses=0] +%batch_mode = external global int ; <int*> [#uses=0] +%crafty_rating = external global int ; <int*> [#uses=0] +%opponent_rating = external global int ; <int*> [#uses=0] +%pgn_event = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_site = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_date = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_round = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_white = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%pgn_white_elo = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_black = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%pgn_black_elo = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%pgn_result = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%number_auto_kibitzers = external global int ; <int*> [#uses=0] +%auto_kibitz_list = external global [100 x [20 x sbyte]] ; <[100 x [20 x sbyte]]*> [#uses=0] +%number_of_computers = external global int ; <int*> [#uses=0] +%computer_list = external global [100 x [20 x sbyte]] ; <[100 x [20 x sbyte]]*> [#uses=0] +%number_of_GMs = external global int ; <int*> [#uses=0] +%GM_list = external global [100 x [20 x sbyte]] ; <[100 x [20 x sbyte]]*> [#uses=0] +%number_of_IMs = external global int ; <int*> [#uses=0] +%IM_list = external global [100 x [20 x sbyte]] ; <[100 x [20 x sbyte]]*> [#uses=0] +%ics = external global int ; <int*> [#uses=0] +%output_format = external global int ; <int*> [#uses=0] +%EGTBlimit = external global int ; <int*> [#uses=0] +%whisper = external global int ; <int*> [#uses=0] +%channel = external global int ; <int*> [#uses=0] +%new_game = external global int ; <int*> [#uses=0] +%channel_title = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%initialized = external global int ; <int*> [#uses=0] +%kibitz = external global int ; <int*> [#uses=0] +%post = external global int ; <int*> [#uses=0] +%log_id = external global int ; <int*> [#uses=0] +%crafty_is_white = external global int ; <int*> [#uses=0] +%last_opponent_move = external global int ; <int*> [#uses=0] +%search_move = external global int ; <int*> [#uses=0] +%time_used = external global int ; <int*> [#uses=0] +%time_used_opponent = external global int ; <int*> [#uses=0] +%auto_kibitzing = external global int ; <int*> [#uses=0] +%test_mode = external global int ; <int*> [#uses=0] +%resign = external global sbyte ; <sbyte*> [#uses=0] +%resign_counter = external global sbyte ; <sbyte*> [#uses=0] +%resign_count = external global sbyte ; <sbyte*> [#uses=0] +%draw_counter = external global sbyte ; <sbyte*> [#uses=0] +%draw_count = external global sbyte ; <sbyte*> [#uses=0] +%tc_moves = external global int ; <int*> [#uses=0] +%tc_time = external global int ; <int*> [#uses=0] +%tc_time_remaining = external global int ; <int*> [#uses=0] +%tc_moves_remaining = external global int ; <int*> [#uses=0] +%tc_secondary_moves = external global int ; <int*> [#uses=0] +%tc_secondary_time = external global int ; <int*> [#uses=0] +%tc_sudden_death = external global int ; <int*> [#uses=0] +%tc_operator_time = external global int ; <int*> [#uses=0] +%tc_safety_margin = external global int ; <int*> [#uses=0] +%force = external global int ; <int*> [#uses=0] +%over = external global int ; <int*> [#uses=0] +%usage_level = external global int ; <int*> [#uses=0] +%audible_alarm = external global sbyte ; <sbyte*> [#uses=0] +%ansi = external global int ; <int*> [#uses=0] +%book_accept_mask = external global int ; <int*> [#uses=0] +%book_reject_mask = external global int ; <int*> [#uses=0] +%book_random = external global int ; <int*> [#uses=0] +%book_search_trigger = external global int ; <int*> [#uses=0] +%learning = external global int ; <int*> [#uses=0] +%show_book = external global int ; <int*> [#uses=0] +%book_selection_width = external global int ; <int*> [#uses=0] +%ponder = external global int ; <int*> [#uses=0] +%verbosity_level = external global int ; <int*> [#uses=0] +%push_extensions = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_28 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_3 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%display = external global %typedef.CHESS_POSITION ; <%typedef.CHESS_POSITION*> [#uses=0] +%.str_4 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%opponent_start_time = external global uint ; <uint*> [#uses=0] +%.str_8 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_9 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_18 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_19 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_2013 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_21 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_22 = external global [29 x sbyte] ; <[29 x sbyte]*> [#uses=0] +%.str_23 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%whisper_text = external global [500 x sbyte] ; <[500 x sbyte]*> [#uses=0] +%.str_24 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_25 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_26 = external global [11 x sbyte] ; <[11 x sbyte]*> [#uses=0] +%.str_28 = external global [13 x sbyte] ; <[13 x sbyte]*> [#uses=0] +%.str_29 = external global [13 x sbyte] ; <[13 x sbyte]*> [#uses=0] +%.str_30 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_31 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_32 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_36 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=1] +%.str_37 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_44 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_45 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_49 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_52 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%previous_search_value = external global int ; <int*> [#uses=0] +%.str_64 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%whisper_depth = external global int ; <int*> [#uses=0] +%.str_65 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_66 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%total_moves = external global int ; <int*> [#uses=0] +%book_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%books_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%book_lrn_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%position_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%position_lrn_file = external global %struct.__sFILE* ; <%struct.__sFILE**> [#uses=0] +%log_filename = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%history_filename = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%book_path = external global [128 x sbyte] ; <[128 x sbyte]*> [#uses=0] +%log_path = external global [128 x sbyte] ; <[128 x sbyte]*> [#uses=0] +%tb_path = external global [128 x sbyte] ; <[128 x sbyte]*> [#uses=0] +%cmd_buffer = external global [512 x sbyte] ; <[512 x sbyte]*> [#uses=0] +%root_move = external global int ; <int*> [#uses=0] +%hint = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%absolute_time_limit = external global int ; <int*> [#uses=0] +%search_time_limit = external global int ; <int*> [#uses=0] +%in_check = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%extended_reason = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%current_phase = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%sort_value = external global [256 x int] ; <[256 x int]*> [#uses=0] +%next_status = external global [65 x %typedef.NEXT_MOVE] ; <[65 x %typedef.NEXT_MOVE]*> [#uses=0] +%save_hash_key = external global [67 x ulong] ; <[67 x ulong]*> [#uses=0] +%save_pawn_hash_key = external global [67 x uint] ; <[67 x uint]*> [#uses=0] +%pawn_advance = external global [8 x int] ; <[8 x int]*> [#uses=0] +%bit_move = external global ulong ; <ulong*> [#uses=0] +%.str_1 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_2 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_3 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_1 = external global [34 x sbyte] ; <[34 x sbyte]*> [#uses=0] +%.str_2 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_2 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_1 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_2 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_3 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_4 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_5 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_615 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_7 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_10 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_11 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_12 = external global [18 x sbyte] ; <[18 x sbyte]*> [#uses=0] +%.str_1318 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_1419 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_15 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_16 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_19 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_20 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_2222 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_2323 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_25 = external global [29 x sbyte] ; <[29 x sbyte]*> [#uses=0] +%.str_27 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_28 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_29 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_30 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_31 = external global [18 x sbyte] ; <[18 x sbyte]*> [#uses=0] +%.str_32 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_33 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_34 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_35 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_36 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_37 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_38 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_41 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_42 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_43 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_44 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_4525 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_46 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_47 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_48 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_49 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_50 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_51 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_52 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_53 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_54 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_55 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_56 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_57 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_58 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_59 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_60 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_61 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_62 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_63 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_64 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_66 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_67 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_68 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_69 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_71 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_72 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_73 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_74 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_75 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_81 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_83 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_84 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_86 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_87 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_89 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_90 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_91 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_92 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_94 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_95 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_96 = external global [34 x sbyte] ; <[34 x sbyte]*> [#uses=0] +%.str_97 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_98 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_100 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_101 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_102 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_103 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_104 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_105 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_106 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_107 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_108 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_109 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_110 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_111 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_112 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_113 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_114 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_115 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_116 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_117 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_118 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_119 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_120 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_121 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_122 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_123 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_124 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_125 = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%.str_126 = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%.str_127 = external global [69 x sbyte] ; <[69 x sbyte]*> [#uses=0] +%.str_128 = external global [66 x sbyte] ; <[66 x sbyte]*> [#uses=0] +%.str_129 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_130 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_131 = external global [67 x sbyte] ; <[67 x sbyte]*> [#uses=0] +%.str_132 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_133 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_134 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_135 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_136 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_137 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_138 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_139 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_140 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_141 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_142 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_143 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_144 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_145 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_146 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_147 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_148 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_149 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_150 = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%.str_151 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_152 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_153 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_154 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_156 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_157 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_158 = external global [71 x sbyte] ; <[71 x sbyte]*> [#uses=0] +%.str_159 = external global [72 x sbyte] ; <[72 x sbyte]*> [#uses=0] +%.str_160 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_161 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_162 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_163 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_164 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_165 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_166 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_167 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_168 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_169 = external global [65 x sbyte] ; <[65 x sbyte]*> [#uses=0] +%.str_170 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_171 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_172 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_173 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_174 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_175 = external global [70 x sbyte] ; <[70 x sbyte]*> [#uses=0] +%.str_176 = external global [67 x sbyte] ; <[67 x sbyte]*> [#uses=0] +%.str_177 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_178 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_180 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_181 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_182 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_183 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_184 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_185 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_186 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_187 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_188 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_189 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_190 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_191 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_192 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_193 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_194 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_195 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_196 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_197 = external global [11 x sbyte] ; <[11 x sbyte]*> [#uses=0] +%.str_198 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_201 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_202 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_203 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_204 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_206 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_207 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_208 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_209 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_210 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_211 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_213 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_214 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_215 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_216 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_218 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_219 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_220 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_221 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_222 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_223 = external global [66 x sbyte] ; <[66 x sbyte]*> [#uses=0] +%.str_224 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_225 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_226 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_227 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_228 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_229 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_230 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_231 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_232 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_233 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_234 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_235 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_236 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_237 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_238 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_239 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_240 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_241 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_242 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_243 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_245 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_246 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_247 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_248 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_249 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_250 = external global [45 x sbyte] ; <[45 x sbyte]*> [#uses=0] +%.str_253 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_254 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_256 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_258 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_259 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_261 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_262 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_263 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_266 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_267 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_268 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_270 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_271 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_272 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_273 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_274 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_275 = external global [44 x sbyte] ; <[44 x sbyte]*> [#uses=0] +%.str_276 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_277 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_278 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_279 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_280 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_281 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_282 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_283 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_284 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_285 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_286 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_287 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_288 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_289 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_290 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_291 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_292 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_293 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_294 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_295 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_296 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_297 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_298 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_299 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_300 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_301 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_302 = external global [18 x sbyte] ; <[18 x sbyte]*> [#uses=0] +%.str_304 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_305 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_306 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_308 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_310 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_311 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_312 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_313 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_314 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_315 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_316 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_317 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_319 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_320 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_321 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_322 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_323 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_325 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_327 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_328 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_329 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_330 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_331 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_332 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_333 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_334 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_335 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_336 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_337 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_338 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_339 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_340 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_341 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_342 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_343 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_344 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_345 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_346 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_347 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_348 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_349 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_350 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_351 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_352 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_353 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_354 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_355 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_356 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_357 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_358 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_359 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_360 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_362 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_363 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_364 = external global [56 x sbyte] ; <[56 x sbyte]*> [#uses=0] +%.str_365 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_366 = external global [64 x sbyte] ; <[64 x sbyte]*> [#uses=0] +%.str_367 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_368 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_369 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_370 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_371 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_372 = external global [58 x sbyte] ; <[58 x sbyte]*> [#uses=0] +%.str_373 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_374 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_375 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_376 = external global [63 x sbyte] ; <[63 x sbyte]*> [#uses=0] +%.str_377 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_378 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_379 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_380 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_381 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_382 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_383 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_384 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_385 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_387 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_388 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_389 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_390 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_391 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_392 = external global [71 x sbyte] ; <[71 x sbyte]*> [#uses=0] +%.str_393 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_394 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_395 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_396 = external global [60 x sbyte] ; <[60 x sbyte]*> [#uses=0] +%.str_397 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_398 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_399 = external global [67 x sbyte] ; <[67 x sbyte]*> [#uses=0] +%.str_400 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_401 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_402 = external global [62 x sbyte] ; <[62 x sbyte]*> [#uses=0] +%.str_403 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_404 = external global [59 x sbyte] ; <[59 x sbyte]*> [#uses=0] +%.str_405 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_406 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_407 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_408 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_409 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_410 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_411 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_412 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_413 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_414 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_421 = external global [53 x sbyte] ; <[53 x sbyte]*> [#uses=0] +%.str_422 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_423 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_424 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_426 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_427 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_429 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_430 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_431 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_432 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_433 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_434 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_435 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_436 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_437 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_438 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_440 = external global [44 x sbyte] ; <[44 x sbyte]*> [#uses=0] +%.str_445 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_446 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_447 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_448 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_449 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_450 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_451 = external global [44 x sbyte] ; <[44 x sbyte]*> [#uses=0] +%.str_452 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_453 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_454 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_455 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_456 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_459 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_460 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_461 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_462 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_463 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_466 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_467 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_468 = external global [45 x sbyte] ; <[45 x sbyte]*> [#uses=0] +%.str_469 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_470 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_474 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_477 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_480 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_483 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_485 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_487 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_490 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_494 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_495 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_497 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_498 = external global [13 x sbyte] ; <[13 x sbyte]*> [#uses=0] +%.str_507 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_508 = external global [11 x sbyte] ; <[11 x sbyte]*> [#uses=0] +%.str_509 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_510 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_511 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_512 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_513 = external global [18 x sbyte] ; <[18 x sbyte]*> [#uses=0] +%.str_514 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_515 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_516 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_517 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_519 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_520 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_521 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_522 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_523 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_524 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_525 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_526 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_527 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_528 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_529 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_530 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_531 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_532 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_533 = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%.str_534 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_535 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_536 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_537 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_539 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_540 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_541 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_542 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_543 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_544 = external global [49 x sbyte] ; <[49 x sbyte]*> [#uses=0] +%.str_546 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_550 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_551 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_552 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_553 = external global [52 x sbyte] ; <[52 x sbyte]*> [#uses=0] +%.str_554 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_555 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_556 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_557 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_559 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_560 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_562 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_564 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_565 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_567 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_568 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_570 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_571 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_572 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_574 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_576 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_577 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_578 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_579 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_580 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_581 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_582 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_583 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_584 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_586 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_587 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_589 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_590 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_591 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_592 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_596 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_597 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_598 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_599 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_605 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_610 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_613 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_616 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_621 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_622 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_623 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_624 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_625 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_626 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_628 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_629 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_630 = external global [13 x sbyte] ; <[13 x sbyte]*> [#uses=0] +%.str_631 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_632 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_633 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_634 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_635 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_636 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.str_637 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_639 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_643 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_644 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_645 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_646 = external global [1 x sbyte] ; <[1 x sbyte]*> [#uses=0] +%.str_649 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_654 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=1] +%.str_656 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_658 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_660 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_662 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_664 = external global [2 x sbyte] ; <[2 x sbyte]*> [#uses=0] +%.str_666 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_667 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_669 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_670 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_671 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_672 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_674 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_675 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_676 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_680 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_682 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_683 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_684 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_685 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_686 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_687 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_688 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_689 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_690 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_691 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_692 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_694 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_695 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_697 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_698 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_700 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_701 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_702 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_703 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_704 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_707 = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=0] +%.str_708 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_709 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_710 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_711 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_722 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_723 = external global [34 x sbyte] ; <[34 x sbyte]*> [#uses=0] +%.str_726 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_727 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_728 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_729 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_730 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_732 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_734 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_735 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_736 = external global [61 x sbyte] ; <[61 x sbyte]*> [#uses=0] +%.str_738 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_739 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_740 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_741 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_742 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_743 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_744 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_745 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_747 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_748 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_750 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +"text_move.0__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +"new_text.1__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_1 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +"text_move.2__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_1 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_2 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_3 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_130 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_231 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_3 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_4 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_7 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +"hashing_pawns.0__" = external global int ; <int*> [#uses=0] +"hashing_opening.1__" = external global int ; <int*> [#uses=0] +"hashing_middle_game.2__" = external global int ; <int*> [#uses=0] +"hashing_end_game.3__" = external global int ; <int*> [#uses=0] +"last_wtm.4__" = external global int ; <int*> [#uses=0] +%.str_1 = external global [37 x sbyte] ; <[37 x sbyte]*> [#uses=0] +%.str_1 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_1 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_2 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_3 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_4 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_5 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_6 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_7 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_934 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_1 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_3 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_1 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_2 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_4 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_5 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_1 = external global [11 x sbyte] ; <[11 x sbyte]*> [#uses=0] +%.str_2 = external global [27 x sbyte] ; <[27 x sbyte]*> [#uses=0] +%.str_7 = external global [29 x sbyte] ; <[29 x sbyte]*> [#uses=0] +%.str_10 = external global [34 x sbyte] ; <[34 x sbyte]*> [#uses=0] +%.str_1141 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_12 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_14 = external global [20 x sbyte] ; <[20 x sbyte]*> [#uses=0] +%.str_1542 = external global [17 x sbyte] ; <[17 x sbyte]*> [#uses=0] +%.ctor_1 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_1 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_3 = external global [21 x sbyte] ; <[21 x sbyte]*> [#uses=0] +%.str_4 = external global [25 x sbyte] ; <[25 x sbyte]*> [#uses=0] +%.str_5 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_6 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +%.str_143 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_2 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_1 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_2 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%bit_move44 = external global ulong ; <ulong*> [#uses=0] +%.str_1 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_248 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_349 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.ctor_1 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_5 = external global [43 x sbyte] ; <[43 x sbyte]*> [#uses=0] +%.str_6 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_751 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_852 = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%.str_9 = external global [42 x sbyte] ; <[42 x sbyte]*> [#uses=0] +%.str_10 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +"out.0__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_1153 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_12 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_13 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_14 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_15 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_16 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_17 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +"out.1__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_18 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_19 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_20 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_21 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_2254 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_2355 = external global [8 x sbyte] ; <[8 x sbyte]*> [#uses=0] +%.str_24 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] +%.str_25 = external global [45 x sbyte] ; <[45 x sbyte]*> [#uses=0] +%.str_26 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +"out.2__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_31 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +"out.3__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +"out.4__" = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_3457 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_35 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_36 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_37 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_41 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_45 = external global [55 x sbyte] ; <[55 x sbyte]*> [#uses=0] +"save_book_selection_width.5__" = external global int ; <int*> [#uses=0] +"save_book_random.6__" = external global int ; <int*> [#uses=0] +"save_whisper.7__" = external global int ; <int*> [#uses=0] +"save_kibitz.8__" = external global int ; <int*> [#uses=0] +"save_channel.9__" = external global int ; <int*> [#uses=0] +"save_resign.10" = external global int ; <int*> [#uses=0] +"save_resign_count.11" = external global int ; <int*> [#uses=0] +"save_draw_count.12" = external global int ; <int*> [#uses=0] +"save_learning.13" = external global int ; <int*> [#uses=0] +%.str_49 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_51 = external global [44 x sbyte] ; <[44 x sbyte]*> [#uses=0] +"x.14" = external global [55 x uint] ; <[55 x uint]*> [#uses=0] +"init.15.b" = external global bool ; <bool*> [#uses=0] +"y.16" = external global [55 x uint] ; <[55 x uint]*> [#uses=0] +"j.17" = external global int ; <int*> [#uses=0] +"k.18" = external global int ; <int*> [#uses=0] +%.str_52 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +"text.19" = external global [128 x sbyte] ; <[128 x sbyte]*> [#uses=0] +%.str_5659 = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%.str_62 = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%.str_6662 = external global [5 x sbyte] ; <[5 x sbyte]*> [#uses=0] +%.str_68 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_69 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_70 = external global [16 x sbyte] ; <[16 x sbyte]*> [#uses=0] +%.str_72 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_74 = external global [23 x sbyte] ; <[23 x sbyte]*> [#uses=0] +%.str_76 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_78 = external global [57 x sbyte] ; <[57 x sbyte]*> [#uses=0] +%.str_80 = external global [45 x sbyte] ; <[45 x sbyte]*> [#uses=0] +%.str_82 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_84 = external global [10 x sbyte] ; <[10 x sbyte]*> [#uses=0] +%.str_86 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_88 = external global [7 x sbyte] ; <[7 x sbyte]*> [#uses=0] +%.str_90 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_92 = external global [19 x sbyte] ; <[19 x sbyte]*> [#uses=0] +%.str_94 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_95 = external global [48 x sbyte] ; <[48 x sbyte]*> [#uses=0] +%.str_97 = external global [18 x sbyte] ; <[18 x sbyte]*> [#uses=0] +%.str_98 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_100 = external global [22 x sbyte] ; <[22 x sbyte]*> [#uses=0] +%.str_163 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_2 = external global [38 x sbyte] ; <[38 x sbyte]*> [#uses=0] +%.str_3 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_4 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_5 = external global [51 x sbyte] ; <[51 x sbyte]*> [#uses=0] +%.str_6 = external global [30 x sbyte] ; <[30 x sbyte]*> [#uses=0] +%.str_7 = external global [28 x sbyte] ; <[28 x sbyte]*> [#uses=0] +%.str_8 = external global [33 x sbyte] ; <[33 x sbyte]*> [#uses=0] +%.str_9 = external global [54 x sbyte] ; <[54 x sbyte]*> [#uses=0] +%.str_10 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_11 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_12 = external global [47 x sbyte] ; <[47 x sbyte]*> [#uses=0] +%.str_13 = external global [46 x sbyte] ; <[46 x sbyte]*> [#uses=0] +%.str_14 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_15 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_16 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_17 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_18 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_19 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_20 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_22 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_23 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_24 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_26 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_27 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_28 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_30 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_31 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_32 = external global [36 x sbyte] ; <[36 x sbyte]*> [#uses=0] +%.str_33 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_34 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_3565 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_36 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_37 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_38 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_39 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_40 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_41 = external global [40 x sbyte] ; <[40 x sbyte]*> [#uses=0] +%.str_42 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_43 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_44 = external global [41 x sbyte] ; <[41 x sbyte]*> [#uses=0] +%.str_45 = external global [39 x sbyte] ; <[39 x sbyte]*> [#uses=0] +%.str_46 = external global [35 x sbyte] ; <[35 x sbyte]*> [#uses=0] +%.str_47 = external global [50 x sbyte] ; <[50 x sbyte]*> [#uses=0] +%.str_48 = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] +%.str_49 = external global [31 x sbyte] ; <[31 x sbyte]*> [#uses=0] +%.str_50 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0] +%.str_51 = external global [6 x sbyte] ; <[6 x sbyte]*> [#uses=0] +%.str_52 = external global [24 x sbyte] ; <[24 x sbyte]*> [#uses=0] +%.str_53 = external global [9 x sbyte] ; <[9 x sbyte]*> [#uses=0] + +implementation ; Functions: + +declare ulong %AttacksFrom(int, int) + +declare ulong %AttacksTo(int) + +declare int %Attacked(int, int) + +declare ulong %Mask(int) + +declare int %PopCnt(ulong) + +declare int %FirstOne(ulong) + +declare int %LastOne(ulong) + +declare int %DrawScore() + +declare int %Drawn(int) + +declare sbyte* %strchr(sbyte*, int) + +declare int %strcmp(sbyte*, sbyte*) + +declare uint %strlen(sbyte*) + +declare int %printf(sbyte*, ...) + +declare void %Edit() + +declare void %llvm.memcpy(sbyte*, sbyte*, uint, uint) + +declare int %fflush(%struct.__sFILE*) + +declare int %Read(int, sbyte*) + +declare int %ReadParse(sbyte*, sbyte**, sbyte*) + +declare void %DisplayChessBoard(%struct.__sFILE*, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, ulong, uint, int, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte, sbyte) + +declare void %SetChessBitBoards(%typedef.SEARCH_POSITION*) + +declare int %EnPrise(int, int) + +declare ulong %SwapXray(ulong, int, int) + +declare int %Evaluate(int, int, int, int) + +declare int %EvaluateMate() + +declare int %EvaluatePawns() + +declare int %EvaluatePassedPawns() + +declare int %EvaluatePassedPawnRaces(int) + +declare int %Swap(int, int, int) + +declare int %EvaluateDevelopment(int) + +declare int %EvaluateDraws() + +declare int %HasOpposition(int, int, int) + +declare void %HistoryBest(int, int, int) + +declare void %HistoryRefutation(int, int, int) + +declare int %sprintf(sbyte*, sbyte*, ...) + +declare void %Initialize(int) + +declare void %InitializeZeroMasks() + +declare void %InitializeMasks() + +declare void %InitializeRandomHash() + +declare void %InitializeAttackBoards() + +declare void %InitializePawnMasks() + +declare void %InitializePieceMasks() + +declare void %InitializeChessBoard(%typedef.SEARCH_POSITION*) + +declare %struct.__sFILE* %fopen(sbyte*, sbyte*) + +int %Option() { +no_exit.53.outer: + %tmp.4747 = shl int 7, ubyte 3 ; <int> [#uses=1] + %tmp.4779 = seteq %struct.__sFILE* getelementptr ([0 x %struct.__sFILE]* %__sF, int 0, int 1), null ; <bool> [#uses=2] + br label %no_exit.53 + +no_exit.53: ; preds = %else.166, %else.168, %then.360, %no_exit.53.outer + %file.2.3.3.ph = phi int [ 0, %no_exit.53.outer ], [ %inc.551688, %then.360 ], [ %inc.551701, %else.168 ], [ %file.2.3.3.ph, %else.166 ] ; <int> [#uses=2] + %nempty.5.3.ph = phi int [ 0, %no_exit.53.outer ], [ %nempty.5.3, %then.360 ], [ %nempty.5.3, %else.168 ], [ %nempty.5.3.ph, %else.166 ] ; <int> [#uses=2] + %indvar2053.ui = phi uint [ 0, %no_exit.53.outer ], [ 0, %then.360 ], [ 0, %else.168 ], [ %indvar.next2054, %else.166 ] ; <uint> [#uses=2] + %indvar2053 = cast uint %indvar2053.ui to int ; <int> [#uses=2] + %file.2.3.3 = add int %indvar2053, %file.2.3.3.ph ; <int> [#uses=4] + %nempty.5.3 = add int %indvar2053, %nempty.5.3.ph ; <int> [#uses=3] + %tmp.4749 = add int %file.2.3.3, %tmp.4747 ; <int> [#uses=1] + %tmp.4750 = getelementptr %typedef.CHESS_POSITION* %search, int 0, uint 22, int %tmp.4749 ; <sbyte*> [#uses=3] + %tmp.4751 = load sbyte* %tmp.4750 ; <sbyte> [#uses=1] + %tmp.4752 = seteq sbyte %tmp.4751, 0 ; <bool> [#uses=1] + br bool %tmp.4752, label %else.166, label %then.357 + +then.357: ; preds = %no_exit.53 + %tmp.4755 = seteq int %nempty.5.3, 0 ; <bool> [#uses=1] + br bool %tmp.4755, label %endif.358, label %then.358 + +then.358: ; preds = %then.357 + ret int 0 + +endif.358: ; preds = %then.357 + br bool %tmp.4779, label %else.168, label %then.360 + +then.360: ; preds = %endif.358 + %tmp.4791 = load sbyte* %tmp.4750 ; <sbyte> [#uses=1] + %tmp.4792 = cast sbyte %tmp.4791 to int ; <int> [#uses=1] + %tmp.4793 = add int %tmp.4792, 7 ; <int> [#uses=1] + %tmp.4794 = getelementptr [15 x sbyte]* null, int 0, int %tmp.4793 ; <sbyte*> [#uses=1] + %tmp.4795 = load sbyte* %tmp.4794 ; <sbyte> [#uses=1] + %tmp.4796 = cast sbyte %tmp.4795 to int ; <int> [#uses=1] + %tmp.4781 = call int (%struct.__sFILE*, sbyte*, ...)* %fprintf( %struct.__sFILE* getelementptr ([0 x %struct.__sFILE]* %__sF, int 0, int 1), sbyte* getelementptr ([3 x sbyte]* %.str_36, int 0, int 0), int %tmp.4796 ) ; <int> [#uses=0] + %inc.551688 = add int %file.2.3.3, 1 ; <int> [#uses=2] + %tmp.47421699 = setlt int %inc.551688, 8 ; <bool> [#uses=1] + br bool %tmp.47421699, label %no_exit.53, label %loopexit.56 + +else.168: ; preds = %endif.358 + %tmp.4799 = call uint %strlen( sbyte* getelementptr ([80 x sbyte]* %initial_position, int 0, int 0) ) ; <uint> [#uses=2] + %tmp.4802 = getelementptr [80 x sbyte]* %initial_position, int 0, uint %tmp.4799 ; <sbyte*> [#uses=1] + %tmp.4811 = load sbyte* %tmp.4750 ; <sbyte> [#uses=1] + %tmp.4812 = cast sbyte %tmp.4811 to int ; <int> [#uses=1] + %tmp.4813 = add int %tmp.4812, 7 ; <int> [#uses=1] + %tmp.4814 = getelementptr [15 x sbyte]* null, int 0, int %tmp.4813 ; <sbyte*> [#uses=1] + %tmp.4815 = load sbyte* %tmp.4814 ; <sbyte> [#uses=1] + store sbyte %tmp.4815, sbyte* %tmp.4802 + %tmp.4802.sum = add uint %tmp.4799, 1 ; <uint> [#uses=1] + %tmp.4802.end = getelementptr [80 x sbyte]* %initial_position, int 0, uint %tmp.4802.sum ; <sbyte*> [#uses=1] + store sbyte 0, sbyte* %tmp.4802.end + %inc.551701 = add int %file.2.3.3, 1 ; <int> [#uses=2] + %tmp.47421703 = setlt int %inc.551701, 8 ; <bool> [#uses=1] + br bool %tmp.47421703, label %no_exit.53, label %loopexit.56 + +else.166: ; preds = %no_exit.53 + %inc.55 = add int %file.2.3.3, 1 ; <int> [#uses=1] + %tmp.47421705 = setlt int %inc.55, 8 ; <bool> [#uses=1] + %indvar.next2054 = add uint %indvar2053.ui, 1 ; <uint> [#uses=1] + br bool %tmp.47421705, label %no_exit.53, label %loopexit.56 + +loopexit.56: ; preds = %else.166, %else.168, %then.360 + br bool %tmp.4779, label %else.169, label %then.361 + +then.361: ; preds = %loopexit.56 + %tmp.4822 = call uint %fwrite( sbyte* getelementptr ([2 x sbyte]* %.str_654, int 0, int 0), uint 1, uint 1, %struct.__sFILE* getelementptr ([0 x %struct.__sFILE]* %__sF, int 0, int 1) ) ; <uint> [#uses=0] + %dec.101707 = add int 7, -1 ; <int> [#uses=1] + %tmp.47391709 = setgt int %dec.101707, -1 ; <bool> [#uses=0] + ret int 0 + +else.169: ; preds = %loopexit.56 + %tmp.4827 = call uint %strlen( sbyte* getelementptr ([80 x sbyte]* %initial_position, int 0, int 0) ) ; <uint> [#uses=2] + %tmp.4830 = getelementptr [80 x sbyte]* %initial_position, int 0, uint %tmp.4827 ; <sbyte*> [#uses=1] + store sbyte 47, sbyte* %tmp.4830 + %tmp.4830.sum = add uint %tmp.4827, 1 ; <uint> [#uses=1] + %tmp.4830.end = getelementptr [80 x sbyte]* %initial_position, int 0, uint %tmp.4830.sum ; <sbyte*> [#uses=1] + store sbyte 0, sbyte* %tmp.4830.end + %dec.10 = add int 7, -1 ; <int> [#uses=1] + %tmp.47391711 = setgt int %dec.10, -1 ; <bool> [#uses=0] + ret int 0 +} + +declare void %InitializeHashTables() + +declare int %InitializeFindAttacks(int, int, int) + +declare void %SetBoard(int, sbyte**, int) + +declare int %KingPawnSquare(int, int, int, int) + +declare ulong %Random64() + +declare uint %Random32() + +declare sbyte* %strcpy(sbyte*, sbyte*) + +declare int %InputMove(sbyte*, int, int, int, int) + +declare int %InputMoveICS(sbyte*, int, int, int, int) + +declare int* %GenerateCaptures(int, int, int*) + +declare int* %GenerateNonCaptures(int, int, int*) + +declare void %MakeMove(int, int, int) + +declare void %UnMakeMove(int, int, int) + +declare void %Interrupt(int) + +declare uint %GetTime(uint) + +declare sbyte* %DisplayTime(uint) + +declare sbyte* %OutputMoveICS(int*) + +declare void %Delay(int) + +declare int %fprintf(%struct.__sFILE*, sbyte*, ...) + +declare void %SignalInterrupt(int) + +declare void (int)* %signal(int, void (int)*) + +declare int %Iterate(int, int, int) + +declare void %PreEvaluate(int) + +declare void %RootMoveList(int) + +declare sbyte* %OutputMove(int*, int, int) + +declare void %TimeSet(int) + +declare void %StorePV(int, int) + +declare int %SearchRoot(int, int, int, int) + +declare void %Whisper(int, int, int, int, uint, int, sbyte*) + +declare sbyte* %DisplayEvaluation(int) + +declare int %LookUp(int, int, int, int*, int*) + +declare sbyte* %strstr(sbyte*, sbyte*) + +declare int %main(int, sbyte**) + +declare void %__main() + +declare int %atoi(sbyte*) + +declare void %NewGame(int) + +declare int %Ponder(int) + +declare int %fseek(%struct.__sFILE*, int, int) + +declare void %MakeMoveRoot(int, int) + +declare int %RepetitionDraw(int) + +declare sbyte* %Reverse() + +declare sbyte* %Normal() + +declare void %TimeAdjust(int, uint) + +declare void %ValidatePosition(int, int, sbyte*) + +declare int %ValidMove(int, int, int) + +declare int* %GenerateCheckEvasions(int, int, int*) + +declare ulong %InterposeSquares(int, int, int) + +declare int %PinnedOnKing(int, int) + +declare int %NextMove(int, int) + +declare int %NextEvasion(int, int) + +declare int %NextRootMove(int) + +declare int %TimeCheck(int) + +declare int %strncmp(sbyte*, sbyte*, uint) + +declare void %exit(int) + +declare int %OptionMatch(sbyte*, sbyte*) + +declare int %fclose(%struct.__sFILE*) + +declare int %ParseTime(sbyte*) + +declare sbyte* %DisplayHHMM(uint) + +declare void %DisplayPieceBoards(int*, int*) + +declare int %fscanf(%struct.__sFILE*, sbyte*, ...) + +declare int %feof(%struct.__sFILE*) + +declare sbyte* %fgets(sbyte*, int, %struct.__sFILE*) + +declare int %remove(sbyte*) + +declare int %__tolower(int) + +declare uint %clock() + +declare void %OptionPerft(int, int, int) + +declare void %Phase() + +declare int %ReadNextMove(sbyte*, int, int) + +declare int %time(int*) + +declare %struct.tm* %localtime(int*) + +declare sbyte* %gets(sbyte*) + +declare int %OutputGood(sbyte*, int, int) + +declare int %CheckInput() + +declare void %ClearHashTables() + +declare int %Quiesce(int, int, int, int) + +declare void %SearchTrace(int, int, int, int, int, sbyte*, int) + +declare int %RepetitionCheck(int, int) + +declare void %ResignOrDraw(int, int) + +declare int %Search(int, int, int, int, int, int) + +declare void %StoreRefutation(int, int, int, int) + +declare void %StoreBest(int, int, int, int, int) + +declare void %SearchOutput(int, int) + +declare uint %strspn(sbyte*, sbyte*) + +declare int %isatty(int) + +declare int %fileno(%struct.__sFILE*) + +declare void %llvm.memset(sbyte*, ubyte, uint, uint) + +declare int %select(int, %struct.fd_set*, %struct.fd_set*, %struct.fd_set*, %struct.timeval*) + +declare void %DisplayBitBoard(ulong) + +declare sbyte* %DisplayEvaluationWhisper(int) + +declare sbyte* %DisplayTimeWhisper(uint) + +declare void %Display64bitWord(ulong) + +declare void %Display2BitBoards(ulong, ulong) + +declare void %DisplayChessMove(sbyte*, int) + +declare void %llvm.memmove(sbyte*, sbyte*, uint, uint) + +declare void %ReadClear() + +declare sbyte* %strtok(sbyte*, sbyte*) + +declare int %SpecReadRaw() + +declare int %read(int, sbyte*, uint) + +declare int* %__error() + +declare int %ReadChessMove(%struct.__sFILE*, int, int) + +declare ulong %ValidateComputeBishopAttacks(int) + +declare ulong %ValidateComputeRookAttacks(int) + +declare sbyte* %memchr(sbyte*, int, uint) + +declare uint %fwrite(sbyte*, uint, uint, %struct.__sFILE*) diff --git a/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll b/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll new file mode 100644 index 0000000..469c6d7 --- /dev/null +++ b/test/Transforms/LoopUnswitch/2006-02-22-UnswitchCrash.ll @@ -0,0 +1,42 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unswitch -disable-output + +void %sort_Eq(int * %S2) { +entry: + br bool false, label %list_Length.exit, label %cond_true.i + +cond_true.i: ; preds = %entry + ret void + +list_Length.exit: ; preds = %entry + br bool false, label %list_Length.exit9, label %cond_true.i5 + +cond_true.i5: ; preds = %list_Length.exit + ret void + +list_Length.exit9: ; preds = %list_Length.exit + br bool false, label %bb78, label %return + +bb44: ; preds = %bb78, %cond_next68 + br bool %tmp49.not, label %bb62, label %bb62.loopexit + +bb62.loopexit: ; preds = %bb44 + br label %bb62 + +bb62: ; preds = %bb62.loopexit, %bb44 + br bool false, label %return.loopexit, label %cond_next68 + +cond_next68: ; preds = %bb62 + br bool false, label %return.loopexit, label %bb44 + +bb78: ; preds = %list_Length.exit9 + %tmp49.not = seteq int* %S2, null ; <bool> [#uses=1] + br label %bb44 + +return.loopexit: ; preds = %cond_next68, %bb62 + %retval.0.ph = phi uint [ 1, %cond_next68 ], [ 0, %bb62 ] ; <uint> [#uses=1] + br label %return + +return: ; preds = %return.loopexit, %list_Length.exit9 + %retval.0 = phi uint [ 0, %list_Length.exit9 ], [ %retval.0.ph, %return.loopexit ] ; <uint> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll b/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll new file mode 100644 index 0000000..072ad20 --- /dev/null +++ b/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll @@ -0,0 +1,44 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unswitch -disable-output + + %struct.BLEND_MAP = type { short, short, short, int, %struct.BLEND_MAP_ENTRY* } + %struct.BLEND_MAP_ENTRY = type { float, ubyte, { [5 x float], [4 x ubyte] } } + %struct.TPATTERN = type { ushort, ushort, ushort, int, float, float, float, %struct.WARP*, %struct.TPATTERN*, %struct.BLEND_MAP*, { %struct.anon, [4 x ubyte] } } + %struct.TURB = type { ushort, %struct.WARP*, [3 x double], int, float, float } + %struct.WARP = type { ushort, %struct.WARP* } + %struct.anon = type { float, [3 x double] } + +implementation ; Functions: + +void %Parse_Pattern() { +entry: + br label %bb1096.outer20 + +bb671: ; preds = %cond_true1099 + br label %bb1096.outer23 + +bb1096.outer20.loopexit: ; preds = %cond_true1099 + %Local_Turb.0.ph24.lcssa = phi %struct.TURB* [ %Local_Turb.0.ph24, %cond_true1099 ] ; <%struct.TURB*> [#uses=1] + br label %bb1096.outer20 + +bb1096.outer20: ; preds = %bb1096.outer20.loopexit, %entry + %Local_Turb.0.ph22 = phi %struct.TURB* [ undef, %entry ], [ %Local_Turb.0.ph24.lcssa, %bb1096.outer20.loopexit ] ; <%struct.TURB*> [#uses=1] + %tmp1098 = seteq int 0, 0 ; <bool> [#uses=1] + br label %bb1096.outer23 + +bb1096.outer23: ; preds = %bb1096.outer20, %bb671 + %Local_Turb.0.ph24 = phi %struct.TURB* [ %Local_Turb.0.ph22, %bb1096.outer20 ], [ null, %bb671 ] ; <%struct.TURB*> [#uses=2] + br label %bb1096 + +bb1096: ; preds = %cond_true1099, %bb1096.outer23 + br bool %tmp1098, label %cond_true1099, label %bb1102 + +cond_true1099: ; preds = %bb1096 + switch int 0, label %bb1096.outer20.loopexit [ + int 161, label %bb671 + int 359, label %bb1096 + ] + +bb1102: ; preds = %bb1096 + %Local_Turb.0.ph24.lcssa1 = phi %struct.TURB* [ %Local_Turb.0.ph24, %bb1096 ] ; <%struct.TURB*> [#uses=0] + ret void +} diff --git a/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll b/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll new file mode 100644 index 0000000..0d5a452 --- /dev/null +++ b/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll @@ -0,0 +1,31 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unswitch -disable-output +implementation ; Functions: + +void %init_caller_save() { +entry: + br label %cond_true78 + +cond_next20: ; preds = %cond_true64 + br label %bb31 + +bb31: ; preds = %cond_true64, %cond_true64, %cond_next20 + %iftmp.29.1 = phi uint [ 0, %cond_next20 ], [ 0, %cond_true64 ], [ 0, %cond_true64 ] ; <uint> [#uses=0] + br label %bb54 + +bb54: ; preds = %cond_true78, %bb31 + br bool false, label %bb75, label %cond_true64 + +cond_true64: ; preds = %bb54 + switch int %i.0.0, label %cond_next20 [ + int 17, label %bb31 + int 18, label %bb31 + ] + +bb75: ; preds = %bb54 + %tmp74.0 = add int %i.0.0, 1 ; <int> [#uses=1] + br label %cond_true78 + +cond_true78: ; preds = %bb75, %entry + %i.0.0 = phi int [ 0, %entry ], [ %tmp74.0, %bb75 ] ; <int> [#uses=2] + br label %bb54 +} diff --git a/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll b/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll new file mode 100644 index 0000000..fc3e206 --- /dev/null +++ b/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll @@ -0,0 +1,32 @@ +; PR1333 +; RUN: llvm-upgrade < %s | llvm-as | opt -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" + %struct.ada__streams__root_stream_type = type { %struct.ada__tags__dispatch_table* } + %struct.ada__tags__dispatch_table = type { [1 x i8*] } + %struct.quotes__T173s = type { i8, %struct.quotes__T173s__T174s, [2 x [1 x double]], [2 x i16], i64, i8 } + %struct.quotes__T173s__T174s = type { i8, i8, i8, i16, i16, [2 x [1 x double]] } + +void @quotes__write_quote() { +entry: + %tmp606.i = icmp eq i32 0, 0 ; <i1> [#uses=1] + br label %bb + +bb: ; preds = %cond_next73, %bb, %entry + br i1 false, label %bb51, label %bb + +bb51: ; preds = %cond_next73, %bb + br i1 %tmp606.i, label %quotes__bid_ask_depth_offset_matrices__get_price.exit, label %cond_true.i + +cond_true.i: ; preds = %bb51 + unreachable + +quotes__bid_ask_depth_offset_matrices__get_price.exit: ; preds = %bb51 + br i1 false, label %cond_next73, label %cond_true72 + +cond_true72: ; preds = %quotes__bid_ask_depth_offset_matrices__get_price.exit + unreachable + +cond_next73: ; preds = %quotes__bid_ask_depth_offset_matrices__get_price.exit + br i1 false, label %bb, label %bb51 +} diff --git a/test/Transforms/LoopUnswitch/2007-05-09-tl.ll b/test/Transforms/LoopUnswitch/2007-05-09-tl.ll new file mode 100644 index 0000000..c987dae --- /dev/null +++ b/test/Transforms/LoopUnswitch/2007-05-09-tl.ll @@ -0,0 +1,95 @@ +; PR1333 +; RUN: llvm-as < %s | opt -loop-unswitch -disable-output + +define void @pp_cxx_expression() { +entry: + %tmp6 = lshr i32 0, 24 ; <i32> [#uses=1] + br label %tailrecurse + +tailrecurse: ; preds = %tailrecurse, %tailrecurse, %entry + switch i32 %tmp6, label %bb96 [ + i32 24, label %bb10 + i32 25, label %bb10 + i32 28, label %bb10 + i32 29, label %bb48 + i32 31, label %bb48 + i32 32, label %bb48 + i32 33, label %bb48 + i32 34, label %bb48 + i32 36, label %bb15 + i32 51, label %bb89 + i32 52, label %bb89 + i32 54, label %bb83 + i32 57, label %bb59 + i32 63, label %bb80 + i32 64, label %bb80 + i32 68, label %bb80 + i32 169, label %bb75 + i32 170, label %bb19 + i32 171, label %bb63 + i32 172, label %bb63 + i32 173, label %bb67 + i32 174, label %bb67 + i32 175, label %bb19 + i32 176, label %bb75 + i32 178, label %bb59 + i32 179, label %bb89 + i32 180, label %bb59 + i32 182, label %bb48 + i32 183, label %bb48 + i32 184, label %bb48 + i32 185, label %bb48 + i32 186, label %bb48 + i32 195, label %bb48 + i32 196, label %bb59 + i32 197, label %bb89 + i32 198, label %bb70 + i32 199, label %bb59 + i32 200, label %bb59 + i32 201, label %bb59 + i32 202, label %bb59 + i32 203, label %bb75 + i32 204, label %bb59 + i32 205, label %tailrecurse + i32 210, label %tailrecurse + ] + +bb10: ; preds = %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb15: ; preds = %tailrecurse + ret void + +bb19: ; preds = %tailrecurse, %tailrecurse + ret void + +bb48: ; preds = %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb59: ; preds = %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb63: ; preds = %tailrecurse, %tailrecurse + ret void + +bb67: ; preds = %tailrecurse, %tailrecurse + ret void + +bb70: ; preds = %tailrecurse + ret void + +bb75: ; preds = %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb80: ; preds = %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb83: ; preds = %tailrecurse + ret void + +bb89: ; preds = %tailrecurse, %tailrecurse, %tailrecurse, %tailrecurse + ret void + +bb96: ; preds = %tailrecurse + ret void +} diff --git a/test/Transforms/LoopUnswitch/basictest.ll b/test/Transforms/LoopUnswitch/basictest.ll new file mode 100644 index 0000000..c0c14b9 --- /dev/null +++ b/test/Transforms/LoopUnswitch/basictest.ll @@ -0,0 +1,35 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -loop-unswitch -disable-output +implementation ; Functions: + +int %test(int* %A, bool %C) { +entry: + br label %no_exit + +no_exit: ; preds = %entry, %no_exit.backedge + %i.0.0 = phi uint [ 0, %entry ], [ %i.0.0.be, %no_exit.backedge ] ; <uint> [#uses=3] + %tmp.7 = getelementptr int* %A, uint %i.0.0 ; <int*> [#uses=4] + %tmp.13 = load int* %tmp.7 ; <int> [#uses=1] + %tmp.14 = add int %tmp.13, 1 ; <int> [#uses=1] + store int %tmp.14, int* %tmp.7 + br bool %C, label %then, label %endif + +then: ; preds = %no_exit + %tmp.29 = load int* %tmp.7 ; <int> [#uses=1] + %tmp.30 = add int %tmp.29, 2 ; <int> [#uses=1] + store int %tmp.30, int* %tmp.7 + %inc9 = add uint %i.0.0, 1 ; <uint> [#uses=2] + %tmp.112 = setlt uint %inc9, 100000 ; <bool> [#uses=1] + br bool %tmp.112, label %no_exit.backedge, label %return + +no_exit.backedge: ; preds = %then, %endif + %i.0.0.be = phi uint [ %inc9, %then ], [ %inc, %endif ] ; <uint> [#uses=1] + br label %no_exit + +endif: ; preds = %no_exit + %inc = add uint %i.0.0, 1 ; <uint> [#uses=2] + %tmp.1 = setlt uint %inc, 100000 ; <bool> [#uses=1] + br bool %tmp.1, label %no_exit.backedge, label %return + +return: ; preds = %then, %endif + ret int %tmp.13 +} diff --git a/test/Transforms/LoopUnswitch/dg.exp b/test/Transforms/LoopUnswitch/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LoopUnswitch/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LowerInvoke/2003-12-10-Crash.llx b/test/Transforms/LowerInvoke/2003-12-10-Crash.llx new file mode 100644 index 0000000..495099a --- /dev/null +++ b/test/Transforms/LowerInvoke/2003-12-10-Crash.llx @@ -0,0 +1,24 @@ +; This testcase was reduced from Shootout-C++/reversefile.cpp by bugpoint + +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerinvoke -disable-output + +declare void %baz() + +declare void %bar() + +void %foo() { +then: ; preds = %entry + invoke void %baz( ) + to label %invoke_cont.0 except label %try_catch + +invoke_cont.0: ; preds = %then + invoke void %bar( ) + to label %try_exit except label %try_catch + +try_catch: ; preds = %then, %invoke_cont.0 + %__tmp.0 = phi int* [ null, %invoke_cont.0 ], [ null, %then ] + ret void + +try_exit: ; preds = %invoke_cont.0 + ret void +} diff --git a/test/Transforms/LowerInvoke/2004-02-29-PHICrash.llx b/test/Transforms/LowerInvoke/2004-02-29-PHICrash.llx new file mode 100644 index 0000000..9018257 --- /dev/null +++ b/test/Transforms/LowerInvoke/2004-02-29-PHICrash.llx @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerinvoke -enable-correct-eh-support -disable-output + +void %_ZNKSt11__use_cacheISt16__numpunct_cacheIcEEclERKSt6locale() { +entry: + br bool false, label %then, label %UnifiedReturnBlock + +then: ; preds = %entry + invoke void %_Znwj( ) + to label %UnifiedReturnBlock unwind label %UnifiedReturnBlock + +UnifiedReturnBlock: ; preds = %entry, %then, %then + %UnifiedRetVal = phi int* [ null, %entry ], [ null, %then ], [ null, %then ] + ret void +} + +declare void %_Znwj() diff --git a/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHI.ll b/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHI.ll new file mode 100644 index 0000000..51f3fb2 --- /dev/null +++ b/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHI.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerinvoke -enable-correct-eh-support -disable-output + +implementation ; Functions: + +declare void %ll_listnext__listiterPtr() + +void %WorkTask.fn() { +block0: + invoke void %ll_listnext__listiterPtr( ) + to label %block9 unwind label %block8_exception_handling + +block8_exception_handling: ; preds = %block0 + ret void + +block9: ; preds = %block0 + %w_2690 = phi { int, int }* [ null, %block0 ] ; <{ int, int }*> [#uses=1] + %tmp.129 = getelementptr { int, int }* %w_2690, int 0, uint 1 ; <int*> [#uses=1] + %v2769 = load int* %tmp.129 ; <int> [#uses=0] + ret void +} diff --git a/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHIUse.ll b/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHIUse.ll new file mode 100644 index 0000000..6366257 --- /dev/null +++ b/test/Transforms/LowerInvoke/2005-08-03-InvokeWithPHIUse.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerinvoke -enable-correct-eh-support -disable-output + +declare fastcc int %ll_listnext__listiterPtr() + +fastcc int %WorkTask.fn() { +block0: + %v2679 = invoke fastcc int %ll_listnext__listiterPtr( ) + to label %block9 unwind label %block8_exception_handling ; <int> [#uses=1] + +block8_exception_handling: ; preds = %block0 + ret int 0 + +block9: ; preds = %block0 + %i_2689 = phi int [ %v2679, %block0 ] ; <int> [#uses=0] + ret int %i_2689 +} diff --git a/test/Transforms/LowerInvoke/basictest.ll b/test/Transforms/LowerInvoke/basictest.ll new file mode 100644 index 0000000..8c38b89 --- /dev/null +++ b/test/Transforms/LowerInvoke/basictest.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerinvoke -disable-output -enable-correct-eh-support + +implementation + +int %foo() { + invoke int %foo() to label %Ok unwind label %Crap +Ok: + invoke int %foo() to label %Ok2 unwind label %Crap +Ok2: + ret int 2 +Crap: + ret int 1 +} + +int %bar(int %blah) { + br label %doit +doit: + ;; Value live across an unwind edge. + %B2 = add int %blah, 1 + invoke int %foo() to label %Ok unwind label %Crap +Ok: + invoke int %foo() to label %Ok2 unwind label %Crap +Ok2: + ret int 2 +Crap: + ret int %B2 +} diff --git a/test/Transforms/LowerInvoke/dg.exp b/test/Transforms/LowerInvoke/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LowerInvoke/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LowerSetJmp/2003-11-05-DominanceProperties.ll b/test/Transforms/LowerSetJmp/2003-11-05-DominanceProperties.ll new file mode 100644 index 0000000..4eb2133 --- /dev/null +++ b/test/Transforms/LowerSetJmp/2003-11-05-DominanceProperties.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowersetjmp -disable-output + %struct.jmpenv = type { int, sbyte } + +implementation + +declare void %Perl_sv_setpv() +declare int %llvm.setjmp(int *) + +void %perl_call_sv() { + call void %Perl_sv_setpv( ) + %tmp.335 = getelementptr %struct.jmpenv* null, long 0, uint 0 + %tmp.336 = call int %llvm.setjmp( int* null ) + store int %tmp.336, int* %tmp.335 + ret void +} + diff --git a/test/Transforms/LowerSetJmp/dg.exp b/test/Transforms/LowerSetJmp/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LowerSetJmp/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LowerSetJmp/simpletest.ll b/test/Transforms/LowerSetJmp/simpletest.ll new file mode 100644 index 0000000..d749d5f --- /dev/null +++ b/test/Transforms/LowerSetJmp/simpletest.ll @@ -0,0 +1,32 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowersetjmp | llvm-dis | grep invoke + +%JmpBuf = type int +%.str_1 = internal constant [13 x sbyte] c"returned %d\0A\00" + +implementation + +declare void %llvm.longjmp(%JmpBuf *%B, int %Val) +declare int %llvm.setjmp(%JmpBuf *%B) + +declare void %foo() + +int %simpletest() { + %B = alloca %JmpBuf + %Val = call int %llvm.setjmp(%JmpBuf* %B) + %V = cast int %Val to bool + br bool %V, label %LongJumped, label %Normal +Normal: + call void %foo() + call void %llvm.longjmp(%JmpBuf* %B, int 42) + ret int 0 ;; not reached +LongJumped: + ret int %Val +} + +declare int %printf(sbyte*, ...) + +int %main() { + %V = call int %simpletest() + call int(sbyte*, ...)* %printf(sbyte* getelementptr ([13 x sbyte]* %.str_1, long 0, long 0), int %V) + ret int 0 +} diff --git a/test/Transforms/LowerSwitch/2003-05-01-PHIProblem.ll b/test/Transforms/LowerSwitch/2003-05-01-PHIProblem.ll new file mode 100644 index 0000000..0ff1f5c --- /dev/null +++ b/test/Transforms/LowerSwitch/2003-05-01-PHIProblem.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerswitch + +void %child(int %ct.1) { +entry: ; No predecessors! + switch uint 0, label %return [ + uint 3, label %UnifiedExitNode + uint 0, label %return + ] + +return: ; preds = %entry, %entry + %result.0 = phi int* [ null, %entry ], [ null, %entry ] ; <%struct.quad_struct*> [#uses=0] + br label %UnifiedExitNode + +UnifiedExitNode: ; preds = %entry, %return, %entry, %entry + ret void +} + diff --git a/test/Transforms/LowerSwitch/2003-08-23-EmptySwitch.ll b/test/Transforms/LowerSwitch/2003-08-23-EmptySwitch.ll new file mode 100644 index 0000000..a193cd4 --- /dev/null +++ b/test/Transforms/LowerSwitch/2003-08-23-EmptySwitch.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerswitch + +void %test() { + switch uint 0, label %Next [] +Next: + ret void +} diff --git a/test/Transforms/LowerSwitch/2004-03-13-SwitchIsDefaultCrash.ll b/test/Transforms/LowerSwitch/2004-03-13-SwitchIsDefaultCrash.ll new file mode 100644 index 0000000..1cbe853 --- /dev/null +++ b/test/Transforms/LowerSwitch/2004-03-13-SwitchIsDefaultCrash.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -lowerswitch -disable-output + +void %solve() { +entry: + %targetBlock = call ushort %solve_code( ) ; <ushort> [#uses=1] + br label %codeReplTail + +then.1: ; preds = %codeReplTail + ret void + +loopexit.0: ; preds = %codeReplTail + ret void + +codeReplTail: ; preds = %entry, %codeReplTail + switch ushort %targetBlock, label %codeReplTail [ + ushort 0, label %loopexit.0 + ushort 1, label %then.1 + ] +} + +declare ushort %solve_code() diff --git a/test/Transforms/LowerSwitch/dg.exp b/test/Transforms/LowerSwitch/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/LowerSwitch/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/LowerSwitch/feature.ll b/test/Transforms/LowerSwitch/feature.ll new file mode 100644 index 0000000..0b3cdc7 --- /dev/null +++ b/test/Transforms/LowerSwitch/feature.ll @@ -0,0 +1,51 @@ +; RUN: llvm-as %s -o - | opt -lowerswitch | llvm-dis > %t +; RUN: grep slt %t | wc -l | grep 10 +; RUN: grep ule %t | wc -l | grep 3 +; RUN: grep eq %t | wc -l | grep 9 + +define i32 @main(i32 %tmp158) { +entry: + switch i32 %tmp158, label %bb336 [ + i32 -2, label %bb338 + i32 -3, label %bb338 + i32 -4, label %bb338 + i32 -5, label %bb338 + i32 -6, label %bb338 + i32 0, label %bb338 + i32 1, label %bb338 + i32 2, label %bb338 + i32 3, label %bb338 + i32 4, label %bb338 + i32 5, label %bb338 + i32 6, label %bb338 + i32 7, label %bb + i32 8, label %bb338 + i32 9, label %bb322 + i32 10, label %bb324 + i32 11, label %bb326 + i32 12, label %bb328 + i32 13, label %bb330 + i32 14, label %bb332 + i32 15, label %bb334 + ] +bb: + ret i32 2 +bb322: + ret i32 3 +bb324: + ret i32 4 +bb326: + ret i32 5 +bb328: + ret i32 6 +bb330: + ret i32 7 +bb332: + ret i32 8 +bb334: + ret i32 9 +bb336: + ret i32 10 +bb338: + ret i32 11 +} diff --git a/test/Transforms/Mem2Reg/2002-03-28-UninitializedVal.ll b/test/Transforms/Mem2Reg/2002-03-28-UninitializedVal.ll new file mode 100644 index 0000000..b277659 --- /dev/null +++ b/test/Transforms/Mem2Reg/2002-03-28-UninitializedVal.ll @@ -0,0 +1,13 @@ +; Uninitialized values are not handled correctly. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg +; + +implementation + +int "test"() +begin + %X = alloca int ; To be promoted + %Y = load int* %X + ret int %Y +end diff --git a/test/Transforms/Mem2Reg/2002-05-01-ShouldNotPromoteThisAlloca.ll b/test/Transforms/Mem2Reg/2002-05-01-ShouldNotPromoteThisAlloca.ll new file mode 100644 index 0000000..c3d803c --- /dev/null +++ b/test/Transforms/Mem2Reg/2002-05-01-ShouldNotPromoteThisAlloca.ll @@ -0,0 +1,15 @@ +; This input caused the mem2reg pass to die because it was trying to promote +; the %r alloca, even though it is invalid to do so in this case! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg + + +implementation + +void "test"() +begin + %r = alloca int ; <int*> [#uses=2] + store int 4, int* %r + store int* %r, int** null + ret void +end diff --git a/test/Transforms/Mem2Reg/2003-04-10-DFNotFound.ll b/test/Transforms/Mem2Reg/2003-04-10-DFNotFound.ll new file mode 100644 index 0000000..918431a --- /dev/null +++ b/test/Transforms/Mem2Reg/2003-04-10-DFNotFound.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg + +implementation ; Functions: + +void %_Z3barv() { + %result = alloca int + ret void + + store int 0, int* %result ; DF not set! + ret void +} diff --git a/test/Transforms/Mem2Reg/2003-04-18-DeadBlockProblem.ll b/test/Transforms/Mem2Reg/2003-04-18-DeadBlockProblem.ll new file mode 100644 index 0000000..d6f1b77 --- /dev/null +++ b/test/Transforms/Mem2Reg/2003-04-18-DeadBlockProblem.ll @@ -0,0 +1,17 @@ +; This testcases makes sure that mem2reg can handle unreachable blocks. +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg + +int %test() { + %X = alloca int + + store int 6, int* %X + br label %Loop +Loop: + store int 5, int* %X + br label %EndOfLoop +Unreachable: + br label %EndOfLoop + +EndOfLoop: + br label %Loop +} diff --git a/test/Transforms/Mem2Reg/2003-04-24-MultipleIdenticalSuccessors.ll b/test/Transforms/Mem2Reg/2003-04-24-MultipleIdenticalSuccessors.ll new file mode 100644 index 0000000..7cd38c2 --- /dev/null +++ b/test/Transforms/Mem2Reg/2003-04-24-MultipleIdenticalSuccessors.ll @@ -0,0 +1,15 @@ +; Mem2reg used to only add one incoming value to a PHI node, even if it had +; multiple incoming edges from a block. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg -disable-output + +int %test(bool %c1, bool %c2) { + %X = alloca int + br bool %c1, label %Exit, label %B2 +B2: + store int 2, int* %X + br bool %c2, label %Exit, label %Exit +Exit: + %Y = load int *%X + ret int %Y +} diff --git a/test/Transforms/Mem2Reg/2003-06-26-IterativePromote.ll b/test/Transforms/Mem2Reg/2003-06-26-IterativePromote.ll new file mode 100644 index 0000000..ce274fa --- /dev/null +++ b/test/Transforms/Mem2Reg/2003-06-26-IterativePromote.ll @@ -0,0 +1,16 @@ +; Promoting some values allows promotion of other values. +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg | llvm-dis | not grep alloca + +int %test2() { + %result = alloca int ; ty=int* + %a = alloca int ; ty=int* + %p = alloca int* ; ty=int** + store int 0, int* %a + store int* %a, int** %p + %tmp.0 = load int** %p ; ty=int* + %tmp.1 = load int* %tmp.0 ; ty=int + store int %tmp.1, int* %result + %tmp.2 = load int* %result ; ty=int + ret int %tmp.2 +} + diff --git a/test/Transforms/Mem2Reg/2003-10-05-DeadPHIInsertion.ll b/test/Transforms/Mem2Reg/2003-10-05-DeadPHIInsertion.ll new file mode 100644 index 0000000..ab4b661 --- /dev/null +++ b/test/Transforms/Mem2Reg/2003-10-05-DeadPHIInsertion.ll @@ -0,0 +1,21 @@ +; Mem2reg should not insert dead PHI nodes! The naive algorithm inserts a PHI +; node in L3, even though there is no load of %A in anything dominated by L3. + +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg | llvm-dis | not grep phi + +void %test(int %B, bool %C) { + %A = alloca int + store int %B, int* %A + br bool %C, label %L1, label %L2 +L1: + store int %B, int* %A + %D = load int* %A + call void %test(int %D, bool false) + br label %L3 +L2: + %E = load int* %A + call void %test(int %E, bool true) + br label %L3 +L3: + ret void +} diff --git a/test/Transforms/Mem2Reg/2005-06-30-ReadBeforeWrite.ll b/test/Transforms/Mem2Reg/2005-06-30-ReadBeforeWrite.ll new file mode 100644 index 0000000..c64d848 --- /dev/null +++ b/test/Transforms/Mem2Reg/2005-06-30-ReadBeforeWrite.ll @@ -0,0 +1,51 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg -instcombine | llvm-dis | grep store +; PR590 + +void %zero(sbyte* %p, int %n) { +entry: + %p_addr = alloca sbyte* ; <sbyte**> [#uses=2] + %n_addr = alloca int ; <int*> [#uses=2] + %i = alloca int ; <int*> [#uses=6] + %out = alloca int ; <int*> [#uses=2] + %undef = alloca int ; <int*> [#uses=2] + store sbyte* %p, sbyte** %p_addr + store int %n, int* %n_addr + store int 0, int* %i + br label %loopentry + +loopentry: ; preds = %endif, %entry + %tmp.0 = load int* %n_addr ; <int> [#uses=1] + %tmp.1 = add int %tmp.0, 1 ; <int> [#uses=1] + %tmp.2 = load int* %i ; <int> [#uses=1] + %tmp.3 = setgt int %tmp.1, %tmp.2 ; <bool> [#uses=2] + %tmp.4 = cast bool %tmp.3 to int ; <int> [#uses=0] + br bool %tmp.3, label %no_exit, label %return + +no_exit: ; preds = %loopentry + %tmp.5 = load int* %undef ; <int> [#uses=1] + store int %tmp.5, int* %out + store int 0, int* %undef + %tmp.6 = load int* %i ; <int> [#uses=1] + %tmp.7 = setgt int %tmp.6, 0 ; <bool> [#uses=2] + %tmp.8 = cast bool %tmp.7 to int ; <int> [#uses=0] + br bool %tmp.7, label %then, label %endif + +then: ; preds = %no_exit + %tmp.9 = load sbyte** %p_addr ; <sbyte*> [#uses=1] + %tmp.10 = load int* %i ; <int> [#uses=1] + %tmp.11 = sub int %tmp.10, 1 ; <int> [#uses=1] + %tmp.12 = getelementptr sbyte* %tmp.9, int %tmp.11 ; <sbyte*> [#uses=1] + %tmp.13 = load int* %out ; <int> [#uses=1] + %tmp.14 = cast int %tmp.13 to sbyte ; <sbyte> [#uses=1] + store sbyte %tmp.14, sbyte* %tmp.12 + br label %endif + +endif: ; preds = %then, %no_exit + %tmp.15 = load int* %i ; <int> [#uses=1] + %inc = add int %tmp.15, 1 ; <int> [#uses=1] + store int %inc, int* %i + br label %loopentry + +return: ; preds = %loopentry + ret void +} diff --git a/test/Transforms/Mem2Reg/2005-11-28-Crash.ll b/test/Transforms/Mem2Reg/2005-11-28-Crash.ll new file mode 100644 index 0000000..01e8b85 --- /dev/null +++ b/test/Transforms/Mem2Reg/2005-11-28-Crash.ll @@ -0,0 +1,88 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg -disable-output +; PR670 + +void %printk(int, ...) { +entry: + %flags = alloca uint ; <uint*> [#uses=2] + br bool false, label %then.0, label %endif.0 + +then.0: ; preds = %entry + br label %endif.0 + +endif.0: ; preds = %then.0, %entry + store uint 0, uint* %flags + br label %loopentry + +loopentry: ; preds = %endif.3, %endif.0 + br bool false, label %no_exit, label %loopexit + +no_exit: ; preds = %loopentry + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %no_exit + br bool false, label %shortcirc_done.0, label %shortcirc_next.0 + +shortcirc_next.0: ; preds = %then.1 + br label %shortcirc_done.0 + +shortcirc_done.0: ; preds = %shortcirc_next.0, %then.1 + br bool false, label %shortcirc_done.1, label %shortcirc_next.1 + +shortcirc_next.1: ; preds = %shortcirc_done.0 + br label %shortcirc_done.1 + +shortcirc_done.1: ; preds = %shortcirc_next.1, %shortcirc_done.0 + br bool false, label %shortcirc_done.2, label %shortcirc_next.2 + +shortcirc_next.2: ; preds = %shortcirc_done.1 + br label %shortcirc_done.2 + +shortcirc_done.2: ; preds = %shortcirc_next.2, %shortcirc_done.1 + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %shortcirc_done.2 + br label %endif.2 + +endif.2: ; preds = %then.2, %shortcirc_done.2 + br label %endif.1 + +endif.1: ; preds = %endif.2, %no_exit + br bool false, label %then.3, label %endif.3 + +then.3: ; preds = %endif.1 + br label %endif.3 + +endif.3: ; preds = %then.3, %endif.1 + br label %loopentry + +loopexit: ; preds = %loopentry + br label %endif.4 + +then.4: ; No predecessors! + %tmp.61 = load uint* %flags ; <uint> [#uses=0] + br label %out + +dead_block_after_goto: ; No predecessors! + br label %endif.4 + +endif.4: ; preds = %dead_block_after_goto, %loopexit + br bool false, label %then.5, label %else + +then.5: ; preds = %endif.4 + br label %endif.5 + +else: ; preds = %endif.4 + br label %endif.5 + +endif.5: ; preds = %else, %then.5 + br label %out + +out: ; preds = %endif.5, %then.4 + br label %return + +after_ret: ; No predecessors! + br label %return + +return: ; preds = %after_ret, %out + ret void +} diff --git a/test/Transforms/Mem2Reg/PromoteMemToRegister.ll b/test/Transforms/Mem2Reg/PromoteMemToRegister.ll new file mode 100644 index 0000000..8bf7b51 --- /dev/null +++ b/test/Transforms/Mem2Reg/PromoteMemToRegister.ll @@ -0,0 +1,24 @@ +; Simple sanity check testcase. Both alloca's should be eliminated. +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg | llvm-dis | not grep alloca + +implementation + +double "testfunc"(int %i, double %j) +begin + %I = alloca int + %J = alloca double + + store int %i, int* %I + store double %j, double* %J + + %t1 = load int* %I + %t2 = add int %t1, 1 + store int %t2, int* %I + + %t3 = load int* %I + %t4 = cast int %t3 to double + %t5 = load double* %J + %t6 = mul double %t4, %t5 + + ret double %t6 +end diff --git a/test/Transforms/Mem2Reg/UndefValuesMerge.ll b/test/Transforms/Mem2Reg/UndefValuesMerge.ll new file mode 100644 index 0000000..dc2f011 --- /dev/null +++ b/test/Transforms/Mem2Reg/UndefValuesMerge.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -mem2reg | llvm-dis | not grep phi + +implementation + +int %testfunc(bool %C, int %i, sbyte %j) { + %I = alloca int + br bool %C, label %T, label %Cont +T: + store int %i, int* %I + br label %Cont +Cont: + %Y = load int* %I ;; %Y = phi %i, undef -> %Y = %i + ret int %Y +} diff --git a/test/Transforms/Mem2Reg/dg.exp b/test/Transforms/Mem2Reg/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/Mem2Reg/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/PredicateSimplifier/2006-08-02-Switch.ll b/test/Transforms/PredicateSimplifier/2006-08-02-Switch.ll new file mode 100644 index 0000000..1d19516 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-08-02-Switch.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +fastcc void %_ov_splice(int %n1, int %n2, int %ch2) { +entry: + %tmp = setgt int %n1, %n2 ; <bool> [#uses=1] + %n.0 = select bool %tmp, int %n2, int %n1 ; <int> [#uses=1] + %tmp104 = setlt int 0, %ch2 ; <bool> [#uses=1] + br bool %tmp104, label %cond_true105, label %return + +cond_true95: ; preds = %cond_true105 + ret void + +bb98: ; preds = %cond_true105 + ret void + +cond_true105: ; preds = %entry + %tmp94 = setgt int %n.0, 0 ; <bool> [#uses=1] + br bool %tmp94, label %cond_true95, label %bb98 + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-08-07-LeaderOffByOne.ll b/test/Transforms/PredicateSimplifier/2006-08-07-LeaderOffByOne.ll new file mode 100644 index 0000000..1322b90 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-08-07-LeaderOffByOne.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +void %safe_strcpy(uint %size1) { +entry: + %tmp = seteq uint %size1, 0 ; <bool> [#uses=1] + br bool %tmp, label %return, label %strlen.exit + +strlen.exit: ; preds = %entry + %tmp = cast ulong 0 to uint ; <uint> [#uses=2] + %tmp6 = setlt uint %tmp, %size1 ; <bool> [#uses=1] + br bool %tmp6, label %cond_true7, label %cond_false19 + +cond_true7: ; preds = %strlen.exit + %tmp9 = seteq uint %tmp, 0 ; <bool> [#uses=1] + br bool %tmp9, label %cond_next15, label %cond_true10 + +cond_true10: ; preds = %cond_true7 + ret void + +cond_next15: ; preds = %cond_true7 + ret void + +cond_false19: ; preds = %strlen.exit + ret void + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-09-20-ResolveCycle.ll b/test/Transforms/PredicateSimplifier/2006-09-20-ResolveCycle.ll new file mode 100644 index 0000000..83e5eac --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-09-20-ResolveCycle.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +void %gs_image_next() { +entry: + %tmp = load uint* null ; <uint> [#uses=2] + br bool false, label %cond_next21, label %UnifiedReturnBlock + +cond_next21: ; preds = %entry + br bool false, label %cond_next42, label %UnifiedReturnBlock + +cond_next42: ; preds = %cond_next21 + br label %cond_true158 + +cond_next134: ; preds = %cond_true158 + %tmp1571 = seteq uint 0, %min ; <bool> [#uses=0] + ret void + +cond_true158: ; preds = %cond_true158, %cond_next42 + %tmp47 = sub uint %tmp, 0 ; <uint> [#uses=2] + %tmp49 = setle uint %tmp47, 0 ; <bool> [#uses=1] + %min = select bool %tmp49, uint %tmp47, uint 0 ; <uint> [#uses=2] + %tmp92 = add uint %min, 0 ; <uint> [#uses=1] + %tmp101 = seteq uint %tmp92, %tmp ; <bool> [#uses=1] + br bool %tmp101, label %cond_next134, label %cond_true158 + +UnifiedReturnBlock: ; preds = %cond_next21, %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-09-20-SetCC.ll b/test/Transforms/PredicateSimplifier/2006-09-20-SetCC.ll new file mode 100644 index 0000000..1023497 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-09-20-SetCC.ll @@ -0,0 +1,54 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify | llvm-dis | grep br | grep return.i.bb8_crit_edge | grep false + +%str = external global [4 x sbyte] ; <[4 x sbyte]*> [#uses=1] + +implementation ; Functions: + +declare int %sprintf(sbyte*, sbyte*, ...) + +int %main() { +entry: + br label %cond_true.outer + +cond_true.outer: ; preds = %cond_true.i, %entry + %i.0.0.ph = phi int [ 0, %entry ], [ %tmp5, %cond_true.i ] ; <int> [#uses=1] + %j.0.0.ph = phi int [ 0, %entry ], [ %tmp312, %cond_true.i ] ; <int> [#uses=2] + br label %cond_true + +cond_true: ; preds = %return.i, %cond_true.outer + %indvar.ui = phi uint [ 0, %cond_true.outer ], [ %indvar.next, %return.i ] ; <uint> [#uses=2] + %indvar = cast uint %indvar.ui to int ; <int> [#uses=1] + %i.0.0 = add int %indvar, %i.0.0.ph ; <int> [#uses=3] + %savedstack = call sbyte* %llvm.stacksave( ) ; <sbyte*> [#uses=2] + %tmp.i = seteq int %i.0.0, 0 ; <bool> [#uses=1] + %tmp5 = add int %i.0.0, 1 ; <int> [#uses=3] + br bool %tmp.i, label %return.i, label %cond_true.i + +cond_true.i: ; preds = %cond_true + %tmp.i = alloca [1000 x sbyte] ; <[1000 x sbyte]*> [#uses=1] + %tmp.sub.i = getelementptr [1000 x sbyte]* %tmp.i, int 0, int 0 ; <sbyte*> [#uses=2] + %tmp4.i = call int (sbyte*, sbyte*, ...)* %sprintf( sbyte* %tmp.sub.i, sbyte* getelementptr ([4 x sbyte]* %str, int 0, uint 0), int %i.0.0 ) ; <int> [#uses=0] + %tmp.i = load sbyte* %tmp.sub.i ; <sbyte> [#uses=1] + %tmp7.i = cast sbyte %tmp.i to int ; <int> [#uses=1] + call void %llvm.stackrestore( sbyte* %savedstack ) + %tmp312 = add int %tmp7.i, %j.0.0.ph ; <int> [#uses=2] + %tmp19 = setgt int %tmp5, 9999 ; <bool> [#uses=1] + br bool %tmp19, label %bb8, label %cond_true.outer + +return.i: ; preds = %cond_true + call void %llvm.stackrestore( sbyte* %savedstack ) + %tmp21 = setgt int %tmp5, 9999 ; <bool> [#uses=1] + %indvar.next = add uint %indvar.ui, 1 ; <uint> [#uses=1] + br bool %tmp21, label %bb8, label %cond_true + +bb8: ; preds = %return.i, %cond_true.i + %j.0.1 = phi int [ %j.0.0.ph, %return.i ], [ %tmp312, %cond_true.i ] ; <int> [#uses=1] + %tmp10 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([4 x sbyte]* %str, int 0, uint 0), int %j.0.1 ) ; <int> [#uses=0] + ret int undef +} + +declare int %printf(sbyte*, ...) + +declare sbyte* %llvm.stacksave() + +declare void %llvm.stackrestore(sbyte*) diff --git a/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll b/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll new file mode 100644 index 0000000..07bf098 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll @@ -0,0 +1,53 @@ +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -predsimplify -instcombine -simplifycfg | llvm-dis > %t +; RUN: grep -v declare %t | not grep fail +; RUN: grep -v declare %t | grep -c pass | grep 3 + +int %test1(int %x, int %y) { +entry: + %tmp2 = or int %x, %y ; <int> [#uses=1] + %tmp = seteq int %tmp2, 0 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %return + +cond_true: ; preds = %entry + %tmp4 = seteq int %x, 0 ; <bool> [#uses=1] + br bool %tmp4, label %cond_true5, label %cond_false + +cond_true5: ; preds = %cond_true + %tmp6 = call int %pass( ) ; <int> [#uses=1] + ret int %tmp6 + +cond_false: + %tmp8 = call int %fail ( ) ; <int> [#uses=1] + ret int %tmp8 + +return: ; preds = %cond_next7 + ret int 0 +} + +int %test2(int %x, int %y) { +entry: + %tmp2 = or int %x, %y ; <int> [#uses=1] + %tmp = setne int %tmp2, 0 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %return + +cond_true: ; preds = %entry + %tmp4 = seteq int %x, 0 ; <bool> [#uses=1] + br bool %tmp4, label %cond_true5, label %cond_false + +cond_true5: ; preds = %cond_true + %tmp6 = call int %pass1( ) ; <int> [#uses=1] + ret int %tmp6 + +cond_false: + %tmp8 = call int %pass2( ) ; <int> [#uses=1] + ret int %tmp8 + +return: ; preds = %cond_next7 + ret int 0 +} + +declare int %fail() +declare int %pass() +declare int %pass1() +declare int %pass2() diff --git a/test/Transforms/PredicateSimplifier/2006-10-25-AddSetCC.ll b/test/Transforms/PredicateSimplifier/2006-10-25-AddSetCC.ll new file mode 100644 index 0000000..a904012 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-10-25-AddSetCC.ll @@ -0,0 +1,28 @@ +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -predsimplify -instcombine -simplifycfg | llvm-dis | \ +; RUN: grep -v declare | grep -c pass | grep 2 + +int %test(int %x, int %y) { +entry: + %tmp2 = setlt int %x, %y + %tmp = setne bool %tmp2, true + br bool %tmp, label %cond_true, label %return + +cond_true: ; preds = %entry + %tmp4 = seteq int %x, %y ; <bool> [#uses=1] + br bool %tmp4, label %cond_true5, label %cond_false + +cond_true5: ; preds = %cond_true + %tmp6 = call int %pass1( ) ; <int> [#uses=1] + ret int %tmp6 + +cond_false: + %tmp8 = call int %pass2( ) ; <int> [#uses=1] + ret int %tmp8 + +return: ; preds = %cond_next7 + ret int 0 +} + +declare int %pass1() +declare int %pass2() diff --git a/test/Transforms/PredicateSimplifier/2006-11-04-ImpossibleGT.ll b/test/Transforms/PredicateSimplifier/2006-11-04-ImpossibleGT.ll new file mode 100644 index 0000000..32ed495 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-11-04-ImpossibleGT.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +void %readMotionInfoFromNAL() { +entry: + br bool false, label %bb2425, label %cond_next30 + +cond_next30: ; preds = %entry + ret void + +bb2418: ; preds = %bb2425 + ret void + +bb2425: ; preds = %entry + %tmp2427 = setgt int 0, 3 ; <bool> [#uses=1] + br bool %tmp2427, label %cond_next2429, label %bb2418 + +cond_next2429: ; preds = %bb2425 + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-11-04-ReplacingZeros.ll b/test/Transforms/PredicateSimplifier/2006-11-04-ReplacingZeros.ll new file mode 100644 index 0000000..74daa7e --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-11-04-ReplacingZeros.ll @@ -0,0 +1,30 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +int %test_wp_B_slice(int %select_method) { +entry: + br label %bb309 + +cond_true114: ; preds = %bb309 + %tmp130 = setlt int 0, 128 ; <bool> [#uses=1] + %min = select bool %tmp130, int 0, int 127 ; <int> [#uses=2] + %tmp143 = load int* null ; <int> [#uses=1] + br bool false, label %bb303, label %bb314 + +cond_true166: ; preds = %bb303 + ret int 0 + +cond_false200: ; preds = %bb303 + %tmp205 = sdiv int %min, 2 ; <int> [#uses=1] + %iftmp.380.0.p = select bool false, int 0, int %tmp205 ; <int> [#uses=0] + ret int 0 + +bb303: ; preds = %cond_true114 + %tmp165 = seteq int %min, 0 ; <bool> [#uses=1] + br bool %tmp165, label %cond_true166, label %cond_false200 + +bb309: ; preds = %bb19 + br bool false, label %cond_true114, label %bb314 + +bb314: ; preds = %bb309 + ret int 0 +} diff --git a/test/Transforms/PredicateSimplifier/2006-11-05-CycleGTLT.ll b/test/Transforms/PredicateSimplifier/2006-11-05-CycleGTLT.ll new file mode 100644 index 0000000..fccc6db --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-11-05-CycleGTLT.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +void %diff(int %N) { +entry: + %tmp = setgt int %N, 0 ; <bool> [#uses=1] + br bool %tmp, label %bb519, label %bb744 + +bb519: ; preds = %entry + %tmp720101 = setlt int %N, 0 ; <bool> [#uses=1] + br bool %tmp720101, label %bb744, label %bb744 + +bb744: ; preds = %bb519, %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-11-11-Squeeze.ll b/test/Transforms/PredicateSimplifier/2006-11-11-Squeeze.ll new file mode 100644 index 0000000..cf748cd --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-11-11-Squeeze.ll @@ -0,0 +1,31 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + + %struct.cube_struct = type { int, int, int, int*, int*, int*, int*, int*, uint*, uint*, uint**, uint**, uint*, uint*, uint, int, int*, int, int } +%cube = external global %struct.cube_struct ; <%struct.cube_struct*> [#uses=2] + +implementation ; Functions: + +fastcc void %cube_setup() { +entry: + %tmp = load int* getelementptr (%struct.cube_struct* %cube, int 0, uint 2) ; <int> [#uses=2] + %tmp = setlt int %tmp, 0 ; <bool> [#uses=1] + br bool %tmp, label %bb, label %cond_next + +cond_next: ; preds = %entry + %tmp2 = load int* getelementptr (%struct.cube_struct* %cube, int 0, uint 1) ; <int> [#uses=2] + %tmp5 = setlt int %tmp2, %tmp ; <bool> [#uses=1] + br bool %tmp5, label %bb, label %bb6 + +bb: ; preds = %cond_next, %entry + unreachable + +bb6: ; preds = %cond_next + %tmp98124 = setgt int %tmp2, 0 ; <bool> [#uses=1] + br bool %tmp98124, label %bb42, label %bb99 + +bb42: ; preds = %bb6 + ret void + +bb99: ; preds = %bb6 + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2006-11-12-MergeNodes.ll b/test/Transforms/PredicateSimplifier/2006-11-12-MergeNodes.ll new file mode 100644 index 0000000..5f143ed --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2006-11-12-MergeNodes.ll @@ -0,0 +1,54 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +; ModuleID = 'b.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +deplibs = [ "c", "crtend" ] + %struct.VDIR_ST = type { int, int, int, %struct.acl*, %struct.pfile*, %struct.vlink*, %struct.vlink*, %struct.vlink*, %struct.VDIR_ST*, %struct.VDIR_ST* } + %struct.acl = type { int, sbyte*, sbyte*, sbyte*, %struct.restrict*, %struct.acl*, %struct.acl* } + %struct.avalue = type { sbyte* } + %struct.pattrib = type { sbyte, sbyte*, sbyte*, %struct.avalue, %struct.pattrib*, %struct.pattrib* } + %struct.pfile = type { int, int, int, int, int, %struct.vlink*, %struct.vlink*, %struct.pattrib*, %struct.pfile*, %struct.pfile* } + %struct.restrict = type { %struct.acl*, %struct.acl* } + %struct.vlink = type { int, sbyte*, sbyte, int, sbyte*, %struct.vlink*, %struct.vlink*, sbyte*, sbyte*, sbyte*, sbyte*, int, int, %struct.acl*, int, int, sbyte*, %struct.pattrib*, %struct.pfile*, %struct.vlink*, %struct.vlink* } + +implementation ; Functions: + +void %vl_insert(%struct.vlink* %vl) { +entry: + %tmp91 = call int %vl_comp( ) ; <int> [#uses=2] + %tmp93 = setgt int %tmp91, 0 ; <bool> [#uses=1] + br bool %tmp93, label %cond_next84, label %bb94 + +cond_next84: ; preds = %entry + ret void + +bb94: ; preds = %entry + %tmp96 = seteq int %tmp91, 0 ; <bool> [#uses=1] + br bool %tmp96, label %cond_true97, label %cond_next203 + +cond_true97: ; preds = %bb94 + br bool false, label %cond_next105, label %cond_true102 + +cond_true102: ; preds = %cond_true97 + ret void + +cond_next105: ; preds = %cond_true97 + %tmp110 = getelementptr %struct.vlink* %vl, int 0, uint 12 ; <int*> [#uses=1] + %tmp111 = load int* %tmp110 ; <int> [#uses=1] + %tmp129 = seteq int %tmp111, 0 ; <bool> [#uses=1] + br bool %tmp129, label %cond_true130, label %cond_next133 + +cond_true130: ; preds = %cond_next105 + ret void + +cond_next133: ; preds = %cond_next105 + ret void + +cond_next203: ; preds = %bb94 + ret void +} + +declare int %vl_comp() diff --git a/test/Transforms/PredicateSimplifier/2007-01-04-SelectSwitch.ll b/test/Transforms/PredicateSimplifier/2007-01-04-SelectSwitch.ll new file mode 100644 index 0000000..141d4e2 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2007-01-04-SelectSwitch.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +void %ercMarkCurrMBConcealed(int %comp) { +entry: + %tmp5 = icmp slt int %comp, 0 ; <bool> [#uses=2] + %comp_addr.0 = select bool %tmp5, int 0, int %comp ; <int> [#uses=1] + switch int %comp_addr.0, label %return [ + int 0, label %bb + ] + +bb: ; preds = %entry + br bool %tmp5, label %bb87.bb97_crit_edge.critedge, label %return + +bb87.bb97_crit_edge.critedge: ; preds = %bb + ret void + +return: ; preds = %bb, %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/2007-03-17-OpsToDefVRP.ll b/test/Transforms/PredicateSimplifier/2007-03-17-OpsToDefVRP.ll new file mode 100644 index 0000000..0a45e7c --- /dev/null +++ b/test/Transforms/PredicateSimplifier/2007-03-17-OpsToDefVRP.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -predsimplify | llvm-dis | grep -v %c +define void @foo(i8* %X, i8* %Y) { +entry: + %A = load i8* %X + %B = load i8* %Y + %a = icmp ult i8 %B, 10 + br i1 %a, label %cond_true, label %URB +cond_true: + %b = icmp eq i8 %A, %B + br i1 %b, label %cond_true2, label %URB +cond_true2: + %c = icmp ult i8 %A, 11 + call i8 @bar(i1 %c) + ret void +URB: + ret void +} + +declare i8 @bar(i1) diff --git a/test/Transforms/PredicateSimplifier/dg.exp b/test/Transforms/PredicateSimplifier/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/PredicateSimplifier/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/PredicateSimplifier/predsimplify.ll b/test/Transforms/PredicateSimplifier/predsimplify.ll new file mode 100644 index 0000000..b88122f --- /dev/null +++ b/test/Transforms/PredicateSimplifier/predsimplify.ll @@ -0,0 +1,309 @@ +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -predsimplify -instcombine -simplifycfg | llvm-dis > %t +; RUN: grep -v declare %t | not grep fail +; RUN: grep -v declare %t | grep -c pass | grep 4 + +void %test1(int %x) { +entry: + %A = seteq int %x, 0 + br bool %A, label %then.1, label %else.1 +then.1: + %B = seteq int %x, 1 + br bool %B, label %then.2, label %else.1 +then.2: + call void (...)* %fail( ) + ret void +else.1: + ret void +} + +void %test2(int %x) { +entry: + %A = seteq int %x, 0 + %B = seteq int %x, 1 + br bool %A, label %then.1, label %else.1 +then.1: + br bool %B, label %then.2, label %else.1 +then.2: + call void (...)* %fail( ) + ret void +else.1: + ret void +} + +void %test3(int %x) { +entry: + %A = seteq int %x, 0 + %B = seteq int %x, 1 + br bool %A, label %then.1, label %else.1 +then.1: + br bool %B, label %then.2, label %else.1 +then.2: + call void (...)* %fail( ) + ret void +else.1: + ret void +} + +void %test4(int %x, int %y) { +entry: + %A = seteq int %x, 0 + %B = seteq int %y, 0 + %C = and bool %A, %B + br bool %C, label %then.1, label %else.1 +then.1: + %D = seteq int %x, 0 + br bool %D, label %then.2, label %else.2 +then.2: + %E = seteq int %y, 0 + br bool %E, label %else.1, label %else.2 +else.1: + ret void +else.2: + call void (...)* %fail( ) + ret void +} + +void %test5(int %x) { +entry: + %A = seteq int %x, 0 + br bool %A, label %then.1, label %else.1 +then.1: + ret void +then.2: + call void (...)* %fail( ) + ret void +else.1: + %B = seteq int %x, 0 + br bool %B, label %then.2, label %then.1 +} + +void %test6(int %x, int %y) { +entry: + %A = seteq int %x, 0 + %B = seteq int %y, 0 + %C = or bool %A, %B + br bool %C, label %then.1, label %else.1 +then.1: + ret void +then.2: + call void (...)* %fail( ) + ret void +else.1: + %D = seteq int %x, 0 + br bool %D, label %then.2, label %else.2 +else.2: + %E = setne int %y, 0 + br bool %E, label %then.1, label %then.2 +} + +void %test7(int %x) { +entry: + %A = setne int %x, 0 + %B = xor bool %A, true + br bool %B, label %then.1, label %else.1 +then.1: + %C = seteq int %x, 1 + br bool %C, label %then.2, label %else.1 +then.2: + call void (...)* %fail( ) + ret void +else.1: + ret void +} + +void %test8(int %x) { +entry: + %A = add int %x, 1 + %B = seteq int %x, 0 + br bool %B, label %then.1, label %then.2 +then.1: + %C = seteq int %A, 1 + br bool %C, label %then.2, label %else.2 +then.2: + ret void +else.2: + call void (...)* %fail( ) + ret void +} + +void %test9(int %y, int %z) { +entry: + %x = add int %y, %z + %A = seteq int %y, 3 + %B = seteq int %z, 5 + %C = and bool %A, %B + br bool %C, label %cond_true, label %return + +cond_true: + %D = seteq int %x, 8 + br bool %D, label %then, label %oops + +then: + call void (...)* %pass( ) + ret void + +oops: + call void (...)* %fail( ) + ret void + +return: + ret void +} + +void %test10() { +entry: + %A = alloca int + %B = seteq int* %A, null + br bool %B, label %cond_true, label %cond_false + +cond_true: + call void (...)* %fail ( ) + ret void + +cond_false: + call void (...)* %pass ( ) + ret void +} + +void %switch1(int %x) { +entry: + %A = seteq int %x, 10 + br bool %A, label %return, label %cond_false + +cond_false: + switch int %x, label %return [ + int 9, label %then1 + int 10, label %then2 + ] + +then1: + call void (...)* %pass( ) + ret void + +then2: + call void (...)* %fail( ) + ret void + +return: + ret void +} + +void %switch2(int %x) { +entry: + %A = seteq int %x, 10 + br bool %A, label %return, label %cond_false + +cond_false: + switch int %x, label %return [ + int 8, label %then1 + int 9, label %then1 + int 10, label %then1 + ] + +then1: + %B = setne int %x, 8 + br bool %B, label %then2, label %return + +then2: + call void (...)* %pass( ) + ret void + +return: + ret void +} + +void %switch3(int %x) { +entry: + %A = seteq int %x, 10 + br bool %A, label %return, label %cond_false + +cond_false: + switch int %x, label %return [ + int 9, label %then1 + int 10, label %then1 + ] + +then1: + %B = seteq int %x, 9 + br bool %B, label %return, label %oops + +oops: + call void (...)* %fail( ) + ret void + +return: + ret void +} + +void %switch4(int %x) { +entry: + %A = seteq int %x, 10 + br bool %A, label %then1, label %cond_false + +cond_false: + switch int %x, label %default [ + int 9, label %then1 + int 10, label %then2 + ] + +then1: + ret void + +then2: + ret void + +default: + %B = seteq int %x, 9 + br bool %B, label %oops, label %then1 + +oops: + call void (...)* %fail( ) + ret void +} + +void %select1(int %x) { +entry: + %A = seteq int %x, 10 + %B = select bool %A, int 1, int 2 + %C = seteq int %B, 1 + br bool %C, label %then, label %else + +then: + br bool %A, label %return, label %oops + +else: + br bool %A, label %oops, label %return + +oops: + call void (...)* %fail( ) + ret void + +return: + ret void +} + +void %select2(int %x) { +entry: + %A = seteq int %x, 10 + %B = select bool %A, int 1, int 2 + %C = seteq int %B, 1 + br bool %A, label %then, label %else + +then: + br bool %C, label %return, label %oops + +else: + br bool %C, label %oops, label %return + +oops: + call void (...)* %fail( ) + ret void + +return: + ret void +} + +declare void %fail(...) + +declare void %pass(...) diff --git a/test/Transforms/PredicateSimplifier/predsimplify.reg1.ll b/test/Transforms/PredicateSimplifier/predsimplify.reg1.ll new file mode 100644 index 0000000..caa41b3 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/predsimplify.reg1.ll @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -verify + +void %dgefa() { +entry: + br label %cond_true96 + +cond_true: ; preds = %cond_true96 + %tmp19 = seteq int %tmp10, %k.0 ; <bool> [#uses=1] + br bool %tmp19, label %cond_next, label %cond_true20 + +cond_true20: ; preds = %cond_true + br label %cond_next + +cond_next: ; preds = %cond_true20, %cond_true + %tmp84 = setgt int %tmp3, 1999 ; <bool> [#uses=0] + ret void + +cond_true96: ; preds = %cond_true96, %entry + %k.0 = phi int [ 0, %entry ], [ 0, %cond_true96 ] ; <int> [#uses=3] + %tmp3 = add int %k.0, 1 ; <int> [#uses=1] + %tmp10 = add int 0, %k.0 ; <int> [#uses=1] + br bool false, label %cond_true96, label %cond_true +} diff --git a/test/Transforms/PredicateSimplifier/predsimplify.reg2.ll b/test/Transforms/PredicateSimplifier/predsimplify.reg2.ll new file mode 100644 index 0000000..e7593fa --- /dev/null +++ b/test/Transforms/PredicateSimplifier/predsimplify.reg2.ll @@ -0,0 +1,49 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -verify + +; ModuleID = 'bugpoint-reduced-simplified.bc' +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +deplibs = [ "c", "crtend" ] + %struct.anon = type { %struct.set_family*, %struct.set_family*, %struct.set_family*, sbyte*, int, uint*, %struct.pair_struct*, sbyte**, %struct.symbolic_t*, %struct.symbolic_t* } + %struct.pair_struct = type { int, int*, int* } + %struct.set_family = type { int, int, int, int, int, uint*, %struct.set_family* } + %struct.symbolic_label_t = type { sbyte*, %struct.symbolic_label_t* } + %struct.symbolic_list_t = type { int, int, %struct.symbolic_list_t* } + %struct.symbolic_t = type { %struct.symbolic_list_t*, int, %struct.symbolic_label_t*, int, %struct.symbolic_t* } + +implementation ; Functions: + +void %find_pairing_cost(int %strategy) { +entry: + br bool false, label %cond_true299, label %bb314 + +bb94: ; preds = %cond_true299 + switch int %strategy, label %bb246 [ + int 0, label %bb196 + int 1, label %bb159 + ] + +cond_next113: ; preds = %cond_true299 + switch int %strategy, label %bb246 [ + int 0, label %bb196 + int 1, label %bb159 + ] + +bb159: ; preds = %cond_next113, %bb94 + ret void + +bb196: ; preds = %cond_next113, %bb94 + %Rsave.0.3 = phi %struct.set_family* [ null, %bb94 ], [ null, %cond_next113 ] ; <%struct.set_family*> [#uses=0] + ret void + +bb246: ; preds = %cond_next113, %bb94 + br label %bb314 + +cond_true299: ; preds = %entry + %tmp55 = setgt int %strategy, 0 ; <bool> [#uses=1] + br bool %tmp55, label %bb94, label %cond_next113 + +bb314: ; preds = %bb246, %entry + ret void +} diff --git a/test/Transforms/PredicateSimplifier/predsimplify.reg3.ll b/test/Transforms/PredicateSimplifier/predsimplify.reg3.ll new file mode 100644 index 0000000..82e48b7 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/predsimplify.reg3.ll @@ -0,0 +1,21 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -simplifycfg | llvm-dis | grep pass + +void %regtest(int %x) { +entry: + %A = seteq int %x, 0 + br bool %A, label %middle, label %after +middle: + br label %after +after: + %B = seteq int %x, 0 + br bool %B, label %then, label %else +then: + br label %end +else: + call void (...)* %pass( ) + br label %end +end: + ret void +} + +declare void %pass(...) diff --git a/test/Transforms/PredicateSimplifier/predsimplify.reg4.ll b/test/Transforms/PredicateSimplifier/predsimplify.reg4.ll new file mode 100644 index 0000000..3817e87 --- /dev/null +++ b/test/Transforms/PredicateSimplifier/predsimplify.reg4.ll @@ -0,0 +1,36 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -predsimplify -disable-output + +; ModuleID = '<stdin>' +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + +implementation ; Functions: + +void %f(int %x, int %y) { +entry: + %tmp = seteq int %x, 10 ; <bool> [#uses=1] + %tmp.not = xor bool %tmp, true ; <bool> [#uses=1] + %tmp3 = seteq int %x, %y ; <bool> [#uses=1] + %bothcond = and bool %tmp.not, %tmp3 ; <bool> [#uses=1] + br bool %bothcond, label %cond_true4, label %return + +cond_true4: ; preds = %entry + switch int %y, label %return [ + int 9, label %bb + int 10, label %bb6 + ] + +bb: ; preds = %cond_true4 + call void %g( int 9 ) + ret void + +bb6: ; preds = %cond_true4 + call void %g( int 10 ) + ret void + +return: ; preds = %cond_true4, %entry + ret void +} + +declare void %g(int) diff --git a/test/Transforms/PruneEH/2003-09-14-ExternalCall.llx b/test/Transforms/PruneEH/2003-09-14-ExternalCall.llx new file mode 100644 index 0000000..0ca05d6 --- /dev/null +++ b/test/Transforms/PruneEH/2003-09-14-ExternalCall.llx @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -prune-eh | llvm-dis | grep invoke + +declare void %External() + +implementation + +void %foo() { + invoke void %External() to label %Cont except label %Cont +Cont: + ret void +} diff --git a/test/Transforms/PruneEH/2003-11-21-PHIUpdate.llx b/test/Transforms/PruneEH/2003-11-21-PHIUpdate.llx new file mode 100644 index 0000000..3b272fc --- /dev/null +++ b/test/Transforms/PruneEH/2003-11-21-PHIUpdate.llx @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -prune-eh -disable-output + +implementation + +internal void %callee() { ; does not throw + ret void +} + +int %caller() { + invoke void %callee() to label %E except label %E + +E: + %X = phi int [0, %0], [0, %0] + ret int %X +} diff --git a/test/Transforms/PruneEH/dg.exp b/test/Transforms/PruneEH/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/PruneEH/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/PruneEH/recursivetest.llx b/test/Transforms/PruneEH/recursivetest.llx new file mode 100644 index 0000000..0ef33b5 --- /dev/null +++ b/test/Transforms/PruneEH/recursivetest.llx @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -prune-eh | llvm-dis | not grep invoke + +implementation + +internal int %foo() { + invoke int %foo() to label %Normal except label %Except +Normal: + ret int 12 +Except: + ret int 123 +} + +int %caller() { + invoke int %foo() to label %Normal except label %Except +Normal: + ret int 0 +Except: + ret int 1 +} diff --git a/test/Transforms/PruneEH/simplenoreturntest.ll b/test/Transforms/PruneEH/simplenoreturntest.ll new file mode 100644 index 0000000..4a998b1 --- /dev/null +++ b/test/Transforms/PruneEH/simplenoreturntest.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -prune-eh | llvm-dis | \ +; RUN: not grep {ret i32} + +void %noreturn() { + unwind +} + +int %caller() { + ; noreturn never returns, so the ret is unreachable. + call void %noreturn() + ret int 17 +} + +int %caller2() { + %T = call int %caller() + ret int %T ;; this is also unreachable! +} diff --git a/test/Transforms/PruneEH/simpletest.llx b/test/Transforms/PruneEH/simpletest.llx new file mode 100644 index 0000000..c368534 --- /dev/null +++ b/test/Transforms/PruneEH/simpletest.llx @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -prune-eh | llvm-dis | not grep invoke + +implementation + +internal void %foo() { + ret void ; does not throw +} + +int %caller() { + invoke void %foo() to label %Normal except label %Except +Normal: + ret int 0 +Except: + ret int 1 +} diff --git a/test/Transforms/RaiseAllocations/2004-11-08-FreeUseCrash.ll b/test/Transforms/RaiseAllocations/2004-11-08-FreeUseCrash.ll new file mode 100644 index 0000000..389047e --- /dev/null +++ b/test/Transforms/RaiseAllocations/2004-11-08-FreeUseCrash.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -raiseallocs -disable-output +implementation ; Functions: + +void %main() { + %tmp.13 = call int (...)* %free( int 32 ) + %tmp.14 = cast int %tmp.13 to int* + ret void +} + +declare int %free(...) diff --git a/test/Transforms/RaiseAllocations/FreeCastConstantExpr.ll b/test/Transforms/RaiseAllocations/FreeCastConstantExpr.ll new file mode 100644 index 0000000..008aea4 --- /dev/null +++ b/test/Transforms/RaiseAllocations/FreeCastConstantExpr.ll @@ -0,0 +1,10 @@ +; This situation can occur due to the funcresolve pass. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -raiseallocs | llvm-dis | not grep call + +declare void %free(sbyte*) + +void %test(int *%P) { + call void(int*)* cast (void(sbyte*)* %free to void(int*)*)(int* %P) + ret void +} diff --git a/test/Transforms/RaiseAllocations/dg.exp b/test/Transforms/RaiseAllocations/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/RaiseAllocations/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/Reassociate/2002-05-15-AgressiveSubMove.ll b/test/Transforms/Reassociate/2002-05-15-AgressiveSubMove.ll new file mode 100644 index 0000000..a7b0df1 --- /dev/null +++ b/test/Transforms/Reassociate/2002-05-15-AgressiveSubMove.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine -constprop -dce | llvm-dis | not grep add + +int %test(int %A) { + %X = add int %A, 1 + %Y = add int %A, 1 + %r = sub int %X, %Y + ret int %r ; Should be equal to 0! +} diff --git a/test/Transforms/Reassociate/2002-05-15-MissedTree.ll b/test/Transforms/Reassociate/2002-05-15-MissedTree.ll new file mode 100644 index 0000000..176948a --- /dev/null +++ b/test/Transforms/Reassociate/2002-05-15-MissedTree.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine -constprop -die | llvm-dis | not grep 5 + +int %test(int %A, int %B) { + %W = add int %B, -5 + %Y = add int %A, 5 + %Z = add int %W, %Y + ret int %Z +} diff --git a/test/Transforms/Reassociate/2002-05-15-SubReassociate.ll b/test/Transforms/Reassociate/2002-05-15-SubReassociate.ll new file mode 100644 index 0000000..be204e9 --- /dev/null +++ b/test/Transforms/Reassociate/2002-05-15-SubReassociate.ll @@ -0,0 +1,11 @@ +; With sub reassociation, constant folding can eliminate all of the constants. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -instcombine -dce | llvm-dis | not grep add + +int %test(int %A, int %B) { + %W = add int 5, %B + %X = add int -7, %A + %Y = sub int %X, %W + %Z = add int %Y, 12 + ret int %Z +} diff --git a/test/Transforms/Reassociate/2002-05-15-SubReassociate2.ll b/test/Transforms/Reassociate/2002-05-15-SubReassociate2.ll new file mode 100644 index 0000000..c46cc2e --- /dev/null +++ b/test/Transforms/Reassociate/2002-05-15-SubReassociate2.ll @@ -0,0 +1,12 @@ +; With sub reassociation, constant folding can eliminate the two 12 constants. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -dce | llvm-dis | not grep 12 + +int "test"(int %A, int %B, int %C, int %D) { + %M = add int %A, 12 + %N = add int %M, %B + %O = add int %N, %C + %P = sub int %D, %O + %Q = add int %P, 12 + ret int %Q +} diff --git a/test/Transforms/Reassociate/2002-07-09-DominanceProblem.ll b/test/Transforms/Reassociate/2002-07-09-DominanceProblem.ll new file mode 100644 index 0000000..6a0ef53 --- /dev/null +++ b/test/Transforms/Reassociate/2002-07-09-DominanceProblem.ll @@ -0,0 +1,10 @@ +; The reassociate pass is not preserving dominance properties correctly +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate + +int %compute_dist(int %i, int %j) { + %reg119 = sub int %j, %i + ret int %reg119 +} + + diff --git a/test/Transforms/Reassociate/2003-08-12-InfiniteLoop.ll b/test/Transforms/Reassociate/2003-08-12-InfiniteLoop.ll new file mode 100644 index 0000000..a84297b --- /dev/null +++ b/test/Transforms/Reassociate/2003-08-12-InfiniteLoop.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -disable-output + +implementation ; Functions: + +int %test(int %A.1, int %B.1, int %C.1, int %D.1) { + %tmp.16 = and int %A.1, %B.1 ; <int> [#uses=1] + %tmp.18 = and int %tmp.16, %C.1 ; <int> [#uses=1] + %tmp.20 = and int %tmp.18, %D.1 ; <int> [#uses=1] + ret int %tmp.20 +} diff --git a/test/Transforms/Reassociate/2005-08-24-Crash.ll b/test/Transforms/Reassociate/2005-08-24-Crash.ll new file mode 100644 index 0000000..7e8e5d5 --- /dev/null +++ b/test/Transforms/Reassociate/2005-08-24-Crash.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -disable-output + +void %test(int %a, int %b, int %c, int %d) { + %tmp.2 = xor int %a, %b ; <int> [#uses=1] + %tmp.5 = xor int %c, %d ; <int> [#uses=1] + %tmp.6 = xor int %tmp.2, %tmp.5 ; <int> [#uses=1] + %tmp.9 = xor int %c, %a ; <int> [#uses=1] + %tmp.12 = xor int %b, %d ; <int> [#uses=1] + %tmp.13 = xor int %tmp.9, %tmp.12 ; <int> [#uses=1] + %tmp.16 = xor int %tmp.6, %tmp.13 ; <int> [#uses=0] + ret void +} diff --git a/test/Transforms/Reassociate/2005-09-01-ArrayOutOfBounds.ll b/test/Transforms/Reassociate/2005-09-01-ArrayOutOfBounds.ll new file mode 100644 index 0000000..7ddad0b --- /dev/null +++ b/test/Transforms/Reassociate/2005-09-01-ArrayOutOfBounds.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine | llvm-dis |\ +; RUN: grep {ret i32 0} + +int %f(int %a0, int %a1, int %a2, int %a3, int %a4) { + %tmp.2 = add int %a4, %a3 ; <int> [#uses=1] + %tmp.4 = add int %tmp.2, %a2 ; <int> [#uses=1] + %tmp.6 = add int %tmp.4, %a1 ; <int> [#uses=1] + %tmp.8 = add int %tmp.6, %a0 ; <int> [#uses=1] + %tmp.11 = add int %a3, %a2 ; <int> [#uses=1] + %tmp.13 = add int %tmp.11, %a1 ; <int> [#uses=1] + %tmp.15 = add int %tmp.13, %a0 ; <int> [#uses=1] + %tmp.18 = add int %a2, %a1 ; <int> [#uses=1] + %tmp.20 = add int %tmp.18, %a0 ; <int> [#uses=1] + %tmp.23 = add int %a1, %a0 ; <int> [#uses=1] + %tmp.26 = sub int %tmp.8, %tmp.15 ; <int> [#uses=1] + %tmp.28 = add int %tmp.26, %tmp.20 ; <int> [#uses=1] + %tmp.30 = sub int %tmp.28, %tmp.23 ; <int> [#uses=1] + %tmp.32 = sub int %tmp.30, %a4 ; <int> [#uses=1] + %tmp.34 = sub int %tmp.32, %a2 ; <int> [#uses=2] + %T = mul int %tmp.34, %tmp.34 + ret int %T +} diff --git a/test/Transforms/Reassociate/2006-04-27-ReassociateVector.ll b/test/Transforms/Reassociate/2006-04-27-ReassociateVector.ll new file mode 100644 index 0000000..2a5b5cd --- /dev/null +++ b/test/Transforms/Reassociate/2006-04-27-ReassociateVector.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -disable-output + +void %foo() { + %tmp162 = sub <4 x float> zeroinitializer, zeroinitializer + %tmp164 = mul <4 x float> zeroinitializer, %tmp162 + ret void +} diff --git a/test/Transforms/Reassociate/basictest.ll b/test/Transforms/Reassociate/basictest.ll new file mode 100644 index 0000000..a7ff84a --- /dev/null +++ b/test/Transforms/Reassociate/basictest.ll @@ -0,0 +1,9 @@ +; With reassociation, constant folding can eliminate the 12 and -12 constants. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -instcombine -die | llvm-dis | not grep add + +int %test(int %arg) { + %tmp1 = sub int -12, %arg + %tmp2 = add int %tmp1, 12 + ret int %tmp2 +} diff --git a/test/Transforms/Reassociate/basictest2.ll b/test/Transforms/Reassociate/basictest2.ll new file mode 100644 index 0000000..7efa3cc --- /dev/null +++ b/test/Transforms/Reassociate/basictest2.ll @@ -0,0 +1,10 @@ +; With reassociation, constant folding can eliminate the +/- 30 constants. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -instcombine -die | llvm-dis | not grep 30 + +int "test"(int %reg109, int %reg1111) { + %reg115 = add int %reg109, -30 ; <int> [#uses=1] + %reg116 = add int %reg115, %reg1111 ; <int> [#uses=1] + %reg117 = add int %reg116, 30 ; <int> [#uses=1] + ret int %reg117 +} diff --git a/test/Transforms/Reassociate/basictest3.ll b/test/Transforms/Reassociate/basictest3.ll new file mode 100644 index 0000000..a3da5a0 --- /dev/null +++ b/test/Transforms/Reassociate/basictest3.ll @@ -0,0 +1,50 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -gcse | llvm-dis | grep add | wc -l | grep 6 +; Each of these functions should turn into two adds each. + +%e = external global int +%a = external global int +%b = external global int +%c = external global int +%f = external global int + +implementation + +void %test1() { + %A = load int* %a + %B = load int* %b + %C = load int* %c + %t1 = add int %A, %B + %t2 = add int %t1, %C + %t3 = add int %C, %A + %t4 = add int %t3, %B + store int %t2, int* %e ; e = (a+b)+c; + store int %t4, int* %f ; f = (a+c)+b + ret void +} + +void %test2() { + %A = load int* %a + %B = load int* %b + %C = load int* %c + %t1 = add int %A, %B + %t2 = add int %t1, %C + %t3 = add int %C, %A + %t4 = add int %t3, %B + store int %t2, int* %e ; e = c+(a+b) + store int %t4, int* %f ; f = (c+a)+b + ret void +} + +void %test3() { + %A = load int* %a + %B = load int* %b + %C = load int* %c + %t1 = add int %B, %A + %t2 = add int %t1, %C + %t3 = add int %C, %A + %t4 = add int %t3, %B + store int %t2, int* %e ; e = c+(b+a) + store int %t4, int* %f ; f = (c+a)+b + ret void +} + diff --git a/test/Transforms/Reassociate/basictest4.ll b/test/Transforms/Reassociate/basictest4.ll new file mode 100644 index 0000000..dcf7a55 --- /dev/null +++ b/test/Transforms/Reassociate/basictest4.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -gcse -instcombine | llvm-dis | not grep add + +%a = weak global int 0 +%b = weak global int 0 +%c = weak global int 0 +%d = weak global int 0 + +implementation + +int %foo() { + %tmp.0 = load int* %a + %tmp.1 = load int* %b + %tmp.2 = add int %tmp.0, %tmp.1 ; (a+b) + %tmp.4 = load int* %c + %tmp.5 = add int %tmp.2, %tmp.4 ; (a+b)+c + %tmp.8 = add int %tmp.0, %tmp.4 ; (a+c) + %tmp.11 = add int %tmp.8, %tmp.1 ; (a+c)+b + %RV = xor int %tmp.5, %tmp.11 ; X ^ X = 0 + ret int %RV +} diff --git a/test/Transforms/Reassociate/dg.exp b/test/Transforms/Reassociate/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/Reassociate/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/Reassociate/inverses.ll b/test/Transforms/Reassociate/inverses.ll new file mode 100644 index 0000000..e431328 --- /dev/null +++ b/test/Transforms/Reassociate/inverses.ll @@ -0,0 +1,25 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -dce | llvm-dis | \ +; RUN: not grep {\\(and\\|sub\\)} + +int %test1(int %a, int %b) { + %tmp.2 = and int %b, %a + %tmp.4 = xor int %a, -1 + %tmp.5 = and int %tmp.2, %tmp.4 ; (A&B)&~A == 0 + ret int %tmp.5 +} + +int %test2(int %a, int %b) { + %tmp.1 = and int %a, 1234 + %tmp.2 = and int %b, %tmp.1 + %tmp.4 = xor int %a, -1 + %tmp.5 = and int %tmp.2, %tmp.4 ; A&~A == 0 + ret int %tmp.5 +} + +int %test3(int %b, int %a) { + %tmp.1 = add int %a, 1234 + %tmp.2 = add int %b, %tmp.1 + %tmp.4 = sub int 0, %a + %tmp.5 = add int %tmp.2, %tmp.4 ; (b+(a+1234))+-a -> b+1234 + ret int %tmp.5 +} diff --git a/test/Transforms/Reassociate/looptest.ll b/test/Transforms/Reassociate/looptest.ll new file mode 100644 index 0000000..97127bb --- /dev/null +++ b/test/Transforms/Reassociate/looptest.ll @@ -0,0 +1,56 @@ +; This testcase comes from this C fragment: +; +; void test(unsigned Num, int *Array) { +; unsigned i, j, k; +; +; for (i = 0; i != Num; ++i) +; for (j = 0; j != Num; ++j) +; for (k = 0; k != Num; ++k) +; printf("%d\n", i+k+j); /* Reassociate to (i+j)+k */ +;} +; +; In this case, we want to reassociate the specified expr so that i+j can be +; hoisted out of the inner most loop. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate | llvm-dis | grep 115 | not grep 117 + +%.LC0 = internal global [4 x sbyte] c"%d\0A\00" ; <[4 x sbyte]*> [#uses=1] + +declare int "printf"(sbyte*, ...) + +void "test"(uint %Num, int* %Array) { +bb0: ;[#uses=1] + %cond221 = seteq uint 0, %Num ; <bool> [#uses=3] + br bool %cond221, label %bb7, label %bb2 + +bb2: ;[#uses=3] + %reg115 = phi uint [ %reg120, %bb6 ], [ 0, %bb0 ] ; <uint> [#uses=2] + br bool %cond221, label %bb6, label %bb3 + +bb3: ;[#uses=3] + %reg116 = phi uint [ %reg119, %bb5 ], [ 0, %bb2 ] ; <uint> [#uses=2] + br bool %cond221, label %bb5, label %bb4 + +bb4: ;[#uses=3] + %reg117 = phi uint [ %reg118, %bb4 ], [ 0, %bb3 ] ; <uint> [#uses=2] + %reg113 = add uint %reg115, %reg117 ; <uint> [#uses=1] + %reg114 = add uint %reg113, %reg116 ; <uint> [#uses=1] + %cast227 = getelementptr [4 x sbyte]* %.LC0, long 0, long 0 ; <sbyte*> [#uses=1] + call int (sbyte*, ...)* %printf( sbyte* %cast227, uint %reg114 ) ; <int>:0 [#uses=0] + %reg118 = add uint %reg117, 1 ; <uint> [#uses=2] + %cond224 = setne uint %reg118, %Num ; <bool> [#uses=1] + br bool %cond224, label %bb4, label %bb5 + +bb5: ;[#uses=3] + %reg119 = add uint %reg116, 1 ; <uint> [#uses=2] + %cond225 = setne uint %reg119, %Num ; <bool> [#uses=1] + br bool %cond225, label %bb3, label %bb6 + +bb6: ;[#uses=3] + %reg120 = add uint %reg115, 1 ; <uint> [#uses=2] + %cond226 = setne uint %reg120, %Num ; <bool> [#uses=1] + br bool %cond226, label %bb2, label %bb7 + +bb7: ;[#uses=2] + ret void +} diff --git a/test/Transforms/Reassociate/mul-factor3.ll b/test/Transforms/Reassociate/mul-factor3.ll new file mode 100644 index 0000000..1272ff6 --- /dev/null +++ b/test/Transforms/Reassociate/mul-factor3.ll @@ -0,0 +1,16 @@ +; This should be one add and two multiplies. + +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -reassociate -instcombine | llvm-dis > %t +; RUN: grep mul %t | wc -l | grep 2 +; RUN: grep add %t | wc -l | grep 1 + +int %test(int %A, int %B, int %C) { + %aa = mul int %A, %A + %aab = mul int %aa, %B + + %ac = mul int %A, %C + %aac = mul int %ac, %A + %r = add int %aab, %aac + ret int %r +} diff --git a/test/Transforms/Reassociate/mul-neg-add.ll b/test/Transforms/Reassociate/mul-neg-add.ll new file mode 100644 index 0000000..4219044 --- /dev/null +++ b/test/Transforms/Reassociate/mul-neg-add.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine | llvm-dis |\ +; RUN: not grep {sub i32 0} + +int %test(int %X, int %Y, int %Z) { + %A = sub int 0, %X + %B = mul int %A, %Y + %C = add int %B, %Z ; (-X)*Y + Z -> Z-X*Y + ret int %C +} diff --git a/test/Transforms/Reassociate/mulfactor.ll b/test/Transforms/Reassociate/mulfactor.ll new file mode 100644 index 0000000..bb7efc3 --- /dev/null +++ b/test/Transforms/Reassociate/mulfactor.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine | llvm-dis | grep mul | wc -l | grep 2 + +; This should have exactly 2 multiplies when we're done. + +int %f(int %a, int %b) { + %tmp.2 = mul int %a, %a + %tmp.5 = shl int %a, ubyte 1 + %tmp.6 = mul int %tmp.5, %b + %tmp.10 = mul int %b, %b + %tmp.7 = add int %tmp.6, %tmp.2 + %tmp.11 = add int %tmp.7, %tmp.10 + ret int %tmp.11 +} + diff --git a/test/Transforms/Reassociate/mulfactor2.ll b/test/Transforms/Reassociate/mulfactor2.ll new file mode 100644 index 0000000..dd1e8ae --- /dev/null +++ b/test/Transforms/Reassociate/mulfactor2.ll @@ -0,0 +1,16 @@ +; This should turn into one multiply and one add. + +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -instcombine -reassociate -instcombine | llvm-dis -o %t +; RUN: grep mul %t | wc -l | grep 1 +; RUN: grep add %t | wc -l | grep 1 + +int %main(int %t) { + %tmp.3 = mul int %t, 12 ; <int> [#uses=1] + %tmp.4 = add int %tmp.3, 5 ; <int> [#uses=1] + %tmp.6 = mul int %t, 6 ; <int> [#uses=1] + %tmp.8 = mul int %tmp.4, 3 ; <int> [#uses=1] + %tmp.9 = add int %tmp.8, %tmp.6 ; <int> [#uses=1] + ret int %tmp.9 +} + diff --git a/test/Transforms/Reassociate/negation.ll b/test/Transforms/Reassociate/negation.ll new file mode 100644 index 0000000..56e087a --- /dev/null +++ b/test/Transforms/Reassociate/negation.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine | llvm-dis | not grep sub + +; Test that we can turn things like X*-(Y*Z) -> X*-1*Y*Z. + +int %test1(int %a, int %b, int %z) { + %c = sub int 0, %z + %d = mul int %a, %b + %e = mul int %c, %d + %f = mul int %e, 12345 + %g = sub int 0, %f + ret int %g +} + +int %test2(int %a, int %b, int %z) { + %d = mul int %z, 40 + %c = sub int 0, %d + %e = mul int %a, %c + %f = sub int 0, %e + ret int %f +} diff --git a/test/Transforms/Reassociate/otherops.ll b/test/Transforms/Reassociate/otherops.ll new file mode 100644 index 0000000..9e99d2c --- /dev/null +++ b/test/Transforms/Reassociate/otherops.ll @@ -0,0 +1,28 @@ +; Reassociation should apply to Add, Mul, And, Or, & Xor +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -instcombine -die | llvm-dis | not grep 12 + +int "test_mul"(int %arg) { + %tmp1 = mul int 12, %arg + %tmp2 = mul int %tmp1, 12 + ret int %tmp2 +} + +int "test_and"(int %arg) { + %tmp1 = and int 14, %arg + %tmp2 = and int %tmp1, 14 + ret int %tmp2 +} + +int "test_or"(int %arg) { + %tmp1 = or int 14, %arg + %tmp2 = or int %tmp1, 14 + ret int %tmp2 +} + +int "test_xor"(int %arg) { + %tmp1 = xor int 12, %arg + %tmp2 = xor int %tmp1, 12 + ret int %tmp2 +} + diff --git a/test/Transforms/Reassociate/shift-factor.ll b/test/Transforms/Reassociate/shift-factor.ll new file mode 100644 index 0000000..ed8ed39 --- /dev/null +++ b/test/Transforms/Reassociate/shift-factor.ll @@ -0,0 +1,13 @@ +; There should be exactly one shift and one add left. +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -reassociate -instcombine | llvm-dis > %t +; RUN: grep shl %t | wc -l | grep 1 +; RUN: grep add %t | wc -l | grep 1 + +int %test(int %X, int %Y) { + %tmp.2 = shl int %X, ubyte 1 ; <int> [#uses=1] + %tmp.6 = shl int %Y, ubyte 1 ; <int> [#uses=1] + %tmp.4 = add int %tmp.6, %tmp.2 ; <int> [#uses=1] + ret int %tmp.4 +} + diff --git a/test/Transforms/Reassociate/shifttest.ll b/test/Transforms/Reassociate/shifttest.ll new file mode 100644 index 0000000..3603604 --- /dev/null +++ b/test/Transforms/Reassociate/shifttest.ll @@ -0,0 +1,11 @@ +; With shl->mul reassociation, we can see that this is (shl A, 9) * A +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -instcombine | llvm-dis |\ +; RUN: grep {shl .*, 9} + +int %test(int %A, int %B) { + %X = shl int %A, ubyte 5 + %Y = shl int %A, ubyte 4 + %Z = mul int %Y, %X + ret int %Z +} diff --git a/test/Transforms/Reassociate/subtest.ll b/test/Transforms/Reassociate/subtest.ll new file mode 100644 index 0000000..097c355 --- /dev/null +++ b/test/Transforms/Reassociate/subtest.ll @@ -0,0 +1,10 @@ +; With sub reassociation, constant folding can eliminate the 12 and -12 constants. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -reassociate -constprop -instcombine -die | llvm-dis | not grep 12 + +int "test"(int %A, int %B) { + %X = add int -12, %A + %Y = sub int %X, %B + %Z = add int %Y, 12 + ret int %Z +} diff --git a/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll b/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll new file mode 100644 index 0000000..2136ca6 --- /dev/null +++ b/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll @@ -0,0 +1,23 @@ +; edgefailure - This function illustrates how SCCP is not doing it's job. This +; function should be optimized almost completely away: the loop should be +; analyzed to detect that the body executes exactly once, and thus the branch +; can be eliminated and code becomes trivially dead. This is distilled from a +; real benchmark (mst from Olden benchmark, MakeGraph function). When SCCP is +; fixed, this should be eliminated by a single SCCP application. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep loop + +int* %test() { +bb1: + %A = malloc int + br label %bb2 +bb2: + %i = phi int [ %i2, %bb2 ], [ 0, %bb1 ] ;; Always 0 + %i2 = add int %i, 1 ;; Always 1 + store int %i, int *%A + %loop = setle int %i2, 0 ;; Always false + br bool %loop, label %bb2, label %bb3 + +bb3: + ret int * %A +} diff --git a/test/Transforms/SCCP/2002-05-02-MissSecondInst.ll b/test/Transforms/SCCP/2002-05-02-MissSecondInst.ll new file mode 100644 index 0000000..24e99b1 --- /dev/null +++ b/test/Transforms/SCCP/2002-05-02-MissSecondInst.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep sub + +void %test3(int, int) { + add int 0, 0 + sub int 0, 4 + ret void +} diff --git a/test/Transforms/SCCP/2002-05-20-MissedIncomingValue.ll b/test/Transforms/SCCP/2002-05-20-MissedIncomingValue.ll new file mode 100644 index 0000000..c851efd --- /dev/null +++ b/test/Transforms/SCCP/2002-05-20-MissedIncomingValue.ll @@ -0,0 +1,20 @@ +; This test shows a case where SCCP is incorrectly eliminating the PHI node +; because it thinks it has a constant 0 value, when it really doesn't. + +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | grep phi + +int "test"(int %A, bool %c) { +bb1: + br label %BB2 +BB2: + %V = phi int [0, %bb1], [%A, %BB4] + br label %BB3 + +BB3: + br bool %c, label %BB4, label %BB5 +BB4: + br label %BB2 + +BB5: + ret int %V +} diff --git a/test/Transforms/SCCP/2002-05-21-InvalidSimplify.ll b/test/Transforms/SCCP/2002-05-21-InvalidSimplify.ll new file mode 100644 index 0000000..231bdb9 --- /dev/null +++ b/test/Transforms/SCCP/2002-05-21-InvalidSimplify.ll @@ -0,0 +1,40 @@ +; This test shows SCCP "proving" that the loop (from bb6 to 14) loops infinitely +; this is in fact NOT the case, so the return should still be alive in the code +; after sccp and CFG simplification have been performed. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -simplifycfg | llvm-dis | \ +; RUN: grep ret + + +void "old_main"() { +bb3: ;[#uses=1] + br label %bb6 + +bb6: ;[#uses=3] + %reg403 = phi int [ %reg155, %bb14 ], [ 0, %bb3 ] ; <int> [#uses=2] + %reg155 = add int %reg403, 1 ; <int> [#uses=3] + + br label %bb11 + +bb11: + %reg407 = phi int [ %reg408, %bb11 ], [ 0, %bb6 ] ; <int> [#uses=2] + %reg408 = add int %reg407, 1 ; <int> [#uses=2] + %cond550 = setle int %reg407, 1 ; <bool> [#uses=1] + br bool %cond550, label %bb11, label %bb12 + +bb12: ;[#uses=2] + br label %bb13 + +bb13: ;[#uses=3] + %reg409 = phi int [ %reg410, %bb13 ], [ 0, %bb12 ] ; <int> [#uses=1] + %reg410 = add int %reg409, 1 ; <int> [#uses=2] + %cond552 = setle int %reg410, 2 ; <bool> [#uses=1] + br bool %cond552, label %bb13, label %bb14 + +bb14: ;[#uses=2] + %cond553 = setle int %reg155, 31 ; <bool> [#uses=1] + br bool %cond553, label %bb6, label %bb15 + +bb15: ;[#uses=1] + ret void +} diff --git a/test/Transforms/SCCP/2002-08-30-GetElementPtrTest.ll b/test/Transforms/SCCP/2002-08-30-GetElementPtrTest.ll new file mode 100644 index 0000000..1577685 --- /dev/null +++ b/test/Transforms/SCCP/2002-08-30-GetElementPtrTest.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep %X + +%G = uninitialized global [40x int] + +implementation + +int* %test() { + %X = getelementptr [40x int]* %G, uint 0, uint 0 + ret int* %X +} diff --git a/test/Transforms/SCCP/2003-06-24-OverdefinedPHIValue.ll b/test/Transforms/SCCP/2003-06-24-OverdefinedPHIValue.ll new file mode 100644 index 0000000..fd4713a --- /dev/null +++ b/test/Transforms/SCCP/2003-06-24-OverdefinedPHIValue.ll @@ -0,0 +1,34 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -simplifycfg | llvm-dis | \ +; RUN: not grep then: + +void %cprop_test11(int* %data.1) { +entry: ; No predecessors! + %tmp.1 = load int* %data.1 ; <int> [#uses=3] + %tmp.41 = setgt int %tmp.1, 1 ; <bool> [#uses=1] + br bool %tmp.41, label %no_exit, label %loopexit + +no_exit: ; preds = %entry, %then, %endif + %j.0 = phi int [ %j.0, %endif ], [ %i.0, %then ], [ 1, %entry ] ; <int> [#uses=3] + %i.0 = phi int [ %inc, %endif ], [ %inc1, %then ], [ 1, %entry ] ; <int> [#uses=4] + %tmp.8.not = cast int %j.0 to bool ; <bool> [#uses=1] + br bool %tmp.8.not, label %endif, label %then + +then: ; preds = %no_exit + %inc1 = add int %i.0, 1 ; <int> [#uses=3] + %tmp.42 = setlt int %inc1, %tmp.1 ; <bool> [#uses=1] + br bool %tmp.42, label %no_exit, label %loopexit + +endif: ; preds = %no_exit + %inc = add int %i.0, 1 ; <int> [#uses=3] + %tmp.4 = setlt int %inc, %tmp.1 ; <bool> [#uses=1] + br bool %tmp.4, label %no_exit, label %loopexit + +loopexit: ; preds = %entry, %endif, %then + %j.1 = phi int [ 1, %entry ], [ %j.0, %endif ], [ %i.0, %then ] ; <int> [#uses=1] + %i.1 = phi int [ 1, %entry ], [ %inc, %endif ], [ %inc1, %then ] ; <int> [#uses=1] + %tmp.17 = getelementptr int* %data.1, long 1 ; <int*> [#uses=1] + store int %j.1, int* %tmp.17 + %tmp.23 = getelementptr int* %data.1, long 2 ; <int*> [#uses=1] + store int %i.1, int* %tmp.23 + ret void +} diff --git a/test/Transforms/SCCP/2003-08-26-InvokeHandling.ll b/test/Transforms/SCCP/2003-08-26-InvokeHandling.ll new file mode 100644 index 0000000..36bfba4 --- /dev/null +++ b/test/Transforms/SCCP/2003-08-26-InvokeHandling.ll @@ -0,0 +1,15 @@ +; The PHI cannot be eliminated from this testcase, SCCP is mishandling invoke's! +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | grep phi + +declare void %foo() +int %test(bool %cond) { +Entry: + br bool %cond, label %Inv, label %Cont +Inv: + invoke void %foo() to label %Ok except label %Cont +Ok: + br label %Cont +Cont: + %X = phi int [0, %Entry], [1,%Ok], [0, %Inv] + ret int %X +} diff --git a/test/Transforms/SCCP/2004-11-16-DeadInvoke.ll b/test/Transforms/SCCP/2004-11-16-DeadInvoke.ll new file mode 100644 index 0000000..544edc0 --- /dev/null +++ b/test/Transforms/SCCP/2004-11-16-DeadInvoke.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -disable-output + +implementation + +declare int %foo() + +void %caller() { + br bool true, label %T, label %F +F: + %X = invoke int %foo() to label %T unwind label %T + +T: + ret void +} diff --git a/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll b/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll new file mode 100644 index 0000000..c662e0f --- /dev/null +++ b/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | grep {ret i32 1} + +; This function definitely returns 1, even if we don't know the direction +; of the branch. + +int %foo() { + br bool undef, label %T, label %T +T: + %X = add int 0, 1 + ret int %X +} diff --git a/test/Transforms/SCCP/2006-10-23-IPSCCP-Crash.ll b/test/Transforms/SCCP/2006-10-23-IPSCCP-Crash.ll new file mode 100644 index 0000000..edfbe01 --- /dev/null +++ b/test/Transforms/SCCP/2006-10-23-IPSCCP-Crash.ll @@ -0,0 +1,128 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -disable-output + +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8.7.0" + %struct.pat_list = type { int, %struct.pat_list* } +%JUMP = external global int ; <int*> [#uses=1] +%old_D_pat = external global [16 x ubyte] ; <[16 x ubyte]*> [#uses=0] + +implementation ; Functions: + +void %asearch1(uint %D) { +entry: + %tmp80 = setlt uint 0, %D ; <bool> [#uses=1] + br bool %tmp80, label %bb647.preheader, label %cond_true81.preheader + +cond_true81.preheader: ; preds = %entry + ret void + +bb647.preheader: ; preds = %entry + %tmp3.i = call int %read( ) ; <int> [#uses=1] + %tmp6.i = add int %tmp3.i, 0 ; <int> [#uses=1] + %tmp653 = setgt int %tmp6.i, 0 ; <bool> [#uses=1] + br bool %tmp653, label %cond_true654, label %UnifiedReturnBlock + +cond_true612: ; preds = %cond_true654 + ret void + +cond_next624: ; preds = %cond_true654 + ret void + +cond_true654: ; preds = %bb647.preheader + br bool undef, label %cond_true612, label %cond_next624 + +UnifiedReturnBlock: ; preds = %bb647.preheader + ret void +} + +void %bitap(int %D) { +entry: + %tmp29 = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp29, label %cond_next50, label %cond_next37 + +cond_next37: ; preds = %entry + ret void + +cond_next50: ; preds = %entry + %tmp52 = setgt int %D, 0 ; <bool> [#uses=1] + br bool %tmp52, label %cond_true53, label %cond_next71 + +cond_true53: ; preds = %cond_next50 + %tmp54 = load int* %JUMP ; <int> [#uses=1] + %tmp55 = seteq int %tmp54, 1 ; <bool> [#uses=1] + br bool %tmp55, label %cond_true56, label %cond_next63 + +cond_true56: ; preds = %cond_true53 + %tmp57 = cast int %D to uint ; <uint> [#uses=1] + call void %asearch1( uint %tmp57 ) + ret void + +cond_next63: ; preds = %cond_true53 + ret void + +cond_next71: ; preds = %cond_next50 + ret void +} + +declare int %read() + +void %initial_value() { +entry: + ret void +} + +void %main() { +entry: + br label %cond_next252 + +cond_next208: ; preds = %cond_true260 + %tmp229 = call int %atoi( ) ; <int> [#uses=1] + br label %cond_next252 + +bb217: ; preds = %cond_true260 + ret void + +cond_next252: ; preds = %cond_next208, %entry + %D.0.0 = phi int [ 0, %entry ], [ %tmp229, %cond_next208 ] ; <int> [#uses=1] + %tmp254 = getelementptr sbyte** null, int 1 ; <sbyte**> [#uses=1] + %tmp256 = load sbyte** %tmp254 ; <sbyte*> [#uses=1] + %tmp258 = load sbyte* %tmp256 ; <sbyte> [#uses=1] + %tmp259 = seteq sbyte %tmp258, 45 ; <bool> [#uses=1] + br bool %tmp259, label %cond_true260, label %bb263 + +cond_true260: ; preds = %cond_next252 + %tmp205818 = setgt sbyte 0, -1 ; <bool> [#uses=1] + br bool %tmp205818, label %cond_next208, label %bb217 + +bb263: ; preds = %cond_next252 + %tmp265 = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp265, label %cond_next276, label %cond_true266 + +cond_true266: ; preds = %bb263 + ret void + +cond_next276: ; preds = %bb263 + %tmp278 = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp278, label %cond_next298, label %cond_true279 + +cond_true279: ; preds = %cond_next276 + ret void + +cond_next298: ; preds = %cond_next276 + call void %bitap( int %D.0.0 ) + ret void +} + +declare int %atoi() + +void %subset_pset() { +entry: + ret void +} + +void %strcmp() { +entry: + ret void +} + diff --git a/test/Transforms/SCCP/2006-12-04-PackedType.ll b/test/Transforms/SCCP/2006-12-04-PackedType.ll new file mode 100644 index 0000000..4868c30 --- /dev/null +++ b/test/Transforms/SCCP/2006-12-04-PackedType.ll @@ -0,0 +1,150 @@ +; Test VectorType handling by SCCP. +; SCCP ignores VectorTypes until PR 1034 is fixed +; +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp +; END. +target datalayout = "E-p:32:32" +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8" + %struct.GLDAlphaTest = type { float, ushort, ubyte, ubyte } + %struct.GLDArrayRange = type { ubyte, ubyte, ubyte, ubyte } + %struct.GLDBlendMode = type { ushort, ushort, ushort, ushort, %struct.GLTColor4, ushort, ushort, ubyte, ubyte, ubyte, ubyte } + %struct.GLDBufferRec = type opaque + %struct.GLDBufferstate = type { %struct.GLTDimensions, %struct.GLTDimensions, %struct.GLTFixedColor4, %struct.GLTFixedColor4, ubyte, ubyte, ubyte, ubyte, [2 x %struct.GLSBuffer], [4 x %struct.GLSBuffer], %struct.GLSBuffer, %struct.GLSBuffer, %struct.GLSBuffer, [4 x %struct.GLSBuffer*], %struct.GLSBuffer*, %struct.GLSBuffer*, %struct.GLSBuffer*, ubyte, ubyte } + %struct.GLDClearColor = type { double, %struct.GLTColor4, %struct.GLTColor4, float, int } + %struct.GLDClipPlane = type { uint, [6 x %struct.GLTColor4] } + %struct.GLDColorBuffer = type { ushort, ushort, [4 x ushort] } + %struct.GLDColorMatrix = type { [16 x float]*, %struct.GLDImagingColorScale } + %struct.GLDContextRec = type { float, float, float, float, float, float, float, float, %struct.GLTColor4, %struct.GLTColor4, %struct.GLVMFPContext, %struct.GLDTextureMachine, %struct.GLGProcessor, %struct._GLVMConstants*, void (%struct.GLDContextRec*, int, int, %struct.GLVMFragmentAttribRec*, %struct.GLVMFragmentAttribRec*, int)*, %struct._GLVMFunction*, void (%struct.GLDContextRec*, %struct.GLDVertex*)*, void (%struct.GLDContextRec*, %struct.GLDVertex*, %struct.GLDVertex*)*, void (%struct.GLDContextRec*, %struct.GLDVertex*, %struct.GLDVertex*, %struct.GLDVertex*)*, %struct._GLVMFunction*, %struct._GLVMFunction*, %struct._GLVMFunction*, uint, uint, uint, float, float, float, uint, %struct.GLSDrawable, %struct.GLDRect, %struct.GLDFormat, %struct.GLDBufferstate, %struct.GLDSharedRec*, %struct.GLDState*, %struct.GLDPluginState*, %struct.GLTDimensions, %struct.GLTColor4*, %struct.GLTColor4*, %struct.GLVMFragmentAttribRec*, %struct.GLVMFragmentAttribRec*, %struct.GLVMFragmentAttribRec*, %struct.GLDPipelineProgramRec*, %struct.GLDStateProgramRec, %struct.GLVMTextures, { [4 x sbyte*], sbyte*, sbyte* }, [64 x float], %struct.GLDStippleData, ushort, ubyte, ubyte, uint, %struct.GLDFramebufferRec*, ubyte, %struct.GLDQueryRec*, %struct.GLDQueryRec* } + %struct.GLDConvolution = type { %struct.GLTColor4, %struct.GLDImagingColorScale, ushort, ushort, float*, int, int } + %struct.GLDDepthTest = type { ushort, ushort, ubyte, ubyte, ubyte, ubyte, double, double } + %struct.GLDFogMode = type { %struct.GLTColor4, float, float, float, float, float, ushort, ushort, ushort, ubyte, ubyte } + %struct.GLDFormat = type { int, int, int, int, int, int, uint, uint, ubyte, ubyte, ubyte, ubyte, int, int, int } + %struct.GLDFramebufferAttachment = type { uint, uint, uint, int, uint, uint } + %struct.GLDFramebufferData = type { [6 x %struct.GLDFramebufferAttachment], [4 x ushort], ushort, ushort, ushort, ushort, uint } + %struct.GLDFramebufferRec = type { %struct.GLDFramebufferData*, %struct.GLDPluginFramebufferData*, %struct.GLDPixelFormat } + %struct.GLDHintMode = type { ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort } + %struct.GLDHistogram = type { %struct.GLTFixedColor4*, int, ushort, ubyte, ubyte } + %struct.GLDImagingColorScale = type { { float, float }, { float, float }, { float, float }, { float, float } } + %struct.GLDImagingSubset = type { %struct.GLDConvolution, %struct.GLDConvolution, %struct.GLDConvolution, %struct.GLDColorMatrix, %struct.GLDMinmax, %struct.GLDHistogram, %struct.GLDImagingColorScale, %struct.GLDImagingColorScale, %struct.GLDImagingColorScale, %struct.GLDImagingColorScale, uint } + %struct.GLDLight = type { %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTCoord3, float, float, float, float, float, %struct.GLTCoord3, float, float, float, float, float } + %struct.GLDLightModel = type { %struct.GLTColor4, [8 x %struct.GLDLight], [2 x %struct.GLDMaterial], uint, ushort, ushort, ushort, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.GLDLightProduct = type { %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4 } + %struct.GLDLineMode = type { float, int, ushort, ushort, ubyte, ubyte, ubyte, ubyte } + %struct.GLDLogicOp = type { ushort, ubyte, ubyte } + %struct.GLDMaskMode = type { uint, [3 x uint], ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.GLDMaterial = type { %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, float, float, float, float, [8 x %struct.GLDLightProduct], %struct.GLTColor4, [6 x int], [2 x int] } + %struct.GLDMinmax = type { %struct.GLDMinmaxTable*, ushort, ubyte, ubyte } + %struct.GLDMinmaxTable = type { %struct.GLTColor4, %struct.GLTColor4 } + %struct.GLDMipmaplevel = type { [4 x uint], [4 x float], [4 x uint], [4 x uint], [4 x float], [4 x uint], [3 x uint], uint, float*, float*, float*, uint, uint, sbyte*, short, ushort, ushort, short } + %struct.GLDMultisample = type { float, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.GLDPipelineProgramData = type { ushort, ushort, uint, %struct._PPStreamToken*, ulong, %struct.GLDShaderSourceData*, %struct.GLTColor4*, uint } + %struct.GLDPipelineProgramRec = type { %struct.GLDPipelineProgramData*, %struct._PPStreamToken*, %struct._PPStreamToken*, %struct._GLVMFunction*, uint, uint, uint } + %struct.GLDPipelineProgramState = type { ubyte, ubyte, ubyte, ubyte, %struct.GLTColor4* } + %struct.GLDPixelFormat = type { ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.GLDPixelMap = type { int*, float*, float*, float*, float*, float*, float*, float*, float*, int*, int, int, int, int, int, int, int, int, int, int } + %struct.GLDPixelMode = type { float, float, %struct.GLDPixelStore, %struct.GLDPixelTransfer, %struct.GLDPixelMap, %struct.GLDImagingSubset, uint, uint } + %struct.GLDPixelPack = type { int, int, int, int, int, int, int, int, ubyte, ubyte, ubyte, ubyte } + %struct.GLDPixelStore = type { %struct.GLDPixelPack, %struct.GLDPixelPack } + %struct.GLDPixelTransfer = type { float, float, float, float, float, float, float, float, float, float, int, int, float, float, float, float, float, float, float, float, float, float, float, float } + %struct.GLDPluginFramebufferData = type { [6 x %struct.GLDTextureRec*], uint, uint } + %struct.GLDPluginProgramData = type { [3 x %struct.GLDPipelineProgramRec*], %struct.GLDBufferRec**, uint } + %struct.GLDPluginState = type { [16 x [5 x %struct.GLDTextureRec*]], [3 x %struct.GLDTextureRec*], [16 x %struct.GLDTextureRec*], [3 x %struct.GLDPipelineProgramRec*], %struct.GLDProgramRec*, %struct.GLDVertexArrayRec*, [16 x %struct.GLDBufferRec*], %struct.GLDFramebufferRec*, %struct.GLDFramebufferRec* } + %struct.GLDPointMode = type { float, float, float, float, %struct.GLTCoord3, float, ubyte, ubyte, ubyte, ubyte, ushort, ushort, uint, ushort, ushort } + %struct.GLDPolygonMode = type { [128 x ubyte], float, float, ushort, ushort, ushort, ushort, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.GLDProgramData = type { uint, [16 x int], int, int, uint, int } + %struct.GLDProgramRec = type { %struct.GLDProgramData*, %struct.GLDPluginProgramData*, uint } + %struct.GLDQueryRec = type { uint, uint, %struct.GLDQueryRec* } + %struct.GLDRect = type { int, int, int, int, int, int } + %struct.GLDRegisterCombiners = type { ubyte, ubyte, ubyte, ubyte, int, [2 x %struct.GLTColor4], [8 x %struct.GLDRegisterCombinersPerStageState], %struct.GLDRegisterCombinersFinalStageState } + %struct.GLDRegisterCombinersFinalStageState = type { ubyte, ubyte, ubyte, ubyte, [7 x %struct.GLDRegisterCombinersPerVariableState] } + %struct.GLDRegisterCombinersPerPortionState = type { [4 x %struct.GLDRegisterCombinersPerVariableState], ubyte, ubyte, ubyte, ubyte, ushort, ushort, ushort, ushort, ushort, ushort } + %struct.GLDRegisterCombinersPerStageState = type { [2 x %struct.GLDRegisterCombinersPerPortionState], [2 x %struct.GLTColor4] } + %struct.GLDRegisterCombinersPerVariableState = type { ushort, ushort, ushort, ushort } + %struct.GLDScissorTest = type { %struct.GLTFixedColor4, ubyte, ubyte, ubyte, ubyte } + %struct.GLDShaderSourceData = type { uint, uint, sbyte*, int*, uint, uint, sbyte*, int*, sbyte* } + %struct.GLDSharedRec = type opaque + %struct.GLDState = type { short, short, uint, uint, uint, [256 x %struct.GLTColor4], [128 x %struct.GLTColor4], %struct.GLDViewport, %struct.GLDTransform, %struct.GLDLightModel, uint*, int, int, int, %struct.GLDAlphaTest, %struct.GLDBlendMode, %struct.GLDClearColor, %struct.GLDColorBuffer, %struct.GLDDepthTest, %struct.GLDArrayRange, %struct.GLDFogMode, %struct.GLDHintMode, %struct.GLDLineMode, %struct.GLDLogicOp, %struct.GLDMaskMode, %struct.GLDPixelMode, %struct.GLDPointMode, %struct.GLDPolygonMode, %struct.GLDScissorTest, uint, %struct.GLDStencilTest, [16 x %struct.GLDTextureMode], %struct.GLDArrayRange, [8 x %struct.GLDTextureCoordGen], %struct.GLDClipPlane, %struct.GLDMultisample, %struct.GLDRegisterCombiners, %struct.GLDArrayRange, %struct.GLDArrayRange, [3 x %struct.GLDPipelineProgramState], %struct.GLDTransformFeedback } + %struct.GLDStateProgramRec = type { %struct.GLDPipelineProgramData*, %struct.GLDPipelineProgramRec* } + %struct.GLDStencilTest = type { [3 x { uint, int, ushort, ushort, ushort, ushort }], uint, [4 x ubyte] } + %struct.GLDStippleData = type { uint, ushort, ushort, [32 x [32 x ubyte]] } + %struct.GLDTextureCoordGen = type { { ushort, ushort, %struct.GLTColor4, %struct.GLTColor4 }, { ushort, ushort, %struct.GLTColor4, %struct.GLTColor4 }, { ushort, ushort, %struct.GLTColor4, %struct.GLTColor4 }, { ushort, ushort, %struct.GLTColor4, %struct.GLTColor4 }, ubyte, ubyte, ubyte, ubyte } + %struct.GLDTextureGeomState = type { ushort, ushort, ushort, ushort, ushort, ubyte, ubyte, ushort, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, [6 x ushort], [6 x ushort] } + %struct.GLDTextureLevel = type { uint, uint, ushort, ushort, ushort, ubyte, ubyte, ushort, ushort, ushort, ushort, ubyte* } + %struct.GLDTextureMachine = type { [8 x %struct.GLDTextureRec*], %struct.GLDTextureRec*, ubyte, ubyte, ubyte, ubyte } + %struct.GLDTextureMode = type { %struct.GLTColor4, uint, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort, float, float, float, ushort, ushort, ushort, ushort, ushort, ushort, [4 x ushort], ubyte, ubyte, ubyte, ubyte, [3 x float], [4 x float], float, float } + %struct.GLDTextureParamState = type { ushort, ushort, ushort, ushort, ushort, ushort, %struct.GLTColor4, float, float, float, float, short, short, ushort, ushort, float, ushort, ubyte, ubyte, int, sbyte* } + %struct.GLDTextureRec = type { %struct.GLDTextureState*, int, [2 x float], float, uint, float, float, float, float, float, float, %struct.GLDMipmaplevel*, %struct.GLDMipmaplevel*, int, int, uint, uint, uint, uint, %struct.GLDTextureParamState, uint, [2 x %struct._PPStreamToken] } + %struct.GLDTextureState = type { ushort, ushort, ushort, float, uint, ushort, %struct.GLISWRSurface*, ubyte, ubyte, ubyte, ubyte, %struct.GLDTextureParamState, %struct.GLDTextureGeomState, %struct.GLDTextureLevel, [6 x [15 x %struct.GLDTextureLevel]] } + %struct.GLDTransform = type { [24 x [16 x float]], [24 x [16 x float]], [16 x float], float, float, float, float, int, float, ushort, ushort, ubyte, ubyte, ubyte, ubyte } + %struct.GLDTransformFeedback = type { ubyte, ubyte, ubyte, [16 x uint], [16 x uint] } + %struct.GLDVertex = type { %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTColor4, %struct.GLTCoord3, float, %struct.GLTColor4, float, float, float, ubyte, ubyte, ubyte, ubyte, [4 x float], [2 x %struct.GLDMaterial*], uint, uint, [8 x %struct.GLTColor4] } + %struct.GLDVertexArrayRec = type opaque + %struct.GLDViewport = type { float, float, float, float, float, float, float, float, double, double, int, int, int, int, float, float, float, float } + %struct.GLGColorTable = type { uint, uint, int, sbyte* } + %struct.GLGOperation = type { sbyte*, sbyte*, int, uint, uint, int, uint, uint, uint, uint, uint, uint, uint, float, float, %struct.GLGColorTable, %struct.GLGColorTable, %struct.GLGColorTable } + %struct.GLGProcessor = type { void (%struct.GLDPixelMode*, %struct.GLGOperation*, %struct._GLGFunctionKey*)*, %struct._GLVMFunction*, %struct._GLGFunctionKey* } + %struct.GLISWRSurface = type { int, int, int, int, int, int, int, int, int, int, ubyte*, ubyte*, ubyte*, [4 x ubyte*], uint } + %struct.GLIWindow = type { uint, uint, uint } + %struct.GLSBuffer = type { sbyte* } + %struct.GLSDrawable = type { %struct.GLSWindowRec* } + %struct.GLSWindowRec = type { %struct.GLTDimensions, %struct.GLTDimensions, uint, uint, %struct.GLSDrawable, [2 x ubyte*], ubyte*, ubyte*, ubyte*, [4 x ubyte*], uint, uint, uint, uint, [4 x uint], ushort, ushort, ushort, %struct.GLIWindow, uint, uint, sbyte*, ubyte* } + %struct.GLTColor4 = type { float, float, float, float } + %struct.GLTCoord3 = type { float, float, float } + %struct.GLTDimensions = type { int, int } + %struct.GLTFixedColor4 = type { int, int, int, int } + %struct.GLVMFPContext = type { float, uint, uint, uint } + %struct.GLVMFragmentAttribRec = type { <4 x float>, <4 x float>, <4 x float>, <4 x float>, [8 x <4 x float>] } + %struct.GLVMTextures = type { [8 x %struct.GLDTextureRec*] } + %struct._GLGFunctionKey = type opaque + %struct._GLVMConstants = type opaque + %struct._GLVMFunction = type opaque + %struct._PPStreamToken = type { { ushort, ubyte, ubyte, uint } } + +implementation ; Functions: + +void %gldLLVMVecPointRender(%struct.GLDContextRec* %ctx) { +entry: + %tmp.uip = getelementptr %struct.GLDContextRec* %ctx, int 0, uint 22 ; <uint*> [#uses=1] + %tmp = load uint* %tmp.uip ; <uint> [#uses=3] + %tmp91 = lshr uint %tmp, ubyte 5 ; <uint> [#uses=1] + %tmp92 = trunc uint %tmp91 to bool ; <bool> [#uses=1] + br bool %tmp92, label %cond_true93, label %cond_next116 + +cond_true93: ; preds = %entry + %tmp = getelementptr %struct.GLDContextRec* %ctx, int 0, uint 31, uint 14 ; <int*> [#uses=1] + %tmp95 = load int* %tmp ; <int> [#uses=1] + %tmp95 = sitofp int %tmp95 to float ; <float> [#uses=1] + %tmp108 = mul float undef, %tmp95 ; <float> [#uses=1] + br label %cond_next116 + +cond_next116: ; preds = %cond_true93, %entry + %point_size.2 = phi float [ %tmp108, %cond_true93 ], [ undef, %entry ] ; <float> [#uses=2] + %tmp457 = setlt float %point_size.2, 1.000000e+00 ; <bool> [#uses=1] + %tmp460 = lshr uint %tmp, ubyte 6 ; <uint> [#uses=1] + %tmp461 = trunc uint %tmp460 to bool ; <bool> [#uses=1] + br bool %tmp457, label %cond_true458, label %cond_next484 + +cond_true458: ; preds = %cond_next116 + br bool %tmp461, label %cond_true462, label %cond_next487 + +cond_true462: ; preds = %cond_true458 + %tmp26 = bitcast uint %tmp to int ; <int> [#uses=1] + %tmp465 = and int %tmp26, 128 ; <int> [#uses=1] + %tmp466 = seteq int %tmp465, 0 ; <bool> [#uses=1] + br bool %tmp466, label %cond_true467, label %cond_next487 + +cond_true467: ; preds = %cond_true462 + ret void + +cond_next484: ; preds = %cond_next116 + %tmp486 = mul float %point_size.2, 5.000000e-01 ; <float> [#uses=1] + br label %cond_next487 + +cond_next487: ; preds = %cond_next484, %cond_true462, %cond_true458 + %radius.0 = phi float [ %tmp486, %cond_next484 ], [ 5.000000e-01, %cond_true458 ], [ 5.000000e-01, %cond_true462 ] ; <float> [#uses=2] + %tmp494 = insertelement <4 x float> zeroinitializer, float %radius.0, uint 2 ; <<4 x float>> [#uses=1] + %tmp495 = insertelement <4 x float> %tmp494, float %radius.0, uint 3 ; <<4 x float>> [#uses=0] + ret void +} diff --git a/test/Transforms/SCCP/2006-12-19-UndefBug.ll b/test/Transforms/SCCP/2006-12-19-UndefBug.ll new file mode 100644 index 0000000..3cc61f7 --- /dev/null +++ b/test/Transforms/SCCP/2006-12-19-UndefBug.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | \ +; RUN: grep {ret i1 false} + +bool %foo() { + %X = and bool false, undef + ret bool %X +} diff --git a/test/Transforms/SCCP/2007-05-16-InvokeCrash.ll b/test/Transforms/SCCP/2007-05-16-InvokeCrash.ll new file mode 100644 index 0000000..ad6a469 --- /dev/null +++ b/test/Transforms/SCCP/2007-05-16-InvokeCrash.ll @@ -0,0 +1,50 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -disable-output +; PR 1431 + +void @_ada_bench() { +entry: + br label %cond_next + +cond_next: ; preds = %cond_next, %entry + %indvar46 = phi i32 [ 0, %entry ], [ %indvar.next47, %cond_next ] ; <i32> [#uses=1] + %indvar.next47 = add i32 %indvar46, 1 ; <i32> [#uses=2] + %exitcond48 = icmp eq i32 %indvar.next47, 10000 ; <i1> [#uses=1] + br i1 %exitcond48, label %cond_next40, label %cond_next + +cond_next40: ; preds = %cond_next40, %cond_next + %indvar43 = phi i32 [ %indvar.next44, %cond_next40 ], [ 0, %cond_next ] ; <i32> [#uses=1] + %indvar.next44 = add i32 %indvar43, 1 ; <i32> [#uses=2] + %exitcond45 = icmp eq i32 %indvar.next44, 10000 ; <i1> [#uses=1] + br i1 %exitcond45, label %cond_next53, label %cond_next40 + +cond_next53: ; preds = %cond_next53, %cond_next40 + %indvar41 = phi i32 [ %indvar.next42, %cond_next53 ], [ 0, %cond_next40 ] ; <i32> [#uses=1] + %indvar.next42 = add i32 %indvar41, 1 ; <i32> [#uses=2] + %exitcond = icmp eq i32 %indvar.next42, 10000 ; <i1> [#uses=1] + br i1 %exitcond, label %bb67, label %cond_next53 + +bb67: ; preds = %cond_next53 + %tmp112 = invoke double @sin( double 5.000000e-01 ) + to label %bb114 unwind label %cleanup ; <double> [#uses=0] + +bb114: ; preds = %bb67 + %tmp147 = invoke double @log( double 5.000000e-01 ) + to label %bb149 unwind label %cleanup ; <double> [#uses=0] + +bb149: ; preds = %bb114 + %tmp175 = invoke double @sqrt( double 5.000000e-01 ) + to label %bb177 unwind label %cleanup ; <double> [#uses=0] + +bb177: ; preds = %bb149 + unreachable + +cleanup: ; preds = %bb149, %bb114, %bb67 + unwind +} + +declare double @sin(double) + +declare double @log(double) + +declare double @sqrt(double) + diff --git a/test/Transforms/SCCP/apint-array.ll b/test/Transforms/SCCP/apint-array.ll new file mode 100644 index 0000000..ead3f6a --- /dev/null +++ b/test/Transforms/SCCP/apint-array.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | grep {ret i101 12} + +@Y = constant [6 x i101] [ i101 12, i101 123456789000000, i101 -12,i101 +-123456789000000, i101 0,i101 9123456789000000] + +define i101 @array() +{ +Head: + %A = getelementptr [6 x i101]* @Y, i32 0, i32 1 + + %B = load i101* %A + %C = icmp sge i101 %B, 1 + br i1 %C, label %True, label %False +True: + %D = and i101 %B, 1 + %E = trunc i101 %D to i32 + %F = getelementptr [6 x i101]* @Y, i32 0, i32 %E + %G = load i101* %F + br label %False +False: + %H = phi i101 [%G, %True], [-1, %Head] + ret i101 %H +} diff --git a/test/Transforms/SCCP/apint-basictest.ll b/test/Transforms/SCCP/apint-basictest.ll new file mode 100644 index 0000000..12f8326 --- /dev/null +++ b/test/Transforms/SCCP/apint-basictest.ll @@ -0,0 +1,16 @@ +; This is a basic sanity check for constant propogation. The add instruction +; should be eliminated. + +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep add + +define i128 @test(i1 %B) { + br i1 %B, label %BB1, label %BB2 +BB1: + %Val = add i128 0, 1 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi i128 [%Val, %BB1], [2, %BB2] + ret i128 %Ret +} diff --git a/test/Transforms/SCCP/apint-basictest2.ll b/test/Transforms/SCCP/apint-basictest2.ll new file mode 100644 index 0000000..7db4e36 --- /dev/null +++ b/test/Transforms/SCCP/apint-basictest2.ll @@ -0,0 +1,17 @@ +; This is a basic sanity check for constant propogation. The add instruction +; and phi instruction should be eliminated. + +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep phi +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep add + +define i128 @test(i1 %B) { + br i1 %B, label %BB1, label %BB2 +BB1: + %Val = add i128 0, 1 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi i128 [%Val, %BB1], [1, %BB2] + ret i128 %Ret +} diff --git a/test/Transforms/SCCP/apint-basictest3.ll b/test/Transforms/SCCP/apint-basictest3.ll new file mode 100644 index 0000000..6e86764 --- /dev/null +++ b/test/Transforms/SCCP/apint-basictest3.ll @@ -0,0 +1,23 @@ +; This is a basic sanity check for constant propogation. It tests the basic +; arithmatic operations. + + +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep mul +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep umod + +define i128 @test(i1 %B) { + br i1 %B, label %BB1, label %BB2 +BB1: + %t1 = add i128 0, 1 + %t2 = sub i128 0, %t1 + %t3 = mul i128 %t2, -1 + br label %BB3 +BB2: + %f1 = udiv i128 -1, 1 + %f2 = add i128 %f1, 1 + %f3 = urem i128 %f2, 2121 + br label %BB3 +BB3: + %Ret = phi i128 [%t3, %BB1], [%f3, %BB2] + ret i128 %Ret +} diff --git a/test/Transforms/SCCP/apint-basictest4.ll b/test/Transforms/SCCP/apint-basictest4.ll new file mode 100644 index 0000000..a90bd7d --- /dev/null +++ b/test/Transforms/SCCP/apint-basictest4.ll @@ -0,0 +1,25 @@ +; This is a basic sanity check for constant propogation. It tests the basic +; logic operations. + + +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep and +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep trunc +; RUN: llvm-as < %s | opt -sccp | llvm-dis | grep {ret i100 -1} + +define i100 @test(i133 %A) { + %B = and i133 0, %A + %C = icmp sgt i133 %B, 0 + br i1 %C, label %BB1, label %BB2 +BB1: + %t3 = xor i133 %B, -1 + %t4 = trunc i133 %t3 to i100 + br label %BB3 +BB2: + %f1 = or i133 -1, %A + %f2 = lshr i133 %f1, 33 + %f3 = trunc i133 %f2 to i100 + br label %BB3 +BB3: + %Ret = phi i100 [%t4, %BB1], [%f3, %BB2] + ret i100 %Ret +} diff --git a/test/Transforms/SCCP/apint-bigarray.ll b/test/Transforms/SCCP/apint-bigarray.ll new file mode 100644 index 0000000..5cd1107 --- /dev/null +++ b/test/Transforms/SCCP/apint-bigarray.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep %X + +@G = global [1000000 x i10000] zeroinitializer + +define internal i10000* @test(i10000 %Arg) { + %X = getelementptr [1000000 x i10000]* @G, i32 0, i32 999 + store i10000 %Arg, i10000* %X + ret i10000* %X +} + +define i10000 @caller() +{ + %Y = call i10000* @test(i10000 -1) + %Z = load i10000* %Y + ret i10000 %Z +} + +define i10000 @caller2() +{ + %Y = call i10000* @test(i10000 1) + %Z = load i10000* %Y + ret i10000 %Z +} diff --git a/test/Transforms/SCCP/apint-bigint.ll b/test/Transforms/SCCP/apint-bigint.ll new file mode 100644 index 0000000..ebb0d07 --- /dev/null +++ b/test/Transforms/SCCP/apint-bigint.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep xor + +define i11129 @test1() { + %B = shl i11129 1, 11128 + %C = sub i11129 %B, 1 + %D = xor i11129 %B, %C + + ret i11129 %D +} diff --git a/test/Transforms/SCCP/apint-bigint2.ll b/test/Transforms/SCCP/apint-bigint2.ll new file mode 100644 index 0000000..e95e9d0 --- /dev/null +++ b/test/Transforms/SCCP/apint-bigint2.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep load + +@Y = constant [6 x i101] [ i101 12, i101 123456789000000, i101 -12, + i101 -123456789000000, i101 0,i101 9123456789000000] + +define i101 @array() +{ +Head: + %A = getelementptr [6 x i101]* @Y, i32 0, i32 1 + %B = load i101* %A + %D = and i101 %B, 1 + %DD = or i101 %D, 1 + %E = trunc i101 %DD to i32 + %F = getelementptr [6 x i101]* @Y, i32 0, i32 %E + %G = load i101* %F + + ret i101 %G +} diff --git a/test/Transforms/SCCP/apint-ipsccp1.ll b/test/Transforms/SCCP/apint-ipsccp1.ll new file mode 100644 index 0000000..59cfa3f --- /dev/null +++ b/test/Transforms/SCCP/apint-ipsccp1.ll @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | grep -v {ret i512 undef} | \ +; RUN: grep {ret i8 2} + +define internal i512 @test(i1 %B) { + br i1 %B, label %BB1, label %BB2 +BB1: + %Val = add i512 0, 1 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi i512 [%Val, %BB1], [2, %BB2] + ret i512 %Ret +} + +define i8 @caller() +{ + %t1 = and i2 2, 1 + %t11 = trunc i2 %t1 to i1 + %t2 = call i512 @test(i1 %t11) + %t3 = trunc i512 %t2 to i8 + ret i8 %t3 +} + diff --git a/test/Transforms/SCCP/apint-ipsccp2.ll b/test/Transforms/SCCP/apint-ipsccp2.ll new file mode 100644 index 0000000..65e5ee7 --- /dev/null +++ b/test/Transforms/SCCP/apint-ipsccp2.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | grep -v {ret i101 0} | \ +; RUN: grep -v {ret i101 undef} | not grep ret + + +define internal i101 @bar(i101 %A) { + %x = icmp eq i101 %A, 0 + br i1 %x, label %T, label %F +T: + %B = call i101 @bar(i101 0) + ret i101 0 +F: ; unreachable + %C = call i101 @bar(i101 1) + ret i101 %C +} + +define i101 @foo() { + %X = call i101 @bar(i101 0) + ret i101 %X +} diff --git a/test/Transforms/SCCP/apint-ipsccp3.ll b/test/Transforms/SCCP/apint-ipsccp3.ll new file mode 100644 index 0000000..c07a54f --- /dev/null +++ b/test/Transforms/SCCP/apint-ipsccp3.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep global + +@G = internal global i66 undef + + + +define void @foo() { + %X = load i66* @G + store i66 %X, i66* @G + ret void +} + +define i66 @bar() { + %V = load i66* @G + %C = icmp eq i66 %V, 17 + br i1 %C, label %T, label %F +T: + store i66 17, i66* @G + ret i66 %V +F: + store i66 123, i66* @G + ret i66 0 +} diff --git a/test/Transforms/SCCP/apint-ipsccp4.ll b/test/Transforms/SCCP/apint-ipsccp4.ll new file mode 100644 index 0000000..de355d1 --- /dev/null +++ b/test/Transforms/SCCP/apint-ipsccp4.ll @@ -0,0 +1,49 @@ +; This test makes sure that these instructions are properly constant propagated. + +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep load +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep add +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep phi + + +@Y = constant [2 x { i212, float }] [ { i212, float } { i212 12, float 1.0 }, + { i212, float } { i212 37, float 2.0 } ] + +define internal float @test2() { + %A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 1, i32 1 + %B = load float* %A + ret float %B +} + +define internal float @test3() { + %A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 0, i32 1 + %B = load float* %A + ret float %B +} + +define internal float @test() +{ + %A = call float @test2() + %B = call float @test3() + + %E = fdiv float %B, %A + ret float %E +} + +define float @All() +{ + %A = call float @test() + %B = fcmp oge float %A, 1.0 + br i1 %B, label %T, label %F +T: + %C = add float %A, 1.0 + br label %exit +F: + %D = add float %A, 2.0 + br label %exit +exit: + %E = phi float [%C, %T], [%D, %F] + ret float %E +} + + + diff --git a/test/Transforms/SCCP/apint-load.ll b/test/Transforms/SCCP/apint-load.ll new file mode 100644 index 0000000..b353a0b --- /dev/null +++ b/test/Transforms/SCCP/apint-load.ll @@ -0,0 +1,36 @@ +; This test makes sure that these instructions are properly constant propagated. + +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep load +; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep fdiv + +@X = constant i212 42 +@Y = constant [2 x { i212, float }] [ { i212, float } { i212 12, float 1.0 }, + { i212, float } { i212 37, float 1.2312 } ] +define i212 @test1() { + %B = load i212* @X + ret i212 %B +} + +define internal float @test2() { + %A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 1, i32 1 + %B = load float* %A + ret float %B +} + +define internal i212 @test3() { + %A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 0, i32 0 + %B = load i212* %A + ret i212 %B +} + +define float @All() +{ + %A = call float @test2() + %B = call i212 @test3() + %C = mul i212 %B, -1234567 + %D = sitofp i212 %C to float + %E = fdiv float %A, %D + ret float %E +} + + diff --git a/test/Transforms/SCCP/apint-phi.ll b/test/Transforms/SCCP/apint-phi.ll new file mode 100644 index 0000000..77f6bc8 --- /dev/null +++ b/test/Transforms/SCCP/apint-phi.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep phi + +define i999 @test(i999%A, i1 %c) { +bb1: + br label %BB2 +BB2: + %V = phi i999 [2, %bb1], [%A, %BB4] + br label %BB3 + +BB3: + %E = trunc i999 %V to i1 + %F = and i1 %E, %c + br i1 %F, label %BB4, label %BB5 +BB4: + br label %BB2 + +BB5: + ret i999 %V +} diff --git a/test/Transforms/SCCP/apint-select.ll b/test/Transforms/SCCP/apint-select.ll new file mode 100644 index 0000000..c856896 --- /dev/null +++ b/test/Transforms/SCCP/apint-select.ll @@ -0,0 +1,21 @@ +; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep select + +@A = constant i32 10 + +define i712 @test1() { + %P = getelementptr i32* @A, i32 0 + %B = ptrtoint i32* %P to i64 + %BB = and i64 %B, undef + %C = icmp sge i64 %BB, 0 + %X = select i1 %C, i712 0, i712 1 + ret i712 %X +} + + + +define i712 @test2(i1 %C) { + %X = select i1 %C, i712 0, i712 undef + ret i712 %X +} + + diff --git a/test/Transforms/SCCP/basictest.ll b/test/Transforms/SCCP/basictest.ll new file mode 100644 index 0000000..417f847 --- /dev/null +++ b/test/Transforms/SCCP/basictest.ll @@ -0,0 +1,16 @@ +; This is a basic sanity check for constant propogation. The add instruction +; should be eliminated. + +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep add + +int %test(bool %B) { + br bool %B, label %BB1, label %BB2 +BB1: + %Val = add int 0, 0 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi int [%Val, %BB1], [1, %BB2] + ret int %Ret +} diff --git a/test/Transforms/SCCP/calltest.ll b/test/Transforms/SCCP/calltest.ll new file mode 100644 index 0000000..43df00c --- /dev/null +++ b/test/Transforms/SCCP/calltest.ll @@ -0,0 +1,25 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -adce -simplifycfg | llvm-dis | \ +; RUN: not grep br + +; No matter how hard you try, sqrt(1.0) is always 1.0. This allows the +; optimizer to delete this loop. + +declare double %sqrt(double) + +double %test(uint %param) { +entry: + br label %Loop + +Loop: + %I2 = phi uint [ 0, %entry ], [ %I3, %Loop ] + %V = phi double [ 1.0, %entry], [ %V2, %Loop ] + + %V2 = call double %sqrt(double %V) + + %I3 = add uint %I2, 1 + %tmp.7 = setne uint %I3, %param + br bool %tmp.7, label %Loop, label %Exit + +Exit: + ret double %V +} diff --git a/test/Transforms/SCCP/dg.exp b/test/Transforms/SCCP/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/SCCP/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/SCCP/ipsccp-basic.ll b/test/Transforms/SCCP/ipsccp-basic.ll new file mode 100644 index 0000000..2390d61 --- /dev/null +++ b/test/Transforms/SCCP/ipsccp-basic.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipsccp | llvm-dis | \ +; RUN: grep -v {ret i32 17} | grep -v {ret i32 undef} | not grep ret + +implementation + +internal int %bar(int %A) { + %X = add int 1, 2 + ret int %A +} + +int %foo() { + %X = call int %bar(int 17) + ret int %X +} diff --git a/test/Transforms/SCCP/ipsccp-conditional.ll b/test/Transforms/SCCP/ipsccp-conditional.ll new file mode 100644 index 0000000..db36228 --- /dev/null +++ b/test/Transforms/SCCP/ipsccp-conditional.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipsccp | llvm-dis | \ +; RUN: grep -v {ret i32 0} | grep -v {ret i32 undef} | not grep ret + +implementation + +internal int %bar(int %A) { + %C = seteq int %A, 0 + br bool %C, label %T, label %F +T: + %B = call int %bar(int 0) + ret int 0 +F: ; unreachable + %C = call int %bar(int 1) + ret int %C +} + +int %foo() { + %X = call int %bar(int 0) + ret int %X +} diff --git a/test/Transforms/SCCP/ipsccp-gvar.ll b/test/Transforms/SCCP/ipsccp-gvar.ll new file mode 100644 index 0000000..d76b481 --- /dev/null +++ b/test/Transforms/SCCP/ipsccp-gvar.ll @@ -0,0 +1,23 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -ipsccp | llvm-dis | not grep global + +%G = internal global int undef + +implementation + +void %foo() { + %X = load int* %G + store int %X, int* %G + ret void +} + +int %bar() { + %V = load int* %G + %C = seteq int %V, 17 + br bool %C, label %T, label %F +T: + store int 17, int* %G + ret int %V +F: + store int 123, int* %G + ret int 0 +} diff --git a/test/Transforms/SCCP/loadtest.ll b/test/Transforms/SCCP/loadtest.ll new file mode 100644 index 0000000..99da728 --- /dev/null +++ b/test/Transforms/SCCP/loadtest.ll @@ -0,0 +1,26 @@ +; This test makes sure that these instructions are properly constant propagated. +; + +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep load + +%X = constant int 42 +%Y = constant [2 x { int, float }] [ { int, float } { int 12, float 1.0 }, + { int, float } { int 37, float 1.2312 } ] +int %test1() { + %B = load int* %X + ret int %B +} + +float %test2() { + %A = getelementptr [2 x { int, float}]* %Y, long 0, long 1, uint 1 + %B = load float* %A + ret float %B +} + +int %test3() { + %A = getelementptr [2 x { int, float}]* %Y, long 0, long 0, uint 0 + %B = load int* %A + ret int %B +} + + diff --git a/test/Transforms/SCCP/logical-nuke.ll b/test/Transforms/SCCP/logical-nuke.ll new file mode 100644 index 0000000..02c3ac0 --- /dev/null +++ b/test/Transforms/SCCP/logical-nuke.ll @@ -0,0 +1,8 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | grep {ret i32 0} + +; Test that SCCP has basic knowledge of when and/or nuke overdefined values. + +int %test(int %X) { + %Y = and int %X, 0 + ret int %Y +} diff --git a/test/Transforms/SCCP/phitest.ll b/test/Transforms/SCCP/phitest.ll new file mode 100644 index 0000000..b44a318 --- /dev/null +++ b/test/Transforms/SCCP/phitest.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -dce -simplifycfg | llvm-dis | \ +; RUN: not grep br + +int %test(int %param) { +entry: + %tmp.1 = setne int %param, 0 + br bool %tmp.1, label %endif.0, label %else + +else: + br label %endif.0 + +endif.0: + %a.0 = phi int [ 2, %else ], [ 3, %entry ] + %b.0 = phi int [ 3, %else ], [ 2, %entry ] + %tmp.5 = add int %a.0, %b.0 + %tmp.7 = setne int %tmp.5, 5 + br bool %tmp.7, label %UnifiedReturnBlock, label %endif.1 + +endif.1: + ret int 0 + +UnifiedReturnBlock: + ret int 2 +} diff --git a/test/Transforms/SCCP/sccptest.ll b/test/Transforms/SCCP/sccptest.ll new file mode 100644 index 0000000..f0a8244 --- /dev/null +++ b/test/Transforms/SCCP/sccptest.ll @@ -0,0 +1,35 @@ +; This is the test case taken from appel's book that illustrates a hard case +; that SCCP gets right. BB3 should be completely eliminated. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp -constprop -dce -simplifycfg | \ +; RUN: llvm-dis | not grep BB3 + +int %testfunction(int %i0, int %j0) { +BB1: + br label %BB2 +BB2: + %j2 = phi int [%j4, %BB7], [1, %BB1] + %k2 = phi int [%k4, %BB7], [0, %BB1] + %kcond = setlt int %k2, 100 + br bool %kcond, label %BB3, label %BB4 + +BB3: + %jcond = setlt int %j2, 20 + br bool %jcond, label %BB5, label %BB6 + +BB4: + ret int %j2 + +BB5: + %k3 = add int %k2, 1 + br label %BB7 + +BB6: + %k5 = add int %k2, 1 + br label %BB7 + +BB7: + %j4 = phi int [1, %BB5], [%k2, %BB6] + %k4 = phi int [%k3, %BB5], [%k5, %BB6] + br label %BB2 +} diff --git a/test/Transforms/SCCP/select.ll b/test/Transforms/SCCP/select.ll new file mode 100644 index 0000000..cd488e3 --- /dev/null +++ b/test/Transforms/SCCP/select.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -sccp | llvm-dis | not grep select + +int %test1(bool %C) { + %X = select bool %C, int 0, int 0 + ret int %X +} + +int %test2(bool %C) { + %X = select bool %C, int 0, int undef + ret int %X +} diff --git a/test/Transforms/ScalarRepl/2003-05-29-ArrayFail.ll b/test/Transforms/ScalarRepl/2003-05-29-ArrayFail.ll new file mode 100644 index 0000000..c20411d --- /dev/null +++ b/test/Transforms/ScalarRepl/2003-05-29-ArrayFail.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: grep alloca | grep {4 x} + +; Test that an array is not incorrectly deconstructed... + +int %test() { + %X = alloca [4 x int] + %Y = getelementptr [4 x int]* %X, long 0, long 0 + %Z = getelementptr int* %Y, long 1 ; Must preserve arrayness! + %A = load int* %Z + ret int %A +} diff --git a/test/Transforms/ScalarRepl/2003-05-30-InvalidIndices.ll b/test/Transforms/ScalarRepl/2003-05-30-InvalidIndices.ll new file mode 100644 index 0000000..a66e575 --- /dev/null +++ b/test/Transforms/ScalarRepl/2003-05-30-InvalidIndices.ll @@ -0,0 +1,7 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl + +void %main() { + %E = alloca { { int, float, double, long }, { int, float, double, long } } ; <{ { int, float, double, long }, { int, float, double, long } }*> [#uses=1] + %tmp.151 = getelementptr { { int, float, double, long }, { int, float, double, long } }* %E, long 0, uint 1, uint 3 ; <long*> [#uses=0] + ret void +} diff --git a/test/Transforms/ScalarRepl/2003-05-30-MultiLevel.ll b/test/Transforms/ScalarRepl/2003-05-30-MultiLevel.ll new file mode 100644 index 0000000..20beadc --- /dev/null +++ b/test/Transforms/ScalarRepl/2003-05-30-MultiLevel.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl + +int %test() { + %X = alloca { [ 4 x int] } + %Y = getelementptr { [ 4 x int] }* %X, long 0, uint 0, long 2 + store int 4, int* %Y + %Z = load int* %Y + ret int %Z +} diff --git a/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll b/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll new file mode 100644 index 0000000..c3f3b8b --- /dev/null +++ b/test/Transforms/ScalarRepl/2003-09-12-IncorrectPromote.ll @@ -0,0 +1,12 @@ +; Scalar replacement was incorrectly promoting this alloca!! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: sed {s/;.*//g} | grep \[ + +sbyte *%test() { + %A = alloca [30 x sbyte] + %B = getelementptr [30 x sbyte]* %A, long 0, long 0 + %C = getelementptr sbyte* %B, long 1 + store sbyte 0, sbyte* %B + ret sbyte* %C +} diff --git a/test/Transforms/ScalarRepl/2003-10-29-ArrayProblem.ll b/test/Transforms/ScalarRepl/2003-10-29-ArrayProblem.ll new file mode 100644 index 0000000..d945aeb --- /dev/null +++ b/test/Transforms/ScalarRepl/2003-10-29-ArrayProblem.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: grep alloca | grep \{ +implementation ; Functions: + +declare int %.callback_1(sbyte*) +declare void %.iter_2(int (sbyte*)*, sbyte*) + +int %main() { + %d = alloca { [80 x sbyte], int, uint } + %tmp.0 = getelementptr { [80 x sbyte], int, uint }* %d, long 0, uint 2 + store uint 0, uint* %tmp.0 + %tmp.1 = getelementptr { [80 x sbyte], int, uint }* %d, long 0, uint 0, long 0 + call void %.iter_2( int (sbyte*)* %.callback_1, sbyte* %tmp.1 ) + ret int 0 +} diff --git a/test/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll b/test/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll new file mode 100644 index 0000000..f7f1593 --- /dev/null +++ b/test/Transforms/ScalarRepl/2005-12-14-UnionPromoteCrash.ll @@ -0,0 +1,34 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -disable-output +target endian = big +target pointersize = 32 + %struct.rtx_def = type { [2 x ubyte], int, [1 x %union.rtunion_def] } + %union.rtunion_def = type { uint } + +implementation ; Functions: + +void %find_reloads() { +entry: + %c_addr.i = alloca sbyte ; <sbyte*> [#uses=1] + switch uint 0, label %return [ + uint 36, label %label.7 + uint 34, label %label.7 + uint 41, label %label.5 + ] + +label.5: ; preds = %entry + ret void + +label.7: ; preds = %entry, %entry + br bool false, label %then.4, label %switchexit.0 + +then.4: ; preds = %label.7 + %tmp.0.i = cast sbyte* %c_addr.i to int* ; <int*> [#uses=1] + store int 44, int* %tmp.0.i + ret void + +switchexit.0: ; preds = %label.7 + ret void + +return: ; preds = %entry + ret void +} diff --git a/test/Transforms/ScalarRepl/2006-01-24-IllegalUnionPromoteCrash.ll b/test/Transforms/ScalarRepl/2006-01-24-IllegalUnionPromoteCrash.ll new file mode 100644 index 0000000..d974931 --- /dev/null +++ b/test/Transforms/ScalarRepl/2006-01-24-IllegalUnionPromoteCrash.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -disable-output + +target endian = big +target pointersize = 32 + +int %test(long %L) { + %X = alloca int + %Y = cast int* %X to ulong* + store ulong 0, ulong* %Y + %Z = load int *%X + ret int %Z +} diff --git a/test/Transforms/ScalarRepl/2006-04-20-PromoteCrash.ll b/test/Transforms/ScalarRepl/2006-04-20-PromoteCrash.ll new file mode 100644 index 0000000..a4d3933 --- /dev/null +++ b/test/Transforms/ScalarRepl/2006-04-20-PromoteCrash.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -disable-output + +void %output_toc() { +entry: + %buf = alloca [256 x sbyte], align 16 ; <[256 x sbyte]*> [#uses=1] + %name = alloca sbyte*, align 4 ; <sbyte**> [#uses=1] + %real_name = alloca sbyte*, align 4 ; <sbyte**> [#uses=0] + "alloca point" = cast int 0 to int ; <int> [#uses=0] + %buf = cast [256 x sbyte]* %buf to sbyte* ; <sbyte*> [#uses=1] + store sbyte* %buf, sbyte** %name + call void %abort( ) + unreachable + +return: ; No predecessors! + ret void +} + +declare void %abort() diff --git a/test/Transforms/ScalarRepl/2006-10-23-PointerUnionCrash.ll b/test/Transforms/ScalarRepl/2006-10-23-PointerUnionCrash.ll new file mode 100644 index 0000000..9fcf16d --- /dev/null +++ b/test/Transforms/ScalarRepl/2006-10-23-PointerUnionCrash.ll @@ -0,0 +1,75 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -disable-output + +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-apple-darwin8.7.2" + +implementation ; Functions: + +void %glgProcessColor() { +entry: + %source_ptr = alloca sbyte*, align 4 ; <sbyte**> [#uses=2] + br bool false, label %bb1357, label %cond_next583 + +cond_next583: ; preds = %entry + ret void + +bb1357: ; preds = %entry + br bool false, label %bb1365, label %bb27055 + +bb1365: ; preds = %bb1357 + switch uint 0, label %cond_next10377 [ + uint 0, label %bb4679 + uint 1, label %bb4679 + uint 2, label %bb4679 + uint 3, label %bb4679 + uint 4, label %bb5115 + uint 5, label %bb6651 + uint 6, label %bb7147 + uint 7, label %bb8683 + uint 8, label %bb9131 + uint 9, label %bb9875 + uint 10, label %bb4679 + uint 11, label %bb4859 + uint 12, label %bb4679 + uint 16, label %bb10249 + ] + +bb4679: ; preds = %bb1365, %bb1365, %bb1365, %bb1365, %bb1365, %bb1365 + ret void + +bb4859: ; preds = %bb1365 + ret void + +bb5115: ; preds = %bb1365 + ret void + +bb6651: ; preds = %bb1365 + ret void + +bb7147: ; preds = %bb1365 + ret void + +bb8683: ; preds = %bb1365 + ret void + +bb9131: ; preds = %bb1365 + ret void + +bb9875: ; preds = %bb1365 + %source_ptr9884 = cast sbyte** %source_ptr to ubyte** ; <ubyte**> [#uses=1] + %tmp9885 = load ubyte** %source_ptr9884 ; <ubyte*> [#uses=0] + ret void + +bb10249: ; preds = %bb1365 + %source_ptr10257 = cast sbyte** %source_ptr to ushort** ; <ushort**> [#uses=1] + %tmp10258 = load ushort** %source_ptr10257 ; <ushort*> [#uses=0] + ret void + +cond_next10377: ; preds = %bb1365 + ret void + +bb27055: ; preds = %bb1357 + ret void +} diff --git a/test/Transforms/ScalarRepl/2006-11-07-InvalidArrayPromote.ll b/test/Transforms/ScalarRepl/2006-11-07-InvalidArrayPromote.ll new file mode 100644 index 0000000..7e00a61 --- /dev/null +++ b/test/Transforms/ScalarRepl/2006-11-07-InvalidArrayPromote.ll @@ -0,0 +1,19 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: grep -F {alloca \[2 x <4 x i32>\]} + +int %func(<4 x float> %v0, <4 x float> %v1) { + %vsiidx = alloca [2 x <4 x int>], align 16 ; <[2 x <4 x int>]*> [#uses=3] + %tmp = call <4 x int> %llvm.x86.sse2.cvttps2dq( <4 x float> %v0 ) ; <<4 x int>> [#uses=2] + %tmp = cast <4 x int> %tmp to <2 x long> ; <<2 x long>> [#uses=0] + %tmp = getelementptr [2 x <4 x int>]* %vsiidx, int 0, int 0 ; <<4 x int>*> [#uses=1] + store <4 x int> %tmp, <4 x int>* %tmp + %tmp10 = call <4 x int> %llvm.x86.sse2.cvttps2dq( <4 x float> %v1 ) ; <<4 x int>> [#uses=2] + %tmp10 = cast <4 x int> %tmp10 to <2 x long> ; <<2 x long>> [#uses=0] + %tmp14 = getelementptr [2 x <4 x int>]* %vsiidx, int 0, int 1 ; <<4 x int>*> [#uses=1] + store <4 x int> %tmp10, <4 x int>* %tmp14 + %tmp15 = getelementptr [2 x <4 x int>]* %vsiidx, int 0, int 0, int 4 ; <int*> [#uses=1] + %tmp = load int* %tmp15 ; <int> [#uses=1] + ret int %tmp +} + +declare <4 x int> %llvm.x86.sse2.cvttps2dq(<4 x float>) diff --git a/test/Transforms/ScalarRepl/2006-12-11-SROA-Crash.ll b/test/Transforms/ScalarRepl/2006-12-11-SROA-Crash.ll new file mode 100644 index 0000000..0b87a63 --- /dev/null +++ b/test/Transforms/ScalarRepl/2006-12-11-SROA-Crash.ll @@ -0,0 +1,24 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -disable-output +; PR1045 + +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>" = type { "struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block"* } + "struct.__gnu_cxx::bitmap_allocator<char>" = type { ubyte } + "struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block" = type { [8 x sbyte] } + +implementation ; Functions: + +void %_ZN9__gnu_cxx16bitmap_allocatorIwE27_M_deallocate_single_objectEPw() { +entry: + %this_addr.i = alloca "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* ; <"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"**> [#uses=3] + %tmp = alloca "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>", align 4 ; <"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] + store "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp, "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i + %tmp.i = load "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i ; <"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] + %tmp.i = bitcast "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp.i to "struct.__gnu_cxx::bitmap_allocator<char>"* ; <"struct.__gnu_cxx::bitmap_allocator<char>"*> [#uses=0] + %tmp1.i = load "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i ; <"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] + %tmp.i = getelementptr "struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp1.i, int 0, uint 0 ; <"struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block"**> [#uses=0] + unreachable +} diff --git a/test/Transforms/ScalarRepl/2007-03-19-CanonicalizeMemcpy.ll b/test/Transforms/ScalarRepl/2007-03-19-CanonicalizeMemcpy.ll new file mode 100644 index 0000000..769ec19 --- /dev/null +++ b/test/Transforms/ScalarRepl/2007-03-19-CanonicalizeMemcpy.ll @@ -0,0 +1,44 @@ +; RUN: llvm-as < %s | opt -scalarrepl -disable-output + +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 = "arm-apple-darwin8" + %struct.CGPoint = type { float, float } + %struct.aal_big_range_t = type { i32, i32 } + %struct.aal_callback_t = type { i8* (i8*, i32)*, void (i8*, i8*)* } + %struct.aal_edge_pool_t = type { %struct.aal_edge_pool_t*, i32, i32, [0 x %struct.aal_edge_t] } + %struct.aal_edge_t = type { %struct.CGPoint, %struct.CGPoint, i32 } + %struct.aal_range_t = type { i16, i16 } + %struct.aal_span_pool_t = type { %struct.aal_span_pool_t*, [341 x %struct.aal_span_t] } + %struct.aal_span_t = type { %struct.aal_span_t*, %struct.aal_big_range_t } + %struct.aal_spanarray_t = type { [2 x %struct.aal_range_t] } + %struct.aal_spanbucket_t = type { i16, [2 x i8], %struct.anon } + %struct.aal_state_t = type { %struct.CGPoint, %struct.CGPoint, %struct.CGPoint, i32, float, float, float, float, %struct.CGPoint, %struct.CGPoint, float, float, float, float, i32, i32, i32, i32, float, float, i8*, i32, i32, %struct.aal_edge_pool_t*, %struct.aal_edge_pool_t*, i8*, %struct.aal_callback_t*, i32, %struct.aal_span_t*, %struct.aal_span_t*, %struct.aal_span_t*, %struct.aal_span_pool_t*, i8, float, i8, i32 } + %struct.anon = type { %struct.aal_spanarray_t } + + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +define fastcc void @aal_insert_span() { +entry: + %SB = alloca %struct.aal_spanbucket_t, align 4 ; <%struct.aal_spanbucket_t*> [#uses=2] + br i1 false, label %cond_true, label %cond_next79 + +cond_true: ; preds = %entry + br i1 false, label %cond_next, label %cond_next114.i + +cond_next114.i: ; preds = %cond_true + ret void + +cond_next: ; preds = %cond_true + %SB19 = bitcast %struct.aal_spanbucket_t* %SB to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %SB19, i8* null, i32 12, i32 0 ) + br i1 false, label %cond_next34, label %cond_next79 + +cond_next34: ; preds = %cond_next + %i.2.reload22 = load i32* null ; <i32> [#uses=1] + %tmp51 = getelementptr %struct.aal_spanbucket_t* %SB, i32 0, i32 2, i32 0, i32 0, i32 %i.2.reload22, i32 1 ; <i16*> [#uses=0] + ret void + +cond_next79: ; preds = %cond_next, %entry + ret void +} diff --git a/test/Transforms/ScalarRepl/2007-05-24-LargeAggregate.ll b/test/Transforms/ScalarRepl/2007-05-24-LargeAggregate.ll new file mode 100644 index 0000000..43b721b --- /dev/null +++ b/test/Transforms/ScalarRepl/2007-05-24-LargeAggregate.ll @@ -0,0 +1,27 @@ +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | grep {alloca.*client_t} +; PR1446 +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" + + %struct.clientSnapshot_t = type { i32, [32 x i8], %struct.playerState_t, i32, i32, i32, i32, i32 } + %struct.client_t = type { i32, [1024 x i8], [64 x [1024 x i8]], i32, i32, i32, i32, i32, i32, %struct.usercmd_t, i32, i32, [1024 x i8], %struct.sharedEntity_t*, [32 x i8], [64 x i8], i32, i32, i32, i32, i32, i32, [8 x i8*], [8 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, [32 x %struct.clientSnapshot_t], i32, i32, i32, i32, i32, %struct.netchan_t, %struct.netchan_buffer_t*, %struct.netchan_buffer_t**, i32, [1025 x i32] } + %struct.entityShared_t = type { %struct.entityState_t, i32, i32, i32, i32, i32, [3 x float], [3 x float], i32, [3 x float], [3 x float], [3 x float], [3 x float], i32 } + %struct.entityState_t = type { i32, i32, i32, %struct.trajectory_t, %struct.trajectory_t, i32, i32, [3 x float], [3 x float], [3 x float], [3 x float], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } + %struct.msg_t = type { i32, i32, i32, i8*, i32, i32, i32, i32 } + %struct.netadr_t = type { i32, [4 x i8], [10 x i8], i16 } + %struct.netchan_buffer_t = type { %struct.msg_t, [16384 x i8], %struct.netchan_buffer_t* } + %struct.netchan_t = type { i32, i32, %struct.netadr_t, i32, i32, i32, i32, i32, [16384 x i8], i32, i32, i32, [16384 x i8] } + %struct.playerState_t = type { i32, i32, i32, i32, i32, [3 x float], [3 x float], i32, i32, i32, [3 x i32], i32, i32, i32, i32, i32, i32, [3 x float], i32, i32, [2 x i32], [2 x i32], i32, i32, i32, i32, i32, i32, [3 x float], i32, i32, i32, i32, i32, [16 x i32], [16 x i32], [16 x i32], [16 x i32], i32, i32, i32, i32, i32, i32, i32 } + %struct.sharedEntity_t = type { %struct.entityState_t, %struct.entityShared_t } + %struct.trajectory_t = type { i32, i32, i32, [3 x float], [3 x float] } + %struct.usercmd_t = type { i32, [3 x i32], i32, i8, i8, i8, i8 } + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +define void @SV_DirectConnect(i64 %from.0.0, i64 %from.0.1, i32 %from.1) { +entry: + %temp = alloca %struct.client_t, align 16 ; <%struct.client_t*> [#uses=1] + %temp586 = bitcast %struct.client_t* %temp to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* null, i8* %temp586, i32 121596, i32 0 ) + unreachable +} diff --git a/test/Transforms/ScalarRepl/2007-05-29-MemcpyPreserve.ll b/test/Transforms/ScalarRepl/2007-05-29-MemcpyPreserve.ll new file mode 100644 index 0000000..dc1198e --- /dev/null +++ b/test/Transforms/ScalarRepl/2007-05-29-MemcpyPreserve.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | grep memcpy +; PR1421 + +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-apple-darwin8" + %struct.LongestMember = type { i8, i32 } + %struct.MyString = type { i32 } + %struct.UnionType = type { %struct.LongestMember } + +define void @_Z4testP9UnionTypePS0_(%struct.UnionType* %p, %struct.UnionType** %pointerToUnion) { +entry: + %tmp = alloca %struct.UnionType, align 8 ; <%struct.UnionType*> [#uses=2] + %tmp2 = getelementptr %struct.UnionType* %tmp, i32 0, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp13 = getelementptr %struct.UnionType* %p, i32 0, i32 0, i32 0 ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %tmp2, i8* %tmp13, i32 8, i32 0 ) + %tmp5 = load %struct.UnionType** %pointerToUnion ; <%struct.UnionType*> [#uses=1] + %tmp56 = getelementptr %struct.UnionType* %tmp5, i32 0, i32 0, i32 0 ; <i8*> [#uses=1] + %tmp7 = getelementptr %struct.UnionType* %tmp, i32 0, i32 0, i32 0 ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %tmp56, i8* %tmp7, i32 8, i32 0 ) + ret void +} + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) diff --git a/test/Transforms/ScalarRepl/AggregatePromote.ll b/test/Transforms/ScalarRepl/AggregatePromote.ll new file mode 100644 index 0000000..67ccad0 --- /dev/null +++ b/test/Transforms/ScalarRepl/AggregatePromote.ll @@ -0,0 +1,54 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca + +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8.0.0" + +long %test1(long %X) { + %A = alloca long + store long %X, long* %A + %B = cast long* %A to int* + %C = cast int* %B to sbyte* + store sbyte 0, sbyte* %C + %Y = load long *%A + ret long %Y +} + + +sbyte %test2(long %X) { + %X_addr = alloca long ; <long*> [#uses=2] + store long %X, long* %X_addr + %tmp.0 = cast long* %X_addr to int* ; <int*> [#uses=1] + %tmp.1 = getelementptr int* %tmp.0, int 1 ; <int*> [#uses=1] + %tmp.2 = cast int* %tmp.1 to sbyte* + %tmp.3 = getelementptr sbyte* %tmp.2, int 3 + %tmp.2 = load sbyte* %tmp.3 ; <int> [#uses=1] + ret sbyte %tmp.2 +} + +short %crafty(long %X) { + %a = alloca { long } + %tmp.0 = getelementptr { long }* %a, int 0, uint 0 ; <long*> [#uses=1] + store long %X, long* %tmp.0 + %tmp.3 = cast { long }* %a to [4 x short]* ; <[4 x short]*> [#uses=2] + %tmp.4 = getelementptr [4 x short]* %tmp.3, int 0, int 3 ; <short*> [#uses=1] + %tmp.5 = load short* %tmp.4 ; <short> [#uses=1] + %tmp.8 = getelementptr [4 x short]* %tmp.3, int 0, int 2 ; <short*> [#uses=1] + %tmp.9 = load short* %tmp.8 ; <short> [#uses=1] + %tmp.10 = or short %tmp.9, %tmp.5 ; <short> [#uses=1] + ret short %tmp.10 +} + +short %crafty2(long %X) { + %a = alloca long + store long %X, long* %a + %tmp.3 = cast long* %a to [4 x short]* ; <[4 x short]*> [#uses=2] + %tmp.4 = getelementptr [4 x short]* %tmp.3, int 0, int 3 ; <short*> [#uses=1] + %tmp.5 = load short* %tmp.4 ; <short> [#uses=1] + %tmp.8 = getelementptr [4 x short]* %tmp.3, int 0, int 2 ; <short*> [#uses=1] + %tmp.9 = load short* %tmp.8 ; <short> [#uses=1] + %tmp.10 = or short %tmp.9, %tmp.5 ; <short> [#uses=1] + ret short %tmp.10 +} + diff --git a/test/Transforms/ScalarRepl/DifferingTypes.ll b/test/Transforms/ScalarRepl/DifferingTypes.ll new file mode 100644 index 0000000..33fab57 --- /dev/null +++ b/test/Transforms/ScalarRepl/DifferingTypes.ll @@ -0,0 +1,19 @@ +; This is a feature test. Hopefully one day this will be implemented. The +; generated code should perform the appropriate masking operations required +; depending on the endianness of the target... +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca + +implementation + +int %testfunc(int %i, sbyte %j) { + %I = alloca int + + store int %i, int* %I + + %P = cast int* %I to sbyte* + store sbyte %j, sbyte* %P + + %t = load int* %I + ret int %t +} diff --git a/test/Transforms/ScalarRepl/arraytest.ll b/test/Transforms/ScalarRepl/arraytest.ll new file mode 100644 index 0000000..e6fe1a6 --- /dev/null +++ b/test/Transforms/ScalarRepl/arraytest.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -mem2reg | llvm-dis | not grep alloca + +int %test() { + %X = alloca [ 4 x int ] + %Y = getelementptr [4x int]* %X, long 0, long 0 + store int 0, int* %Y + + %Z = load int* %Y + ret int %Z +} diff --git a/test/Transforms/ScalarRepl/badarray.ll b/test/Transforms/ScalarRepl/badarray.ll new file mode 100644 index 0000000..f525255 --- /dev/null +++ b/test/Transforms/ScalarRepl/badarray.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -mem2reg | llvm-dis | grep alloca + +int %test() { + %X = alloca [ 4 x int ] + %Y = getelementptr [4x int]* %X, long 0, long 6 ; Off end of array! + store int 0, int* %Y + + %Z = load int* %Y + ret int %Z +} diff --git a/test/Transforms/ScalarRepl/basictest.ll b/test/Transforms/ScalarRepl/basictest.ll new file mode 100644 index 0000000..b7e0a29 --- /dev/null +++ b/test/Transforms/ScalarRepl/basictest.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl -mem2reg | llvm-dis | not grep alloca + +int %test() { + %X = alloca { int, float } + %Y = getelementptr {int,float}* %X, long 0, uint 0 + store int 0, int* %Y + + %Z = load int* %Y + ret int %Z +} diff --git a/test/Transforms/ScalarRepl/dg.exp b/test/Transforms/ScalarRepl/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/ScalarRepl/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/ScalarRepl/memcpy-from-global.ll b/test/Transforms/ScalarRepl/memcpy-from-global.ll new file mode 100644 index 0000000..ee77e1f --- /dev/null +++ b/test/Transforms/ScalarRepl/memcpy-from-global.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | not grep {call.*memcpy} +@C.0.1248 = internal constant [128 x float] [ float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float -1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float -1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float -1.000000e+00, float 0.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 ], align 32 ; <[128 x float]*> [#uses=1] + +define float @grad4(i32 %hash, float %x, float %y, float %z, float %w) { +entry: + %lookupTable = alloca [128 x float], align 16 ; <[128 x float]*> [#uses=5] + %lookupTable1 = bitcast [128 x float]* %lookupTable to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %lookupTable1, i8* bitcast ([128 x float]* @C.0.1248 to i8*), i32 512, i32 16 ) + %tmp3 = shl i32 %hash, 2 ; <i32> [#uses=1] + %tmp5 = and i32 %tmp3, 124 ; <i32> [#uses=4] + %tmp753 = getelementptr [128 x float]* %lookupTable, i32 0, i32 %tmp5 ; <float*> [#uses=1] + %tmp9 = load float* %tmp753 ; <float> [#uses=1] + %tmp11 = mul float %tmp9, %x ; <float> [#uses=1] + %tmp13 = add float %tmp11, 0.000000e+00 ; <float> [#uses=1] + %tmp17.sum52 = or i32 %tmp5, 1 ; <i32> [#uses=1] + %tmp1851 = getelementptr [128 x float]* %lookupTable, i32 0, i32 %tmp17.sum52 ; <float*> [#uses=1] + %tmp19 = load float* %tmp1851 ; <float> [#uses=1] + %tmp21 = mul float %tmp19, %y ; <float> [#uses=1] + %tmp23 = add float %tmp21, %tmp13 ; <float> [#uses=1] + %tmp27.sum50 = or i32 %tmp5, 2 ; <i32> [#uses=1] + %tmp2849 = getelementptr [128 x float]* %lookupTable, i32 0, i32 %tmp27.sum50 ; <float*> [#uses=1] + %tmp29 = load float* %tmp2849 ; <float> [#uses=1] + %tmp31 = mul float %tmp29, %z ; <float> [#uses=1] + %tmp33 = add float %tmp31, %tmp23 ; <float> [#uses=1] + %tmp37.sum48 = or i32 %tmp5, 3 ; <i32> [#uses=1] + %tmp3847 = getelementptr [128 x float]* %lookupTable, i32 0, i32 %tmp37.sum48 ; <float*> [#uses=1] + %tmp39 = load float* %tmp3847 ; <float> [#uses=1] + %tmp41 = mul float %tmp39, %w ; <float> [#uses=1] + %tmp43 = add float %tmp41, %tmp33 ; <float> [#uses=1] + ret float %tmp43 +} + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) diff --git a/test/Transforms/ScalarRepl/memset-aggregate-byte-leader.ll b/test/Transforms/ScalarRepl/memset-aggregate-byte-leader.ll new file mode 100644 index 0000000..91d8ea9 --- /dev/null +++ b/test/Transforms/ScalarRepl/memset-aggregate-byte-leader.ll @@ -0,0 +1,23 @@ +; PR1226 +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | \ +; RUN: not grep {call void @llvm.memcpy.i32} +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | grep getelementptr +; END. + +target datalayout = "E-p:32:32" +target triple = "powerpc-apple-darwin8.8.0" + %struct.foo = type { i8, i8 } + + +define i32 @test1(%struct.foo* %P) { +entry: + %L = alloca %struct.foo, align 2 ; <%struct.foo*> [#uses=1] + %L2 = getelementptr %struct.foo* %L, i32 0, i32 0 ; <i8*> [#uses=2] + %tmp13 = getelementptr %struct.foo* %P, i32 0, i32 0 ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %L2, i8* %tmp13, i32 2, i32 1 ) + %tmp5 = load i8* %L2 ; <i8> [#uses=1] + %tmp56 = sext i8 %tmp5 to i32 ; <i32> [#uses=1] + ret i32 %tmp56 +} + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) diff --git a/test/Transforms/ScalarRepl/memset-aggregate.ll b/test/Transforms/ScalarRepl/memset-aggregate.ll new file mode 100644 index 0000000..4febda5 --- /dev/null +++ b/test/Transforms/ScalarRepl/memset-aggregate.ll @@ -0,0 +1,48 @@ +; PR1226 +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | grep {ret i32 16843009} +; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | not grep alloca + +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-apple-darwin8" + %struct.bar = type { %struct.foo, i64, double } + %struct.foo = type { i32, i32 } + + +define i32 @test1(%struct.foo* %P) { +entry: + %L = alloca %struct.foo, align 8 ; <%struct.foo*> [#uses=2] + %L2 = bitcast %struct.foo* %L to i8* ; <i8*> [#uses=1] + %tmp13 = bitcast %struct.foo* %P to i8* ; <i8*> [#uses=1] + call void @llvm.memcpy.i32( i8* %L2, i8* %tmp13, i32 8, i32 4 ) + %tmp4 = getelementptr %struct.foo* %L, i32 0, i32 0 ; <i32*> [#uses=1] + %tmp5 = load i32* %tmp4 ; <i32> [#uses=1] + ret i32 %tmp5 +} + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) + +define i32 @test2() { +entry: + %L = alloca [4 x %struct.foo], align 16 ; <[4 x %struct.foo]*> [#uses=2] + %L12 = bitcast [4 x %struct.foo]* %L to i8* ; <i8*> [#uses=1] + call void @llvm.memset.i32( i8* %L12, i8 0, i32 32, i32 16 ) + %tmp4 = getelementptr [4 x %struct.foo]* %L, i32 0, i32 0, i32 0 ; <i32*> [#uses=1] + %tmp5 = load i32* %tmp4 ; <i32> [#uses=1] + ret i32 %tmp5 +} + +declare void @llvm.memset.i32(i8*, i8, i32, i32) + +define i32 @test3() { +entry: + %B = alloca %struct.bar, align 16 ; <%struct.bar*> [#uses=4] + %B1 = bitcast %struct.bar* %B to i8* ; <i8*> [#uses=1] + call void @llvm.memset.i32( i8* %B1, i8 1, i32 24, i32 16 ) + %tmp3 = getelementptr %struct.bar* %B, i32 0, i32 0, i32 0 ; <i32*> [#uses=1] + store i32 1, i32* %tmp3 + %tmp4 = getelementptr %struct.bar* %B, i32 0, i32 2 ; <double*> [#uses=1] + store double 1.000000e+01, double* %tmp4 + %tmp6 = getelementptr %struct.bar* %B, i32 0, i32 0, i32 1 ; <i32*> [#uses=1] + %tmp7 = load i32* %tmp6 ; <i32> [#uses=1] + ret i32 %tmp7 +} diff --git a/test/Transforms/ScalarRepl/phinodepromote.ll b/test/Transforms/ScalarRepl/phinodepromote.ll new file mode 100644 index 0000000..4dc7023 --- /dev/null +++ b/test/Transforms/ScalarRepl/phinodepromote.ll @@ -0,0 +1,37 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -instcombine -mem2reg | llvm-dis | not grep alloca +; +; This tests to see if mem2reg can promote alloca instructions whose addresses +; are used by PHI nodes that are immediately loaded. The LLVM C++ front-end +; often generates code that looks like this (when it codegen's ?: exprs as +; lvalues), so handling this simple extension is quite useful. +; +; This testcase is what the following program looks like when it reaches +; instcombine: +; +; template<typename T> +; const T& max(const T& a1, const T& a2) { return a1 < a2 ? a1 : a2; } +; int main() { return max(0, 1); } +; +; This test checks to make sure the combination of instcombine and mem2reg +; perform the transformation. + +int %main() { +entry: + %mem_tmp.0 = alloca int + %mem_tmp.1 = alloca int + store int 0, int* %mem_tmp.0 + store int 1, int* %mem_tmp.1 + %tmp.1.i = load int* %mem_tmp.1 + %tmp.3.i = load int* %mem_tmp.0 + %tmp.4.i = setle int %tmp.1.i, %tmp.3.i + br bool %tmp.4.i, label %cond_true.i, label %cond_continue.i + +cond_true.i: + br label %cond_continue.i + +cond_continue.i: + %mem_tmp.i.0 = phi int* [ %mem_tmp.1, %cond_true.i ], [ %mem_tmp.0, %entry ] + %tmp.3 = load int* %mem_tmp.i.0 + ret int %tmp.3 +} + diff --git a/test/Transforms/ScalarRepl/select_promote.ll b/test/Transforms/ScalarRepl/select_promote.ll new file mode 100644 index 0000000..a7a325c --- /dev/null +++ b/test/Transforms/ScalarRepl/select_promote.ll @@ -0,0 +1,18 @@ +; Test promotion of loads that use the result of a select instruction. This +; should be simplified by the instcombine pass. + +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -mem2reg | llvm-dis | not grep alloca + +int %main() { + %mem_tmp.0 = alloca int ; <int*> [#uses=3] + %mem_tmp.1 = alloca int ; <int*> [#uses=3] + store int 0, int* %mem_tmp.0 + store int 1, int* %mem_tmp.1 + %tmp.1.i = load int* %mem_tmp.1 ; <int> [#uses=1] + %tmp.3.i = load int* %mem_tmp.0 ; <int> [#uses=1] + %tmp.4.i = setle int %tmp.1.i, %tmp.3.i ; <bool> [#uses=1] + %mem_tmp.i.0 = select bool %tmp.4.i, int* %mem_tmp.1, int* %mem_tmp.0 ; <int*> [#uses=1] + %tmp.3 = load int* %mem_tmp.i.0 ; <int> [#uses=1] + ret int %tmp.3 +} + diff --git a/test/Transforms/ScalarRepl/sroa_two.ll b/test/Transforms/ScalarRepl/sroa_two.ll new file mode 100644 index 0000000..fa04492 --- /dev/null +++ b/test/Transforms/ScalarRepl/sroa_two.ll @@ -0,0 +1,16 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis + +implementation + +int %test(int %X) { + %Arr = alloca [2 x int] + %tmp.0 = getelementptr [2 x int]* %Arr, int 0, int 0 + store int 1, int* %tmp.0 + %tmp.1 = getelementptr [2 x int]* %Arr, int 0, int 1 + store int 2, int* %tmp.1 + + ;; This should turn into a select instruction. + %tmp.3 = getelementptr [2 x int]* %Arr, int 0, int %X + %tmp.4 = load int* %tmp.3 + ret int %tmp.4 +} diff --git a/test/Transforms/ScalarRepl/union-fp-int.ll b/test/Transforms/ScalarRepl/union-fp-int.ll new file mode 100644 index 0000000..c8eaeea --- /dev/null +++ b/test/Transforms/ScalarRepl/union-fp-int.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: grep {bitcast.*float.*i32} + +implementation + +int %test(float %X) { + %X_addr = alloca float + store float %X, float* %X_addr + %X_addr = bitcast float* %X_addr to int* + %tmp = load int* %X_addr + ret int %tmp +} diff --git a/test/Transforms/ScalarRepl/union-packed.ll b/test/Transforms/ScalarRepl/union-packed.ll new file mode 100644 index 0000000..0985f0c --- /dev/null +++ b/test/Transforms/ScalarRepl/union-packed.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: grep bitcast + +target endian = little + +<4 x int> %test(<4 x float> %X) { + %X_addr = alloca <4 x float> + store <4 x float> %X, <4 x float>* %X_addr + %X_addr = bitcast <4 x float>* %X_addr to <4 x int>* + %tmp = load <4 x int>* %X_addr + ret <4 x int> %tmp +} diff --git a/test/Transforms/ScalarRepl/union-pointer.ll b/test/Transforms/ScalarRepl/union-pointer.ll new file mode 100644 index 0000000..a9666d2 --- /dev/null +++ b/test/Transforms/ScalarRepl/union-pointer.ll @@ -0,0 +1,46 @@ +; PR892 +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | grep {ret i8} + +target endian = little +target pointersize = 32 +target triple = "i686-apple-darwin8.7.2" + +%struct.Val = type { int*, int } + +implementation ; Functions: + +sbyte* %test(short* %X) { + %X_addr = alloca short* + store short* %X, short** %X_addr + %X_addr = cast short** %X_addr to sbyte** + %tmp = load sbyte** %X_addr + ret sbyte* %tmp +} + +void %test2(long %Op.0) { + %tmp = alloca %struct.Val, align 8 + %tmp1 = alloca %struct.Val, align 8 + %tmp = call ulong %_Z3foov( ) + %tmp1 = cast %struct.Val* %tmp1 to ulong* + store ulong %tmp, ulong* %tmp1 + %tmp = getelementptr %struct.Val* %tmp, int 0, uint 0 + %tmp2 = getelementptr %struct.Val* %tmp1, int 0, uint 0 + %tmp = load int** %tmp2 + store int* %tmp, int** %tmp + %tmp3 = getelementptr %struct.Val* %tmp, int 0, uint 1 + %tmp4 = getelementptr %struct.Val* %tmp1, int 0, uint 1 + %tmp = load int* %tmp4 + store int %tmp, int* %tmp3 + %tmp7 = cast %struct.Val* %tmp to { long }* + %tmp8 = getelementptr { long }* %tmp7, int 0, uint 0 + %tmp9 = load long* %tmp8 + call void %_Z3bar3ValS_( long %Op.0, long %tmp9 ) + ret void +} + +declare ulong %_Z3foov() + +declare void %_Z3bar3ValS_(long, long) + diff --git a/test/Transforms/ScalarRepl/vector_promote.ll b/test/Transforms/ScalarRepl/vector_promote.ll new file mode 100644 index 0000000..73e2c64 --- /dev/null +++ b/test/Transforms/ScalarRepl/vector_promote.ll @@ -0,0 +1,55 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -scalarrepl | llvm-dis | \ +; RUN: not grep alloca + +void %test(<4 x float>* %F, float %f) { +entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=3] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %G = getelementptr <4 x float>* %G, int 0, int 0 ; <float*> [#uses=1] + store float %f, float* %G + %tmp4 = load <4 x float>* %G ; <<4 x float>> [#uses=2] + %tmp6 = add <4 x float> %tmp4, %tmp4 ; <<4 x float>> [#uses=1] + store <4 x float> %tmp6, <4 x float>* %F + ret void +} + +void %test2(<4 x float>* %F, float %f) { +entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=3] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %tmp = getelementptr <4 x float>* %G, int 0, int 2 ; <float*> [#uses=1] + store float %f, float* %tmp + %tmp4 = load <4 x float>* %G ; <<4 x float>> [#uses=2] + %tmp6 = add <4 x float> %tmp4, %tmp4 ; <<4 x float>> [#uses=1] + store <4 x float> %tmp6, <4 x float>* %F + ret void +} + +void %test3(<4 x float>* %F, float* %f) { +entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=2] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %tmp = getelementptr <4 x float>* %G, int 0, int 2 ; <float*> [#uses=1] + %tmp = load float* %tmp ; <float> [#uses=1] + store float %tmp, float* %f + ret void +} + +void %test4(<4 x float>* %F, float* %f) { +entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=2] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %G = getelementptr <4 x float>* %G, int 0, int 0 ; <float*> [#uses=1] + %tmp = load float* %G ; <float> [#uses=1] + store float %tmp, float* %f + ret void +} + diff --git a/test/Transforms/SimplifyCFG/2002-05-05-EmptyBlockMerge.ll b/test/Transforms/SimplifyCFG/2002-05-05-EmptyBlockMerge.ll new file mode 100644 index 0000000..7f0a57c --- /dev/null +++ b/test/Transforms/SimplifyCFG/2002-05-05-EmptyBlockMerge.ll @@ -0,0 +1,24 @@ +; Basic block #2 should not be merged into BB #3! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: grep {br label} +; +declare void %foo() +implementation + +void "cprop_test12"(int* %data) { +bb0: + %reg108 = load int* %data + %cond218 = setne int %reg108, 5 + br bool %cond218, label %bb3, label %bb2 + +bb2: + call void %foo() + br label %bb3 + +bb3: + %reg117 = phi int [ 110, %bb2 ], [ %reg108, %bb0 ] + store int %reg117, int* %data + ret void +} + diff --git a/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll b/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll new file mode 100644 index 0000000..1ef6593 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll @@ -0,0 +1,19 @@ +; CFG Simplification is making a loop dead, then changing the add into: +; +; %V1 = add int %V1, 1 +; +; Which is not valid SSA +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis + +void "test"() { + br bool true, label %end, label %Loop + +Loop: + %V = phi int [0, %0], [%V1, %Loop] + %V1 = add int %V, 1 + + br label %Loop +end: + ret void +} diff --git a/test/Transforms/SimplifyCFG/2002-06-24-PHINode.ll b/test/Transforms/SimplifyCFG/2002-06-24-PHINode.ll new file mode 100644 index 0000000..a669a3f --- /dev/null +++ b/test/Transforms/SimplifyCFG/2002-06-24-PHINode.ll @@ -0,0 +1,14 @@ +; -simplifycfg is not folding blocks if there is a PHI node involved. This +; should be fixed eventually + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + +int %main(int %argc) { + br label %InlinedFunctionReturnNode + +InlinedFunctionReturnNode: ;[#uses=1] + %X = phi int [ 7, %0 ] ; <int> [#uses=1] + %Y = add int %X, %argc ; <int> [#uses=1] + ret int %Y +} + diff --git a/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll b/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll new file mode 100644 index 0000000..f1674b7 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg + +int %test(int %A, int %B, bool %cond) { +J: + %C = add int %A, 12 + br bool %cond, label %L, label %L +L: + %Q = phi int [%C, %J], [%C, %J] ; PHI node is obviously redundant + %D = add int %C, %B + %E = add int %Q, %D + ret int %E +} diff --git a/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll b/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll new file mode 100644 index 0000000..312e514 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +implementation ; Functions: + +void %test(int* %ldo, bool %c, bool %d) { +bb9: + br bool %c, label %bb11, label %bb10 + +bb10: ; preds = %bb9 + br label %bb11 + +bb11: ; preds = %bb10, %bb9 + %reg330 = phi int* [ null, %bb10 ], [ %ldo, %bb9 ] + br label %bb20 + +bb20: ; preds = %bb23, %bb25, %bb27, %bb11 + store int* %reg330, int** null + br bool %d, label %bb20, label %done + +done: + ret void +} diff --git a/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll b/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll new file mode 100644 index 0000000..811fe50 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll @@ -0,0 +1,11 @@ +; Do not remove the invoke! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +int %test() { + %A = invoke int %test() to label %Ret except label %Ret2 +Ret: + ret int %A +Ret2: + ret int undef +} diff --git a/test/Transforms/SimplifyCFG/2003-08-05-MishandleInvoke.ll b/test/Transforms/SimplifyCFG/2003-08-05-MishandleInvoke.ll new file mode 100644 index 0000000..ff549ad --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-08-05-MishandleInvoke.ll @@ -0,0 +1,10 @@ +; Do not remove the invoke! +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | grep invoke + +int %test() { + invoke int %test() to label %Ret except label %Ret +Ret: + %A = add int 0, 1 + ret int %A +} diff --git a/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll b/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll new file mode 100644 index 0000000..fcefac1 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll @@ -0,0 +1,21 @@ +; This test checks to make sure that 'br X, Dest, Dest' is folded into +; 'br Dest' + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {br bool %c2} + +declare void %noop() + +int %test(bool %c1, bool %c2) { + call void %noop() + br bool %c1, label %A, label %Y +A: + call void %noop() + br bool %c2, label %X, label %X ; Can be converted to unconditional br +X: + call void %noop() + ret int 0 +Y: + call void %noop() + br label %X +} diff --git a/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll b/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll new file mode 100644 index 0000000..08ff290 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll @@ -0,0 +1,25 @@ +; This test checks to make sure that 'br X, Dest, Dest' is folded into +; 'br Dest'. This can only happen after the 'Z' block is eliminated. This is +; due to the fact that the SimplifyCFG function does not use +; the ConstantFoldTerminator function. + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {br bool %c2} + +declare void %noop() + +int %test(bool %c1, bool %c2) { + call void %noop() + br bool %c1, label %A, label %Y +A: + call void %noop() + br bool %c2, label %Z, label %X ; Can be converted to unconditional br +Z: + br label %X +X: + call void %noop() + ret int 0 +Y: + call void %noop() + br label %X +} diff --git a/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll b/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll new file mode 100644 index 0000000..ac9ba18 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll @@ -0,0 +1,61 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep switch + +int %test1() { ; Test normal folding + switch uint 5, label %Default [ + uint 0, label %Foo + uint 1, label %Bar + uint 2, label %Baz + uint 5, label %TheDest + ] +Default:ret int -1 +Foo: ret int -2 +Bar: ret int -3 +Baz: ret int -4 +TheDest:ret int 1234 +} + +int %test2() { ; Test folding to default dest + switch uint 3, label %Default [ + uint 0, label %Foo + uint 1, label %Bar + uint 2, label %Baz + uint 5, label %TheDest + ] +Default:ret int 1234 +Foo: ret int -2 +Bar: ret int -5 +Baz: ret int -6 +TheDest:ret int -8 +} + +int %test3(bool %C) { ; Test folding all to same dest + br bool %C, label %Start, label %TheDest +Start: + switch uint 3, label %TheDest [ + uint 0, label %TheDest + uint 1, label %TheDest + uint 2, label %TheDest + uint 5, label %TheDest + ] +TheDest: ret int 1234 +} + +int %test4(uint %C) { ; Test folding switch -> branch + switch uint %C, label %L1 [ + uint 0, label %L2 + ] +L1: ret int 0 +L2: ret int 1 +} + +int %test5(uint %C) { + switch uint %C, label %L1 [ ; Can fold into a cond branch! + uint 0, label %L2 + uint 123, label %L1 + ] +L1: ret int 0 +L2: ret int 1 +} + + diff --git a/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll b/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll new file mode 100644 index 0000000..44c89d6 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll @@ -0,0 +1,59 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +implementation ; Functions: + +void %symhash_add() { +entry: + br bool undef, label %then.0, label %UnifiedReturnBlock + +then.0: ; preds = %entry + br bool undef, label %loopentry.2, label %loopentry.1.preheader + +loopentry.1.preheader: ; preds = %then.0 + br label %loopentry.1.outer + +loopentry.1.outer: ; preds = %loopentry.1.preheader, %loopexit.1 + br label %loopentry.1 + +loopentry.1: ; preds = %loopentry.1.outer, %then.1, %then.3, %then.4, %endif.1 + br bool undef, label %loopexit.1, label %no_exit.1 + +no_exit.1: ; preds = %loopentry.1 + br bool undef, label %then.1, label %else.0 + +then.1: ; preds = %no_exit.1 + br label %loopentry.1 + +else.0: ; preds = %no_exit.1 + br bool undef, label %then.2, label %else.1 + +then.2: ; preds = %else.0 + br bool undef, label %then.3, label %endif.1 + +then.3: ; preds = %then.2 + br label %loopentry.1 + +else.1: ; preds = %else.0 + br bool undef, label %endif.1, label %then.4 + +then.4: ; preds = %else.1 + br label %loopentry.1 + +endif.1: ; preds = %then.2, %else.1 + br label %loopentry.1 + +loopexit.1: ; preds = %loopentry.1 + br bool undef, label %loopentry.1.outer, label %loopentry.2 + +loopentry.2: ; preds = %then.0, %loopexit.1, %no_exit.2 + br bool undef, label %loopexit.2, label %no_exit.2 + +no_exit.2: ; preds = %loopentry.2 + br label %loopentry.2 + +loopexit.2: ; preds = %loopentry.2 + ret void + +UnifiedReturnBlock: ; preds = %entry + ret void +} diff --git a/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll b/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll new file mode 100644 index 0000000..6c53029 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll @@ -0,0 +1,125 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output +; PR584 + +%g_38098584 = external global uint ; <uint*> [#uses=1] +%g_60187400 = external global uint ; <uint*> [#uses=1] +%g_59182229 = external global uint ; <uint*> [#uses=2] + +implementation ; Functions: + +int %_Z13func_26556482h(ubyte %l_88173906) { +entry: + %tmp.1 = cast ubyte %l_88173906 to sbyte ; <sbyte> [#uses=2] + %tmp.3 = seteq ubyte %l_88173906, 0 ; <bool> [#uses=1] + br bool %tmp.3, label %else.0, label %then.0 + +then.0: ; preds = %entry + %tmp.5 = seteq ubyte %l_88173906, 0 ; <bool> [#uses=1] + br bool %tmp.5, label %else.1, label %then.1 + +then.1: ; preds = %then.0 + br label %return + +else.1: ; preds = %then.0 + br label %loopentry.0 + +loopentry.0: ; preds = %no_exit.0, %else.1 + %i.0.1 = phi int [ 0, %else.1 ], [ %inc.0, %no_exit.0 ] ; <int> [#uses=2] + %tmp.9 = setgt int %i.0.1, 99 ; <bool> [#uses=1] + br bool %tmp.9, label %endif.0, label %no_exit.0 + +no_exit.0: ; preds = %loopentry.0 + %inc.0 = add int %i.0.1, 1 ; <int> [#uses=1] + br label %loopentry.0 + +else.0: ; preds = %entry + %tmp.12 = cast sbyte %tmp.1 to int ; <int> [#uses=1] + br label %return + +endif.0: ; preds = %loopentry.0 + %tmp.14 = cast sbyte %tmp.1 to int ; <int> [#uses=1] + %tmp.16 = cast ubyte %l_88173906 to int ; <int> [#uses=1] + %tmp.17 = setgt int %tmp.14, %tmp.16 ; <bool> [#uses=1] + %tmp.19 = load uint* %g_59182229 ; <uint> [#uses=2] + br bool %tmp.17, label %cond_true, label %cond_false + +cond_true: ; preds = %endif.0 + %tmp.20 = setne uint %tmp.19, 1 ; <bool> [#uses=1] + br label %cond_continue + +cond_false: ; preds = %endif.0 + %tmp.22 = setne uint %tmp.19, 0 ; <bool> [#uses=1] + br label %cond_continue + +cond_continue: ; preds = %cond_false, %cond_true + %mem_tmp.0 = phi bool [ %tmp.20, %cond_true ], [ %tmp.22, %cond_false ] ; <bool> [#uses=1] + br bool %mem_tmp.0, label %then.2, label %else.2 + +then.2: ; preds = %cond_continue + %tmp.25 = cast ubyte %l_88173906 to int ; <int> [#uses=1] + br label %return + +else.2: ; preds = %cond_continue + br label %loopentry.1 + +loopentry.1: ; preds = %endif.3, %else.2 + %i.1.1 = phi int [ 0, %else.2 ], [ %inc.3, %endif.3 ] ; <int> [#uses=2] + %i.3.2 = phi int [ undef, %else.2 ], [ %i.3.0, %endif.3 ] ; <int> [#uses=2] + %l_88173906_addr.1 = phi ubyte [ %l_88173906, %else.2 ], [ %l_88173906_addr.0, %endif.3 ] ; <ubyte> [#uses=3] + %tmp.29 = setgt int %i.1.1, 99 ; <bool> [#uses=1] + br bool %tmp.29, label %endif.2, label %no_exit.1 + +no_exit.1: ; preds = %loopentry.1 + %tmp.30 = load uint* %g_38098584 ; <uint> [#uses=1] + %tmp.31 = seteq uint %tmp.30, 0 ; <bool> [#uses=1] + br bool %tmp.31, label %else.3, label %then.3 + +then.3: ; preds = %no_exit.1 + br label %endif.3 + +else.3: ; preds = %no_exit.1 + br bool false, label %else.4, label %then.4 + +then.4: ; preds = %else.3 + br label %endif.3 + +else.4: ; preds = %else.3 + br bool false, label %else.5, label %then.5 + +then.5: ; preds = %else.4 + store uint 3290648471, uint* %g_59182229 + br label %return + +else.5: ; preds = %else.4 + br label %loopentry.3 + +loopentry.3: ; preds = %then.7, %else.5 + %i.3.3 = phi int [ 0, %else.5 ], [ %inc.2, %then.7 ] ; <int> [#uses=3] + %tmp.55 = setgt int %i.3.3, 99 ; <bool> [#uses=1] + br bool %tmp.55, label %endif.3, label %no_exit.3 + +no_exit.3: ; preds = %loopentry.3 + %tmp.57 = seteq ubyte %l_88173906_addr.1, 0 ; <bool> [#uses=1] + br bool %tmp.57, label %else.7, label %then.7 + +then.7: ; preds = %no_exit.3 + store uint 16239, uint* %g_60187400 + %inc.2 = add int %i.3.3, 1 ; <int> [#uses=1] + br label %loopentry.3 + +else.7: ; preds = %no_exit.3 + br label %return + +endif.3: ; preds = %loopentry.3, %then.4, %then.3 + %i.3.0 = phi int [ %i.3.2, %then.3 ], [ %i.3.2, %then.4 ], [ %i.3.3, %loopentry.3 ] ; <int> [#uses=1] + %l_88173906_addr.0 = phi ubyte [ 100, %then.3 ], [ %l_88173906_addr.1, %then.4 ], [ %l_88173906_addr.1, %loopentry.3 ] ; <ubyte> [#uses=1] + %inc.3 = add int %i.1.1, 1 ; <int> [#uses=1] + br label %loopentry.1 + +endif.2: ; preds = %loopentry.1 + br label %return + +return: ; preds = %endif.2, %else.7, %then.5, %then.2, %else.0, %then.1 + %result.0 = phi int [ 1624650671, %then.1 ], [ %tmp.25, %then.2 ], [ 3379, %then.5 ], [ 52410, %else.7 ], [ -1526438411, %endif.2 ], [ %tmp.12, %else.0 ] ; <int> [#uses=1] + ret int %result.0 +} diff --git a/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll b/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll new file mode 100644 index 0000000..9271ac2 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll @@ -0,0 +1,96 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +void %main() { +entry: + %tmp.14.i19 = seteq int 0, 2 ; <bool> [#uses=1] + br bool %tmp.14.i19, label %endif.1.i20, label %read_min.exit + +endif.1.i20: ; preds = %entry + %tmp.9.i.i = seteq sbyte* null, null ; <bool> [#uses=1] + br bool %tmp.9.i.i, label %then.i12.i, label %then.i.i + +then.i.i: ; preds = %endif.1.i20 + ret void + +then.i12.i: ; preds = %endif.1.i20 + %tmp.9.i4.i = seteq sbyte* null, null ; <bool> [#uses=1] + br bool %tmp.9.i4.i, label %endif.2.i33, label %then.i5.i + +then.i5.i: ; preds = %then.i12.i + ret void + +endif.2.i33: ; preds = %then.i12.i + br bool false, label %loopexit.0.i40, label %no_exit.0.i35 + +no_exit.0.i35: ; preds = %no_exit.0.i35, %endif.2.i33 + %tmp.130.i = setlt int 0, 0 ; <bool> [#uses=1] + br bool %tmp.130.i, label %loopexit.0.i40.loopexit, label %no_exit.0.i35 + +loopexit.0.i40.loopexit: ; preds = %no_exit.0.i35 + br label %loopexit.0.i40 + +loopexit.0.i40: ; preds = %loopexit.0.i40.loopexit, %endif.2.i33 + %tmp.341.i = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp.341.i, label %loopentry.1.i, label %read_min.exit + +loopentry.1.i: ; preds = %loopexit.0.i40 + %tmp.347.i = setgt int 0, 0 ; <bool> [#uses=1] + br bool %tmp.347.i, label %no_exit.1.i41, label %loopexit.2.i44 + +no_exit.1.i41: ; preds = %endif.5.i, %loopentry.1.i + %indvar.i42 = phi uint [ %indvar.next.i, %endif.5.i ], [ 0, %loopentry.1.i ] ; <uint> [#uses=1] + %tmp.355.i = seteq int 0, 3 ; <bool> [#uses=1] + br bool %tmp.355.i, label %endif.5.i, label %read_min.exit + +endif.5.i: ; preds = %no_exit.1.i41 + %tmp.34773.i = setgt int 0, 0 ; <bool> [#uses=1] + %indvar.next.i = add uint %indvar.i42, 1 ; <uint> [#uses=1] + br bool %tmp.34773.i, label %no_exit.1.i41, label %loopexit.1.i.loopexit + +loopexit.1.i.loopexit: ; preds = %endif.5.i + ret void + +loopexit.2.i44: ; preds = %loopentry.1.i + ret void + +read_min.exit: ; preds = %no_exit.1.i41, %loopexit.0.i40, %entry + %tmp.23 = seteq int 0, 0 ; <bool> [#uses=1] + br bool %tmp.23, label %endif.1, label %then.1 + +then.1: ; preds = %read_min.exit + br bool false, label %endif.0.i, label %then.0.i + +then.0.i: ; preds = %then.1 + br bool false, label %endif.1.i, label %then.1.i + +endif.0.i: ; preds = %then.1 + br bool false, label %endif.1.i, label %then.1.i + +then.1.i: ; preds = %endif.0.i, %then.0.i + br bool false, label %getfree.exit, label %then.2.i + +endif.1.i: ; preds = %endif.0.i, %then.0.i + br bool false, label %getfree.exit, label %then.2.i + +then.2.i: ; preds = %endif.1.i, %then.1.i + ret void + +getfree.exit: ; preds = %endif.1.i, %then.1.i + ret void + +endif.1: ; preds = %read_min.exit + %tmp.27.i = getelementptr int* null, int 0 + br bool false, label %loopexit.0.i15, label %no_exit.0.i14 + +no_exit.0.i14: ; preds = %endif.1 + ret void + +loopexit.0.i15: ; preds = %endif.1 + br bool false, label %primal_start_artificial.exit, label %no_exit.1.i16 + +no_exit.1.i16: ; preds = %no_exit.1.i16, %loopexit.0.i15 + br bool false, label %primal_start_artificial.exit, label %no_exit.1.i16 + +primal_start_artificial.exit: ; preds = %no_exit.1.i16, %loopexit.0.i15 + ret void +} diff --git a/test/Transforms/SimplifyCFG/2005-08-03-PHIFactorCrash.ll b/test/Transforms/SimplifyCFG/2005-08-03-PHIFactorCrash.ll new file mode 100644 index 0000000..4ac692e --- /dev/null +++ b/test/Transforms/SimplifyCFG/2005-08-03-PHIFactorCrash.ll @@ -0,0 +1,95 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output +; END. + + %arraytype.1.Char = type { int, [0 x sbyte] } + %arraytype.4.Signed = type { int, [0 x int] } + %functiontype.23 = type %structtype.Task* (%structtype.Task*, %structtype.Packet*, %structtype.FailedRun*) + %functiontype.27 = type %structtype.object* () + %functiontype.28 = type bool (%structtype.object*, %structtype.object_vtable*) + %functiontype.39 = type int (%structtype.listiter*) + %opaquetype.RuntimeTypeInfo = type sbyte* (sbyte*) + %structtype.AssertionError_vtable = type { %structtype.FailedRun_vtable } + %structtype.DeviceTask = type { %structtype.Task } + %structtype.FailedRun = type { %structtype.object } + %structtype.FailedRun_vtable = type { %structtype.object_vtable } + %structtype.Packet = type { %structtype.object, %structtype.list.1*, int, int, int, %structtype.Packet* } + %structtype.Task = type { %structtype.TaskState, %structtype.FailedRun*, int, %structtype.Packet*, %structtype.Task*, int } + %structtype.TaskState = type { %structtype.object, bool, bool, bool } + %structtype.list.1 = type { %arraytype.4.Signed* } + %structtype.listiter = type { %structtype.list.1*, int } + %structtype.object = type { %structtype.object_vtable* } + %structtype.object_vtable = type { %structtype.object_vtable*, %opaquetype.RuntimeTypeInfo*, %arraytype.1.Char*, %functiontype.27* } +%structinstance.59 = external global %structtype.AssertionError_vtable ; <%structtype.AssertionError_vtable*> [#uses=0] + +implementation ; Functions: + +declare fastcc bool %ll_isinstance__objectPtr_object_vtablePtr() + +declare fastcc void %ll_listnext__listiterPtr() + +fastcc void %WorkTask.fn() { +block0: + br label %block1 + +block1: ; preds = %block0 + %v2542 = call fastcc bool %ll_isinstance__objectPtr_object_vtablePtr( ) ; <bool> [#uses=1] + br bool %v2542, label %block4, label %block2 + +block2: ; preds = %block1 + br label %block3 + +block3: ; preds = %block2 + unwind + +block4: ; preds = %block1 + br label %block5 + +block5: ; preds = %block4 + %v2565 = seteq %structtype.Packet* null, null ; <bool> [#uses=1] + br bool %v2565, label %block15, label %block6 + +block6: ; preds = %block5 + %self_2575 = phi %structtype.DeviceTask* [ null, %block5 ] ; <%structtype.DeviceTask*> [#uses=1] + br bool false, label %block14, label %block7 + +block7: ; preds = %block14, %block6 + %self_2635 = phi %structtype.DeviceTask* [ %self_2575, %block6 ], [ null, %block14 ] ; <%structtype.DeviceTask*> [#uses=1] + %tmp.124 = getelementptr %structtype.Packet* null, int 0, uint 2 ; <int*> [#uses=0] + br label %block8 + +block8: ; preds = %block10, %block7 + %self_2672 = phi %structtype.DeviceTask* [ %self_2635, %block7 ], [ null, %block10 ] ; <%structtype.DeviceTask*> [#uses=0] + invoke fastcc void %ll_listnext__listiterPtr( ) + to label %block9 unwind label %block8_exception_handling + +block8_exception_handling: ; preds = %block8 + br bool false, label %block8_exception_found_branchto_block12, label %block8_not_exception_structinstance.10 + +block8_not_exception_structinstance.10: ; preds = %block8_exception_handling + unwind + +block8_exception_found_branchto_block12: ; preds = %block8_exception_handling + br label %block12 + +block9: ; preds = %block8 + br bool false, label %block11, label %block10 + +block10: ; preds = %block11, %block9 + br label %block8 + +block11: ; preds = %block9 + br label %block10 + +block12: ; preds = %block8_exception_found_branchto_block12 + br label %block13 + +block13: ; preds = %block15, %block12 + ret void + +block14: ; preds = %block6 + br label %block7 + +block15: ; preds = %block5 + %v2586 = phi %structtype.DeviceTask* [ null, %block5 ] ; <%structtype.DeviceTask*> [#uses=0] + br label %block13 +} diff --git a/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll b/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll new file mode 100644 index 0000000..c3b4194 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +bool %foo() { + %X = invoke bool %foo() to label %N unwind label %F +F: + ret bool false +N: + br bool %X, label %A, label %B +A: + ret bool true +B: + ret bool true +} diff --git a/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll b/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll new file mode 100644 index 0000000..ca69970 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll @@ -0,0 +1,140 @@ +; Make sure this doesn't turn into an infinite loop + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -constprop -simplifycfg |\ +; RUN: llvm-dis | grep bb86 +; END. + + %struct.anon = type { uint, int, int, int, [1024 x sbyte] } +%_zero_ = external global %struct.anon* ; <%struct.anon**> [#uses=2] +%_one_ = external global %struct.anon* ; <%struct.anon**> [#uses=4] +%str = internal constant [4 x sbyte] c"%d\0A\00" ; <[4 x sbyte]*> [#uses=1] + +implementation ; Functions: + + +declare int %bc_compare(%struct.anon*, %struct.anon*) + +declare void %free_num(%struct.anon**) + +declare %struct.anon* %copy_num(%struct.anon*) + +declare void %init_num(%struct.anon**) + +declare %struct.anon* %new_num(int, int) + +declare void %int2num(%struct.anon**, int) + +declare void %bc_multiply(%struct.anon*, %struct.anon*, %struct.anon**, int) + +declare void %bc_raise(%struct.anon*, %struct.anon*, %struct.anon**, int) + +declare int %bc_divide(%struct.anon*, %struct.anon*, %struct.anon**, int) + +declare void %bc_add(%struct.anon*, %struct.anon*, %struct.anon**) + +declare int %_do_compare(%struct.anon*, %struct.anon*, int, int) + +declare int %printf(sbyte*, ...) + +int %bc_sqrt(%struct.anon** %num, int %scale) { +entry: + %guess = alloca %struct.anon* ; <%struct.anon**> [#uses=15] + %guess1 = alloca %struct.anon* ; <%struct.anon**> [#uses=12] + %point5 = alloca %struct.anon* ; <%struct.anon**> [#uses=4] + %tmp = load %struct.anon** %num ; <%struct.anon*> [#uses=1] + %tmp1 = load %struct.anon** %_zero_ ; <%struct.anon*> [#uses=1] + %tmp = call int %bc_compare( %struct.anon* %tmp, %struct.anon* %tmp1 ) ; <int> [#uses=2] + %tmp = setlt int %tmp, 0 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_false + +cond_true: ; preds = %entry + ret int 0 + +cond_false: ; preds = %entry + %tmp5 = seteq int %tmp, 0 ; <bool> [#uses=1] + br bool %tmp5, label %cond_true6, label %cond_next13 + +cond_true6: ; preds = %cond_false + call void %free_num( %struct.anon** %num ) + %tmp8 = load %struct.anon** %_zero_ ; <%struct.anon*> [#uses=1] + %tmp9 = call %struct.anon* %copy_num( %struct.anon* %tmp8 ) ; <%struct.anon*> [#uses=1] + store %struct.anon* %tmp9, %struct.anon** %num + ret int 1 + +cond_next13: ; preds = %cond_false + %tmp15 = load %struct.anon** %num ; <%struct.anon*> [#uses=1] + %tmp16 = load %struct.anon** %_one_ ; <%struct.anon*> [#uses=1] + %tmp17 = call int %bc_compare( %struct.anon* %tmp15, %struct.anon* %tmp16 ) ; <int> [#uses=2] + %tmp19 = seteq int %tmp17, 0 ; <bool> [#uses=1] + br bool %tmp19, label %cond_true20, label %cond_next27 + +cond_true20: ; preds = %cond_next13 + call void %free_num( %struct.anon** %num ) + %tmp22 = load %struct.anon** %_one_ ; <%struct.anon*> [#uses=1] + %tmp23 = call %struct.anon* %copy_num( %struct.anon* %tmp22 ) ; <%struct.anon*> [#uses=1] + store %struct.anon* %tmp23, %struct.anon** %num + ret int 1 + +cond_next27: ; preds = %cond_next13 + %tmp29 = load %struct.anon** %num ; <%struct.anon*> [#uses=1] + %tmp30 = getelementptr %struct.anon* %tmp29, int 0, uint 2 ; <int*> [#uses=1] + %tmp31 = load int* %tmp30 ; <int> [#uses=2] + %tmp33 = setge int %tmp31, %scale ; <bool> [#uses=1] + %max = select bool %tmp33, int %tmp31, int %scale ; <int> [#uses=4] + %tmp35 = add int %max, 2 ; <int> [#uses=2] + call void %init_num( %struct.anon** %guess ) + call void %init_num( %struct.anon** %guess1 ) + %tmp36 = call %struct.anon* %new_num( int 1, int 1 ) ; <%struct.anon*> [#uses=2] + store %struct.anon* %tmp36, %struct.anon** %point5 + %tmp = getelementptr %struct.anon* %tmp36, int 0, uint 4, int 1 ; <sbyte*> [#uses=1] + store sbyte 5, sbyte* %tmp + %tmp39 = setlt int %tmp17, 0 ; <bool> [#uses=1] + br bool %tmp39, label %cond_true40, label %cond_false43 + +cond_true40: ; preds = %cond_next27 + %tmp41 = load %struct.anon** %_one_ ; <%struct.anon*> [#uses=1] + %tmp42 = call %struct.anon* %copy_num( %struct.anon* %tmp41 ) ; <%struct.anon*> [#uses=1] + store %struct.anon* %tmp42, %struct.anon** %guess + br label %bb80.outer + +cond_false43: ; preds = %cond_next27 + call void %int2num( %struct.anon** %guess, int 10 ) + %tmp45 = load %struct.anon** %num ; <%struct.anon*> [#uses=1] + %tmp46 = getelementptr %struct.anon* %tmp45, int 0, uint 1 ; <int*> [#uses=1] + %tmp47 = load int* %tmp46 ; <int> [#uses=1] + call void %int2num( %struct.anon** %guess1, int %tmp47 ) + %tmp48 = load %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] + %tmp49 = load %struct.anon** %point5 ; <%struct.anon*> [#uses=1] + call void %bc_multiply( %struct.anon* %tmp48, %struct.anon* %tmp49, %struct.anon** %guess1, int %max ) + %tmp51 = load %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] + %tmp52 = getelementptr %struct.anon* %tmp51, int 0, uint 2 ; <int*> [#uses=1] + store int 0, int* %tmp52 + %tmp53 = load %struct.anon** %guess ; <%struct.anon*> [#uses=1] + %tmp54 = load %struct.anon** %guess1 ; <%struct.anon*> [#uses=1] + call void %bc_raise( %struct.anon* %tmp53, %struct.anon* %tmp54, %struct.anon** %guess, int %max ) + br label %bb80.outer + +bb80.outer: ; preds = %cond_true77, %cond_next56 + %done.1.ph = phi int [ 1, %cond_true83 ], [0, %cond_true40], [0, %cond_false43] ; <int> [#uses=1] + br label %bb80 + +bb80: ; preds = %bb80.outer, %cond_true83 + %tmp82 = seteq int %done.1.ph, 0 ; <bool> [#uses=1] + br bool %tmp82, label %cond_true83, label %bb86 + +cond_true83: ; preds = %bb80 + %tmp71 = call int %_do_compare( %struct.anon* null, %struct.anon* null, int 0, int 1 ) ; <int> [#uses=2] + %tmp76 = seteq int %tmp71, 0 ; <bool> [#uses=1] + br bool %tmp76, label %bb80.outer, label %bb80 + +bb86: ; preds = %bb80 + call void %free_num( %struct.anon** %num ) + %tmp88 = load %struct.anon** %guess ; <%struct.anon*> [#uses=1] + %tmp89 = load %struct.anon** %_one_ ; <%struct.anon*> [#uses=1] + %tmp92 = call int %bc_divide( %struct.anon* %tmp88, %struct.anon* %tmp89, %struct.anon** %num, int %max ) ; <int> [#uses=0] + call void %free_num( %struct.anon** %guess ) + call void %free_num( %struct.anon** %guess1 ) + call void %free_num( %struct.anon** %point5 ) + ret int 1 +} + diff --git a/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll b/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll new file mode 100644 index 0000000..8b443da --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll @@ -0,0 +1,35 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +void %polnel_() { +entry: + %tmp595 = setlt int 0, 0 ; <bool> [#uses=4] + br bool %tmp595, label %bb148.critedge, label %cond_true40 + +bb36: ; preds = %bb43 + br bool %tmp595, label %bb43, label %cond_true40 + +cond_true40: ; preds = %bb46, %cond_true40, %bb36, %entry + %tmp397 = setgt int 0, 0 ; <bool> [#uses=1] + br bool %tmp397, label %bb43, label %cond_true40 + +bb43: ; preds = %cond_true40, %bb36 + br bool false, label %bb53, label %bb36 + +bb46: ; preds = %bb53 + br bool %tmp595, label %bb53, label %cond_true40 + +bb53: ; preds = %bb46, %bb43 + br bool false, label %bb102, label %bb46 + +bb92.preheader: ; preds = %bb102 + ret void + +bb102: ; preds = %bb53 + br bool %tmp595, label %bb148, label %bb92.preheader + +bb148.critedge: ; preds = %entry + ret void + +bb148: ; preds = %bb102 + ret void +} diff --git a/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll b/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll new file mode 100644 index 0000000..c9b1858 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll @@ -0,0 +1,613 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + +void %main(int %c) { +entry: + %tmp.9 = seteq int %c, 2 ; <bool> [#uses=1] + br bool %tmp.9, label %endif.0, label %then.0 + +then.0: ; preds = %entry + ret void + +endif.0: ; preds = %entry + br bool false, label %then.1, label %endif.1 + +then.1: ; preds = %endif.0 + ret void + +endif.1: ; preds = %endif.0 + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %endif.1 + ret void + +endif.2: ; preds = %endif.1 + br bool false, label %then.3, label %loopentry.0 + +then.3: ; preds = %endif.2 + ret void + +loopentry.0: ; preds = %endif.2 + br bool false, label %no_exit.0.preheader, label %loopexit.0 + +no_exit.0.preheader: ; preds = %loopentry.0 + br label %no_exit.0 + +no_exit.0: ; preds = %endif.4, %no_exit.0.preheader + br bool false, label %then.4, label %endif.4 + +then.4: ; preds = %no_exit.0 + ret void + +endif.4: ; preds = %no_exit.0 + br bool false, label %no_exit.0, label %loopexit.0.loopexit + +loopexit.0.loopexit: ; preds = %endif.4 + br label %loopexit.0 + +loopexit.0: ; preds = %loopexit.0.loopexit, %loopentry.0 + br bool false, label %then.5, label %loopentry.1 + +then.5: ; preds = %loopexit.0 + ret void + +loopentry.1: ; preds = %loopexit.0 + %tmp.143 = setgt int 0, 0 ; <bool> [#uses=4] + br bool %tmp.143, label %no_exit.1.preheader, label %loopexit.1 + +no_exit.1.preheader: ; preds = %loopentry.1 + br label %no_exit.1 + +no_exit.1: ; preds = %endif.6, %no_exit.1.preheader + br bool false, label %then.6, label %shortcirc_next.3 + +shortcirc_next.3: ; preds = %no_exit.1 + br bool false, label %then.6, label %shortcirc_next.4 + +shortcirc_next.4: ; preds = %shortcirc_next.3 + br bool false, label %then.6, label %endif.6 + +then.6: ; preds = %shortcirc_next.4, %shortcirc_next.3, %no_exit.1 + ret void + +endif.6: ; preds = %shortcirc_next.4 + br bool false, label %no_exit.1, label %loopexit.1.loopexit + +loopexit.1.loopexit: ; preds = %endif.6 + br label %loopexit.1 + +loopexit.1: ; preds = %loopexit.1.loopexit, %loopentry.1 + br bool false, label %then.i, label %loopentry.0.i + +then.i: ; preds = %loopexit.1 + ret void + +loopentry.0.i: ; preds = %loopexit.1 + br bool %tmp.143, label %no_exit.0.i.preheader, label %readvector.exit + +no_exit.0.i.preheader: ; preds = %loopentry.0.i + br label %no_exit.0.i + +no_exit.0.i: ; preds = %loopexit.1.i, %no_exit.0.i.preheader + br bool false, label %no_exit.1.i.preheader, label %loopexit.1.i + +no_exit.1.i.preheader: ; preds = %no_exit.0.i + br label %no_exit.1.i + +no_exit.1.i: ; preds = %loopexit.2.i, %no_exit.1.i.preheader + br bool false, label %no_exit.2.i.preheader, label %loopexit.2.i + +no_exit.2.i.preheader: ; preds = %no_exit.1.i + br label %no_exit.2.i + +no_exit.2.i: ; preds = %no_exit.2.i, %no_exit.2.i.preheader + br bool false, label %no_exit.2.i, label %loopexit.2.i.loopexit + +loopexit.2.i.loopexit: ; preds = %no_exit.2.i + br label %loopexit.2.i + +loopexit.2.i: ; preds = %loopexit.2.i.loopexit, %no_exit.1.i + br bool false, label %no_exit.1.i, label %loopexit.1.i.loopexit + +loopexit.1.i.loopexit: ; preds = %loopexit.2.i + br label %loopexit.1.i + +loopexit.1.i: ; preds = %loopexit.1.i.loopexit, %no_exit.0.i + br bool false, label %no_exit.0.i, label %readvector.exit.loopexit + +readvector.exit.loopexit: ; preds = %loopexit.1.i + br label %readvector.exit + +readvector.exit: ; preds = %readvector.exit.loopexit, %loopentry.0.i + br bool %tmp.143, label %loopentry.1.preheader.i, label %loopexit.0.i + +loopentry.1.preheader.i: ; preds = %readvector.exit + br label %loopentry.1.outer.i + +loopentry.1.outer.i: ; preds = %loopexit.1.i110, %loopentry.1.preheader.i + br label %loopentry.1.i85 + +loopentry.1.i85.loopexit: ; preds = %hamming.exit16.i + br label %loopentry.1.i85 + +loopentry.1.i85: ; preds = %loopentry.1.i85.loopexit, %loopentry.1.outer.i + br bool false, label %no_exit.1.preheader.i, label %loopexit.1.i110.loopexit1 + +no_exit.1.preheader.i: ; preds = %loopentry.1.i85 + br label %no_exit.1.i87 + +no_exit.1.i87: ; preds = %then.1.i107, %no_exit.1.preheader.i + br bool false, label %no_exit.i.i101.preheader, label %hamming.exit.i104 + +no_exit.i.i101.preheader: ; preds = %no_exit.1.i87 + br label %no_exit.i.i101 + +no_exit.i.i101: ; preds = %no_exit.i.i101, %no_exit.i.i101.preheader + br bool false, label %no_exit.i.i101, label %hamming.exit.i104.loopexit + +hamming.exit.i104.loopexit: ; preds = %no_exit.i.i101 + br label %hamming.exit.i104 + +hamming.exit.i104: ; preds = %hamming.exit.i104.loopexit, %no_exit.1.i87 + br bool false, label %no_exit.i15.i.preheader, label %hamming.exit16.i + +no_exit.i15.i.preheader: ; preds = %hamming.exit.i104 + br label %no_exit.i15.i + +no_exit.i15.i: ; preds = %no_exit.i15.i, %no_exit.i15.i.preheader + br bool false, label %no_exit.i15.i, label %hamming.exit16.i.loopexit + +hamming.exit16.i.loopexit: ; preds = %no_exit.i15.i + br label %hamming.exit16.i + +hamming.exit16.i: ; preds = %hamming.exit16.i.loopexit, %hamming.exit.i104 + br bool false, label %loopentry.1.i85.loopexit, label %then.1.i107 + +then.1.i107: ; preds = %hamming.exit16.i + br bool false, label %no_exit.1.i87, label %loopexit.1.i110.loopexit + +loopexit.1.i110.loopexit: ; preds = %then.1.i107 + br label %loopexit.1.i110 + +loopexit.1.i110.loopexit1: ; preds = %loopentry.1.i85 + br label %loopexit.1.i110 + +loopexit.1.i110: ; preds = %loopexit.1.i110.loopexit1, %loopexit.1.i110.loopexit + br bool false, label %loopentry.1.outer.i, label %loopexit.0.i.loopexit + +loopexit.0.i.loopexit: ; preds = %loopexit.1.i110 + br label %loopexit.0.i + +loopexit.0.i: ; preds = %loopexit.0.i.loopexit, %readvector.exit + br bool false, label %UnifiedReturnBlock.i113, label %then.2.i112 + +then.2.i112: ; preds = %loopexit.0.i + br label %checkham.exit + +UnifiedReturnBlock.i113: ; preds = %loopexit.0.i + br label %checkham.exit + +checkham.exit: ; preds = %UnifiedReturnBlock.i113, %then.2.i112 + br bool false, label %loopentry.1.i14.preheader, label %loopentry.3.i.preheader + +loopentry.1.i14.preheader: ; preds = %checkham.exit + br label %loopentry.1.i14 + +loopentry.1.i14: ; preds = %loopexit.1.i18, %loopentry.1.i14.preheader + br bool false, label %no_exit.1.i16.preheader, label %loopexit.1.i18 + +no_exit.1.i16.preheader: ; preds = %loopentry.1.i14 + br label %no_exit.1.i16 + +no_exit.1.i16: ; preds = %no_exit.1.i16, %no_exit.1.i16.preheader + br bool false, label %no_exit.1.i16, label %loopexit.1.i18.loopexit + +loopexit.1.i18.loopexit: ; preds = %no_exit.1.i16 + br label %loopexit.1.i18 + +loopexit.1.i18: ; preds = %loopexit.1.i18.loopexit, %loopentry.1.i14 + br bool false, label %loopentry.1.i14, label %loopentry.3.i.loopexit + +loopentry.3.i.loopexit: ; preds = %loopexit.1.i18 + br label %loopentry.3.i.preheader + +loopentry.3.i.preheader: ; preds = %loopentry.3.i.loopexit, %checkham.exit + br label %loopentry.3.i + +loopentry.3.i: ; preds = %endif.1.i, %loopentry.3.i.preheader + br bool false, label %loopentry.4.i.preheader, label %endif.1.i + +loopentry.4.i.preheader: ; preds = %loopentry.3.i + br label %loopentry.4.i + +loopentry.4.i: ; preds = %loopexit.4.i, %loopentry.4.i.preheader + br bool false, label %no_exit.4.i.preheader, label %loopexit.4.i + +no_exit.4.i.preheader: ; preds = %loopentry.4.i + br label %no_exit.4.i + +no_exit.4.i: ; preds = %no_exit.4.i.backedge, %no_exit.4.i.preheader + br bool false, label %endif.0.i, label %else.i + +else.i: ; preds = %no_exit.4.i + br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit + +no_exit.4.i.backedge: ; preds = %endif.0.i, %else.i + br label %no_exit.4.i + +endif.0.i: ; preds = %no_exit.4.i + br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit + +loopexit.4.i.loopexit: ; preds = %endif.0.i, %else.i + br label %loopexit.4.i + +loopexit.4.i: ; preds = %loopexit.4.i.loopexit, %loopentry.4.i + br bool false, label %loopentry.4.i, label %endif.1.i.loopexit + +endif.1.i.loopexit: ; preds = %loopexit.4.i + br label %endif.1.i + +endif.1.i: ; preds = %endif.1.i.loopexit, %loopentry.3.i + %exitcond = seteq uint 0, 10 ; <bool> [#uses=1] + br bool %exitcond, label %generateT.exit, label %loopentry.3.i + +generateT.exit: ; preds = %endif.1.i + br bool false, label %then.0.i, label %loopentry.1.i30.preheader + +then.0.i: ; preds = %generateT.exit + ret void + +loopentry.1.i30.loopexit: ; preds = %loopexit.3.i + br label %loopentry.1.i30.backedge + +loopentry.1.i30.preheader: ; preds = %generateT.exit + br label %loopentry.1.i30 + +loopentry.1.i30: ; preds = %loopentry.1.i30.backedge, %loopentry.1.i30.preheader + br bool %tmp.143, label %no_exit.0.i31.preheader, label %loopentry.1.i30.backedge + +loopentry.1.i30.backedge: ; preds = %loopentry.1.i30, %loopentry.1.i30.loopexit + br label %loopentry.1.i30 + +no_exit.0.i31.preheader: ; preds = %loopentry.1.i30 + br label %no_exit.0.i31 + +no_exit.0.i31: ; preds = %loopexit.3.i, %no_exit.0.i31.preheader + br bool false, label %then.1.i, label %else.0.i + +then.1.i: ; preds = %no_exit.0.i31 + br bool undef, label %then.0.i29, label %loopentry.0.i31 + +then.0.i29: ; preds = %then.1.i + unreachable + +loopentry.0.i31: ; preds = %then.1.i + br bool false, label %no_exit.0.i38.preheader, label %loopentry.1.i.preheader + +no_exit.0.i38.preheader: ; preds = %loopentry.0.i31 + br label %no_exit.0.i38 + +no_exit.0.i38: ; preds = %no_exit.0.i38, %no_exit.0.i38.preheader + br bool undef, label %no_exit.0.i38, label %loopentry.1.i.preheader.loopexit + +loopentry.1.i.preheader.loopexit: ; preds = %no_exit.0.i38 + br label %loopentry.1.i.preheader + +loopentry.1.i.preheader: ; preds = %loopentry.1.i.preheader.loopexit, %loopentry.0.i31 + br label %loopentry.1.i + +loopentry.1.i: ; preds = %endif.2.i, %loopentry.1.i.preheader + br bool undef, label %loopentry.2.i39.preheader, label %loopexit.1.i79.loopexit2 + +loopentry.2.i39.preheader: ; preds = %loopentry.1.i + br label %loopentry.2.i39 + +loopentry.2.i39: ; preds = %loopexit.5.i77, %loopentry.2.i39.preheader + br bool false, label %loopentry.3.i40.preheader, label %hamming.exit.i71 + +loopentry.3.i40.preheader: ; preds = %loopentry.2.i39 + br label %loopentry.3.i40 + +loopentry.3.i40: ; preds = %loopexit.3.i51, %loopentry.3.i40.preheader + br bool false, label %no_exit.3.preheader.i42, label %loopexit.3.i51 + +no_exit.3.preheader.i42: ; preds = %loopentry.3.i40 + br label %no_exit.3.i49 + +no_exit.3.i49: ; preds = %no_exit.3.i49, %no_exit.3.preheader.i42 + br bool undef, label %no_exit.3.i49, label %loopexit.3.i51.loopexit + +loopexit.3.i51.loopexit: ; preds = %no_exit.3.i49 + br label %loopexit.3.i51 + +loopexit.3.i51: ; preds = %loopexit.3.i51.loopexit, %loopentry.3.i40 + br bool undef, label %loopentry.3.i40, label %loopentry.4.i52 + +loopentry.4.i52: ; preds = %loopexit.3.i51 + br bool false, label %no_exit.4.i54.preheader, label %hamming.exit.i71 + +no_exit.4.i54.preheader: ; preds = %loopentry.4.i52 + br label %no_exit.4.i54 + +no_exit.4.i54: ; preds = %no_exit.4.backedge.i, %no_exit.4.i54.preheader + br bool undef, label %then.1.i55, label %endif.1.i56 + +then.1.i55: ; preds = %no_exit.4.i54 + br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 + +no_exit.4.backedge.i: ; preds = %endif.1.i56, %then.1.i55 + br label %no_exit.4.i54 + +endif.1.i56: ; preds = %no_exit.4.i54 + br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 + +loopexit.4.i57: ; preds = %endif.1.i56, %then.1.i55 + br bool false, label %no_exit.i.i69.preheader, label %hamming.exit.i71 + +no_exit.i.i69.preheader: ; preds = %loopexit.4.i57 + br label %no_exit.i.i69 + +no_exit.i.i69: ; preds = %no_exit.i.i69, %no_exit.i.i69.preheader + br bool undef, label %no_exit.i.i69, label %hamming.exit.i71.loopexit + +hamming.exit.i71.loopexit: ; preds = %no_exit.i.i69 + br label %hamming.exit.i71 + +hamming.exit.i71: ; preds = %hamming.exit.i71.loopexit, %loopexit.4.i57, %loopentry.4.i52, %loopentry.2.i39 + br bool undef, label %endif.2.i, label %loopentry.5.i72 + +loopentry.5.i72: ; preds = %hamming.exit.i71 + br bool false, label %shortcirc_next.i74.preheader, label %loopexit.5.i77 + +shortcirc_next.i74.preheader: ; preds = %loopentry.5.i72 + br label %shortcirc_next.i74 + +shortcirc_next.i74: ; preds = %no_exit.5.i76, %shortcirc_next.i74.preheader + br bool undef, label %no_exit.5.i76, label %loopexit.5.i77.loopexit + +no_exit.5.i76: ; preds = %shortcirc_next.i74 + br bool undef, label %shortcirc_next.i74, label %loopexit.5.i77.loopexit + +loopexit.5.i77.loopexit: ; preds = %no_exit.5.i76, %shortcirc_next.i74 + br label %loopexit.5.i77 + +loopexit.5.i77: ; preds = %loopexit.5.i77.loopexit, %loopentry.5.i72 + br bool undef, label %loopentry.2.i39, label %loopexit.1.i79.loopexit + +endif.2.i: ; preds = %hamming.exit.i71 + br label %loopentry.1.i + +loopexit.1.i79.loopexit: ; preds = %loopexit.5.i77 + br label %loopexit.1.i79 + +loopexit.1.i79.loopexit2: ; preds = %loopentry.1.i + br label %loopexit.1.i79 + +loopexit.1.i79: ; preds = %loopexit.1.i79.loopexit2, %loopexit.1.i79.loopexit + br bool undef, label %then.3.i, label %loopentry.6.i80 + +then.3.i: ; preds = %loopexit.1.i79 + br bool false, label %no_exit.6.i82.preheader, label %run.exit + +loopentry.6.i80: ; preds = %loopexit.1.i79 + br bool false, label %no_exit.6.i82.preheader, label %run.exit + +no_exit.6.i82.preheader: ; preds = %loopentry.6.i80, %then.3.i + br label %no_exit.6.i82 + +no_exit.6.i82: ; preds = %no_exit.6.i82, %no_exit.6.i82.preheader + br bool undef, label %no_exit.6.i82, label %run.exit.loopexit + +run.exit.loopexit: ; preds = %no_exit.6.i82 + br label %run.exit + +run.exit: ; preds = %run.exit.loopexit, %loopentry.6.i80, %then.3.i + br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 + +else.0.i: ; preds = %no_exit.0.i31 + br bool false, label %then.0.i4, label %loopentry.0.i6 + +then.0.i4: ; preds = %else.0.i + unreachable + +loopentry.0.i6: ; preds = %else.0.i + br bool false, label %no_exit.0.i8.preheader, label %loopentry.2.i.preheader + +no_exit.0.i8.preheader: ; preds = %loopentry.0.i6 + br label %no_exit.0.i8 + +no_exit.0.i8: ; preds = %no_exit.0.i8, %no_exit.0.i8.preheader + br bool false, label %no_exit.0.i8, label %loopentry.2.i.preheader.loopexit + +loopentry.2.i.preheader.loopexit: ; preds = %no_exit.0.i8 + br label %loopentry.2.i.preheader + +loopentry.2.i.preheader: ; preds = %loopentry.2.i.preheader.loopexit, %loopentry.0.i6 + br label %loopentry.2.i + +loopentry.2.i: ; preds = %endif.3.i19, %loopentry.2.i.preheader + br bool false, label %loopentry.3.i10.preheader, label %loopentry.4.i15 + +loopentry.3.i10.preheader: ; preds = %loopentry.2.i + br label %loopentry.3.i10 + +loopentry.3.i10: ; preds = %loopexit.3.i14, %loopentry.3.i10.preheader + br bool false, label %no_exit.3.preheader.i, label %loopexit.3.i14 + +no_exit.3.preheader.i: ; preds = %loopentry.3.i10 + br label %no_exit.3.i12 + +no_exit.3.i12: ; preds = %no_exit.3.i12, %no_exit.3.preheader.i + br bool false, label %no_exit.3.i12, label %loopexit.3.i14.loopexit + +loopexit.3.i14.loopexit: ; preds = %no_exit.3.i12 + br label %loopexit.3.i14 + +loopexit.3.i14: ; preds = %loopexit.3.i14.loopexit, %loopentry.3.i10 + br bool false, label %loopentry.3.i10, label %loopentry.4.i15.loopexit + +loopentry.4.i15.loopexit: ; preds = %loopexit.3.i14 + br label %loopentry.4.i15 + +loopentry.4.i15: ; preds = %loopentry.4.i15.loopexit, %loopentry.2.i + br bool false, label %loopentry.5.outer.i.preheader, label %loopentry.7.i + +loopentry.5.outer.i.preheader: ; preds = %loopentry.4.i15 + br label %loopentry.5.outer.i + +loopentry.5.outer.i: ; preds = %loopexit.5.i, %loopentry.5.outer.i.preheader + br label %loopentry.5.i + +loopentry.5.i: ; preds = %endif.1.i18, %loopentry.5.outer.i + br bool false, label %no_exit.5.i.preheader, label %loopexit.5.i.loopexit3 + +no_exit.5.i.preheader: ; preds = %loopentry.5.i + br label %no_exit.5.i + +no_exit.5.i: ; preds = %then.2.i, %no_exit.5.i.preheader + br bool false, label %loopentry.6.i, label %endif.1.i18 + +loopentry.6.i: ; preds = %no_exit.5.i + br bool false, label %no_exit.6.preheader.i, label %loopexit.6.i + +no_exit.6.preheader.i: ; preds = %loopentry.6.i + br label %no_exit.6.i + +no_exit.6.i: ; preds = %no_exit.6.i, %no_exit.6.preheader.i + br bool false, label %no_exit.6.i, label %loopexit.6.i.loopexit + +loopexit.6.i.loopexit: ; preds = %no_exit.6.i + br label %loopexit.6.i + +loopexit.6.i: ; preds = %loopexit.6.i.loopexit, %loopentry.6.i + br bool false, label %then.2.i, label %endif.1.i18 + +then.2.i: ; preds = %loopexit.6.i + br bool false, label %no_exit.5.i, label %loopexit.5.i.loopexit + +endif.1.i18: ; preds = %loopexit.6.i, %no_exit.5.i + br label %loopentry.5.i + +loopexit.5.i.loopexit: ; preds = %then.2.i + br label %loopexit.5.i + +loopexit.5.i.loopexit3: ; preds = %loopentry.5.i + br label %loopexit.5.i + +loopexit.5.i: ; preds = %loopexit.5.i.loopexit3, %loopexit.5.i.loopexit + br bool false, label %loopentry.5.outer.i, label %loopentry.7.i.loopexit + +loopentry.7.i.loopexit: ; preds = %loopexit.5.i + br label %loopentry.7.i + +loopentry.7.i: ; preds = %loopentry.7.i.loopexit, %loopentry.4.i15 + br bool false, label %no_exit.7.i.preheader, label %hamming.exit.i + +no_exit.7.i.preheader: ; preds = %loopentry.7.i + br label %no_exit.7.i + +no_exit.7.i: ; preds = %no_exit.7.i, %no_exit.7.i.preheader + br bool false, label %no_exit.7.i, label %loopexit.7.i + +loopexit.7.i: ; preds = %no_exit.7.i + br bool false, label %no_exit.i.i.preheader, label %hamming.exit.i + +no_exit.i.i.preheader: ; preds = %loopexit.7.i + br label %no_exit.i.i + +no_exit.i.i: ; preds = %no_exit.i.i, %no_exit.i.i.preheader + br bool false, label %no_exit.i.i, label %hamming.exit.i.loopexit + +hamming.exit.i.loopexit: ; preds = %no_exit.i.i + br label %hamming.exit.i + +hamming.exit.i: ; preds = %hamming.exit.i.loopexit, %loopexit.7.i, %loopentry.7.i + br bool false, label %endif.3.i19, label %loopentry.8.i + +loopentry.8.i: ; preds = %hamming.exit.i + br bool false, label %shortcirc_next.i.preheader, label %loopexit.8.i + +shortcirc_next.i.preheader: ; preds = %loopentry.8.i + br label %shortcirc_next.i + +shortcirc_next.i: ; preds = %no_exit.8.i, %shortcirc_next.i.preheader + br bool false, label %no_exit.8.i, label %loopexit.8.i.loopexit + +no_exit.8.i: ; preds = %shortcirc_next.i + br bool false, label %shortcirc_next.i, label %loopexit.8.i.loopexit + +loopexit.8.i.loopexit: ; preds = %no_exit.8.i, %shortcirc_next.i + br label %loopexit.8.i + +loopexit.8.i: ; preds = %loopexit.8.i.loopexit, %loopentry.8.i + br bool false, label %no_exit.9.i.preheader, label %endif.3.i19 + +no_exit.9.i.preheader: ; preds = %loopexit.8.i + br label %no_exit.9.i + +no_exit.9.i: ; preds = %no_exit.9.i, %no_exit.9.i.preheader + br bool false, label %no_exit.9.i, label %endif.3.i19.loopexit + +endif.3.i19.loopexit: ; preds = %no_exit.9.i + br label %endif.3.i19 + +endif.3.i19: ; preds = %endif.3.i19.loopexit, %loopexit.8.i, %hamming.exit.i + br bool false, label %loopentry.2.i, label %loopexit.1.i20 + +loopexit.1.i20: ; preds = %endif.3.i19 + br bool false, label %then.4.i, label %UnifiedReturnBlock.i + +then.4.i: ; preds = %loopexit.1.i20 + br label %runcont.exit + +UnifiedReturnBlock.i: ; preds = %loopexit.1.i20 + br label %runcont.exit + +runcont.exit: ; preds = %UnifiedReturnBlock.i, %then.4.i + br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 + +no_exit.1.i36.preheader: ; preds = %runcont.exit, %run.exit + br label %no_exit.1.i36 + +no_exit.1.i36: ; preds = %no_exit.1.i36, %no_exit.1.i36.preheader + br bool false, label %no_exit.1.i36, label %loopentry.3.i37.loopexit + +loopentry.3.i37.loopexit: ; preds = %no_exit.1.i36 + br label %loopentry.3.i37 + +loopentry.3.i37: ; preds = %loopentry.3.i37.loopexit, %runcont.exit, %run.exit + br bool false, label %loopentry.4.i38.preheader, label %loopexit.3.i + +loopentry.4.i38.preheader: ; preds = %loopentry.3.i37 + br label %loopentry.4.i38 + +loopentry.4.i38: ; preds = %loopexit.4.i42, %loopentry.4.i38.preheader + br bool false, label %no_exit.3.i.preheader, label %loopexit.4.i42 + +no_exit.3.i.preheader: ; preds = %loopentry.4.i38 + br label %no_exit.3.i + +no_exit.3.i: ; preds = %no_exit.3.i.backedge, %no_exit.3.i.preheader + br bool false, label %endif.3.i, label %else.1.i + +else.1.i: ; preds = %no_exit.3.i + br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit + +no_exit.3.i.backedge: ; preds = %endif.3.i, %else.1.i + br label %no_exit.3.i + +endif.3.i: ; preds = %no_exit.3.i + br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit + +loopexit.4.i42.loopexit: ; preds = %endif.3.i, %else.1.i + br label %loopexit.4.i42 + +loopexit.4.i42: ; preds = %loopexit.4.i42.loopexit, %loopentry.4.i38 + br bool false, label %loopentry.4.i38, label %loopexit.3.i.loopexit + +loopexit.3.i.loopexit: ; preds = %loopexit.4.i42 + br label %loopexit.3.i + +loopexit.3.i: ; preds = %loopexit.3.i.loopexit, %loopentry.3.i37 + %tmp.13.i155 = setlt int 0, 0 ; <bool> [#uses=1] + br bool %tmp.13.i155, label %no_exit.0.i31, label %loopentry.1.i30.loopexit +} diff --git a/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll b/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll new file mode 100644 index 0000000..a224a2f --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll @@ -0,0 +1,104 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse -simplifycfg \ +; RUN: -disable-output +; PR867 + +target endian = big +target pointersize = 32 +target triple = "powerpc-apple-darwin8" + %struct.CUMULATIVE_ARGS = type { int, int, int, int, int, int, int, int, int, int, int, int } + %struct.eh_status = type opaque + %struct.emit_status = type { int, int, %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack*, int, %struct.location_t, int, ubyte*, %struct.rtx_def** } + %struct.expr_status = type { int, int, int, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def* } + %struct.function = type { %struct.eh_status*, %struct.expr_status*, %struct.emit_status*, %struct.varasm_status*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.function*, int, int, int, int, %struct.rtx_def*, %struct.CUMULATIVE_ARGS, %struct.rtx_def*, %struct.rtx_def*, %struct.initial_value_struct*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, ubyte, int, long, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.varray_head_tag*, %struct.temp_slot*, int, %struct.var_refs_queue*, int, int, %struct.rtvec_def*, %struct.tree_node*, int, int, int, %struct.machine_function*, uint, uint, ubyte, ubyte, %struct.language_function*, %struct.rtx_def*, uint, int, int, int, %struct.location_t, %struct.varray_head_tag*, %struct.tree_node*, ubyte, ubyte, ubyte } + %struct.initial_value_struct = type opaque + %struct.lang_decl = type opaque + %struct.lang_type = type opaque + %struct.language_function = type opaque + %struct.location_t = type { sbyte*, int } + %struct.machine_function = type { int, uint, sbyte*, int, int } + %struct.rtunion = type { int } + %struct.rtvec_def = type { int, [1 x %struct.rtx_def*] } + %struct.rtx_def = type { ushort, ubyte, ubyte, %struct.u } + %struct.sequence_stack = type { %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack* } + %struct.temp_slot = type opaque + %struct.tree_common = type { %struct.tree_node*, %struct.tree_node*, %union.tree_ann_d*, ubyte, ubyte, ubyte, ubyte, ubyte } + %struct.tree_decl = type { %struct.tree_common, %struct.location_t, uint, %struct.tree_node*, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, uint, %struct.tree_decl_u1, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.tree_decl_u2, %struct.tree_node*, %struct.tree_node*, long, %struct.lang_decl* } + %struct.tree_decl_u1 = type { long } + %struct.tree_decl_u2 = type { %struct.function* } + %struct.tree_node = type { %struct.tree_decl } + %struct.tree_type = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, uint, ushort, ubyte, ubyte, uint, %struct.tree_node*, %struct.tree_node*, %struct.rtunion, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, long, %struct.lang_type* } + %struct.u = type { [1 x long] } + %struct.var_refs_queue = type { %struct.rtx_def*, uint, int, %struct.var_refs_queue* } + %struct.varasm_status = type opaque + %struct.varray_head_tag = type { uint, uint, uint, sbyte*, %struct.u } + %union.tree_ann_d = type opaque +%mode_class = external global [35 x ubyte] ; <[35 x ubyte]*> [#uses=3] + +implementation ; Functions: + +void %fold_builtin_classify() { +entry: + %tmp63 = load int* null ; <int> [#uses=1] + switch int %tmp63, label %bb276 [ + int 414, label %bb145 + int 417, label %bb + ] + +bb: ; preds = %entry + ret void + +bb145: ; preds = %entry + %tmp146 = load %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] + %tmp148 = getelementptr %struct.tree_node* %tmp146, int 0, uint 0, uint 0, uint 1 ; <%struct.tree_node**> [#uses=1] + %tmp149 = load %struct.tree_node** %tmp148 ; <%struct.tree_node*> [#uses=1] + %tmp150 = cast %struct.tree_node* %tmp149 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] + %tmp151 = getelementptr %struct.tree_type* %tmp150, int 0, uint 6 ; <ushort*> [#uses=1] + %tmp151 = cast ushort* %tmp151 to uint* ; <uint*> [#uses=1] + %tmp152 = load uint* %tmp151 ; <uint> [#uses=1] + %tmp154 = shr uint %tmp152, ubyte 16 ; <uint> [#uses=1] + %tmp154.mask = and uint %tmp154, 127 ; <uint> [#uses=1] + %tmp155 = getelementptr [35 x ubyte]* %mode_class, int 0, uint %tmp154.mask ; <ubyte*> [#uses=1] + %tmp156 = load ubyte* %tmp155 ; <ubyte> [#uses=1] + %tmp157 = seteq ubyte %tmp156, 4 ; <bool> [#uses=1] + br bool %tmp157, label %cond_next241, label %cond_true158 + +cond_true158: ; preds = %bb145 + %tmp172 = load %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] + %tmp174 = getelementptr %struct.tree_node* %tmp172, int 0, uint 0, uint 0, uint 1 ; <%struct.tree_node**> [#uses=1] + %tmp175 = load %struct.tree_node** %tmp174 ; <%struct.tree_node*> [#uses=1] + %tmp176 = cast %struct.tree_node* %tmp175 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] + %tmp177 = getelementptr %struct.tree_type* %tmp176, int 0, uint 6 ; <ushort*> [#uses=1] + %tmp177 = cast ushort* %tmp177 to uint* ; <uint*> [#uses=1] + %tmp178 = load uint* %tmp177 ; <uint> [#uses=1] + %tmp180 = shr uint %tmp178, ubyte 16 ; <uint> [#uses=1] + %tmp180.mask = and uint %tmp180, 127 ; <uint> [#uses=1] + %tmp181 = getelementptr [35 x ubyte]* %mode_class, int 0, uint %tmp180.mask ; <ubyte*> [#uses=1] + %tmp182 = load ubyte* %tmp181 ; <ubyte> [#uses=1] + %tmp183 = seteq ubyte %tmp182, 8 ; <bool> [#uses=1] + br bool %tmp183, label %cond_next241, label %cond_true184 + +cond_true184: ; preds = %cond_true158 + %tmp185 = load %struct.tree_node** null ; <%struct.tree_node*> [#uses=1] + %tmp187 = getelementptr %struct.tree_node* %tmp185, int 0, uint 0, uint 0, uint 1 ; <%struct.tree_node**> [#uses=1] + %tmp188 = load %struct.tree_node** %tmp187 ; <%struct.tree_node*> [#uses=1] + %tmp189 = cast %struct.tree_node* %tmp188 to %struct.tree_type* ; <%struct.tree_type*> [#uses=1] + %tmp190 = getelementptr %struct.tree_type* %tmp189, int 0, uint 6 ; <ushort*> [#uses=1] + %tmp190 = cast ushort* %tmp190 to uint* ; <uint*> [#uses=1] + %tmp191 = load uint* %tmp190 ; <uint> [#uses=1] + %tmp193 = shr uint %tmp191, ubyte 16 ; <uint> [#uses=1] + %tmp193.mask = and uint %tmp193, 127 ; <uint> [#uses=1] + %tmp194 = getelementptr [35 x ubyte]* %mode_class, int 0, uint %tmp193.mask ; <ubyte*> [#uses=1] + %tmp195 = load ubyte* %tmp194 ; <ubyte> [#uses=1] + %tmp196 = seteq ubyte %tmp195, 4 ; <bool> [#uses=1] + br bool %tmp196, label %cond_next241, label %cond_true197 + +cond_true197: ; preds = %cond_true184 + ret void + +cond_next241: ; preds = %cond_true184, %cond_true158, %bb145 + %tmp245 = load uint* null ; <uint> [#uses=0] + ret void + +bb276: ; preds = %entry + ret void +} diff --git a/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll b/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll new file mode 100644 index 0000000..26fce45 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll @@ -0,0 +1,34 @@ +; PR957 +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep select + +uint %test(uint %tmp) { +cond_false179: ; preds = %cond_true + %tmp181 = seteq uint %tmp, 0 ; <bool> [#uses=1] + br bool %tmp181, label %cond_true182, label %cond_next185 + +cond_true182: ; preds = %cond_false179 + br label %cond_next185 + +cond_next185: ; preds = %cond_true182, %cond_false179 + %d0.3 = phi uint [ div (uint 1, uint 0), %cond_true182 ], [ %tmp, +%cond_false179 ] ; <uint> [#uses=7] + + ret uint %d0.3 +} + +uint %test2(uint %tmp) { +cond_false179: ; preds = %cond_true + %tmp181 = seteq uint %tmp, 0 ; <bool> [#uses=1] + br bool %tmp181, label %cond_true182, label %cond_next185 + +cond_true182: ; preds = %cond_false179 + br label %cond_next185 + +cond_next185: ; preds = %cond_true182, %cond_false179 + %d0.3 = phi uint [ div (uint 1, uint 0), %cond_true182 ], [ %tmp, +%cond_false179 ] ; <uint> [#uses=7] + call uint %test(uint 4) + ret uint %d0.3 +} + diff --git a/test/Transforms/SimplifyCFG/2006-10-29-InvokeCrash.ll b/test/Transforms/SimplifyCFG/2006-10-29-InvokeCrash.ll new file mode 100644 index 0000000..48a1458 --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-10-29-InvokeCrash.ll @@ -0,0 +1,654 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output +; XFAIL: * +; Un-XFAIL this when PR1146 is finished. + + %struct..4._102 = type { %struct.QVectorData* } + %struct..5._125 = type { %struct.QMapData* } + %struct.QAbstractTextDocumentLayout = type { %struct.QObject } + %struct.QBasicAtomic = type { int } + %struct.QFont = type { %struct.QFontPrivate*, uint } + %struct.QFontMetrics = type { %struct.QFontPrivate* } + %struct.QFontPrivate = type opaque + "struct.QFragmentMap<QTextBlockData>" = type { %struct.QFragmentMapData } + %struct.QFragmentMapData = type { "struct.QFragmentMapData::._154", int } + "struct.QFragmentMapData::._154" = type { "struct.QFragmentMapData::Header"* } + "struct.QFragmentMapData::Header" = type { uint, uint, uint, uint, uint, uint, uint, uint } + "struct.QHash<uint,QHashDummyValue>" = type { "struct.QHash<uint,QHashDummyValue>::._152" } + "struct.QHash<uint,QHashDummyValue>::._152" = type { %struct.QHashData* } + %struct.QHashData = type { "struct.QHashData::Node"*, "struct.QHashData::Node"**, %struct.QBasicAtomic, int, int, short, short, int, ubyte } + "struct.QHashData::Node" = type { "struct.QHashData::Node"*, uint } + "struct.QList<QObject*>::._92" = type { %struct.QListData } + "struct.QList<QPointer<QObject> >" = type { "struct.QList<QObject*>::._92" } + %struct.QListData = type { "struct.QListData::Data"* } + "struct.QListData::Data" = type { %struct.QBasicAtomic, int, int, int, ubyte, [1 x sbyte*] } + "struct.QMap<QUrl,QVariant>" = type { %struct..5._125 } + %struct.QMapData = type { "struct.QMapData::Node"*, [12 x "struct.QMapData::Node"*], %struct.QBasicAtomic, int, int, uint, ubyte } + "struct.QMapData::Node" = type { "struct.QMapData::Node"*, [1 x "struct.QMapData::Node"*] } + %struct.QObject = type { int (...)**, %struct.QObjectData* } + %struct.QObjectData = type { int (...)**, %struct.QObject*, %struct.QObject*, "struct.QList<QPointer<QObject> >", ubyte, [3 x ubyte], int, int } + %struct.QObjectPrivate = type { %struct.QObjectData, int, %struct.QObject*, "struct.QList<QPointer<QObject> >", "struct.QVector<QAbstractTextDocumentLayout::Selection>", %struct.QString } + %struct.QPaintDevice = type { int (...)**, ushort } + %struct.QPainter = type { %struct.QPainterPrivate* } + %struct.QPainterPrivate = type opaque + %struct.QPointF = type { double, double } + %struct.QPrinter = type { %struct.QPaintDevice, %struct.QPrinterPrivate* } + %struct.QPrinterPrivate = type opaque + %struct.QRectF = type { double, double, double, double } + "struct.QSet<uint>" = type { "struct.QHash<uint,QHashDummyValue>" } + "struct.QSharedDataPointer<QTextFormatPrivate>" = type { %struct.QTextFormatPrivate* } + %struct.QString = type { "struct.QString::Data"* } + "struct.QString::Data" = type { %struct.QBasicAtomic, int, int, ushort*, ubyte, ubyte, [1 x ushort] } + %struct.QTextBlockFormat = type { %struct.QTextFormat } + %struct.QTextBlockGroup = type { %struct.QAbstractTextDocumentLayout } + %struct.QTextDocumentConfig = type { %struct.QString } + %struct.QTextDocumentPrivate = type { %struct.QObjectPrivate, %struct.QString, "struct.QVector<QAbstractTextDocumentLayout::Selection>", bool, int, int, bool, int, int, int, int, bool, %struct.QTextFormatCollection, %struct.QTextBlockGroup*, %struct.QAbstractTextDocumentLayout*, "struct.QFragmentMap<QTextBlockData>", "struct.QFragmentMap<QTextBlockData>", int, "struct.QList<QPointer<QObject> >", "struct.QList<QPointer<QObject> >", "struct.QMap<QUrl,QVariant>", "struct.QMap<QUrl,QVariant>", "struct.QMap<QUrl,QVariant>", %struct.QTextDocumentConfig, bool, bool, %struct.QPointF } + %struct.QTextFormat = type { "struct.QSharedDataPointer<QTextFormatPrivate>", int } + %struct.QTextFormatCollection = type { "struct.QVector<QAbstractTextDocumentLayout::Selection>", "struct.QVector<QAbstractTextDocumentLayout::Selection>", "struct.QSet<uint>", %struct.QFont } + %struct.QTextFormatPrivate = type opaque + "struct.QVector<QAbstractTextDocumentLayout::Selection>" = type { %struct..4._102 } + %struct.QVectorData = type { %struct.QBasicAtomic, int, int, ubyte } + +implementation ; Functions: + +void %_ZNK13QTextDocument5printEP8QPrinter(%struct.QAbstractTextDocumentLayout* %this, %struct.QPrinter* %printer) { +entry: + %tmp = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=2] + %tmp = alloca %struct.QRectF, align 16 ; <%struct.QRectF*> [#uses=5] + %tmp2 = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=3] + %tmp = alloca %struct.QFontMetrics, align 16 ; <%struct.QFontMetrics*> [#uses=4] + %tmp = alloca %struct.QFont, align 16 ; <%struct.QFont*> [#uses=4] + %tmp3 = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=2] + %p = alloca %struct.QPainter, align 16 ; <%struct.QPainter*> [#uses=14] + %body = alloca %struct.QRectF, align 16 ; <%struct.QRectF*> [#uses=9] + %pageNumberPos = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=4] + %scaledPageSize = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=6] + %printerPageSize = alloca %struct.QPointF, align 16 ; <%struct.QPointF*> [#uses=3] + %fmt = alloca %struct.QTextBlockFormat, align 16 ; <%struct.QTextBlockFormat*> [#uses=5] + %font = alloca %struct.QFont, align 16 ; <%struct.QFont*> [#uses=5] + %tmp = call %struct.QTextDocumentPrivate* %_ZNK13QTextDocument6d_funcEv( %struct.QAbstractTextDocumentLayout* %this ) ; <%struct.QTextDocumentPrivate*> [#uses=5] + %tmp = getelementptr %struct.QPrinter* %printer, int 0, uint 0 ; <%struct.QPaintDevice*> [#uses=1] + call void %_ZN8QPainterC1EP12QPaintDevice( %struct.QPainter* %p, %struct.QPaintDevice* %tmp ) + %tmp = invoke bool %_ZNK8QPainter8isActiveEv( %struct.QPainter* %p ) + to label %invcont unwind label %cleanup329 ; <bool> [#uses=1] + +invcont: ; preds = %entry + br bool %tmp, label %cond_next, label %cleanup328 + +cond_next: ; preds = %invcont + %tmp8 = invoke %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument14documentLayoutEv( %struct.QAbstractTextDocumentLayout* %this ) + to label %invcont7 unwind label %cleanup329 ; <%struct.QAbstractTextDocumentLayout*> [#uses=0] + +invcont7: ; preds = %cond_next + %tmp10 = getelementptr %struct.QTextDocumentPrivate* %tmp, int 0, uint 26 ; <%struct.QPointF*> [#uses=1] + call void %_ZN7QPointFC1Edd( %struct.QPointF* %tmp, double 0.000000e+00, double 0.000000e+00 ) + call void %_ZN6QRectFC1ERK7QPointFRK6QSizeF( %struct.QRectF* %body, %struct.QPointF* %tmp, %struct.QPointF* %tmp10 ) + call void %_ZN7QPointFC1Ev( %struct.QPointF* %pageNumberPos ) + %tmp12 = getelementptr %struct.QTextDocumentPrivate* %tmp, int 0, uint 26 ; <%struct.QPointF*> [#uses=1] + %tmp13 = call bool %_ZNK6QSizeF7isValidEv( %struct.QPointF* %tmp12 ) ; <bool> [#uses=1] + br bool %tmp13, label %cond_next15, label %bb + +cond_next15: ; preds = %invcont7 + %tmp17 = getelementptr %struct.QTextDocumentPrivate* %tmp, int 0, uint 26 ; <%struct.QPointF*> [#uses=1] + %tmp = call double %_ZNK6QSizeF6heightEv( %struct.QPointF* %tmp17 ) ; <double> [#uses=1] + %tmp18 = seteq double %tmp, 0x41DFFFFFFFC00000 ; <bool> [#uses=1] + br bool %tmp18, label %bb, label %cond_next20 + +cond_next20: ; preds = %cond_next15 + br label %bb21 + +bb: ; preds = %cond_next15, %invcont7 + br label %bb21 + +bb21: ; preds = %bb, %cond_next20 + %iftmp.406.0 = phi bool [ false, %bb ], [ true, %cond_next20 ] ; <bool> [#uses=1] + br bool %iftmp.406.0, label %cond_true24, label %cond_false + +cond_true24: ; preds = %bb21 + %tmp = invoke int %_Z13qt_defaultDpiv( ) + to label %invcont25 unwind label %cleanup329 ; <int> [#uses=1] + +invcont25: ; preds = %cond_true24 + %tmp26 = cast int %tmp to double ; <double> [#uses=2] + %tmp30 = invoke %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument14documentLayoutEv( %struct.QAbstractTextDocumentLayout* %this ) + to label %invcont29 unwind label %cleanup329 ; <%struct.QAbstractTextDocumentLayout*> [#uses=1] + +invcont29: ; preds = %invcont25 + %tmp32 = invoke %struct.QPaintDevice* %_ZNK27QAbstractTextDocumentLayout11paintDeviceEv( %struct.QAbstractTextDocumentLayout* %tmp30 ) + to label %invcont31 unwind label %cleanup329 ; <%struct.QPaintDevice*> [#uses=3] + +invcont31: ; preds = %invcont29 + %tmp34 = seteq %struct.QPaintDevice* %tmp32, null ; <bool> [#uses=1] + br bool %tmp34, label %cond_next42, label %cond_true35 + +cond_true35: ; preds = %invcont31 + %tmp38 = invoke int %_ZNK12QPaintDevice11logicalDpiXEv( %struct.QPaintDevice* %tmp32 ) + to label %invcont37 unwind label %cleanup329 ; <int> [#uses=1] + +invcont37: ; preds = %cond_true35 + %tmp38 = cast int %tmp38 to double ; <double> [#uses=1] + %tmp41 = invoke int %_ZNK12QPaintDevice11logicalDpiYEv( %struct.QPaintDevice* %tmp32 ) + to label %invcont40 unwind label %cleanup329 ; <int> [#uses=1] + +invcont40: ; preds = %invcont37 + %tmp41 = cast int %tmp41 to double ; <double> [#uses=1] + br label %cond_next42 + +cond_next42: ; preds = %invcont40, %invcont31 + %sourceDpiY.2 = phi double [ %tmp41, %invcont40 ], [ %tmp26, %invcont31 ] ; <double> [#uses=1] + %sourceDpiX.2 = phi double [ %tmp38, %invcont40 ], [ %tmp26, %invcont31 ] ; <double> [#uses=1] + %tmp44 = getelementptr %struct.QPrinter* %printer, int 0, uint 0 ; <%struct.QPaintDevice*> [#uses=1] + %tmp46 = invoke int %_ZNK12QPaintDevice11logicalDpiXEv( %struct.QPaintDevice* %tmp44 ) + to label %invcont45 unwind label %cleanup329 ; <int> [#uses=1] + +invcont45: ; preds = %cond_next42 + %tmp46 = cast int %tmp46 to double ; <double> [#uses=1] + %tmp48 = fdiv double %tmp46, %sourceDpiX.2 ; <double> [#uses=2] + %tmp50 = getelementptr %struct.QPrinter* %printer, int 0, uint 0 ; <%struct.QPaintDevice*> [#uses=1] + %tmp52 = invoke int %_ZNK12QPaintDevice11logicalDpiYEv( %struct.QPaintDevice* %tmp50 ) + to label %invcont51 unwind label %cleanup329 ; <int> [#uses=1] + +invcont51: ; preds = %invcont45 + %tmp52 = cast int %tmp52 to double ; <double> [#uses=1] + %tmp54 = fdiv double %tmp52, %sourceDpiY.2 ; <double> [#uses=2] + invoke void %_ZN8QPainter5scaleEdd( %struct.QPainter* %p, double %tmp48, double %tmp54 ) + to label %invcont57 unwind label %cleanup329 + +invcont57: ; preds = %invcont51 + %tmp = getelementptr %struct.QPointF* %scaledPageSize, int 0, uint 0 ; <double*> [#uses=1] + %tmp60 = getelementptr %struct.QTextDocumentPrivate* %tmp, int 0, uint 26, uint 0 ; <double*> [#uses=1] + %tmp61 = load double* %tmp60 ; <double> [#uses=1] + store double %tmp61, double* %tmp + %tmp62 = getelementptr %struct.QPointF* %scaledPageSize, int 0, uint 1 ; <double*> [#uses=1] + %tmp63 = getelementptr %struct.QTextDocumentPrivate* %tmp, int 0, uint 26, uint 1 ; <double*> [#uses=1] + %tmp64 = load double* %tmp63 ; <double> [#uses=1] + store double %tmp64, double* %tmp62 + %tmp65 = call double* %_ZN6QSizeF6rwidthEv( %struct.QPointF* %scaledPageSize ) ; <double*> [#uses=2] + %tmp67 = load double* %tmp65 ; <double> [#uses=1] + %tmp69 = mul double %tmp67, %tmp48 ; <double> [#uses=1] + store double %tmp69, double* %tmp65 + %tmp71 = call double* %_ZN6QSizeF7rheightEv( %struct.QPointF* %scaledPageSize ) ; <double*> [#uses=2] + %tmp73 = load double* %tmp71 ; <double> [#uses=1] + %tmp75 = mul double %tmp73, %tmp54 ; <double> [#uses=1] + store double %tmp75, double* %tmp71 + %tmp78 = getelementptr %struct.QPrinter* %printer, int 0, uint 0 ; <%struct.QPaintDevice*> [#uses=1] + %tmp80 = invoke int %_ZNK12QPaintDevice6heightEv( %struct.QPaintDevice* %tmp78 ) + to label %invcont79 unwind label %cleanup329 ; <int> [#uses=1] + +invcont79: ; preds = %invcont57 + %tmp82 = getelementptr %struct.QPrinter* %printer, int 0, uint 0 ; <%struct.QPaintDevice*> [#uses=1] + %tmp84 = invoke int %_ZNK12QPaintDevice5widthEv( %struct.QPaintDevice* %tmp82 ) + to label %invcont83 unwind label %cleanup329 ; <int> [#uses=1] + +invcont83: ; preds = %invcont79 + %tmp80 = cast int %tmp80 to double ; <double> [#uses=1] + %tmp84 = cast int %tmp84 to double ; <double> [#uses=1] + call void %_ZN6QSizeFC1Edd( %struct.QPointF* %printerPageSize, double %tmp84, double %tmp80 ) + %tmp85 = call double %_ZNK6QSizeF6heightEv( %struct.QPointF* %printerPageSize ) ; <double> [#uses=1] + %tmp86 = call double %_ZNK6QSizeF6heightEv( %struct.QPointF* %scaledPageSize ) ; <double> [#uses=1] + %tmp87 = fdiv double %tmp85, %tmp86 ; <double> [#uses=1] + %tmp88 = call double %_ZNK6QSizeF5widthEv( %struct.QPointF* %printerPageSize ) ; <double> [#uses=1] + %tmp89 = call double %_ZNK6QSizeF5widthEv( %struct.QPointF* %scaledPageSize ) ; <double> [#uses=1] + %tmp90 = fdiv double %tmp88, %tmp89 ; <double> [#uses=1] + invoke void %_ZN8QPainter5scaleEdd( %struct.QPainter* %p, double %tmp90, double %tmp87 ) + to label %cond_next194 unwind label %cleanup329 + +cond_false: ; preds = %bb21 + %tmp = getelementptr %struct.QAbstractTextDocumentLayout* %this, int 0, uint 0 ; <%struct.QObject*> [#uses=1] + %tmp95 = invoke %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument5cloneEP7QObject( %struct.QAbstractTextDocumentLayout* %this, %struct.QObject* %tmp ) + to label %invcont94 unwind label %cleanup329 ; <%struct.QAbstractTextDocumentLayout*> [#uses=9] + +invcont94: ; preds = %cond_false + %tmp99 = invoke %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument14documentLayoutEv( %struct.QAbstractTextDocumentLayout* %tmp95 ) + to label %invcont98 unwind label %cleanup329 ; <%struct.QAbstractTextDocumentLayout*> [#uses=1] + +invcont98: ; preds = %invcont94 + %tmp101 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont100 unwind label %cleanup329 ; <%struct.QPaintDevice*> [#uses=1] + +invcont100: ; preds = %invcont98 + invoke void %_ZN27QAbstractTextDocumentLayout14setPaintDeviceEP12QPaintDevice( %struct.QAbstractTextDocumentLayout* %tmp99, %struct.QPaintDevice* %tmp101 ) + to label %invcont103 unwind label %cleanup329 + +invcont103: ; preds = %invcont100 + %tmp105 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont104 unwind label %cleanup329 ; <%struct.QPaintDevice*> [#uses=1] + +invcont104: ; preds = %invcont103 + %tmp107 = invoke int %_ZNK12QPaintDevice11logicalDpiYEv( %struct.QPaintDevice* %tmp105 ) + to label %invcont106 unwind label %cleanup329 ; <int> [#uses=1] + +invcont106: ; preds = %invcont104 + %tmp108 = cast int %tmp107 to double ; <double> [#uses=1] + %tmp109 = mul double %tmp108, 0x3FE93264C993264C ; <double> [#uses=1] + %tmp109 = cast double %tmp109 to int ; <int> [#uses=3] + %tmp = call %struct.QTextBlockGroup* %_ZNK13QTextDocument9rootFrameEv( %struct.QAbstractTextDocumentLayout* %tmp95 ) ; <%struct.QTextBlockGroup*> [#uses=1] + invoke csretcc void %_ZNK10QTextFrame11frameFormatEv( %struct.QTextBlockFormat* %fmt, %struct.QTextBlockGroup* %tmp ) + to label %invcont111 unwind label %cleanup329 + +invcont111: ; preds = %invcont106 + %tmp112 = cast int %tmp109 to double ; <double> [#uses=1] + invoke void %_ZN16QTextFrameFormat9setMarginEd( %struct.QTextBlockFormat* %fmt, double %tmp112 ) + to label %invcont114 unwind label %cleanup192 + +invcont114: ; preds = %invcont111 + %tmp116 = call %struct.QTextBlockGroup* %_ZNK13QTextDocument9rootFrameEv( %struct.QAbstractTextDocumentLayout* %tmp95 ) ; <%struct.QTextBlockGroup*> [#uses=1] + invoke void %_ZN10QTextFrame14setFrameFormatERK16QTextFrameFormat( %struct.QTextBlockGroup* %tmp116, %struct.QTextBlockFormat* %fmt ) + to label %invcont117 unwind label %cleanup192 + +invcont117: ; preds = %invcont114 + %tmp119 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont118 unwind label %cleanup192 ; <%struct.QPaintDevice*> [#uses=1] + +invcont118: ; preds = %invcont117 + %tmp121 = invoke int %_ZNK12QPaintDevice6heightEv( %struct.QPaintDevice* %tmp119 ) + to label %invcont120 unwind label %cleanup192 ; <int> [#uses=1] + +invcont120: ; preds = %invcont118 + %tmp121 = cast int %tmp121 to double ; <double> [#uses=1] + %tmp123 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont122 unwind label %cleanup192 ; <%struct.QPaintDevice*> [#uses=1] + +invcont122: ; preds = %invcont120 + %tmp125 = invoke int %_ZNK12QPaintDevice5widthEv( %struct.QPaintDevice* %tmp123 ) + to label %invcont124 unwind label %cleanup192 ; <int> [#uses=1] + +invcont124: ; preds = %invcont122 + %tmp125 = cast int %tmp125 to double ; <double> [#uses=1] + call void %_ZN6QRectFC1Edddd( %struct.QRectF* %tmp, double 0.000000e+00, double 0.000000e+00, double %tmp125, double %tmp121 ) + %tmp126 = getelementptr %struct.QRectF* %body, int 0, uint 0 ; <double*> [#uses=1] + %tmp127 = getelementptr %struct.QRectF* %tmp, int 0, uint 0 ; <double*> [#uses=1] + %tmp128 = load double* %tmp127 ; <double> [#uses=1] + store double %tmp128, double* %tmp126 + %tmp129 = getelementptr %struct.QRectF* %body, int 0, uint 1 ; <double*> [#uses=1] + %tmp130 = getelementptr %struct.QRectF* %tmp, int 0, uint 1 ; <double*> [#uses=1] + %tmp131 = load double* %tmp130 ; <double> [#uses=1] + store double %tmp131, double* %tmp129 + %tmp132 = getelementptr %struct.QRectF* %body, int 0, uint 2 ; <double*> [#uses=1] + %tmp133 = getelementptr %struct.QRectF* %tmp, int 0, uint 2 ; <double*> [#uses=1] + %tmp134 = load double* %tmp133 ; <double> [#uses=1] + store double %tmp134, double* %tmp132 + %tmp135 = getelementptr %struct.QRectF* %body, int 0, uint 3 ; <double*> [#uses=1] + %tmp136 = getelementptr %struct.QRectF* %tmp, int 0, uint 3 ; <double*> [#uses=1] + %tmp137 = load double* %tmp136 ; <double> [#uses=1] + store double %tmp137, double* %tmp135 + %tmp138 = call double %_ZNK6QRectF6heightEv( %struct.QRectF* %body ) ; <double> [#uses=1] + %tmp139 = cast int %tmp109 to double ; <double> [#uses=1] + %tmp140 = sub double %tmp138, %tmp139 ; <double> [#uses=1] + %tmp142 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont141 unwind label %cleanup192 ; <%struct.QPaintDevice*> [#uses=1] + +invcont141: ; preds = %invcont124 + invoke csretcc void %_ZNK13QTextDocument11defaultFontEv( %struct.QFont* %tmp, %struct.QAbstractTextDocumentLayout* %tmp95 ) + to label %invcont144 unwind label %cleanup192 + +invcont144: ; preds = %invcont141 + invoke void %_ZN12QFontMetricsC1ERK5QFontP12QPaintDevice( %struct.QFontMetrics* %tmp, %struct.QFont* %tmp, %struct.QPaintDevice* %tmp142 ) + to label %invcont146 unwind label %cleanup173 + +invcont146: ; preds = %invcont144 + %tmp149 = invoke int %_ZNK12QFontMetrics6ascentEv( %struct.QFontMetrics* %tmp ) + to label %invcont148 unwind label %cleanup168 ; <int> [#uses=1] + +invcont148: ; preds = %invcont146 + %tmp149 = cast int %tmp149 to double ; <double> [#uses=1] + %tmp150 = add double %tmp140, %tmp149 ; <double> [#uses=1] + %tmp152 = invoke %struct.QPaintDevice* %_ZNK8QPainter6deviceEv( %struct.QPainter* %p ) + to label %invcont151 unwind label %cleanup168 ; <%struct.QPaintDevice*> [#uses=1] + +invcont151: ; preds = %invcont148 + %tmp154 = invoke int %_ZNK12QPaintDevice11logicalDpiYEv( %struct.QPaintDevice* %tmp152 ) + to label %invcont153 unwind label %cleanup168 ; <int> [#uses=1] + +invcont153: ; preds = %invcont151 + %tmp155 = mul int %tmp154, 5 ; <int> [#uses=1] + %tmp156 = sdiv int %tmp155, 72 ; <int> [#uses=1] + %tmp156 = cast int %tmp156 to double ; <double> [#uses=1] + %tmp157 = add double %tmp150, %tmp156 ; <double> [#uses=1] + %tmp158 = call double %_ZNK6QRectF5widthEv( %struct.QRectF* %body ) ; <double> [#uses=1] + %tmp159 = cast int %tmp109 to double ; <double> [#uses=1] + %tmp160 = sub double %tmp158, %tmp159 ; <double> [#uses=1] + call void %_ZN7QPointFC1Edd( %struct.QPointF* %tmp2, double %tmp160, double %tmp157 ) + %tmp161 = getelementptr %struct.QPointF* %pageNumberPos, int 0, uint 0 ; <double*> [#uses=1] + %tmp162 = getelementptr %struct.QPointF* %tmp2, int 0, uint 0 ; <double*> [#uses=1] + %tmp163 = load double* %tmp162 ; <double> [#uses=1] + store double %tmp163, double* %tmp161 + %tmp164 = getelementptr %struct.QPointF* %pageNumberPos, int 0, uint 1 ; <double*> [#uses=1] + %tmp165 = getelementptr %struct.QPointF* %tmp2, int 0, uint 1 ; <double*> [#uses=1] + %tmp166 = load double* %tmp165 ; <double> [#uses=1] + store double %tmp166, double* %tmp164 + invoke void %_ZN12QFontMetricsD1Ev( %struct.QFontMetrics* %tmp ) + to label %cleanup171 unwind label %cleanup173 + +cleanup168: ; preds = %invcont151, %invcont148, %invcont146 + invoke void %_ZN12QFontMetricsD1Ev( %struct.QFontMetrics* %tmp ) + to label %cleanup173 unwind label %cleanup173 + +cleanup171: ; preds = %invcont153 + invoke void %_ZN5QFontD1Ev( %struct.QFont* %tmp ) + to label %finally170 unwind label %cleanup192 + +cleanup173: ; preds = %cleanup168, %cleanup168, %invcont153, %invcont144 + invoke void %_ZN5QFontD1Ev( %struct.QFont* %tmp ) + to label %cleanup192 unwind label %cleanup192 + +finally170: ; preds = %cleanup171 + invoke csretcc void %_ZNK13QTextDocument11defaultFontEv( %struct.QFont* %font, %struct.QAbstractTextDocumentLayout* %tmp95 ) + to label %invcont177 unwind label %cleanup192 + +invcont177: ; preds = %finally170 + invoke void %_ZN5QFont12setPointSizeEi( %struct.QFont* %font, int 10 ) + to label %invcont179 unwind label %cleanup187 + +invcont179: ; preds = %invcont177 + invoke void %_ZN13QTextDocument14setDefaultFontERK5QFont( %struct.QAbstractTextDocumentLayout* %tmp95, %struct.QFont* %font ) + to label %invcont181 unwind label %cleanup187 + +invcont181: ; preds = %invcont179 + call csretcc void %_ZNK6QRectF4sizeEv( %struct.QPointF* %tmp3, %struct.QRectF* %body ) + invoke void %_ZN13QTextDocument11setPageSizeERK6QSizeF( %struct.QAbstractTextDocumentLayout* %tmp95, %struct.QPointF* %tmp3 ) + to label %cleanup185 unwind label %cleanup187 + +cleanup185: ; preds = %invcont181 + invoke void %_ZN5QFontD1Ev( %struct.QFont* %font ) + to label %cleanup190 unwind label %cleanup192 + +cleanup187: ; preds = %invcont181, %invcont179, %invcont177 + invoke void %_ZN5QFontD1Ev( %struct.QFont* %font ) + to label %cleanup192 unwind label %cleanup192 + +cleanup190: ; preds = %cleanup185 + invoke void %_ZN16QTextFrameFormatD1Ev( %struct.QTextBlockFormat* %fmt ) + to label %cond_next194 unwind label %cleanup329 + +cleanup192: ; preds = %cleanup187, %cleanup187, %cleanup185, %finally170, %cleanup173, %cleanup173, %cleanup171, %invcont141, %invcont124, %invcont122, %invcont120, %invcont118, %invcont117, %invcont114, %invcont111 + invoke void %_ZN16QTextFrameFormatD1Ev( %struct.QTextBlockFormat* %fmt ) + to label %cleanup329 unwind label %cleanup329 + +cond_next194: ; preds = %cleanup190, %invcont83 + %clonedDoc.1 = phi %struct.QAbstractTextDocumentLayout* [ null, %invcont83 ], [ %tmp95, %cleanup190 ] ; <%struct.QAbstractTextDocumentLayout*> [#uses=3] + %doc.1 = phi %struct.QAbstractTextDocumentLayout* [ %this, %invcont83 ], [ %tmp95, %cleanup190 ] ; <%struct.QAbstractTextDocumentLayout*> [#uses=2] + %tmp197 = invoke bool %_ZNK8QPrinter13collateCopiesEv( %struct.QPrinter* %printer ) + to label %invcont196 unwind label %cleanup329 ; <bool> [#uses=1] + +invcont196: ; preds = %cond_next194 + br bool %tmp197, label %cond_true200, label %cond_false204 + +cond_true200: ; preds = %invcont196 + %tmp203 = invoke int %_ZNK8QPrinter9numCopiesEv( %struct.QPrinter* %printer ) + to label %invcont202 unwind label %cleanup329 ; <int> [#uses=1] + +invcont202: ; preds = %cond_true200 + br label %cond_next208 + +cond_false204: ; preds = %invcont196 + %tmp207 = invoke int %_ZNK8QPrinter9numCopiesEv( %struct.QPrinter* %printer ) + to label %invcont206 unwind label %cleanup329 ; <int> [#uses=1] + +invcont206: ; preds = %cond_false204 + br label %cond_next208 + +cond_next208: ; preds = %invcont206, %invcont202 + %pageCopies.0 = phi int [ %tmp203, %invcont202 ], [ 1, %invcont206 ] ; <int> [#uses=2] + %docCopies.0 = phi int [ 1, %invcont202 ], [ %tmp207, %invcont206 ] ; <int> [#uses=2] + %tmp211 = invoke int %_ZNK8QPrinter8fromPageEv( %struct.QPrinter* %printer ) + to label %invcont210 unwind label %cleanup329 ; <int> [#uses=3] + +invcont210: ; preds = %cond_next208 + %tmp214 = invoke int %_ZNK8QPrinter6toPageEv( %struct.QPrinter* %printer ) + to label %invcont213 unwind label %cleanup329 ; <int> [#uses=3] + +invcont213: ; preds = %invcont210 + %tmp216 = seteq int %tmp211, 0 ; <bool> [#uses=1] + br bool %tmp216, label %cond_true217, label %cond_next225 + +cond_true217: ; preds = %invcont213 + %tmp219 = seteq int %tmp214, 0 ; <bool> [#uses=1] + br bool %tmp219, label %cond_true220, label %cond_next225 + +cond_true220: ; preds = %cond_true217 + %tmp223 = invoke int %_ZNK13QTextDocument9pageCountEv( %struct.QAbstractTextDocumentLayout* %doc.1 ) + to label %invcont222 unwind label %cleanup329 ; <int> [#uses=1] + +invcont222: ; preds = %cond_true220 + br label %cond_next225 + +cond_next225: ; preds = %invcont222, %cond_true217, %invcont213 + %toPage.1 = phi int [ %tmp223, %invcont222 ], [ %tmp214, %cond_true217 ], [ %tmp214, %invcont213 ] ; <int> [#uses=2] + %fromPage.1 = phi int [ 1, %invcont222 ], [ %tmp211, %cond_true217 ], [ %tmp211, %invcont213 ] ; <int> [#uses=2] + %tmp.page = invoke uint %_ZNK8QPrinter9pageOrderEv( %struct.QPrinter* %printer ) + to label %invcont227 unwind label %cleanup329 ; <uint> [#uses=1] + +invcont227: ; preds = %cond_next225 + %tmp228 = seteq uint %tmp.page, 1 ; <bool> [#uses=1] + br bool %tmp228, label %cond_true230, label %cond_next234 + +cond_true230: ; preds = %invcont227 + br label %cond_next234 + +cond_next234: ; preds = %cond_true230, %invcont227 + %ascending.1 = phi bool [ false, %cond_true230 ], [ true, %invcont227 ] ; <bool> [#uses=1] + %toPage.2 = phi int [ %fromPage.1, %cond_true230 ], [ %toPage.1, %invcont227 ] ; <int> [#uses=1] + %fromPage.2 = phi int [ %toPage.1, %cond_true230 ], [ %fromPage.1, %invcont227 ] ; <int> [#uses=1] + br label %bb309 + +bb237: ; preds = %cond_true313, %cond_next293 + %iftmp.410.4 = phi bool [ %iftmp.410.5, %cond_true313 ], [ %iftmp.410.1, %cond_next293 ] ; <bool> [#uses=1] + %page.4 = phi int [ %fromPage.2, %cond_true313 ], [ %page.3, %cond_next293 ] ; <int> [#uses=4] + br label %bb273 + +invcont240: ; preds = %cond_true277 + %tmp242 = seteq uint %tmp241, 2 ; <bool> [#uses=1] + br bool %tmp242, label %bb252, label %cond_next244 + +cond_next244: ; preds = %invcont240 + %tmp247 = invoke uint %_ZNK8QPrinter12printerStateEv( %struct.QPrinter* %printer ) + to label %invcont246 unwind label %cleanup329 ; <uint> [#uses=1] + +invcont246: ; preds = %cond_next244 + %tmp248 = seteq uint %tmp247, 3 ; <bool> [#uses=1] + br bool %tmp248, label %bb252, label %bb253 + +bb252: ; preds = %invcont246, %invcont240 + br label %bb254 + +bb253: ; preds = %invcont246 + br label %bb254 + +bb254: ; preds = %bb253, %bb252 + %iftmp.410.0 = phi bool [ true, %bb252 ], [ false, %bb253 ] ; <bool> [#uses=2] + br bool %iftmp.410.0, label %UserCanceled, label %cond_next258 + +cond_next258: ; preds = %bb254 + invoke fastcc void %_Z9printPageiP8QPainterPK13QTextDocumentRK6QRectFRK7QPointF( int %page.4, %struct.QPainter* %p, %struct.QAbstractTextDocumentLayout* %doc.1, %struct.QRectF* %body, %struct.QPointF* %pageNumberPos ) + to label %invcont261 unwind label %cleanup329 + +invcont261: ; preds = %cond_next258 + %tmp263 = add int %pageCopies.0, -1 ; <int> [#uses=1] + %tmp265 = setgt int %tmp263, %j.4 ; <bool> [#uses=1] + br bool %tmp265, label %cond_true266, label %cond_next270 + +cond_true266: ; preds = %invcont261 + %tmp269 = invoke bool %_ZN8QPrinter7newPageEv( %struct.QPrinter* %printer ) + to label %cond_next270 unwind label %cleanup329 ; <bool> [#uses=0] + +cond_next270: ; preds = %cond_true266, %invcont261 + %tmp272 = add int %j.4, 1 ; <int> [#uses=1] + br label %bb273 + +bb273: ; preds = %cond_next270, %bb237 + %iftmp.410.1 = phi bool [ %iftmp.410.4, %bb237 ], [ %iftmp.410.0, %cond_next270 ] ; <bool> [#uses=2] + %j.4 = phi int [ 0, %bb237 ], [ %tmp272, %cond_next270 ] ; <int> [#uses=3] + %tmp276 = setlt int %j.4, %pageCopies.0 ; <bool> [#uses=1] + br bool %tmp276, label %cond_true277, label %bb280 + +cond_true277: ; preds = %bb273 + %tmp241 = invoke uint %_ZNK8QPrinter12printerStateEv( %struct.QPrinter* %printer ) + to label %invcont240 unwind label %cleanup329 ; <uint> [#uses=1] + +bb280: ; preds = %bb273 + %tmp283 = seteq int %page.4, %toPage.2 ; <bool> [#uses=1] + br bool %tmp283, label %bb297, label %cond_next285 + +cond_next285: ; preds = %bb280 + br bool %ascending.1, label %cond_true287, label %cond_false290 + +cond_true287: ; preds = %cond_next285 + %tmp289 = add int %page.4, 1 ; <int> [#uses=1] + br label %cond_next293 + +cond_false290: ; preds = %cond_next285 + %tmp292 = add int %page.4, -1 ; <int> [#uses=1] + br label %cond_next293 + +cond_next293: ; preds = %cond_false290, %cond_true287 + %page.3 = phi int [ %tmp289, %cond_true287 ], [ %tmp292, %cond_false290 ] ; <int> [#uses=1] + %tmp296 = invoke bool %_ZN8QPrinter7newPageEv( %struct.QPrinter* %printer ) + to label %bb237 unwind label %cleanup329 ; <bool> [#uses=0] + +bb297: ; preds = %bb280 + %tmp299 = add int %docCopies.0, -1 ; <int> [#uses=1] + %tmp301 = setgt int %tmp299, %i.1 ; <bool> [#uses=1] + br bool %tmp301, label %cond_true302, label %cond_next306 + +cond_true302: ; preds = %bb297 + %tmp305 = invoke bool %_ZN8QPrinter7newPageEv( %struct.QPrinter* %printer ) + to label %cond_next306 unwind label %cleanup329 ; <bool> [#uses=0] + +cond_next306: ; preds = %cond_true302, %bb297 + %tmp308 = add int %i.1, 1 ; <int> [#uses=1] + br label %bb309 + +bb309: ; preds = %cond_next306, %cond_next234 + %iftmp.410.5 = phi bool [ undef, %cond_next234 ], [ %iftmp.410.1, %cond_next306 ] ; <bool> [#uses=1] + %i.1 = phi int [ 0, %cond_next234 ], [ %tmp308, %cond_next306 ] ; <int> [#uses=3] + %tmp312 = setlt int %i.1, %docCopies.0 ; <bool> [#uses=1] + br bool %tmp312, label %cond_true313, label %UserCanceled + +cond_true313: ; preds = %bb309 + br label %bb237 + +UserCanceled: ; preds = %bb309, %bb254 + %tmp318 = seteq %struct.QAbstractTextDocumentLayout* %clonedDoc.1, null ; <bool> [#uses=1] + br bool %tmp318, label %cleanup327, label %cond_true319 + +cond_true319: ; preds = %UserCanceled + %tmp = getelementptr %struct.QAbstractTextDocumentLayout* %clonedDoc.1, int 0, uint 0, uint 0 ; <int (...)***> [#uses=1] + %tmp = load int (...)*** %tmp ; <int (...)**> [#uses=1] + %tmp322 = getelementptr int (...)** %tmp, int 4 ; <int (...)**> [#uses=1] + %tmp = load int (...)** %tmp322 ; <int (...)*> [#uses=1] + %tmp = cast int (...)* %tmp to void (%struct.QAbstractTextDocumentLayout*)* ; <void (%struct.QAbstractTextDocumentLayout*)*> [#uses=1] + invoke void %tmp( %struct.QAbstractTextDocumentLayout* %clonedDoc.1 ) + to label %cleanup327 unwind label %cleanup329 + +cleanup327: ; preds = %cond_true319, %UserCanceled + call void %_ZN8QPainterD1Ev( %struct.QPainter* %p ) + ret void + +cleanup328: ; preds = %invcont + call void %_ZN8QPainterD1Ev( %struct.QPainter* %p ) + ret void + +cleanup329: ; preds = %cond_true319, %cond_true302, %cond_next293, %cond_true277, %cond_true266, %cond_next258, %cond_next244, %cond_next225, %cond_true220, %invcont210, %cond_next208, %cond_false204, %cond_true200, %cond_next194, %cleanup192, %cleanup192, %cleanup190, %invcont106, %invcont104, %invcont103, %invcont100, %invcont98, %invcont94, %cond_false, %invcont83, %invcont79, %invcont57, %invcont51, %invcont45, %cond_next42, %invcont37, %cond_true35, %invcont29, %invcont25, %cond_true24, %cond_next, %entry + call void %_ZN8QPainterD1Ev( %struct.QPainter* %p ) + unwind +} + +declare void %_ZN6QSizeFC1Edd(%struct.QPointF*, double, double) + +declare bool %_ZNK6QSizeF7isValidEv(%struct.QPointF*) + +declare double %_ZNK6QSizeF5widthEv(%struct.QPointF*) + +declare double %_ZNK6QSizeF6heightEv(%struct.QPointF*) + +declare double* %_ZN6QSizeF6rwidthEv(%struct.QPointF*) + +declare double* %_ZN6QSizeF7rheightEv(%struct.QPointF*) + +declare %struct.QTextDocumentPrivate* %_ZNK13QTextDocument6d_funcEv(%struct.QAbstractTextDocumentLayout*) + +declare void %_ZN7QPointFC1Ev(%struct.QPointF*) + +declare void %_ZN7QPointFC1Edd(%struct.QPointF*, double, double) + +declare void %_ZN16QTextFrameFormat9setMarginEd(%struct.QTextBlockFormat*, double) + +declare void %_ZN6QRectFC1Edddd(%struct.QRectF*, double, double, double, double) + +declare void %_ZN6QRectFC1ERK7QPointFRK6QSizeF(%struct.QRectF*, %struct.QPointF*, %struct.QPointF*) + +declare double %_ZNK6QRectF5widthEv(%struct.QRectF*) + +declare double %_ZNK6QRectF6heightEv(%struct.QRectF*) + +declare void %_ZNK6QRectF4sizeEv(%struct.QPointF*, %struct.QRectF*) + +declare void %_ZN16QTextFrameFormatD1Ev(%struct.QTextBlockFormat*) + +declare void %_ZNK10QTextFrame11frameFormatEv(%struct.QTextBlockFormat*, %struct.QTextBlockGroup*) + +declare void %_ZN10QTextFrame14setFrameFormatERK16QTextFrameFormat(%struct.QTextBlockGroup*, %struct.QTextBlockFormat*) + +declare int %_ZNK12QPaintDevice5widthEv(%struct.QPaintDevice*) + +declare int %_ZNK12QPaintDevice6heightEv(%struct.QPaintDevice*) + +declare int %_ZNK12QPaintDevice11logicalDpiXEv(%struct.QPaintDevice*) + +declare int %_ZNK12QPaintDevice11logicalDpiYEv(%struct.QPaintDevice*) + +declare %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument5cloneEP7QObject(%struct.QAbstractTextDocumentLayout*, %struct.QObject*) + +declare void %_ZN5QFontD1Ev(%struct.QFont*) + +declare %struct.QAbstractTextDocumentLayout* %_ZNK13QTextDocument14documentLayoutEv(%struct.QAbstractTextDocumentLayout*) + +declare %struct.QTextBlockGroup* %_ZNK13QTextDocument9rootFrameEv(%struct.QAbstractTextDocumentLayout*) + +declare int %_ZNK13QTextDocument9pageCountEv(%struct.QAbstractTextDocumentLayout*) + +declare void %_ZNK13QTextDocument11defaultFontEv(%struct.QFont*, %struct.QAbstractTextDocumentLayout*) + +declare void %_ZN13QTextDocument14setDefaultFontERK5QFont(%struct.QAbstractTextDocumentLayout*, %struct.QFont*) + +declare void %_ZN13QTextDocument11setPageSizeERK6QSizeF(%struct.QAbstractTextDocumentLayout*, %struct.QPointF*) + +declare void %_Z9printPageiP8QPainterPK13QTextDocumentRK6QRectFRK7QPointF(int, %struct.QPainter*, %struct.QAbstractTextDocumentLayout*, %struct.QRectF*, %struct.QPointF*) + +declare void %_ZN12QFontMetricsD1Ev(%struct.QFontMetrics*) + +declare void %_ZN8QPainterC1EP12QPaintDevice(%struct.QPainter*, %struct.QPaintDevice*) + +declare bool %_ZNK8QPainter8isActiveEv(%struct.QPainter*) + +declare int %_Z13qt_defaultDpiv() + +declare %struct.QPaintDevice* %_ZNK27QAbstractTextDocumentLayout11paintDeviceEv(%struct.QAbstractTextDocumentLayout*) + +declare void %_ZN8QPainter5scaleEdd(%struct.QPainter*, double, double) + +declare %struct.QPaintDevice* %_ZNK8QPainter6deviceEv(%struct.QPainter*) + +declare void %_ZN27QAbstractTextDocumentLayout14setPaintDeviceEP12QPaintDevice(%struct.QAbstractTextDocumentLayout*, %struct.QPaintDevice*) + +declare void %_ZN12QFontMetricsC1ERK5QFontP12QPaintDevice(%struct.QFontMetrics*, %struct.QFont*, %struct.QPaintDevice*) + +declare int %_ZNK12QFontMetrics6ascentEv(%struct.QFontMetrics*) + +declare void %_ZN5QFont12setPointSizeEi(%struct.QFont*, int) + +declare bool %_ZNK8QPrinter13collateCopiesEv(%struct.QPrinter*) + +declare int %_ZNK8QPrinter9numCopiesEv(%struct.QPrinter*) + +declare int %_ZNK8QPrinter8fromPageEv(%struct.QPrinter*) + +declare int %_ZNK8QPrinter6toPageEv(%struct.QPrinter*) + +declare uint %_ZNK8QPrinter9pageOrderEv(%struct.QPrinter*) + +declare uint %_ZNK8QPrinter12printerStateEv(%struct.QPrinter*) + +declare bool %_ZN8QPrinter7newPageEv(%struct.QPrinter*) + +declare void %_ZN8QPainterD1Ev(%struct.QPainter*) diff --git a/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll b/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll new file mode 100644 index 0000000..3756fcb --- /dev/null +++ b/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll @@ -0,0 +1,145 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis +; END. +; ModuleID = 'bugpoint-tooptimize.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct.FILE*, int, int, int, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, sbyte*, sbyte*, uint, int, [40 x sbyte] } + %struct._IO_FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct.FILE*, int, int, int, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, sbyte*, sbyte*, uint, int, [40 x sbyte] } + %struct._IO_marker = type { %struct._IO_marker*, %struct.FILE*, int } + %struct.charsequence = type { sbyte*, uint, uint } + %struct.trie_s = type { [26 x %struct.trie_s*], int } +%str = external global [14 x sbyte] ; <[14 x sbyte]*> [#uses=0] +%str = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%str = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%C.0.2294 = external global %struct.charsequence ; <%struct.charsequence*> [#uses=3] +%t = external global %struct.trie_s* ; <%struct.trie_s**> [#uses=0] +%str = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%str = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] + +implementation ; Functions: + +declare void %charsequence_reset(%struct.charsequence*) +declare void %free(sbyte*) +declare void %charsequence_push(%struct.charsequence*, sbyte) +declare sbyte* %charsequence_val(%struct.charsequence*) +declare int %_IO_getc(%struct.FILE*) +declare int %tolower(int) +declare %struct.trie_s* %trie_insert(%struct.trie_s*, sbyte*) +declare int %feof(%struct.FILE*) + +void %addfile(%struct.trie_s* %t, %struct.FILE* %f) { +entry: + %t_addr = alloca %struct.trie_s* ; <%struct.trie_s**> [#uses=2] + %f_addr = alloca %struct.FILE* ; <%struct.FILE**> [#uses=3] + %c = alloca sbyte, align 1 ; <sbyte*> [#uses=7] + %wstate = alloca int, align 4 ; <int*> [#uses=4] + %cs = alloca %struct.charsequence, align 16 ; <%struct.charsequence*> [#uses=7] + %str = alloca sbyte*, align 4 ; <sbyte**> [#uses=3] + "alloca point" = bitcast int 0 to int ; <int> [#uses=0] + store %struct.trie_s* %t, %struct.trie_s** %t_addr + store %struct.FILE* %f, %struct.FILE** %f_addr + store int 0, int* %wstate + %tmp = getelementptr %struct.charsequence* %cs, uint 0, uint 0 ; <sbyte**> [#uses=1] + %tmp1 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 0 ; <sbyte**> [#uses=1] + %tmp = load sbyte** %tmp1 ; <sbyte*> [#uses=1] + store sbyte* %tmp, sbyte** %tmp + %tmp = getelementptr %struct.charsequence* %cs, uint 0, uint 1 ; <uint*> [#uses=1] + %tmp2 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 1 ; <uint*> [#uses=1] + %tmp = load uint* %tmp2 ; <uint> [#uses=1] + store uint %tmp, uint* %tmp + %tmp3 = getelementptr %struct.charsequence* %cs, uint 0, uint 2 ; <uint*> [#uses=1] + %tmp4 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 2 ; <uint*> [#uses=1] + %tmp5 = load uint* %tmp4 ; <uint> [#uses=1] + store uint %tmp5, uint* %tmp3 + br label %bb33 + +bb: ; preds = %bb33 + %tmp = load %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] + %tmp = call int %_IO_getc( %struct.FILE* %tmp ) ; <int> [#uses=1] + %tmp6 = call int %tolower( int %tmp ) ; <int> [#uses=1] + %tmp6 = trunc int %tmp6 to sbyte ; <sbyte> [#uses=1] + store sbyte %tmp6, sbyte* %c + %tmp7 = load int* %wstate ; <int> [#uses=1] + %tmp = icmp ne int %tmp7, 0 ; <bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_false + +cond_true: ; preds = %bb + %tmp = load sbyte* %c ; <sbyte> [#uses=1] + %tmp8 = icmp sle sbyte %tmp, 96 ; <bool> [#uses=1] + br bool %tmp8, label %cond_true9, label %cond_next + +cond_true9: ; preds = %cond_true + br label %bb16 + +cond_next: ; preds = %cond_true + %tmp10 = load sbyte* %c ; <sbyte> [#uses=1] + %tmp11 = icmp sgt sbyte %tmp10, 122 ; <bool> [#uses=1] + br bool %tmp11, label %cond_true12, label %cond_next13 + +cond_true12: ; preds = %cond_next + br label %bb16 + +cond_next13: ; preds = %cond_next + %tmp14 = load sbyte* %c ; <sbyte> [#uses=1] + %tmp14 = sext sbyte %tmp14 to int ; <int> [#uses=1] + %tmp1415 = trunc int %tmp14 to sbyte ; <sbyte> [#uses=1] + call void %charsequence_push( %struct.charsequence* %cs, sbyte %tmp1415 ) + br label %bb21 + +bb16: ; preds = %cond_true12, %cond_true9 + %tmp17 = call sbyte* %charsequence_val( %struct.charsequence* %cs ) ; <sbyte*> [#uses=1] + store sbyte* %tmp17, sbyte** %str + %tmp = load %struct.trie_s** %t_addr ; <%struct.trie_s*> [#uses=1] + %tmp18 = load sbyte** %str ; <sbyte*> [#uses=1] + %tmp19 = call %struct.trie_s* %trie_insert( %struct.trie_s* %tmp, sbyte* %tmp18 ) ; <%struct.trie_s*> [#uses=0] + %tmp20 = load sbyte** %str ; <sbyte*> [#uses=1] + call void %free( sbyte* %tmp20 ) + store int 0, int* %wstate + br label %bb21 + +bb21: ; preds = %bb16, %cond_next13 + br label %cond_next32 + +cond_false: ; preds = %bb + %tmp22 = load sbyte* %c ; <sbyte> [#uses=1] + %tmp23 = icmp sgt sbyte %tmp22, 96 ; <bool> [#uses=1] + br bool %tmp23, label %cond_true24, label %cond_next31 + +cond_true24: ; preds = %cond_false + %tmp25 = load sbyte* %c ; <sbyte> [#uses=1] + %tmp26 = icmp sle sbyte %tmp25, 122 ; <bool> [#uses=1] + br bool %tmp26, label %cond_true27, label %cond_next30 + +cond_true27: ; preds = %cond_true24 + call void %charsequence_reset( %struct.charsequence* %cs ) + %tmp28 = load sbyte* %c ; <sbyte> [#uses=1] + %tmp28 = sext sbyte %tmp28 to int ; <int> [#uses=1] + %tmp2829 = trunc int %tmp28 to sbyte ; <sbyte> [#uses=1] + call void %charsequence_push( %struct.charsequence* %cs, sbyte %tmp2829 ) + store int 1, int* %wstate + br label %cond_next30 + +cond_next30: ; preds = %cond_true27, %cond_true24 + br label %cond_next31 + +cond_next31: ; preds = %cond_next30, %cond_false + br label %cond_next32 + +cond_next32: ; preds = %cond_next31, %bb21 + br label %bb33 + +bb33: ; preds = %cond_next32, %entry + %tmp34 = load %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] + %tmp35 = call int %feof( %struct.FILE* %tmp34 ) ; <int> [#uses=1] + %tmp36 = icmp eq int %tmp35, 0 ; <bool> [#uses=1] + br bool %tmp36, label %bb, label %bb37 + +bb37: ; preds = %bb33 + br label %return + +return: ; preds = %bb37 + ret void +} + diff --git a/test/Transforms/SimplifyCFG/BrUnwind.ll b/test/Transforms/SimplifyCFG/BrUnwind.ll new file mode 100644 index 0000000..73bd975 --- /dev/null +++ b/test/Transforms/SimplifyCFG/BrUnwind.ll @@ -0,0 +1,14 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {br label} + +void %test(bool %C) { + br bool %C, label %A, label %B +A: + call void %test(bool %C) + br label %X +B: + call void %test(bool %C) + br label %X +X: + unwind +} diff --git a/test/Transforms/SimplifyCFG/DeadSetCC.ll b/test/Transforms/SimplifyCFG/DeadSetCC.ll new file mode 100644 index 0000000..ea215e3 --- /dev/null +++ b/test/Transforms/SimplifyCFG/DeadSetCC.ll @@ -0,0 +1,27 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {icmp eq} + +; Check that simplifycfg deletes a dead 'seteq' instruction when it +; folds a conditional branch into a switch instruction. + +declare void %foo() +declare void %bar() + +void %testcfg(uint %V) { + %C = seteq uint %V, 18 + %D = seteq uint %V, 180 + %E = or bool %C, %D + br bool %E, label %L1, label %Sw +Sw: + switch uint %V, label %L1 [ + uint 15, label %L2 + uint 16, label %L2 + ] +L1: + call void %foo() + ret void +L2: + call void %bar() + ret void +} + diff --git a/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll b/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll new file mode 100644 index 0000000..3c1f141 --- /dev/null +++ b/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll @@ -0,0 +1,18 @@ +; Test merging of blocks with phi nodes. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep N: +; + +int %test(bool %a) { +Q: + br bool %a, label %N, label %M +N: + br label %M +M: + ; It's ok to merge N and M because the incoming values for W are the + ; same for both cases... + %W = phi int [2, %N], [2, %Q] + %R = add int %W, 1 + ret int %R +} + diff --git a/test/Transforms/SimplifyCFG/HoistCode.ll b/test/Transforms/SimplifyCFG/HoistCode.ll new file mode 100644 index 0000000..b817477 --- /dev/null +++ b/test/Transforms/SimplifyCFG/HoistCode.ll @@ -0,0 +1,11 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + +void %foo(bool %C, int* %P) { + br bool %C, label %T, label %F +T: + store int 7, int* %P + ret void +F: + store int 7, int* %P + ret void +} diff --git a/test/Transforms/SimplifyCFG/InvokeEliminate.ll b/test/Transforms/SimplifyCFG/InvokeEliminate.ll new file mode 100644 index 0000000..89d76a8 --- /dev/null +++ b/test/Transforms/SimplifyCFG/InvokeEliminate.ll @@ -0,0 +1,18 @@ +; This testcase checks to see if the simplifycfg pass is converting invoke +; instructions to call instructions if the handler just rethrows the exception. + +; If this test is successful, the function should be reduced to 'call; ret' + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not egrep {\\(invoke\\)|\\(br\\)} + +declare void %bar() + +int %test() { + invoke void %bar() to label %Ok except label %Rethrow +Ok: + ret int 0 +Rethrow: + unwind +} + diff --git a/test/Transforms/SimplifyCFG/PhiBlockMerge.ll b/test/Transforms/SimplifyCFG/PhiBlockMerge.ll new file mode 100644 index 0000000..7b24426 --- /dev/null +++ b/test/Transforms/SimplifyCFG/PhiBlockMerge.ll @@ -0,0 +1,23 @@ +; Test merging of blocks that only have PHI nodes in them +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep N: +; + +int %test(bool %a, bool %b) { + br bool %a, label %M, label %O + +O: + br bool %b, label %N, label %Q +Q: + br label %N +N: + %Wp = phi int [0, %O], [1, %Q] + ; This block should be foldable into M + br label %M + +M: + %W = phi int [%Wp, %N], [2, %0] + %R = add int %W, 1 + ret int %R +} + diff --git a/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll b/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll new file mode 100644 index 0000000..01060ed --- /dev/null +++ b/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll @@ -0,0 +1,21 @@ +; Test merging of blocks that only have PHI nodes in them. This tests the case +; where the mergedinto block doesn't have any PHI nodes, and is in fact +; dominated by the block-to-be-eliminated +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep N: +; + +int %test(bool %a, bool %b) { + br bool %b, label %N, label %Q +Q: + br label %N +N: + %W = phi int [0, %0], [1, %Q] + ; This block should be foldable into M + br label %M + +M: + %R = add int %W, 1 + ret int %R +} + diff --git a/test/Transforms/SimplifyCFG/PhiEliminate.ll b/test/Transforms/SimplifyCFG/PhiEliminate.ll new file mode 100644 index 0000000..ef2433c --- /dev/null +++ b/test/Transforms/SimplifyCFG/PhiEliminate.ll @@ -0,0 +1,38 @@ +; Test a bunch of cases where the cfg simplification code should +; be able to fold PHI nodes into computation in common cases. Folding the PHI +; nodes away allows the branches to be eliminated, performing a simple form of +; 'if conversion'. + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis > %t.xform +; RUN: not grep phi %t.xform +; RUN: grep ret %t.xform + +declare void %use(bool) +declare void %use(int) + + +void %test2(bool %c, bool %d, int %V, int %V2) { + br bool %d, label %X, label %F +X: + br bool %c, label %T, label %F +T: + br label %F +F: + %B1 = phi bool [true, %0], [false, %T], [false, %X] + %I7 = phi int [%V, %0], [%V2, %T], [%V2, %X] + call void %use(bool %B1) + call void %use(int %I7) + ret void +} + +void %test(bool %c, int %V, int %V2) { + br bool %c, label %T, label %F +T: + br label %F +F: + %B1 = phi bool [true, %0], [false, %T] + %I6 = phi int [%V, %0], [0, %T] + call void %use(bool %B1) + call void %use(int %I6) + ret void +} diff --git a/test/Transforms/SimplifyCFG/PhiEliminate2.ll b/test/Transforms/SimplifyCFG/PhiEliminate2.ll new file mode 100644 index 0000000..fb00a13 --- /dev/null +++ b/test/Transforms/SimplifyCFG/PhiEliminate2.ll @@ -0,0 +1,15 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + +int %test(bool %C, int %V1, int %V2) { +entry: + br bool %C, label %then, label %Cont + +then: + %V3 = or int %V2, %V1 + br label %Cont +Cont: + %V4 = phi int [%V1, %entry], [%V3, %then] + call int %test(bool false, int 0, int 0) ;; don't fold into preds + ret int %V1 +} + diff --git a/test/Transforms/SimplifyCFG/PhiNoEliminate.ll b/test/Transforms/SimplifyCFG/PhiNoEliminate.ll new file mode 100644 index 0000000..4535541 --- /dev/null +++ b/test/Transforms/SimplifyCFG/PhiNoEliminate.ll @@ -0,0 +1,30 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep select + +;; The PHI node in this example should not be turned into a select, as we are +;; not able to ifcvt the entire block. As such, converting to a select just +;; introduces inefficiency without saving copies. + +int %bar(bool %C) { +entry: + br bool %C, label %then, label %endif + +then: + %tmp.3 = call int %qux() + br label %endif + +endif: + %R = phi int [123, %entry], [12312, %then] + ;; stuff to disable tail duplication + call int %qux() + call int %qux() + call int %qux() + call int %qux() + call int %qux() + call int %qux() + call int %qux() + ret int %R +} + +declare int %qux() + diff --git a/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll b/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll new file mode 100644 index 0000000..6ab1621 --- /dev/null +++ b/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll @@ -0,0 +1,33 @@ +; The unify-function-exit-nodes pass often makes basic blocks that just contain +; a PHI node and a return. Make sure the simplify cfg can straighten out this +; important case. This is basically the most trivial form of tail-duplication. + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {br label} + +int %test(bool %B, int %A, int %B) { + br bool %B, label %T, label %F +T: + br label %ret +F: + br label %ret +ret: + %X = phi int [%A, %F], [%B, %T] + ret int %X +} + +; Make sure it's willing to move unconditional branches to return instructions +; as well, even if the return block is shared and the source blocks are +; non-empty. +int %test2(bool %B, int %A, int %B) { + br bool %B, label %T, label %F +T: + call int %test(bool true, int 5, int 8) + br label %ret +F: + call int %test(bool true, int 5, int 8) + br label %ret +ret: + ret int %A +} + diff --git a/test/Transforms/SimplifyCFG/UnreachableEliminate.ll b/test/Transforms/SimplifyCFG/UnreachableEliminate.ll new file mode 100644 index 0000000..22cd3d4 --- /dev/null +++ b/test/Transforms/SimplifyCFG/UnreachableEliminate.ll @@ -0,0 +1,29 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep unreachable + +void %test1(bool %C, bool* %BP) { + br bool %C, label %T, label %F +T: + store bool %C, bool* %BP ;; dead + unreachable +F: + ret void +} + +void %test2() { + invoke void %test2() to label %N unwind label %U +U: + unreachable +N: + ret void +} + +int %test3(int %v) { + switch int %v, label %default [ int 1, label %U + int 2, label %T] +default: + ret int 1 +U: + unreachable +T: + ret int 2 +} diff --git a/test/Transforms/SimplifyCFG/basictest.ll b/test/Transforms/SimplifyCFG/basictest.ll new file mode 100644 index 0000000..18fa897 --- /dev/null +++ b/test/Transforms/SimplifyCFG/basictest.ll @@ -0,0 +1,24 @@ +; Test CFG simplify removal of branch instructions... +; +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + + +void "test1"() { + br label %BB1 +BB1: + ret void +} + +void "test2"() { + ret void +BB1: + ret void +} + +void "test3"(bool %T) { + br bool %T, label %BB1, label %BB1 +BB1: + ret void +} + + diff --git a/test/Transforms/SimplifyCFG/branch-cond-merge.ll b/test/Transforms/SimplifyCFG/branch-cond-merge.ll new file mode 100644 index 0000000..2a93057 --- /dev/null +++ b/test/Transforms/SimplifyCFG/branch-cond-merge.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -instcombine \ +; RUN: -simplifycfg | llvm-dis | not grep call + +declare void %bar() + +void %test(int %X, int %Y) { +entry: + %tmp.2 = setne int %X, %Y + br bool %tmp.2, label %shortcirc_next, label %UnifiedReturnBlock + +shortcirc_next: + %tmp.3 = setne int %X, %Y + br bool %tmp.3, label %UnifiedReturnBlock, label %then + +then: + call void %bar( ) + ret void + +UnifiedReturnBlock: ; preds = %entry, %shortcirc_next + ret void +} + diff --git a/test/Transforms/SimplifyCFG/branch-cond-prop.ll b/test/Transforms/SimplifyCFG/branch-cond-prop.ll new file mode 100644 index 0000000..10270c2 --- /dev/null +++ b/test/Transforms/SimplifyCFG/branch-cond-prop.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep call + +declare void %bar() + +void %test(int %X, int %Y) { +entry: + %tmp.2 = setlt int %X, %Y ; <bool> [#uses=2] + br bool %tmp.2, label %shortcirc_next, label %UnifiedReturnBlock + +shortcirc_next: ; preds = %entry + br bool %tmp.2, label %UnifiedReturnBlock, label %then + +then: ; preds = %shortcirc_next + call void %bar( ) + ret void + +UnifiedReturnBlock: ; preds = %entry, %shortcirc_next + ret void +} + diff --git a/test/Transforms/SimplifyCFG/branch-fold-test.ll b/test/Transforms/SimplifyCFG/branch-fold-test.ll new file mode 100644 index 0000000..3bbb101 --- /dev/null +++ b/test/Transforms/SimplifyCFG/branch-fold-test.ll @@ -0,0 +1,16 @@ +; This test ensures that the simplifycfg pass continues to constant fold +; terminator instructions. + +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | not grep br + +int %test(int %A, int %B) { +J: + %C = add int %A, 12 + br bool true, label %L, label %K ; K is dead! +L: + %D = add int %C, %B + ret int %D +K: + %E = add int %C, %B + ret int %E +} diff --git a/test/Transforms/SimplifyCFG/branch-fold.ll b/test/Transforms/SimplifyCFG/branch-fold.ll new file mode 100644 index 0000000..f13f826 --- /dev/null +++ b/test/Transforms/SimplifyCFG/branch-fold.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | grep {br i1} | wc -l | grep 1 + +void %test(int* %P, int* %Q, bool %A, bool %B) { + br bool %A, label %a, label %b ;; fold the two branches into one +a: + br bool %B, label %b, label %c +b: + store int 123, int* %P + ret void +c: + ret void +} diff --git a/test/Transforms/SimplifyCFG/branch-phi-thread.ll b/test/Transforms/SimplifyCFG/branch-phi-thread.ll new file mode 100644 index 0000000..e370978 --- /dev/null +++ b/test/Transforms/SimplifyCFG/branch-phi-thread.ll @@ -0,0 +1,65 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -adce | llvm-dis | \ +; RUN: not grep {call void %f1} +; END. + +declare void %f1() +declare void %f2() +declare void %f3() +declare void %f4() + +implementation + +int %test1(int %X, bool %D) { +E: + %C = seteq int %X, 0 + br bool %C, label %T, label %F +T: + br bool %C, label %B, label %A +A: + call void %f1() + br bool %D, label %T, label %F +B: + call void %f2() + ret int 345 +F: + call void %f3() + ret int 123 +} + +int %test2(int %X, bool %D) { +E: + %C = seteq int %X, 0 + br bool %C, label %T, label %F +T: + %P = phi bool [true, %E], [%C, %A] + br bool %P, label %B, label %A +A: + call void %f1() + br bool %D, label %T, label %F +B: + call void %f2() + ret int 345 +F: + call void %f3() + ret int 123 +} + +int %test3(int %X, bool %D, int* %AP, int* %BP) { +E: + %C = seteq int %X, 0 + br bool %C, label %T, label %F +T: + call void %f3() ;; Inst in block. + %XX = load int* %AP + store int %XX, int* %BP + br bool %C, label %B, label %A +A: + call void %f1() + br bool %D, label %T, label %F +B: + call void %f2() + ret int 345 +F: + call void %f3() + ret int 123 +} diff --git a/test/Transforms/SimplifyCFG/dg.exp b/test/Transforms/SimplifyCFG/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/SimplifyCFG/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/SimplifyCFG/hoist-common-code.ll b/test/Transforms/SimplifyCFG/hoist-common-code.ll new file mode 100644 index 0000000..482c5aa --- /dev/null +++ b/test/Transforms/SimplifyCFG/hoist-common-code.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br +declare void %bar(int) + +void %test(bool %P, int* %Q) { + br bool %P, label %T, label %F +T: + store int 1, int* %Q + %A = load int* %Q + call void %bar(int %A) + ret void +F: + store int 1, int* %Q + %B = load int* %Q + call void %bar(int %B) + ret void +} + diff --git a/test/Transforms/SimplifyCFG/return-merge.ll b/test/Transforms/SimplifyCFG/return-merge.ll new file mode 100644 index 0000000..cbcfddb --- /dev/null +++ b/test/Transforms/SimplifyCFG/return-merge.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + +int %test1(bool %C) { +entry: + br bool %C, label %T, label %F +T: + ret int 1 +F: + ret int 0 +} + +void %test2(bool %C) { + br bool %C, label %T, label %F +T: + ret void +F: + ret void +} diff --git a/test/Transforms/SimplifyCFG/switch-simplify-crash.ll b/test/Transforms/SimplifyCFG/switch-simplify-crash.ll new file mode 100644 index 0000000..096f2ae --- /dev/null +++ b/test/Transforms/SimplifyCFG/switch-simplify-crash.ll @@ -0,0 +1,153 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg -disable-output + + +void %NewExtractNames() { +entry: + br bool false, label %endif.0, label %then.0 + +then.0: ; preds = %entry + br bool false, label %shortcirc_next.i, label %shortcirc_done.i + +shortcirc_next.i: ; preds = %then.0 + br label %shortcirc_done.i + +shortcirc_done.i: ; preds = %shortcirc_next.i, %then.0 + br bool false, label %then.0.i, label %else.0.i + +then.0.i: ; preds = %shortcirc_done.i + br label %NewBase.exit + +else.0.i: ; preds = %shortcirc_done.i + br bool false, label %endif.0.i, label %else.1.i + +else.1.i: ; preds = %else.0.i + br bool false, label %endif.0.i, label %else.2.i + +else.2.i: ; preds = %else.1.i + br label %NewBase.exit + +endif.0.i: ; preds = %else.1.i, %else.0.i + br label %NewBase.exit + +NewBase.exit: ; preds = %endif.0.i, %else.2.i, %then.0.i + br label %endif.0 + +endif.0: ; preds = %NewBase.exit, %entry + %tmp.32.mask = and uint 0, 31 ; <uint> [#uses=1] + switch uint %tmp.32.mask, label %label.9 [ + uint 16, label %loopentry.2 + uint 15, label %loopentry.2 + uint 14, label %loopentry.2 + uint 13, label %loopentry.2 + uint 10, label %loopentry.2 + uint 20, label %loopentry.1 + uint 19, label %loopentry.1 + uint 2, label %loopentry.0 + uint 0, label %switchexit + ] + +loopentry.0: ; preds = %endif.1, %endif.0 + br bool false, label %no_exit.0, label %switchexit + +no_exit.0: ; preds = %loopentry.0 + br bool false, label %then.1, label %else.1 + +then.1: ; preds = %no_exit.0 + br label %endif.1 + +else.1: ; preds = %no_exit.0 + br bool false, label %shortcirc_next.0, label %shortcirc_done.0 + +shortcirc_next.0: ; preds = %else.1 + br label %shortcirc_done.0 + +shortcirc_done.0: ; preds = %shortcirc_next.0, %else.1 + br bool false, label %then.2, label %endif.2 + +then.2: ; preds = %shortcirc_done.0 + br label %endif.2 + +endif.2: ; preds = %then.2, %shortcirc_done.0 + br label %endif.1 + +endif.1: ; preds = %endif.2, %then.1 + br label %loopentry.0 + +loopentry.1: ; preds = %endif.3, %endif.0, %endif.0 + br bool false, label %no_exit.1, label %switchexit + +no_exit.1: ; preds = %loopentry.1 + br bool false, label %then.3, label %else.2 + +then.3: ; preds = %no_exit.1 + br label %endif.3 + +else.2: ; preds = %no_exit.1 + br bool false, label %shortcirc_next.1, label %shortcirc_done.1 + +shortcirc_next.1: ; preds = %else.2 + br label %shortcirc_done.1 + +shortcirc_done.1: ; preds = %shortcirc_next.1, %else.2 + br bool false, label %then.4, label %endif.4 + +then.4: ; preds = %shortcirc_done.1 + br label %endif.4 + +endif.4: ; preds = %then.4, %shortcirc_done.1 + br label %endif.3 + +endif.3: ; preds = %endif.4, %then.3 + br label %loopentry.1 + +loopentry.2: ; preds = %endif.5, %endif.0, %endif.0, %endif.0, %endif.0, %endif.0 + %i.3 = phi int [ 0, %endif.5 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ], [ 0, %endif.0 ] ; <int> [#uses=1] + %tmp.158 = setlt int %i.3, 0 ; <bool> [#uses=1] + br bool %tmp.158, label %no_exit.2, label %switchexit + +no_exit.2: ; preds = %loopentry.2 + br bool false, label %shortcirc_next.2, label %shortcirc_done.2 + +shortcirc_next.2: ; preds = %no_exit.2 + br label %shortcirc_done.2 + +shortcirc_done.2: ; preds = %shortcirc_next.2, %no_exit.2 + br bool false, label %then.5, label %endif.5 + +then.5: ; preds = %shortcirc_done.2 + br label %endif.5 + +endif.5: ; preds = %then.5, %shortcirc_done.2 + br label %loopentry.2 + +label.9: ; preds = %endif.0 + br bool false, label %then.6, label %endif.6 + +then.6: ; preds = %label.9 + br label %endif.6 + +endif.6: ; preds = %then.6, %label.9 + store int 0, int* null + br label %switchexit + +switchexit: ; preds = %endif.6, %loopentry.2, %loopentry.1, %loopentry.0, %endif.0 + br bool false, label %endif.7, label %then.7 + +then.7: ; preds = %switchexit + br bool false, label %shortcirc_next.3, label %shortcirc_done.3 + +shortcirc_next.3: ; preds = %then.7 + br label %shortcirc_done.3 + +shortcirc_done.3: ; preds = %shortcirc_next.3, %then.7 + br bool false, label %then.8, label %endif.8 + +then.8: ; preds = %shortcirc_done.3 + br label %endif.8 + +endif.8: ; preds = %then.8, %shortcirc_done.3 + br label %endif.7 + +endif.7: ; preds = %endif.8, %switchexit + ret void +} diff --git a/test/Transforms/SimplifyCFG/switch_create.ll b/test/Transforms/SimplifyCFG/switch_create.ll new file mode 100644 index 0000000..2d72291 --- /dev/null +++ b/test/Transforms/SimplifyCFG/switch_create.ll @@ -0,0 +1,48 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br + +declare void %foo1() +declare void %foo2() + +void %test1(uint %V) { + %C1 = seteq uint %V, 4 + %C2 = seteq uint %V, 17 + %CN = or bool %C1, %C2 + br bool %CN, label %T, label %F +T: + call void %foo1() + ret void +F: + call void %foo2() + ret void +} + + +void %test2(int %V) { + %C1 = setne int %V, 4 + %C2 = setne int %V, 17 + %CN = and bool %C1, %C2 + br bool %CN, label %T, label %F +T: + call void %foo1() + ret void +F: + call void %foo2() + ret void +} + + +void %test3(int %V) { + %C1 = seteq int %V, 4 + br bool %C1, label %T, label %N +N: + %C2 = seteq int %V, 17 + br bool %C2, label %T, label %F +T: + call void %foo1() + ret void +F: + call void %foo2() + ret void +} + + diff --git a/test/Transforms/SimplifyCFG/switch_formation.ll b/test/Transforms/SimplifyCFG/switch_formation.ll new file mode 100644 index 0000000..b372ca4b --- /dev/null +++ b/test/Transforms/SimplifyCFG/switch_formation.ll @@ -0,0 +1,37 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep br +; END. + +bool %_ZN4llvm11SetCondInst7classofEPKNS_11InstructionE({uint, uint}* %I) { +entry: + %tmp.1.i = getelementptr {uint, uint}* %I, long 0, uint 1 + %tmp.2.i = load uint* %tmp.1.i + %tmp.2 = seteq uint %tmp.2.i, 14 + br bool %tmp.2, label %shortcirc_done.4, label %shortcirc_next.0 + +shortcirc_next.0: ; preds = %entry + %tmp.6 = seteq uint %tmp.2.i, 15 ; <bool> [#uses=1] + br bool %tmp.6, label %shortcirc_done.4, label %shortcirc_next.1 + +shortcirc_next.1: ; preds = %shortcirc_next.0 + %tmp.11 = seteq uint %tmp.2.i, 16 ; <bool> [#uses=1] + br bool %tmp.11, label %shortcirc_done.4, label %shortcirc_next.2 + +shortcirc_next.2: ; preds = %shortcirc_next.1 + %tmp.16 = seteq uint %tmp.2.i, 17 ; <bool> [#uses=1] + br bool %tmp.16, label %shortcirc_done.4, label %shortcirc_next.3 + +shortcirc_next.3: ; preds = %shortcirc_next.2 + %tmp.21 = seteq uint %tmp.2.i, 18 ; <bool> [#uses=1] + br bool %tmp.21, label %shortcirc_done.4, label %shortcirc_next.4 + +shortcirc_next.4: ; preds = %shortcirc_next.3 + %tmp.26 = seteq uint %tmp.2.i, 19 ; <bool> [#uses=1] + br label %UnifiedReturnBlock + +shortcirc_done.4: ; preds = %entry, %shortcirc_next.0, %shortcirc_next.1, %shortcirc_next.2, %shortcirc_next.3 + br label %UnifiedReturnBlock + +UnifiedReturnBlock: ; preds = %shortcirc_next.4, %shortcirc_done.4 + %UnifiedRetVal = phi bool [ %tmp.26, %shortcirc_next.4 ], [ true, %shortcirc_done.4 ] ; <bool> [#uses=1] + ret bool %UnifiedRetVal +} diff --git a/test/Transforms/SimplifyCFG/switch_switch_fold.ll b/test/Transforms/SimplifyCFG/switch_switch_fold.ll new file mode 100644 index 0000000..5403955 --- /dev/null +++ b/test/Transforms/SimplifyCFG/switch_switch_fold.ll @@ -0,0 +1,47 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: grep switch | wc -l | grep 1 + +; Test that a switch going to a switch on the same value can be merged. All +; three switches in this example can be merged into one big one. + +declare void %foo1() +declare void %foo2() +declare void %foo3() +declare void %foo4() + +void %test1(uint %V) { + switch uint %V, label %F [ + uint 4, label %T + uint 17, label %T + uint 5, label %T + uint 1234, label %F + ] + +T: + switch uint %V, label %F [ + uint 4, label %A + uint 17, label %B + uint 42, label %C + ] +A: + call void %foo1() + ret void + +B: + call void %foo2() + ret void +C: + call void %foo3() + ret void + +F: + switch uint %V, label %F [ + uint 4, label %B + uint 18, label %B + uint 42, label %D + ] +D: + call void %foo4() + ret void +} + diff --git a/test/Transforms/SimplifyCFG/switch_thread.ll b/test/Transforms/SimplifyCFG/switch_thread.ll new file mode 100644 index 0000000..f120851 --- /dev/null +++ b/test/Transforms/SimplifyCFG/switch_thread.ll @@ -0,0 +1,79 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | \ +; RUN: not grep {call void %DEAD} + +; Test that we can thread a simple known condition through switch statements. + +declare void %foo1() +declare void %foo2() +declare void %DEAD() + +void %test1(uint %V) { + switch uint %V, label %A [ + uint 4, label %T + uint 17, label %Done + uint 1234, label %A + ] + +T: ;; V == 4 if we get here. + call void %foo1() + ;; This switch is always statically determined. + switch uint %V, label %A2 [ + uint 4, label %B + uint 17, label %C + uint 42, label %C + ] +A2: + call void %DEAD() + call void %DEAD() + %cond2 = seteq uint %V, 4 ;; always false + br bool %cond2, label %Done, label %C + +A: + call void %foo1() + %cond = setne uint %V, 4 ;; always true + br bool %cond, label %Done, label %C + + +Done: + ret void + +B: + call void %foo2() + %cond3 = seteq uint %V, 4 ;; always true + br bool %cond3, label %Done, label %C +C: + call void %DEAD() + ret void +} + +void %test2(uint %V) { + switch uint %V, label %A [ + uint 4, label %T + uint 17, label %D + uint 1234, label %E + ] + +A: ;; V != 4, 17, 1234 here. + call void %foo1() + ;; This switch is always statically determined. + switch uint %V, label %E [ + uint 4, label %C + uint 17, label %C + uint 42, label %D + ] +C: + call void %DEAD() ;; unreacahble. + ret void +T: + call void %foo1() + call void %foo1() + ret void + +D: + call void %foo1() + ret void + +E: + ret void +} + diff --git a/test/Transforms/SimplifyLibCalls/2005-05-20-sprintf-crash.ll b/test/Transforms/SimplifyLibCalls/2005-05-20-sprintf-crash.ll new file mode 100644 index 0000000..5b4fde8 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/2005-05-20-sprintf-crash.ll @@ -0,0 +1,10 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls -disable-output + +%G = constant [3 x sbyte] c"%s\00" + +declare int %sprintf(sbyte*, sbyte*, ...) + +void %foo(sbyte*%P, int *%X) { + call int(sbyte*,sbyte*, ...)* %sprintf(sbyte* %P, sbyte* getelementptr ([3 x sbyte]* %G, int 0, int 0), int* %X) + ret void +} diff --git a/test/Transforms/SimplifyLibCalls/2007-04-06-strchr-miscompile.ll b/test/Transforms/SimplifyLibCalls/2007-04-06-strchr-miscompile.ll new file mode 100644 index 0000000..5a56d24 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/2007-04-06-strchr-miscompile.ll @@ -0,0 +1,29 @@ +; PR1307 +; RUN: llvm-as < %s | opt -simplify-libcalls -instcombine | llvm-dis > %t +; RUN: grep {@str,.*i64 3} %t +; RUN: grep {@str1,.*i64 7} %t +; RUN: grep {ret i8.*null} %t +; END. + +@str = internal constant [5 x i8] c"foog\00" +@str1 = internal constant [8 x i8] c"blahhh!\00" +@str2 = internal constant [5 x i8] c"Ponk\00" + +define i8* @test1() { + %tmp3 = tail call i8* @strchr( i8* getelementptr ([5 x i8]* @str, i32 0, i32 2), i32 103 ) ; <i8*> [#uses=1] + ret i8* %tmp3 +} + +declare i8* @strchr(i8*, i32) + +define i8* @test2() { + %tmp3 = tail call i8* @strchr( i8* getelementptr ([8 x i8]* @str1, i32 0, i32 2), i32 0 ) ; <i8*> [#uses=1] + ret i8* %tmp3 +} + +define i8* @test3() { +entry: + %tmp3 = tail call i8* @strchr( i8* getelementptr ([5 x i8]* @str2, i32 0, i32 1), i32 80 ) ; <i8*> [#uses=1] + ret i8* %tmp3 +} + diff --git a/test/Transforms/SimplifyLibCalls/ExitInMain.ll b/test/Transforms/SimplifyLibCalls/ExitInMain.ll new file mode 100644 index 0000000..13f1a11 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/ExitInMain.ll @@ -0,0 +1,15 @@ +; Test that the ExitInMainOptimization pass works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: grep -c {ret i32 3} | grep 1 +; END. + +declare void %exit(int) +declare void %exitonly(int) + +implementation ; Functions: + +int %main () { + call void %exitonly ( int 3 ) + call void %exit ( int 3 ) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/FFS.ll b/test/Transforms/SimplifyLibCalls/FFS.ll new file mode 100644 index 0000000..7049b5a --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/FFS.ll @@ -0,0 +1,29 @@ +; Test that the ToAsciiOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*%ffs} + +declare int %ffs(int) +declare int %ffsl(int) +declare int %ffsll(long) + +%non_const = external global int + +implementation ; Functions: + +int %main () { + %arg = load int* %non_const + %val0 = call int %ffs(int %arg) + %val1 = call int %ffs(int 1) + %val2 = call int %ffs(int 2048) + %val3 = call int %ffsl(int 65536) + %val4 = call int %ffsll(long 1024) + %val5 = call int %ffsll(long 17179869184) + %val6 = call int %ffsll(long 1152921504606846976) + %rslt1 = add int %val1, %val2 + %rslt2 = add int %val3, %val4 + %rslt3 = add int %val5, %val6 + %rslt4 = add int %rslt1, %rslt2 + %rslt5 = add int %rslt4, %rslt3 + %rslt6 = add int %rslt5, %val0 + ret int %rslt5 +} diff --git a/test/Transforms/SimplifyLibCalls/FPrintF.ll b/test/Transforms/SimplifyLibCalls/FPrintF.ll new file mode 100644 index 0000000..53b751f --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/FPrintF.ll @@ -0,0 +1,29 @@ +; Test that the FPrintFOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*fprintf} +; + +%struct._IO_FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct._IO_FILE*, int, int, int, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, int, [52 x sbyte] } +%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, int } + +%str = constant [3 x sbyte] c"%s\00" +%chr = constant [3 x sbyte] c"%c\00" +%hello = constant [13 x sbyte] c"hello world\0A\00" +%stdout = external global %struct._IO_FILE* + +declare int %fprintf(%struct._IO_FILE*, sbyte*, ...) + +implementation + +int %foo() +{ +entry: + %tmp.1 = load %struct._IO_FILE** %stdout + %tmp.0 = call int (%struct._IO_FILE*, sbyte*, ...)* %fprintf( %struct._IO_FILE* %tmp.1, sbyte* getelementptr ([13 x sbyte]* %hello, int 0, int 0) ) + %tmp.4 = load %struct._IO_FILE** %stdout + %tmp.3 = call int (%struct._IO_FILE*, sbyte*, ...)* %fprintf( %struct._IO_FILE* %tmp.4, sbyte* getelementptr ([3 x sbyte]* %str, int 0, int 0), sbyte* getelementptr ([13 x sbyte]* %hello, int 0, int 0) ) + %tmp.8 = load %struct._IO_FILE** %stdout + %tmp.7 = call int (%struct._IO_FILE*, sbyte*, ...)* %fprintf( %struct._IO_FILE* %tmp.8, sbyte* getelementptr ([3 x sbyte]* %chr, int 0, int 0), int 33 ) + ret int 0 +} + diff --git a/test/Transforms/SimplifyLibCalls/IsDigit.ll b/test/Transforms/SimplifyLibCalls/IsDigit.ll new file mode 100644 index 0000000..bcdb60c --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/IsDigit.ll @@ -0,0 +1,21 @@ +; Test that the IsDigitOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep call + +declare int %isdigit(int) +declare int %isascii(int) + +implementation ; Functions: + +int %main () { + %val1 = call int %isdigit(int 47) + %val2 = call int %isdigit(int 48) + %val3 = call int %isdigit(int 57) + %val4 = call int %isdigit(int 58) + %rslt1 = add int %val1, %val2 + %rslt2 = add int %val3, %val4 + %sum = add int %rslt1, %rslt2 + %rslt = call int %isdigit(int %sum) + %tmp = call int %isascii(int %rslt) + ret int %tmp +} diff --git a/test/Transforms/SimplifyLibCalls/MemCpy.ll b/test/Transforms/SimplifyLibCalls/MemCpy.ll new file mode 100644 index 0000000..0a99488 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/MemCpy.ll @@ -0,0 +1,22 @@ +; Test that the StrCatOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -simplify-libcalls | \ +; RUN: llvm-dis | not grep {call.*llvm.memcpy.i32} + +declare void %llvm.memcpy.i32(sbyte*,sbyte*,uint,uint) +%h = constant [2 x sbyte] c"h\00" +%hel = constant [4 x sbyte] c"hel\00" +%hello_u = constant [8 x sbyte] c"hello_u\00" + +implementation ; Functions: + +int %main () { + %h_p = getelementptr [2 x sbyte]* %h, int 0, int 0 + %hel_p = getelementptr [4 x sbyte]* %hel, int 0, int 0 + %hello_u_p = getelementptr [8 x sbyte]* %hello_u, int 0, int 0 + %target = alloca [1024 x sbyte] + %target_p = getelementptr [1024 x sbyte]* %target, int 0, int 0 + call void %llvm.memcpy.i32(sbyte* %target_p, sbyte* %h_p, uint 2, uint 2) + call void %llvm.memcpy.i32(sbyte* %target_p, sbyte* %hel_p, uint 4, uint 4) + call void %llvm.memcpy.i32(sbyte* %target_p, sbyte* %hello_u_p, uint 8, uint 8) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/MemMove.ll b/test/Transforms/SimplifyLibCalls/MemMove.ll new file mode 100644 index 0000000..7c89d91 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/MemMove.ll @@ -0,0 +1,22 @@ +; Test that the StrCatOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -constprop -simplify-libcalls | \ +; RUN: llvm-dis | not grep {call.*llvm.memmove.i32} + +declare void %llvm.memmove.i32(sbyte*,sbyte*,uint,uint) +%h = constant [2 x sbyte] c"h\00" +%hel = constant [4 x sbyte] c"hel\00" +%hello_u = constant [8 x sbyte] c"hello_u\00" + +implementation ; Functions: + +int %main () { + %h_p = getelementptr [2 x sbyte]* %h, int 0, int 0 + %hel_p = getelementptr [4 x sbyte]* %hel, int 0, int 0 + %hello_u_p = getelementptr [8 x sbyte]* %hello_u, int 0, int 0 + %target = alloca [1024 x sbyte] + %target_p = getelementptr [1024 x sbyte]* %target, int 0, int 0 + call void %llvm.memmove.i32(sbyte* %target_p, sbyte* %h_p, uint 2, uint 2) + call void %llvm.memmove.i32(sbyte* %target_p, sbyte* %hel_p, uint 4, uint 4) + call void %llvm.memmove.i32(sbyte* %target_p, sbyte* %hello_u_p, uint 8, uint 8) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/MemSet.ll b/test/Transforms/SimplifyLibCalls/MemSet.ll new file mode 100644 index 0000000..dbeef9d --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/MemSet.ll @@ -0,0 +1,19 @@ +; Test that the LLVMMemSetOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*llvm.memset} +; END. + +declare void %llvm.memset.i32(sbyte*,ubyte,uint,uint) + +implementation ; Functions: + +int %main () { + %target = alloca [1024 x sbyte] + %target_p = getelementptr [1024 x sbyte]* %target, int 0, int 0 + call void %llvm.memset.i32(sbyte* %target_p, ubyte 1, uint 0, uint 1) + call void %llvm.memset.i32(sbyte* %target_p, ubyte 1, uint 1, uint 1) + call void %llvm.memset.i32(sbyte* %target_p, ubyte 1, uint 2, uint 2) + call void %llvm.memset.i32(sbyte* %target_p, ubyte 1, uint 4, uint 4) + call void %llvm.memset.i32(sbyte* %target_p, ubyte 1, uint 8, uint 8) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/Pow.ll b/test/Transforms/SimplifyLibCalls/Pow.ll new file mode 100644 index 0000000..773ba1e --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/Pow.ll @@ -0,0 +1,24 @@ +; Testcase for calls to the standard C "pow" function +; +; Equivalent to: http://gcc.gnu.org/ml/gcc-patches/2003-02/msg01786.html +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call double .pow} +; END. + +declare double %pow(double, double) + +double %test1(double %X) { + %Y = call double %pow(double %X, double 0.0) + ret double %Y ; x^0.0 always equals 1.0 +} + +double %test2(double %X) { + %Y = call double %pow(double %X, double -0.0) + ret double %Y ; x^-0.0 always equals 1.0 +} + +double %test3(double %X) { + %Y = call double %pow(double 1.0, double %X) + ret double %Y ; 1.0^x always equals 1.0 +} + diff --git a/test/Transforms/SimplifyLibCalls/Printf.ll b/test/Transforms/SimplifyLibCalls/Printf.ll new file mode 100644 index 0000000..c892f03 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/Printf.ll @@ -0,0 +1,21 @@ +; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | grep putchar +; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*printf} + +@str = internal constant [13 x i8] c"hello world\0A\00" ; <[13 x i8]*> [#uses=1] +@str1 = internal constant [2 x i8] c"h\00" ; <[2 x i8]*> [#uses=1] + +define void @foo() { +entry: + %tmp1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([13 x i8]* @str, i32 0, i32 0) ) ; <i32> [#uses=0] + ret void +} + +declare i32 @printf(i8*, ...) + +define void @bar() { +entry: + %tmp1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([2 x i8]* @str1, i32 0, i32 0) ) ; <i32> [#uses=0] + ret void +} + diff --git a/test/Transforms/SimplifyLibCalls/Puts.ll b/test/Transforms/SimplifyLibCalls/Puts.ll new file mode 100644 index 0000000..795b15c --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/Puts.ll @@ -0,0 +1,27 @@ +; Test that the PutsCatOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*fputs} +; +%struct._IO_FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct._IO_FILE*, int, int, int, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, int, [52 x sbyte] } +%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, int } +%stdout = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=1] + +declare int %fputs(sbyte*, %struct._IO_FILE*) + +%empty = constant [1 x sbyte] c"\00" +%len1 = constant [2 x sbyte] c"A\00" +%long = constant [7 x sbyte] c"hello\0A\00" + +implementation ; Functions: + +int %main() { +entry: + %out = load %struct._IO_FILE** %stdout + %s1 = getelementptr [1 x sbyte]* %empty, int 0, int 0 + %s2 = getelementptr [2 x sbyte]* %len1, int 0, int 0 + %s3 = getelementptr [7 x sbyte]* %long, int 0, int 0 + %a = call int %fputs( sbyte* %s1, %struct._IO_FILE* %out ) + %b = call int %fputs( sbyte* %s2, %struct._IO_FILE* %out ) + %c = call int %fputs( sbyte* %s3, %struct._IO_FILE* %out ) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/SPrintF.ll b/test/Transforms/SimplifyLibCalls/SPrintF.ll new file mode 100644 index 0000000..a8ad369 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/SPrintF.ll @@ -0,0 +1,36 @@ +; Test that the SPrintFOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*sprintf} + +declare int %sprintf(sbyte*,sbyte*,...) +declare int %puts(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%null = constant [1 x sbyte] c"\00" +%null_hello = constant [7 x sbyte] c"\00hello\00" +%fmt1 = constant [3 x sbyte] c"%s\00" +%fmt2 = constant [3 x sbyte] c"%c\00" + +implementation ; Functions: + +int %foo (sbyte* %p) { + %target = alloca [1024 x sbyte] + %target_p = getelementptr [1024 x sbyte]* %target, int 0, int 0 + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %nh_p = getelementptr [7 x sbyte]* %null_hello, int 0, int 0 + %fmt1_p = getelementptr [3 x sbyte]* %fmt1, int 0, int 0 + %fmt2_p = getelementptr [3 x sbyte]* %fmt2, int 0, int 0 + store sbyte 0, sbyte* %target_p + %r1 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %hello_p) + %r2 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %null_p) + %r3 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %nh_p) + %r4 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %fmt1_p, sbyte* %hello_p) + %r4.1 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %fmt1_p, sbyte* %p) + %r5 = call int (sbyte*,sbyte*,...)* %sprintf(sbyte* %target_p, sbyte* %fmt2_p, int 82) + %r6 = add int %r1, %r2 + %r7 = add int %r3, %r6 + %r8 = add int %r5, %r7 + %r9 = add int %r8, %r4 + %r10 = add int %r9, %r4.1 + ret int %r10 +} diff --git a/test/Transforms/SimplifyLibCalls/StrCat.ll b/test/Transforms/SimplifyLibCalls/StrCat.ll new file mode 100644 index 0000000..06bc833 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrCat.ll @@ -0,0 +1,25 @@ +; Test that the StrCatOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*strcat} + +declare sbyte* %strcat(sbyte*,sbyte*) +declare int %puts(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%null = constant [1 x sbyte] c"\00" +%null_hello = constant [7 x sbyte] c"\00hello\00" + +implementation ; Functions: + +int %main () { + %target = alloca [1024 x sbyte] + %arg1 = getelementptr [1024 x sbyte]* %target, int 0, int 0 + store sbyte 0, sbyte* %arg1 + %arg2 = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %rslt1 = call sbyte* %strcat(sbyte* %arg1, sbyte* %arg2) + %arg3 = getelementptr [1 x sbyte]* %null, int 0, int 0 + %rslt2 = call sbyte* %strcat(sbyte* %rslt1, sbyte* %arg3) + %arg4 = getelementptr [7 x sbyte]* %null_hello, int 0, int 0 + %rslt3 = call sbyte* %strcat(sbyte* %rslt2, sbyte* %arg4) + call int %puts(sbyte* %rslt3) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/StrChr.ll b/test/Transforms/SimplifyLibCalls/StrChr.ll new file mode 100644 index 0000000..56e6248 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrChr.ll @@ -0,0 +1,22 @@ +; Test that the StrChrOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*%strchr} + +declare sbyte* %strchr(sbyte*,int) +declare int %puts(sbyte*) +%hello = constant [14 x sbyte] c"hello world\n\00" +%null = constant [1 x sbyte] c"\00" + +implementation ; Functions: + +int %main () { + %hello_p = getelementptr [14 x sbyte]* %hello, int 0, int 0 + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + + %world = call sbyte* %strchr(sbyte* %hello_p, int 119 ) + %ignore = call sbyte* %strchr(sbyte* %null_p, int 119 ) + %len = call int %puts(sbyte* %world) + %index = add int %len, 112 + %result = call sbyte* %strchr(sbyte* %hello_p, int %index) + ret int %index +} diff --git a/test/Transforms/SimplifyLibCalls/StrCmp.ll b/test/Transforms/SimplifyLibCalls/StrCmp.ll new file mode 100644 index 0000000..ba2a4e0 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrCmp.ll @@ -0,0 +1,27 @@ +; Test that the StrCmpOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*strcmp} + +declare int %strcmp(sbyte*,sbyte*) +declare int %puts(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%hell = constant [5 x sbyte] c"hell\00" +%null = constant [1 x sbyte] c"\00" + +implementation ; Functions: + +int %main () { + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %hell_p = getelementptr [5 x sbyte]* %hell, int 0, int 0 + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %temp1 = call int %strcmp(sbyte* %hello_p, sbyte* %hello_p) + %temp2 = call int %strcmp(sbyte* %null_p, sbyte* %null_p) + %temp3 = call int %strcmp(sbyte* %hello_p, sbyte* %null_p) + %temp4 = call int %strcmp(sbyte* %null_p, sbyte* %hello_p) + %temp5 = call int %strcmp(sbyte* %hell_p, sbyte* %hello_p) + %rslt1 = add int %temp1, %temp2 + %rslt2 = add int %rslt1, %temp3 + %rslt3 = add int %rslt2, %temp4 + %rslt4 = add int %rslt3, %temp5 + ret int %rslt4 +} diff --git a/test/Transforms/SimplifyLibCalls/StrCpy.ll b/test/Transforms/SimplifyLibCalls/StrCpy.ll new file mode 100644 index 0000000..481dccf --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrCpy.ll @@ -0,0 +1,25 @@ +; Test that the StrCpyOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*strcpy} + +declare sbyte* %strcpy(sbyte*,sbyte*) +declare int %puts(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%null = constant [1 x sbyte] c"\00" +%null_hello = constant [7 x sbyte] c"\00hello\00" + +implementation ; Functions: + +int %main () { + %target = alloca [1024 x sbyte] + %arg1 = getelementptr [1024 x sbyte]* %target, int 0, int 0 + store sbyte 0, sbyte* %arg1 + %arg2 = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %rslt1 = call sbyte* %strcpy(sbyte* %arg1, sbyte* %arg2) + %arg3 = getelementptr [1 x sbyte]* %null, int 0, int 0 + %rslt2 = call sbyte* %strcpy(sbyte* %rslt1, sbyte* %arg3) + %arg4 = getelementptr [7 x sbyte]* %null_hello, int 0, int 0 + %rslt3 = call sbyte* %strcpy(sbyte* %rslt2, sbyte* %arg4) + call int %puts(sbyte* %rslt3) + ret int 0 +} diff --git a/test/Transforms/SimplifyLibCalls/StrLen.ll b/test/Transforms/SimplifyLibCalls/StrLen.ll new file mode 100644 index 0000000..98a76c8 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrLen.ll @@ -0,0 +1,58 @@ +; Test that the StrCatOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*strlen} + +target datalayout = "e-p:32:32" + +declare uint %strlen(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%null = constant [1 x sbyte] c"\00" +%null_hello = constant [7 x sbyte] c"\00hello\00" + +implementation ; Functions: + +uint %test1() { + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %hello_l = call uint %strlen(sbyte* %hello_p) + ret uint %hello_l +} + +uint %test2() { + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %null_l = call uint %strlen(sbyte* %null_p) + ret uint %null_l +} + +uint %test3() { + %null_hello_p = getelementptr [7 x sbyte]* %null_hello, int 0, int 0 + %null_hello_l = call uint %strlen(sbyte* %null_hello_p) + ret uint %null_hello_l +} + +bool %test4() { + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %hello_l = call uint %strlen(sbyte* %hello_p) + %eq_hello = seteq uint %hello_l, 0 + ret bool %eq_hello +} + +bool %test5() { + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %null_l = call uint %strlen(sbyte* %null_p) + %eq_null = seteq uint %null_l, 0 + ret bool %eq_null +} + +bool %test6() { + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %hello_l = call uint %strlen(sbyte* %hello_p) + %ne_hello = setne uint %hello_l, 0 + ret bool %ne_hello +} + +bool %test7() { + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %null_l = call uint %strlen(sbyte* %null_p) + %ne_null = setne uint %null_l, 0 + ret bool %ne_null +} diff --git a/test/Transforms/SimplifyLibCalls/StrNCmp.ll b/test/Transforms/SimplifyLibCalls/StrNCmp.ll new file mode 100644 index 0000000..7de3410f --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/StrNCmp.ll @@ -0,0 +1,27 @@ +; Test that the StrNCmpOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*strncmp} + +declare int %strncmp(sbyte*,sbyte*,int) +declare int %puts(sbyte*) +%hello = constant [6 x sbyte] c"hello\00" +%hell = constant [5 x sbyte] c"hell\00" +%null = constant [1 x sbyte] c"\00" + +implementation ; Functions: + +int %main () { + %hello_p = getelementptr [6 x sbyte]* %hello, int 0, int 0 + %hell_p = getelementptr [5 x sbyte]* %hell, int 0, int 0 + %null_p = getelementptr [1 x sbyte]* %null, int 0, int 0 + %temp1 = call int %strncmp(sbyte* %hello_p, sbyte* %hello_p,int 5) + %temp2 = call int %strncmp(sbyte* %null_p, sbyte* %null_p,int 0) + %temp3 = call int %strncmp(sbyte* %hello_p, sbyte* %null_p,int 0) + %temp4 = call int %strncmp(sbyte* %null_p, sbyte* %hello_p,int 0) + %temp5 = call int %strncmp(sbyte* %hell_p, sbyte* %hello_p,int 4) + %rslt1 = add int %temp1, %temp2 + %rslt2 = add int %rslt1, %temp3 + %rslt3 = add int %rslt2, %temp4 + %rslt4 = add int %rslt3, %temp5 + ret int %rslt4 +} diff --git a/test/Transforms/SimplifyLibCalls/ToAscii.ll b/test/Transforms/SimplifyLibCalls/ToAscii.ll new file mode 100644 index 0000000..0bc2664 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/ToAscii.ll @@ -0,0 +1,22 @@ +; Test that the ToAsciiOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*toascii} + +declare int %toascii(int) + +implementation ; Functions: + +int %main () { + %val1 = call int %toascii(int 1) + %val2 = call int %toascii(int 0) + %val3 = call int %toascii(int 127) + %val4 = call int %toascii(int 128) + %val5 = call int %toascii(int 255) + %val6 = call int %toascii(int 256) + %rslt1 = add int %val1, %val2 + %rslt2 = add int %val3, %val4 + %rslt3 = add int %val5, %val6 + %rslt4 = add int %rslt1, %rslt2 + %rslt5 = add int %rslt4, %rslt3 + ret int %rslt5 +} diff --git a/test/Transforms/SimplifyLibCalls/dg.exp b/test/Transforms/SimplifyLibCalls/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/SimplifyLibCalls/floor.ll b/test/Transforms/SimplifyLibCalls/floor.ll new file mode 100644 index 0000000..2b940fd --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/floor.ll @@ -0,0 +1,34 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis > %t +; RUN: not grep {call.*floor(} %t +; RUN: grep {call.*floorf(} %t +; RUN: not grep {call.*ceil(} %t +; RUN: grep {call.*ceilf(} %t +; RUN: not grep {call.*nearbyint(} %t +; RUN: grep {call.*nearbyintf(} %t +; XFAIL: sparc + +declare double %floor(double) +declare double %ceil(double) +declare double %nearbyint(double) + +float %test_floor(float %C) { + %D = cast float %C to double + %E = call double %floor(double %D) ; --> floorf + %F = cast double %E to float + ret float %F +} + +float %test_ceil(float %C) { + %D = cast float %C to double + %E = call double %ceil(double %D) ; --> ceilf + %F = cast double %E to float + ret float %F +} + +float %test_nearbyint(float %C) { + %D = cast float %C to double + %E = call double %nearbyint(double %D) ; --> floorf + %F = cast double %E to float + ret float %F +} + diff --git a/test/Transforms/SimplifyLibCalls/memcmp.ll b/test/Transforms/SimplifyLibCalls/memcmp.ll new file mode 100644 index 0000000..bea9eed --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/memcmp.ll @@ -0,0 +1,24 @@ +; Test that the memcmpOptimizer works correctly +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls | llvm-dis | \ +; RUN: not grep {call.*memcmp} +; RUN: llvm-upgrade < %s | llvm-as | opt -simplify-libcalls -disable-output + +declare int %memcmp(sbyte*,sbyte*,int) +%h = constant [2 x sbyte] c"h\00" +%hel = constant [4 x sbyte] c"hel\00" +%hello_u = constant [8 x sbyte] c"hello_u\00" + +implementation + +void %test(sbyte *%P, sbyte *%Q, int %N, int* %IP, bool *%BP) { + %A = call int %memcmp(sbyte *%P, sbyte* %P, int %N) + volatile store int %A, int* %IP + %B = call int %memcmp(sbyte *%P, sbyte* %Q, int 0) + volatile store int %B, int* %IP + %C = call int %memcmp(sbyte *%P, sbyte* %Q, int 1) + volatile store int %C, int* %IP + %D = call int %memcmp(sbyte *%P, sbyte* %Q, int 2) + %E = seteq int %D, 0 + volatile store bool %E, bool* %BP + ret void +} diff --git a/test/Transforms/TailCallElim/accum_recursion.ll b/test/Transforms/TailCallElim/accum_recursion.ll new file mode 100644 index 0000000..d82d963 --- /dev/null +++ b/test/Transforms/TailCallElim/accum_recursion.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | not grep call + +int %factorial(int %x) { +entry: + %tmp.1 = setgt int %x, 0 + br bool %tmp.1, label %then, label %else + +then: + %tmp.6 = add int %x, -1 + %tmp.4 = call int %factorial( int %tmp.6 ) + %tmp.7 = mul int %tmp.4, %x + ret int %tmp.7 + +else: + ret int 1 +} + diff --git a/test/Transforms/TailCallElim/accum_recursion_constant_arg.ll b/test/Transforms/TailCallElim/accum_recursion_constant_arg.ll new file mode 100644 index 0000000..b103d89 --- /dev/null +++ b/test/Transforms/TailCallElim/accum_recursion_constant_arg.ll @@ -0,0 +1,22 @@ +; This is a more aggressive form of accumulator recursion insertion, which +; requires noticing that X doesn't change as we perform the tailcall. Thanks +; go out to the anonymous users of the demo script for "suggesting" +; optimizations that should be done. :) + +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | not grep call + +int %mul(int %x, int %y) { +entry: + %tmp.1 = seteq int %y, 0 + br bool %tmp.1, label %return, label %endif + +endif: + %tmp.8 = add int %y, -1 + %tmp.5 = call int %mul( int %x, int %tmp.8 ) + %tmp.9 = add int %tmp.5, %x + ret int %tmp.9 + +return: + ret int %x +} + diff --git a/test/Transforms/TailCallElim/ackermann.ll b/test/Transforms/TailCallElim/ackermann.ll new file mode 100644 index 0000000..dd6e276 --- /dev/null +++ b/test/Transforms/TailCallElim/ackermann.ll @@ -0,0 +1,30 @@ +; This function contains two tail calls, which should be eliminated +; RUN: llvm-upgrade < %s | llvm-as | \ +; RUN: opt -tailcallelim -stats -disable-output |& grep {2 tailcallelim} + +int %Ack(int %M.1, int %N.1) { +entry: + %tmp.1 = seteq int %M.1, 0 ; <bool> [#uses=1] + br bool %tmp.1, label %then.0, label %endif.0 + +then.0: + %tmp.4 = add int %N.1, 1 ; <int> [#uses=1] + ret int %tmp.4 + +endif.0: + %tmp.6 = seteq int %N.1, 0 ; <bool> [#uses=1] + br bool %tmp.6, label %then.1, label %endif.1 + +then.1: + %tmp.10 = add int %M.1, -1 ; <int> [#uses=1] + %tmp.8 = call int %Ack( int %tmp.10, int 1 ) ; <int> [#uses=1] + ret int %tmp.8 + +endif.1: + %tmp.13 = add int %M.1, -1 ; <int> [#uses=1] + %tmp.17 = add int %N.1, -1 ; <int> [#uses=1] + %tmp.14 = call int %Ack( int %M.1, int %tmp.17 ) ; <int> [#uses=1] + %tmp.11 = call int %Ack( int %tmp.13, int %tmp.14 ) ; <int> [#uses=1] + ret int %tmp.11 +} + diff --git a/test/Transforms/TailCallElim/dg.exp b/test/Transforms/TailCallElim/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/TailCallElim/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll b/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll new file mode 100644 index 0000000..d3ba65e --- /dev/null +++ b/test/Transforms/TailCallElim/dont-tce-tail-marked-call.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | \ +; RUN: grep {call i32 @foo} + +declare void %bar(int*) +int %foo(uint %N) { + %A = alloca int, uint %N ;; Should stay in entry block because of 'tail' marker + store int 17, int* %A + call void %bar(int* %A) + + %X = tail call int %foo(uint %N) ;; Cannot -tailcallelim this without increasing stack usage! + ret int %X +} diff --git a/test/Transforms/TailCallElim/intervening-inst.ll b/test/Transforms/TailCallElim/intervening-inst.ll new file mode 100644 index 0000000..a480e3b --- /dev/null +++ b/test/Transforms/TailCallElim/intervening-inst.ll @@ -0,0 +1,19 @@ +; This function contains intervening instructions which should be moved out of the way +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | not grep call + +int %Test(int %X) { +entry: + %tmp.1 = seteq int %X, 0 + br bool %tmp.1, label %then.0, label %endif.0 + +then.0: + %tmp.4 = add int %X, 1 + ret int %tmp.4 + +endif.0: + %tmp.10 = add int %X, -1 + %tmp.8 = call int %Test(int %tmp.10) + %DUMMY = add int %X, 1 ;; This should not prevent elimination + ret int %tmp.8 +} + diff --git a/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll b/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll new file mode 100644 index 0000000..1b1f0d0 --- /dev/null +++ b/test/Transforms/TailCallElim/move_alloca_for_tail_call.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | \ +; RUN: %prcontext alloca 1 | grep {i32 @foo} + +declare void %bar(int*) +int %foo() { + %A = alloca int ;; Should stay in entry block because of 'tail' marker + store int 17, int* %A + call void %bar(int* %A) + + %X = tail call int %foo() + ret int %X +} diff --git a/test/Transforms/TailCallElim/return-undef.ll b/test/Transforms/TailCallElim/return-undef.ll new file mode 100644 index 0000000..b7d2f81 --- /dev/null +++ b/test/Transforms/TailCallElim/return-undef.ll @@ -0,0 +1,9 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis > %t +; RUN: grep sub %t +; RUN: not grep call %t + +int %test(int %X) { + %Y = sub int %X, 1 + %Z = call int %test(int %Y) + ret int undef +} diff --git a/test/Transforms/TailCallElim/return_constant.ll b/test/Transforms/TailCallElim/return_constant.ll new file mode 100644 index 0000000..5802024 --- /dev/null +++ b/test/Transforms/TailCallElim/return_constant.ll @@ -0,0 +1,19 @@ +; Though this case seems to be fairly unlikely to occur in the wild, someone +; plunked it into the demo script, so maybe they care about it. +; +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | not grep call + +int %aaa(int %c) { +entry: + %tmp.1 = seteq int %c, 0 ; <bool> [#uses=1] + br bool %tmp.1, label %return, label %else + +else: ; preds = %entry + %tmp.5 = add int %c, -1 ; <int> [#uses=1] + %tmp.3 = call int %aaa( int %tmp.5 ) ; <int> [#uses=0] + ret int 0 + +return: ; preds = %entry + ret int 0 +} + diff --git a/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll b/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll new file mode 100644 index 0000000..98c2332 --- /dev/null +++ b/test/Transforms/TailCallElim/trivial_codegen_tailcall.ll @@ -0,0 +1,12 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailcallelim | llvm-dis | \ +; RUN: grep {tail call void @foo} + +declare void %foo() + + +void %bar() { + call void %foo() + ret void +} + + diff --git a/test/Transforms/TailDup/2003-06-24-Simpleloop.ll b/test/Transforms/TailDup/2003-06-24-Simpleloop.ll new file mode 100644 index 0000000..e2b979c --- /dev/null +++ b/test/Transforms/TailDup/2003-06-24-Simpleloop.ll @@ -0,0 +1,18 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +void %motion_result7() { +entry: + br label %endif + +endif: + %i.1 = phi int [ %inc, %no_exit ], [ 0, %entry ] + %inc = add int %i.1, 1 + br bool false, label %no_exit, label %UnifiedExitNode + +no_exit: + br bool false, label %UnifiedExitNode, label %endif + +UnifiedExitNode: + ret void +} + diff --git a/test/Transforms/TailDup/2003-07-22-InfiniteLoop.ll b/test/Transforms/TailDup/2003-07-22-InfiniteLoop.ll new file mode 100644 index 0000000..4d65069 --- /dev/null +++ b/test/Transforms/TailDup/2003-07-22-InfiniteLoop.ll @@ -0,0 +1,13 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +implementation + +int %sum() { +entry: + br label %loopentry + +loopentry: + %i.0 = phi int [ 1, %entry ], [ %tmp.3, %loopentry ] + %tmp.3 = add int %i.0, 1 + br label %loopentry +} diff --git a/test/Transforms/TailDup/2003-08-23-InvalidatedPointers.ll b/test/Transforms/TailDup/2003-08-23-InvalidatedPointers.ll new file mode 100644 index 0000000..72e03e1 --- /dev/null +++ b/test/Transforms/TailDup/2003-08-23-InvalidatedPointers.ll @@ -0,0 +1,40 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +implementation + +int %sell_haggle() { +entry: ; No predecessors! + br bool false, label %then.5, label %UnifiedExitNode + +then.5: ; preds = %entry + br bool false, label %loopentry.1.preheader, label %else.1 + +else.1: ; preds = %then.5 + br label %loopentry.1.preheader + +loopentry.1.preheader: ; preds = %then.5, %else.1 + %final_ask.0 = phi int [ 0, %else.1 ], [ 0, %then.5 ] ; <int> [#uses=2] + br label %loopentry.1 + +loopentry.1: ; preds = %loopentry.1.preheader, %endif.17 + switch uint 0, label %UnifiedExitNode [ + uint 2, label %UnifiedExitNode + uint 1, label %endif.16 + ] + +endif.16: ; preds = %loopentry.1 + br bool false, label %then.17, label %UnifiedExitNode + +then.17: ; preds = %endif.16 + br bool false, label %then.18, label %endif.17 + +then.18: ; preds = %then.17 + br bool false, label %endif.17, label %UnifiedExitNode + +endif.17: ; preds = %then.17, %then.18 + %cur_ask.3 = phi int [ %final_ask.0, %then.17 ], [ %final_ask.0, %then.18 ] ; <int> [#uses=0] + br bool false, label %loopentry.1, label %UnifiedExitNode + +UnifiedExitNode: ; preds = %entry, %endif.17, %then.18, %endif.16, %loopentry.1, %loopentry.1 + ret int 0 +} diff --git a/test/Transforms/TailDup/2003-08-31-UnreachableBlocks.ll b/test/Transforms/TailDup/2003-08-31-UnreachableBlocks.ll new file mode 100644 index 0000000..416a5df --- /dev/null +++ b/test/Transforms/TailDup/2003-08-31-UnreachableBlocks.ll @@ -0,0 +1,20 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +int %foo() { +entry: + br label %return.i + +after_ret.i: + br label %return.i + +return.i: + %tmp.3 = cast int* null to int + br label %return.i1 + +after_ret.i1: + br label %return.i1 + +return.i1: + %tmp.8 = sub int %tmp.3, 0 + ret int 0 +} diff --git a/test/Transforms/TailDup/2004-04-01-DemoteRegToStack.llx b/test/Transforms/TailDup/2004-04-01-DemoteRegToStack.llx new file mode 100644 index 0000000..4ea8490 --- /dev/null +++ b/test/Transforms/TailDup/2004-04-01-DemoteRegToStack.llx @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +void %interpret() { +entry: + br label %retry + +retry: + %tmp.8 = call int %interp() + switch uint 0, label %endif.4 [ + uint 4294967271, label %return + uint 4294967280, label %return + ] + +endif.4: + br bool false, label %return, label %retry + +return: + %result.0 = phi int [ %tmp.8, %retry ], [%tmp.8, %retry], [ %tmp.8, %endif.4 ] + ret void +} + +declare int %interp() diff --git a/test/Transforms/TailDup/MergeTest.ll b/test/Transforms/TailDup/MergeTest.ll new file mode 100644 index 0000000..c11d735 --- /dev/null +++ b/test/Transforms/TailDup/MergeTest.ll @@ -0,0 +1,31 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate | llvm-dis | grep add | not grep uses=1 + +int %test1(bool %C, int %A, int* %P) { +entry: + br bool %C, label %L1, label %L2 + +L1: + store int 1, int* %P + br label %L2 + +L2: + %X = add int %A, 17 + ret int %X +} + +int %test2(bool %C, int %A, int* %P) { +entry: + br bool %C, label %L1, label %L2 + +L1: + store int 1, int* %P + br label %L3 + +L2: + store int 7, int* %P + br label %L3 +L3: + %X = add int %A, 17 + ret int %X +} + diff --git a/test/Transforms/TailDup/PHIUpdateTest.ll b/test/Transforms/TailDup/PHIUpdateTest.ll new file mode 100644 index 0000000..ae591a0 --- /dev/null +++ b/test/Transforms/TailDup/PHIUpdateTest.ll @@ -0,0 +1,20 @@ +; This test checks to make sure phi nodes are updated properly +; +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + + + +int %test(bool %c, int %X, int %Y) { + br label %L + +L: + %A = add int %X, %Y + br bool %c, label %T, label %F + +F: + br bool %c, label %L, label %T + +T: + %V = phi int [%A, %L], [0, %F] + ret int %V +} diff --git a/test/Transforms/TailDup/basictest.ll b/test/Transforms/TailDup/basictest.ll new file mode 100644 index 0000000..085acf5 --- /dev/null +++ b/test/Transforms/TailDup/basictest.ll @@ -0,0 +1,22 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +declare void %__main() + +int %main() { +entry: ; No predecessors! + call void %__main( ) + br label %loopentry + +loopentry: ; preds = %entry, %no_exit + %i.0 = phi int [ %inc, %no_exit ], [ 0, %entry ] ; <int> [#uses=2] + %tmp.1 = setle int %i.0, 99 ; <bool> [#uses=1] + br bool %tmp.1, label %no_exit, label %return + +no_exit: ; preds = %loopentry + %tmp.51 = call int %main( ) ; <int> [#uses=0] + %inc = add int %i.0, 1 ; <int> [#uses=1] + br label %loopentry + +return: ; preds = %loopentry + ret int %i.0 +} diff --git a/test/Transforms/TailDup/basictest2.ll b/test/Transforms/TailDup/basictest2.ll new file mode 100644 index 0000000..c67b3d5 --- /dev/null +++ b/test/Transforms/TailDup/basictest2.ll @@ -0,0 +1,17 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate -disable-output + +void %ab() { +entry: + br label %loopentry.5 + +loopentry.5: + %poscnt.1 = phi long [ 0, %entry ], [ %tmp.289, %no_exit.5 ] + %tmp.289 = shr long %poscnt.1, ubyte 1 + br bool false, label %no_exit.5, label %loopexit.5 + +no_exit.5: + br label %loopentry.5 + +loopexit.5: + ret void +} diff --git a/test/Transforms/TailDup/dg.exp b/test/Transforms/TailDup/dg.exp new file mode 100644 index 0000000..879685c --- /dev/null +++ b/test/Transforms/TailDup/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] diff --git a/test/Transforms/TailDup/if-tail-dup.ll b/test/Transforms/TailDup/if-tail-dup.ll new file mode 100644 index 0000000..87c9027 --- /dev/null +++ b/test/Transforms/TailDup/if-tail-dup.ll @@ -0,0 +1,61 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate | \ +; RUN: llc -march=x86 -o %t -f +; RUN: grep {je } %t +; RUN: not grep jmp %t +; END. +; This should have no unconditional jumps in it. The C source is: + +;void foo(int c, int* P) { +; if (c & 1) P[0] = 1; +; if (c & 2) P[1] = 1; +; if (c & 4) P[2] = 1; +; if (c & 8) P[3] = 1; +;} + +implementation + +void %foo(int %c, int* %P) { +entry: + %tmp1 = and int %c, 1 ; <int> [#uses=1] + %tmp1 = seteq int %tmp1, 0 ; <bool> [#uses=1] + br bool %tmp1, label %cond_next, label %cond_true + +cond_true: ; preds = %entry + store int 1, int* %P + br label %cond_next + +cond_next: ; preds = %entry, %cond_true + %tmp5 = and int %c, 2 ; <int> [#uses=1] + %tmp5 = seteq int %tmp5, 0 ; <bool> [#uses=1] + br bool %tmp5, label %cond_next10, label %cond_true6 + +cond_true6: ; preds = %cond_next + %tmp8 = getelementptr int* %P, int 1 ; <int*> [#uses=1] + store int 1, int* %tmp8 + br label %cond_next10 + +cond_next10: ; preds = %cond_next, %cond_true6 + %tmp13 = and int %c, 4 ; <int> [#uses=1] + %tmp13 = seteq int %tmp13, 0 ; <bool> [#uses=1] + br bool %tmp13, label %cond_next18, label %cond_true14 + +cond_true14: ; preds = %cond_next10 + %tmp16 = getelementptr int* %P, int 2 ; <int*> [#uses=1] + store int 1, int* %tmp16 + br label %cond_next18 + +cond_next18: ; preds = %cond_next10, %cond_true14 + %tmp21 = and int %c, 8 ; <int> [#uses=1] + %tmp21 = seteq int %tmp21, 0 ; <bool> [#uses=1] + br bool %tmp21, label %return, label %cond_true22 + +cond_true22: ; preds = %cond_next18 + %tmp24 = getelementptr int* %P, int 3 ; <int*> [#uses=1] + store int 1, int* %tmp24 + ret void + +return: ; preds = %cond_next18 + ret void +} + + |