brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.7 KiB · 019bca7 Raw
860 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK3 4; Use common transform of:5; (X & Y) == Y -> (X & Y) != 0 iff Y is non-zero power of 2 to test.6; (X & Y) != Y -> (X & Y) == 0 iff Y is non-zero power of 2 to test.7 8declare i32 @llvm.umin.i32(i32, i32)9declare i32 @llvm.umax.i32(i32, i32)10declare i32 @llvm.smin.i32(i32, i32)11declare i32 @llvm.smax.i32(i32, i32)12declare i32 @llvm.fshl.i32(i32, i32, i32)13declare i32 @llvm.fshr.i32(i32, i32, i32)14 15define <4 x i32> @pow2_non_splat_vec(<4 x i32> %x) {16; CHECK-LABEL: pow2_non_splat_vec:17; CHECK:       # %bb.0:18; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm019; CHECK-NEXT:    retq20  %r = urem <4 x i32> %x, <i32 8, i32 4, i32 16, i32 64>21  ret <4 x i32> %r22}23 24define <4 x i32> @pow2_non_splat_vec_fail0(<4 x i32> %x) {25; CHECK-LABEL: pow2_non_splat_vec_fail0:26; CHECK:       # %bb.0:27; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [954437177,1073741824,268435456,67108864]28; CHECK-NEXT:    pmuludq %xmm0, %xmm129; CHECK-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]30; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]31; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [1073741824,u,67108864,u]32; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]33; CHECK-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]34; CHECK-NEXT:    movdqa %xmm1, %xmm335; CHECK-NEXT:    psrld $1, %xmm336; CHECK-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,3]37; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [9,4,16,64]38; CHECK-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]39; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]40; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,u,64,u]41; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]42; CHECK-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]43; CHECK-NEXT:    psubd %xmm1, %xmm044; CHECK-NEXT:    retq45  %r = urem <4 x i32> %x, <i32 9, i32 4, i32 16, i32 64>46  ret <4 x i32> %r47}48 49define i1 @pow2_shl(i32 %x, i32 %y) {50; CHECK-LABEL: pow2_shl:51; CHECK:       # %bb.0:52; CHECK-NEXT:    movl %esi, %ecx53; CHECK-NEXT:    movl %edi, %eax54; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx55; CHECK-NEXT:    shrl %cl, %eax56; CHECK-NEXT:    andl $4, %eax57; CHECK-NEXT:    shrl $2, %eax58; CHECK-NEXT:    # kill: def $al killed $al killed $eax59; CHECK-NEXT:    retq60  %d = shl nuw nsw i32 4, %y61  %and = and i32 %x, %d62  %r = icmp eq i32 %and, %d63  ret i1 %r64}65 66define i1 @pow2_shl_fail0(i32 %x, i32 %y) {67; CHECK-LABEL: pow2_shl_fail0:68; CHECK:       # %bb.0:69; CHECK-NEXT:    movl %esi, %ecx70; CHECK-NEXT:    notl %edi71; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx72; CHECK-NEXT:    shrl %cl, %edi73; CHECK-NEXT:    testb $3, %dil74; CHECK-NEXT:    sete %al75; CHECK-NEXT:    retq76  %d = shl i32 3, %y77  %and = and i32 %x, %d78  %r = icmp eq i32 %and, %d79  ret i1 %r80}81 82define i1 @pow2_shl_fail1(i32 %x, i32 %y) {83; CHECK-LABEL: pow2_shl_fail1:84; CHECK:       # %bb.0:85; CHECK-NEXT:    movl %esi, %ecx86; CHECK-NEXT:    notl %edi87; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx88; CHECK-NEXT:    shrl %cl, %edi89; CHECK-NEXT:    testb $4, %dil90; CHECK-NEXT:    sete %al91; CHECK-NEXT:    retq92  %d = shl i32 4, %y93  %and = and i32 %x, %d94  %r = icmp eq i32 %and, %d95  ret i1 %r96}97 98define i1 @pow2_srl(i32 %x, i32 %y) {99; CHECK-LABEL: pow2_srl:100; CHECK:       # %bb.0:101; CHECK-NEXT:    movl %esi, %ecx102; CHECK-NEXT:    movl %edi, %eax103; CHECK-NEXT:    andb $7, %cl104; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx105; CHECK-NEXT:    shll %cl, %eax106; CHECK-NEXT:    shrl $20, %eax107; CHECK-NEXT:    andl $1, %eax108; CHECK-NEXT:    # kill: def $al killed $al killed $eax109; CHECK-NEXT:    retq110  %yy = and i32 %y, 7111  %d = lshr i32 1048576, %yy112  %and = and i32 %x, %d113  %r = icmp eq i32 %and, %d114  ret i1 %r115}116 117define i1 @pow2_srl_fail0(i32 %x, i32 %y) {118; CHECK-LABEL: pow2_srl_fail0:119; CHECK:       # %bb.0:120; CHECK-NEXT:    movl %esi, %ecx121; CHECK-NEXT:    andb $30, %cl122; CHECK-NEXT:    notl %edi123; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx124; CHECK-NEXT:    shll %cl, %edi125; CHECK-NEXT:    testl $1048576, %edi # imm = 0x100000126; CHECK-NEXT:    sete %al127; CHECK-NEXT:    retq128  %yy = and i32 %y, 30129  %d = lshr i32 1048576, %yy130  %and = and i32 %x, %d131  %r = icmp eq i32 %and, %d132  ret i1 %r133}134 135define i1 @pow2_srl_fail1(i32 %x, i32 %y) {136; CHECK-LABEL: pow2_srl_fail1:137; CHECK:       # %bb.0:138; CHECK-NEXT:    movl %esi, %ecx139; CHECK-NEXT:    andb $7, %cl140; CHECK-NEXT:    notl %edi141; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx142; CHECK-NEXT:    shll %cl, %edi143; CHECK-NEXT:    testl $1048577, %edi # imm = 0x100001144; CHECK-NEXT:    sete %al145; CHECK-NEXT:    retq146  %yy = and i32 %y, 7147  %d = lshr i32 1048577, %yy148  %and = and i32 %x, %d149  %r = icmp eq i32 %and, %d150  ret i1 %r151}152 153define i1 @pow2_rotl(i32 %x, i32 %y) {154; CHECK-LABEL: pow2_rotl:155; CHECK:       # %bb.0:156; CHECK-NEXT:    movl %esi, %ecx157; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000158; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx159; CHECK-NEXT:    roll %cl, %eax160; CHECK-NEXT:    testl %eax, %edi161; CHECK-NEXT:    setne %al162; CHECK-NEXT:    retq163  %d = call i32 @llvm.fshl.i32(i32 1048576, i32 1048576, i32 %y)164  %and = and i32 %x, %d165  %r = icmp eq i32 %and, %d166  ret i1 %r167}168 169define i1 @pow2_rotl_fail0(i32 %x, i32 %y) {170; CHECK-LABEL: pow2_rotl_fail0:171; CHECK:       # %bb.0:172; CHECK-NEXT:    movl %esi, %ecx173; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000174; CHECK-NEXT:    movl $512, %edx # imm = 0x200175; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx176; CHECK-NEXT:    shldl %cl, %eax, %edx177; CHECK-NEXT:    notl %edi178; CHECK-NEXT:    testl %edi, %edx179; CHECK-NEXT:    sete %al180; CHECK-NEXT:    retq181  %d = call i32 @llvm.fshl.i32(i32 512, i32 1048576, i32 %y)182  %and = and i32 %x, %d183  %r = icmp eq i32 %and, %d184  ret i1 %r185}186 187define i1 @pow2_rotl_fail1(i32 %x, i32 %y) {188; CHECK-LABEL: pow2_rotl_fail1:189; CHECK:       # %bb.0:190; CHECK-NEXT:    movl %esi, %ecx191; CHECK-NEXT:    movl $511, %eax # imm = 0x1FF192; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx193; CHECK-NEXT:    roll %cl, %eax194; CHECK-NEXT:    notl %edi195; CHECK-NEXT:    testl %edi, %eax196; CHECK-NEXT:    sete %al197; CHECK-NEXT:    retq198  %d = call i32 @llvm.fshl.i32(i32 511, i32 511, i32 %y)199  %and = and i32 %x, %d200  %r = icmp eq i32 %and, %d201  ret i1 %r202}203 204define i1 @pow2_rotr(i32 %x, i32 %y) {205; CHECK-LABEL: pow2_rotr:206; CHECK:       # %bb.0:207; CHECK-NEXT:    movl %esi, %ecx208; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000209; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx210; CHECK-NEXT:    rorl %cl, %eax211; CHECK-NEXT:    testl %eax, %edi212; CHECK-NEXT:    setne %al213; CHECK-NEXT:    retq214  %d = call i32 @llvm.fshr.i32(i32 1048576, i32 1048576, i32 %y)215  %and = and i32 %x, %d216  %r = icmp eq i32 %and, %d217  ret i1 %r218}219 220define i1 @pow2_rotr_fail0(i32 %x, i32 %y) {221; CHECK-LABEL: pow2_rotr_fail0:222; CHECK:       # %bb.0:223; CHECK-NEXT:    movl %esi, %ecx224; CHECK-NEXT:    movl $512, %eax # imm = 0x200225; CHECK-NEXT:    movl $1048576, %edx # imm = 0x100000226; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx227; CHECK-NEXT:    shrdl %cl, %eax, %edx228; CHECK-NEXT:    notl %edi229; CHECK-NEXT:    testl %edi, %edx230; CHECK-NEXT:    sete %al231; CHECK-NEXT:    retq232  %d = call i32 @llvm.fshr.i32(i32 512, i32 1048576, i32 %y)233  %and = and i32 %x, %d234  %r = icmp eq i32 %and, %d235  ret i1 %r236}237 238define i1 @pow2_rotr_fail1(i32 %x, i32 %y) {239; CHECK-LABEL: pow2_rotr_fail1:240; CHECK:       # %bb.0:241; CHECK-NEXT:    movl %esi, %ecx242; CHECK-NEXT:    movl $511, %eax # imm = 0x1FF243; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx244; CHECK-NEXT:    rorl %cl, %eax245; CHECK-NEXT:    notl %edi246; CHECK-NEXT:    testl %edi, %eax247; CHECK-NEXT:    sete %al248; CHECK-NEXT:    retq249  %d = call i32 @llvm.fshr.i32(i32 511, i32 511, i32 %y)250  %and = and i32 %x, %d251  %r = icmp eq i32 %and, %d252  ret i1 %r253}254 255define i1 @pow2_umin(i32 %x, i32 %y) {256; CHECK-LABEL: pow2_umin:257; CHECK:       # %bb.0:258; CHECK-NEXT:    movl %esi, %ecx259; CHECK-NEXT:    movl $1, %eax260; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx261; CHECK-NEXT:    shll %cl, %eax262; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000263; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000264; CHECK-NEXT:    cmovbl %eax, %ecx265; CHECK-NEXT:    testl %ecx, %edi266; CHECK-NEXT:    setne %al267; CHECK-NEXT:    retq268  %yy = shl i32 1, %y269  %d = call i32 @llvm.umin.i32(i32 %yy, i32 262144)270  %and = and i32 %x, %d271  %r = icmp eq i32 %and, %d272  ret i1 %r273}274 275define i1 @pow2_umin_fail0(i32 %x, i32 %y) {276; CHECK-LABEL: pow2_umin_fail0:277; CHECK:       # %bb.0:278; CHECK-NEXT:    movl %esi, %ecx279; CHECK-NEXT:    movl $4, %eax280; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx281; CHECK-NEXT:    shll %cl, %eax282; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000283; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000284; CHECK-NEXT:    cmovbl %eax, %ecx285; CHECK-NEXT:    notl %edi286; CHECK-NEXT:    testl %edi, %ecx287; CHECK-NEXT:    sete %al288; CHECK-NEXT:    retq289  %yy = shl i32 4, %y290  %d = call i32 @llvm.umin.i32(i32 %yy, i32 262144)291  %and = and i32 %x, %d292  %r = icmp eq i32 %and, %d293  ret i1 %r294}295 296define i1 @pow2_umin_fail1(i32 %x, i32 %y) {297; CHECK-LABEL: pow2_umin_fail1:298; CHECK:       # %bb.0:299; CHECK-NEXT:    movl %esi, %ecx300; CHECK-NEXT:    movl $1, %eax301; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx302; CHECK-NEXT:    shll %cl, %eax303; CHECK-NEXT:    cmpl $12345, %eax # imm = 0x3039304; CHECK-NEXT:    movl $12345, %ecx # imm = 0x3039305; CHECK-NEXT:    cmovbl %eax, %ecx306; CHECK-NEXT:    notl %edi307; CHECK-NEXT:    testl %edi, %ecx308; CHECK-NEXT:    sete %al309; CHECK-NEXT:    retq310  %yy = shl i32 1, %y311  %d = call i32 @llvm.umin.i32(i32 %yy, i32 12345)312  %and = and i32 %x, %d313  %r = icmp eq i32 %and, %d314  ret i1 %r315}316 317define i1 @pow2_umax(i32 %x, i32 %y, i32 %z) {318; CHECK-LABEL: pow2_umax:319; CHECK:       # %bb.0:320; CHECK-NEXT:    movl %esi, %ecx321; CHECK-NEXT:    movl $1, %eax322; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx323; CHECK-NEXT:    shll %cl, %eax324; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000325; CHECK-NEXT:    movl %edx, %ecx326; CHECK-NEXT:    shrl %cl, %esi327; CHECK-NEXT:    cmpl %esi, %eax328; CHECK-NEXT:    cmoval %eax, %esi329; CHECK-NEXT:    testl %esi, %edi330; CHECK-NEXT:    setne %al331; CHECK-NEXT:    retq332  %yy = shl i32 1, %y333  %zz = lshr i32 2147483648, %z334  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)335  %and = and i32 %x, %d336  %r = icmp eq i32 %and, %d337  ret i1 %r338}339 340define i1 @pow2_umax_fail0(i32 %x, i32 %y, i32 %z) {341; CHECK-LABEL: pow2_umax_fail0:342; CHECK:       # %bb.0:343; CHECK-NEXT:    movl %esi, %ecx344; CHECK-NEXT:    movl $1, %eax345; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx346; CHECK-NEXT:    shll %cl, %eax347; CHECK-NEXT:    movl $1073741824, %esi # imm = 0x40000000348; CHECK-NEXT:    movl %edx, %ecx349; CHECK-NEXT:    shrl %cl, %esi350; CHECK-NEXT:    cmpl %esi, %eax351; CHECK-NEXT:    cmoval %eax, %esi352; CHECK-NEXT:    notl %edi353; CHECK-NEXT:    testl %edi, %esi354; CHECK-NEXT:    sete %al355; CHECK-NEXT:    retq356  %yy = shl i32 1, %y357  %zz = lshr i32 1073741824, %z358  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)359  %and = and i32 %x, %d360  %r = icmp eq i32 %and, %d361  ret i1 %r362}363 364define i1 @pow2_umax_fail1(i32 %x, i32 %y, i32 %z) {365; CHECK-LABEL: pow2_umax_fail1:366; CHECK:       # %bb.0:367; CHECK-NEXT:    movl %esi, %ecx368; CHECK-NEXT:    movl $4, %eax369; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx370; CHECK-NEXT:    shll %cl, %eax371; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000372; CHECK-NEXT:    movl %edx, %ecx373; CHECK-NEXT:    shrl %cl, %esi374; CHECK-NEXT:    cmpl %esi, %eax375; CHECK-NEXT:    cmoval %eax, %esi376; CHECK-NEXT:    notl %edi377; CHECK-NEXT:    testl %edi, %esi378; CHECK-NEXT:    sete %al379; CHECK-NEXT:    retq380  %yy = shl i32 4, %y381  %zz = lshr i32 2147483648, %z382  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)383  %and = and i32 %x, %d384  %r = icmp eq i32 %and, %d385  ret i1 %r386}387 388define i1 @pow2_smin(i32 %x, i32 %y) {389; CHECK-LABEL: pow2_smin:390; CHECK:       # %bb.0:391; CHECK-NEXT:    movl %esi, %ecx392; CHECK-NEXT:    movl $1, %eax393; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx394; CHECK-NEXT:    shll %cl, %eax395; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000396; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000397; CHECK-NEXT:    cmovll %eax, %ecx398; CHECK-NEXT:    testl %ecx, %edi399; CHECK-NEXT:    setne %al400; CHECK-NEXT:    retq401  %yy = shl i32 1, %y402  %d = call i32 @llvm.smin.i32(i32 %yy, i32 262144)403  %and = and i32 %x, %d404  %r = icmp eq i32 %and, %d405  ret i1 %r406}407 408define i1 @pow2_smin_fail0(i32 %x, i32 %y) {409; CHECK-LABEL: pow2_smin_fail0:410; CHECK:       # %bb.0:411; CHECK-NEXT:    movl %esi, %ecx412; CHECK-NEXT:    movl $4, %eax413; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx414; CHECK-NEXT:    shll %cl, %eax415; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000416; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000417; CHECK-NEXT:    cmovll %eax, %ecx418; CHECK-NEXT:    notl %edi419; CHECK-NEXT:    testl %edi, %ecx420; CHECK-NEXT:    sete %al421; CHECK-NEXT:    retq422  %yy = shl i32 4, %y423  %d = call i32 @llvm.smin.i32(i32 %yy, i32 262144)424  %and = and i32 %x, %d425  %r = icmp eq i32 %and, %d426  ret i1 %r427}428 429define i1 @pow2_smin_fail1(i32 %x, i32 %y) {430; CHECK-LABEL: pow2_smin_fail1:431; CHECK:       # %bb.0:432; CHECK-NEXT:    movl %esi, %ecx433; CHECK-NEXT:    movl $1, %eax434; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx435; CHECK-NEXT:    shll %cl, %eax436; CHECK-NEXT:    cmpl $12345, %eax # imm = 0x3039437; CHECK-NEXT:    movl $12345, %ecx # imm = 0x3039438; CHECK-NEXT:    cmovll %eax, %ecx439; CHECK-NEXT:    notl %edi440; CHECK-NEXT:    testl %edi, %ecx441; CHECK-NEXT:    sete %al442; CHECK-NEXT:    retq443  %yy = shl i32 1, %y444  %d = call i32 @llvm.smin.i32(i32 %yy, i32 12345)445  %and = and i32 %x, %d446  %r = icmp eq i32 %and, %d447  ret i1 %r448}449 450define i1 @pow2_smax(i32 %x, i32 %y, i32 %z) {451; CHECK-LABEL: pow2_smax:452; CHECK:       # %bb.0:453; CHECK-NEXT:    movl %esi, %ecx454; CHECK-NEXT:    movl $1, %eax455; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx456; CHECK-NEXT:    shll %cl, %eax457; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000458; CHECK-NEXT:    movl %edx, %ecx459; CHECK-NEXT:    shrl %cl, %esi460; CHECK-NEXT:    cmpl %esi, %eax461; CHECK-NEXT:    cmovgl %eax, %esi462; CHECK-NEXT:    testl %esi, %edi463; CHECK-NEXT:    setne %al464; CHECK-NEXT:    retq465  %yy = shl i32 1, %y466  %zz = lshr i32 2147483648, %z467  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)468  %and = and i32 %x, %d469  %r = icmp eq i32 %and, %d470  ret i1 %r471}472 473define i1 @pow2_smax_fail0(i32 %x, i32 %y, i32 %z) {474; CHECK-LABEL: pow2_smax_fail0:475; CHECK:       # %bb.0:476; CHECK-NEXT:    movl %esi, %ecx477; CHECK-NEXT:    movl $1, %eax478; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx479; CHECK-NEXT:    shll %cl, %eax480; CHECK-NEXT:    movl $1073741824, %esi # imm = 0x40000000481; CHECK-NEXT:    movl %edx, %ecx482; CHECK-NEXT:    shrl %cl, %esi483; CHECK-NEXT:    cmpl %esi, %eax484; CHECK-NEXT:    cmovgl %eax, %esi485; CHECK-NEXT:    notl %edi486; CHECK-NEXT:    testl %edi, %esi487; CHECK-NEXT:    sete %al488; CHECK-NEXT:    retq489  %yy = shl i32 1, %y490  %zz = lshr i32 1073741824, %z491  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)492  %and = and i32 %x, %d493  %r = icmp eq i32 %and, %d494  ret i1 %r495}496 497define i1 @pow2_smax_fail1(i32 %x, i32 %y, i32 %z) {498; CHECK-LABEL: pow2_smax_fail1:499; CHECK:       # %bb.0:500; CHECK-NEXT:    movl %esi, %ecx501; CHECK-NEXT:    movl $4, %eax502; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx503; CHECK-NEXT:    shll %cl, %eax504; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000505; CHECK-NEXT:    movl %edx, %ecx506; CHECK-NEXT:    shrl %cl, %esi507; CHECK-NEXT:    cmpl %esi, %eax508; CHECK-NEXT:    cmovgl %eax, %esi509; CHECK-NEXT:    notl %edi510; CHECK-NEXT:    testl %edi, %esi511; CHECK-NEXT:    sete %al512; CHECK-NEXT:    retq513  %yy = shl i32 4, %y514  %zz = lshr i32 2147483648, %z515  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)516  %and = and i32 %x, %d517  %r = icmp eq i32 %and, %d518  ret i1 %r519}520 521define i1 @pow2_select(i1 %c, i32 %x, i32 %y, i32 %z) {522; CHECK-LABEL: pow2_select:523; CHECK:       # %bb.0:524; CHECK-NEXT:    movl %ecx, %eax525; CHECK-NEXT:    movl %edx, %ecx526; CHECK-NEXT:    movl $1, %edx527; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx528; CHECK-NEXT:    shll %cl, %edx529; CHECK-NEXT:    movl $-2147483648, %r8d # imm = 0x80000000530; CHECK-NEXT:    movl %eax, %ecx531; CHECK-NEXT:    shrl %cl, %r8d532; CHECK-NEXT:    testb $1, %dil533; CHECK-NEXT:    cmovnel %edx, %r8d534; CHECK-NEXT:    testl %r8d, %esi535; CHECK-NEXT:    setne %al536; CHECK-NEXT:    retq537  %yy = shl i32 1, %y538  %zz = lshr i32 2147483648, %z539  %d = select i1 %c, i32 %yy, i32 %zz540  %and = and i32 %x, %d541  %r = icmp eq i32 %and, %d542  ret i1 %r543}544 545define i1 @pow2_select_fail0(i1 %c, i32 %x, i32 %y, i32 %z) {546; CHECK-LABEL: pow2_select_fail0:547; CHECK:       # %bb.0:548; CHECK-NEXT:    movl %ecx, %eax549; CHECK-NEXT:    movl %edx, %ecx550; CHECK-NEXT:    movl $1, %edx551; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx552; CHECK-NEXT:    shll %cl, %edx553; CHECK-NEXT:    movl $1073741824, %r8d # imm = 0x40000000554; CHECK-NEXT:    movl %eax, %ecx555; CHECK-NEXT:    shrl %cl, %r8d556; CHECK-NEXT:    testb $1, %dil557; CHECK-NEXT:    cmovnel %edx, %r8d558; CHECK-NEXT:    notl %esi559; CHECK-NEXT:    testl %esi, %r8d560; CHECK-NEXT:    sete %al561; CHECK-NEXT:    retq562  %yy = shl i32 1, %y563  %zz = lshr i32 1073741824, %z564  %d = select i1 %c, i32 %yy, i32 %zz565  %and = and i32 %x, %d566  %r = icmp eq i32 %and, %d567  ret i1 %r568}569 570define i1 @pow2_select_fail2(i1 %c, i32 %x, i32 %y, i32 %z) {571; CHECK-LABEL: pow2_select_fail2:572; CHECK:       # %bb.0:573; CHECK-NEXT:    movl %ecx, %eax574; CHECK-NEXT:    movl %edx, %ecx575; CHECK-NEXT:    movl $4, %edx576; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx577; CHECK-NEXT:    shll %cl, %edx578; CHECK-NEXT:    movl $-2147483648, %r8d # imm = 0x80000000579; CHECK-NEXT:    movl %eax, %ecx580; CHECK-NEXT:    shrl %cl, %r8d581; CHECK-NEXT:    testb $1, %dil582; CHECK-NEXT:    cmovnel %edx, %r8d583; CHECK-NEXT:    notl %esi584; CHECK-NEXT:    testl %esi, %r8d585; CHECK-NEXT:    sete %al586; CHECK-NEXT:    retq587  %yy = shl i32 4, %y588  %zz = lshr i32 2147483648, %z589  %d = select i1 %c, i32 %yy, i32 %zz590  %and = and i32 %x, %d591  %r = icmp eq i32 %and, %d592  ret i1 %r593}594 595define <4 x i1> @pow2_vselect_eq(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {596; CHECK-LABEL: pow2_vselect_eq:597; CHECK:       # %bb.0:598; CHECK-NEXT:    pslld $31, %xmm0599; CHECK-NEXT:    psrad $31, %xmm0600; CHECK-NEXT:    pslld $23, %xmm2601; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2602; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2603; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]604; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]605; CHECK-NEXT:    movdqa %xmm5, %xmm6606; CHECK-NEXT:    psrld %xmm4, %xmm6607; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]608; CHECK-NEXT:    movdqa %xmm5, %xmm7609; CHECK-NEXT:    psrld %xmm4, %xmm7610; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]611; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]612; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]613; CHECK-NEXT:    movdqa %xmm5, %xmm6614; CHECK-NEXT:    psrld %xmm4, %xmm6615; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]616; CHECK-NEXT:    psrld %xmm3, %xmm5617; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]618; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]619; CHECK-NEXT:    pand %xmm0, %xmm2620; CHECK-NEXT:    pandn %xmm7, %xmm0621; CHECK-NEXT:    por %xmm2, %xmm0622; CHECK-NEXT:    pand %xmm0, %xmm1623; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0624; CHECK-NEXT:    retq625  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y626  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z627  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz628  %and = and <4 x i32> %x, %d629  %r = icmp eq <4 x i32> %and, %d630  ret <4 x i1> %r631}632 633define <4 x i1> @pow2_vselect_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {634; CHECK-LABEL: pow2_vselect_ne:635; CHECK:       # %bb.0:636; CHECK-NEXT:    pslld $31, %xmm0637; CHECK-NEXT:    psrad $31, %xmm0638; CHECK-NEXT:    pslld $23, %xmm2639; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2640; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2641; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]642; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]643; CHECK-NEXT:    movdqa %xmm5, %xmm6644; CHECK-NEXT:    psrld %xmm4, %xmm6645; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]646; CHECK-NEXT:    movdqa %xmm5, %xmm7647; CHECK-NEXT:    psrld %xmm4, %xmm7648; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]649; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]650; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]651; CHECK-NEXT:    movdqa %xmm5, %xmm6652; CHECK-NEXT:    psrld %xmm4, %xmm6653; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]654; CHECK-NEXT:    psrld %xmm3, %xmm5655; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]656; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]657; CHECK-NEXT:    pand %xmm0, %xmm2658; CHECK-NEXT:    pandn %xmm7, %xmm0659; CHECK-NEXT:    por %xmm2, %xmm0660; CHECK-NEXT:    pand %xmm1, %xmm0661; CHECK-NEXT:    pxor %xmm1, %xmm1662; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0663; CHECK-NEXT:    retq664  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y665  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z666  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz667  %and = and <4 x i32> %x, %d668  %r = icmp ne <4 x i32> %and, %d669  ret <4 x i1> %r670}671 672define <4 x i1> @pow2_vselect_fail0_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {673; CHECK-LABEL: pow2_vselect_fail0_ne:674; CHECK:       # %bb.0:675; CHECK-NEXT:    pslld $31, %xmm0676; CHECK-NEXT:    psrad $31, %xmm0677; CHECK-NEXT:    pslld $23, %xmm2678; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2679; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2680; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]681; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [1073741824,1073741824,1073741824,1073741824]682; CHECK-NEXT:    movdqa %xmm5, %xmm6683; CHECK-NEXT:    psrld %xmm4, %xmm6684; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]685; CHECK-NEXT:    movdqa %xmm5, %xmm7686; CHECK-NEXT:    psrld %xmm4, %xmm7687; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]688; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]689; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]690; CHECK-NEXT:    movdqa %xmm5, %xmm6691; CHECK-NEXT:    psrld %xmm4, %xmm6692; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]693; CHECK-NEXT:    psrld %xmm3, %xmm5694; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]695; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]696; CHECK-NEXT:    pand %xmm0, %xmm2697; CHECK-NEXT:    pandn %xmm7, %xmm0698; CHECK-NEXT:    por %xmm2, %xmm0699; CHECK-NEXT:    pcmpeqd %xmm2, %xmm2700; CHECK-NEXT:    pand %xmm0, %xmm1701; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0702; CHECK-NEXT:    pxor %xmm2, %xmm0703; CHECK-NEXT:    retq704  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y705  %zz = lshr <4 x i32> <i32 1073741824, i32 1073741824, i32 1073741824, i32 1073741824>, %z706  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz707  %and = and <4 x i32> %x, %d708  %r = icmp ne <4 x i32> %and, %d709  ret <4 x i1> %r710}711 712define <4 x i1> @pow2_vselect_fail2_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {713; CHECK-LABEL: pow2_vselect_fail2_ne:714; CHECK:       # %bb.0:715; CHECK-NEXT:    pslld $31, %xmm0716; CHECK-NEXT:    psrad $31, %xmm0717; CHECK-NEXT:    pslld $23, %xmm2718; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2719; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2720; CHECK-NEXT:    movdqa {{.*#+}} xmm4 = [4,4,4,4]721; CHECK-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]722; CHECK-NEXT:    pmuludq %xmm4, %xmm2723; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]724; CHECK-NEXT:    pmuludq %xmm4, %xmm5725; CHECK-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]726; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]727; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]728; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]729; CHECK-NEXT:    movdqa %xmm5, %xmm6730; CHECK-NEXT:    psrld %xmm4, %xmm6731; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]732; CHECK-NEXT:    movdqa %xmm5, %xmm7733; CHECK-NEXT:    psrld %xmm4, %xmm7734; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]735; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]736; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]737; CHECK-NEXT:    movdqa %xmm5, %xmm6738; CHECK-NEXT:    psrld %xmm4, %xmm6739; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]740; CHECK-NEXT:    psrld %xmm3, %xmm5741; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]742; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]743; CHECK-NEXT:    pand %xmm0, %xmm2744; CHECK-NEXT:    pandn %xmm7, %xmm0745; CHECK-NEXT:    por %xmm2, %xmm0746; CHECK-NEXT:    pcmpeqd %xmm2, %xmm2747; CHECK-NEXT:    pand %xmm0, %xmm1748; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0749; CHECK-NEXT:    pxor %xmm2, %xmm0750; CHECK-NEXT:    retq751  %yy = shl <4 x i32> <i32 4, i32 4, i32 4, i32 4>, %y752  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z753  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz754  %and = and <4 x i32> %x, %d755  %r = icmp ne <4 x i32> %and, %d756  ret <4 x i1> %r757}758 759define i1 @pow2_and(i32 %x, i32 %y) {760; CHECK-LABEL: pow2_and:761; CHECK:       # %bb.0:762; CHECK-NEXT:    movl %esi, %ecx763; CHECK-NEXT:    movl $4, %eax764; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx765; CHECK-NEXT:    shll %cl, %eax766; CHECK-NEXT:    movl %eax, %ecx767; CHECK-NEXT:    negl %ecx768; CHECK-NEXT:    andl %eax, %ecx769; CHECK-NEXT:    testl %ecx, %edi770; CHECK-NEXT:    setne %al771; CHECK-NEXT:    retq772  %yy = shl nuw nsw i32 4, %y773  %nyy = sub i32 0, %yy774  %d = and i32 %yy, %nyy775  %and = and i32 %x, %d776  %r = icmp eq i32 %and, %d777  ret i1 %r778}779 780define i1 @pow2_and_fail0(i32 %x, i32 %y) {781; CHECK-LABEL: pow2_and_fail0:782; CHECK:       # %bb.0:783; CHECK-NEXT:    movl %esi, %ecx784; CHECK-NEXT:    movl $4, %eax785; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx786; CHECK-NEXT:    shll %cl, %eax787; CHECK-NEXT:    movl %eax, %ecx788; CHECK-NEXT:    negl %ecx789; CHECK-NEXT:    andl %eax, %ecx790; CHECK-NEXT:    notl %edi791; CHECK-NEXT:    testl %edi, %ecx792; CHECK-NEXT:    sete %al793; CHECK-NEXT:    retq794  %yy = shl i32 4, %y795  %nyy = sub i32 0, %yy796  %d = and i32 %yy, %nyy797  %and = and i32 %x, %d798  %r = icmp eq i32 %and, %d799  ret i1 %r800}801 802define i1 @pow2_and_fail1(i32 %x, i32 %y) {803; CHECK-LABEL: pow2_and_fail1:804; CHECK:       # %bb.0:805; CHECK-NEXT:    movl %esi, %ecx806; CHECK-NEXT:    movl $1, %eax807; CHECK-NEXT:    movl $1, %edx808; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx809; CHECK-NEXT:    shll %cl, %edx810; CHECK-NEXT:    subl %edx, %eax811; CHECK-NEXT:    andl %edx, %eax812; CHECK-NEXT:    notl %edi813; CHECK-NEXT:    testl %edi, %eax814; CHECK-NEXT:    sete %al815; CHECK-NEXT:    retq816  %yy = shl i32 1, %y817  %nyy = sub i32 1, %yy818  %d = and i32 %yy, %nyy819  %and = and i32 %x, %d820  %r = icmp eq i32 %and, %d821  ret i1 %r822}823 824define i1 @pow2_and_fail2(i32 %x, i32 %y, i32 %z) {825; CHECK-LABEL: pow2_and_fail2:826; CHECK:       # %bb.0:827; CHECK-NEXT:    movl %esi, %ecx828; CHECK-NEXT:    movl $1, %eax829; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx830; CHECK-NEXT:    shll %cl, %eax831; CHECK-NEXT:    andl %edx, %eax832; CHECK-NEXT:    notl %edi833; CHECK-NEXT:    testl %edi, %eax834; CHECK-NEXT:    sete %al835; CHECK-NEXT:    retq836  %yy = shl i32 1, %y837  %d = and i32 %yy, %z838  %and = and i32 %x, %d839  %r = icmp eq i32 %and, %d840  ret i1 %r841}842 843define i1 @pow2_though_zext(i32 %x, i16 %y) {844; CHECK-LABEL: pow2_though_zext:845; CHECK:       # %bb.0:846; CHECK-NEXT:    movl %esi, %ecx847; CHECK-NEXT:    movl $4, %eax848; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx849; CHECK-NEXT:    shll %cl, %eax850; CHECK-NEXT:    andl %edi, %eax851; CHECK-NEXT:    testl $65535, %eax # imm = 0xFFFF852; CHECK-NEXT:    setne %al853; CHECK-NEXT:    retq854  %dd = shl nuw nsw i16 4, %y855  %d = zext i16 %dd to i32856  %and = and i32 %x, %d857  %r = icmp eq i32 %and, %d858  ret i1 %r859}860