brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.8 KiB · 616ab99 Raw
848 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-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,NOBMI4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefixes=X64,BMI5 6; InstCombine and DAGCombiner transform an 'add' into an 'or'7; if there are no common bits from the incoming operands.8; LEA instruction selection should be able to see through that9; transform and reduce add/shift/or instruction counts.10 11define i32 @or_shift1_and1(i32 %x, i32 %y) {12; X86-LABEL: or_shift1_and1:13; X86:       # %bb.0:14; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax15; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx16; X86-NEXT:    andl $1, %ecx17; X86-NEXT:    leal (%ecx,%eax,2), %eax18; X86-NEXT:    retl19;20; X64-LABEL: or_shift1_and1:21; X64:       # %bb.0:22; X64-NEXT:    # kill: def $esi killed $esi def $rsi23; X64-NEXT:    # kill: def $edi killed $edi def $rdi24; X64-NEXT:    andl $1, %esi25; X64-NEXT:    leal (%rsi,%rdi,2), %eax26; X64-NEXT:    retq27  %shl = shl i32 %x, 128  %and = and i32 %y, 129  %or = or i32 %and, %shl30  ret i32 %or31}32 33define i32 @or_shift1_and1_swapped(i32 %x, i32 %y) {34; X86-LABEL: or_shift1_and1_swapped:35; X86:       # %bb.0:36; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax37; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx38; X86-NEXT:    andl $1, %ecx39; X86-NEXT:    leal (%ecx,%eax,2), %eax40; X86-NEXT:    retl41;42; X64-LABEL: or_shift1_and1_swapped:43; X64:       # %bb.0:44; X64-NEXT:    # kill: def $esi killed $esi def $rsi45; X64-NEXT:    # kill: def $edi killed $edi def $rdi46; X64-NEXT:    andl $1, %esi47; X64-NEXT:    leal (%rsi,%rdi,2), %eax48; X64-NEXT:    retq49  %shl = shl i32 %x, 150  %and = and i32 %y, 151  %or = or i32 %shl, %and52  ret i32 %or53}54 55define i32 @or_shift2_and1(i32 %x, i32 %y) {56; X86-LABEL: or_shift2_and1:57; X86:       # %bb.0:58; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax59; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx60; X86-NEXT:    andl $1, %ecx61; X86-NEXT:    leal (%ecx,%eax,4), %eax62; X86-NEXT:    retl63;64; X64-LABEL: or_shift2_and1:65; X64:       # %bb.0:66; X64-NEXT:    # kill: def $esi killed $esi def $rsi67; X64-NEXT:    # kill: def $edi killed $edi def $rdi68; X64-NEXT:    andl $1, %esi69; X64-NEXT:    leal (%rsi,%rdi,4), %eax70; X64-NEXT:    retq71  %shl = shl i32 %x, 272  %and = and i32 %y, 173  %or = or i32 %shl, %and74  ret i32 %or75}76 77define i32 @or_shift3_and1(i32 %x, i32 %y) {78; X86-LABEL: or_shift3_and1:79; X86:       # %bb.0:80; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax81; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx82; X86-NEXT:    andl $1, %ecx83; X86-NEXT:    leal (%ecx,%eax,8), %eax84; X86-NEXT:    retl85;86; X64-LABEL: or_shift3_and1:87; X64:       # %bb.0:88; X64-NEXT:    # kill: def $esi killed $esi def $rsi89; X64-NEXT:    # kill: def $edi killed $edi def $rdi90; X64-NEXT:    andl $1, %esi91; X64-NEXT:    leal (%rsi,%rdi,8), %eax92; X64-NEXT:    retq93  %shl = shl i32 %x, 394  %and = and i32 %y, 195  %or = or i32 %shl, %and96  ret i32 %or97}98 99define i32 @or_shift3_and7(i32 %x, i32 %y) {100; X86-LABEL: or_shift3_and7:101; X86:       # %bb.0:102; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax103; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx104; X86-NEXT:    andl $7, %ecx105; X86-NEXT:    leal (%ecx,%eax,8), %eax106; X86-NEXT:    retl107;108; X64-LABEL: or_shift3_and7:109; X64:       # %bb.0:110; X64-NEXT:    # kill: def $esi killed $esi def $rsi111; X64-NEXT:    # kill: def $edi killed $edi def $rdi112; X64-NEXT:    andl $7, %esi113; X64-NEXT:    leal (%rsi,%rdi,8), %eax114; X64-NEXT:    retq115  %shl = shl i32 %x, 3116  %and = and i32 %y, 7117  %or = or i32 %shl, %and118  ret i32 %or119}120 121; The shift is too big for an LEA.122 123define i32 @or_shift4_and1(i32 %x, i32 %y) {124; X86-LABEL: or_shift4_and1:125; X86:       # %bb.0:126; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax127; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx128; X86-NEXT:    shll $4, %ecx129; X86-NEXT:    andl $1, %eax130; X86-NEXT:    orl %ecx, %eax131; X86-NEXT:    retl132;133; X64-LABEL: or_shift4_and1:134; X64:       # %bb.0:135; X64-NEXT:    # kill: def $esi killed $esi def $rsi136; X64-NEXT:    # kill: def $edi killed $edi def $rdi137; X64-NEXT:    shll $4, %edi138; X64-NEXT:    andl $1, %esi139; X64-NEXT:    leal (%rsi,%rdi), %eax140; X64-NEXT:    retq141  %shl = shl i32 %x, 4142  %and = and i32 %y, 1143  %or = or i32 %shl, %and144  ret i32 %or145}146 147; The mask is too big for the shift, so the 'or' isn't equivalent to an 'add'.148 149define i32 @or_shift3_and8(i32 %x, i32 %y) {150; X86-LABEL: or_shift3_and8:151; X86:       # %bb.0:152; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax153; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx154; X86-NEXT:    shll $3, %ecx155; X86-NEXT:    andl $8, %eax156; X86-NEXT:    orl %ecx, %eax157; X86-NEXT:    retl158;159; X64-LABEL: or_shift3_and8:160; X64:       # %bb.0:161; X64-NEXT:    # kill: def $edi killed $edi def $rdi162; X64-NEXT:    leal (,%rdi,8), %eax163; X64-NEXT:    andl $8, %esi164; X64-NEXT:    orl %esi, %eax165; X64-NEXT:    retq166  %shl = shl i32 %x, 3167  %and = and i32 %y, 8168  %or = or i32 %shl, %and169  ret i32 %or170}171 172; 64-bit operands should work too.173 174define i64 @or_shift1_and1_64(i64 %x, i64 %y) {175; X86-LABEL: or_shift1_and1_64:176; X86:       # %bb.0:177; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax178; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx179; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx180; X86-NEXT:    shldl $1, %ecx, %edx181; X86-NEXT:    andl $1, %eax182; X86-NEXT:    leal (%eax,%ecx,2), %eax183; X86-NEXT:    retl184;185; X64-LABEL: or_shift1_and1_64:186; X64:       # %bb.0:187; X64-NEXT:    andl $1, %esi188; X64-NEXT:    leaq (%rsi,%rdi,2), %rax189; X64-NEXT:    retq190  %shl = shl i64 %x, 1191  %and = and i64 %y, 1192  %or = or i64 %and, %shl193  ret i64 %or194}195 196; In the following patterns, lhs and rhs of the or instruction have no common bits.197 198define i32 @or_and_and_rhs_neg_i32(i32 %x, i32 %y, i32 %z) {199; X86-LABEL: or_and_and_rhs_neg_i32:200; X86:       # %bb.0: # %entry201; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx202; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax203; X86-NEXT:    xorl %ecx, %eax204; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax205; X86-NEXT:    xorl %ecx, %eax206; X86-NEXT:    incl %eax207; X86-NEXT:    retl208;209; NOBMI-LABEL: or_and_and_rhs_neg_i32:210; NOBMI:       # %bb.0: # %entry211; NOBMI-NEXT:    # kill: def $edx killed $edx def $rdx212; NOBMI-NEXT:    xorl %edi, %edx213; NOBMI-NEXT:    andl %esi, %edx214; NOBMI-NEXT:    xorl %edi, %edx215; NOBMI-NEXT:    leal 1(%rdx), %eax216; NOBMI-NEXT:    retq217;218; BMI-LABEL: or_and_and_rhs_neg_i32:219; BMI:       # %bb.0: # %entry220; BMI-NEXT:    # kill: def $edx killed $edx def $rdx221; BMI-NEXT:    andl %esi, %edx222; BMI-NEXT:    andnl %edi, %esi, %eax223; BMI-NEXT:    leal 1(%rdx,%rax), %eax224; BMI-NEXT:    retq225entry:226  %and1 = and i32 %z, %y227  %xor = xor i32 %y, -1228  %and2 = and i32 %x, %xor229  %or = or i32 %and1, %and2230  %inc = add i32 %or, 1231  ret i32 %inc232}233 234define i32 @or_and_and_lhs_neg_i32(i32 %x, i32 %y, i32 %z) {235; X86-LABEL: or_and_and_lhs_neg_i32:236; X86:       # %bb.0: # %entry237; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx238; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax239; X86-NEXT:    xorl %ecx, %eax240; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax241; X86-NEXT:    xorl %ecx, %eax242; X86-NEXT:    incl %eax243; X86-NEXT:    retl244;245; NOBMI-LABEL: or_and_and_lhs_neg_i32:246; NOBMI:       # %bb.0: # %entry247; NOBMI-NEXT:    # kill: def $edx killed $edx def $rdx248; NOBMI-NEXT:    xorl %edi, %edx249; NOBMI-NEXT:    andl %esi, %edx250; NOBMI-NEXT:    xorl %edi, %edx251; NOBMI-NEXT:    leal 1(%rdx), %eax252; NOBMI-NEXT:    retq253;254; BMI-LABEL: or_and_and_lhs_neg_i32:255; BMI:       # %bb.0: # %entry256; BMI-NEXT:    # kill: def $edx killed $edx def $rdx257; BMI-NEXT:    andl %esi, %edx258; BMI-NEXT:    andnl %edi, %esi, %eax259; BMI-NEXT:    leal 1(%rdx,%rax), %eax260; BMI-NEXT:    retq261entry:262  %and1 = and i32 %z, %y263  %xor = xor i32 %y, -1264  %and2 = and i32 %xor, %x265  %or = or i32 %and1, %and2266  %inc = add i32 %or, 1267  ret i32 %inc268}269 270define i32 @or_and_rhs_neg_and_i32(i32 %x, i32 %y, i32 %z) {271; X86-LABEL: or_and_rhs_neg_and_i32:272; X86:       # %bb.0: # %entry273; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx274; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax275; X86-NEXT:    xorl %ecx, %eax276; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax277; X86-NEXT:    xorl %ecx, %eax278; X86-NEXT:    incl %eax279; X86-NEXT:    retl280;281; NOBMI-LABEL: or_and_rhs_neg_and_i32:282; NOBMI:       # %bb.0: # %entry283; NOBMI-NEXT:    # kill: def $edi killed $edi def $rdi284; NOBMI-NEXT:    xorl %edx, %edi285; NOBMI-NEXT:    andl %esi, %edi286; NOBMI-NEXT:    xorl %edx, %edi287; NOBMI-NEXT:    leal 1(%rdi), %eax288; NOBMI-NEXT:    retq289;290; BMI-LABEL: or_and_rhs_neg_and_i32:291; BMI:       # %bb.0: # %entry292; BMI-NEXT:    # kill: def $edi killed $edi def $rdi293; BMI-NEXT:    andnl %edx, %esi, %eax294; BMI-NEXT:    andl %esi, %edi295; BMI-NEXT:    leal 1(%rax,%rdi), %eax296; BMI-NEXT:    retq297entry:298  %xor = xor i32 %y, -1299  %and1 = and i32 %z, %xor300  %and2 = and i32 %x, %y301  %or = or i32 %and1, %and2302  %inc = add i32 %or, 1303  ret i32 %inc304}305 306define i32 @or_and_lhs_neg_and_i32(i32 %x, i32 %y, i32 %z) {307; X86-LABEL: or_and_lhs_neg_and_i32:308; X86:       # %bb.0: # %entry309; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx310; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax311; X86-NEXT:    xorl %ecx, %eax312; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax313; X86-NEXT:    xorl %ecx, %eax314; X86-NEXT:    incl %eax315; X86-NEXT:    retl316;317; NOBMI-LABEL: or_and_lhs_neg_and_i32:318; NOBMI:       # %bb.0: # %entry319; NOBMI-NEXT:    # kill: def $edi killed $edi def $rdi320; NOBMI-NEXT:    xorl %edx, %edi321; NOBMI-NEXT:    andl %esi, %edi322; NOBMI-NEXT:    xorl %edx, %edi323; NOBMI-NEXT:    leal 1(%rdi), %eax324; NOBMI-NEXT:    retq325;326; BMI-LABEL: or_and_lhs_neg_and_i32:327; BMI:       # %bb.0: # %entry328; BMI-NEXT:    # kill: def $edi killed $edi def $rdi329; BMI-NEXT:    andnl %edx, %esi, %eax330; BMI-NEXT:    andl %esi, %edi331; BMI-NEXT:    leal 1(%rax,%rdi), %eax332; BMI-NEXT:    retq333entry:334  %xor = xor i32 %y, -1335  %and1 = and i32 %xor, %z336  %and2 = and i32 %x, %y337  %or = or i32 %and1, %and2338  %inc = add i32 %or, 1339  ret i32 %inc340}341 342define i64 @or_and_and_rhs_neg_i64(i64 %x, i64 %y, i64 %z) {343; X86-LABEL: or_and_and_rhs_neg_i64:344; X86:       # %bb.0: # %entry345; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx346; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax347; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx348; X86-NEXT:    xorl %eax, %edx349; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx350; X86-NEXT:    xorl %eax, %edx351; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax352; X86-NEXT:    xorl %ecx, %eax353; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax354; X86-NEXT:    xorl %ecx, %eax355; X86-NEXT:    addl $1, %eax356; X86-NEXT:    adcl $0, %edx357; X86-NEXT:    retl358;359; NOBMI-LABEL: or_and_and_rhs_neg_i64:360; NOBMI:       # %bb.0: # %entry361; NOBMI-NEXT:    xorq %rdi, %rdx362; NOBMI-NEXT:    andq %rsi, %rdx363; NOBMI-NEXT:    xorq %rdi, %rdx364; NOBMI-NEXT:    leaq 1(%rdx), %rax365; NOBMI-NEXT:    retq366;367; BMI-LABEL: or_and_and_rhs_neg_i64:368; BMI:       # %bb.0: # %entry369; BMI-NEXT:    andq %rsi, %rdx370; BMI-NEXT:    andnq %rdi, %rsi, %rax371; BMI-NEXT:    leaq 1(%rdx,%rax), %rax372; BMI-NEXT:    retq373entry:374  %and1 = and i64 %z, %y375  %xor = xor i64 %y, -1376  %and2 = and i64 %x, %xor377  %or = or i64 %and1, %and2378  %inc = add i64 %or, 1379  ret i64 %inc380}381 382define i64 @or_and_and_lhs_neg_i64(i64 %x, i64 %y, i64 %z) {383; X86-LABEL: or_and_and_lhs_neg_i64:384; X86:       # %bb.0: # %entry385; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx386; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax387; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx388; X86-NEXT:    xorl %eax, %edx389; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx390; X86-NEXT:    xorl %eax, %edx391; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax392; X86-NEXT:    xorl %ecx, %eax393; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax394; X86-NEXT:    xorl %ecx, %eax395; X86-NEXT:    addl $1, %eax396; X86-NEXT:    adcl $0, %edx397; X86-NEXT:    retl398;399; NOBMI-LABEL: or_and_and_lhs_neg_i64:400; NOBMI:       # %bb.0: # %entry401; NOBMI-NEXT:    xorq %rdi, %rdx402; NOBMI-NEXT:    andq %rsi, %rdx403; NOBMI-NEXT:    xorq %rdi, %rdx404; NOBMI-NEXT:    leaq 1(%rdx), %rax405; NOBMI-NEXT:    retq406;407; BMI-LABEL: or_and_and_lhs_neg_i64:408; BMI:       # %bb.0: # %entry409; BMI-NEXT:    andq %rsi, %rdx410; BMI-NEXT:    andnq %rdi, %rsi, %rax411; BMI-NEXT:    leaq 1(%rdx,%rax), %rax412; BMI-NEXT:    retq413entry:414  %and1 = and i64 %z, %y415  %xor = xor i64 %y, -1416  %and2 = and i64 %xor, %x417  %or = or i64 %and1, %and2418  %inc = add i64 %or, 1419  ret i64 %inc420}421 422define i64 @or_and_rhs_neg_and_i64(i64 %x, i64 %y, i64 %z) {423; X86-LABEL: or_and_rhs_neg_and_i64:424; X86:       # %bb.0: # %entry425; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx426; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax427; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx428; X86-NEXT:    xorl %eax, %edx429; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx430; X86-NEXT:    xorl %eax, %edx431; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax432; X86-NEXT:    xorl %ecx, %eax433; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax434; X86-NEXT:    xorl %ecx, %eax435; X86-NEXT:    addl $1, %eax436; X86-NEXT:    adcl $0, %edx437; X86-NEXT:    retl438;439; NOBMI-LABEL: or_and_rhs_neg_and_i64:440; NOBMI:       # %bb.0: # %entry441; NOBMI-NEXT:    xorq %rdx, %rdi442; NOBMI-NEXT:    andq %rsi, %rdi443; NOBMI-NEXT:    xorq %rdx, %rdi444; NOBMI-NEXT:    leaq 1(%rdi), %rax445; NOBMI-NEXT:    retq446;447; BMI-LABEL: or_and_rhs_neg_and_i64:448; BMI:       # %bb.0: # %entry449; BMI-NEXT:    andnq %rdx, %rsi, %rax450; BMI-NEXT:    andq %rsi, %rdi451; BMI-NEXT:    leaq 1(%rax,%rdi), %rax452; BMI-NEXT:    retq453entry:454  %xor = xor i64 %y, -1455  %and1 = and i64 %z, %xor456  %and2 = and i64 %x, %y457  %or = or i64 %and1, %and2458  %inc = add i64 %or, 1459  ret i64 %inc460}461 462define i64 @or_and_lhs_neg_and_i64(i64 %x, i64 %y, i64 %z) {463; X86-LABEL: or_and_lhs_neg_and_i64:464; X86:       # %bb.0: # %entry465; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx466; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax467; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx468; X86-NEXT:    xorl %eax, %edx469; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx470; X86-NEXT:    xorl %eax, %edx471; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax472; X86-NEXT:    xorl %ecx, %eax473; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax474; X86-NEXT:    xorl %ecx, %eax475; X86-NEXT:    addl $1, %eax476; X86-NEXT:    adcl $0, %edx477; X86-NEXT:    retl478;479; NOBMI-LABEL: or_and_lhs_neg_and_i64:480; NOBMI:       # %bb.0: # %entry481; NOBMI-NEXT:    xorq %rdx, %rdi482; NOBMI-NEXT:    andq %rsi, %rdi483; NOBMI-NEXT:    xorq %rdx, %rdi484; NOBMI-NEXT:    leaq 1(%rdi), %rax485; NOBMI-NEXT:    retq486;487; BMI-LABEL: or_and_lhs_neg_and_i64:488; BMI:       # %bb.0: # %entry489; BMI-NEXT:    andnq %rdx, %rsi, %rax490; BMI-NEXT:    andq %rsi, %rdi491; BMI-NEXT:    leaq 1(%rax,%rdi), %rax492; BMI-NEXT:    retq493entry:494  %xor = xor i64 %y, -1495  %and1 = and i64 %xor, %z496  %and2 = and i64 %x, %y497  %or = or i64 %and1, %and2498  %inc = add i64 %or, 1499  ret i64 %inc500}501 502define i32 @or_sext1(i32 %x) {503; X86-LABEL: or_sext1:504; X86:       # %bb.0:505; X86-NEXT:    xorl %eax, %eax506; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)507; X86-NEXT:    setl %al508; X86-NEXT:    leal -1(%eax,%eax), %eax509; X86-NEXT:    retl510;511; X64-LABEL: or_sext1:512; X64:       # %bb.0:513; X64-NEXT:    xorl %eax, %eax514; X64-NEXT:    cmpl $43, %edi515; X64-NEXT:    setl %al516; X64-NEXT:    leal -1(%rax,%rax), %eax517; X64-NEXT:    retq518  %cmp = icmp sgt i32 %x, 42519  %sext = sext i1 %cmp to i32520  %or = or i32 %sext, 1521  ret i32 %or522}523 524define i64 @or_sext1_64(i64 %x) {525; X86-LABEL: or_sext1_64:526; X86:       # %bb.0:527; X86-NEXT:    xorl %eax, %eax528; X86-NEXT:    movl $42, %ecx529; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx530; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax531; X86-NEXT:    setl %al532; X86-NEXT:    movzbl %al, %edx533; X86-NEXT:    negl %edx534; X86-NEXT:    movl %edx, %eax535; X86-NEXT:    orl $1, %eax536; X86-NEXT:    retl537;538; X64-LABEL: or_sext1_64:539; X64:       # %bb.0:540; X64-NEXT:    xorl %eax, %eax541; X64-NEXT:    cmpq $43, %rdi542; X64-NEXT:    setl %al543; X64-NEXT:    leaq -1(%rax,%rax), %rax544; X64-NEXT:    retq545  %cmp = icmp sgt i64 %x, 42546  %sext = sext i1 %cmp to i64547  %or = or i64 %sext, 1548  ret i64 %or549}550 551define i32 @or_sext2(i32 %x) {552; X86-LABEL: or_sext2:553; X86:       # %bb.0:554; X86-NEXT:    xorl %eax, %eax555; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)556; X86-NEXT:    setl %al557; X86-NEXT:    leal -1(%eax,%eax,2), %eax558; X86-NEXT:    retl559;560; X64-LABEL: or_sext2:561; X64:       # %bb.0:562; X64-NEXT:    xorl %eax, %eax563; X64-NEXT:    cmpl $43, %edi564; X64-NEXT:    setl %al565; X64-NEXT:    leal -1(%rax,%rax,2), %eax566; X64-NEXT:    retq567  %cmp = icmp sgt i32 %x, 42568  %sext = sext i1 %cmp to i32569  %or = or i32 %sext, 2570  ret i32 %or571}572 573define i64 @or_sext2_64(i64 %x) {574; X86-LABEL: or_sext2_64:575; X86:       # %bb.0:576; X86-NEXT:    xorl %eax, %eax577; X86-NEXT:    movl $42, %ecx578; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx579; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax580; X86-NEXT:    setl %al581; X86-NEXT:    movzbl %al, %edx582; X86-NEXT:    negl %edx583; X86-NEXT:    movl %edx, %eax584; X86-NEXT:    orl $2, %eax585; X86-NEXT:    retl586;587; X64-LABEL: or_sext2_64:588; X64:       # %bb.0:589; X64-NEXT:    xorl %eax, %eax590; X64-NEXT:    cmpq $43, %rdi591; X64-NEXT:    setl %al592; X64-NEXT:    leaq -1(%rax,%rax,2), %rax593; X64-NEXT:    retq594  %cmp = icmp sgt i64 %x, 42595  %sext = sext i1 %cmp to i64596  %or = or i64 %sext, 2597  ret i64 %or598}599 600define i32 @or_sext3(i32 %x) {601; X86-LABEL: or_sext3:602; X86:       # %bb.0:603; X86-NEXT:    xorl %eax, %eax604; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)605; X86-NEXT:    setl %al606; X86-NEXT:    leal -1(,%eax,4), %eax607; X86-NEXT:    retl608;609; X64-LABEL: or_sext3:610; X64:       # %bb.0:611; X64-NEXT:    xorl %eax, %eax612; X64-NEXT:    cmpl $43, %edi613; X64-NEXT:    setl %al614; X64-NEXT:    leal -1(,%rax,4), %eax615; X64-NEXT:    retq616  %cmp = icmp sgt i32 %x, 42617  %sext = sext i1 %cmp to i32618  %or = or i32 %sext, 3619  ret i32 %or620}621 622define i64 @or_sext3_64(i64 %x) {623; X86-LABEL: or_sext3_64:624; X86:       # %bb.0:625; X86-NEXT:    xorl %eax, %eax626; X86-NEXT:    movl $42, %ecx627; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx628; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax629; X86-NEXT:    setl %al630; X86-NEXT:    movzbl %al, %edx631; X86-NEXT:    negl %edx632; X86-NEXT:    movl %edx, %eax633; X86-NEXT:    orl $3, %eax634; X86-NEXT:    retl635;636; X64-LABEL: or_sext3_64:637; X64:       # %bb.0:638; X64-NEXT:    xorl %eax, %eax639; X64-NEXT:    cmpq $43, %rdi640; X64-NEXT:    setl %al641; X64-NEXT:    leaq -1(,%rax,4), %rax642; X64-NEXT:    retq643  %cmp = icmp sgt i64 %x, 42644  %sext = sext i1 %cmp to i64645  %or = or i64 %sext, 3646  ret i64 %or647}648 649define i32 @or_sext4(i32 %x) {650; X86-LABEL: or_sext4:651; X86:       # %bb.0:652; X86-NEXT:    xorl %eax, %eax653; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)654; X86-NEXT:    setl %al655; X86-NEXT:    leal -1(%eax,%eax,4), %eax656; X86-NEXT:    retl657;658; X64-LABEL: or_sext4:659; X64:       # %bb.0:660; X64-NEXT:    xorl %eax, %eax661; X64-NEXT:    cmpl $43, %edi662; X64-NEXT:    setl %al663; X64-NEXT:    leal -1(%rax,%rax,4), %eax664; X64-NEXT:    retq665  %cmp = icmp sgt i32 %x, 42666  %sext = sext i1 %cmp to i32667  %or = or i32 %sext, 4668  ret i32 %or669}670 671define i64 @or_sext4_64(i64 %x) {672; X86-LABEL: or_sext4_64:673; X86:       # %bb.0:674; X86-NEXT:    xorl %eax, %eax675; X86-NEXT:    movl $42, %ecx676; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx677; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax678; X86-NEXT:    setl %al679; X86-NEXT:    movzbl %al, %edx680; X86-NEXT:    negl %edx681; X86-NEXT:    movl %edx, %eax682; X86-NEXT:    orl $4, %eax683; X86-NEXT:    retl684;685; X64-LABEL: or_sext4_64:686; X64:       # %bb.0:687; X64-NEXT:    xorl %eax, %eax688; X64-NEXT:    cmpq $43, %rdi689; X64-NEXT:    setl %al690; X64-NEXT:    leaq -1(%rax,%rax,4), %rax691; X64-NEXT:    retq692  %cmp = icmp sgt i64 %x, 42693  %sext = sext i1 %cmp to i64694  %or = or i64 %sext, 4695  ret i64 %or696}697 698define i32 @or_sext7(i32 %x) {699; X86-LABEL: or_sext7:700; X86:       # %bb.0:701; X86-NEXT:    xorl %eax, %eax702; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)703; X86-NEXT:    setl %al704; X86-NEXT:    leal -1(,%eax,8), %eax705; X86-NEXT:    retl706;707; X64-LABEL: or_sext7:708; X64:       # %bb.0:709; X64-NEXT:    xorl %eax, %eax710; X64-NEXT:    cmpl $43, %edi711; X64-NEXT:    setl %al712; X64-NEXT:    leal -1(,%rax,8), %eax713; X64-NEXT:    retq714  %cmp = icmp sgt i32 %x, 42715  %sext = sext i1 %cmp to i32716  %or = or i32 %sext, 7717  ret i32 %or718}719 720define i64 @or_sext7_64(i64 %x) {721; X86-LABEL: or_sext7_64:722; X86:       # %bb.0:723; X86-NEXT:    xorl %eax, %eax724; X86-NEXT:    movl $42, %ecx725; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx726; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax727; X86-NEXT:    setl %al728; X86-NEXT:    movzbl %al, %edx729; X86-NEXT:    negl %edx730; X86-NEXT:    movl %edx, %eax731; X86-NEXT:    orl $7, %eax732; X86-NEXT:    retl733;734; X64-LABEL: or_sext7_64:735; X64:       # %bb.0:736; X64-NEXT:    xorl %eax, %eax737; X64-NEXT:    cmpq $43, %rdi738; X64-NEXT:    setl %al739; X64-NEXT:    leaq -1(,%rax,8), %rax740; X64-NEXT:    retq741  %cmp = icmp sgt i64 %x, 42742  %sext = sext i1 %cmp to i64743  %or = or i64 %sext, 7744  ret i64 %or745}746 747define i32 @or_sext8(i32 %x) {748; X86-LABEL: or_sext8:749; X86:       # %bb.0:750; X86-NEXT:    xorl %eax, %eax751; X86-NEXT:    cmpl $43, {{[0-9]+}}(%esp)752; X86-NEXT:    setl %al753; X86-NEXT:    leal -1(%eax,%eax,8), %eax754; X86-NEXT:    retl755;756; X64-LABEL: or_sext8:757; X64:       # %bb.0:758; X64-NEXT:    xorl %eax, %eax759; X64-NEXT:    cmpl $43, %edi760; X64-NEXT:    setl %al761; X64-NEXT:    leal -1(%rax,%rax,8), %eax762; X64-NEXT:    retq763  %cmp = icmp sgt i32 %x, 42764  %sext = sext i1 %cmp to i32765  %or = or i32 %sext, 8766  ret i32 %or767}768 769define i64 @or_sext8_64(i64 %x) {770; X86-LABEL: or_sext8_64:771; X86:       # %bb.0:772; X86-NEXT:    xorl %eax, %eax773; X86-NEXT:    movl $42, %ecx774; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx775; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax776; X86-NEXT:    setl %al777; X86-NEXT:    movzbl %al, %edx778; X86-NEXT:    negl %edx779; X86-NEXT:    movl %edx, %eax780; X86-NEXT:    orl $8, %eax781; X86-NEXT:    retl782;783; X64-LABEL: or_sext8_64:784; X64:       # %bb.0:785; X64-NEXT:    xorl %eax, %eax786; X64-NEXT:    cmpq $43, %rdi787; X64-NEXT:    setl %al788; X64-NEXT:    leaq -1(%rax,%rax,8), %rax789; X64-NEXT:    retq790  %cmp = icmp sgt i64 %x, 42791  %sext = sext i1 %cmp to i64792  %or = or i64 %sext, 8793  ret i64 %or794}795 796define i64 @or_large_constant(i64 %x) {797; X86-LABEL: or_large_constant:798; X86:       # %bb.0: # %entry799; X86-NEXT:    xorl %edx, %edx800; X86-NEXT:    movl $1, %eax801; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax802; X86-NEXT:    movl $0, %eax803; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax804; X86-NEXT:    setl %al805; X86-NEXT:    movzbl %al, %eax806; X86-NEXT:    negl %eax807; X86-NEXT:    sbbl %edx, %edx808; X86-NEXT:    orl $1, %eax809; X86-NEXT:    orl $128, %edx810; X86-NEXT:    retl811;812; X64-LABEL: or_large_constant:813; X64:       # %bb.0: # %entry814; X64-NEXT:    xorl %ecx, %ecx815; X64-NEXT:    cmpq $2, %rdi816; X64-NEXT:    setge %cl817; X64-NEXT:    negq %rcx818; X64-NEXT:    movabsq $549755813889, %rax # imm = 0x8000000001819; X64-NEXT:    orq %rcx, %rax820; X64-NEXT:    retq821entry:822  %cmp = icmp sgt i64 %x, 1823  %zext = zext i1 %cmp to i64824  %sub = sub i64 0, %zext825  %or = or i64 %sub, 549755813889   ; 0x8000000001826  ret i64 %or827}828 829define i32 @or_shift1_disjoint(i32 %x, i32 %y) {830; X86-LABEL: or_shift1_disjoint:831; X86:       # %bb.0:832; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax833; X86-NEXT:    addl %eax, %eax834; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax835; X86-NEXT:    retl836;837; X64-LABEL: or_shift1_disjoint:838; X64:       # %bb.0:839; X64-NEXT:    # kill: def $esi killed $esi def $rsi840; X64-NEXT:    # kill: def $edi killed $edi def $rdi841; X64-NEXT:    leal (%rsi,%rdi,2), %eax842; X64-NEXT:    retq843  %shl = shl i32 %x, 1844  %or = or disjoint i32 %y, %shl845  ret i32 %or846}847 848