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