From: Chris Lattner Date: Mon, 31 Mar 2003 21:19:23 +0000 (+0000) Subject: Initial checkin of PRE test X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7341178c5d04c137474ecd335a33009ee2ca41e2;p=llvm Initial checkin of PRE test git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5761 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/PRE/basictest.ll b/test/Transforms/PRE/basictest.ll new file mode 100644 index 00000000000..2a999b5019a --- /dev/null +++ b/test/Transforms/PRE/basictest.ll @@ -0,0 +1,194 @@ +; Basic testcases - these are only tested by inspection, but illustrate the +; basic cases PRE can handle. +; +; RUN: as < %s | opt -pre -disable-output + +declare void %use(int) +declare int %get() + +void %test0(int %A, int %B) { ;; Fully redundant + %X = add int %A, %B + %Y = add int %A, %B + call void %use(int %X) + call void %use(int %Y) + ret void +} + +void %test1(int %cond, int %A, int %B) { + switch int %cond, label %Out [ + int 1, label %B1 + int 2, label %B2 + int 3, label %Cont ] +B1: + %X1 = add int %A, %B + call void %use(int %X1) + br label %Cont +B2: + %X2 = add int %A, %B + call void %use(int %X2) + br label %Cont + +Cont: + br label %Next + +Next: + %X3 = add int %A, %B + call void %use(int %X3) + br label %Out + +Out: + ret void +} + + +void %testloop(bool %cond, int %A, int %B) { + br label %Loop + +Loop: + %C = add int %A, %B ; loop invariant + call void %use(int %C) + + %D = add int %C, %B + call void %use(int %D) + + br bool %cond, label %Loop, label %Exit +Exit: + ret void +} + + + +void %test3(bool %cond, int %A, int %B) { + br bool %cond, label %A, label %B + +A: + %C = add int %A, %B + call void %use(int %C) + br label %Merge +B: + %D = add int %A, %B + call void %use(int %D) + br label %Merge + +Merge: + %E = add int %A, %B + call void %use(int %E) + ret void +} + +void %test4(bool %cond, int %A, int %B) { + br bool %cond, label %A, label %B + +A: + br label %Merge +B: + %D = add int %A, %B + call void %use(int %D) + br label %Merge + +Merge: + %E = add int %A, %B + call void %use(int %E) + ret void +} + + +int %test5(bool %cond, int %A, int %B) { + br label %Loop + +Loop: + br bool %cond, label %A, label %B + +A: + br label %Merge +B: + %D = add int %A, %B + call void %use(int %D) + br label %Merge + +Merge: + br bool %cond, label %Loop, label %Out + +Out: + %E = add int %A, %B + ret int %E +} + + +void %test6(bool %cond, int %A, int %B) { + br bool %cond, label %A1, label %Def +A1: br label %Around +Def: + %C = add int %A, %B + call void %use(int %C) + br bool %cond, label %F1, label %F2 +F1: br label %Around +F2: br label %Y + +Around: + br label %Y +Y: + %D = add int %A, %B + call void %use(int %D) + ret void +} + +void %testloop-load(bool %cond, int* %P, int* %Q) { + br label %Loop + +Loop: + store int 5, int* %Q ;; Q may alias P + %D = load int* %P ;; Should not hoist load out of loop + call void %use(int %D) + + br bool %cond, label %Loop, label %Exit +Exit: + ret void +} + +void %test7(bool %cond) { ;; Test anticipatibility + br label %Loop + +Loop: + %A = call int %get() + %B = add int %A, %A ; Cannot hoist from loop + call void %use(int %B) + + br bool %cond, label %Loop, label %Exit +Exit: + ret void +} + + +void %test8(bool %cond, int %A, int %B) { ;; Test irreducible loop + br bool %cond, label %LoopHead, label %LoopMiddle + +LoopHead: + %C = add int %A, %B ; Should hoist from loop + call void %use(int %C) + br label %LoopMiddle + +LoopMiddle: + + br bool %cond, label %LoopHead, label %Exit +Exit: + %D = add int %A, %B + call void %use(int %D) + ret void +} + + +void %test9(bool %cond, int %A, int %B) { ;; Test irreducible loop + br bool %cond, label %LoopHead, label %LoopMiddle + +LoopHead: + call int %get() ; random function call + br label %LoopMiddle + +LoopMiddle: + %C = add int %A, %B ; Should hoist from loop + call void %use(int %C) + br bool %cond, label %LoopHead, label %Exit +Exit: + ret void +}