[SCEV] Pick backedge values for phi nodes correctly
[oota-llvm.git] / test / Transforms / IndVarSimplify / exit_value_tests.ll
1 ; Test that we can evaluate the exit values of various expression types.  Since
2 ; these loops all have predictable exit values we can replace the use outside
3 ; of the loop with a closed-form computation, making the loop dead.
4 ;
5 ; RUN: opt < %s -indvars -loop-deletion -simplifycfg | \
6 ; RUN:   llvm-dis | not grep br
7
8 define i32 @polynomial_constant() {
9 ; <label>:0
10         br label %Loop
11
12 Loop:           ; preds = %Loop, %0
13         %A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]         ; <i32> [#uses=3]
14         %B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]         ; <i32> [#uses=1]
15         %A2 = add i32 %A1, 1            ; <i32> [#uses=1]
16         %B2 = add i32 %B1, %A1          ; <i32> [#uses=2]
17         %C = icmp eq i32 %A1, 1000              ; <i1> [#uses=1]
18         br i1 %C, label %Out, label %Loop
19
20 Out:            ; preds = %Loop
21         ret i32 %B2
22 }
23
24 define i32 @NSquare(i32 %N) {
25 ; <label>:0
26         br label %Loop
27
28 Loop:           ; preds = %Loop, %0
29         %X = phi i32 [ 0, %0 ], [ %X2, %Loop ]          ; <i32> [#uses=4]
30         %X2 = add i32 %X, 1             ; <i32> [#uses=1]
31         %c = icmp eq i32 %X, %N         ; <i1> [#uses=1]
32         br i1 %c, label %Out, label %Loop
33
34 Out:            ; preds = %Loop
35         %Y = mul i32 %X, %X             ; <i32> [#uses=1]
36         ret i32 %Y
37 }
38
39 define i32 @NSquareOver2(i32 %N) {
40 ; <label>:0
41         br label %Loop
42
43 Loop:           ; preds = %Loop, %0
44         %X = phi i32 [ 0, %0 ], [ %X2, %Loop ]          ; <i32> [#uses=3]
45         %Y = phi i32 [ 15, %0 ], [ %Y2, %Loop ]         ; <i32> [#uses=1]
46         %Y2 = add i32 %Y, %X            ; <i32> [#uses=2]
47         %X2 = add i32 %X, 1             ; <i32> [#uses=1]
48         %c = icmp eq i32 %X, %N         ; <i1> [#uses=1]
49         br i1 %c, label %Out, label %Loop
50
51 Out:            ; preds = %Loop
52         ret i32 %Y2
53 }
54
55 define i32 @strength_reduced() {
56 ; <label>:0
57         br label %Loop
58
59 Loop:           ; preds = %Loop, %0
60         %A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]         ; <i32> [#uses=3]
61         %B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]         ; <i32> [#uses=1]
62         %A2 = add i32 %A1, 1            ; <i32> [#uses=1]
63         %B2 = add i32 %B1, %A1          ; <i32> [#uses=2]
64         %C = icmp eq i32 %A1, 1000              ; <i1> [#uses=1]
65         br i1 %C, label %Out, label %Loop
66
67 Out:            ; preds = %Loop
68         ret i32 %B2
69 }
70
71 define i32 @chrec_equals() {
72 entry:
73         br label %no_exit
74
75 no_exit:                ; preds = %no_exit, %entry
76         %i0 = phi i32 [ 0, %entry ], [ %i1, %no_exit ]          ; <i32> [#uses=3]
77         %ISq = mul i32 %i0, %i0         ; <i32> [#uses=1]
78         %i1 = add i32 %i0, 1            ; <i32> [#uses=2]
79         %tmp.1 = icmp ne i32 %ISq, 10000                ; <i1> [#uses=1]
80         br i1 %tmp.1, label %no_exit, label %loopexit
81
82 loopexit:               ; preds = %no_exit
83         ret i32 %i1
84 }
85
86 define i16 @cast_chrec_test() {
87 ; <label>:0
88         br label %Loop
89
90 Loop:           ; preds = %Loop, %0
91         %A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]         ; <i32> [#uses=2]
92         %B1 = trunc i32 %A1 to i16              ; <i16> [#uses=2]
93         %A2 = add i32 %A1, 1            ; <i32> [#uses=1]
94         %C = icmp eq i16 %B1, 1000              ; <i1> [#uses=1]
95         br i1 %C, label %Out, label %Loop
96
97 Out:            ; preds = %Loop
98         ret i16 %B1
99 }
100
101 define i32 @linear_div_fold() {
102 entry:
103         br label %loop
104
105 loop:           ; preds = %loop, %entry
106         %i = phi i32 [ 4, %entry ], [ %i.next, %loop ]          ; <i32> [#uses=3]
107         %i.next = add i32 %i, 8         ; <i32> [#uses=1]
108         %RV = udiv i32 %i, 2            ; <i32> [#uses=1]
109         %c = icmp ne i32 %i, 68         ; <i1> [#uses=1]
110         br i1 %c, label %loop, label %loopexit
111
112 loopexit:               ; preds = %loop
113         ret i32 %RV
114 }