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