xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/X86/fold-loop-of-urem.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1f16125a1SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2f16125a1SNoah Goldstein; RUN: opt < %s -mtriple=x86_64-unknown-unknown --loop-simplify -codegenprepare -S | FileCheck %s
3f16125a1SNoah Goldstein
4f16125a1SNoah Goldsteindeclare void @use.i32(i32)
5f16125a1SNoah Goldsteindeclare void @use.2xi64(<2 x i64>)
6f16125a1SNoah Goldsteindeclare void @do_stuff0()
7f16125a1SNoah Goldsteindeclare void @do_stuff1()
8f16125a1SNoah Goldsteindeclare i1 @get.i1()
9f16125a1SNoah Goldsteindeclare i32 @get.i32()
10f16125a1SNoah Goldstein
11f16125a1SNoah Goldsteindefine void @simple_urem_to_sel(i32 %N, i32 %rem_amt) nounwind {
12f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel(
13f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0:[0-9]+]] {
14f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
15f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
16f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
17f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
18f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
19f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
20f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
21f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
22e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
23f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
24f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
25e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
26e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
27e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
28f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
29f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
30f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
31f16125a1SNoah Goldstein;
32f16125a1SNoah Goldsteinentry:
33f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
34f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
35f16125a1SNoah Goldstein
36f16125a1SNoah Goldsteinfor.cond.cleanup:
37f16125a1SNoah Goldstein  ret void
38f16125a1SNoah Goldstein
39f16125a1SNoah Goldsteinfor.body:
40f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
41f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
42f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
43f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
44f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
45f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
46f16125a1SNoah Goldstein}
47f16125a1SNoah Goldstein
489b25ad81SNoah Goldsteindefine void @simple_urem_to_sel_fail_not_in_loop(i32 %N, i32 %rem_amt) nounwind {
499b25ad81SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_fail_not_in_loop(
509b25ad81SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
519b25ad81SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*]]:
529b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
539b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
549b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
559b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
569b25ad81SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
579b25ad81SNoah Goldstein; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
589b25ad81SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_05]], [[REM_AMT]]
599b25ad81SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
609b25ad81SNoah Goldstein; CHECK-NEXT:    ret void
619b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY]]:
629b25ad81SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
639b25ad81SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[I_04]])
649b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
659b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
669b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
679b25ad81SNoah Goldstein;
689b25ad81SNoah Goldsteinentry:
699b25ad81SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
709b25ad81SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
719b25ad81SNoah Goldstein
729b25ad81SNoah Goldsteinfor.cond.cleanup:
739b25ad81SNoah Goldstein  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
749b25ad81SNoah Goldstein  %rem = urem i32 %i.05, %rem_amt
759b25ad81SNoah Goldstein  tail call void @use.i32(i32 %rem)
769b25ad81SNoah Goldstein  ret void
779b25ad81SNoah Goldstein
789b25ad81SNoah Goldsteinfor.body:
799b25ad81SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
809b25ad81SNoah Goldstein  tail call void @use.i32(i32 %i.04)
819b25ad81SNoah Goldstein  %inc = add nuw i32 %i.04, 1
829b25ad81SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
839b25ad81SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
849b25ad81SNoah Goldstein}
859b25ad81SNoah Goldstein
869b25ad81SNoah Goldsteindefine void @simple_urem_to_sel_inner_loop(i32 %N, i32 %M) nounwind {
879b25ad81SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop(
889b25ad81SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {
899b25ad81SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
909b25ad81SNoah Goldstein; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()
919b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
929b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
939b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
949b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
959b25ad81SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
969b25ad81SNoah Goldstein; CHECK-NEXT:    ret void
979b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY]]:
98e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ]
99e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
1009b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0
1019b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]
1029b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:
1039b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]
1049b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_BODY]]:
1059b25ad81SNoah Goldstein; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]
1069b25ad81SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1079b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1
1089b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]
1099b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]
1109b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_COND_CLEANUP]]:
111e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
112e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
113e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
1149b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1159b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1169b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1179b25ad81SNoah Goldstein;
1189b25ad81SNoah Goldsteinentry:
1199b25ad81SNoah Goldstein  %rem_amt = call i32 @get.i32()
1209b25ad81SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
1219b25ad81SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1229b25ad81SNoah Goldstein
1239b25ad81SNoah Goldsteinfor.cond.cleanup:
1249b25ad81SNoah Goldstein  ret void
1259b25ad81SNoah Goldstein
1269b25ad81SNoah Goldsteinfor.body:
1279b25ad81SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]
1289b25ad81SNoah Goldstein
1299b25ad81SNoah Goldstein  %cmp_inner = icmp eq i32 %M, 0
1309b25ad81SNoah Goldstein  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body
1319b25ad81SNoah Goldstein
1329b25ad81SNoah Goldsteinfor.inner.body:
1339b25ad81SNoah Goldstein  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]
1349b25ad81SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
1359b25ad81SNoah Goldstein  tail call void @use.i32(i32 %rem)
1369b25ad81SNoah Goldstein  %inc_inner = add nuw i32 %j, 1
1379b25ad81SNoah Goldstein  %exitcond_inner = icmp eq i32 %inc_inner, %M
1389b25ad81SNoah Goldstein  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body
1399b25ad81SNoah Goldstein
1409b25ad81SNoah Goldsteinfor.inner.cond.cleanup:
1419b25ad81SNoah Goldstein  %inc = add nuw i32 %i.04, 1
1429b25ad81SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
1439b25ad81SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1449b25ad81SNoah Goldstein}
1459b25ad81SNoah Goldstein
1469b25ad81SNoah Goldsteindefine void @simple_urem_to_sel_inner_loop_fail_not_invariant(i32 %N, i32 %M) nounwind {
1479b25ad81SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop_fail_not_invariant(
1489b25ad81SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {
1499b25ad81SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
1509b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
1519b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
1529b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
1539b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
1549b25ad81SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
1559b25ad81SNoah Goldstein; CHECK-NEXT:    ret void
1569b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY]]:
1579b25ad81SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
1589b25ad81SNoah Goldstein; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()
1599b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0
1609b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]
1619b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:
1629b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]
1639b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_BODY]]:
1649b25ad81SNoah Goldstein; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]
1659b25ad81SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
1669b25ad81SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1679b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1
1689b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]
1699b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]
1709b25ad81SNoah Goldstein; CHECK:       [[FOR_INNER_COND_CLEANUP]]:
1719b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1729b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1739b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1749b25ad81SNoah Goldstein;
1759b25ad81SNoah Goldsteinentry:
1769b25ad81SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
1779b25ad81SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1789b25ad81SNoah Goldstein
1799b25ad81SNoah Goldsteinfor.cond.cleanup:
1809b25ad81SNoah Goldstein  ret void
1819b25ad81SNoah Goldstein
1829b25ad81SNoah Goldsteinfor.body:
1839b25ad81SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]
1849b25ad81SNoah Goldstein  %rem_amt = call i32 @get.i32()
1859b25ad81SNoah Goldstein  %cmp_inner = icmp eq i32 %M, 0
1869b25ad81SNoah Goldstein  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body
1879b25ad81SNoah Goldstein
1889b25ad81SNoah Goldsteinfor.inner.body:
1899b25ad81SNoah Goldstein  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]
1909b25ad81SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
1919b25ad81SNoah Goldstein  tail call void @use.i32(i32 %rem)
1929b25ad81SNoah Goldstein  %inc_inner = add nuw i32 %j, 1
1939b25ad81SNoah Goldstein  %exitcond_inner = icmp eq i32 %inc_inner, %M
1949b25ad81SNoah Goldstein  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body
1959b25ad81SNoah Goldstein
1969b25ad81SNoah Goldsteinfor.inner.cond.cleanup:
1979b25ad81SNoah Goldstein  %inc = add nuw i32 %i.04, 1
1989b25ad81SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
1999b25ad81SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
2009b25ad81SNoah Goldstein}
2019b25ad81SNoah Goldstein
202f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_nested2(i32 %N, i32 %rem_amt) nounwind {
203f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_nested2(
204f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
205f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
206f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
207f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
208f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
209f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
210f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
211f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
212f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
213e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY_TAIL:.*]] ]
214e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
215f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
216f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]
217f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY0]]:
218f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()
219f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY2:.*]]
220f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY2]]:
221f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()
222f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]
223f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY1]]:
224f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
225f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
226f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_TAIL]]:
227e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
228e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
229e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
230f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
231f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
232f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
233f16125a1SNoah Goldstein;
234f16125a1SNoah Goldsteinentry:
235f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
236f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
237f16125a1SNoah Goldstein
238f16125a1SNoah Goldsteinfor.cond.cleanup:
239f16125a1SNoah Goldstein  ret void
240f16125a1SNoah Goldstein
241f16125a1SNoah Goldsteinfor.body:
242f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]
243f16125a1SNoah Goldstein  %cond0 = call i1 @get.i1()
244f16125a1SNoah Goldstein  br i1 %cond0, label %for.body0, label %for.body.tail
245f16125a1SNoah Goldsteinfor.body0:
246f16125a1SNoah Goldstein  %cond1 = call i1 @get.i1()
247f16125a1SNoah Goldstein  br i1 %cond1, label %for.body1, label %for.body2
248f16125a1SNoah Goldsteinfor.body2:
249f16125a1SNoah Goldstein  %cond2 = call i1 @get.i1()
250f16125a1SNoah Goldstein  br i1 %cond2, label %for.body1, label %for.body.tail
251f16125a1SNoah Goldsteinfor.body1:
252f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
253f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
254f16125a1SNoah Goldstein  br label %for.body.tail
255f16125a1SNoah Goldsteinfor.body.tail:
256f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
257f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
258f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
259f16125a1SNoah Goldstein}
260f16125a1SNoah Goldstein
261f16125a1SNoah Goldsteindefine void @simple_urem_fail_bad_incr3(i32 %N, i32 %rem_amt) nounwind {
262f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_bad_incr3(
263f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
264f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
265f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
266f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
267f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
268f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
269f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
270f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
271f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
272f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
273f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY2:.*]]
274f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY0]]:
275f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()
276f16125a1SNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = call i32 @get.i32()
277f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC:%.*]] = add nuw i32 [[VAL]], 1
278f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY_TAIL:.*]]
279f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY2]]:
280f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()
281f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]
282f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY1]]:
283f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY0]] ], [ 0, %[[FOR_BODY2]] ]
284f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
285f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
286f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
287f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_TAIL]]:
288f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()
289f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
290f16125a1SNoah Goldstein;
291f16125a1SNoah Goldsteinentry:
292f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
293f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
294f16125a1SNoah Goldstein
295f16125a1SNoah Goldsteinfor.cond.cleanup:
296f16125a1SNoah Goldstein  ret void
297f16125a1SNoah Goldstein
298f16125a1SNoah Goldsteinfor.body:
299f16125a1SNoah Goldstein  %cond0 = call i1 @get.i1()
300f16125a1SNoah Goldstein  br i1 %cond0, label %for.body0, label %for.body2
301f16125a1SNoah Goldsteinfor.body0:
302f16125a1SNoah Goldstein  %cond1 = call i1 @get.i1()
303f16125a1SNoah Goldstein  %val = call i32 @get.i32()
304f16125a1SNoah Goldstein  %inc = add nuw i32 %val, 1
305f16125a1SNoah Goldstein  br i1 %cond1, label %for.body1, label %for.body.tail
306f16125a1SNoah Goldsteinfor.body2:
307f16125a1SNoah Goldstein  %cond2 = call i1 @get.i1()
308f16125a1SNoah Goldstein  br i1 %cond2, label %for.body1, label %for.body.tail
309f16125a1SNoah Goldsteinfor.body1:
310f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body0], [ 0, %for.body2 ]
311f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
312f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
313f16125a1SNoah Goldstein  br label %for.body.tail
314f16125a1SNoah Goldsteinfor.body.tail:
315f16125a1SNoah Goldstein  %exitcond.not = call i1 @get.i1()
316f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
317f16125a1SNoah Goldstein}
318f16125a1SNoah Goldstein
319f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_vec(<2 x i64> %rem_amt) nounwind {
320f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_vec(
321f16125a1SNoah Goldstein; CHECK-SAME: <2 x i64> [[REM_AMT:%.*]]) #[[ATTR0]] {
3221e072ae2Sgoldsteinn; CHECK-NEXT:  [[ENTRY:.*]]:
323f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
3241e072ae2Sgoldsteinn; CHECK:       [[FOR_COND_CLEANUP:.*]]:
325f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
326f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
3271e072ae2Sgoldsteinn; CHECK-NEXT:    [[REM:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
3281e072ae2Sgoldsteinn; CHECK-NEXT:    [[I_04:%.*]] = phi <2 x i64> [ [[INC:%.*]], %[[FOR_BODY]] ], [ zeroinitializer, %[[ENTRY]] ]
329f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.2xi64(<2 x i64> [[REM]])
330*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = add nuw <2 x i64> [[REM]], splat (i64 1)
331e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], [[REM_AMT]]
332e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select <2 x i1> [[TMP2]], <2 x i64> zeroinitializer, <2 x i64> [[TMP1]]
333*38fffa63SPaul Walker; CHECK-NEXT:    [[INC]] = add nuw <2 x i64> [[I_04]], splat (i64 1)
334f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()
3351e072ae2Sgoldsteinn; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
336f16125a1SNoah Goldstein;
337f16125a1SNoah Goldsteinentry:
338f16125a1SNoah Goldstein  br label %for.body
339f16125a1SNoah Goldstein
340f16125a1SNoah Goldsteinfor.cond.cleanup:
341f16125a1SNoah Goldstein  ret void
342f16125a1SNoah Goldstein
343f16125a1SNoah Goldsteinfor.body:
344f16125a1SNoah Goldstein  %i.04 = phi <2 x i64> [ %inc, %for.body ], [ zeroinitializer, %entry ]
345f16125a1SNoah Goldstein  %rem = urem <2 x i64> %i.04, %rem_amt
346f16125a1SNoah Goldstein  tail call void @use.2xi64(<2 x i64> %rem)
347f16125a1SNoah Goldstein  %inc = add nuw <2 x i64> %i.04, <i64 1, i64 1>
348f16125a1SNoah Goldstein  %exitcond.not = call i1 @get.i1()
349f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
350f16125a1SNoah Goldstein}
351f16125a1SNoah Goldstein
352f16125a1SNoah Goldsteindefine void @simple_urem_fail_bad_incr(i32 %N, i32 %rem_amt) nounwind {
353f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_bad_incr(
354f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
355f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
356f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
357f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
358f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
359f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
360f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
361f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
362f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
363f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
364f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()
365f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]
366f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY0]]:
367f16125a1SNoah Goldstein; CHECK-NEXT:    [[SOME_VAL:%.*]] = call i32 @get.i32()
368f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]
369f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_TAIL]]:
370f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[I_03]], %[[FOR_BODY]] ], [ [[SOME_VAL]], %[[FOR_BODY0]] ]
371f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
372f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
373f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
374f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
375f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
376f16125a1SNoah Goldstein;
377f16125a1SNoah Goldsteinentry:
378f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
379f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
380f16125a1SNoah Goldstein
381f16125a1SNoah Goldsteinfor.cond.cleanup:
382f16125a1SNoah Goldstein  ret void
383f16125a1SNoah Goldstein
384f16125a1SNoah Goldsteinfor.body:
385f16125a1SNoah Goldstein  %i.03 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]
386f16125a1SNoah Goldstein  %cond0 = call i1 @get.i1()
387f16125a1SNoah Goldstein  br i1 %cond0, label %for.body0, label %for.body.tail
388f16125a1SNoah Goldsteinfor.body0:
389f16125a1SNoah Goldstein  %some_val = call i32 @get.i32()
390f16125a1SNoah Goldstein  br label %for.body.tail
391f16125a1SNoah Goldstein
392f16125a1SNoah Goldsteinfor.body.tail:
393f16125a1SNoah Goldstein  %i.04 = phi i32 [ %i.03, %for.body ], [ %some_val, %for.body0 ]
394f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
395f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
396f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
397f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
398f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
399f16125a1SNoah Goldstein}
400f16125a1SNoah Goldstein
401f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_second_acc(i32 %N, i32 %rem_amt) nounwind {
402f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_second_acc(
403f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
404f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
405f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 2
406f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
407f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
408f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
409f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
410f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
411f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
412e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
413f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
414f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ [[INC2:%.*]], %[[FOR_BODY]] ], [ 1, %[[FOR_BODY_PREHEADER]] ]
415f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
416e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
417e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
418e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
419f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
420f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC2]] = add nuw i32 [[I_05]], 2
421f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ugt i32 [[INC2]], [[N]]
422f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
423f16125a1SNoah Goldstein;
424f16125a1SNoah Goldsteinentry:
425f16125a1SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 2
426f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
427f16125a1SNoah Goldstein
428f16125a1SNoah Goldsteinfor.cond.cleanup:
429f16125a1SNoah Goldstein  ret void
430f16125a1SNoah Goldstein
431f16125a1SNoah Goldsteinfor.body:
432f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
433f16125a1SNoah Goldstein  %i.05 = phi i32 [ %inc2, %for.body ], [ 1, %entry ]
434f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
435f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
436f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
437f16125a1SNoah Goldstein  %inc2 = add nuw i32 %i.05, 2
438f16125a1SNoah Goldstein  %exitcond.not = icmp ugt i32 %inc2, %N
439f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
440f16125a1SNoah Goldstein}
441f16125a1SNoah Goldstein
442f16125a1SNoah Goldsteindefine void @simple_urem_fail_srem(i32 %N, i32 %rem_amt) nounwind {
443f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_srem(
444f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
445f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
446f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
447f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
448f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
449f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
450f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
451f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
452f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
453f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
454f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = srem i32 [[I_04]], [[REM_AMT]]
455f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
456f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
457f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
458f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
459f16125a1SNoah Goldstein;
460f16125a1SNoah Goldsteinentry:
461f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
462f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
463f16125a1SNoah Goldstein
464f16125a1SNoah Goldsteinfor.cond.cleanup:
465f16125a1SNoah Goldstein  ret void
466f16125a1SNoah Goldstein
467f16125a1SNoah Goldsteinfor.body:
468f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
469f16125a1SNoah Goldstein  %rem = srem i32 %i.04, %rem_amt
470f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
471f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
472f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
473f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
474f16125a1SNoah Goldstein}
475f16125a1SNoah Goldstein
476f16125a1SNoah Goldsteindefine void @simple_urem_fail_missing_nuw(i32 %N, i32 %rem_amt) nounwind {
477f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_missing_nuw(
478f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
479f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
480f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
481f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
482f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
483f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
484f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
485f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
486f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
487f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
488f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
489f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
490f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_04]], 1
491f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
492f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
493f16125a1SNoah Goldstein;
494f16125a1SNoah Goldsteinentry:
495f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
496f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
497f16125a1SNoah Goldstein
498f16125a1SNoah Goldsteinfor.cond.cleanup:
499f16125a1SNoah Goldstein  ret void
500f16125a1SNoah Goldstein
501f16125a1SNoah Goldsteinfor.body:
502f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
503f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
504f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
505f16125a1SNoah Goldstein  %inc = add nsw i32 %i.04, 1
506f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
507f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
508f16125a1SNoah Goldstein}
509f16125a1SNoah Goldstein
510f16125a1SNoah Goldsteindefine void @simple_urem_fail_bad_incr2(i32 %N, i32 %rem_amt) nounwind {
511f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_bad_incr2(
512f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
513f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
514f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
515f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
516f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
517f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
518f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
519f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
520f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
521f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
522f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
523f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
524f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 2
525f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
526f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
527f16125a1SNoah Goldstein;
528f16125a1SNoah Goldsteinentry:
529f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
530f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
531f16125a1SNoah Goldstein
532f16125a1SNoah Goldsteinfor.cond.cleanup:
533f16125a1SNoah Goldstein  ret void
534f16125a1SNoah Goldstein
535f16125a1SNoah Goldsteinfor.body:
536f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
537f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
538f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
539f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 2
540f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
541f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
542f16125a1SNoah Goldstein}
543f16125a1SNoah Goldstein
544f16125a1SNoah Goldsteindefine void @simple_urem_non_zero_entry4(i32 %N, i32 %rem_amt) nounwind {
545f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_non_zero_entry4(
546f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
547f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
548f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
549f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
550f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
551f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
552f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
553f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
554f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
555f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]
556731ae694SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
557f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
558f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
559f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
560f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
561f16125a1SNoah Goldstein;
562f16125a1SNoah Goldsteinentry:
563f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
564f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
565f16125a1SNoah Goldstein
566f16125a1SNoah Goldsteinfor.cond.cleanup:
567f16125a1SNoah Goldstein  ret void
568f16125a1SNoah Goldstein
569f16125a1SNoah Goldsteinfor.body:
570f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]
571f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
572f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
573f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
574f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
575f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
576f16125a1SNoah Goldstein}
577f16125a1SNoah Goldstein
578f16125a1SNoah Goldsteindefine void @simple_urem_skip_const_rem_amt(i32 %N) nounwind {
579f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_skip_const_rem_amt(
580f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {
581f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
582f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
583f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
584f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
585f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
586f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
587f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
588f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
589f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]
590f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], 19
591f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
592f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
593f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
594f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
595f16125a1SNoah Goldstein;
596f16125a1SNoah Goldsteinentry:
597f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
598f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
599f16125a1SNoah Goldstein
600f16125a1SNoah Goldsteinfor.cond.cleanup:
601f16125a1SNoah Goldstein  ret void
602f16125a1SNoah Goldstein
603f16125a1SNoah Goldsteinfor.body:
604f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]
605f16125a1SNoah Goldstein  %rem = urem i32 %i.04, 19
606f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
607f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
608f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
609f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
610f16125a1SNoah Goldstein}
611f16125a1SNoah Goldstein
612f16125a1SNoah Goldsteindefine void @simple_urem_fail_no_preheader_non_canonical(i32 %N, i32 %rem_amt) nounwind {
613f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_no_preheader_non_canonical(
614f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
615f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*]]:
616f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
617f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_BODY_PREHEADER:.*]], label %[[FOR_BODY1:.*]]
618f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP:.*]]:
619f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
620f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY1]]:
621f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY_PREHEADER]]
622f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
623f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04_PH:%.*]] = phi i32 [ 1, %[[FOR_BODY1]] ], [ 0, %[[ENTRY]] ]
624f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
625f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
626f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[I_04_PH]], %[[FOR_BODY_PREHEADER]] ]
627731ae694SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
628f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
629f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
630f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
631f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
632f16125a1SNoah Goldstein;
633f16125a1SNoah Goldsteinentry:
634f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
635f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.body0, label %for.body1
636f16125a1SNoah Goldstein
637f16125a1SNoah Goldsteinfor.cond.cleanup:
638f16125a1SNoah Goldstein  ret void
639f16125a1SNoah Goldstein
640f16125a1SNoah Goldsteinfor.body0:
641f16125a1SNoah Goldstein  br label %for.body
642f16125a1SNoah Goldstein
643f16125a1SNoah Goldsteinfor.body1:
644f16125a1SNoah Goldstein  br label %for.body
645f16125a1SNoah Goldstein
646f16125a1SNoah Goldsteinfor.body:
647f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %for.body0 ], [ 1, %for.body1 ]
648f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
649f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
650f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
651f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
652f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
653f16125a1SNoah Goldstein}
654f16125a1SNoah Goldstein
655f16125a1SNoah Goldsteindefine void @simple_urem_multi_latch_non_canonical(i32 %N, i32 %rem_amt) nounwind {
656f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_multi_latch_non_canonical(
657f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
658f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
659f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
660f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
661f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
662f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
663f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
664f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
665f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
666f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[INC]], %[[FOR_BODY0:.*]] ]
667f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
668f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
669f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
670f16125a1SNoah Goldstein; CHECK-NEXT:    [[COND:%.*]] = call i1 @get.i1()
671f16125a1SNoah Goldstein; CHECK-NEXT:    call void @do_stuff0()
672f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[COND]], label %[[FOR_BODY0]], label %[[FOR_BODY]]
673f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY0]]:
674f16125a1SNoah Goldstein; CHECK-NEXT:    call void @do_stuff1()
675f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
676f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
677f16125a1SNoah Goldstein;
678f16125a1SNoah Goldsteinentry:
679f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
680f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
681f16125a1SNoah Goldstein
682f16125a1SNoah Goldsteinfor.cond.cleanup:
683f16125a1SNoah Goldstein  ret void
684f16125a1SNoah Goldstein
685f16125a1SNoah Goldsteinfor.body:
686f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ %inc, %for.body0 ], [ 0, %entry ]
687f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
688f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
689f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
690f16125a1SNoah Goldstein  %cond = call i1 @get.i1()
691f16125a1SNoah Goldstein  call void @do_stuff0()
692f16125a1SNoah Goldstein  br i1 %cond, label %for.body0, label %for.body
693f16125a1SNoah Goldsteinfor.body0:
694f16125a1SNoah Goldstein  call void @do_stuff1()
695f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
696f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
697f16125a1SNoah Goldstein}
698f16125a1SNoah Goldstein
699f16125a1SNoah Goldsteindefine void @simple_urem_fail_bad_loop(i32 %N, i32 %rem_amt) nounwind {
700f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_bad_loop(
701f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
702f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*]]:
703f16125a1SNoah Goldstein; CHECK-NEXT:    [[CALL:%.*]] = call i32 @get.i32()
704f16125a1SNoah Goldstein; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
705f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[FOR_COND:.*]], label %[[HALFWAY:.*]]
706f16125a1SNoah Goldstein; CHECK:       [[FOR_COND]]:
707f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[INC:%.*]], %[[HALFWAY]] ], [ 0, %[[ENTRY]] ]
708f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[I_0]], [[N]]
709f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]
710f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
711f16125a1SNoah Goldstein; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[I_0]], 1
712f16125a1SNoah Goldstein; CHECK-NEXT:    call void @use.i32(i32 [[XOR]])
713f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[HALFWAY]]
714f16125a1SNoah Goldstein; CHECK:       [[HALFWAY]]:
715f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ poison, %[[ENTRY]] ], [ [[I_0]], %[[FOR_BODY]] ]
716f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_1]], [[REM_AMT]]
717f16125a1SNoah Goldstein; CHECK-NEXT:    call void @use.i32(i32 [[REM]])
718f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_1]], 1
719f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_COND]]
720f16125a1SNoah Goldstein; CHECK:       [[FOR_END]]:
721f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
722f16125a1SNoah Goldstein;
723f16125a1SNoah Goldsteinentry:
724f16125a1SNoah Goldstein  %call = call i32 @get.i32()
725f16125a1SNoah Goldstein  %tobool.not = icmp eq i32 %call, 0
726f16125a1SNoah Goldstein  br i1 %tobool.not, label %for.cond, label %halfway
727f16125a1SNoah Goldstein
728f16125a1SNoah Goldsteinfor.cond:
729f16125a1SNoah Goldstein  %i.0 = phi i32 [ %inc, %halfway ], [ 0, %entry ]
730f16125a1SNoah Goldstein  %cmp = icmp ult i32 %i.0, %N
731f16125a1SNoah Goldstein  br i1 %cmp, label %for.body, label %for.end
732f16125a1SNoah Goldstein
733f16125a1SNoah Goldsteinfor.body:
734f16125a1SNoah Goldstein  %xor = xor i32 %i.0, 1
735f16125a1SNoah Goldstein  call void @use.i32(i32 %xor)
736f16125a1SNoah Goldstein  br label %halfway
737f16125a1SNoah Goldstein
738f16125a1SNoah Goldsteinhalfway:
739f16125a1SNoah Goldstein  %i.1 = phi i32 [ poison, %entry ], [ %i.0, %for.body ]
740f16125a1SNoah Goldstein  %rem = urem i32 %i.1, %rem_amt
741f16125a1SNoah Goldstein  call void @use.i32(i32 %rem)
742f16125a1SNoah Goldstein  %inc = add nuw i32 %i.1, 1
743f16125a1SNoah Goldstein  br label %for.cond
744f16125a1SNoah Goldstein
745f16125a1SNoah Goldsteinfor.end:
746f16125a1SNoah Goldstein  ret void
747f16125a1SNoah Goldstein}
748f16125a1SNoah Goldstein
749f16125a1SNoah Goldsteindefine void @simple_urem_fail_intermediate_inc(i32 %N, i32 %rem_amt) nounwind {
750f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_fail_intermediate_inc(
751f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
752f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
753f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0
754f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
755f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
756f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
757f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
758f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
759f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
760f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
761f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC2:%.*]] = add nuw i32 [[I_04]], 1
762f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[INC2]], [[REM_AMT]]
763f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
764f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
765f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
766f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
767f16125a1SNoah Goldstein;
768f16125a1SNoah Goldsteinentry:
769f16125a1SNoah Goldstein  %cmp3.not = icmp eq i32 %N, 0
770f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
771f16125a1SNoah Goldstein
772f16125a1SNoah Goldsteinfor.cond.cleanup:
773f16125a1SNoah Goldstein  ret void
774f16125a1SNoah Goldstein
775f16125a1SNoah Goldsteinfor.body:
776f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
777f16125a1SNoah Goldstein  %inc2 = add nuw i32 %i.04, 1
778f16125a1SNoah Goldstein  %rem = urem i32 %inc2, %rem_amt
779f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
780f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
781f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
782f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
783f16125a1SNoah Goldstein}
784f16125a1SNoah Goldstein
785f16125a1SNoah Goldsteindefine void @weird_loop(i64 %sub.ptr.div.i56) personality ptr null {
786f16125a1SNoah Goldstein; CHECK-LABEL: define void @weird_loop(
787f16125a1SNoah Goldstein; CHECK-SAME: i64 [[SUB_PTR_DIV_I56:%.*]]) personality ptr null {
788f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
789f16125a1SNoah Goldstein; CHECK-NEXT:    [[ADD74_US:%.*]] = add nuw i64 0, 1
790e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[ADD74_US]], [[SUB_PTR_DIV_I56]]
791e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i64 0, i64 [[ADD74_US]]
792e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[ADD74_US1:%.*]] = add nuw i64 0, 1
793f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
794f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
795f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY]]
796f16125a1SNoah Goldstein;
797f16125a1SNoah Goldsteinentry:
798f16125a1SNoah Goldstein  br label %for.preheader
799f16125a1SNoah Goldstein
800f16125a1SNoah Goldsteinfor.preheader:
801f16125a1SNoah Goldstein  %i57.0540.us = phi i64 [ 0, %entry ], [ %add74.us, %for.body ]
802f16125a1SNoah Goldstein  %add74.us = add nuw i64 %i57.0540.us, 1
803f16125a1SNoah Goldstein  br label %for.body
804f16125a1SNoah Goldstein
805f16125a1SNoah Goldsteinfor.body:
806f16125a1SNoah Goldstein  %rem.us = urem i64 %i57.0540.us, %sub.ptr.div.i56
807f16125a1SNoah Goldstein  br i1 false, label %for.preheader, label %for.body
808f16125a1SNoah Goldstein}
809f16125a1SNoah Goldstein
8109b25ad81SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_fail(i32 %N, i32 %rem_amt) nounwind {
8119b25ad81SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_fail(
812f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
813f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
814f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
815f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
816f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
817f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
818f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
819f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
820f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
821f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
822731ae694SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]
823f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
824f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
825f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
826f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
827f16125a1SNoah Goldstein;
828f16125a1SNoah Goldsteinentry:
829f16125a1SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 3
830f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
831f16125a1SNoah Goldstein
832f16125a1SNoah Goldsteinfor.cond.cleanup:
833f16125a1SNoah Goldstein  ret void
834f16125a1SNoah Goldstein
835f16125a1SNoah Goldsteinfor.body:
836f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
837f16125a1SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
838f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
839f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
840f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
841f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
842f16125a1SNoah Goldstein}
843f16125a1SNoah Goldstein
8449b25ad81SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_okay(i32 %N, i32 %rem_amt_in) nounwind {
8459b25ad81SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_okay(
8469b25ad81SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
8479b25ad81SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
8489b25ad81SNoah Goldstein; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
8499b25ad81SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
8509b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
8519b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
8529b25ad81SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
8539b25ad81SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
8549b25ad81SNoah Goldstein; CHECK-NEXT:    ret void
8559b25ad81SNoah Goldstein; CHECK:       [[FOR_BODY]]:
856e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 2, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
8579b25ad81SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
8589b25ad81SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
859e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
860e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
861e4c67ba6SNoah Goldstein; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
8629b25ad81SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
8639b25ad81SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
8649b25ad81SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
8659b25ad81SNoah Goldstein;
8669b25ad81SNoah Goldsteinentry:
8679b25ad81SNoah Goldstein  %rem_amt = or i32 %rem_amt_in, 16
8689b25ad81SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 3
8699b25ad81SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
8709b25ad81SNoah Goldstein
8719b25ad81SNoah Goldsteinfor.cond.cleanup:
8729b25ad81SNoah Goldstein  ret void
8739b25ad81SNoah Goldstein
8749b25ad81SNoah Goldsteinfor.body:
8759b25ad81SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
8769b25ad81SNoah Goldstein  %rem = urem i32 %i.04, %rem_amt
8779b25ad81SNoah Goldstein  tail call void @use.i32(i32 %rem)
8789b25ad81SNoah Goldstein  %inc = add nuw i32 %i.04, 1
8799b25ad81SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
8809b25ad81SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
8819b25ad81SNoah Goldstein}
8829b25ad81SNoah Goldstein
883f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_through_add(i32 %N, i32 %rem_amt_in) nounwind {
884f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add(
885f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
886f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
887f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
888f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
889f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
890f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
891f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
892f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
893f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
894f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
8951e072ae2Sgoldsteinn; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 7, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]
896f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
897f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
8981e072ae2Sgoldsteinn; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1
8991e072ae2Sgoldsteinn; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]
9001e072ae2Sgoldsteinn; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
901f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
902f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
903f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
904f16125a1SNoah Goldstein;
905f16125a1SNoah Goldsteinentry:
906f16125a1SNoah Goldstein  %rem_amt = or i32 %rem_amt_in, 16
907f16125a1SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 3
908f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
909f16125a1SNoah Goldstein
910f16125a1SNoah Goldsteinfor.cond.cleanup:
911f16125a1SNoah Goldstein  ret void
912f16125a1SNoah Goldstein
913f16125a1SNoah Goldsteinfor.body:
914f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
915f16125a1SNoah Goldstein  %i_with_off = add nuw i32 %i.04, 5
916f16125a1SNoah Goldstein  %rem = urem i32 %i_with_off, %rem_amt
917f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
918f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
919f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
920f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
921f16125a1SNoah Goldstein}
922f16125a1SNoah Goldstein
923f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {
924f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(
925f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {
926f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
927f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16
928f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
929f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
930f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
931f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
932f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
933f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
934f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
935f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
936f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add i32 [[I_04]], 5
937f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
938f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
939f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
940f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
941f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
942f16125a1SNoah Goldstein;
943f16125a1SNoah Goldsteinentry:
944f16125a1SNoah Goldstein  %rem_amt = or i32 %rem_amt_in, 16
945f16125a1SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 3
946f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
947f16125a1SNoah Goldstein
948f16125a1SNoah Goldsteinfor.cond.cleanup:
949f16125a1SNoah Goldstein  ret void
950f16125a1SNoah Goldstein
951f16125a1SNoah Goldsteinfor.body:
952f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
953f16125a1SNoah Goldstein  %i_with_off = add i32 %i.04, 5
954f16125a1SNoah Goldstein  %rem = urem i32 %i_with_off, %rem_amt
955f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
956f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
957f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
958f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
959f16125a1SNoah Goldstein}
960f16125a1SNoah Goldstein
961f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {
962f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(
963f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {
964f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
965f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3
966f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
967f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
968f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
969f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
970f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
971f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
972f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]
973f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add nuw i32 [[I_04]], 5
974f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
975f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
976f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
977f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
978f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
979f16125a1SNoah Goldstein;
980f16125a1SNoah Goldsteinentry:
981f16125a1SNoah Goldstein  %cmp3.not = icmp ult i32 %N, 3
982f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
983f16125a1SNoah Goldstein
984f16125a1SNoah Goldsteinfor.cond.cleanup:
985f16125a1SNoah Goldstein  ret void
986f16125a1SNoah Goldstein
987f16125a1SNoah Goldsteinfor.body:
988f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]
989f16125a1SNoah Goldstein  %i_with_off = add nuw i32 %i.04, 5
990f16125a1SNoah Goldstein  %rem = urem i32 %i_with_off, %rem_amt
991f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
992f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
993f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
994f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
995f16125a1SNoah Goldstein}
996f16125a1SNoah Goldstein
997f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt, i32 %start) nounwind {
998f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub(
999f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {
1000f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
1001f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]
1002f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
1003f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
1004f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
1005f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
1006f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
1007f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
1008f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]
1009f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], [[START]]
1010f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
1011f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1012f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1013f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1014f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1015f16125a1SNoah Goldstein;
1016f16125a1SNoah Goldsteinentry:
1017f16125a1SNoah Goldstein  %cmp3.not = icmp ule i32 %N, %start
1018f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1019f16125a1SNoah Goldstein
1020f16125a1SNoah Goldsteinfor.cond.cleanup:
1021f16125a1SNoah Goldstein  ret void
1022f16125a1SNoah Goldstein
1023f16125a1SNoah Goldsteinfor.body:
1024f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]
1025f16125a1SNoah Goldstein  %i_with_off = sub nuw i32 %i.04, %start
1026f16125a1SNoah Goldstein  %rem = urem i32 %i_with_off, %rem_amt
1027f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
1028f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
1029f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
1030f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1031f16125a1SNoah Goldstein}
1032f16125a1SNoah Goldstein
1033f16125a1SNoah Goldsteindefine void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i32 %rem_amt, i32 %start) nounwind {
1034f16125a1SNoah Goldstein; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(
1035f16125a1SNoah Goldstein; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {
1036f16125a1SNoah Goldstein; CHECK-NEXT:  [[ENTRY:.*:]]
1037f16125a1SNoah Goldstein; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]
1038f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
1039f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY_PREHEADER]]:
1040f16125a1SNoah Goldstein; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
1041f16125a1SNoah Goldstein; CHECK:       [[FOR_COND_CLEANUP]]:
1042f16125a1SNoah Goldstein; CHECK-NEXT:    ret void
1043f16125a1SNoah Goldstein; CHECK:       [[FOR_BODY]]:
1044f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]
1045f16125a1SNoah Goldstein; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], 2
1046f16125a1SNoah Goldstein; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]
1047f16125a1SNoah Goldstein; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])
1048f16125a1SNoah Goldstein; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1
1049f16125a1SNoah Goldstein; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]
1050f16125a1SNoah Goldstein; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]
1051f16125a1SNoah Goldstein;
1052f16125a1SNoah Goldsteinentry:
1053f16125a1SNoah Goldstein  %cmp3.not = icmp ule i32 %N, %start
1054f16125a1SNoah Goldstein  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body
1055f16125a1SNoah Goldstein
1056f16125a1SNoah Goldsteinfor.cond.cleanup:
1057f16125a1SNoah Goldstein  ret void
1058f16125a1SNoah Goldstein
1059f16125a1SNoah Goldsteinfor.body:
1060f16125a1SNoah Goldstein  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]
1061f16125a1SNoah Goldstein  %i_with_off = sub nuw i32 %i.04, 2
1062f16125a1SNoah Goldstein  %rem = urem i32 %i_with_off, %rem_amt
1063f16125a1SNoah Goldstein  tail call void @use.i32(i32 %rem)
1064f16125a1SNoah Goldstein  %inc = add nuw i32 %i.04, 1
1065f16125a1SNoah Goldstein  %exitcond.not = icmp eq i32 %inc, %N
1066f16125a1SNoah Goldstein  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
1067f16125a1SNoah Goldstein}
1068