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