716e013603a3ef60710cd4eb468424eba05131a1
[oota-llvm.git] / test / Transforms / IndVarSimplify / pr20680.ll
1 ; RUN: opt < %s -indvars -S | FileCheck %s
2
3 @a = common global i32 0, align 4
4 @c = common global i32 0, align 4
5 @b = common global i32 0, align 4
6
7 define void @f() {
8 ; CHECK-LABEL: @f(
9 ; CHECK-LABEL: entry:
10 ; CHECK: br label %[[for_cond2_preheader:.*]]
11
12 ; CHECK: [[for_cond2_preheader]]:
13 ; CHECK-NEXT: %[[indvars_iv:.*]] = phi i32 [ %[[indvars_iv_next:.*]], %[[for_inc13:.*]] ], [ -14, %entry ]
14 ; br i1 {{.*}}, label %[[for_inc13]], label %
15 entry:
16   %0 = load i32* @a, align 4
17   %tobool2 = icmp eq i32 %0, 0
18   %1 = load i32* @a, align 4
19   %tobool = icmp eq i32 %1, 0
20   br label %for.cond2.preheader
21
22 for.cond2.preheader:                              ; preds = %for.inc13, %entry
23   %storemerge15 = phi i8 [ -14, %entry ], [ %inc14, %for.inc13 ]
24   br i1 %tobool2, label %for.inc13, label %for.body3.lr.ph
25
26 for.body3.lr.ph:                                  ; preds = %for.cond2.preheader
27   %tobool5 = icmp eq i8 %storemerge15, 0
28   %conv7 = sext i8 %storemerge15 to i32
29   %2 = add nsw i32 %conv7, 1
30   %3 = icmp ult i32 %2, 3
31   %div = select i1 %3, i32 %conv7, i32 0
32   br i1 %tobool5, label %for.body3.lr.ph.split.us, label %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
33
34 for.body3.lr.ph.for.body3.lr.ph.split_crit_edge:  ; preds = %for.body3.lr.ph
35   br label %for.body3.lr.ph.split
36
37 for.body3.lr.ph.split.us:                         ; preds = %for.body3.lr.ph
38   br i1 %tobool, label %for.body3.lr.ph.split.us.split.us, label %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
39
40 for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge: ; preds = %for.body3.lr.ph.split.us
41   br label %for.body3.lr.ph.split.us.split
42
43 for.body3.lr.ph.split.us.split.us:                ; preds = %for.body3.lr.ph.split.us
44   br label %for.body3.us.us
45
46 for.body3.us.us:                                  ; preds = %for.cond2.loopexit.us.us, %for.body3.lr.ph.split.us.split.us
47   br i1 true, label %cond.false.us.us, label %cond.end.us.us
48
49 cond.false.us.us:                                 ; preds = %for.body3.us.us
50   br label %cond.end.us.us
51
52 cond.end.us.us:                                   ; preds = %cond.false.us.us, %for.body3.us.us
53   %cond.us.us = phi i32 [ %div, %cond.false.us.us ], [ %conv7, %for.body3.us.us ]
54   %4 = load i32* @b, align 4
55   %cmp91.us.us = icmp slt i32 %4, 1
56   br i1 %cmp91.us.us, label %for.inc.lr.ph.us.us, label %for.cond2.loopexit.us.us
57
58 for.cond2.loopexit.us.us:                         ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us.us, %cond.end.us.us
59   br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us, label %for.body3.us.us
60
61 for.inc.lr.ph.us.us:                              ; preds = %cond.end.us.us
62   br label %for.inc.us.us
63
64 for.cond8.for.cond2.loopexit_crit_edge.us.us:     ; preds = %for.inc.us.us
65   %inc.lcssa.us.us = phi i32 [ %inc.us.us, %for.inc.us.us ]
66   store i32 %inc.lcssa.us.us, i32* @b, align 4
67   br label %for.cond2.loopexit.us.us
68
69 for.inc.us.us:                                    ; preds = %for.inc.us.us, %for.inc.lr.ph.us.us
70   %5 = phi i32 [ %4, %for.inc.lr.ph.us.us ], [ %inc.us.us, %for.inc.us.us ]
71   %inc.us.us = add nsw i32 %5, 1
72   %cmp9.us.us = icmp slt i32 %inc.us.us, 1
73   br i1 %cmp9.us.us, label %for.inc.us.us, label %for.cond8.for.cond2.loopexit_crit_edge.us.us
74
75 for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us: ; preds = %for.cond2.loopexit.us.us
76   %cond.lcssa.ph.us.ph.us = phi i32 [ %cond.us.us, %for.cond2.loopexit.us.us ]
77   br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
78
79 for.body3.lr.ph.split.us.split:                   ; preds = %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
80   br label %for.body3.us
81
82 for.body3.us:                                     ; preds = %for.cond2.loopexit.us, %for.body3.lr.ph.split.us.split
83   br i1 true, label %cond.false.us, label %cond.end.us
84
85 cond.false.us:                                    ; preds = %for.body3.us
86   br label %cond.end.us
87
88 cond.end.us:                                      ; preds = %cond.false.us, %for.body3.us
89   %cond.us = phi i32 [ %div, %cond.false.us ], [ %conv7, %for.body3.us ]
90   %6 = load i32* @b, align 4
91   %cmp91.us = icmp slt i32 %6, 1
92   br i1 %cmp91.us, label %for.inc.lr.ph.us, label %for.cond2.loopexit.us
93
94 for.inc.us:                                       ; preds = %for.inc.lr.ph.us, %for.inc.us
95   %7 = phi i32 [ %6, %for.inc.lr.ph.us ], [ %inc.us, %for.inc.us ]
96   %inc.us = add nsw i32 %7, 1
97   %cmp9.us = icmp slt i32 %inc.us, 1
98   br i1 %cmp9.us, label %for.inc.us, label %for.cond8.for.cond2.loopexit_crit_edge.us
99
100 for.cond2.loopexit.us:                            ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us, %cond.end.us
101   br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, label %for.body3.us
102
103 for.inc.lr.ph.us:                                 ; preds = %cond.end.us
104   br label %for.inc.us
105
106 for.cond8.for.cond2.loopexit_crit_edge.us:        ; preds = %for.inc.us
107   %inc.lcssa.us = phi i32 [ %inc.us, %for.inc.us ]
108   store i32 %inc.lcssa.us, i32* @b, align 4
109   br label %for.cond2.loopexit.us
110
111 for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa: ; preds = %for.cond2.loopexit.us
112   %cond.lcssa.ph.us.ph = phi i32 [ %cond.us, %for.cond2.loopexit.us ]
113   br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
114
115 for.cond2.for.inc13_crit_edge.us-lcssa.us:        ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us
116   %cond.lcssa.ph.us = phi i32 [ %cond.lcssa.ph.us.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa ], [ %cond.lcssa.ph.us.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us ]
117   br label %for.cond2.for.inc13_crit_edge
118
119 for.body3.lr.ph.split:                            ; preds = %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
120   br i1 %tobool, label %for.body3.lr.ph.split.split.us, label %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
121
122 for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge: ; preds = %for.body3.lr.ph.split
123   br label %for.body3.lr.ph.split.split
124
125 for.body3.lr.ph.split.split.us:                   ; preds = %for.body3.lr.ph.split
126   br label %for.body3.us3
127
128 for.body3.us3:                                    ; preds = %for.cond2.loopexit.us11, %for.body3.lr.ph.split.split.us
129   br i1 false, label %cond.false.us4, label %cond.end.us5
130
131 cond.false.us4:                                   ; preds = %for.body3.us3
132   br label %cond.end.us5
133
134 cond.end.us5:                                     ; preds = %cond.false.us4, %for.body3.us3
135   %cond.us6 = phi i32 [ %div, %cond.false.us4 ], [ %conv7, %for.body3.us3 ]
136   %8 = load i32* @b, align 4
137   %cmp91.us7 = icmp slt i32 %8, 1
138   br i1 %cmp91.us7, label %for.inc.lr.ph.us12, label %for.cond2.loopexit.us11
139
140 for.inc.us8:                                      ; preds = %for.inc.lr.ph.us12, %for.inc.us8
141   %9 = phi i32 [ %8, %for.inc.lr.ph.us12 ], [ %inc.us9, %for.inc.us8 ]
142   %inc.us9 = add nsw i32 %9, 1
143   %cmp9.us10 = icmp slt i32 %inc.us9, 1
144   br i1 %cmp9.us10, label %for.inc.us8, label %for.cond8.for.cond2.loopexit_crit_edge.us13
145
146 for.cond2.loopexit.us11:                          ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us13, %cond.end.us5
147   br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us, label %for.body3.us3
148
149 for.inc.lr.ph.us12:                               ; preds = %cond.end.us5
150   br label %for.inc.us8
151
152 for.cond8.for.cond2.loopexit_crit_edge.us13:      ; preds = %for.inc.us8
153   %inc.lcssa.us14 = phi i32 [ %inc.us9, %for.inc.us8 ]
154   store i32 %inc.lcssa.us14, i32* @b, align 4
155   br label %for.cond2.loopexit.us11
156
157 for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us: ; preds = %for.cond2.loopexit.us11
158   %cond.lcssa.ph.ph.us = phi i32 [ %cond.us6, %for.cond2.loopexit.us11 ]
159   br label %for.cond2.for.inc13_crit_edge.us-lcssa
160
161 for.body3.lr.ph.split.split:                      ; preds = %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
162   br label %for.body3
163
164 for.cond8.for.cond2.loopexit_crit_edge:           ; preds = %for.inc
165   %inc.lcssa = phi i32 [ %inc, %for.inc ]
166   store i32 %inc.lcssa, i32* @b, align 4
167   br label %for.cond2.loopexit
168
169 for.cond2.loopexit:                               ; preds = %cond.end, %for.cond8.for.cond2.loopexit_crit_edge
170   br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, label %for.body3
171
172 for.body3:                                        ; preds = %for.cond2.loopexit, %for.body3.lr.ph.split.split
173   br i1 false, label %cond.false, label %cond.end
174
175 cond.false:                                       ; preds = %for.body3
176   br label %cond.end
177
178 cond.end:                                         ; preds = %cond.false, %for.body3
179   %cond = phi i32 [ %div, %cond.false ], [ %conv7, %for.body3 ]
180   %10 = load i32* @b, align 4
181   %cmp91 = icmp slt i32 %10, 1
182   br i1 %cmp91, label %for.inc.lr.ph, label %for.cond2.loopexit
183
184 for.inc.lr.ph:                                    ; preds = %cond.end
185   br label %for.inc
186
187 for.inc:                                          ; preds = %for.inc, %for.inc.lr.ph
188   %11 = phi i32 [ %10, %for.inc.lr.ph ], [ %inc, %for.inc ]
189   %inc = add nsw i32 %11, 1
190   %cmp9 = icmp slt i32 %inc, 1
191   br i1 %cmp9, label %for.inc, label %for.cond8.for.cond2.loopexit_crit_edge
192
193 for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa:  ; preds = %for.cond2.loopexit
194   %cond.lcssa.ph.ph = phi i32 [ %cond, %for.cond2.loopexit ]
195   br label %for.cond2.for.inc13_crit_edge.us-lcssa
196
197 for.cond2.for.inc13_crit_edge.us-lcssa:           ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us
198   %cond.lcssa.ph = phi i32 [ %cond.lcssa.ph.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa ], [ %cond.lcssa.ph.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us ]
199   br label %for.cond2.for.inc13_crit_edge
200
201 for.cond2.for.inc13_crit_edge:                    ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us
202   %cond.lcssa = phi i32 [ %cond.lcssa.ph, %for.cond2.for.inc13_crit_edge.us-lcssa ], [ %cond.lcssa.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us ]
203   store i32 %cond.lcssa, i32* @c, align 4
204   br label %for.inc13
205
206 ; CHECK: [[for_inc13]]:
207 ; CHECK-NEXT: %[[indvars_iv_next]] = add nsw i32 %[[indvars_iv]], 1
208 ; CHECK-NEXT: %[[exitcond4:.*]] = icmp ne i32 %[[indvars_iv_next]], 0
209 ; CHECK-NEXT: br i1 %[[exitcond4]], label %[[for_cond2_preheader]], label %[[for_end15:.*]]
210 for.inc13:                                        ; preds = %for.cond2.for.inc13_crit_edge, %for.cond2.preheader
211   %inc14 = add i8 %storemerge15, 1
212   %cmp = icmp ugt i8 %inc14, 50
213   br i1 %cmp, label %for.cond2.preheader, label %for.end15
214
215 ; CHECK: [[for_end15]]:
216 ; CHECK-NEXT: ret void
217 for.end15:                                        ; preds = %for.inc13
218   ret void
219 }