brintos

brintos / llvm-project-archived public Read only

0
0
Text · 44.8 KiB · c9c88f7 Raw
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