1446 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | 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: simple_urem_to_sel:13; CHECK: # %bb.0: # %entry14; CHECK-NEXT: testl %edi, %edi15; CHECK-NEXT: je .LBB0_416; CHECK-NEXT: # %bb.1: # %for.body.preheader17; CHECK-NEXT: pushq %rbp18; CHECK-NEXT: pushq %r1519; CHECK-NEXT: pushq %r1420; CHECK-NEXT: pushq %r1221; CHECK-NEXT: pushq %rbx22; CHECK-NEXT: movl %esi, %ebx23; CHECK-NEXT: movl %edi, %ebp24; CHECK-NEXT: xorl %r15d, %r15d25; CHECK-NEXT: xorl %r14d, %r14d26; CHECK-NEXT: xorl %r12d, %r12d27; CHECK-NEXT: .p2align 428; CHECK-NEXT: .LBB0_2: # %for.body29; CHECK-NEXT: # =>This Inner Loop Header: Depth=130; CHECK-NEXT: movl %r14d, %edi31; CHECK-NEXT: callq use.i32@PLT32; CHECK-NEXT: incl %r14d33; CHECK-NEXT: cmpl %ebx, %r14d34; CHECK-NEXT: cmovel %r15d, %r14d35; CHECK-NEXT: incl %r12d36; CHECK-NEXT: cmpl %r12d, %ebp37; CHECK-NEXT: jne .LBB0_238; CHECK-NEXT: # %bb.3:39; CHECK-NEXT: popq %rbx40; CHECK-NEXT: popq %r1241; CHECK-NEXT: popq %r1442; CHECK-NEXT: popq %r1543; CHECK-NEXT: popq %rbp44; CHECK-NEXT: .LBB0_4: # %for.cond.cleanup45; CHECK-NEXT: retq46entry:47 %cmp3.not = icmp eq i32 %N, 048 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body49 50for.cond.cleanup:51 ret void52 53for.body:54 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]55 %rem = urem i32 %i.04, %rem_amt56 tail call void @use.i32(i32 %rem)57 %inc = add nuw i32 %i.04, 158 %exitcond.not = icmp eq i32 %inc, %N59 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body60}61 62define void @simple_urem_to_sel_fail_not_in_loop(i32 %N, i32 %rem_amt) nounwind {63; CHECK-LABEL: simple_urem_to_sel_fail_not_in_loop:64; CHECK: # %bb.0: # %entry65; CHECK-NEXT: pushq %rbp66; CHECK-NEXT: pushq %r1467; CHECK-NEXT: pushq %rbx68; CHECK-NEXT: movl %esi, %ebx69; CHECK-NEXT: testl %edi, %edi70; CHECK-NEXT: je .LBB1_171; CHECK-NEXT: # %bb.3: # %for.body.preheader72; CHECK-NEXT: movl %edi, %r14d73; CHECK-NEXT: xorl %ebp, %ebp74; CHECK-NEXT: .p2align 475; CHECK-NEXT: .LBB1_4: # %for.body76; CHECK-NEXT: # =>This Inner Loop Header: Depth=177; CHECK-NEXT: movl %ebp, %edi78; CHECK-NEXT: callq use.i32@PLT79; CHECK-NEXT: incl %ebp80; CHECK-NEXT: cmpl %ebp, %r14d81; CHECK-NEXT: jne .LBB1_482; CHECK-NEXT: jmp .LBB1_283; CHECK-NEXT: .LBB1_1:84; CHECK-NEXT: xorl %ebp, %ebp85; CHECK-NEXT: .LBB1_2: # %for.cond.cleanup86; CHECK-NEXT: movl %ebp, %eax87; CHECK-NEXT: xorl %edx, %edx88; CHECK-NEXT: divl %ebx89; CHECK-NEXT: movl %edx, %edi90; CHECK-NEXT: popq %rbx91; CHECK-NEXT: popq %r1492; CHECK-NEXT: popq %rbp93; CHECK-NEXT: jmp use.i32@PLT # TAILCALL94entry:95 %cmp3.not = icmp eq i32 %N, 096 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body97 98for.cond.cleanup:99 %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]100 %rem = urem i32 %i.05, %rem_amt101 tail call void @use.i32(i32 %rem)102 ret void103 104for.body:105 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]106 tail call void @use.i32(i32 %i.04)107 %inc = add nuw i32 %i.04, 1108 %exitcond.not = icmp eq i32 %inc, %N109 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body110}111 112define void @simple_urem_to_sel_inner_loop(i32 %N, i32 %M) nounwind {113; CHECK-LABEL: simple_urem_to_sel_inner_loop:114; CHECK: # %bb.0: # %entry115; CHECK-NEXT: pushq %rbp116; CHECK-NEXT: pushq %r15117; CHECK-NEXT: pushq %r14118; CHECK-NEXT: pushq %r13119; CHECK-NEXT: pushq %r12120; CHECK-NEXT: pushq %rbx121; CHECK-NEXT: pushq %rax122; CHECK-NEXT: movl %esi, %r12d123; CHECK-NEXT: movl %edi, %ebp124; CHECK-NEXT: callq get.i32@PLT125; CHECK-NEXT: testl %ebp, %ebp126; CHECK-NEXT: je .LBB2_6127; CHECK-NEXT: # %bb.1: # %for.body.preheader128; CHECK-NEXT: movl %eax, %r14d129; CHECK-NEXT: xorl %r15d, %r15d130; CHECK-NEXT: xorl %r13d, %r13d131; CHECK-NEXT: jmp .LBB2_2132; CHECK-NEXT: .p2align 4133; CHECK-NEXT: .LBB2_5: # %for.inner.cond.cleanup134; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1135; CHECK-NEXT: incl %r15d136; CHECK-NEXT: cmpl %r14d, %r15d137; CHECK-NEXT: movl $0, %eax138; CHECK-NEXT: cmovel %eax, %r15d139; CHECK-NEXT: incl %r13d140; CHECK-NEXT: cmpl %ebp, %r13d141; CHECK-NEXT: je .LBB2_6142; CHECK-NEXT: .LBB2_2: # %for.body143; CHECK-NEXT: # =>This Loop Header: Depth=1144; CHECK-NEXT: # Child Loop BB2_4 Depth 2145; CHECK-NEXT: testl %r12d, %r12d146; CHECK-NEXT: je .LBB2_5147; CHECK-NEXT: # %bb.3: # %for.inner.body.preheader148; CHECK-NEXT: # in Loop: Header=BB2_2 Depth=1149; CHECK-NEXT: movl %r12d, %ebx150; CHECK-NEXT: .p2align 4151; CHECK-NEXT: .LBB2_4: # %for.inner.body152; CHECK-NEXT: # Parent Loop BB2_2 Depth=1153; CHECK-NEXT: # => This Inner Loop Header: Depth=2154; CHECK-NEXT: movl %r15d, %edi155; CHECK-NEXT: callq use.i32@PLT156; CHECK-NEXT: decl %ebx157; CHECK-NEXT: jne .LBB2_4158; CHECK-NEXT: jmp .LBB2_5159; CHECK-NEXT: .LBB2_6: # %for.cond.cleanup160; CHECK-NEXT: addq $8, %rsp161; CHECK-NEXT: popq %rbx162; CHECK-NEXT: popq %r12163; CHECK-NEXT: popq %r13164; CHECK-NEXT: popq %r14165; CHECK-NEXT: popq %r15166; CHECK-NEXT: popq %rbp167; CHECK-NEXT: retq168entry:169 %rem_amt = call i32 @get.i32()170 %cmp3.not = icmp eq i32 %N, 0171 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body172 173for.cond.cleanup:174 ret void175 176for.body:177 %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]178 179 %cmp_inner = icmp eq i32 %M, 0180 br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body181 182for.inner.body:183 %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]184 %rem = urem i32 %i.04, %rem_amt185 tail call void @use.i32(i32 %rem)186 %inc_inner = add nuw i32 %j, 1187 %exitcond_inner = icmp eq i32 %inc_inner, %M188 br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body189 190for.inner.cond.cleanup:191 %inc = add nuw i32 %i.04, 1192 %exitcond.not = icmp eq i32 %inc, %N193 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body194}195 196define void @simple_urem_to_sel_inner_loop_fail_not_invariant(i32 %N, i32 %M) nounwind {197; CHECK-LABEL: simple_urem_to_sel_inner_loop_fail_not_invariant:198; CHECK: # %bb.0: # %entry199; CHECK-NEXT: testl %edi, %edi200; CHECK-NEXT: je .LBB3_7201; CHECK-NEXT: # %bb.1: # %for.body.preheader202; CHECK-NEXT: pushq %rbp203; CHECK-NEXT: pushq %r15204; CHECK-NEXT: pushq %r14205; CHECK-NEXT: pushq %r12206; CHECK-NEXT: pushq %rbx207; CHECK-NEXT: movl %esi, %ebx208; CHECK-NEXT: movl %edi, %ebp209; CHECK-NEXT: xorl %r14d, %r14d210; CHECK-NEXT: jmp .LBB3_2211; CHECK-NEXT: .p2align 4212; CHECK-NEXT: .LBB3_5: # %for.inner.cond.cleanup213; CHECK-NEXT: # in Loop: Header=BB3_2 Depth=1214; CHECK-NEXT: incl %r14d215; CHECK-NEXT: cmpl %ebp, %r14d216; CHECK-NEXT: je .LBB3_6217; CHECK-NEXT: .LBB3_2: # %for.body218; CHECK-NEXT: # =>This Loop Header: Depth=1219; CHECK-NEXT: # Child Loop BB3_4 Depth 2220; CHECK-NEXT: callq get.i32@PLT221; CHECK-NEXT: testl %ebx, %ebx222; CHECK-NEXT: je .LBB3_5223; CHECK-NEXT: # %bb.3: # %for.inner.body.preheader224; CHECK-NEXT: # in Loop: Header=BB3_2 Depth=1225; CHECK-NEXT: movl %eax, %r15d226; CHECK-NEXT: movl %ebx, %r12d227; CHECK-NEXT: .p2align 4228; CHECK-NEXT: .LBB3_4: # %for.inner.body229; CHECK-NEXT: # Parent Loop BB3_2 Depth=1230; CHECK-NEXT: # => This Inner Loop Header: Depth=2231; CHECK-NEXT: movl %r14d, %eax232; CHECK-NEXT: xorl %edx, %edx233; CHECK-NEXT: divl %r15d234; CHECK-NEXT: movl %edx, %edi235; CHECK-NEXT: callq use.i32@PLT236; CHECK-NEXT: decl %r12d237; CHECK-NEXT: jne .LBB3_4238; CHECK-NEXT: jmp .LBB3_5239; CHECK-NEXT: .LBB3_6:240; CHECK-NEXT: popq %rbx241; CHECK-NEXT: popq %r12242; CHECK-NEXT: popq %r14243; CHECK-NEXT: popq %r15244; CHECK-NEXT: popq %rbp245; CHECK-NEXT: .LBB3_7: # %for.cond.cleanup246; CHECK-NEXT: retq247entry:248 %cmp3.not = icmp eq i32 %N, 0249 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body250 251for.cond.cleanup:252 ret void253 254for.body:255 %i.04 = phi i32 [ %inc, %for.inner.cond.cleanup ], [ 0, %entry ]256 %rem_amt = call i32 @get.i32()257 %cmp_inner = icmp eq i32 %M, 0258 br i1 %cmp_inner, label %for.inner.cond.cleanup, label %for.inner.body259 260for.inner.body:261 %j = phi i32 [ %inc_inner, %for.inner.body ], [ 0, %for.body ]262 %rem = urem i32 %i.04, %rem_amt263 tail call void @use.i32(i32 %rem)264 %inc_inner = add nuw i32 %j, 1265 %exitcond_inner = icmp eq i32 %inc_inner, %M266 br i1 %exitcond_inner, label %for.inner.cond.cleanup, label %for.inner.body267 268for.inner.cond.cleanup:269 %inc = add nuw i32 %i.04, 1270 %exitcond.not = icmp eq i32 %inc, %N271 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body272}273 274define void @simple_urem_to_sel_nested2(i32 %N, i32 %rem_amt) nounwind {275; CHECK-LABEL: simple_urem_to_sel_nested2:276; CHECK: # %bb.0: # %entry277; CHECK-NEXT: testl %edi, %edi278; CHECK-NEXT: je .LBB4_8279; CHECK-NEXT: # %bb.1: # %for.body.preheader280; CHECK-NEXT: pushq %rbp281; CHECK-NEXT: pushq %r15282; CHECK-NEXT: pushq %r14283; CHECK-NEXT: pushq %r12284; CHECK-NEXT: pushq %rbx285; CHECK-NEXT: movl %esi, %ebx286; CHECK-NEXT: movl %edi, %ebp287; CHECK-NEXT: xorl %r15d, %r15d288; CHECK-NEXT: xorl %r14d, %r14d289; CHECK-NEXT: xorl %r12d, %r12d290; CHECK-NEXT: jmp .LBB4_2291; CHECK-NEXT: .p2align 4292; CHECK-NEXT: .LBB4_5: # %for.body1293; CHECK-NEXT: # in Loop: Header=BB4_2 Depth=1294; CHECK-NEXT: movl %r14d, %edi295; CHECK-NEXT: callq use.i32@PLT296; CHECK-NEXT: .LBB4_6: # %for.body.tail297; CHECK-NEXT: # in Loop: Header=BB4_2 Depth=1298; CHECK-NEXT: incl %r14d299; CHECK-NEXT: cmpl %ebx, %r14d300; CHECK-NEXT: cmovel %r15d, %r14d301; CHECK-NEXT: incl %r12d302; CHECK-NEXT: cmpl %r12d, %ebp303; CHECK-NEXT: je .LBB4_7304; CHECK-NEXT: .LBB4_2: # %for.body305; CHECK-NEXT: # =>This Inner Loop Header: Depth=1306; CHECK-NEXT: callq get.i1@PLT307; CHECK-NEXT: testb $1, %al308; CHECK-NEXT: je .LBB4_6309; CHECK-NEXT: # %bb.3: # %for.body0310; CHECK-NEXT: # in Loop: Header=BB4_2 Depth=1311; CHECK-NEXT: callq get.i1@PLT312; CHECK-NEXT: testb $1, %al313; CHECK-NEXT: jne .LBB4_5314; CHECK-NEXT: # %bb.4: # %for.body2315; CHECK-NEXT: # in Loop: Header=BB4_2 Depth=1316; CHECK-NEXT: callq get.i1@PLT317; CHECK-NEXT: testb $1, %al318; CHECK-NEXT: jne .LBB4_5319; CHECK-NEXT: jmp .LBB4_6320; CHECK-NEXT: .LBB4_7:321; CHECK-NEXT: popq %rbx322; CHECK-NEXT: popq %r12323; CHECK-NEXT: popq %r14324; CHECK-NEXT: popq %r15325; CHECK-NEXT: popq %rbp326; CHECK-NEXT: .LBB4_8: # %for.cond.cleanup327; CHECK-NEXT: retq328entry:329 %cmp3.not = icmp eq i32 %N, 0330 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body331 332for.cond.cleanup:333 ret void334 335for.body:336 %i.04 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]337 %cond0 = call i1 @get.i1()338 br i1 %cond0, label %for.body0, label %for.body.tail339for.body0:340 %cond1 = call i1 @get.i1()341 br i1 %cond1, label %for.body1, label %for.body2342for.body2:343 %cond2 = call i1 @get.i1()344 br i1 %cond2, label %for.body1, label %for.body.tail345for.body1:346 %rem = urem i32 %i.04, %rem_amt347 tail call void @use.i32(i32 %rem)348 br label %for.body.tail349for.body.tail:350 %inc = add nuw i32 %i.04, 1351 %exitcond.not = icmp eq i32 %inc, %N352 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body353}354 355define void @simple_urem_fail_bad_incr3(i32 %N, i32 %rem_amt) nounwind {356; CHECK-LABEL: simple_urem_fail_bad_incr3:357; CHECK: # %bb.0: # %entry358; CHECK-NEXT: testl %edi, %edi359; CHECK-NEXT: je .LBB5_9360; CHECK-NEXT: # %bb.1:361; CHECK-NEXT: pushq %rbp362; CHECK-NEXT: pushq %r14363; CHECK-NEXT: pushq %rbx364; CHECK-NEXT: movl %esi, %ebx365; CHECK-NEXT: jmp .LBB5_2366; CHECK-NEXT: .p2align 4367; CHECK-NEXT: .LBB5_6: # %for.body1368; CHECK-NEXT: # in Loop: Header=BB5_2 Depth=1369; CHECK-NEXT: movl %ebp, %eax370; CHECK-NEXT: xorl %edx, %edx371; CHECK-NEXT: divl %ebx372; CHECK-NEXT: movl %edx, %edi373; CHECK-NEXT: callq use.i32@PLT374; CHECK-NEXT: .LBB5_7: # %for.body.tail375; CHECK-NEXT: # in Loop: Header=BB5_2 Depth=1376; CHECK-NEXT: callq get.i1@PLT377; CHECK-NEXT: testb $1, %al378; CHECK-NEXT: jne .LBB5_8379; CHECK-NEXT: .LBB5_2: # %for.body380; CHECK-NEXT: # =>This Inner Loop Header: Depth=1381; CHECK-NEXT: callq get.i1@PLT382; CHECK-NEXT: testb $1, %al383; CHECK-NEXT: je .LBB5_5384; CHECK-NEXT: # %bb.3: # %for.body0385; CHECK-NEXT: # in Loop: Header=BB5_2 Depth=1386; CHECK-NEXT: callq get.i1@PLT387; CHECK-NEXT: movl %eax, %r14d388; CHECK-NEXT: callq get.i32@PLT389; CHECK-NEXT: testb $1, %r14b390; CHECK-NEXT: je .LBB5_7391; CHECK-NEXT: # %bb.4: # in Loop: Header=BB5_2 Depth=1392; CHECK-NEXT: movl %eax, %ebp393; CHECK-NEXT: incl %ebp394; CHECK-NEXT: jmp .LBB5_6395; CHECK-NEXT: .p2align 4396; CHECK-NEXT: .LBB5_5: # %for.body2397; CHECK-NEXT: # in Loop: Header=BB5_2 Depth=1398; CHECK-NEXT: xorl %ebp, %ebp399; CHECK-NEXT: callq get.i1@PLT400; CHECK-NEXT: testb $1, %al401; CHECK-NEXT: jne .LBB5_6402; CHECK-NEXT: jmp .LBB5_7403; CHECK-NEXT: .LBB5_8:404; CHECK-NEXT: popq %rbx405; CHECK-NEXT: popq %r14406; CHECK-NEXT: popq %rbp407; CHECK-NEXT: .LBB5_9: # %for.cond.cleanup408; CHECK-NEXT: retq409entry:410 %cmp3.not = icmp eq i32 %N, 0411 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body412 413for.cond.cleanup:414 ret void415 416for.body:417 %cond0 = call i1 @get.i1()418 br i1 %cond0, label %for.body0, label %for.body2419for.body0:420 %cond1 = call i1 @get.i1()421 %val = call i32 @get.i32()422 %inc = add nuw i32 %val, 1423 br i1 %cond1, label %for.body1, label %for.body.tail424for.body2:425 %cond2 = call i1 @get.i1()426 br i1 %cond2, label %for.body1, label %for.body.tail427for.body1:428 %i.04 = phi i32 [ %inc, %for.body0], [ 0, %for.body2 ]429 %rem = urem i32 %i.04, %rem_amt430 tail call void @use.i32(i32 %rem)431 br label %for.body.tail432for.body.tail:433 %exitcond.not = call i1 @get.i1()434 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body435}436 437define void @simple_urem_to_sel_vec(<2 x i64> %rem_amt) nounwind {438; CHECK-LABEL: simple_urem_to_sel_vec:439; CHECK: # %bb.0: # %entry440; CHECK-NEXT: subq $56, %rsp441; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill442; CHECK-NEXT: pxor %xmm1, %xmm1443; CHECK-NEXT: pxor %xmm0, %xmm0444; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill445; CHECK-NEXT: .p2align 4446; CHECK-NEXT: .LBB6_1: # %for.body447; CHECK-NEXT: # =>This Inner Loop Header: Depth=1448; CHECK-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill449; CHECK-NEXT: movdqa %xmm1, %xmm0450; CHECK-NEXT: callq use.2xi64@PLT451; CHECK-NEXT: pcmpeqd %xmm1, %xmm1452; CHECK-NEXT: movdqa (%rsp), %xmm2 # 16-byte Reload453; CHECK-NEXT: psubq %xmm1, %xmm2454; CHECK-NEXT: movdqa %xmm2, %xmm0455; CHECK-NEXT: movdqa %xmm2, %xmm3456; CHECK-NEXT: pcmpeqd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload457; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,0,3,2]458; CHECK-NEXT: pand %xmm0, %xmm2459; CHECK-NEXT: pandn %xmm3, %xmm2460; CHECK-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill461; CHECK-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload462; CHECK-NEXT: psubq %xmm1, %xmm0463; CHECK-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill464; CHECK-NEXT: callq get.i1@PLT465; CHECK-NEXT: testb $1, %al466; CHECK-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload467; CHECK-NEXT: je .LBB6_1468; CHECK-NEXT: # %bb.2: # %for.cond.cleanup469; CHECK-NEXT: addq $56, %rsp470; CHECK-NEXT: retq471entry:472 br label %for.body473 474for.cond.cleanup:475 ret void476 477for.body:478 %i.04 = phi <2 x i64> [ %inc, %for.body ], [ zeroinitializer, %entry ]479 %rem = urem <2 x i64> %i.04, %rem_amt480 tail call void @use.2xi64(<2 x i64> %rem)481 %inc = add nuw <2 x i64> %i.04, <i64 1, i64 1>482 %exitcond.not = call i1 @get.i1()483 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body484}485 486define void @simple_urem_fail_bad_incr(i32 %N, i32 %rem_amt) nounwind {487; CHECK-LABEL: simple_urem_fail_bad_incr:488; CHECK: # %bb.0: # %entry489; CHECK-NEXT: testl %edi, %edi490; CHECK-NEXT: je .LBB7_6491; CHECK-NEXT: # %bb.1: # %for.body.preheader492; CHECK-NEXT: pushq %rbp493; CHECK-NEXT: pushq %r14494; CHECK-NEXT: pushq %rbx495; CHECK-NEXT: movl %esi, %ebx496; CHECK-NEXT: movl %edi, %ebp497; CHECK-NEXT: xorl %r14d, %r14d498; CHECK-NEXT: jmp .LBB7_2499; CHECK-NEXT: .p2align 4500; CHECK-NEXT: .LBB7_4: # %for.body.tail501; CHECK-NEXT: # in Loop: Header=BB7_2 Depth=1502; CHECK-NEXT: movl %r14d, %eax503; CHECK-NEXT: xorl %edx, %edx504; CHECK-NEXT: divl %ebx505; CHECK-NEXT: movl %edx, %edi506; CHECK-NEXT: callq use.i32@PLT507; CHECK-NEXT: incl %r14d508; CHECK-NEXT: cmpl %ebp, %r14d509; CHECK-NEXT: je .LBB7_5510; CHECK-NEXT: .LBB7_2: # %for.body511; CHECK-NEXT: # =>This Inner Loop Header: Depth=1512; CHECK-NEXT: callq get.i1@PLT513; CHECK-NEXT: testb $1, %al514; CHECK-NEXT: je .LBB7_4515; CHECK-NEXT: # %bb.3: # %for.body0516; CHECK-NEXT: # in Loop: Header=BB7_2 Depth=1517; CHECK-NEXT: callq get.i32@PLT518; CHECK-NEXT: movl %eax, %r14d519; CHECK-NEXT: jmp .LBB7_4520; CHECK-NEXT: .LBB7_5:521; CHECK-NEXT: popq %rbx522; CHECK-NEXT: popq %r14523; CHECK-NEXT: popq %rbp524; CHECK-NEXT: .LBB7_6: # %for.cond.cleanup525; CHECK-NEXT: retq526entry:527 %cmp3.not = icmp eq i32 %N, 0528 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body529 530for.cond.cleanup:531 ret void532 533for.body:534 %i.03 = phi i32 [ %inc, %for.body.tail ], [ 0, %entry ]535 %cond0 = call i1 @get.i1()536 br i1 %cond0, label %for.body0, label %for.body.tail537for.body0:538 %some_val = call i32 @get.i32()539 br label %for.body.tail540 541for.body.tail:542 %i.04 = phi i32 [ %i.03, %for.body ], [ %some_val, %for.body0 ]543 %rem = urem i32 %i.04, %rem_amt544 tail call void @use.i32(i32 %rem)545 %inc = add nuw i32 %i.04, 1546 %exitcond.not = icmp eq i32 %inc, %N547 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body548}549 550define void @simple_urem_to_sel_second_acc(i32 %N, i32 %rem_amt) nounwind {551; CHECK-LABEL: simple_urem_to_sel_second_acc:552; CHECK: # %bb.0: # %entry553; CHECK-NEXT: cmpl $2, %edi554; CHECK-NEXT: jb .LBB8_4555; CHECK-NEXT: # %bb.1: # %for.body.preheader556; CHECK-NEXT: pushq %rbp557; CHECK-NEXT: pushq %r15558; CHECK-NEXT: pushq %r14559; CHECK-NEXT: pushq %r13560; CHECK-NEXT: pushq %r12561; CHECK-NEXT: pushq %rbx562; CHECK-NEXT: pushq %rax563; CHECK-NEXT: movl %esi, %ebx564; CHECK-NEXT: movl %edi, %ebp565; CHECK-NEXT: movl $1, %r15d566; CHECK-NEXT: xorl %r12d, %r12d567; CHECK-NEXT: xorl %r14d, %r14d568; CHECK-NEXT: xorl %r13d, %r13d569; CHECK-NEXT: .p2align 4570; CHECK-NEXT: .LBB8_2: # %for.body571; CHECK-NEXT: # =>This Inner Loop Header: Depth=1572; CHECK-NEXT: movl %r14d, %edi573; CHECK-NEXT: callq use.i32@PLT574; CHECK-NEXT: incl %r14d575; CHECK-NEXT: cmpl %ebx, %r14d576; CHECK-NEXT: cmovel %r12d, %r14d577; CHECK-NEXT: incl %r13d578; CHECK-NEXT: addl $2, %r15d579; CHECK-NEXT: cmpl %ebp, %r15d580; CHECK-NEXT: jbe .LBB8_2581; CHECK-NEXT: # %bb.3:582; CHECK-NEXT: addq $8, %rsp583; CHECK-NEXT: popq %rbx584; CHECK-NEXT: popq %r12585; CHECK-NEXT: popq %r13586; CHECK-NEXT: popq %r14587; CHECK-NEXT: popq %r15588; CHECK-NEXT: popq %rbp589; CHECK-NEXT: .LBB8_4: # %for.cond.cleanup590; CHECK-NEXT: retq591entry:592 %cmp3.not = icmp ult i32 %N, 2593 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body594 595for.cond.cleanup:596 ret void597 598for.body:599 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]600 %i.05 = phi i32 [ %inc2, %for.body ], [ 1, %entry ]601 %rem = urem i32 %i.04, %rem_amt602 tail call void @use.i32(i32 %rem)603 %inc = add nuw i32 %i.04, 1604 %inc2 = add nuw i32 %i.05, 2605 %exitcond.not = icmp ugt i32 %inc2, %N606 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body607}608 609define void @simple_urem_fail_srem(i32 %N, i32 %rem_amt) nounwind {610; CHECK-LABEL: simple_urem_fail_srem:611; CHECK: # %bb.0: # %entry612; CHECK-NEXT: testl %edi, %edi613; CHECK-NEXT: je .LBB9_4614; CHECK-NEXT: # %bb.1: # %for.body.preheader615; CHECK-NEXT: pushq %rbp616; CHECK-NEXT: pushq %r14617; CHECK-NEXT: pushq %rbx618; CHECK-NEXT: movl %esi, %ebx619; CHECK-NEXT: movl %edi, %ebp620; CHECK-NEXT: xorl %r14d, %r14d621; CHECK-NEXT: .p2align 4622; CHECK-NEXT: .LBB9_2: # %for.body623; CHECK-NEXT: # =>This Inner Loop Header: Depth=1624; CHECK-NEXT: movl %r14d, %eax625; CHECK-NEXT: cltd626; CHECK-NEXT: idivl %ebx627; CHECK-NEXT: movl %edx, %edi628; CHECK-NEXT: callq use.i32@PLT629; CHECK-NEXT: incl %r14d630; CHECK-NEXT: cmpl %r14d, %ebp631; CHECK-NEXT: jne .LBB9_2632; CHECK-NEXT: # %bb.3:633; CHECK-NEXT: popq %rbx634; CHECK-NEXT: popq %r14635; CHECK-NEXT: popq %rbp636; CHECK-NEXT: .LBB9_4: # %for.cond.cleanup637; CHECK-NEXT: retq638entry:639 %cmp3.not = icmp eq i32 %N, 0640 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body641 642for.cond.cleanup:643 ret void644 645for.body:646 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]647 %rem = srem i32 %i.04, %rem_amt648 tail call void @use.i32(i32 %rem)649 %inc = add nuw i32 %i.04, 1650 %exitcond.not = icmp eq i32 %inc, %N651 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body652}653 654define void @simple_urem_fail_missing_nuw(i32 %N, i32 %rem_amt) nounwind {655; CHECK-LABEL: simple_urem_fail_missing_nuw:656; CHECK: # %bb.0: # %entry657; CHECK-NEXT: testl %edi, %edi658; CHECK-NEXT: je .LBB10_4659; CHECK-NEXT: # %bb.1: # %for.body.preheader660; CHECK-NEXT: pushq %rbp661; CHECK-NEXT: pushq %r14662; CHECK-NEXT: pushq %rbx663; CHECK-NEXT: movl %esi, %ebx664; CHECK-NEXT: movl %edi, %ebp665; CHECK-NEXT: xorl %r14d, %r14d666; CHECK-NEXT: .p2align 4667; CHECK-NEXT: .LBB10_2: # %for.body668; CHECK-NEXT: # =>This Inner Loop Header: Depth=1669; CHECK-NEXT: movl %r14d, %eax670; CHECK-NEXT: xorl %edx, %edx671; CHECK-NEXT: divl %ebx672; CHECK-NEXT: movl %edx, %edi673; CHECK-NEXT: callq use.i32@PLT674; CHECK-NEXT: incl %r14d675; CHECK-NEXT: cmpl %r14d, %ebp676; CHECK-NEXT: jne .LBB10_2677; CHECK-NEXT: # %bb.3:678; CHECK-NEXT: popq %rbx679; CHECK-NEXT: popq %r14680; CHECK-NEXT: popq %rbp681; CHECK-NEXT: .LBB10_4: # %for.cond.cleanup682; CHECK-NEXT: retq683entry:684 %cmp3.not = icmp eq i32 %N, 0685 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body686 687for.cond.cleanup:688 ret void689 690for.body:691 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]692 %rem = urem i32 %i.04, %rem_amt693 tail call void @use.i32(i32 %rem)694 %inc = add nsw i32 %i.04, 1695 %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_incr2(i32 %N, i32 %rem_amt) nounwind {700; CHECK-LABEL: simple_urem_fail_bad_incr2:701; CHECK: # %bb.0: # %entry702; CHECK-NEXT: testl %edi, %edi703; CHECK-NEXT: je .LBB11_4704; CHECK-NEXT: # %bb.1: # %for.body.preheader705; CHECK-NEXT: pushq %rbp706; CHECK-NEXT: pushq %r14707; CHECK-NEXT: pushq %rbx708; CHECK-NEXT: movl %esi, %ebx709; CHECK-NEXT: movl %edi, %ebp710; CHECK-NEXT: xorl %r14d, %r14d711; CHECK-NEXT: .p2align 4712; CHECK-NEXT: .LBB11_2: # %for.body713; CHECK-NEXT: # =>This Inner Loop Header: Depth=1714; CHECK-NEXT: movl %r14d, %eax715; CHECK-NEXT: xorl %edx, %edx716; CHECK-NEXT: divl %ebx717; CHECK-NEXT: movl %edx, %edi718; CHECK-NEXT: callq use.i32@PLT719; CHECK-NEXT: addl $2, %r14d720; CHECK-NEXT: cmpl %r14d, %ebp721; CHECK-NEXT: jne .LBB11_2722; CHECK-NEXT: # %bb.3:723; CHECK-NEXT: popq %rbx724; CHECK-NEXT: popq %r14725; CHECK-NEXT: popq %rbp726; CHECK-NEXT: .LBB11_4: # %for.cond.cleanup727; CHECK-NEXT: retq728entry:729 %cmp3.not = icmp eq i32 %N, 0730 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body731 732for.cond.cleanup:733 ret void734 735for.body:736 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]737 %rem = urem i32 %i.04, %rem_amt738 tail call void @use.i32(i32 %rem)739 %inc = add nuw i32 %i.04, 2740 %exitcond.not = icmp eq i32 %inc, %N741 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body742}743 744define void @simple_urem_non_zero_entry4(i32 %N, i32 %rem_amt) nounwind {745; CHECK-LABEL: simple_urem_non_zero_entry4:746; CHECK: # %bb.0: # %entry747; CHECK-NEXT: testl %edi, %edi748; CHECK-NEXT: je .LBB12_4749; CHECK-NEXT: # %bb.1: # %for.body.preheader750; CHECK-NEXT: pushq %rbp751; CHECK-NEXT: pushq %r14752; CHECK-NEXT: pushq %rbx753; CHECK-NEXT: movl %esi, %ebx754; CHECK-NEXT: movl %edi, %ebp755; CHECK-NEXT: movl $4, %r14d756; CHECK-NEXT: .p2align 4757; CHECK-NEXT: .LBB12_2: # %for.body758; CHECK-NEXT: # =>This Inner Loop Header: Depth=1759; CHECK-NEXT: movl %r14d, %eax760; CHECK-NEXT: xorl %edx, %edx761; CHECK-NEXT: divl %ebx762; CHECK-NEXT: movl %edx, %edi763; CHECK-NEXT: callq use.i32@PLT764; CHECK-NEXT: incl %r14d765; CHECK-NEXT: cmpl %r14d, %ebp766; CHECK-NEXT: jne .LBB12_2767; CHECK-NEXT: # %bb.3:768; CHECK-NEXT: popq %rbx769; CHECK-NEXT: popq %r14770; CHECK-NEXT: popq %rbp771; CHECK-NEXT: .LBB12_4: # %for.cond.cleanup772; CHECK-NEXT: retq773entry:774 %cmp3.not = icmp eq i32 %N, 0775 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body776 777for.cond.cleanup:778 ret void779 780for.body:781 %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]782 %rem = urem i32 %i.04, %rem_amt783 tail call void @use.i32(i32 %rem)784 %inc = add nuw i32 %i.04, 1785 %exitcond.not = icmp eq i32 %inc, %N786 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body787}788 789define void @simple_urem_skip_const_rem_amt(i32 %N) nounwind {790; CHECK-LABEL: simple_urem_skip_const_rem_amt:791; CHECK: # %bb.0: # %entry792; CHECK-NEXT: testl %edi, %edi793; CHECK-NEXT: je .LBB13_4794; CHECK-NEXT: # %bb.1: # %for.body.preheader795; CHECK-NEXT: pushq %rbp796; CHECK-NEXT: pushq %r14797; CHECK-NEXT: pushq %rbx798; CHECK-NEXT: movl %edi, %ebx799; CHECK-NEXT: addl $-4, %ebx800; CHECK-NEXT: movl $4, %ebp801; CHECK-NEXT: movl $2938661835, %r14d # imm = 0xAF286BCB802; CHECK-NEXT: .p2align 4803; CHECK-NEXT: .LBB13_2: # %for.body804; CHECK-NEXT: # =>This Inner Loop Header: Depth=1805; CHECK-NEXT: movl %ebp, %eax806; CHECK-NEXT: imulq %r14, %rax807; CHECK-NEXT: shrq $32, %rax808; CHECK-NEXT: movl %ebp, %ecx809; CHECK-NEXT: subl %eax, %ecx810; CHECK-NEXT: shrl %ecx811; CHECK-NEXT: addl %eax, %ecx812; CHECK-NEXT: shrl $4, %ecx813; CHECK-NEXT: leal (%rcx,%rcx,8), %eax814; CHECK-NEXT: leal (%rcx,%rax,2), %eax815; CHECK-NEXT: movl %ebp, %edi816; CHECK-NEXT: subl %eax, %edi817; CHECK-NEXT: callq use.i32@PLT818; CHECK-NEXT: incl %ebp819; CHECK-NEXT: decl %ebx820; CHECK-NEXT: jne .LBB13_2821; CHECK-NEXT: # %bb.3:822; CHECK-NEXT: popq %rbx823; CHECK-NEXT: popq %r14824; CHECK-NEXT: popq %rbp825; CHECK-NEXT: .LBB13_4: # %for.cond.cleanup826; CHECK-NEXT: retq827entry:828 %cmp3.not = icmp eq i32 %N, 0829 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body830 831for.cond.cleanup:832 ret void833 834for.body:835 %i.04 = phi i32 [ %inc, %for.body ], [ 4, %entry ]836 %rem = urem i32 %i.04, 19837 tail call void @use.i32(i32 %rem)838 %inc = add nuw i32 %i.04, 1839 %exitcond.not = icmp eq i32 %inc, %N840 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body841}842 843define void @simple_urem_fail_no_preheader_non_canonical(i32 %N, i32 %rem_amt) nounwind {844; CHECK-LABEL: simple_urem_fail_no_preheader_non_canonical:845; CHECK: # %bb.0: # %entry846; CHECK-NEXT: pushq %rbp847; CHECK-NEXT: pushq %r14848; CHECK-NEXT: pushq %rbx849; CHECK-NEXT: movl %esi, %ebx850; CHECK-NEXT: movl %edi, %ebp851; CHECK-NEXT: testl %edi, %edi852; CHECK-NEXT: je .LBB14_1853; CHECK-NEXT: # %bb.2: # %for.body1854; CHECK-NEXT: movl $1, %r14d855; CHECK-NEXT: jmp .LBB14_3856; CHECK-NEXT: .LBB14_1:857; CHECK-NEXT: xorl %r14d, %r14d858; CHECK-NEXT: .p2align 4859; CHECK-NEXT: .LBB14_3: # %for.body860; CHECK-NEXT: # =>This Inner Loop Header: Depth=1861; CHECK-NEXT: movl %r14d, %eax862; CHECK-NEXT: xorl %edx, %edx863; CHECK-NEXT: divl %ebx864; CHECK-NEXT: movl %edx, %edi865; CHECK-NEXT: callq use.i32@PLT866; CHECK-NEXT: incl %r14d867; CHECK-NEXT: cmpl %r14d, %ebp868; CHECK-NEXT: jne .LBB14_3869; CHECK-NEXT: # %bb.4: # %for.cond.cleanup870; CHECK-NEXT: popq %rbx871; CHECK-NEXT: popq %r14872; CHECK-NEXT: popq %rbp873; CHECK-NEXT: retq874entry:875 %cmp3.not = icmp eq i32 %N, 0876 br i1 %cmp3.not, label %for.body0, label %for.body1877 878for.cond.cleanup:879 ret void880 881for.body0:882 br label %for.body883 884for.body1:885 br label %for.body886 887for.body:888 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %for.body0 ], [ 1, %for.body1 ]889 %rem = urem i32 %i.04, %rem_amt890 tail call void @use.i32(i32 %rem)891 %inc = add nuw i32 %i.04, 1892 %exitcond.not = icmp eq i32 %inc, %N893 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body894}895 896define void @simple_urem_multi_latch_non_canonical(i32 %N, i32 %rem_amt) nounwind {897; CHECK-LABEL: simple_urem_multi_latch_non_canonical:898; CHECK: # %bb.0: # %entry899; CHECK-NEXT: testl %edi, %edi900; CHECK-NEXT: je .LBB15_6901; CHECK-NEXT: # %bb.1: # %for.body.preheader902; CHECK-NEXT: pushq %rbp903; CHECK-NEXT: pushq %r15904; CHECK-NEXT: pushq %r14905; CHECK-NEXT: pushq %r13906; CHECK-NEXT: pushq %r12907; CHECK-NEXT: pushq %rbx908; CHECK-NEXT: pushq %rax909; CHECK-NEXT: movl %esi, %ebx910; CHECK-NEXT: movl %edi, %ebp911; CHECK-NEXT: decl %ebp912; CHECK-NEXT: xorl %r12d, %r12d913; CHECK-NEXT: xorl %r14d, %r14d914; CHECK-NEXT: xorl %r13d, %r13d915; CHECK-NEXT: jmp .LBB15_2916; CHECK-NEXT: .p2align 4917; CHECK-NEXT: .LBB15_3: # %for.body.backedge918; CHECK-NEXT: # in Loop: Header=BB15_2 Depth=1919; CHECK-NEXT: incl %r14d920; CHECK-NEXT: cmpl %ebx, %r14d921; CHECK-NEXT: cmovel %r12d, %r14d922; CHECK-NEXT: incl %r13d923; CHECK-NEXT: .LBB15_2: # %for.body924; CHECK-NEXT: # =>This Inner Loop Header: Depth=1925; CHECK-NEXT: movl %r14d, %edi926; CHECK-NEXT: callq use.i32@PLT927; CHECK-NEXT: callq get.i1@PLT928; CHECK-NEXT: movl %eax, %r15d929; CHECK-NEXT: callq do_stuff0@PLT930; CHECK-NEXT: testb $1, %r15b931; CHECK-NEXT: je .LBB15_3932; CHECK-NEXT: # %bb.4: # %for.body0933; CHECK-NEXT: # in Loop: Header=BB15_2 Depth=1934; CHECK-NEXT: callq do_stuff1@PLT935; CHECK-NEXT: cmpl %r13d, %ebp936; CHECK-NEXT: jne .LBB15_3937; CHECK-NEXT: # %bb.5:938; CHECK-NEXT: addq $8, %rsp939; CHECK-NEXT: popq %rbx940; CHECK-NEXT: popq %r12941; CHECK-NEXT: popq %r13942; CHECK-NEXT: popq %r14943; CHECK-NEXT: popq %r15944; CHECK-NEXT: popq %rbp945; CHECK-NEXT: .LBB15_6: # %for.cond.cleanup946; CHECK-NEXT: retq947entry:948 %cmp3.not = icmp eq i32 %N, 0949 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body950 951for.cond.cleanup:952 ret void953 954for.body:955 %i.04 = phi i32 [ %inc, %for.body ], [ %inc, %for.body0 ], [ 0, %entry ]956 %rem = urem i32 %i.04, %rem_amt957 tail call void @use.i32(i32 %rem)958 %inc = add nuw i32 %i.04, 1959 %cond = call i1 @get.i1()960 call void @do_stuff0()961 br i1 %cond, label %for.body0, label %for.body962for.body0:963 call void @do_stuff1()964 %exitcond.not = icmp eq i32 %inc, %N965 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body966}967 968define void @simple_urem_fail_bad_loop(i32 %N, i32 %rem_amt) nounwind {969; CHECK-LABEL: simple_urem_fail_bad_loop:970; CHECK: # %bb.0: # %entry971; CHECK-NEXT: pushq %rbp972; CHECK-NEXT: pushq %r14973; CHECK-NEXT: pushq %rbx974; CHECK-NEXT: movl %esi, %ebx975; CHECK-NEXT: movl %edi, %ebp976; CHECK-NEXT: callq get.i32@PLT977; CHECK-NEXT: testl %eax, %eax978; CHECK-NEXT: # implicit-def: $r14d979; CHECK-NEXT: jne .LBB16_4980; CHECK-NEXT: # %bb.1:981; CHECK-NEXT: xorl %r14d, %r14d982; CHECK-NEXT: .LBB16_2: # %for.cond983; CHECK-NEXT: cmpl %ebp, %r14d984; CHECK-NEXT: jae .LBB16_5985; CHECK-NEXT: # %bb.3: # %for.body986; CHECK-NEXT: movl %r14d, %edi987; CHECK-NEXT: xorl $1, %edi988; CHECK-NEXT: callq use.i32@PLT989; CHECK-NEXT: .LBB16_4: # %halfway990; CHECK-NEXT: movl %r14d, %eax991; CHECK-NEXT: xorl %edx, %edx992; CHECK-NEXT: divl %ebx993; CHECK-NEXT: movl %edx, %edi994; CHECK-NEXT: callq use.i32@PLT995; CHECK-NEXT: incl %r14d996; CHECK-NEXT: jmp .LBB16_2997; CHECK-NEXT: .LBB16_5: # %for.end998; CHECK-NEXT: popq %rbx999; CHECK-NEXT: popq %r141000; CHECK-NEXT: popq %rbp1001; CHECK-NEXT: retq1002entry:1003 %call = call i32 @get.i32()1004 %tobool.not = icmp eq i32 %call, 01005 br i1 %tobool.not, label %for.cond, label %halfway1006 1007for.cond:1008 %i.0 = phi i32 [ %inc, %halfway ], [ 0, %entry ]1009 %cmp = icmp ult i32 %i.0, %N1010 br i1 %cmp, label %for.body, label %for.end1011 1012for.body:1013 %xor = xor i32 %i.0, 11014 call void @use.i32(i32 %xor)1015 br label %halfway1016 1017halfway:1018 %i.1 = phi i32 [ poison, %entry ], [ %i.0, %for.body ]1019 %rem = urem i32 %i.1, %rem_amt1020 call void @use.i32(i32 %rem)1021 %inc = add nuw i32 %i.1, 11022 br label %for.cond1023 1024for.end:1025 ret void1026}1027 1028define void @simple_urem_fail_intermediate_inc(i32 %N, i32 %rem_amt) nounwind {1029; CHECK-LABEL: simple_urem_fail_intermediate_inc:1030; CHECK: # %bb.0: # %entry1031; CHECK-NEXT: testl %edi, %edi1032; CHECK-NEXT: je .LBB17_41033; CHECK-NEXT: # %bb.1: # %for.body.preheader1034; CHECK-NEXT: pushq %rbp1035; CHECK-NEXT: pushq %r141036; CHECK-NEXT: pushq %rbx1037; CHECK-NEXT: movl %esi, %ebx1038; CHECK-NEXT: movl %edi, %r14d1039; CHECK-NEXT: negl %r14d1040; CHECK-NEXT: movl $1, %ebp1041; CHECK-NEXT: .p2align 41042; CHECK-NEXT: .LBB17_2: # %for.body1043; CHECK-NEXT: # =>This Inner Loop Header: Depth=11044; CHECK-NEXT: movl %ebp, %eax1045; CHECK-NEXT: xorl %edx, %edx1046; CHECK-NEXT: divl %ebx1047; CHECK-NEXT: movl %edx, %edi1048; CHECK-NEXT: callq use.i32@PLT1049; CHECK-NEXT: movl %ebp, %eax1050; CHECK-NEXT: incl %ebp1051; CHECK-NEXT: leal 1(%r14,%rax), %eax1052; CHECK-NEXT: cmpl $1, %eax1053; CHECK-NEXT: jne .LBB17_21054; CHECK-NEXT: # %bb.3:1055; CHECK-NEXT: popq %rbx1056; CHECK-NEXT: popq %r141057; CHECK-NEXT: popq %rbp1058; CHECK-NEXT: .LBB17_4: # %for.cond.cleanup1059; CHECK-NEXT: retq1060entry:1061 %cmp3.not = icmp eq i32 %N, 01062 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1063 1064for.cond.cleanup:1065 ret void1066 1067for.body:1068 %i.04 = phi i32 [ %inc, %for.body ], [ 0, %entry ]1069 %inc2 = add nuw i32 %i.04, 11070 %rem = urem i32 %inc2, %rem_amt1071 tail call void @use.i32(i32 %rem)1072 %inc = add nuw i32 %i.04, 11073 %exitcond.not = icmp eq i32 %inc, %N1074 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1075}1076 1077define void @weird_loop(i64 %sub.ptr.div.i56) personality ptr null {1078; CHECK-LABEL: weird_loop:1079; CHECK: # %bb.0: # %entry1080; CHECK-NEXT: .p2align 41081; CHECK-NEXT: .LBB18_1: # %for.body1082; CHECK-NEXT: # =>This Inner Loop Header: Depth=11083; CHECK-NEXT: jmp .LBB18_11084entry:1085 br label %for.preheader1086 1087for.preheader:1088 %i57.0540.us = phi i64 [ 0, %entry ], [ %add74.us, %for.body ]1089 %add74.us = add nuw i64 %i57.0540.us, 11090 br label %for.body1091 1092for.body:1093 %rem.us = urem i64 %i57.0540.us, %sub.ptr.div.i561094 br i1 false, label %for.preheader, label %for.body1095}1096 1097define void @simple_urem_to_sel_non_zero_start_fail(i32 %N, i32 %rem_amt) nounwind {1098; CHECK-LABEL: simple_urem_to_sel_non_zero_start_fail:1099; CHECK: # %bb.0: # %entry1100; CHECK-NEXT: cmpl $3, %edi1101; CHECK-NEXT: jb .LBB19_41102; CHECK-NEXT: # %bb.1: # %for.body.preheader1103; CHECK-NEXT: pushq %rbp1104; CHECK-NEXT: pushq %r141105; CHECK-NEXT: pushq %rbx1106; CHECK-NEXT: movl %esi, %ebx1107; CHECK-NEXT: movl %edi, %ebp1108; CHECK-NEXT: movl $2, %r14d1109; CHECK-NEXT: .p2align 41110; CHECK-NEXT: .LBB19_2: # %for.body1111; CHECK-NEXT: # =>This Inner Loop Header: Depth=11112; CHECK-NEXT: movl %r14d, %eax1113; CHECK-NEXT: xorl %edx, %edx1114; CHECK-NEXT: divl %ebx1115; CHECK-NEXT: movl %edx, %edi1116; CHECK-NEXT: callq use.i32@PLT1117; CHECK-NEXT: incl %r14d1118; CHECK-NEXT: cmpl %r14d, %ebp1119; CHECK-NEXT: jne .LBB19_21120; CHECK-NEXT: # %bb.3:1121; CHECK-NEXT: popq %rbx1122; CHECK-NEXT: popq %r141123; CHECK-NEXT: popq %rbp1124; CHECK-NEXT: .LBB19_4: # %for.cond.cleanup1125; CHECK-NEXT: retq1126entry:1127 %cmp3.not = icmp ult i32 %N, 31128 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1129 1130for.cond.cleanup:1131 ret void1132 1133for.body:1134 %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]1135 %rem = urem i32 %i.04, %rem_amt1136 tail call void @use.i32(i32 %rem)1137 %inc = add nuw i32 %i.04, 11138 %exitcond.not = icmp eq i32 %inc, %N1139 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1140}1141 1142define void @simple_urem_to_sel_non_zero_start_okay(i32 %N, i32 %rem_amt_in) nounwind {1143; CHECK-LABEL: simple_urem_to_sel_non_zero_start_okay:1144; CHECK: # %bb.0: # %entry1145; CHECK-NEXT: cmpl $3, %edi1146; CHECK-NEXT: jb .LBB20_41147; CHECK-NEXT: # %bb.1: # %for.body.preheader1148; CHECK-NEXT: pushq %rbp1149; CHECK-NEXT: pushq %r151150; CHECK-NEXT: pushq %r141151; CHECK-NEXT: pushq %r121152; CHECK-NEXT: pushq %rbx1153; CHECK-NEXT: movl %esi, %ebx1154; CHECK-NEXT: movl %edi, %ebp1155; CHECK-NEXT: orl $16, %ebx1156; CHECK-NEXT: movl $2, %r14d1157; CHECK-NEXT: xorl %r15d, %r15d1158; CHECK-NEXT: movl $2, %r12d1159; CHECK-NEXT: .p2align 41160; CHECK-NEXT: .LBB20_2: # %for.body1161; CHECK-NEXT: # =>This Inner Loop Header: Depth=11162; CHECK-NEXT: movl %r14d, %edi1163; CHECK-NEXT: callq use.i32@PLT1164; CHECK-NEXT: incl %r14d1165; CHECK-NEXT: cmpl %ebx, %r14d1166; CHECK-NEXT: cmovel %r15d, %r14d1167; CHECK-NEXT: incl %r12d1168; CHECK-NEXT: cmpl %r12d, %ebp1169; CHECK-NEXT: jne .LBB20_21170; CHECK-NEXT: # %bb.3:1171; CHECK-NEXT: popq %rbx1172; CHECK-NEXT: popq %r121173; CHECK-NEXT: popq %r141174; CHECK-NEXT: popq %r151175; CHECK-NEXT: popq %rbp1176; CHECK-NEXT: .LBB20_4: # %for.cond.cleanup1177; CHECK-NEXT: retq1178entry:1179 %rem_amt = or i32 %rem_amt_in, 161180 %cmp3.not = icmp ult i32 %N, 31181 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1182 1183for.cond.cleanup:1184 ret void1185 1186for.body:1187 %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]1188 %rem = urem i32 %i.04, %rem_amt1189 tail call void @use.i32(i32 %rem)1190 %inc = add nuw i32 %i.04, 11191 %exitcond.not = icmp eq i32 %inc, %N1192 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1193}1194 1195define void @simple_urem_to_sel_non_zero_start_through_add(i32 %N, i32 %rem_amt_in) nounwind {1196; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add:1197; CHECK: # %bb.0: # %entry1198; CHECK-NEXT: cmpl $3, %edi1199; CHECK-NEXT: jb .LBB21_41200; CHECK-NEXT: # %bb.1: # %for.body.preheader1201; CHECK-NEXT: pushq %rbp1202; CHECK-NEXT: pushq %r141203; CHECK-NEXT: pushq %rbx1204; CHECK-NEXT: movl %esi, %ebx1205; CHECK-NEXT: movl %edi, %r14d1206; CHECK-NEXT: orl $16, %ebx1207; CHECK-NEXT: negl %r14d1208; CHECK-NEXT: movl $7, %ebp1209; CHECK-NEXT: .p2align 41210; CHECK-NEXT: .LBB21_2: # %for.body1211; CHECK-NEXT: # =>This Inner Loop Header: Depth=11212; CHECK-NEXT: movl %ebp, %eax1213; CHECK-NEXT: xorl %edx, %edx1214; CHECK-NEXT: divl %ebx1215; CHECK-NEXT: movl %edx, %edi1216; CHECK-NEXT: callq use.i32@PLT1217; CHECK-NEXT: movl %ebp, %eax1218; CHECK-NEXT: incl %ebp1219; CHECK-NEXT: leal 1(%r14,%rax), %eax1220; CHECK-NEXT: cmpl $5, %eax1221; CHECK-NEXT: jne .LBB21_21222; CHECK-NEXT: # %bb.3:1223; CHECK-NEXT: popq %rbx1224; CHECK-NEXT: popq %r141225; CHECK-NEXT: popq %rbp1226; CHECK-NEXT: .LBB21_4: # %for.cond.cleanup1227; CHECK-NEXT: retq1228entry:1229 %rem_amt = or i32 %rem_amt_in, 161230 %cmp3.not = icmp ult i32 %N, 31231 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1232 1233for.cond.cleanup:1234 ret void1235 1236for.body:1237 %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]1238 %i_with_off = add nuw i32 %i.04, 51239 %rem = urem i32 %i_with_off, %rem_amt1240 tail call void @use.i32(i32 %rem)1241 %inc = add nuw i32 %i.04, 11242 %exitcond.not = icmp eq i32 %inc, %N1243 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1244}1245 1246define void @simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw(i32 %N, i32 %rem_amt_in) nounwind {1247; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_missing_nuw:1248; CHECK: # %bb.0: # %entry1249; CHECK-NEXT: cmpl $3, %edi1250; CHECK-NEXT: jb .LBB22_41251; CHECK-NEXT: # %bb.1: # %for.body.preheader1252; CHECK-NEXT: pushq %rbp1253; CHECK-NEXT: pushq %r141254; CHECK-NEXT: pushq %rbx1255; CHECK-NEXT: movl %esi, %ebx1256; CHECK-NEXT: movl %edi, %r14d1257; CHECK-NEXT: orl $16, %ebx1258; CHECK-NEXT: negl %r14d1259; CHECK-NEXT: movl $7, %ebp1260; CHECK-NEXT: .p2align 41261; CHECK-NEXT: .LBB22_2: # %for.body1262; CHECK-NEXT: # =>This Inner Loop Header: Depth=11263; CHECK-NEXT: movl %ebp, %eax1264; CHECK-NEXT: xorl %edx, %edx1265; CHECK-NEXT: divl %ebx1266; CHECK-NEXT: movl %edx, %edi1267; CHECK-NEXT: callq use.i32@PLT1268; CHECK-NEXT: movl %ebp, %eax1269; CHECK-NEXT: incl %ebp1270; CHECK-NEXT: leal 1(%r14,%rax), %eax1271; CHECK-NEXT: cmpl $5, %eax1272; CHECK-NEXT: jne .LBB22_21273; CHECK-NEXT: # %bb.3:1274; CHECK-NEXT: popq %rbx1275; CHECK-NEXT: popq %r141276; CHECK-NEXT: popq %rbp1277; CHECK-NEXT: .LBB22_4: # %for.cond.cleanup1278; CHECK-NEXT: retq1279entry:1280 %rem_amt = or i32 %rem_amt_in, 161281 %cmp3.not = icmp ult i32 %N, 31282 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1283 1284for.cond.cleanup:1285 ret void1286 1287for.body:1288 %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]1289 %i_with_off = add i32 %i.04, 51290 %rem = urem i32 %i_with_off, %rem_amt1291 tail call void @use.i32(i32 %rem)1292 %inc = add nuw i32 %i.04, 11293 %exitcond.not = icmp eq i32 %inc, %N1294 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1295}1296 1297define void @simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem(i32 %N, i32 %rem_amt) nounwind {1298; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_add_fail_no_simplify_rem:1299; CHECK: # %bb.0: # %entry1300; CHECK-NEXT: cmpl $3, %edi1301; CHECK-NEXT: jb .LBB23_41302; CHECK-NEXT: # %bb.1: # %for.body.preheader1303; CHECK-NEXT: pushq %rbp1304; CHECK-NEXT: pushq %r141305; CHECK-NEXT: pushq %rbx1306; CHECK-NEXT: movl %esi, %ebx1307; CHECK-NEXT: movl %edi, %r14d1308; CHECK-NEXT: negl %r14d1309; CHECK-NEXT: movl $7, %ebp1310; CHECK-NEXT: .p2align 41311; CHECK-NEXT: .LBB23_2: # %for.body1312; CHECK-NEXT: # =>This Inner Loop Header: Depth=11313; CHECK-NEXT: movl %ebp, %eax1314; CHECK-NEXT: xorl %edx, %edx1315; CHECK-NEXT: divl %ebx1316; CHECK-NEXT: movl %edx, %edi1317; CHECK-NEXT: callq use.i32@PLT1318; CHECK-NEXT: movl %ebp, %eax1319; CHECK-NEXT: incl %ebp1320; CHECK-NEXT: leal 1(%r14,%rax), %eax1321; CHECK-NEXT: cmpl $5, %eax1322; CHECK-NEXT: jne .LBB23_21323; CHECK-NEXT: # %bb.3:1324; CHECK-NEXT: popq %rbx1325; CHECK-NEXT: popq %r141326; CHECK-NEXT: popq %rbp1327; CHECK-NEXT: .LBB23_4: # %for.cond.cleanup1328; CHECK-NEXT: retq1329entry:1330 %cmp3.not = icmp ult i32 %N, 31331 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1332 1333for.cond.cleanup:1334 ret void1335 1336for.body:1337 %i.04 = phi i32 [ %inc, %for.body ], [ 2, %entry ]1338 %i_with_off = add nuw i32 %i.04, 51339 %rem = urem i32 %i_with_off, %rem_amt1340 tail call void @use.i32(i32 %rem)1341 %inc = add nuw i32 %i.04, 11342 %exitcond.not = icmp eq i32 %inc, %N1343 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1344}1345 1346define void @simple_urem_to_sel_non_zero_start_through_sub(i32 %N, i32 %rem_amt, i32 %start) nounwind {1347; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_sub:1348; CHECK: # %bb.0: # %entry1349; CHECK-NEXT: pushq %rbp1350; CHECK-NEXT: pushq %r151351; CHECK-NEXT: pushq %r141352; CHECK-NEXT: pushq %r121353; CHECK-NEXT: pushq %rbx1354; CHECK-NEXT: movl %edi, %ebp1355; CHECK-NEXT: subl %edx, %ebp1356; CHECK-NEXT: jbe .LBB24_31357; CHECK-NEXT: # %bb.1: # %for.body.preheader1358; CHECK-NEXT: movl %esi, %ebx1359; CHECK-NEXT: xorl %r15d, %r15d1360; CHECK-NEXT: xorl %r14d, %r14d1361; CHECK-NEXT: xorl %r12d, %r12d1362; CHECK-NEXT: .p2align 41363; CHECK-NEXT: .LBB24_2: # %for.body1364; CHECK-NEXT: # =>This Inner Loop Header: Depth=11365; CHECK-NEXT: movl %r14d, %edi1366; CHECK-NEXT: callq use.i32@PLT1367; CHECK-NEXT: incl %r14d1368; CHECK-NEXT: cmpl %ebx, %r14d1369; CHECK-NEXT: cmovel %r15d, %r14d1370; CHECK-NEXT: incl %r12d1371; CHECK-NEXT: cmpl %r12d, %ebp1372; CHECK-NEXT: jne .LBB24_21373; CHECK-NEXT: .LBB24_3: # %for.cond.cleanup1374; CHECK-NEXT: popq %rbx1375; CHECK-NEXT: popq %r121376; CHECK-NEXT: popq %r141377; CHECK-NEXT: popq %r151378; CHECK-NEXT: popq %rbp1379; CHECK-NEXT: retq1380entry:1381 %cmp3.not = icmp ule i32 %N, %start1382 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1383 1384for.cond.cleanup:1385 ret void1386 1387for.body:1388 %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]1389 %i_with_off = sub nuw i32 %i.04, %start1390 %rem = urem i32 %i_with_off, %rem_amt1391 tail call void @use.i32(i32 %rem)1392 %inc = add nuw i32 %i.04, 11393 %exitcond.not = icmp eq i32 %inc, %N1394 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1395}1396 1397define void @simple_urem_to_sel_non_zero_start_through_sub_no_simplfy(i32 %N, i32 %rem_amt, i32 %start) nounwind {1398; CHECK-LABEL: simple_urem_to_sel_non_zero_start_through_sub_no_simplfy:1399; CHECK: # %bb.0: # %entry1400; CHECK-NEXT: cmpl %edx, %edi1401; CHECK-NEXT: jbe .LBB25_41402; CHECK-NEXT: # %bb.1: # %for.body.preheader1403; CHECK-NEXT: pushq %rbp1404; CHECK-NEXT: pushq %r141405; CHECK-NEXT: pushq %rbx1406; CHECK-NEXT: movl %edx, %ebx1407; CHECK-NEXT: movl %esi, %ebp1408; CHECK-NEXT: movl %edi, %r14d1409; CHECK-NEXT: negl %r14d1410; CHECK-NEXT: addl $-2, %ebx1411; CHECK-NEXT: .p2align 41412; CHECK-NEXT: .LBB25_2: # %for.body1413; CHECK-NEXT: # =>This Inner Loop Header: Depth=11414; CHECK-NEXT: movl %ebx, %eax1415; CHECK-NEXT: xorl %edx, %edx1416; CHECK-NEXT: divl %ebp1417; CHECK-NEXT: movl %edx, %edi1418; CHECK-NEXT: callq use.i32@PLT1419; CHECK-NEXT: movl %ebx, %eax1420; CHECK-NEXT: incl %ebx1421; CHECK-NEXT: leal 1(%r14,%rax), %eax1422; CHECK-NEXT: cmpl $-2, %eax1423; CHECK-NEXT: jne .LBB25_21424; CHECK-NEXT: # %bb.3:1425; CHECK-NEXT: popq %rbx1426; CHECK-NEXT: popq %r141427; CHECK-NEXT: popq %rbp1428; CHECK-NEXT: .LBB25_4: # %for.cond.cleanup1429; CHECK-NEXT: retq1430entry:1431 %cmp3.not = icmp ule i32 %N, %start1432 br i1 %cmp3.not, label %for.cond.cleanup, label %for.body1433 1434for.cond.cleanup:1435 ret void1436 1437for.body:1438 %i.04 = phi i32 [ %inc, %for.body ], [ %start, %entry ]1439 %i_with_off = sub nuw i32 %i.04, 21440 %rem = urem i32 %i_with_off, %rem_amt1441 tail call void @use.i32(i32 %rem)1442 %inc = add nuw i32 %i.04, 11443 %exitcond.not = icmp eq i32 %inc, %N1444 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1445}1446