brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.0 KiB · 079294e Raw
696 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s --check-prefix=X64-LINUX4; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s --check-prefix=X64-WIN325 6declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)7declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)8 9; The immediate can be encoded in a smaller way if the10; instruction is a sub instead of an add.11define i32 @test1(i32 inreg %a) nounwind {12; X86-LABEL: test1:13; X86:       # %bb.0: # %entry14; X86-NEXT:    subl $-128, %eax15; X86-NEXT:    retl16;17; X64-LINUX-LABEL: test1:18; X64-LINUX:       # %bb.0: # %entry19; X64-LINUX-NEXT:    # kill: def $edi killed $edi def $rdi20; X64-LINUX-NEXT:    leal 128(%rdi), %eax21; X64-LINUX-NEXT:    retq22;23; X64-WIN32-LABEL: test1:24; X64-WIN32:       # %bb.0: # %entry25; X64-WIN32-NEXT:    # kill: def $ecx killed $ecx def $rcx26; X64-WIN32-NEXT:    leal 128(%rcx), %eax27; X64-WIN32-NEXT:    retq28entry:29  %b = add i32 %a, 12830  ret i32 %b31}32 33define i32 @test1b(ptr %p) nounwind {34; X86-LABEL: test1b:35; X86:       # %bb.0: # %entry36; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax37; X86-NEXT:    movl (%eax), %eax38; X86-NEXT:    subl $-128, %eax39; X86-NEXT:    retl40;41; X64-LINUX-LABEL: test1b:42; X64-LINUX:       # %bb.0: # %entry43; X64-LINUX-NEXT:    movl (%rdi), %eax44; X64-LINUX-NEXT:    subl $-128, %eax45; X64-LINUX-NEXT:    retq46;47; X64-WIN32-LABEL: test1b:48; X64-WIN32:       # %bb.0: # %entry49; X64-WIN32-NEXT:    movl (%rcx), %eax50; X64-WIN32-NEXT:    subl $-128, %eax51; X64-WIN32-NEXT:    retq52entry:53  %a = load i32, ptr %p54  %b = add i32 %a, 12855  ret i32 %b56}57 58define i64 @test2(i64 inreg %a) nounwind {59; X86-LABEL: test2:60; X86:       # %bb.0: # %entry61; X86-NEXT:    addl $-2147483648, %eax # imm = 0x8000000062; X86-NEXT:    adcl $0, %edx63; X86-NEXT:    retl64;65; X64-LINUX-LABEL: test2:66; X64-LINUX:       # %bb.0: # %entry67; X64-LINUX-NEXT:    movq %rdi, %rax68; X64-LINUX-NEXT:    subq $-2147483648, %rax # imm = 0x8000000069; X64-LINUX-NEXT:    retq70;71; X64-WIN32-LABEL: test2:72; X64-WIN32:       # %bb.0: # %entry73; X64-WIN32-NEXT:    movq %rcx, %rax74; X64-WIN32-NEXT:    subq $-2147483648, %rax # imm = 0x8000000075; X64-WIN32-NEXT:    retq76entry:77  %b = add i64 %a, 214748364878  ret i64 %b79}80define i64 @test3(i64 inreg %a) nounwind {81; X86-LABEL: test3:82; X86:       # %bb.0: # %entry83; X86-NEXT:    addl $128, %eax84; X86-NEXT:    adcl $0, %edx85; X86-NEXT:    retl86;87; X64-LINUX-LABEL: test3:88; X64-LINUX:       # %bb.0: # %entry89; X64-LINUX-NEXT:    leaq 128(%rdi), %rax90; X64-LINUX-NEXT:    retq91;92; X64-WIN32-LABEL: test3:93; X64-WIN32:       # %bb.0: # %entry94; X64-WIN32-NEXT:    leaq 128(%rcx), %rax95; X64-WIN32-NEXT:    retq96entry:97  %b = add i64 %a, 12898  ret i64 %b99}100 101define i64 @test3b(ptr %p) nounwind {102; X86-LABEL: test3b:103; X86:       # %bb.0: # %entry104; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx105; X86-NEXT:    movl 4(%ecx), %edx106; X86-NEXT:    movl $128, %eax107; X86-NEXT:    addl (%ecx), %eax108; X86-NEXT:    adcl $0, %edx109; X86-NEXT:    retl110;111; X64-LINUX-LABEL: test3b:112; X64-LINUX:       # %bb.0: # %entry113; X64-LINUX-NEXT:    movq (%rdi), %rax114; X64-LINUX-NEXT:    subq $-128, %rax115; X64-LINUX-NEXT:    retq116;117; X64-WIN32-LABEL: test3b:118; X64-WIN32:       # %bb.0: # %entry119; X64-WIN32-NEXT:    movq (%rcx), %rax120; X64-WIN32-NEXT:    subq $-128, %rax121; X64-WIN32-NEXT:    retq122entry:123  %a = load i64, ptr %p124  %b = add i64 %a, 128125  ret i64 %b126}127 128define i1 @test4(i32 %v1, i32 %v2, ptr %X) nounwind {129; X86-LABEL: test4:130; X86:       # %bb.0: # %entry131; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax132; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax133; X86-NEXT:    jo .LBB5_2134; X86-NEXT:  # %bb.1: # %normal135; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax136; X86-NEXT:    movl $0, (%eax)137; X86-NEXT:  .LBB5_2: # %overflow138; X86-NEXT:    xorl %eax, %eax139; X86-NEXT:    retl140;141; X64-LINUX-LABEL: test4:142; X64-LINUX:       # %bb.0: # %entry143; X64-LINUX-NEXT:    addl %esi, %edi144; X64-LINUX-NEXT:    jo .LBB5_2145; X64-LINUX-NEXT:  # %bb.1: # %normal146; X64-LINUX-NEXT:    movl $0, (%rdx)147; X64-LINUX-NEXT:  .LBB5_2: # %overflow148; X64-LINUX-NEXT:    xorl %eax, %eax149; X64-LINUX-NEXT:    retq150;151; X64-WIN32-LABEL: test4:152; X64-WIN32:       # %bb.0: # %entry153; X64-WIN32-NEXT:    addl %edx, %ecx154; X64-WIN32-NEXT:    jo .LBB5_2155; X64-WIN32-NEXT:  # %bb.1: # %normal156; X64-WIN32-NEXT:    movl $0, (%r8)157; X64-WIN32-NEXT:  .LBB5_2: # %overflow158; X64-WIN32-NEXT:    xorl %eax, %eax159; X64-WIN32-NEXT:    retq160entry:161  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)162  %sum = extractvalue {i32, i1} %t, 0163  %obit = extractvalue {i32, i1} %t, 1164  br i1 %obit, label %overflow, label %normal165 166normal:167  store i32 0, ptr %X168  br label %overflow169 170overflow:171  ret i1 false172}173 174define i1 @test5(i32 %v1, i32 %v2, ptr %X) nounwind {175; X86-LABEL: test5:176; X86:       # %bb.0: # %entry177; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax178; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax179; X86-NEXT:    jb .LBB6_2180; X86-NEXT:  # %bb.1: # %normal181; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax182; X86-NEXT:    movl $0, (%eax)183; X86-NEXT:  .LBB6_2: # %carry184; X86-NEXT:    xorl %eax, %eax185; X86-NEXT:    retl186;187; X64-LINUX-LABEL: test5:188; X64-LINUX:       # %bb.0: # %entry189; X64-LINUX-NEXT:    addl %esi, %edi190; X64-LINUX-NEXT:    jb .LBB6_2191; X64-LINUX-NEXT:  # %bb.1: # %normal192; X64-LINUX-NEXT:    movl $0, (%rdx)193; X64-LINUX-NEXT:  .LBB6_2: # %carry194; X64-LINUX-NEXT:    xorl %eax, %eax195; X64-LINUX-NEXT:    retq196;197; X64-WIN32-LABEL: test5:198; X64-WIN32:       # %bb.0: # %entry199; X64-WIN32-NEXT:    addl %edx, %ecx200; X64-WIN32-NEXT:    jb .LBB6_2201; X64-WIN32-NEXT:  # %bb.1: # %normal202; X64-WIN32-NEXT:    movl $0, (%r8)203; X64-WIN32-NEXT:  .LBB6_2: # %carry204; X64-WIN32-NEXT:    xorl %eax, %eax205; X64-WIN32-NEXT:    retq206entry:207  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)208  %sum = extractvalue {i32, i1} %t, 0209  %obit = extractvalue {i32, i1} %t, 1210  br i1 %obit, label %carry, label %normal211 212normal:213  store i32 0, ptr %X214  br label %carry215 216carry:217  ret i1 false218}219 220define i64 @test6(i64 %A, i32 %B) nounwind {221; X86-LABEL: test6:222; X86:       # %bb.0: # %entry223; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax224; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx225; X86-NEXT:    addl {{[0-9]+}}(%esp), %edx226; X86-NEXT:    retl227;228; X64-LINUX-LABEL: test6:229; X64-LINUX:       # %bb.0: # %entry230; X64-LINUX-NEXT:    # kill: def $esi killed $esi def $rsi231; X64-LINUX-NEXT:    shlq $32, %rsi232; X64-LINUX-NEXT:    leaq (%rsi,%rdi), %rax233; X64-LINUX-NEXT:    retq234;235; X64-WIN32-LABEL: test6:236; X64-WIN32:       # %bb.0: # %entry237; X64-WIN32-NEXT:    # kill: def $edx killed $edx def $rdx238; X64-WIN32-NEXT:    shlq $32, %rdx239; X64-WIN32-NEXT:    leaq (%rdx,%rcx), %rax240; X64-WIN32-NEXT:    retq241entry:242  %tmp12 = zext i32 %B to i64243  %tmp3 = shl i64 %tmp12, 32244  %tmp5 = add i64 %tmp3, %A245  ret i64 %tmp5246}247 248define {i32, i1} @test7(i32 %v1, i32 %v2) nounwind {249; X86-LABEL: test7:250; X86:       # %bb.0: # %entry251; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax252; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax253; X86-NEXT:    setb %dl254; X86-NEXT:    retl255;256; X64-LINUX-LABEL: test7:257; X64-LINUX:       # %bb.0: # %entry258; X64-LINUX-NEXT:    movl %edi, %eax259; X64-LINUX-NEXT:    addl %esi, %eax260; X64-LINUX-NEXT:    setb %dl261; X64-LINUX-NEXT:    retq262;263; X64-WIN32-LABEL: test7:264; X64-WIN32:       # %bb.0: # %entry265; X64-WIN32-NEXT:    movl %ecx, %eax266; X64-WIN32-NEXT:    addl %edx, %eax267; X64-WIN32-NEXT:    setb %dl268; X64-WIN32-NEXT:    retq269entry:270  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)271  ret {i32, i1} %t272}273 274; PR5443275define {i64, i1} @test8(i64 %left, i64 %right) nounwind {276; X86-LABEL: test8:277; X86:       # %bb.0: # %entry278; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax279; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx280; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax281; X86-NEXT:    adcl {{[0-9]+}}(%esp), %edx282; X86-NEXT:    setb %cl283; X86-NEXT:    retl284;285; X64-LINUX-LABEL: test8:286; X64-LINUX:       # %bb.0: # %entry287; X64-LINUX-NEXT:    movq %rdi, %rax288; X64-LINUX-NEXT:    addq %rsi, %rax289; X64-LINUX-NEXT:    setb %dl290; X64-LINUX-NEXT:    retq291;292; X64-WIN32-LABEL: test8:293; X64-WIN32:       # %bb.0: # %entry294; X64-WIN32-NEXT:    movq %rcx, %rax295; X64-WIN32-NEXT:    addq %rdx, %rax296; X64-WIN32-NEXT:    setb %dl297; X64-WIN32-NEXT:    retq298entry:299  %extleft = zext i64 %left to i65300  %extright = zext i64 %right to i65301  %sum = add i65 %extleft, %extright302  %res.0 = trunc i65 %sum to i64303  %overflow = and i65 %sum, -18446744073709551616304  %res.1 = icmp ne i65 %overflow, 0305  %final0 = insertvalue {i64, i1} undef, i64 %res.0, 0306  %final1 = insertvalue {i64, i1} %final0, i1 %res.1, 1307  ret {i64, i1} %final1308}309 310define i32 @test9(i32 %x, i32 %y) nounwind readnone {311; X86-LABEL: test9:312; X86:       # %bb.0: # %entry313; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax314; X86-NEXT:    xorl %ecx, %ecx315; X86-NEXT:    cmpl $10, {{[0-9]+}}(%esp)316; X86-NEXT:    sete %cl317; X86-NEXT:    subl %ecx, %eax318; X86-NEXT:    retl319;320; X64-LINUX-LABEL: test9:321; X64-LINUX:       # %bb.0: # %entry322; X64-LINUX-NEXT:    movl %esi, %eax323; X64-LINUX-NEXT:    xorl %ecx, %ecx324; X64-LINUX-NEXT:    cmpl $10, %edi325; X64-LINUX-NEXT:    sete %cl326; X64-LINUX-NEXT:    subl %ecx, %eax327; X64-LINUX-NEXT:    retq328;329; X64-WIN32-LABEL: test9:330; X64-WIN32:       # %bb.0: # %entry331; X64-WIN32-NEXT:    movl %edx, %eax332; X64-WIN32-NEXT:    xorl %edx, %edx333; X64-WIN32-NEXT:    cmpl $10, %ecx334; X64-WIN32-NEXT:    sete %dl335; X64-WIN32-NEXT:    subl %edx, %eax336; X64-WIN32-NEXT:    retq337entry:338  %cmp = icmp eq i32 %x, 10339  %sub = sext i1 %cmp to i32340  %cond = add i32 %sub, %y341  ret i32 %cond342}343 344define i1 @test10(i32 %x) nounwind {345; X86-LABEL: test10:346; X86:       # %bb.0: # %entry347; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax348; X86-NEXT:    incl %eax349; X86-NEXT:    seto %al350; X86-NEXT:    retl351;352; X64-LINUX-LABEL: test10:353; X64-LINUX:       # %bb.0: # %entry354; X64-LINUX-NEXT:    incl %edi355; X64-LINUX-NEXT:    seto %al356; X64-LINUX-NEXT:    retq357;358; X64-WIN32-LABEL: test10:359; X64-WIN32:       # %bb.0: # %entry360; X64-WIN32-NEXT:    incl %ecx361; X64-WIN32-NEXT:    seto %al362; X64-WIN32-NEXT:    retq363entry:364  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %x, i32 1)365  %obit = extractvalue {i32, i1} %t, 1366  ret i1 %obit367}368 369define void @test11(ptr inreg %a) nounwind {370; X86-LABEL: test11:371; X86:       # %bb.0: # %entry372; X86-NEXT:    subl $-128, (%eax)373; X86-NEXT:    retl374;375; X64-LINUX-LABEL: test11:376; X64-LINUX:       # %bb.0: # %entry377; X64-LINUX-NEXT:    subl $-128, (%rdi)378; X64-LINUX-NEXT:    retq379;380; X64-WIN32-LABEL: test11:381; X64-WIN32:       # %bb.0: # %entry382; X64-WIN32-NEXT:    subl $-128, (%rcx)383; X64-WIN32-NEXT:    retq384entry:385  %aa = load i32, ptr %a386  %b = add i32 %aa, 128387  store i32 %b, ptr %a388  ret void389}390 391define void @test12(ptr inreg %a) nounwind {392; X86-LABEL: test12:393; X86:       # %bb.0: # %entry394; X86-NEXT:    addl $-2147483648, (%eax) # imm = 0x80000000395; X86-NEXT:    adcl $0, 4(%eax)396; X86-NEXT:    retl397;398; X64-LINUX-LABEL: test12:399; X64-LINUX:       # %bb.0: # %entry400; X64-LINUX-NEXT:    subq $-2147483648, (%rdi) # imm = 0x80000000401; X64-LINUX-NEXT:    retq402;403; X64-WIN32-LABEL: test12:404; X64-WIN32:       # %bb.0: # %entry405; X64-WIN32-NEXT:    subq $-2147483648, (%rcx) # imm = 0x80000000406; X64-WIN32-NEXT:    retq407entry:408  %aa = load i64, ptr %a409  %b = add i64 %aa, 2147483648410  store i64 %b, ptr %a411  ret void412}413 414define void @test13(ptr inreg %a) nounwind {415; X86-LABEL: test13:416; X86:       # %bb.0: # %entry417; X86-NEXT:    addl $128, (%eax)418; X86-NEXT:    adcl $0, 4(%eax)419; X86-NEXT:    retl420;421; X64-LINUX-LABEL: test13:422; X64-LINUX:       # %bb.0: # %entry423; X64-LINUX-NEXT:    subq $-128, (%rdi)424; X64-LINUX-NEXT:    retq425;426; X64-WIN32-LABEL: test13:427; X64-WIN32:       # %bb.0: # %entry428; X64-WIN32-NEXT:    subq $-128, (%rcx)429; X64-WIN32-NEXT:    retq430entry:431  %aa = load i64, ptr %a432  %b = add i64 %aa, 128433  store i64 %b, ptr %a434  ret void435}436 437define i32 @inc_not(i32 %a) {438; X86-LABEL: inc_not:439; X86:       # %bb.0:440; X86-NEXT:    xorl %eax, %eax441; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax442; X86-NEXT:    retl443;444; X64-LINUX-LABEL: inc_not:445; X64-LINUX:       # %bb.0:446; X64-LINUX-NEXT:    movl %edi, %eax447; X64-LINUX-NEXT:    negl %eax448; X64-LINUX-NEXT:    retq449;450; X64-WIN32-LABEL: inc_not:451; X64-WIN32:       # %bb.0:452; X64-WIN32-NEXT:    movl %ecx, %eax453; X64-WIN32-NEXT:    negl %eax454; X64-WIN32-NEXT:    retq455  %nota = xor i32 %a, -1456  %r = add i32 %nota, 1457  ret i32 %r458}459 460define <4 x i32> @inc_not_vec(<4 x i32> %a) nounwind {461; X86-LABEL: inc_not_vec:462; X86:       # %bb.0:463; X86-NEXT:    pushl %edi464; X86-NEXT:    pushl %esi465; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax466; X86-NEXT:    xorl %ecx, %ecx467; X86-NEXT:    xorl %edx, %edx468; X86-NEXT:    subl {{[0-9]+}}(%esp), %edx469; X86-NEXT:    xorl %esi, %esi470; X86-NEXT:    subl {{[0-9]+}}(%esp), %esi471; X86-NEXT:    xorl %edi, %edi472; X86-NEXT:    subl {{[0-9]+}}(%esp), %edi473; X86-NEXT:    subl {{[0-9]+}}(%esp), %ecx474; X86-NEXT:    movl %ecx, 12(%eax)475; X86-NEXT:    movl %edi, 8(%eax)476; X86-NEXT:    movl %esi, 4(%eax)477; X86-NEXT:    movl %edx, (%eax)478; X86-NEXT:    popl %esi479; X86-NEXT:    popl %edi480; X86-NEXT:    retl $4481;482; X64-LINUX-LABEL: inc_not_vec:483; X64-LINUX:       # %bb.0:484; X64-LINUX-NEXT:    pxor %xmm1, %xmm1485; X64-LINUX-NEXT:    psubd %xmm0, %xmm1486; X64-LINUX-NEXT:    movdqa %xmm1, %xmm0487; X64-LINUX-NEXT:    retq488;489; X64-WIN32-LABEL: inc_not_vec:490; X64-WIN32:       # %bb.0:491; X64-WIN32-NEXT:    pxor %xmm0, %xmm0492; X64-WIN32-NEXT:    psubd (%rcx), %xmm0493; X64-WIN32-NEXT:    retq494  %nota = xor <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>495  %r = add <4 x i32> %nota, <i32 1, i32 1, i32 1, i32 1>496  ret <4 x i32> %r497}498 499define void @uaddo1_not(i32 %a, ptr %p0, ptr %p1) {500; X86-LABEL: uaddo1_not:501; X86:       # %bb.0:502; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax503; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx504; X86-NEXT:    xorl %edx, %edx505; X86-NEXT:    subl {{[0-9]+}}(%esp), %edx506; X86-NEXT:    movl %edx, (%ecx)507; X86-NEXT:    setae (%eax)508; X86-NEXT:    retl509;510; X64-LINUX-LABEL: uaddo1_not:511; X64-LINUX:       # %bb.0:512; X64-LINUX-NEXT:    negl %edi513; X64-LINUX-NEXT:    movl %edi, (%rsi)514; X64-LINUX-NEXT:    setae (%rdx)515; X64-LINUX-NEXT:    retq516;517; X64-WIN32-LABEL: uaddo1_not:518; X64-WIN32:       # %bb.0:519; X64-WIN32-NEXT:    negl %ecx520; X64-WIN32-NEXT:    movl %ecx, (%rdx)521; X64-WIN32-NEXT:    setae (%r8)522; X64-WIN32-NEXT:    retq523  %nota = xor i32 %a, -1524  %uaddo = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %nota, i32 1)525  %r0 = extractvalue {i32, i1} %uaddo, 0526  %r1 = extractvalue {i32, i1} %uaddo, 1527  store i32 %r0, ptr %p0528  store i1 %r1, ptr %p1529  ret void530}531 532define i32 @add_to_sub(i32 %a, i32 %b) {533; X86-LABEL: add_to_sub:534; X86:       # %bb.0:535; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax536; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax537; X86-NEXT:    retl538;539; X64-LINUX-LABEL: add_to_sub:540; X64-LINUX:       # %bb.0:541; X64-LINUX-NEXT:    movl %esi, %eax542; X64-LINUX-NEXT:    subl %edi, %eax543; X64-LINUX-NEXT:    retq544;545; X64-WIN32-LABEL: add_to_sub:546; X64-WIN32:       # %bb.0:547; X64-WIN32-NEXT:    movl %edx, %eax548; X64-WIN32-NEXT:    subl %ecx, %eax549; X64-WIN32-NEXT:    retq550  %nota = xor i32 %a, -1551  %add = add i32 %nota, %b552  %r = add i32 %add, 1553  ret i32 %r554}555 556declare dso_local void @bar_i32(i32)557declare dso_local void @bar_i64(i64)558 559; Make sure we can use sub -128 for add 128 when the flags are used.560define void @add_i32_128_flag(i32 %x) {561; X86-LABEL: add_i32_128_flag:562; X86:       # %bb.0: # %entry563; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax564; X86-NEXT:    subl $-128, %eax565; X86-NEXT:    je .LBB19_2566; X86-NEXT:  # %bb.1: # %if.then567; X86-NEXT:    pushl %eax568; X86-NEXT:    .cfi_adjust_cfa_offset 4569; X86-NEXT:    calll bar_i32570; X86-NEXT:    addl $4, %esp571; X86-NEXT:    .cfi_adjust_cfa_offset -4572; X86-NEXT:  .LBB19_2: # %if.end573; X86-NEXT:    retl574;575; X64-LINUX-LABEL: add_i32_128_flag:576; X64-LINUX:       # %bb.0: # %entry577; X64-LINUX-NEXT:    subl $-128, %edi578; X64-LINUX-NEXT:    jne bar_i32 # TAILCALL579; X64-LINUX-NEXT:  # %bb.1: # %if.end580; X64-LINUX-NEXT:    retq581;582; X64-WIN32-LABEL: add_i32_128_flag:583; X64-WIN32:       # %bb.0: # %entry584; X64-WIN32-NEXT:    subl $-128, %ecx585; X64-WIN32-NEXT:    jne bar_i32 # TAILCALL586; X64-WIN32-NEXT:  # %bb.1: # %if.end587; X64-WIN32-NEXT:    retq588entry:589  %add = add i32 %x, 128590  %tobool = icmp eq i32 %add, 0591  br i1 %tobool, label %if.end, label %if.then592 593if.then:594  tail call void @bar_i32(i32 %add)595  br label %if.end596 597if.end:598  ret void599}600 601; Make sure we can use sub -128 for add 128 when the flags are used.602define void @add_i64_128_flag(i64 %x) {603; X86-LABEL: add_i64_128_flag:604; X86:       # %bb.0: # %entry605; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx606; X86-NEXT:    movl $128, %eax607; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax608; X86-NEXT:    adcl $0, %ecx609; X86-NEXT:    movl %eax, %edx610; X86-NEXT:    orl %ecx, %edx611; X86-NEXT:    je .LBB20_2612; X86-NEXT:  # %bb.1: # %if.then613; X86-NEXT:    pushl %ecx614; X86-NEXT:    .cfi_adjust_cfa_offset 4615; X86-NEXT:    pushl %eax616; X86-NEXT:    .cfi_adjust_cfa_offset 4617; X86-NEXT:    calll bar_i64618; X86-NEXT:    addl $8, %esp619; X86-NEXT:    .cfi_adjust_cfa_offset -8620; X86-NEXT:  .LBB20_2: # %if.end621; X86-NEXT:    retl622;623; X64-LINUX-LABEL: add_i64_128_flag:624; X64-LINUX:       # %bb.0: # %entry625; X64-LINUX-NEXT:    subq $-128, %rdi626; X64-LINUX-NEXT:    jne bar_i64 # TAILCALL627; X64-LINUX-NEXT:  # %bb.1: # %if.end628; X64-LINUX-NEXT:    retq629;630; X64-WIN32-LABEL: add_i64_128_flag:631; X64-WIN32:       # %bb.0: # %entry632; X64-WIN32-NEXT:    subq $-128, %rcx633; X64-WIN32-NEXT:    jne bar_i64 # TAILCALL634; X64-WIN32-NEXT:  # %bb.1: # %if.end635; X64-WIN32-NEXT:    retq636entry:637  %add = add i64 %x, 128638  %tobool = icmp eq i64 %add, 0639  br i1 %tobool, label %if.end, label %if.then640 641if.then:642  tail call void @bar_i64(i64 %add)643  br label %if.end644 645if.end:646  ret void647}648 649; Make sure we can use sub -2147483648 for add 2147483648 when the flags are used.650define void @add_i64_2147483648_flag(i64 %x) {651; X86-LABEL: add_i64_2147483648_flag:652; X86:       # %bb.0: # %entry653; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx654; X86-NEXT:    movl $-2147483648, %eax # imm = 0x80000000655; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax656; X86-NEXT:    adcl $0, %ecx657; X86-NEXT:    movl %eax, %edx658; X86-NEXT:    orl %ecx, %edx659; X86-NEXT:    je .LBB21_2660; X86-NEXT:  # %bb.1: # %if.then661; X86-NEXT:    pushl %ecx662; X86-NEXT:    .cfi_adjust_cfa_offset 4663; X86-NEXT:    pushl %eax664; X86-NEXT:    .cfi_adjust_cfa_offset 4665; X86-NEXT:    calll bar_i64666; X86-NEXT:    addl $8, %esp667; X86-NEXT:    .cfi_adjust_cfa_offset -8668; X86-NEXT:  .LBB21_2: # %if.end669; X86-NEXT:    retl670;671; X64-LINUX-LABEL: add_i64_2147483648_flag:672; X64-LINUX:       # %bb.0: # %entry673; X64-LINUX-NEXT:    subq $-2147483648, %rdi # imm = 0x80000000674; X64-LINUX-NEXT:    jne bar_i64 # TAILCALL675; X64-LINUX-NEXT:  # %bb.1: # %if.end676; X64-LINUX-NEXT:    retq677;678; X64-WIN32-LABEL: add_i64_2147483648_flag:679; X64-WIN32:       # %bb.0: # %entry680; X64-WIN32-NEXT:    subq $-2147483648, %rcx # imm = 0x80000000681; X64-WIN32-NEXT:    jne bar_i64 # TAILCALL682; X64-WIN32-NEXT:  # %bb.1: # %if.end683; X64-WIN32-NEXT:    retq684entry:685  %add = add i64 %x, 2147483648686  %tobool = icmp eq i64 %add, 0687  br i1 %tobool, label %if.end, label %if.then688 689if.then:690  tail call void @bar_i64(i64 %add)691  br label %if.end692 693if.end:694  ret void695}696