xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/X86/fold-loop-of-urem.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -mtriple=x86_64-unknown-unknown --loop-simplify -codegenprepare -S | FileCheck %s
3
4declare void @use.i32(i32)
5declare void @use.2xi64(<2 x i64>)
6declare void @do_stuff0()
7declare void @do_stuff1()
8declare i1 @get.i1()
9declare i32 @get.i32()
10
11define void @simple_urem_to_sel(i32 %N, i32 %rem_amt) nounwind {
12; CHECK-LABEL: define void @simple_urem_to_sel(
13; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0:[0-9]+]] {
14; CHECK-NEXT:  [[ENTRY:.*:]]
15; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
16; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
17; CHECK:       [[FOR_BODY_PREHEADER]]:
18; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
19; CHECK:       [[FOR_COND_CLEANUP]]:
20; CHECK-NEXT:    ret void
21; CHECK:       [[FOR_BODY]]:
22; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
23; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
24; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
25; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
26; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
27; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
28; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
29; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
30; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
31;
32entry:
33  %cmp3.not = icmp eq i32 %N, 0
34  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
35
36for.cond.cleanup:
37  ret void
38
39for.body:
40  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
41  %rem = urem i32 %i.04, %rem_amt
42  tail call void @use.i32(i32 %rem)
43  %inc = add nuw i32 %i.04, 1
44  %exitcond.not = icmp eq i32 %inc, %N
45  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
46}
47
48define void @simple_urem_to_sel_fail_not_in_loop(i32 %N, i32 %rem_amt) nounwind {
49; CHECK-LABEL: define void @simple_urem_to_sel_fail_not_in_loop(
50; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
51; CHECK-NEXT:  [[ENTRY:.*]]:
52; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
53; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
54; CHECK:       [[FOR_BODY_PREHEADER]]:
55; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
56; CHECK:       [[FOR_COND_CLEANUP]]:
57; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
58; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_05]], [[REM_AMT]]
59; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
60; CHECK-NEXT:    ret void
61; CHECK:       [[FOR_BODY]]:
62; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
63; CHECK-NEXT:    tail call void @use.i32(i32 [[I_04]])
64; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
65; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
66; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
67;
68entry:
69  %cmp3.not = icmp eq i32 %N, 0
70  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
71
72for.cond.cleanup:
73  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
74  %rem = urem i32 %i.05, %rem_amt
75  tail call void @use.i32(i32 %rem)
76  ret void
77
78for.body:
79  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
80  tail call void @use.i32(i32 %i.04)
81  %inc = add nuw i32 %i.04, 1
82  %exitcond.not = icmp eq i32 %inc, %N
83  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
84}
85
86define void @simple_urem_to_sel_inner_loop(i32 %N, i32 %M) nounwind {
87; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop(
88; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {
89; CHECK-NEXT:  [[ENTRY:.*:]]
90; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()
91; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
92; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
93; CHECK:       [[FOR_BODY_PREHEADER]]:
94; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
95; CHECK:       [[FOR_COND_CLEANUP]]:
96; CHECK-NEXT:    ret void
97; CHECK:       [[FOR_BODY]]:
98; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ]
99; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
100; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0
101; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]
102; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:
103; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]
104; CHECK:       [[FOR_INNER_BODY]]:
105; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]
106; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
107; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1
108; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]
109; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]
110; CHECK:       [[FOR_INNER_COND_CLEANUP]]:
111; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
112; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
113; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
114; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
115; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
116; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
117;
118entry:
119  %rem_amt = call i32 @get.i32()
120  %cmp3.not = icmp eq i32 %N, 0
121  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
122
123for.cond.cleanup:
124  ret void
125
126for.body:
127  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]
128
129  %cmp_inner = icmp eq i32 %M, 0
130  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body
131
132for.inner.body:
133  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]
134  %rem = urem i32 %i.04, %rem_amt
135  tail call void @use.i32(i32 %rem)
136  %inc_inner = add nuw i32 %j, 1
137  %exitcond_inner = icmp eq i32 %inc_inner, %M
138  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body
139
140for.inner.cond.cleanup:
141  %inc = add nuw i32 %i.04, 1
142  %exitcond.not = icmp eq i32 %inc, %N
143  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
144}
145
146define void @simple_urem_to_sel_inner_loop_fail_not_invariant(i32 %N, i32 %M) nounwind {
147; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop_fail_not_invariant(
148; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {
149; CHECK-NEXT:  [[ENTRY:.*:]]
150; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
151; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
152; CHECK:       [[FOR_BODY_PREHEADER]]:
153; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
154; CHECK:       [[FOR_COND_CLEANUP]]:
155; CHECK-NEXT:    ret void
156; CHECK:       [[FOR_BODY]]:
157; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
158; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()
159; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0
160; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]
161; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:
162; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]
163; CHECK:       [[FOR_INNER_BODY]]:
164; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]
165; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
166; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
167; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1
168; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]
169; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]
170; CHECK:       [[FOR_INNER_COND_CLEANUP]]:
171; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
172; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
173; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
174;
175entry:
176  %cmp3.not = icmp eq i32 %N, 0
177  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
178
179for.cond.cleanup:
180  ret void
181
182for.body:
183  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]
184  %rem_amt = call i32 @get.i32()
185  %cmp_inner = icmp eq i32 %M, 0
186  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body
187
188for.inner.body:
189  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]
190  %rem = urem i32 %i.04, %rem_amt
191  tail call void @use.i32(i32 %rem)
192  %inc_inner = add nuw i32 %j, 1
193  %exitcond_inner = icmp eq i32 %inc_inner, %M
194  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body
195
196for.inner.cond.cleanup:
197  %inc = add nuw i32 %i.04, 1
198  %exitcond.not = icmp eq i32 %inc, %N
199  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
200}
201
202define void @simple_urem_to_sel_nested2(i32 %N, i32 %rem_amt) nounwind {
203; CHECK-LABEL: define void @simple_urem_to_sel_nested2(
204; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
205; CHECK-NEXT:  [[ENTRY:.*:]]
206; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
207; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
208; CHECK:       [[FOR_BODY_PREHEADER]]:
209; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
210; CHECK:       [[FOR_COND_CLEANUP]]:
211; CHECK-NEXT:    ret void
212; CHECK:       [[FOR_BODY]]:
213; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY_TAIL:.*]] ]
214; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
215; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
216; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]
217; CHECK:       [[FOR_BODY0]]:
218; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()
219; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY2:.*]]
220; CHECK:       [[FOR_BODY2]]:
221; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()
222; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]
223; CHECK:       [[FOR_BODY1]]:
224; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
225; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
226; CHECK:       [[FOR_BODY_TAIL]]:
227; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
228; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
229; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
230; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
231; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
232; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
233;
234entry:
235  %cmp3.not = icmp eq i32 %N, 0
236  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
237
238for.cond.cleanup:
239  ret void
240
241for.body:
242  %i.04 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]
243  %cond0 = call i1 @get.i1()
244  br i1 %cond0, label %for.body0, label %for.body.tail
245for.body0:
246  %cond1 = call i1 @get.i1()
247  br i1 %cond1, label %for.body1, label %for.body2
248for.body2:
249  %cond2 = call i1 @get.i1()
250  br i1 %cond2, label %for.body1, label %for.body.tail
251for.body1:
252  %rem = urem i32 %i.04, %rem_amt
253  tail call void @use.i32(i32 %rem)
254  br label %for.body.tail
255for.body.tail:
256  %inc = add nuw i32 %i.04, 1
257  %exitcond.not = icmp eq i32 %inc, %N
258  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
259}
260
261define void @simple_urem_fail_bad_incr3(i32 %N, i32 %rem_amt) nounwind {
262; CHECK-LABEL: define void @simple_urem_fail_bad_incr3(
263; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
264; CHECK-NEXT:  [[ENTRY:.*:]]
265; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
266; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
267; CHECK:       [[FOR_BODY_PREHEADER]]:
268; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
269; CHECK:       [[FOR_COND_CLEANUP]]:
270; CHECK-NEXT:    ret void
271; CHECK:       [[FOR_BODY]]:
272; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
273; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY2:.*]]
274; CHECK:       [[FOR_BODY0]]:
275; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()
276; CHECK-NEXT:    [[VAL:%.*]] = call i32 @get.i32()
277; CHECK-NEXT:    [[INC:%.*]] = add nuw i32 [[VAL]], 1
278; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY_TAIL:.*]]
279; CHECK:       [[FOR_BODY2]]:
280; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()
281; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]
282; CHECK:       [[FOR_BODY1]]:
283; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY0]] ], [ 0, %[[FOR_BODY2]] ]
284; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
285; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
286; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
287; CHECK:       [[FOR_BODY_TAIL]]:
288; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()
289; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
290;
291entry:
292  %cmp3.not = icmp eq i32 %N, 0
293  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
294
295for.cond.cleanup:
296  ret void
297
298for.body:
299  %cond0 = call i1 @get.i1()
300  br i1 %cond0, label %for.body0, label %for.body2
301for.body0:
302  %cond1 = call i1 @get.i1()
303  %val = call i32 @get.i32()
304  %inc = add nuw i32 %val, 1
305  br i1 %cond1, label %for.body1, label %for.body.tail
306for.body2:
307  %cond2 = call i1 @get.i1()
308  br i1 %cond2, label %for.body1, label %for.body.tail
309for.body1:
310  %i.04 = phi i32 [ %inc, %for.body0], [ 0, %for.body2 ]
311  %rem = urem i32 %i.04, %rem_amt
312  tail call void @use.i32(i32 %rem)
313  br label %for.body.tail
314for.body.tail:
315  %exitcond.not = call i1 @get.i1()
316  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
317}
318
319define void @simple_urem_to_sel_vec(<2 x i64> %rem_amt) nounwind {
320; CHECK-LABEL: define void @simple_urem_to_sel_vec(
321; CHECK-SAME: <2 x i64> [[REM_AMT:%.*]]) #[[ATTR0]] {
322; CHECK-NEXT:  [[ENTRY:.*]]:
323; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
324; CHECK:       [[FOR_COND_CLEANUP:.*]]:
325; CHECK-NEXT:    ret void
326; CHECK:       [[FOR_BODY]]:
327; CHECK-NEXT:    [[REM:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
328; CHECK-NEXT:    [[I_04:%.*]] = phi <2 x i64> [ [[INC:%.*]], %[[FOR_BODY]] ], [ zeroinitializer, %[[ENTRY]] ]
329; CHECK-NEXT:    tail call void @use.2xi64(<2 x i64> [[REM]])
330; CHECK-NEXT:    [[TMP1:%.*]] = add nuw <2 x i64> [[REM]], splat (i64 1)
331; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], [[REM_AMT]]
332; CHECK-NEXT:    [[TMP3]] = select <2 x i1> [[TMP2]], <2 x i64> zeroinitializer, <2 x i64> [[TMP1]]
333; CHECK-NEXT:    [[INC]] = add nuw <2 x i64> [[I_04]], splat (i64 1)
334; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()
335; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
336;
337entry:
338  br label %for.body
339
340for.cond.cleanup:
341  ret void
342
343for.body:
344  %i.04 = phi <2 x i64> [ %inc, %for.body ], [ zeroinitializer, %entry ]
345  %rem = urem <2 x i64> %i.04, %rem_amt
346  tail call void @use.2xi64(<2 x i64> %rem)
347  %inc = add nuw <2 x i64> %i.04, <i64 1, i64 1>
348  %exitcond.not = call i1 @get.i1()
349  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
350}
351
352define void @simple_urem_fail_bad_incr(i32 %N, i32 %rem_amt) nounwind {
353; CHECK-LABEL: define void @simple_urem_fail_bad_incr(
354; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
355; CHECK-NEXT:  [[ENTRY:.*:]]
356; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
357; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
358; CHECK:       [[FOR_BODY_PREHEADER]]:
359; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
360; CHECK:       [[FOR_COND_CLEANUP]]:
361; CHECK-NEXT:    ret void
362; CHECK:       [[FOR_BODY]]:
363; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
364; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
365; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]
366; CHECK:       [[FOR_BODY0]]:
367; CHECK-NEXT:    [[SOME_VAL:%.*]] = call i32 @get.i32()
368; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
369; CHECK:       [[FOR_BODY_TAIL]]:
370; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[I_03]], %[[FOR_BODY]] ], [ [[SOME_VAL]], %[[FOR_BODY0]] ]
371; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
372; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
373; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
374; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
375; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
376;
377entry:
378  %cmp3.not = icmp eq i32 %N, 0
379  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
380
381for.cond.cleanup:
382  ret void
383
384for.body:
385  %i.03 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]
386  %cond0 = call i1 @get.i1()
387  br i1 %cond0, label %for.body0, label %for.body.tail
388for.body0:
389  %some_val = call i32 @get.i32()
390  br label %for.body.tail
391
392for.body.tail:
393  %i.04 = phi i32 [ %i.03, %for.body ], [ %some_val, %for.body0 ]
394  %rem = urem i32 %i.04, %rem_amt
395  tail call void @use.i32(i32 %rem)
396  %inc = add nuw i32 %i.04, 1
397  %exitcond.not = icmp eq i32 %inc, %N
398  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
399}
400
401define void @simple_urem_to_sel_second_acc(i32 %N, i32 %rem_amt) nounwind {
402; CHECK-LABEL: define void @simple_urem_to_sel_second_acc(
403; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
404; CHECK-NEXT:  [[ENTRY:.*:]]
405; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 2
406; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
407; CHECK:       [[FOR_BODY_PREHEADER]]:
408; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
409; CHECK:       [[FOR_COND_CLEANUP]]:
410; CHECK-NEXT:    ret void
411; CHECK:       [[FOR_BODY]]:
412; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
413; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
414; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ [[INC2:%.*]], %[[FOR_BODY]] ], [ 1, %[[FOR_BODY_PREHEADER]] ]
415; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
416; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
417; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
418; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
419; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
420; CHECK-NEXT:    [[INC2]] = add nuw i32 [[I_05]], 2
421; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ugt i32 [[INC2]], [[N]]
422; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
423;
424entry:
425  %cmp3.not = icmp ult i32 %N, 2
426  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
427
428for.cond.cleanup:
429  ret void
430
431for.body:
432  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
433  %i.05 = phi i32 [ %inc2, %for.body ], [ 1, %entry ]
434  %rem = urem i32 %i.04, %rem_amt
435  tail call void @use.i32(i32 %rem)
436  %inc = add nuw i32 %i.04, 1
437  %inc2 = add nuw i32 %i.05, 2
438  %exitcond.not = icmp ugt i32 %inc2, %N
439  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
440}
441
442define void @simple_urem_fail_srem(i32 %N, i32 %rem_amt) nounwind {
443; CHECK-LABEL: define void @simple_urem_fail_srem(
444; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
445; CHECK-NEXT:  [[ENTRY:.*:]]
446; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
447; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
448; CHECK:       [[FOR_BODY_PREHEADER]]:
449; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
450; CHECK:       [[FOR_COND_CLEANUP]]:
451; CHECK-NEXT:    ret void
452; CHECK:       [[FOR_BODY]]:
453; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
454; CHECK-NEXT:    [[REM:%.*]] = srem i32 [[I_04]], [[REM_AMT]]
455; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
456; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
457; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
458; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
459;
460entry:
461  %cmp3.not = icmp eq i32 %N, 0
462  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
463
464for.cond.cleanup:
465  ret void
466
467for.body:
468  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
469  %rem = srem i32 %i.04, %rem_amt
470  tail call void @use.i32(i32 %rem)
471  %inc = add nuw i32 %i.04, 1
472  %exitcond.not = icmp eq i32 %inc, %N
473  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
474}
475
476define void @simple_urem_fail_missing_nuw(i32 %N, i32 %rem_amt) nounwind {
477; CHECK-LABEL: define void @simple_urem_fail_missing_nuw(
478; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
479; CHECK-NEXT:  [[ENTRY:.*:]]
480; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
481; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
482; CHECK:       [[FOR_BODY_PREHEADER]]:
483; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
484; CHECK:       [[FOR_COND_CLEANUP]]:
485; CHECK-NEXT:    ret void
486; CHECK:       [[FOR_BODY]]:
487; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
488; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
489; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
490; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_04]], 1
491; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
492; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
493;
494entry:
495  %cmp3.not = icmp eq i32 %N, 0
496  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
497
498for.cond.cleanup:
499  ret void
500
501for.body:
502  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
503  %rem = urem i32 %i.04, %rem_amt
504  tail call void @use.i32(i32 %rem)
505  %inc = add nsw i32 %i.04, 1
506  %exitcond.not = icmp eq i32 %inc, %N
507  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
508}
509
510define void @simple_urem_fail_bad_incr2(i32 %N, i32 %rem_amt) nounwind {
511; CHECK-LABEL: define void @simple_urem_fail_bad_incr2(
512; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
513; CHECK-NEXT:  [[ENTRY:.*:]]
514; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
515; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
516; CHECK:       [[FOR_BODY_PREHEADER]]:
517; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
518; CHECK:       [[FOR_COND_CLEANUP]]:
519; CHECK-NEXT:    ret void
520; CHECK:       [[FOR_BODY]]:
521; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
522; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
523; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
524; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 2
525; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
526; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
527;
528entry:
529  %cmp3.not = icmp eq i32 %N, 0
530  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
531
532for.cond.cleanup:
533  ret void
534
535for.body:
536  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
537  %rem = urem i32 %i.04, %rem_amt
538  tail call void @use.i32(i32 %rem)
539  %inc = add nuw i32 %i.04, 2
540  %exitcond.not = icmp eq i32 %inc, %N
541  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
542}
543
544define void @simple_urem_non_zero_entry4(i32 %N, i32 %rem_amt) nounwind {
545; CHECK-LABEL: define void @simple_urem_non_zero_entry4(
546; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
547; CHECK-NEXT:  [[ENTRY:.*:]]
548; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
549; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
550; CHECK:       [[FOR_BODY_PREHEADER]]:
551; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
552; CHECK:       [[FOR_COND_CLEANUP]]:
553; CHECK-NEXT:    ret void
554; CHECK:       [[FOR_BODY]]:
555; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]
556; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
557; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
558; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
559; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
560; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
561;
562entry:
563  %cmp3.not = icmp eq i32 %N, 0
564  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
565
566for.cond.cleanup:
567  ret void
568
569for.body:
570  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]
571  %rem = urem i32 %i.04, %rem_amt
572  tail call void @use.i32(i32 %rem)
573  %inc = add nuw i32 %i.04, 1
574  %exitcond.not = icmp eq i32 %inc, %N
575  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
576}
577
578define void @simple_urem_skip_const_rem_amt(i32 %N) nounwind {
579; CHECK-LABEL: define void @simple_urem_skip_const_rem_amt(
580; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
581; CHECK-NEXT:  [[ENTRY:.*:]]
582; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
583; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
584; CHECK:       [[FOR_BODY_PREHEADER]]:
585; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
586; CHECK:       [[FOR_COND_CLEANUP]]:
587; CHECK-NEXT:    ret void
588; CHECK:       [[FOR_BODY]]:
589; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]
590; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], 19
591; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
592; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
593; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
594; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
595;
596entry:
597  %cmp3.not = icmp eq i32 %N, 0
598  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
599
600for.cond.cleanup:
601  ret void
602
603for.body:
604  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]
605  %rem = urem i32 %i.04, 19
606  tail call void @use.i32(i32 %rem)
607  %inc = add nuw i32 %i.04, 1
608  %exitcond.not = icmp eq i32 %inc, %N
609  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
610}
611
612define void @simple_urem_fail_no_preheader_non_canonical(i32 %N, i32 %rem_amt) nounwind {
613; CHECK-LABEL: define void @simple_urem_fail_no_preheader_non_canonical(
614; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
615; CHECK-NEXT:  [[ENTRY:.*]]:
616; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
617; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_BODY_PREHEADER:.*]], label %[[FOR_BODY1:.*]]
618; CHECK:       [[FOR_COND_CLEANUP:.*]]:
619; CHECK-NEXT:    ret void
620; CHECK:       [[FOR_BODY1]]:
621; CHECK-NEXT:    br label %[[FOR_BODY_PREHEADER]]
622; CHECK:       [[FOR_BODY_PREHEADER]]:
623; CHECK-NEXT:    [[I_04_PH:%.*]] = phi i32 [ 1, %[[FOR_BODY1]] ], [ 0, %[[ENTRY]] ]
624; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
625; CHECK:       [[FOR_BODY]]:
626; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[I_04_PH]], %[[FOR_BODY_PREHEADER]] ]
627; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
628; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
629; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
630; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
631; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
632;
633entry:
634  %cmp3.not = icmp eq i32 %N, 0
635  br i1 %cmp3.not, label %for.body0, label %for.body1
636
637for.cond.cleanup:
638  ret void
639
640for.body0:
641  br label %for.body
642
643for.body1:
644  br label %for.body
645
646for.body:
647  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %for.body0 ], [ 1, %for.body1 ]
648  %rem = urem i32 %i.04, %rem_amt
649  tail call void @use.i32(i32 %rem)
650  %inc = add nuw i32 %i.04, 1
651  %exitcond.not = icmp eq i32 %inc, %N
652  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
653}
654
655define void @simple_urem_multi_latch_non_canonical(i32 %N, i32 %rem_amt) nounwind {
656; CHECK-LABEL: define void @simple_urem_multi_latch_non_canonical(
657; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
658; CHECK-NEXT:  [[ENTRY:.*:]]
659; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
660; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
661; CHECK:       [[FOR_BODY_PREHEADER]]:
662; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
663; CHECK:       [[FOR_COND_CLEANUP]]:
664; CHECK-NEXT:    ret void
665; CHECK:       [[FOR_BODY]]:
666; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[INC]], %[[FOR_BODY0:.*]] ]
667; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
668; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
669; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
670; CHECK-NEXT:    [[COND:%.*]] = call i1 @get.i1()
671; CHECK-NEXT:    call void @do_stuff0()
672; CHECK-NEXT:    br i1 [[COND]], label %[[FOR_BODY0]], label %[[FOR_BODY]]
673; CHECK:       [[FOR_BODY0]]:
674; CHECK-NEXT:    call void @do_stuff1()
675; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
676; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
677;
678entry:
679  %cmp3.not = icmp eq i32 %N, 0
680  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
681
682for.cond.cleanup:
683  ret void
684
685for.body:
686  %i.04 = phi i32 [ %inc, %for.body ], [ %inc, %for.body0 ], [ 0, %entry ]
687  %rem = urem i32 %i.04, %rem_amt
688  tail call void @use.i32(i32 %rem)
689  %inc = add nuw i32 %i.04, 1
690  %cond = call i1 @get.i1()
691  call void @do_stuff0()
692  br i1 %cond, label %for.body0, label %for.body
693for.body0:
694  call void @do_stuff1()
695  %exitcond.not = icmp eq i32 %inc, %N
696  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
697}
698
699define void @simple_urem_fail_bad_loop(i32 %N, i32 %rem_amt) nounwind {
700; CHECK-LABEL: define void @simple_urem_fail_bad_loop(
701; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
702; CHECK-NEXT:  [[ENTRY:.*]]:
703; CHECK-NEXT:    [[CALL:%.*]] = call i32 @get.i32()
704; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
705; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[FOR_COND:.*]], label %[[HALFWAY:.*]]
706; CHECK:       [[FOR_COND]]:
707; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[INC:%.*]], %[[HALFWAY]] ], [ 0, %[[ENTRY]] ]
708; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[I_0]], [[N]]
709; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]
710; CHECK:       [[FOR_BODY]]:
711; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[I_0]], 1
712; CHECK-NEXT:    call void @use.i32(i32 [[XOR]])
713; CHECK-NEXT:    br label %[[HALFWAY]]
714; CHECK:       [[HALFWAY]]:
715; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ poison, %[[ENTRY]] ], [ [[I_0]], %[[FOR_BODY]] ]
716; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_1]], [[REM_AMT]]
717; CHECK-NEXT:    call void @use.i32(i32 [[REM]])
718; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_1]], 1
719; CHECK-NEXT:    br label %[[FOR_COND]]
720; CHECK:       [[FOR_END]]:
721; CHECK-NEXT:    ret void
722;
723entry:
724  %call = call i32 @get.i32()
725  %tobool.not = icmp eq i32 %call, 0
726  br i1 %tobool.not, label %for.cond, label %halfway
727
728for.cond:
729  %i.0 = phi i32 [ %inc, %halfway ], [ 0, %entry ]
730  %cmp = icmp ult i32 %i.0, %N
731  br i1 %cmp, label %for.body, label %for.end
732
733for.body:
734  %xor = xor i32 %i.0, 1
735  call void @use.i32(i32 %xor)
736  br label %halfway
737
738halfway:
739  %i.1 = phi i32 [ poison, %entry ], [ %i.0, %for.body ]
740  %rem = urem i32 %i.1, %rem_amt
741  call void @use.i32(i32 %rem)
742  %inc = add nuw i32 %i.1, 1
743  br label %for.cond
744
745for.end:
746  ret void
747}
748
749define void @simple_urem_fail_intermediate_inc(i32 %N, i32 %rem_amt) nounwind {
750; CHECK-LABEL: define void @simple_urem_fail_intermediate_inc(
751; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
752; CHECK-NEXT:  [[ENTRY:.*:]]
753; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
754; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
755; CHECK:       [[FOR_BODY_PREHEADER]]:
756; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
757; CHECK:       [[FOR_COND_CLEANUP]]:
758; CHECK-NEXT:    ret void
759; CHECK:       [[FOR_BODY]]:
760; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
761; CHECK-NEXT:    [[INC2:%.*]] = add nuw i32 [[I_04]], 1
762; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[INC2]], [[REM_AMT]]
763; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
764; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
765; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
766; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
767;
768entry:
769  %cmp3.not = icmp eq i32 %N, 0
770  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
771
772for.cond.cleanup:
773  ret void
774
775for.body:
776  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
777  %inc2 = add nuw i32 %i.04, 1
778  %rem = urem i32 %inc2, %rem_amt
779  tail call void @use.i32(i32 %rem)
780  %inc = add nuw i32 %i.04, 1
781  %exitcond.not = icmp eq i32 %inc, %N
782  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
783}
784
785define void @weird_loop(i64 %sub.ptr.div.i56) personality ptr null {
786; CHECK-LABEL: define void @weird_loop(
787; CHECK-SAME: i64 [[SUB_PTR_DIV_I56:%.*]]) personality ptr null {
788; CHECK-NEXT:  [[ENTRY:.*:]]
789; CHECK-NEXT:    [[ADD74_US:%.*]] = add nuw i64 0, 1
790; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[ADD74_US]], [[SUB_PTR_DIV_I56]]
791; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i64 0, i64 [[ADD74_US]]
792; CHECK-NEXT:    [[ADD74_US1:%.*]] = add nuw i64 0, 1
793; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
794; CHECK:       [[FOR_BODY]]:
795; CHECK-NEXT:    br label %[[FOR_BODY]]
796;
797entry:
798  br label %for.preheader
799
800for.preheader:
801  %i57.0540.us = phi i64 [ 0, %entry ], [ %add74.us, %for.body ]
802  %add74.us = add nuw i64 %i57.0540.us, 1
803  br label %for.body
804
805for.body:
806  %rem.us = urem i64 %i57.0540.us, %sub.ptr.div.i56
807  br i1 false, label %for.preheader, label %for.body
808}
809
810define void @simple_urem_to_sel_non_zero_start_fail(i32 %N, i32 %rem_amt) nounwind {
811; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_fail(
812; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
813; CHECK-NEXT:  [[ENTRY:.*:]]
814; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
815; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
816; CHECK:       [[FOR_BODY_PREHEADER]]:
817; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
818; CHECK:       [[FOR_COND_CLEANUP]]:
819; CHECK-NEXT:    ret void
820; CHECK:       [[FOR_BODY]]:
821; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
822; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
823; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
824; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
825; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
826; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
827;
828entry:
829  %cmp3.not = icmp ult i32 %N, 3
830  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
831
832for.cond.cleanup:
833  ret void
834
835for.body:
836  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
837  %rem = urem i32 %i.04, %rem_amt
838  tail call void @use.i32(i32 %rem)
839  %inc = add nuw i32 %i.04, 1
840  %exitcond.not = icmp eq i32 %inc, %N
841  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
842}
843
844define void @simple_urem_to_sel_non_zero_start_okay(i32 %N, i32 %rem_amt_in) nounwind {
845; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_okay(
846; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
847; CHECK-NEXT:  [[ENTRY:.*:]]
848; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
849; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
850; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
851; CHECK:       [[FOR_BODY_PREHEADER]]:
852; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
853; CHECK:       [[FOR_COND_CLEANUP]]:
854; CHECK-NEXT:    ret void
855; CHECK:       [[FOR_BODY]]:
856; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 2, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
857; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
858; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
859; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
860; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
861; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
862; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
863; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
864; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
865;
866entry:
867  %rem_amt = or i32 %rem_amt_in, 16
868  %cmp3.not = icmp ult i32 %N, 3
869  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
870
871for.cond.cleanup:
872  ret void
873
874for.body:
875  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
876  %rem = urem i32 %i.04, %rem_amt
877  tail call void @use.i32(i32 %rem)
878  %inc = add nuw i32 %i.04, 1
879  %exitcond.not = icmp eq i32 %inc, %N
880  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
881}
882
883define void @simple_urem_to_sel_non_zero_start_through_add(i32 %N, i32 %rem_amt_in) nounwind {
884; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add(
885; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
886; CHECK-NEXT:  [[ENTRY:.*:]]
887; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
888; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
889; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
890; CHECK:       [[FOR_BODY_PREHEADER]]:
891; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
892; CHECK:       [[FOR_COND_CLEANUP]]:
893; CHECK-NEXT:    ret void
894; CHECK:       [[FOR_BODY]]:
895; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 7, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
896; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
897; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
898; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
899; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
900; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
901; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
902; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
903; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
904;
905entry:
906  %rem_amt = or i32 %rem_amt_in, 16
907  %cmp3.not = icmp ult i32 %N, 3
908  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
909
910for.cond.cleanup:
911  ret void
912
913for.body:
914  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
915  %i_with_off = add nuw i32 %i.04, 5
916  %rem = urem i32 %i_with_off, %rem_amt
917  tail call void @use.i32(i32 %rem)
918  %inc = add nuw i32 %i.04, 1
919  %exitcond.not = icmp eq i32 %inc, %N
920  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
921}
922
923define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {
924; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(
925; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
926; CHECK-NEXT:  [[ENTRY:.*:]]
927; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
928; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
929; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
930; CHECK:       [[FOR_BODY_PREHEADER]]:
931; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
932; CHECK:       [[FOR_COND_CLEANUP]]:
933; CHECK-NEXT:    ret void
934; CHECK:       [[FOR_BODY]]:
935; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
936; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add i32 [[I_04]], 5
937; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
938; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
939; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
940; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
941; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
942;
943entry:
944  %rem_amt = or i32 %rem_amt_in, 16
945  %cmp3.not = icmp ult i32 %N, 3
946  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
947
948for.cond.cleanup:
949  ret void
950
951for.body:
952  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
953  %i_with_off = add i32 %i.04, 5
954  %rem = urem i32 %i_with_off, %rem_amt
955  tail call void @use.i32(i32 %rem)
956  %inc = add nuw i32 %i.04, 1
957  %exitcond.not = icmp eq i32 %inc, %N
958  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
959}
960
961define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {
962; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(
963; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
964; CHECK-NEXT:  [[ENTRY:.*:]]
965; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
966; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
967; CHECK:       [[FOR_BODY_PREHEADER]]:
968; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
969; CHECK:       [[FOR_COND_CLEANUP]]:
970; CHECK-NEXT:    ret void
971; CHECK:       [[FOR_BODY]]:
972; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
973; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add nuw i32 [[I_04]], 5
974; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
975; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
976; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
977; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
978; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
979;
980entry:
981  %cmp3.not = icmp ult i32 %N, 3
982  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
983
984for.cond.cleanup:
985  ret void
986
987for.body:
988  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
989  %i_with_off = add nuw i32 %i.04, 5
990  %rem = urem i32 %i_with_off, %rem_amt
991  tail call void @use.i32(i32 %rem)
992  %inc = add nuw i32 %i.04, 1
993  %exitcond.not = icmp eq i32 %inc, %N
994  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
995}
996
997define void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt, i32 %start) nounwind {
998; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub(
999; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {
1000; CHECK-NEXT:  [[ENTRY:.*:]]
1001; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]
1002; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
1003; CHECK:       [[FOR_BODY_PREHEADER]]:
1004; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
1005; CHECK:       [[FOR_COND_CLEANUP]]:
1006; CHECK-NEXT:    ret void
1007; CHECK:       [[FOR_BODY]]:
1008; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]
1009; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], [[START]]
1010; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
1011; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1012; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1013; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1014; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1015;
1016entry:
1017  %cmp3.not = icmp ule i32 %N, %start
1018  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1019
1020for.cond.cleanup:
1021  ret void
1022
1023for.body:
1024  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]
1025  %i_with_off = sub nuw i32 %i.04, %start
1026  %rem = urem i32 %i_with_off, %rem_amt
1027  tail call void @use.i32(i32 %rem)
1028  %inc = add nuw i32 %i.04, 1
1029  %exitcond.not = icmp eq i32 %inc, %N
1030  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1031}
1032
1033define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i32 %rem_amt, i32 %start) nounwind {
1034; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(
1035; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {
1036; CHECK-NEXT:  [[ENTRY:.*:]]
1037; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]
1038; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
1039; CHECK:       [[FOR_BODY_PREHEADER]]:
1040; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
1041; CHECK:       [[FOR_COND_CLEANUP]]:
1042; CHECK-NEXT:    ret void
1043; CHECK:       [[FOR_BODY]]:
1044; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]
1045; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], 2
1046; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
1047; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1048; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1049; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1050; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1051;
1052entry:
1053  %cmp3.not = icmp ule i32 %N, %start
1054  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1055
1056for.cond.cleanup:
1057  ret void
1058
1059for.body:
1060  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]
1061  %i_with_off = sub nuw i32 %i.04, 2
1062  %rem = urem i32 %i_with_off, %rem_amt
1063  tail call void @use.i32(i32 %rem)
1064  %inc = add nuw i32 %i.04, 1
1065  %exitcond.not = icmp eq i32 %inc, %N
1066  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1067}
1068