xref: /llvm-project/llvm/test/Transforms/LoopFlatten/loop-flatten-negative.ll (revision 2d69827c5c754f0eca98e497ecf0e52ed54b4fd3)
172482c51SRoman Lebedev; RUN: opt < %s -S -passes=loop-flatten -debug-only=loop-flatten 2>&1 | FileCheck %s
2d53b4beeSSjoerd Meijer; REQUIRES: asserts
3d53b4beeSSjoerd Meijer
49aa77338SSjoerd Meijertarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
59aa77338SSjoerd Meijer
6d53b4beeSSjoerd Meijer; Every function in this file has a reason that it can't be transformed.
7d53b4beeSSjoerd Meijer
8d53b4beeSSjoerd Meijer; CHECK-NOT: Checks all passed, doing the transformation
9d53b4beeSSjoerd Meijer
10d53b4beeSSjoerd Meijer; Outer loop does not start at zero
11055fb779SNikita Popovdefine void @test_1(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
12d53b4beeSSjoerd Meijerentry:
13d53b4beeSSjoerd Meijer  %cmp25 = icmp sgt i32 %N, 0
14d53b4beeSSjoerd Meijer  br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup
15d53b4beeSSjoerd Meijer
16d53b4beeSSjoerd Meijerfor.body4.lr.ph:
17d53b4beeSSjoerd Meijer  %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 1, %entry ]
18d53b4beeSSjoerd Meijer  %mul = mul nsw i32 %i.026, %N
19d53b4beeSSjoerd Meijer  br label %for.body4
20d53b4beeSSjoerd Meijer
21d53b4beeSSjoerd Meijerfor.body4:
22d53b4beeSSjoerd Meijer  %j.024 = phi i32 [ 0, %for.body4.lr.ph ], [ %inc, %for.body4 ]
23d53b4beeSSjoerd Meijer  %add = add nsw i32 %j.024, %mul
24055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
25055fb779SNikita Popov  %0 = load i32, ptr %arrayidx, align 4
26d53b4beeSSjoerd Meijer  %mul5 = mul nsw i32 %0, %scale
27055fb779SNikita Popov  %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add
28055fb779SNikita Popov  store i32 %mul5, ptr %arrayidx8, align 4
29d53b4beeSSjoerd Meijer  %inc = add nuw nsw i32 %j.024, 1
30d53b4beeSSjoerd Meijer  %exitcond = icmp eq i32 %inc, %N
31d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.cond.cleanup3, label %for.body4
32d53b4beeSSjoerd Meijer
33d53b4beeSSjoerd Meijerfor.cond.cleanup3:
34d53b4beeSSjoerd Meijer  %inc10 = add nuw nsw i32 %i.026, 1
35d53b4beeSSjoerd Meijer  %exitcond27 = icmp eq i32 %inc10, %N
36d53b4beeSSjoerd Meijer  br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph
37d53b4beeSSjoerd Meijer
38d53b4beeSSjoerd Meijerfor.cond.cleanup:
39d53b4beeSSjoerd Meijer  ret void
40d53b4beeSSjoerd Meijer}
41d53b4beeSSjoerd Meijer
42d53b4beeSSjoerd Meijer; Inner loop does not start at zero
43055fb779SNikita Popovdefine void @test_2(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
44d53b4beeSSjoerd Meijerentry:
45d53b4beeSSjoerd Meijer  %cmp25 = icmp sgt i32 %N, 0
46d53b4beeSSjoerd Meijer  br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup
47d53b4beeSSjoerd Meijer
48d53b4beeSSjoerd Meijerfor.body4.lr.ph:
49d53b4beeSSjoerd Meijer  %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 0, %entry ]
50d53b4beeSSjoerd Meijer  %mul = mul nsw i32 %i.026, %N
51d53b4beeSSjoerd Meijer  br label %for.body4
52d53b4beeSSjoerd Meijer
53d53b4beeSSjoerd Meijerfor.body4:
54d53b4beeSSjoerd Meijer  %j.024 = phi i32 [ 1, %for.body4.lr.ph ], [ %inc, %for.body4 ]
55d53b4beeSSjoerd Meijer  %add = add nsw i32 %j.024, %mul
56055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
57055fb779SNikita Popov  %0 = load i32, ptr %arrayidx, align 4
58d53b4beeSSjoerd Meijer  %mul5 = mul nsw i32 %0, %scale
59055fb779SNikita Popov  %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add
60055fb779SNikita Popov  store i32 %mul5, ptr %arrayidx8, align 4
61d53b4beeSSjoerd Meijer  %inc = add nuw nsw i32 %j.024, 1
62d53b4beeSSjoerd Meijer  %exitcond = icmp eq i32 %inc, %N
63d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.cond.cleanup3, label %for.body4
64d53b4beeSSjoerd Meijer
65d53b4beeSSjoerd Meijerfor.cond.cleanup3:
66d53b4beeSSjoerd Meijer  %inc10 = add nuw nsw i32 %i.026, 1
67d53b4beeSSjoerd Meijer  %exitcond27 = icmp eq i32 %inc10, %N
68d53b4beeSSjoerd Meijer  br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph
69d53b4beeSSjoerd Meijer
70d53b4beeSSjoerd Meijerfor.cond.cleanup:
71d53b4beeSSjoerd Meijer  ret void
72d53b4beeSSjoerd Meijer}
73d53b4beeSSjoerd Meijer
74d53b4beeSSjoerd Meijer; Outer IV used directly
75055fb779SNikita Popovdefine hidden void @test_3(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
76d53b4beeSSjoerd Meijerentry:
77d53b4beeSSjoerd Meijer  %conv = zext i16 %N to i32
78d53b4beeSSjoerd Meijer  %cmp25 = icmp eq i16 %N, 0
79d53b4beeSSjoerd Meijer  br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us
80d53b4beeSSjoerd Meijer
81d53b4beeSSjoerd Meijerfor.body.lr.ph.split.us:                          ; preds = %entry
82d53b4beeSSjoerd Meijer  br label %for.body.us
83d53b4beeSSjoerd Meijer
84d53b4beeSSjoerd Meijerfor.body.us:                                      ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us
85d53b4beeSSjoerd Meijer  %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ]
86055fb779SNikita Popov  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %i.026.us
87d53b4beeSSjoerd Meijer  %mul9.us = mul nuw nsw i32 %i.026.us, %conv
88d53b4beeSSjoerd Meijer  br label %for.body7.us
89d53b4beeSSjoerd Meijer
90d53b4beeSSjoerd Meijerfor.body7.us:                                     ; preds = %for.body.us, %for.body7.us
91d53b4beeSSjoerd Meijer  %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ]
92055fb779SNikita Popov  %0 = load i32, ptr %arrayidx.us, align 4
93d53b4beeSSjoerd Meijer  %mul.us = mul nsw i32 %0, %scale
94d53b4beeSSjoerd Meijer  %add.us = add nuw nsw i32 %j.024.us, %mul9.us
95055fb779SNikita Popov  %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us
96055fb779SNikita Popov  store i32 %mul.us, ptr %arrayidx10.us, align 4
97d53b4beeSSjoerd Meijer  %inc.us = add nuw nsw i32 %j.024.us, 1
98d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc.us, %conv
99d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us
100d53b4beeSSjoerd Meijer
101d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us:         ; preds = %for.body7.us
102d53b4beeSSjoerd Meijer  %inc12.us = add nuw nsw i32 %i.026.us, 1
103d53b4beeSSjoerd Meijer  %exitcond27 = icmp ne i32 %inc12.us, %conv
104d53b4beeSSjoerd Meijer  br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit
105d53b4beeSSjoerd Meijer
106d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit:                        ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us
107d53b4beeSSjoerd Meijer  br label %for.cond.cleanup
108d53b4beeSSjoerd Meijer
109d53b4beeSSjoerd Meijerfor.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
110d53b4beeSSjoerd Meijer  ret void
111d53b4beeSSjoerd Meijer}
112d53b4beeSSjoerd Meijer
113d53b4beeSSjoerd Meijer; Inner IV used directly
114055fb779SNikita Popovdefine hidden void @test_4(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
115d53b4beeSSjoerd Meijerentry:
116d53b4beeSSjoerd Meijer  %conv = zext i16 %N to i32
117d53b4beeSSjoerd Meijer  %cmp25 = icmp eq i16 %N, 0
118d53b4beeSSjoerd Meijer  br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us
119d53b4beeSSjoerd Meijer
120d53b4beeSSjoerd Meijerfor.body.lr.ph.split.us:                          ; preds = %entry
121d53b4beeSSjoerd Meijer  br label %for.body.us
122d53b4beeSSjoerd Meijer
123d53b4beeSSjoerd Meijerfor.body.us:                                      ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us
124d53b4beeSSjoerd Meijer  %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ]
125d53b4beeSSjoerd Meijer  %mul9.us = mul nuw nsw i32 %i.026.us, %conv
126d53b4beeSSjoerd Meijer  br label %for.body7.us
127d53b4beeSSjoerd Meijer
128d53b4beeSSjoerd Meijerfor.body7.us:                                     ; preds = %for.body.us, %for.body7.us
129d53b4beeSSjoerd Meijer  %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ]
130055fb779SNikita Popov  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %j.024.us
131055fb779SNikita Popov  %0 = load i32, ptr %arrayidx.us, align 4
132d53b4beeSSjoerd Meijer  %mul.us = mul nsw i32 %0, %scale
133d53b4beeSSjoerd Meijer  %add.us = add nuw nsw i32 %j.024.us, %mul9.us
134055fb779SNikita Popov  %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us
135055fb779SNikita Popov  store i32 %mul.us, ptr %arrayidx10.us, align 4
136d53b4beeSSjoerd Meijer  %inc.us = add nuw nsw i32 %j.024.us, 1
137d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc.us, %conv
138d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us
139d53b4beeSSjoerd Meijer
140d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us:         ; preds = %for.body7.us
141d53b4beeSSjoerd Meijer  %inc12.us = add nuw nsw i32 %i.026.us, 1
142d53b4beeSSjoerd Meijer  %exitcond27 = icmp ne i32 %inc12.us, %conv
143d53b4beeSSjoerd Meijer  br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit
144d53b4beeSSjoerd Meijer
145d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit:                        ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us
146d53b4beeSSjoerd Meijer  br label %for.cond.cleanup
147d53b4beeSSjoerd Meijer
148d53b4beeSSjoerd Meijerfor.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
149d53b4beeSSjoerd Meijer  ret void
150d53b4beeSSjoerd Meijer}
151d53b4beeSSjoerd Meijer
152d53b4beeSSjoerd Meijer; Inner iteration count not invariant in outer loop
153d53b4beeSSjoerd Meijerdeclare i32 @get_int() readonly
154055fb779SNikita Popovdefine void @test_5(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
155d53b4beeSSjoerd Meijerentry:
156d53b4beeSSjoerd Meijer  %conv = zext i16 %N to i32
157d53b4beeSSjoerd Meijer  %cmp27 = icmp eq i16 %N, 0
158d53b4beeSSjoerd Meijer  br i1 %cmp27, label %for.cond.cleanup, label %for.body.lr.ph
159d53b4beeSSjoerd Meijer
160d53b4beeSSjoerd Meijerfor.body.lr.ph:                                   ; preds = %entry
161d53b4beeSSjoerd Meijer  br label %for.body
162d53b4beeSSjoerd Meijer
163d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit:                        ; preds = %for.cond.cleanup5
164d53b4beeSSjoerd Meijer  br label %for.cond.cleanup
165d53b4beeSSjoerd Meijer
166d53b4beeSSjoerd Meijerfor.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
167d53b4beeSSjoerd Meijer  ret void
168d53b4beeSSjoerd Meijer
169d53b4beeSSjoerd Meijerfor.body:                                         ; preds = %for.body.lr.ph, %for.cond.cleanup5
170d53b4beeSSjoerd Meijer  %i.028 = phi i32 [ 0, %for.body.lr.ph ], [ %inc12, %for.cond.cleanup5 ]
171d53b4beeSSjoerd Meijer  %call = tail call i32 @get_int()
172d53b4beeSSjoerd Meijer  %cmp325 = icmp sgt i32 %call, 0
173d53b4beeSSjoerd Meijer  br i1 %cmp325, label %for.body6.lr.ph, label %for.cond.cleanup5
174d53b4beeSSjoerd Meijer
175d53b4beeSSjoerd Meijerfor.body6.lr.ph:                                  ; preds = %for.body
176d53b4beeSSjoerd Meijer  %mul = mul nsw i32 %call, %i.028
177d53b4beeSSjoerd Meijer  br label %for.body6
178d53b4beeSSjoerd Meijer
179d53b4beeSSjoerd Meijerfor.cond.cleanup5.loopexit:                       ; preds = %for.body6
180d53b4beeSSjoerd Meijer  br label %for.cond.cleanup5
181d53b4beeSSjoerd Meijer
182d53b4beeSSjoerd Meijerfor.cond.cleanup5:                                ; preds = %for.cond.cleanup5.loopexit, %for.body
183d53b4beeSSjoerd Meijer  %inc12 = add nuw nsw i32 %i.028, 1
184d53b4beeSSjoerd Meijer  %exitcond29 = icmp ne i32 %inc12, %conv
185d53b4beeSSjoerd Meijer  br i1 %exitcond29, label %for.body, label %for.cond.cleanup.loopexit
186d53b4beeSSjoerd Meijer
187d53b4beeSSjoerd Meijerfor.body6:                                        ; preds = %for.body6.lr.ph, %for.body6
188d53b4beeSSjoerd Meijer  %j.026 = phi i32 [ 0, %for.body6.lr.ph ], [ %inc, %for.body6 ]
189d53b4beeSSjoerd Meijer  %add = add nsw i32 %j.026, %mul
190055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
191055fb779SNikita Popov  %0 = load i32, ptr %arrayidx, align 4
192d53b4beeSSjoerd Meijer  %mul7 = mul nsw i32 %0, %scale
193055fb779SNikita Popov  %arrayidx10 = getelementptr inbounds i32, ptr %C, i32 %add
194055fb779SNikita Popov  store i32 %mul7, ptr %arrayidx10, align 4
195d53b4beeSSjoerd Meijer  %inc = add nuw nsw i32 %j.026, 1
196d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc, %call
197d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body6, label %for.cond.cleanup5.loopexit
198d53b4beeSSjoerd Meijer}
199d53b4beeSSjoerd Meijer
200d53b4beeSSjoerd Meijer; Inner loop has an early exit
201055fb779SNikita Popovdefine hidden void @test_6(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
202d53b4beeSSjoerd Meijerentry:
203d53b4beeSSjoerd Meijer  %conv = zext i16 %N to i32
204d53b4beeSSjoerd Meijer  %cmp39 = icmp eq i16 %N, 0
205d53b4beeSSjoerd Meijer  br i1 %cmp39, label %for.cond.cleanup, label %for.body.us.preheader
206d53b4beeSSjoerd Meijer
207d53b4beeSSjoerd Meijerfor.body.us.preheader:                            ; preds = %entry
208d53b4beeSSjoerd Meijer  br label %for.body.us
209d53b4beeSSjoerd Meijer
210d53b4beeSSjoerd Meijerfor.body.us:                                      ; preds = %for.body.us.preheader, %cleanup.us
211d53b4beeSSjoerd Meijer  %i.040.us = phi i32 [ %inc19.us, %cleanup.us ], [ 0, %for.body.us.preheader ]
212d53b4beeSSjoerd Meijer  %mul.us = mul nuw nsw i32 %i.040.us, %conv
213d53b4beeSSjoerd Meijer  br label %for.body7.us
214d53b4beeSSjoerd Meijer
215d53b4beeSSjoerd Meijerfor.body7.us:                                     ; preds = %for.body.us, %if.end.us
216d53b4beeSSjoerd Meijer  %j.038.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %if.end.us ]
217d53b4beeSSjoerd Meijer  %add.us = add nuw nsw i32 %j.038.us, %mul.us
218055fb779SNikita Popov  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
219055fb779SNikita Popov  %0 = load i32, ptr %arrayidx.us, align 4
220d53b4beeSSjoerd Meijer  %tobool.us = icmp eq i32 %0, 0
221d53b4beeSSjoerd Meijer  br i1 %tobool.us, label %if.end.us, label %cleanup.us
222d53b4beeSSjoerd Meijer
223d53b4beeSSjoerd Meijercleanup.us:                                       ; preds = %if.end.us, %for.body7.us
224d53b4beeSSjoerd Meijer  %inc19.us = add nuw nsw i32 %i.040.us, 1
225d53b4beeSSjoerd Meijer  %exitcond = icmp eq i32 %inc19.us, %conv
226d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.cond.cleanup, label %for.body.us
227d53b4beeSSjoerd Meijer
228d53b4beeSSjoerd Meijerif.end.us:                                        ; preds = %for.body7.us
229055fb779SNikita Popov  %arrayidx17.us = getelementptr inbounds i32, ptr %C, i32 %add.us
230055fb779SNikita Popov  store i32 0, ptr %arrayidx17.us, align 4
231d53b4beeSSjoerd Meijer  %inc.us = add nuw nsw i32 %j.038.us, 1
232d53b4beeSSjoerd Meijer  %cmp4.us = icmp ult i32 %inc.us, %conv
233d53b4beeSSjoerd Meijer  br i1 %cmp4.us, label %for.body7.us, label %cleanup.us
234d53b4beeSSjoerd Meijer
235d53b4beeSSjoerd Meijerfor.cond.cleanup:                                 ; preds = %cleanup.us, %entry
236d53b4beeSSjoerd Meijer  ret void
237d53b4beeSSjoerd Meijer}
238d53b4beeSSjoerd Meijer
239055fb779SNikita Popovdefine hidden void @test_7(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
240d53b4beeSSjoerd Meijerentry:
241d53b4beeSSjoerd Meijer  %conv = zext i16 %N to i32
242d53b4beeSSjoerd Meijer  %cmp30 = icmp eq i16 %N, 0
243d53b4beeSSjoerd Meijer  br i1 %cmp30, label %cleanup, label %for.body.us.preheader
244d53b4beeSSjoerd Meijer
245d53b4beeSSjoerd Meijerfor.body.us.preheader:                            ; preds = %entry
246d53b4beeSSjoerd Meijer  br label %for.body.us
247d53b4beeSSjoerd Meijer
248d53b4beeSSjoerd Meijerfor.body.us:                                      ; preds = %for.body.us.preheader, %for.cond2.for.cond.cleanup6_crit_edge.us
249d53b4beeSSjoerd Meijer  %i.031.us = phi i32 [ %inc15.us, %for.cond2.for.cond.cleanup6_crit_edge.us ], [ 0, %for.body.us.preheader ]
250d53b4beeSSjoerd Meijer  %call.us = tail call i32 @get_int() #2
251d53b4beeSSjoerd Meijer  %tobool.us = icmp eq i32 %call.us, 0
252d53b4beeSSjoerd Meijer  br i1 %tobool.us, label %for.body7.lr.ph.us, label %cleanup
253d53b4beeSSjoerd Meijer
254d53b4beeSSjoerd Meijerfor.body7.us:                                     ; preds = %for.body7.us, %for.body7.lr.ph.us
255d53b4beeSSjoerd Meijer  %j.029.us = phi i32 [ 0, %for.body7.lr.ph.us ], [ %inc.us, %for.body7.us ]
256d53b4beeSSjoerd Meijer  %add.us = add nuw nsw i32 %j.029.us, %mul.us
257055fb779SNikita Popov  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
258055fb779SNikita Popov  %0 = load i32, ptr %arrayidx.us, align 4
259d53b4beeSSjoerd Meijer  %mul9.us = mul nsw i32 %0, %scale
260055fb779SNikita Popov  %arrayidx13.us = getelementptr inbounds i32, ptr %C, i32 %add.us
261055fb779SNikita Popov  store i32 %mul9.us, ptr %arrayidx13.us, align 4
262d53b4beeSSjoerd Meijer  %inc.us = add nuw nsw i32 %j.029.us, 1
263d53b4beeSSjoerd Meijer  %exitcond = icmp eq i32 %inc.us, %conv
264d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.cond2.for.cond.cleanup6_crit_edge.us, label %for.body7.us
265d53b4beeSSjoerd Meijer
266d53b4beeSSjoerd Meijerfor.body7.lr.ph.us:                               ; preds = %for.body.us
267d53b4beeSSjoerd Meijer  %mul.us = mul nuw nsw i32 %i.031.us, %conv
268d53b4beeSSjoerd Meijer  br label %for.body7.us
269d53b4beeSSjoerd Meijer
270d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us:         ; preds = %for.body7.us
271d53b4beeSSjoerd Meijer  %inc15.us = add nuw nsw i32 %i.031.us, 1
272d53b4beeSSjoerd Meijer  %cmp.us = icmp ult i32 %inc15.us, %conv
273d53b4beeSSjoerd Meijer  br i1 %cmp.us, label %for.body.us, label %cleanup
274d53b4beeSSjoerd Meijer
275d53b4beeSSjoerd Meijercleanup:                                          ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.us, %entry
276d53b4beeSSjoerd Meijer  ret void
277d53b4beeSSjoerd Meijer}
278d53b4beeSSjoerd Meijer
279d53b4beeSSjoerd Meijer; Step is not 1
280055fb779SNikita Popovdefine i32 @test_8(i32 %val, ptr nocapture %A) {
281d53b4beeSSjoerd Meijerentry:
282d53b4beeSSjoerd Meijer  br label %for.body
283d53b4beeSSjoerd Meijer
284d53b4beeSSjoerd Meijerfor.body:                                         ; preds = %entry, %for.inc6
285d53b4beeSSjoerd Meijer  %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ]
286d53b4beeSSjoerd Meijer  %mul = mul nuw nsw i32 %i.018, 20
287d53b4beeSSjoerd Meijer  br label %for.body3
288d53b4beeSSjoerd Meijer
289d53b4beeSSjoerd Meijerfor.body3:                                        ; preds = %for.body, %for.body3
290d53b4beeSSjoerd Meijer  %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ]
291d53b4beeSSjoerd Meijer  %add = add nuw nsw i32 %j.017, %mul
292055fb779SNikita Popov  %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add
293055fb779SNikita Popov  %0 = load i16, ptr %arrayidx, align 2
294d53b4beeSSjoerd Meijer  %conv16 = zext i16 %0 to i32
295d53b4beeSSjoerd Meijer  %add4 = add i32 %conv16, %val
296d53b4beeSSjoerd Meijer  %conv5 = trunc i32 %add4 to i16
297055fb779SNikita Popov  store i16 %conv5, ptr %arrayidx, align 2
298d53b4beeSSjoerd Meijer  %inc = add nuw nsw i32 %j.017, 1
299d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc, 20
300d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body3, label %for.inc6
301d53b4beeSSjoerd Meijer
302d53b4beeSSjoerd Meijerfor.inc6:                                         ; preds = %for.body3
303d53b4beeSSjoerd Meijer  %inc7 = add nuw nsw i32 %i.018, 2
304d53b4beeSSjoerd Meijer  %exitcond19 = icmp ne i32 %inc7, 10
305d53b4beeSSjoerd Meijer  br i1 %exitcond19, label %for.body, label %for.end8
306d53b4beeSSjoerd Meijer
307d53b4beeSSjoerd Meijerfor.end8:                                         ; preds = %for.inc6
308d53b4beeSSjoerd Meijer  ret i32 10
309d53b4beeSSjoerd Meijer}
310d53b4beeSSjoerd Meijer
311d53b4beeSSjoerd Meijer
312d53b4beeSSjoerd Meijer; Step is not 1
313055fb779SNikita Popovdefine i32 @test_9(i32 %val, ptr nocapture %A) {
314d53b4beeSSjoerd Meijerentry:
315d53b4beeSSjoerd Meijer  br label %for.body
316d53b4beeSSjoerd Meijer
317d53b4beeSSjoerd Meijerfor.body:                                         ; preds = %entry, %for.inc6
318d53b4beeSSjoerd Meijer  %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ]
319d53b4beeSSjoerd Meijer  %mul = mul nuw nsw i32 %i.018, 20
320d53b4beeSSjoerd Meijer  br label %for.body3
321d53b4beeSSjoerd Meijer
322d53b4beeSSjoerd Meijerfor.body3:                                        ; preds = %for.body, %for.body3
323d53b4beeSSjoerd Meijer  %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ]
324d53b4beeSSjoerd Meijer  %add = add nuw nsw i32 %j.017, %mul
325055fb779SNikita Popov  %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add
326055fb779SNikita Popov  %0 = load i16, ptr %arrayidx, align 2
327d53b4beeSSjoerd Meijer  %conv16 = zext i16 %0 to i32
328d53b4beeSSjoerd Meijer  %add4 = add i32 %conv16, %val
329d53b4beeSSjoerd Meijer  %conv5 = trunc i32 %add4 to i16
330055fb779SNikita Popov  store i16 %conv5, ptr %arrayidx, align 2
331d53b4beeSSjoerd Meijer  %inc = add nuw nsw i32 %j.017, 2
332d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc, 20
333d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body3, label %for.inc6
334d53b4beeSSjoerd Meijer
335d53b4beeSSjoerd Meijerfor.inc6:                                         ; preds = %for.body3
336d53b4beeSSjoerd Meijer  %inc7 = add nuw nsw i32 %i.018, 1
337d53b4beeSSjoerd Meijer  %exitcond19 = icmp ne i32 %inc7, 10
338d53b4beeSSjoerd Meijer  br i1 %exitcond19, label %for.body, label %for.end8
339d53b4beeSSjoerd Meijer
340d53b4beeSSjoerd Meijerfor.end8:                                         ; preds = %for.inc6
341d53b4beeSSjoerd Meijer  ret i32 10
342d53b4beeSSjoerd Meijer}
343d53b4beeSSjoerd Meijer
344f117ed54SRosie Sumpter; test_10, test_11 and test_12 are for the case when the
345f117ed54SRosie Sumpter; inner trip count is a constant, then the InstCombine pass
346f117ed54SRosie Sumpter; makes the transformation icmp ult i32 %inc, tripcount ->
347f117ed54SRosie Sumpter; icmp ult i32 %j, tripcount-step.
348f117ed54SRosie Sumpter
349f117ed54SRosie Sumpter; test_10: The step is not 1.
350055fb779SNikita Popovdefine i32 @test_10(ptr nocapture %A) {
351491ac280SRosie Sumpterentry:
352491ac280SRosie Sumpter  br label %for.cond1.preheader
353491ac280SRosie Sumpter
354491ac280SRosie Sumpterfor.cond1.preheader:
355f117ed54SRosie Sumpter  %i.017 = phi i32 [ 0, %entry ], [ %inc, %for.cond.cleanup3 ]
356491ac280SRosie Sumpter  %mul = mul i32 %i.017, 20
357491ac280SRosie Sumpter  br label %for.body4
358491ac280SRosie Sumpter
359491ac280SRosie Sumpterfor.body4:
360f117ed54SRosie Sumpter  %j.016 = phi i32 [ 0, %for.cond1.preheader ], [ %add5, %for.body4 ]
361491ac280SRosie Sumpter  %add = add i32 %j.016, %mul
362055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
363055fb779SNikita Popov  store i32 30, ptr %arrayidx, align 4
364f117ed54SRosie Sumpter  %add5 = add nuw nsw i32 %j.016, 2
365f117ed54SRosie Sumpter  %cmp2 = icmp ult i32 %j.016, 18
366491ac280SRosie Sumpter  br i1 %cmp2, label %for.body4, label %for.cond.cleanup3
367491ac280SRosie Sumpter
368f117ed54SRosie Sumpterfor.cond.cleanup3:
369f117ed54SRosie Sumpter  %inc = add i32 %i.017, 1
370f117ed54SRosie Sumpter  %cmp = icmp ult i32 %inc, 11
371f117ed54SRosie Sumpter  br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup
372f117ed54SRosie Sumpter
373491ac280SRosie Sumpterfor.cond.cleanup:
374055fb779SNikita Popov  %0 = load i32, ptr %A, align 4
375491ac280SRosie Sumpter  ret i32 %0
376491ac280SRosie Sumpter}
377d53b4beeSSjoerd Meijer
378f117ed54SRosie Sumpter; test_11: The inner inducation variable is used in a compare which
379f117ed54SRosie Sumpter; isn't the condition of the inner branch.
380055fb779SNikita Popovdefine i32 @test_11(ptr nocapture %A) {
381f117ed54SRosie Sumpterentry:
382f117ed54SRosie Sumpter  br label %for.cond1.preheader
383f117ed54SRosie Sumpter
384f117ed54SRosie Sumpterfor.cond1.preheader:
385f117ed54SRosie Sumpter  %i.020 = phi i32 [ 0, %entry ], [ %inc7, %for.cond.cleanup3 ]
386f117ed54SRosie Sumpter  %mul = mul i32 %i.020, 20
387f117ed54SRosie Sumpter  br label %for.body4
388f117ed54SRosie Sumpter
389f117ed54SRosie Sumpterfor.body4:
390f117ed54SRosie Sumpter  %j.019 = phi i32 [ 0, %for.cond1.preheader ], [ %inc, %for.body4 ]
391f117ed54SRosie Sumpter  %cmp5 = icmp ult i32 %j.019, 5
392f117ed54SRosie Sumpter  %cond = select i1 %cmp5, i32 30, i32 15
393f117ed54SRosie Sumpter  %add = add i32 %j.019, %mul
394055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
395055fb779SNikita Popov  store i32 %cond, ptr %arrayidx, align 4
396f117ed54SRosie Sumpter  %inc = add nuw nsw i32 %j.019, 1
397f117ed54SRosie Sumpter  %cmp2 = icmp ult i32 %j.019, 19
398f117ed54SRosie Sumpter  br i1 %cmp2, label %for.body4, label %for.cond.cleanup3
399f117ed54SRosie Sumpter
400f117ed54SRosie Sumpterfor.cond.cleanup3:
401f117ed54SRosie Sumpter  %inc7 = add i32 %i.020, 1
402f117ed54SRosie Sumpter  %cmp = icmp ult i32 %inc7, 11
403f117ed54SRosie Sumpter  br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup
404f117ed54SRosie Sumpter
405f117ed54SRosie Sumpterfor.cond.cleanup:
406055fb779SNikita Popov  %0 = load i32, ptr %A, align 4
407f117ed54SRosie Sumpter  ret i32 %0
408f117ed54SRosie Sumpter}
409f117ed54SRosie Sumpter
410f117ed54SRosie Sumpter; test_12: Incoming phi node value for preheader is a variable
411055fb779SNikita Popovdefine i32 @test_12(ptr %A) {
412f117ed54SRosie Sumpterentry:
413f117ed54SRosie Sumpter  br label %while.cond1.preheader
414f117ed54SRosie Sumpter
415f117ed54SRosie Sumpterwhile.cond1.preheader:
416f117ed54SRosie Sumpter  %j.017 = phi i32 [ 0, %entry ], [ %j.1, %while.end ]
417f117ed54SRosie Sumpter  %i.016 = phi i32 [ 0, %entry ], [ %inc4, %while.end ]
418f117ed54SRosie Sumpter  %mul = mul i32 %i.016, 20
419f117ed54SRosie Sumpter  %cmp214 = icmp ult i32 %j.017, 20
420f117ed54SRosie Sumpter  br i1 %cmp214, label %while.body3.preheader, label %while.end
421f117ed54SRosie Sumpter
422f117ed54SRosie Sumpterwhile.body3.preheader:
423f117ed54SRosie Sumpter  br label %while.body3
424f117ed54SRosie Sumpter
425f117ed54SRosie Sumpterwhile.body3:
426f117ed54SRosie Sumpter  %j.115 = phi i32 [ %inc, %while.body3 ], [ %j.017, %while.body3.preheader ]
427f117ed54SRosie Sumpter  %add = add i32 %j.115, %mul
428055fb779SNikita Popov  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
429055fb779SNikita Popov  store i32 30, ptr %arrayidx, align 4
430f117ed54SRosie Sumpter  %inc = add nuw nsw i32 %j.115, 1
431f117ed54SRosie Sumpter  %cmp2 = icmp ult i32 %j.115, 19
432f117ed54SRosie Sumpter  br i1 %cmp2, label %while.body3, label %while.end.loopexit
433f117ed54SRosie Sumpter
434f117ed54SRosie Sumpterwhile.end.loopexit:
435f117ed54SRosie Sumpter  %inc.lcssa = phi i32 [ %inc, %while.body3 ]
436f117ed54SRosie Sumpter  br label %while.end
437f117ed54SRosie Sumpter
438f117ed54SRosie Sumpterwhile.end:
439f117ed54SRosie Sumpter  %j.1 = phi i32 [ %j.017, %while.cond1.preheader], [ %inc.lcssa, %while.end.loopexit ]
440f117ed54SRosie Sumpter  %inc4 = add i32 %i.016, 1
441f117ed54SRosie Sumpter  %cmp = icmp ult i32 %inc4, 11
442f117ed54SRosie Sumpter  br i1 %cmp, label %while.cond1.preheader, label %while.end5
443f117ed54SRosie Sumpter
444f117ed54SRosie Sumpterwhile.end5:
445055fb779SNikita Popov  %0 = load i32, ptr %A, align 4
446f117ed54SRosie Sumpter  ret i32 %0
447f117ed54SRosie Sumpter}
448f117ed54SRosie Sumpter
449d53b4beeSSjoerd Meijer; Outer loop conditional phi
450d53b4beeSSjoerd Meijerdefine i32 @e() {
451d53b4beeSSjoerd Meijerentry:
452d53b4beeSSjoerd Meijer  br label %for.body
453d53b4beeSSjoerd Meijer
454d53b4beeSSjoerd Meijerfor.body:                                         ; preds = %entry, %for.end16
455d53b4beeSSjoerd Meijer  %f.033 = phi i32 [ 0, %entry ], [ %inc18, %for.end16 ]
456d53b4beeSSjoerd Meijer  %g.032 = phi i32 [ undef, %entry ], [ %g.3.lcssa, %for.end16 ]
457d53b4beeSSjoerd Meijer  %.pr = add i32 10, 10
458d53b4beeSSjoerd Meijer  %tobool29 = icmp eq i32 %.pr, 0
459d53b4beeSSjoerd Meijer  br i1 %tobool29, label %for.end, label %for.body2.lr.ph
460d53b4beeSSjoerd Meijer
461d53b4beeSSjoerd Meijerfor.body2.lr.ph:                                  ; preds = %for.body
462d53b4beeSSjoerd Meijer  br label %for.cond1.for.end_crit_edge
463d53b4beeSSjoerd Meijer
464d53b4beeSSjoerd Meijerfor.cond1.for.end_crit_edge:                      ; preds = %for.body2.lr.ph
465d53b4beeSSjoerd Meijer  br label %for.end
466d53b4beeSSjoerd Meijer
467d53b4beeSSjoerd Meijerfor.end:                                          ; preds = %for.cond1.for.end_crit_edge, %for.body
468d53b4beeSSjoerd Meijer  %g.1.lcssa = phi i32 [ 0, %for.cond1.for.end_crit_edge ], [ %g.032, %for.body ]
469d53b4beeSSjoerd Meijer  br label %for.body5
470d53b4beeSSjoerd Meijer
471d53b4beeSSjoerd Meijerfor.body5:                                        ; preds = %for.end, %lor.end
472d53b4beeSSjoerd Meijer  %i.031 = phi i32 [ 0, %for.end ], [ %inc15, %lor.end ]
473d53b4beeSSjoerd Meijer  %g.230 = phi i32 [ %g.1.lcssa, %for.end ], [ %g.3, %lor.end ]
474d53b4beeSSjoerd Meijer  %0 = add i32 10, 10
475d53b4beeSSjoerd Meijer  %1 = add i32 10, 10
476d53b4beeSSjoerd Meijer  %tobool9 = icmp eq i32 %1, 0
477d53b4beeSSjoerd Meijer  br i1 %tobool9, label %lor.rhs, label %lor.end
478d53b4beeSSjoerd Meijer
479d53b4beeSSjoerd Meijerlor.rhs:                                          ; preds = %for.body5
480d53b4beeSSjoerd Meijer  %2 = add i32 10, 10
481d53b4beeSSjoerd Meijer  %call11 = add i32 10, 10
482d53b4beeSSjoerd Meijer  %tobool12 = icmp ne i32 %call11, 0
483d53b4beeSSjoerd Meijer  br label %lor.end
484d53b4beeSSjoerd Meijer
485d53b4beeSSjoerd Meijerlor.end:                                          ; preds = %for.body5, %lor.rhs
486d53b4beeSSjoerd Meijer  %g.3 = phi i32 [ %g.230, %for.body5 ], [ %call11, %lor.rhs ]
487d53b4beeSSjoerd Meijer  %3 = phi i1 [ true, %for.body5 ], [ %tobool12, %lor.rhs ]
488d53b4beeSSjoerd Meijer  %lor.ext = zext i1 %3 to i32
489d53b4beeSSjoerd Meijer  %inc15 = add nuw nsw i32 %i.031, 1
490d53b4beeSSjoerd Meijer  %exitcond = icmp ne i32 %inc15, 9
491d53b4beeSSjoerd Meijer  br i1 %exitcond, label %for.body5, label %for.end16
492d53b4beeSSjoerd Meijer
493d53b4beeSSjoerd Meijerfor.end16:                                        ; preds = %lor.end
494d53b4beeSSjoerd Meijer  %g.3.lcssa = phi i32 [ %g.3, %lor.end ]
495d53b4beeSSjoerd Meijer  %inc18 = add nuw nsw i32 %f.033, 1
496d53b4beeSSjoerd Meijer  %exitcond34 = icmp ne i32 %inc18, 7
497d53b4beeSSjoerd Meijer  br i1 %exitcond34, label %for.body, label %for.end19
498d53b4beeSSjoerd Meijer
499d53b4beeSSjoerd Meijerfor.end19:                                        ; preds = %for.end16
500d53b4beeSSjoerd Meijer  ret i32 undef
501d53b4beeSSjoerd Meijer}
502706ead0eSSjoerd Meijer
503706ead0eSSjoerd Meijer; A 3d loop corresponding to:
504706ead0eSSjoerd Meijer;
505706ead0eSSjoerd Meijer; for (int i = 0; i < N; ++i)
506706ead0eSSjoerd Meijer;    for (int j = 0; j < N; ++j)
507706ead0eSSjoerd Meijer;      for (int k = 0; k < N; ++k)
508706ead0eSSjoerd Meijer;        f(&A[i + N * (j + N * k)]);
509706ead0eSSjoerd Meijer;
510*2d69827cSNikita Popovdefine void @d3_1(ptr %A, i32 %N) {
511706ead0eSSjoerd Meijerentry:
512706ead0eSSjoerd Meijer  %cmp35 = icmp sgt i32 %N, 0
513706ead0eSSjoerd Meijer  br i1 %cmp35, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
514706ead0eSSjoerd Meijer
515706ead0eSSjoerd Meijerfor.cond1.preheader.lr.ph:
516706ead0eSSjoerd Meijer  br label %for.cond1.preheader.us
517706ead0eSSjoerd Meijer
518706ead0eSSjoerd Meijerfor.cond1.preheader.us:
519706ead0eSSjoerd Meijer  %i.036.us = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc15.us, %for.cond1.for.cond.cleanup3_crit_edge.us ]
520706ead0eSSjoerd Meijer  br i1 true, label %for.cond5.preheader.us.us.preheader, label %for.cond5.preheader.us52.preheader
521706ead0eSSjoerd Meijer
522706ead0eSSjoerd Meijerfor.cond5.preheader.us52.preheader:
523706ead0eSSjoerd Meijer  br label %for.cond5.preheader.us52
524706ead0eSSjoerd Meijer
525706ead0eSSjoerd Meijerfor.cond5.preheader.us.us.preheader:
526706ead0eSSjoerd Meijer  br label %for.cond5.preheader.us.us
527706ead0eSSjoerd Meijer
528706ead0eSSjoerd Meijerfor.cond5.preheader.us52:
529706ead0eSSjoerd Meijer  br i1 false, label %for.cond5.preheader.us52, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit58
530706ead0eSSjoerd Meijer
531706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit:
532706ead0eSSjoerd Meijer  br label %for.cond1.for.cond.cleanup3_crit_edge.us
533706ead0eSSjoerd Meijer
534706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit58:
535706ead0eSSjoerd Meijer  br label %for.cond1.for.cond.cleanup3_crit_edge.us
536706ead0eSSjoerd Meijer
537706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us:
538706ead0eSSjoerd Meijer  %inc15.us = add nuw nsw i32 %i.036.us, 1
539706ead0eSSjoerd Meijer  %cmp.us = icmp slt i32 %inc15.us, %N
540706ead0eSSjoerd Meijer  br i1 %cmp.us, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit
541706ead0eSSjoerd Meijer
542706ead0eSSjoerd Meijerfor.cond5.preheader.us.us:
543706ead0eSSjoerd Meijer  %j.033.us.us = phi i32 [ %inc12.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.cond5.preheader.us.us.preheader ]
544706ead0eSSjoerd Meijer  br label %for.body8.us.us
545706ead0eSSjoerd Meijer
546706ead0eSSjoerd Meijerfor.cond5.for.cond.cleanup7_crit_edge.us.us:
547706ead0eSSjoerd Meijer  %inc12.us.us = add nuw nsw i32 %j.033.us.us, 1
548706ead0eSSjoerd Meijer  %cmp2.us.us = icmp slt i32 %inc12.us.us, %N
549706ead0eSSjoerd Meijer  br i1 %cmp2.us.us, label %for.cond5.preheader.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit
550706ead0eSSjoerd Meijer
551706ead0eSSjoerd Meijerfor.body8.us.us:
552706ead0eSSjoerd Meijer  %k.031.us.us = phi i32 [ 0, %for.cond5.preheader.us.us ], [ %inc.us.us, %for.body8.us.us ]
553706ead0eSSjoerd Meijer  %mul.us.us = mul nsw i32 %k.031.us.us, %N
554706ead0eSSjoerd Meijer  %add.us.us = add nsw i32 %mul.us.us, %j.033.us.us
555706ead0eSSjoerd Meijer  %mul9.us.us = mul nsw i32 %add.us.us, %N
556706ead0eSSjoerd Meijer  %add10.us.us = add nsw i32 %mul9.us.us, %i.036.us
557706ead0eSSjoerd Meijer  %idxprom.us.us = sext i32 %add10.us.us to i64
558055fb779SNikita Popov  %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us
559055fb779SNikita Popov  tail call void @f(ptr %arrayidx.us.us) #2
560706ead0eSSjoerd Meijer  %inc.us.us = add nuw nsw i32 %k.031.us.us, 1
561706ead0eSSjoerd Meijer  %cmp6.us.us = icmp slt i32 %inc.us.us, %N
562706ead0eSSjoerd Meijer  br i1 %cmp6.us.us, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us
563706ead0eSSjoerd Meijer
564706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit:
565706ead0eSSjoerd Meijer  br label %for.cond.cleanup
566706ead0eSSjoerd Meijer
567706ead0eSSjoerd Meijerfor.cond.cleanup:
568706ead0eSSjoerd Meijer  ret void
569706ead0eSSjoerd Meijer}
570706ead0eSSjoerd Meijer
571706ead0eSSjoerd Meijer; A 3d loop corresponding to:
572706ead0eSSjoerd Meijer;
573706ead0eSSjoerd Meijer;   for (int i = 0; i < N; ++i)
574706ead0eSSjoerd Meijer;     for (int j = 0; j < M; ++j) {
575706ead0eSSjoerd Meijer;       A[i*M+j] = 0;
576706ead0eSSjoerd Meijer;       for (int k = 0; k < N; ++k)
577706ead0eSSjoerd Meijer;         g();
578706ead0eSSjoerd Meijer;     }
579706ead0eSSjoerd Meijer;
580*2d69827cSNikita Popovdefine void @d3_3(ptr nocapture %A, i32 %N, i32 %M) {
581706ead0eSSjoerd Meijerentry:
582706ead0eSSjoerd Meijer  %cmp29 = icmp sgt i32 %N, 0
583706ead0eSSjoerd Meijer  br i1 %cmp29, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
584706ead0eSSjoerd Meijer
585706ead0eSSjoerd Meijerfor.cond1.preheader.lr.ph:
586706ead0eSSjoerd Meijer  %cmp227 = icmp sgt i32 %M, 0
587706ead0eSSjoerd Meijer  br i1 %cmp227, label %for.cond1.preheader.us.preheader, label %for.cond1.preheader.preheader
588706ead0eSSjoerd Meijer
589706ead0eSSjoerd Meijerfor.cond1.preheader.preheader:
590706ead0eSSjoerd Meijer  br label %for.cond.cleanup.loopexit49
591706ead0eSSjoerd Meijer
592706ead0eSSjoerd Meijerfor.cond1.preheader.us.preheader:
593706ead0eSSjoerd Meijer  br label %for.cond1.preheader.us
594706ead0eSSjoerd Meijer
595706ead0eSSjoerd Meijerfor.cond1.preheader.us:
596706ead0eSSjoerd Meijer  %i.030.us = phi i32 [ %inc13.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %for.cond1.preheader.us.preheader ]
597706ead0eSSjoerd Meijer  %mul.us = mul nsw i32 %i.030.us, %M
598706ead0eSSjoerd Meijer  br i1 true, label %for.body4.us.us.preheader, label %for.body4.us32.preheader
599706ead0eSSjoerd Meijer
600706ead0eSSjoerd Meijerfor.body4.us32.preheader:
601706ead0eSSjoerd Meijer  br label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit48
602706ead0eSSjoerd Meijer
603706ead0eSSjoerd Meijerfor.body4.us.us.preheader:
604706ead0eSSjoerd Meijer  br label %for.body4.us.us
605706ead0eSSjoerd Meijer
606706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit:
607706ead0eSSjoerd Meijer  br label %for.cond1.for.cond.cleanup3_crit_edge.us
608706ead0eSSjoerd Meijer
609706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit48:
610706ead0eSSjoerd Meijer  br label %for.cond1.for.cond.cleanup3_crit_edge.us
611706ead0eSSjoerd Meijer
612706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us:
613706ead0eSSjoerd Meijer  %inc13.us = add nuw nsw i32 %i.030.us, 1
614706ead0eSSjoerd Meijer  %exitcond51 = icmp ne i32 %inc13.us, %N
615706ead0eSSjoerd Meijer  br i1 %exitcond51, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit
616706ead0eSSjoerd Meijer
617706ead0eSSjoerd Meijerfor.body4.us.us:
618706ead0eSSjoerd Meijer  %j.028.us.us = phi i32 [ %inc10.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.body4.us.us.preheader ]
619706ead0eSSjoerd Meijer  %add.us.us = add nsw i32 %j.028.us.us, %mul.us
620706ead0eSSjoerd Meijer  %idxprom.us.us = sext i32 %add.us.us to i64
621055fb779SNikita Popov  %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us
622055fb779SNikita Popov  store i32 0, ptr %arrayidx.us.us, align 4
623706ead0eSSjoerd Meijer  br label %for.body8.us.us
624706ead0eSSjoerd Meijer
625706ead0eSSjoerd Meijerfor.cond5.for.cond.cleanup7_crit_edge.us.us:
626706ead0eSSjoerd Meijer  %inc10.us.us = add nuw nsw i32 %j.028.us.us, 1
627706ead0eSSjoerd Meijer  %exitcond50 = icmp ne i32 %inc10.us.us, %M
628706ead0eSSjoerd Meijer  br i1 %exitcond50, label %for.body4.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit
629706ead0eSSjoerd Meijer
630706ead0eSSjoerd Meijerfor.body8.us.us:
631706ead0eSSjoerd Meijer  %k.026.us.us = phi i32 [ 0, %for.body4.us.us ], [ %inc.us.us, %for.body8.us.us ]
632055fb779SNikita Popov  tail call void @g() #2
633706ead0eSSjoerd Meijer  %inc.us.us = add nuw nsw i32 %k.026.us.us, 1
634706ead0eSSjoerd Meijer  %exitcond = icmp ne i32 %inc.us.us, %N
635706ead0eSSjoerd Meijer  br i1 %exitcond, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us
636706ead0eSSjoerd Meijer
637706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit:
638706ead0eSSjoerd Meijer  br label %for.cond.cleanup
639706ead0eSSjoerd Meijer
640706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit49:
641706ead0eSSjoerd Meijer  br label %for.cond.cleanup
642706ead0eSSjoerd Meijer
643706ead0eSSjoerd Meijerfor.cond.cleanup:
644706ead0eSSjoerd Meijer  ret void
645706ead0eSSjoerd Meijer}
646706ead0eSSjoerd Meijer
647bc43078fSSjoerd Meijer; Backedge-taken count is not predictable.
648bc43078fSSjoerd Meijer%struct.Limits = type { i16, i16 }
649055fb779SNikita Popovdefine void @backedge_count(ptr %lim) {
650bc43078fSSjoerd Meijerentry:
651055fb779SNikita Popov  %M = getelementptr inbounds %struct.Limits, ptr %lim, i32 0, i32 1
652055fb779SNikita Popov  %0 = load i16, ptr %lim, align 2
653bc43078fSSjoerd Meijer  %cmp20 = icmp sgt i16 %0, 0
654bc43078fSSjoerd Meijer  br i1 %cmp20, label %for.cond2.preheader.preheader, label %for.cond.cleanup
655bc43078fSSjoerd Meijer
656bc43078fSSjoerd Meijerfor.cond2.preheader.preheader:
657055fb779SNikita Popov  %.pre = load i16, ptr %M, align 2
658bc43078fSSjoerd Meijer  br label %for.cond2.preheader
659bc43078fSSjoerd Meijer
660bc43078fSSjoerd Meijerfor.cond2.preheader:
661bc43078fSSjoerd Meijer  %1 = phi i16 [ %3, %for.cond.cleanup6 ], [ %0, %for.cond2.preheader.preheader ]
662bc43078fSSjoerd Meijer  %2 = phi i16 [ %4, %for.cond.cleanup6 ], [ %.pre, %for.cond2.preheader.preheader ]
663bc43078fSSjoerd Meijer  %i.021 = phi i32 [ %inc9, %for.cond.cleanup6 ], [ 0, %for.cond2.preheader.preheader ]
664bc43078fSSjoerd Meijer  %cmp417 = icmp sgt i16 %2, 0
665bc43078fSSjoerd Meijer  br i1 %cmp417, label %for.body7, label %for.cond.cleanup6
666bc43078fSSjoerd Meijer
667bc43078fSSjoerd Meijerfor.cond.cleanup:
668bc43078fSSjoerd Meijer  ret void
669bc43078fSSjoerd Meijer
670bc43078fSSjoerd Meijerfor.cond.cleanup6.loopexit:
671055fb779SNikita Popov  %.pre22 = load i16, ptr %lim, align 2
672bc43078fSSjoerd Meijer  br label %for.cond.cleanup6
673bc43078fSSjoerd Meijer
674bc43078fSSjoerd Meijerfor.cond.cleanup6:
675bc43078fSSjoerd Meijer  %3 = phi i16 [ %.pre22, %for.cond.cleanup6.loopexit ], [ %1, %for.cond2.preheader ]
676bc43078fSSjoerd Meijer  %4 = phi i16 [ %5, %for.cond.cleanup6.loopexit ], [ %2, %for.cond2.preheader ]
677bc43078fSSjoerd Meijer  %inc9 = add nuw nsw i32 %i.021, 1
678bc43078fSSjoerd Meijer  %conv = sext i16 %3 to i32
679bc43078fSSjoerd Meijer  %cmp = icmp slt i32 %inc9, %conv
680bc43078fSSjoerd Meijer  br i1 %cmp, label %for.cond2.preheader, label %for.cond.cleanup
681bc43078fSSjoerd Meijer
682bc43078fSSjoerd Meijerfor.body7:
683bc43078fSSjoerd Meijer  %j.018 = phi i32 [ %inc, %for.body7 ], [ 0, %for.cond2.preheader ]
684055fb779SNikita Popov  tail call void @g()
685bc43078fSSjoerd Meijer  %inc = add nuw nsw i32 %j.018, 1
686055fb779SNikita Popov  %5 = load i16, ptr %M, align 2
687bc43078fSSjoerd Meijer  %conv3 = sext i16 %5 to i32
688bc43078fSSjoerd Meijer  %cmp4 = icmp slt i32 %inc, %conv3
689bc43078fSSjoerd Meijer  br i1 %cmp4, label %for.body7, label %for.cond.cleanup6.loopexit
690bc43078fSSjoerd Meijer}
691bc43078fSSjoerd Meijer
692f117ed54SRosie Sumpter; Invalid trip count
693055fb779SNikita Popovdefine void @invalid_tripCount(ptr %a, i32 %b, i32 %c, i32 %initial-mutations, i32 %statemutations) {
694f117ed54SRosie Sumpterentry:
695f117ed54SRosie Sumpter  %iszero = icmp eq i32 %b, 0
696f117ed54SRosie Sumpter  br i1 %iszero, label %for.empty, label %for.loopinit
697f117ed54SRosie Sumpterfor.loopinit:
698f117ed54SRosie Sumpter  br label %for.loopbody.outer
699f117ed54SRosie Sumpterfor.loopbody.outer:
700f117ed54SRosie Sumpter  %for.count.ph = phi i32 [ %c, %for.refetch ], [ %b, %for.loopinit ]
701f117ed54SRosie Sumpter  br label %for.loopbody
702f117ed54SRosie Sumpterfor.loopbody:
703f117ed54SRosie Sumpter  %for.index = phi i32 [ %1, %for.notmutated ], [ 0, %for.loopbody.outer ]
704f117ed54SRosie Sumpter  %0 = icmp eq i32 %statemutations, %initial-mutations
705f117ed54SRosie Sumpter  br i1 %0, label %for.notmutated, label %for.mutated
706f117ed54SRosie Sumpterfor.mutated:
707055fb779SNikita Popov  call void @objc_enumerationMutation(ptr %a)
708f117ed54SRosie Sumpter  br label %for.notmutated
709f117ed54SRosie Sumpterfor.notmutated:
710f117ed54SRosie Sumpter  %1 = add nuw i32 %for.index, 1
711f117ed54SRosie Sumpter  %2 = icmp ult i32 %1, %for.count.ph
712f117ed54SRosie Sumpter  br i1 %2, label %for.loopbody, label %for.refetch
713f117ed54SRosie Sumpterfor.refetch:
714f117ed54SRosie Sumpter  %3 = icmp eq i32 %c, 0
715f117ed54SRosie Sumpter  br i1 %3, label %for.empty.loopexit, label %for.loopbody.outer
716f117ed54SRosie Sumpterfor.empty.loopexit:
717f117ed54SRosie Sumpter  br label %for.empty
718f117ed54SRosie Sumpterfor.empty:
719f117ed54SRosie Sumpter  ret void
720f117ed54SRosie Sumpter}
721f117ed54SRosie Sumpter
722055fb779SNikita Popovdeclare void @objc_enumerationMutation(ptr)
723055fb779SNikita Popovdeclare dso_local void @f(ptr)
724706ead0eSSjoerd Meijerdeclare dso_local void @g(...)
725