brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.3 KiB · f53127f Raw
1102 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -mtriple=x86_64-unknown-unknown --loop-simplify -codegenprepare -S | FileCheck %s3 4declare void @use.i32(i32)5declare void @use.2xi64(<2 x i64>)6declare void @do_stuff0()7declare void @do_stuff1()8declare i1 @get.i1()9declare i32 @get.i32()10 11define void @simple_urem_to_sel(i32 %N, i32 %rem_amt) nounwind {12; CHECK-LABEL: define void @simple_urem_to_sel(13; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0:[0-9]+]] {14; CHECK-NEXT:  [[ENTRY:.*:]]15; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 016; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]17; CHECK:       [[FOR_BODY_PREHEADER]]:18; CHECK-NEXT:    br label %[[FOR_BODY:.*]]19; CHECK:       [[FOR_COND_CLEANUP]]:20; CHECK-NEXT:    ret void21; CHECK:       [[FOR_BODY]]:22; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]23; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]24; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])25; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 126; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]27; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]28; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 129; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]30; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]31;32entry:33  %cmp3.not = icmp eq i32 %N, 034  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body35 36for.cond.cleanup:37  ret void38 39for.body:40  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]41  %rem = urem i32 %i.04, %rem_amt42  tail call void @use.i32(i32 %rem)43  %inc = add nuw i32 %i.04, 144  %exitcond.not = icmp eq i32 %inc, %N45  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body46}47 48define void @simple_urem_to_sel_fail_not_in_loop(i32 %N, i32 %rem_amt) nounwind {49; CHECK-LABEL: define void @simple_urem_to_sel_fail_not_in_loop(50; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {51; CHECK-NEXT:  [[ENTRY:.*]]:52; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 053; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]54; CHECK:       [[FOR_BODY_PREHEADER]]:55; CHECK-NEXT:    br label %[[FOR_BODY:.*]]56; CHECK:       [[FOR_COND_CLEANUP]]:57; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]58; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_05]], [[REM_AMT]]59; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])60; CHECK-NEXT:    ret void61; CHECK:       [[FOR_BODY]]:62; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]63; CHECK-NEXT:    tail call void @use.i32(i32 [[I_04]])64; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 165; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]66; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]67;68entry:69  %cmp3.not = icmp eq i32 %N, 070  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body71 72for.cond.cleanup:73  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]74  %rem = urem i32 %i.05, %rem_amt75  tail call void @use.i32(i32 %rem)76  ret void77 78for.body:79  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]80  tail call void @use.i32(i32 %i.04)81  %inc = add nuw i32 %i.04, 182  %exitcond.not = icmp eq i32 %inc, %N83  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body84}85 86define void @simple_urem_to_sel_inner_loop(i32 %N, i32 %M) nounwind {87; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop(88; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {89; CHECK-NEXT:  [[ENTRY:.*:]]90; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()91; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 092; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]93; CHECK:       [[FOR_BODY_PREHEADER]]:94; CHECK-NEXT:    br label %[[FOR_BODY:.*]]95; CHECK:       [[FOR_COND_CLEANUP]]:96; CHECK-NEXT:    ret void97; CHECK:       [[FOR_BODY]]:98; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ]99; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]100; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0101; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]102; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:103; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]104; CHECK:       [[FOR_INNER_BODY]]:105; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]106; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])107; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1108; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]109; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]110; CHECK:       [[FOR_INNER_COND_CLEANUP]]:111; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1112; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]113; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]114; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1115; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]116; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]117;118entry:119  %rem_amt = call i32 @get.i32()120  %cmp3.not = icmp eq i32 %N, 0121  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body122 123for.cond.cleanup:124  ret void125 126for.body:127  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]128 129  %cmp_inner = icmp eq i32 %M, 0130  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body131 132for.inner.body:133  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]134  %rem = urem i32 %i.04, %rem_amt135  tail call void @use.i32(i32 %rem)136  %inc_inner = add nuw i32 %j, 1137  %exitcond_inner = icmp eq i32 %inc_inner, %M138  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body139 140for.inner.cond.cleanup:141  %inc = add nuw i32 %i.04, 1142  %exitcond.not = icmp eq i32 %inc, %N143  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body144}145 146define void @simple_urem_to_sel_inner_loop_fail_not_invariant(i32 %N, i32 %M) nounwind {147; CHECK-LABEL: define void @simple_urem_to_sel_inner_loop_fail_not_invariant(148; CHECK-SAME: i32 [[N:%.*]], i32 [[M:%.*]]) #[[ATTR0]] {149; CHECK-NEXT:  [[ENTRY:.*:]]150; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0151; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]152; CHECK:       [[FOR_BODY_PREHEADER]]:153; CHECK-NEXT:    br label %[[FOR_BODY:.*]]154; CHECK:       [[FOR_COND_CLEANUP]]:155; CHECK-NEXT:    ret void156; CHECK:       [[FOR_BODY]]:157; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_INNER_COND_CLEANUP:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]158; CHECK-NEXT:    [[REM_AMT:%.*]] = call i32 @get.i32()159; CHECK-NEXT:    [[CMP_INNER:%.*]] = icmp eq i32 [[M]], 0160; CHECK-NEXT:    br i1 [[CMP_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY_PREHEADER:.*]]161; CHECK:       [[FOR_INNER_BODY_PREHEADER]]:162; CHECK-NEXT:    br label %[[FOR_INNER_BODY:.*]]163; CHECK:       [[FOR_INNER_BODY]]:164; CHECK-NEXT:    [[J:%.*]] = phi i32 [ [[INC_INNER:%.*]], %[[FOR_INNER_BODY]] ], [ 0, %[[FOR_INNER_BODY_PREHEADER]] ]165; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]166; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])167; CHECK-NEXT:    [[INC_INNER]] = add nuw i32 [[J]], 1168; CHECK-NEXT:    [[EXITCOND_INNER:%.*]] = icmp eq i32 [[INC_INNER]], [[M]]169; CHECK-NEXT:    br i1 [[EXITCOND_INNER]], label %[[FOR_INNER_COND_CLEANUP]], label %[[FOR_INNER_BODY]]170; CHECK:       [[FOR_INNER_COND_CLEANUP]]:171; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1172; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]173; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]174;175entry:176  %cmp3.not = icmp eq i32 %N, 0177  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body178 179for.cond.cleanup:180  ret void181 182for.body:183  %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]184  %rem_amt = call i32 @get.i32()185  %cmp_inner = icmp eq i32 %M, 0186  br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body187 188for.inner.body:189  %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]190  %rem = urem i32 %i.04, %rem_amt191  tail call void @use.i32(i32 %rem)192  %inc_inner = add nuw i32 %j, 1193  %exitcond_inner = icmp eq i32 %inc_inner, %M194  br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body195 196for.inner.cond.cleanup:197  %inc = add nuw i32 %i.04, 1198  %exitcond.not = icmp eq i32 %inc, %N199  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body200}201 202define void @simple_urem_to_sel_nested2(i32 %N, i32 %rem_amt) nounwind {203; CHECK-LABEL: define void @simple_urem_to_sel_nested2(204; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {205; CHECK-NEXT:  [[ENTRY:.*:]]206; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0207; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]208; CHECK:       [[FOR_BODY_PREHEADER]]:209; CHECK-NEXT:    br label %[[FOR_BODY:.*]]210; CHECK:       [[FOR_COND_CLEANUP]]:211; CHECK-NEXT:    ret void212; CHECK:       [[FOR_BODY]]:213; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY_TAIL:.*]] ]214; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]215; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()216; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]217; CHECK:       [[FOR_BODY0]]:218; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()219; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY2:.*]]220; CHECK:       [[FOR_BODY2]]:221; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()222; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]223; CHECK:       [[FOR_BODY1]]:224; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])225; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]226; CHECK:       [[FOR_BODY_TAIL]]:227; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1228; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]229; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]230; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1231; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]232; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]233;234entry:235  %cmp3.not = icmp eq i32 %N, 0236  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body237 238for.cond.cleanup:239  ret void240 241for.body:242  %i.04 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]243  %cond0 = call i1 @get.i1()244  br i1 %cond0, label %for.body0, label %for.body.tail245for.body0:246  %cond1 = call i1 @get.i1()247  br i1 %cond1, label %for.body1, label %for.body2248for.body2:249  %cond2 = call i1 @get.i1()250  br i1 %cond2, label %for.body1, label %for.body.tail251for.body1:252  %rem = urem i32 %i.04, %rem_amt253  tail call void @use.i32(i32 %rem)254  br label %for.body.tail255for.body.tail:256  %inc = add nuw i32 %i.04, 1257  %exitcond.not = icmp eq i32 %inc, %N258  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body259}260 261define void @simple_urem_fail_bad_incr3(i32 %N, i32 %rem_amt) nounwind {262; CHECK-LABEL: define void @simple_urem_fail_bad_incr3(263; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {264; CHECK-NEXT:  [[ENTRY:.*:]]265; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0266; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]267; CHECK:       [[FOR_BODY_PREHEADER]]:268; CHECK-NEXT:    br label %[[FOR_BODY:.*]]269; CHECK:       [[FOR_COND_CLEANUP]]:270; CHECK-NEXT:    ret void271; CHECK:       [[FOR_BODY]]:272; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()273; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY2:.*]]274; CHECK:       [[FOR_BODY0]]:275; CHECK-NEXT:    [[COND1:%.*]] = call i1 @get.i1()276; CHECK-NEXT:    [[VAL:%.*]] = call i32 @get.i32()277; CHECK-NEXT:    [[INC:%.*]] = add nuw i32 [[VAL]], 1278; CHECK-NEXT:    br i1 [[COND1]], label %[[FOR_BODY1:.*]], label %[[FOR_BODY_TAIL:.*]]279; CHECK:       [[FOR_BODY2]]:280; CHECK-NEXT:    [[COND2:%.*]] = call i1 @get.i1()281; CHECK-NEXT:    br i1 [[COND2]], label %[[FOR_BODY1]], label %[[FOR_BODY_TAIL]]282; CHECK:       [[FOR_BODY1]]:283; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY0]] ], [ 0, %[[FOR_BODY2]] ]284; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]285; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])286; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]287; CHECK:       [[FOR_BODY_TAIL]]:288; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()289; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]290;291entry:292  %cmp3.not = icmp eq i32 %N, 0293  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body294 295for.cond.cleanup:296  ret void297 298for.body:299  %cond0 = call i1 @get.i1()300  br i1 %cond0, label %for.body0, label %for.body2301for.body0:302  %cond1 = call i1 @get.i1()303  %val = call i32 @get.i32()304  %inc = add nuw i32 %val, 1305  br i1 %cond1, label %for.body1, label %for.body.tail306for.body2:307  %cond2 = call i1 @get.i1()308  br i1 %cond2, label %for.body1, label %for.body.tail309for.body1:310  %i.04 = phi i32 [ %inc, %for.body0], [ 0, %for.body2 ]311  %rem = urem i32 %i.04, %rem_amt312  tail call void @use.i32(i32 %rem)313  br label %for.body.tail314for.body.tail:315  %exitcond.not = call i1 @get.i1()316  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body317}318 319define void @simple_urem_to_sel_vec(<2 x i64> %rem_amt) nounwind {320; CHECK-LABEL: define void @simple_urem_to_sel_vec(321; CHECK-SAME: <2 x i64> [[REM_AMT:%.*]]) #[[ATTR0]] {322; CHECK-NEXT:  [[ENTRY:.*]]:323; CHECK-NEXT:    br label %[[FOR_BODY:.*]]324; CHECK:       [[FOR_COND_CLEANUP:.*]]:325; CHECK-NEXT:    ret void326; CHECK:       [[FOR_BODY]]:327; CHECK-NEXT:    [[REM:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]328; CHECK-NEXT:    [[I_04:%.*]] = phi <2 x i64> [ [[INC:%.*]], %[[FOR_BODY]] ], [ zeroinitializer, %[[ENTRY]] ]329; CHECK-NEXT:    tail call void @use.2xi64(<2 x i64> [[REM]])330; CHECK-NEXT:    [[TMP1:%.*]] = add nuw <2 x i64> [[REM]], splat (i64 1)331; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], [[REM_AMT]]332; CHECK-NEXT:    [[TMP3]] = select <2 x i1> [[TMP2]], <2 x i64> zeroinitializer, <2 x i64> [[TMP1]]333; CHECK-NEXT:    [[INC]] = add nuw <2 x i64> [[I_04]], splat (i64 1)334; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = call i1 @get.i1()335; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]336;337entry:338  br label %for.body339 340for.cond.cleanup:341  ret void342 343for.body:344  %i.04 = phi <2 x i64> [ %inc, %for.body ], [ zeroinitializer, %entry ]345  %rem = urem <2 x i64> %i.04, %rem_amt346  tail call void @use.2xi64(<2 x i64> %rem)347  %inc = add nuw <2 x i64> %i.04, <i64 1, i64 1>348  %exitcond.not = call i1 @get.i1()349  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body350}351 352define void @simple_urem_fail_bad_incr(i32 %N, i32 %rem_amt) nounwind {353; CHECK-LABEL: define void @simple_urem_fail_bad_incr(354; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {355; CHECK-NEXT:  [[ENTRY:.*:]]356; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0357; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]358; CHECK:       [[FOR_BODY_PREHEADER]]:359; CHECK-NEXT:    br label %[[FOR_BODY:.*]]360; CHECK:       [[FOR_COND_CLEANUP]]:361; CHECK-NEXT:    ret void362; CHECK:       [[FOR_BODY]]:363; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY_TAIL:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]364; CHECK-NEXT:    [[COND0:%.*]] = call i1 @get.i1()365; CHECK-NEXT:    br i1 [[COND0]], label %[[FOR_BODY0:.*]], label %[[FOR_BODY_TAIL]]366; CHECK:       [[FOR_BODY0]]:367; CHECK-NEXT:    [[SOME_VAL:%.*]] = call i32 @get.i32()368; CHECK-NEXT:    br label %[[FOR_BODY_TAIL]]369; CHECK:       [[FOR_BODY_TAIL]]:370; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[I_03]], %[[FOR_BODY]] ], [ [[SOME_VAL]], %[[FOR_BODY0]] ]371; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]372; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])373; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1374; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]375; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]376;377entry:378  %cmp3.not = icmp eq i32 %N, 0379  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body380 381for.cond.cleanup:382  ret void383 384for.body:385  %i.03 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]386  %cond0 = call i1 @get.i1()387  br i1 %cond0, label %for.body0, label %for.body.tail388for.body0:389  %some_val = call i32 @get.i32()390  br label %for.body.tail391 392for.body.tail:393  %i.04 = phi i32 [ %i.03, %for.body ], [ %some_val, %for.body0 ]394  %rem = urem i32 %i.04, %rem_amt395  tail call void @use.i32(i32 %rem)396  %inc = add nuw i32 %i.04, 1397  %exitcond.not = icmp eq i32 %inc, %N398  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body399}400 401define void @simple_urem_to_sel_second_acc(i32 %N, i32 %rem_amt) nounwind {402; CHECK-LABEL: define void @simple_urem_to_sel_second_acc(403; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {404; CHECK-NEXT:  [[ENTRY:.*:]]405; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 2406; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]407; CHECK:       [[FOR_BODY_PREHEADER]]:408; CHECK-NEXT:    br label %[[FOR_BODY:.*]]409; CHECK:       [[FOR_COND_CLEANUP]]:410; CHECK-NEXT:    ret void411; CHECK:       [[FOR_BODY]]:412; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]413; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]414; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ [[INC2:%.*]], %[[FOR_BODY]] ], [ 1, %[[FOR_BODY_PREHEADER]] ]415; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])416; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1417; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]418; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]419; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1420; CHECK-NEXT:    [[INC2]] = add nuw i32 [[I_05]], 2421; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ugt i32 [[INC2]], [[N]]422; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]423;424entry:425  %cmp3.not = icmp ult i32 %N, 2426  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body427 428for.cond.cleanup:429  ret void430 431for.body:432  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]433  %i.05 = phi i32 [ %inc2, %for.body ], [ 1, %entry ]434  %rem = urem i32 %i.04, %rem_amt435  tail call void @use.i32(i32 %rem)436  %inc = add nuw i32 %i.04, 1437  %inc2 = add nuw i32 %i.05, 2438  %exitcond.not = icmp ugt i32 %inc2, %N439  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body440}441 442define void @simple_urem_fail_srem(i32 %N, i32 %rem_amt) nounwind {443; CHECK-LABEL: define void @simple_urem_fail_srem(444; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {445; CHECK-NEXT:  [[ENTRY:.*:]]446; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0447; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]448; CHECK:       [[FOR_BODY_PREHEADER]]:449; CHECK-NEXT:    br label %[[FOR_BODY:.*]]450; CHECK:       [[FOR_COND_CLEANUP]]:451; CHECK-NEXT:    ret void452; CHECK:       [[FOR_BODY]]:453; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]454; CHECK-NEXT:    [[REM:%.*]] = srem i32 [[I_04]], [[REM_AMT]]455; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])456; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1457; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]458; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]459;460entry:461  %cmp3.not = icmp eq i32 %N, 0462  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body463 464for.cond.cleanup:465  ret void466 467for.body:468  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]469  %rem = srem i32 %i.04, %rem_amt470  tail call void @use.i32(i32 %rem)471  %inc = add nuw i32 %i.04, 1472  %exitcond.not = icmp eq i32 %inc, %N473  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body474}475 476define void @simple_urem_fail_missing_nuw(i32 %N, i32 %rem_amt) nounwind {477; CHECK-LABEL: define void @simple_urem_fail_missing_nuw(478; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {479; CHECK-NEXT:  [[ENTRY:.*:]]480; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0481; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]482; CHECK:       [[FOR_BODY_PREHEADER]]:483; CHECK-NEXT:    br label %[[FOR_BODY:.*]]484; CHECK:       [[FOR_COND_CLEANUP]]:485; CHECK-NEXT:    ret void486; CHECK:       [[FOR_BODY]]:487; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]488; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]489; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])490; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_04]], 1491; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]492; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]493;494entry:495  %cmp3.not = icmp eq i32 %N, 0496  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body497 498for.cond.cleanup:499  ret void500 501for.body:502  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]503  %rem = urem i32 %i.04, %rem_amt504  tail call void @use.i32(i32 %rem)505  %inc = add nsw i32 %i.04, 1506  %exitcond.not = icmp eq i32 %inc, %N507  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body508}509 510define void @simple_urem_fail_bad_incr2(i32 %N, i32 %rem_amt) nounwind {511; CHECK-LABEL: define void @simple_urem_fail_bad_incr2(512; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {513; CHECK-NEXT:  [[ENTRY:.*:]]514; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0515; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]516; CHECK:       [[FOR_BODY_PREHEADER]]:517; CHECK-NEXT:    br label %[[FOR_BODY:.*]]518; CHECK:       [[FOR_COND_CLEANUP]]:519; CHECK-NEXT:    ret void520; CHECK:       [[FOR_BODY]]:521; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]522; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]523; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])524; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 2525; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]526; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]527;528entry:529  %cmp3.not = icmp eq i32 %N, 0530  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body531 532for.cond.cleanup:533  ret void534 535for.body:536  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]537  %rem = urem i32 %i.04, %rem_amt538  tail call void @use.i32(i32 %rem)539  %inc = add nuw i32 %i.04, 2540  %exitcond.not = icmp eq i32 %inc, %N541  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body542}543 544define void @simple_urem_non_zero_entry4(i32 %N, i32 %rem_amt) nounwind {545; CHECK-LABEL: define void @simple_urem_non_zero_entry4(546; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {547; CHECK-NEXT:  [[ENTRY:.*:]]548; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0549; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]550; CHECK:       [[FOR_BODY_PREHEADER]]:551; CHECK-NEXT:    br label %[[FOR_BODY:.*]]552; CHECK:       [[FOR_COND_CLEANUP]]:553; CHECK-NEXT:    ret void554; CHECK:       [[FOR_BODY]]:555; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]556; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]557; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])558; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1559; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]560; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]561;562entry:563  %cmp3.not = icmp eq i32 %N, 0564  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body565 566for.cond.cleanup:567  ret void568 569for.body:570  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]571  %rem = urem i32 %i.04, %rem_amt572  tail call void @use.i32(i32 %rem)573  %inc = add nuw i32 %i.04, 1574  %exitcond.not = icmp eq i32 %inc, %N575  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body576}577 578define void @simple_urem_skip_const_rem_amt(i32 %N) nounwind {579; CHECK-LABEL: define void @simple_urem_skip_const_rem_amt(580; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] {581; CHECK-NEXT:  [[ENTRY:.*:]]582; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0583; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]584; CHECK:       [[FOR_BODY_PREHEADER]]:585; CHECK-NEXT:    br label %[[FOR_BODY:.*]]586; CHECK:       [[FOR_COND_CLEANUP]]:587; CHECK-NEXT:    ret void588; CHECK:       [[FOR_BODY]]:589; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 4, %[[FOR_BODY_PREHEADER]] ]590; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], 19591; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])592; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1593; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]594; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]595;596entry:597  %cmp3.not = icmp eq i32 %N, 0598  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body599 600for.cond.cleanup:601  ret void602 603for.body:604  %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]605  %rem = urem i32 %i.04, 19606  tail call void @use.i32(i32 %rem)607  %inc = add nuw i32 %i.04, 1608  %exitcond.not = icmp eq i32 %inc, %N609  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body610}611 612define void @simple_urem_fail_no_preheader_non_canonical(i32 %N, i32 %rem_amt) nounwind {613; CHECK-LABEL: define void @simple_urem_fail_no_preheader_non_canonical(614; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {615; CHECK-NEXT:  [[ENTRY:.*]]:616; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0617; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_BODY_PREHEADER:.*]], label %[[FOR_BODY1:.*]]618; CHECK:       [[FOR_COND_CLEANUP:.*]]:619; CHECK-NEXT:    ret void620; CHECK:       [[FOR_BODY1]]:621; CHECK-NEXT:    br label %[[FOR_BODY_PREHEADER]]622; CHECK:       [[FOR_BODY_PREHEADER]]:623; CHECK-NEXT:    [[I_04_PH:%.*]] = phi i32 [ 1, %[[FOR_BODY1]] ], [ 0, %[[ENTRY]] ]624; CHECK-NEXT:    br label %[[FOR_BODY:.*]]625; CHECK:       [[FOR_BODY]]:626; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[I_04_PH]], %[[FOR_BODY_PREHEADER]] ]627; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]628; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])629; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1630; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]631; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]632;633entry:634  %cmp3.not = icmp eq i32 %N, 0635  br i1 %cmp3.not, label %for.body0, label %for.body1636 637for.cond.cleanup:638  ret void639 640for.body0:641  br label %for.body642 643for.body1:644  br label %for.body645 646for.body:647  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %for.body0 ], [ 1, %for.body1 ]648  %rem = urem i32 %i.04, %rem_amt649  tail call void @use.i32(i32 %rem)650  %inc = add nuw i32 %i.04, 1651  %exitcond.not = icmp eq i32 %inc, %N652  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body653}654 655define void @simple_urem_multi_latch_non_canonical(i32 %N, i32 %rem_amt) nounwind {656; CHECK-LABEL: define void @simple_urem_multi_latch_non_canonical(657; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {658; CHECK-NEXT:  [[ENTRY:.*:]]659; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0660; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]661; CHECK:       [[FOR_BODY_PREHEADER]]:662; CHECK-NEXT:    br label %[[FOR_BODY:.*]]663; CHECK:       [[FOR_COND_CLEANUP]]:664; CHECK-NEXT:    ret void665; CHECK:       [[FOR_BODY]]:666; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ 0, %[[FOR_BODY_PREHEADER]] ], [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[INC]], %[[FOR_BODY0:.*]] ]667; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]668; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])669; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1670; CHECK-NEXT:    [[COND:%.*]] = call i1 @get.i1()671; CHECK-NEXT:    call void @do_stuff0()672; CHECK-NEXT:    br i1 [[COND]], label %[[FOR_BODY0]], label %[[FOR_BODY]]673; CHECK:       [[FOR_BODY0]]:674; CHECK-NEXT:    call void @do_stuff1()675; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]676; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]677;678entry:679  %cmp3.not = icmp eq i32 %N, 0680  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body681 682for.cond.cleanup:683  ret void684 685for.body:686  %i.04 = phi i32 [ %inc, %for.body ], [ %inc, %for.body0 ], [ 0, %entry ]687  %rem = urem i32 %i.04, %rem_amt688  tail call void @use.i32(i32 %rem)689  %inc = add nuw i32 %i.04, 1690  %cond = call i1 @get.i1()691  call void @do_stuff0()692  br i1 %cond, label %for.body0, label %for.body693for.body0:694  call void @do_stuff1()695  %exitcond.not = icmp eq i32 %inc, %N696  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body697}698 699define void @simple_urem_fail_bad_loop(i32 %N, i32 %rem_amt) nounwind {700; CHECK-LABEL: define void @simple_urem_fail_bad_loop(701; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {702; CHECK-NEXT:  [[ENTRY:.*]]:703; CHECK-NEXT:    [[CALL:%.*]] = call i32 @get.i32()704; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0705; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[FOR_COND:.*]], label %[[HALFWAY:.*]]706; CHECK:       [[FOR_COND]]:707; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[INC:%.*]], %[[HALFWAY]] ], [ 0, %[[ENTRY]] ]708; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[I_0]], [[N]]709; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]710; CHECK:       [[FOR_BODY]]:711; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[I_0]], 1712; CHECK-NEXT:    call void @use.i32(i32 [[XOR]])713; CHECK-NEXT:    br label %[[HALFWAY]]714; CHECK:       [[HALFWAY]]:715; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ poison, %[[ENTRY]] ], [ [[I_0]], %[[FOR_BODY]] ]716; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_1]], [[REM_AMT]]717; CHECK-NEXT:    call void @use.i32(i32 [[REM]])718; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_1]], 1719; CHECK-NEXT:    br label %[[FOR_COND]]720; CHECK:       [[FOR_END]]:721; CHECK-NEXT:    ret void722;723entry:724  %call = call i32 @get.i32()725  %tobool.not = icmp eq i32 %call, 0726  br i1 %tobool.not, label %for.cond, label %halfway727 728for.cond:729  %i.0 = phi i32 [ %inc, %halfway ], [ 0, %entry ]730  %cmp = icmp ult i32 %i.0, %N731  br i1 %cmp, label %for.body, label %for.end732 733for.body:734  %xor = xor i32 %i.0, 1735  call void @use.i32(i32 %xor)736  br label %halfway737 738halfway:739  %i.1 = phi i32 [ poison, %entry ], [ %i.0, %for.body ]740  %rem = urem i32 %i.1, %rem_amt741  call void @use.i32(i32 %rem)742  %inc = add nuw i32 %i.1, 1743  br label %for.cond744 745for.end:746  ret void747}748 749define void @simple_urem_fail_intermediate_inc(i32 %N, i32 %rem_amt) nounwind {750; CHECK-LABEL: define void @simple_urem_fail_intermediate_inc(751; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {752; CHECK-NEXT:  [[ENTRY:.*:]]753; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp eq i32 [[N]], 0754; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]755; CHECK:       [[FOR_BODY_PREHEADER]]:756; CHECK-NEXT:    br label %[[FOR_BODY:.*]]757; CHECK:       [[FOR_COND_CLEANUP]]:758; CHECK-NEXT:    ret void759; CHECK:       [[FOR_BODY]]:760; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]761; CHECK-NEXT:    [[INC2:%.*]] = add nuw i32 [[I_04]], 1762; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[INC2]], [[REM_AMT]]763; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])764; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1765; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]766; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]767;768entry:769  %cmp3.not = icmp eq i32 %N, 0770  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body771 772for.cond.cleanup:773  ret void774 775for.body:776  %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]777  %inc2 = add nuw i32 %i.04, 1778  %rem = urem i32 %inc2, %rem_amt779  tail call void @use.i32(i32 %rem)780  %inc = add nuw i32 %i.04, 1781  %exitcond.not = icmp eq i32 %inc, %N782  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body783}784 785define void @weird_loop(i64 %sub.ptr.div.i56) personality ptr null {786; CHECK-LABEL: define void @weird_loop(787; CHECK-SAME: i64 [[SUB_PTR_DIV_I56:%.*]]) personality ptr null {788; CHECK-NEXT:  [[ENTRY:.*:]]789; CHECK-NEXT:    [[ADD74_US:%.*]] = add nuw i64 0, 1790; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[ADD74_US]], [[SUB_PTR_DIV_I56]]791; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i64 0, i64 [[ADD74_US]]792; CHECK-NEXT:    [[ADD74_US1:%.*]] = add nuw i64 0, 1793; CHECK-NEXT:    br label %[[FOR_BODY:.*]]794; CHECK:       [[FOR_BODY]]:795; CHECK-NEXT:    br label %[[FOR_BODY]]796;797entry:798  br label %for.preheader799 800for.preheader:801  %i57.0540.us = phi i64 [ 0, %entry ], [ %add74.us, %for.body ]802  %add74.us = add nuw i64 %i57.0540.us, 1803  br label %for.body804 805for.body:806  %rem.us = urem i64 %i57.0540.us, %sub.ptr.div.i56807  br i1 false, label %for.preheader, label %for.body808}809 810define void @simple_urem_to_sel_non_zero_start_fail(i32 %N, i32 %rem_amt) nounwind {811; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_fail(812; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {813; CHECK-NEXT:  [[ENTRY:.*:]]814; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3815; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]816; CHECK:       [[FOR_BODY_PREHEADER]]:817; CHECK-NEXT:    br label %[[FOR_BODY:.*]]818; CHECK:       [[FOR_COND_CLEANUP]]:819; CHECK-NEXT:    ret void820; CHECK:       [[FOR_BODY]]:821; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]822; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_04]], [[REM_AMT]]823; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])824; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1825; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]826; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]827;828entry:829  %cmp3.not = icmp ult i32 %N, 3830  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body831 832for.cond.cleanup:833  ret void834 835for.body:836  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]837  %rem = urem i32 %i.04, %rem_amt838  tail call void @use.i32(i32 %rem)839  %inc = add nuw i32 %i.04, 1840  %exitcond.not = icmp eq i32 %inc, %N841  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body842}843 844define void @simple_urem_to_sel_non_zero_start_okay(i32 %N, i32 %rem_amt_in) nounwind {845; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_okay(846; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {847; CHECK-NEXT:  [[ENTRY:.*:]]848; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16849; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3850; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]851; CHECK:       [[FOR_BODY_PREHEADER]]:852; CHECK-NEXT:    br label %[[FOR_BODY:.*]]853; CHECK:       [[FOR_COND_CLEANUP]]:854; CHECK-NEXT:    ret void855; CHECK:       [[FOR_BODY]]:856; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 2, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]857; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]858; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])859; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1860; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]861; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]862; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1863; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]864; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]865;866entry:867  %rem_amt = or i32 %rem_amt_in, 16868  %cmp3.not = icmp ult i32 %N, 3869  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body870 871for.cond.cleanup:872  ret void873 874for.body:875  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]876  %rem = urem i32 %i.04, %rem_amt877  tail call void @use.i32(i32 %rem)878  %inc = add nuw i32 %i.04, 1879  %exitcond.not = icmp eq i32 %inc, %N880  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body881}882 883define void @simple_urem_to_sel_non_zero_start_through_add(i32 %N, i32 %rem_amt_in) nounwind {884; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add(885; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {886; CHECK-NEXT:  [[ENTRY:.*:]]887; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16888; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3889; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]890; CHECK:       [[FOR_BODY_PREHEADER]]:891; CHECK-NEXT:    br label %[[FOR_BODY:.*]]892; CHECK:       [[FOR_COND_CLEANUP]]:893; CHECK-NEXT:    ret void894; CHECK:       [[FOR_BODY]]:895; CHECK-NEXT:    [[REM:%.*]] = phi i32 [ 7, %[[FOR_BODY_PREHEADER]] ], [ [[TMP3:%.*]], %[[FOR_BODY]] ]896; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]897; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])898; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i32 [[REM]], 1899; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], [[REM_AMT]]900; CHECK-NEXT:    [[TMP3]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]901; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1902; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]903; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]904;905entry:906  %rem_amt = or i32 %rem_amt_in, 16907  %cmp3.not = icmp ult i32 %N, 3908  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body909 910for.cond.cleanup:911  ret void912 913for.body:914  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]915  %i_with_off = add nuw i32 %i.04, 5916  %rem = urem i32 %i_with_off, %rem_amt917  tail call void @use.i32(i32 %rem)918  %inc = add nuw i32 %i.04, 1919  %exitcond.not = icmp eq i32 %inc, %N920  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body921}922 923define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {924; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(925; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT_IN:%.*]]) #[[ATTR0]] {926; CHECK-NEXT:  [[ENTRY:.*:]]927; CHECK-NEXT:    [[REM_AMT:%.*]] = or i32 [[REM_AMT_IN]], 16928; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3929; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]930; CHECK:       [[FOR_BODY_PREHEADER]]:931; CHECK-NEXT:    br label %[[FOR_BODY:.*]]932; CHECK:       [[FOR_COND_CLEANUP]]:933; CHECK-NEXT:    ret void934; CHECK:       [[FOR_BODY]]:935; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]936; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add i32 [[I_04]], 5937; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]938; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])939; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1940; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]941; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]942;943entry:944  %rem_amt = or i32 %rem_amt_in, 16945  %cmp3.not = icmp ult i32 %N, 3946  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body947 948for.cond.cleanup:949  ret void950 951for.body:952  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]953  %i_with_off = add i32 %i.04, 5954  %rem = urem i32 %i_with_off, %rem_amt955  tail call void @use.i32(i32 %rem)956  %inc = add nuw i32 %i.04, 1957  %exitcond.not = icmp eq i32 %inc, %N958  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body959}960 961define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {962; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(963; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]]) #[[ATTR0]] {964; CHECK-NEXT:  [[ENTRY:.*:]]965; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ult i32 [[N]], 3966; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]967; CHECK:       [[FOR_BODY_PREHEADER]]:968; CHECK-NEXT:    br label %[[FOR_BODY:.*]]969; CHECK:       [[FOR_COND_CLEANUP]]:970; CHECK-NEXT:    ret void971; CHECK:       [[FOR_BODY]]:972; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ 2, %[[FOR_BODY_PREHEADER]] ]973; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = add nuw i32 [[I_04]], 5974; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]975; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])976; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 1977; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]978; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]979;980entry:981  %cmp3.not = icmp ult i32 %N, 3982  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body983 984for.cond.cleanup:985  ret void986 987for.body:988  %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]989  %i_with_off = add nuw i32 %i.04, 5990  %rem = urem i32 %i_with_off, %rem_amt991  tail call void @use.i32(i32 %rem)992  %inc = add nuw i32 %i.04, 1993  %exitcond.not = icmp eq i32 %inc, %N994  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body995}996 997define void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt, i32 %start) nounwind {998; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub(999; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {1000; CHECK-NEXT:  [[ENTRY:.*:]]1001; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]1002; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]1003; CHECK:       [[FOR_BODY_PREHEADER]]:1004; CHECK-NEXT:    br label %[[FOR_BODY:.*]]1005; CHECK:       [[FOR_COND_CLEANUP]]:1006; CHECK-NEXT:    ret void1007; CHECK:       [[FOR_BODY]]:1008; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]1009; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], [[START]]1010; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]1011; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])1012; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 11013; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]1014; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]1015;1016entry:1017  %cmp3.not = icmp ule i32 %N, %start1018  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1019 1020for.cond.cleanup:1021  ret void1022 1023for.body:1024  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]1025  %i_with_off = sub nuw i32 %i.04, %start1026  %rem = urem i32 %i_with_off, %rem_amt1027  tail call void @use.i32(i32 %rem)1028  %inc = add nuw i32 %i.04, 11029  %exitcond.not = icmp eq i32 %inc, %N1030  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1031}1032 1033define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i32 %rem_amt, i32 %start) nounwind {1034; CHECK-LABEL: define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(1035; CHECK-SAME: i32 [[N:%.*]], i32 [[REM_AMT:%.*]], i32 [[START:%.*]]) #[[ATTR0]] {1036; CHECK-NEXT:  [[ENTRY:.*:]]1037; CHECK-NEXT:    [[CMP3_NOT:%.*]] = icmp ule i32 [[N]], [[START]]1038; CHECK-NEXT:    br i1 [[CMP3_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]1039; CHECK:       [[FOR_BODY_PREHEADER]]:1040; CHECK-NEXT:    br label %[[FOR_BODY:.*]]1041; CHECK:       [[FOR_COND_CLEANUP]]:1042; CHECK-NEXT:    ret void1043; CHECK:       [[FOR_BODY]]:1044; CHECK-NEXT:    [[I_04:%.*]] = phi i32 [ [[INC:%.*]], %[[FOR_BODY]] ], [ [[START]], %[[FOR_BODY_PREHEADER]] ]1045; CHECK-NEXT:    [[I_WITH_OFF:%.*]] = sub nuw i32 [[I_04]], 21046; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_WITH_OFF]], [[REM_AMT]]1047; CHECK-NEXT:    tail call void @use.i32(i32 [[REM]])1048; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_04]], 11049; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]]1050; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_COND_CLEANUP]], label %[[FOR_BODY]]1051;1052entry:1053  %cmp3.not = icmp ule i32 %N, %start1054  br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1055 1056for.cond.cleanup:1057  ret void1058 1059for.body:1060  %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]1061  %i_with_off = sub nuw i32 %i.04, 21062  %rem = urem i32 %i_with_off, %rem_amt1063  tail call void @use.i32(i32 %rem)1064  %inc = add nuw i32 %i.04, 11065  %exitcond.not = icmp eq i32 %inc, %N1066  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1067}1068 1069define i64 @pr150611_add_offset_is_not_loop_invariant(i1 %cond) {1070; CHECK-LABEL: define i64 @pr150611_add_offset_is_not_loop_invariant(1071; CHECK-SAME: i1 [[COND:%.*]]) {1072; CHECK-NEXT:  [[ENTRY:.*]]:1073; CHECK-NEXT:    [[REMAMT:%.*]] = select i1 [[COND]], i64 2, i64 01074; CHECK-NEXT:    br label %[[FOR_BODY:.*]]1075; CHECK:       [[FOR_BODY]]:1076; CHECK-NEXT:    [[INDVARS:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INDVARS_NEXT:%.*]], %[[FOR_BODY]] ]1077; CHECK-NEXT:    [[ADD_OFFSET:%.*]] = zext i1 [[COND]] to i641078; CHECK-NEXT:    [[ADD:%.*]] = add nuw i64 [[INDVARS]], [[ADD_OFFSET]]1079; CHECK-NEXT:    [[REM:%.*]] = urem i64 [[ADD]], [[REMAMT]]1080; CHECK-NEXT:    [[INDVARS_NEXT]] = add nuw i64 [[INDVARS]], 11081; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_NEXT]], 31082; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[FOR_EXIT:.*]], label %[[FOR_BODY]]1083; CHECK:       [[FOR_EXIT]]:1084; CHECK-NEXT:    ret i64 [[REM]]1085;1086entry:1087  %remamt = select i1 %cond, i64 2, i64 01088  br label %for.body1089 1090for.body:1091  %indvars = phi i64 [ 0, %entry ], [ %indvars.next, %for.body ]1092  %add.offset = zext i1 %cond to i641093  %add = add nuw i64 %indvars, %add.offset1094  %rem = urem i64 %add, %remamt1095  %indvars.next = add nuw i64 %indvars, 11096  %exitcond = icmp eq i64 %indvars.next, 31097  br i1 %exitcond, label %for.exit, label %for.body1098 1099for.exit:1100  ret i64 %rem1101}1102