Revamp the loop unroller, extending it to correctly update PHI nodes
[oota-llvm.git] / test / Transforms / LoopUnroll / multiple-phis.ll
1 ; RUN: llvm-as < %s | opt -loop-unroll -unroll-count 6 -unroll-threshold 300 | llvm-dis > %t
2 ; RUN: grep {br label \%bbe} %t | count 12
3 ; RUN: grep {br i1 \%z} %t | count 3
4 ; RUN: grep {br i1 \%q} %t | count 6
5 ; RUN: grep call %t | count 12
6 ; RUN: grep urem %t | count 6
7 ; RUN: grep store %t | count 6
8 ; RUN: grep phi %t | count 11
9 ; RUN: grep {lcssa = phi} %t | count 2
10
11 ; This testcase uses
12 ;  - an unknown tripcount, but a known trip multiple of 2.
13 ;  - an unroll count of 6, so we should get 3 conditional branches
14 ;    in the loop.
15 ;  - values defined inside the loop and used outside, by phis that
16 ;    also use values defined elsewhere outside the loop.
17 ;  - a phi inside the loop that only uses values defined
18 ;    inside the loop and is only used inside the loop.
19
20 declare i32 @foo()
21 declare i32 @bar()
22
23 define i32 @fib(i32 %n, i1 %a, i32* %p) nounwind {
24 entry:
25         %n2 = mul i32 %n, 2
26         br i1 %a, label %bb, label %return
27
28 bb: ; loop header block
29         %t0 = phi i32 [ 0, %entry ], [ %t1, %bbe ]
30         %td = urem i32 %t0, 7
31         %q = trunc i32 %td to i1
32         br i1 %q, label %bbt, label %bbf
33 bbt:
34         %bbtv = call i32 @foo()
35         br label %bbe
36 bbf:
37         %bbfv = call i32 @bar()
38         br label %bbe
39 bbe: ; loop latch block
40         %bbpv = phi i32 [ %bbtv, %bbt ], [ %bbfv, %bbf ]
41         store i32 %bbpv, i32* %p
42         %t1 = add i32 %t0, 1
43         %z = icmp ne i32 %t1, %n2
44         br i1 %z, label %bb, label %return
45
46 return:
47         %f = phi i32 [ -2, %entry ], [ %t0, %bbe ]
48         %g = phi i32 [ -3, %entry ], [ %t1, %bbe ]
49         %h = mul i32 %f, %g
50         ret i32 %h
51 }