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