1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Verify that the DAGCombiner is able to fold a vector AND into a blend 5*9880d681SAndroid Build Coastguard Worker; if one of the operands to the AND is a vector of all constants, and each 6*9880d681SAndroid Build Coastguard Worker; constant element is either zero or all-ones. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test1(<4 x i32> %A) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 11*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 15*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 0, i32 0> 16*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %A) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 25*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 0> 26*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test3(<4 x i32> %A) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 31*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5],xmm1[6,7] 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 35*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 0, i32 -1, i32 0> 36*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %A) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 41*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7] 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 45*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 0, i32 0, i32 -1> 46*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5(<4 x i32> %A) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 51*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 55*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 0> 56*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test6(<4 x i32> %A) { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 61*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7] 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 65*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 -1> 66*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test7(<4 x i32> %A) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 71*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 75*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 0, i32 -1, i32 -1> 76*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test8(<4 x i32> %A) { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 81*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7] 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 85*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 0, i32 -1> 86*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test9(<4 x i32> %A) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 91*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 94*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 0, i32 0> 95*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test10(<4 x i32> %A) { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 100*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7] 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 104*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 -1, i32 0> 105*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test11(<4 x i32> %A) { 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 110*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 114*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 -1, i32 -1> 115*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test12(<4 x i32> %A) { 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 120*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7] 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 124*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 -1, i32 0> 125*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test13(<4 x i32> %A) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 130*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7] 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 134*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 0, i32 -1> 135*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test14(<4 x i32> %A) { 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14: 140*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm1, %xmm1 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 144*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 -1> 145*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test15(<4 x i32> %A, <4 x i32> %B) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15: 150*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 153*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 -1> 154*9880d681SAndroid Build Coastguard Worker %2 = and <4 x i32> %B, <i32 0, i32 -1, i32 0, i32 0> 155*9880d681SAndroid Build Coastguard Worker %3 = or <4 x i32> %1, %2 156*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %3 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test16(<4 x i32> %A, <4 x i32> %B) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16: 161*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 164*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 0> 165*9880d681SAndroid Build Coastguard Worker %2 = and <4 x i32> %B, <i32 0, i32 -1, i32 0, i32 -1> 166*9880d681SAndroid Build Coastguard Worker %3 = or <4 x i32> %1, %2 167*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %3 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test17(<4 x i32> %A, <4 x i32> %B) { 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17: 172*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7] 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 175*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 -1> 176*9880d681SAndroid Build Coastguard Worker %2 = and <4 x i32> %B, <i32 -1, i32 0, i32 -1, i32 0> 177*9880d681SAndroid Build Coastguard Worker %3 = or <4 x i32> %1, %2 178*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %3 179*9880d681SAndroid Build Coastguard Worker} 180