Skip to content

Commit 0e8359a

Browse files
committed
[TargetLowering] SimplifyMultipleUseDemandedBits - add VECTOR_SHUFFLE support.
If all the demanded elts are from one operand and are inline, then we can use the operand directly. The changes are mainly from SSE41 targets which has blendvpd but not cmpgtq, allowing the v2i64 comparison to be simplified as we only need the signbit from alternate v4i32 elements. llvm-svn: 366817
1 parent aa4f8d0 commit 0e8359a

24 files changed

+3138
-3471
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,29 @@ SDValue TargetLowering::SimplifyMultipleUseDemandedBits(
609609
return Op.getOperand(1);
610610
break;
611611
}
612+
case ISD::VECTOR_SHUFFLE: {
613+
ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
614+
615+
// If all the demanded elts are from one operand and are inline,
616+
// then we can use the operand directly.
617+
bool AllUndef = true, IdentityLHS = true, IdentityRHS = true;
618+
for (unsigned i = 0, NumElts = ShuffleMask.size(); i != NumElts; ++i) {
619+
int M = ShuffleMask[i];
620+
if (M < 0 || !DemandedElts[i])
621+
continue;
622+
AllUndef = false;
623+
IdentityLHS &= (M == (int)i);
624+
IdentityRHS &= ((M - NumElts) == i);
625+
}
626+
627+
if (AllUndef)
628+
return DAG.getUNDEF(Op.getValueType());
629+
if (IdentityLHS)
630+
return Op.getOperand(0);
631+
if (IdentityRHS)
632+
return Op.getOperand(1);
633+
break;
634+
}
612635
default:
613636
if (Op.getOpcode() >= ISD::BUILTIN_OP_END)
614637
if (SDValue V = SimplifyMultipleUseDemandedBitsForTargetNode(

llvm/test/CodeGen/X86/midpoint-int-vec-128.ll

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -933,18 +933,18 @@ define <2 x i64> @vec128_i64_signed_reg_reg(<2 x i64> %a1, <2 x i64> %a2) nounwi
933933
; SSE41-NEXT: pxor %xmm2, %xmm0
934934
; SSE41-NEXT: movdqa %xmm0, %xmm3
935935
; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
936-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
937-
; SSE41-NEXT: movdqa %xmm0, %xmm4
938-
; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
939-
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
940-
; SSE41-NEXT: pand %xmm7, %xmm6
936+
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
937+
; SSE41-NEXT: movdqa %xmm0, %xmm6
938+
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
939+
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
940+
; SSE41-NEXT: pand %xmm4, %xmm7
941941
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
942-
; SSE41-NEXT: por %xmm6, %xmm4
942+
; SSE41-NEXT: por %xmm7, %xmm4
943943
; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [1,1]
944944
; SSE41-NEXT: por %xmm4, %xmm3
945945
; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
946946
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
947-
; SSE41-NEXT: pand %xmm7, %xmm0
947+
; SSE41-NEXT: pand %xmm6, %xmm0
948948
; SSE41-NEXT: por %xmm5, %xmm0
949949
; SSE41-NEXT: movdqa %xmm1, %xmm5
950950
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
@@ -1161,18 +1161,18 @@ define <2 x i64> @vec128_i64_unsigned_reg_reg(<2 x i64> %a1, <2 x i64> %a2) noun
11611161
; SSE41-NEXT: pxor %xmm2, %xmm0
11621162
; SSE41-NEXT: movdqa %xmm0, %xmm3
11631163
; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
1164-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1165-
; SSE41-NEXT: movdqa %xmm0, %xmm4
1166-
; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
1167-
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1168-
; SSE41-NEXT: pand %xmm7, %xmm6
1164+
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1165+
; SSE41-NEXT: movdqa %xmm0, %xmm6
1166+
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1167+
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1168+
; SSE41-NEXT: pand %xmm4, %xmm7
11691169
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1170-
; SSE41-NEXT: por %xmm6, %xmm4
1170+
; SSE41-NEXT: por %xmm7, %xmm4
11711171
; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [1,1]
11721172
; SSE41-NEXT: por %xmm4, %xmm3
11731173
; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
11741174
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1175-
; SSE41-NEXT: pand %xmm7, %xmm0
1175+
; SSE41-NEXT: pand %xmm6, %xmm0
11761176
; SSE41-NEXT: por %xmm5, %xmm0
11771177
; SSE41-NEXT: movdqa %xmm1, %xmm5
11781178
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
@@ -1400,10 +1400,10 @@ define <2 x i64> @vec128_i64_signed_mem_reg(<2 x i64>* %a1_addr, <2 x i64> %a2)
14001400
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
14011401
; SSE41-NEXT: movdqa %xmm5, %xmm6
14021402
; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
1403-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1404-
; SSE41-NEXT: pand %xmm6, %xmm4
1403+
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1404+
; SSE41-NEXT: pand %xmm4, %xmm7
14051405
; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1406-
; SSE41-NEXT: por %xmm4, %xmm2
1406+
; SSE41-NEXT: por %xmm7, %xmm2
14071407
; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1,1]
14081408
; SSE41-NEXT: por %xmm2, %xmm4
14091409
; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
@@ -1626,21 +1626,22 @@ define <2 x i64> @vec128_i64_signed_reg_mem(<2 x i64> %a1, <2 x i64>* %a2_addr)
16261626
; SSE41-NEXT: movdqa %xmm0, %xmm1
16271627
; SSE41-NEXT: movdqa (%rdi), %xmm3
16281628
; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1629-
; SSE41-NEXT: pxor %xmm5, %xmm0
1629+
; SSE41-NEXT: movdqa %xmm0, %xmm6
1630+
; SSE41-NEXT: pxor %xmm5, %xmm6
16301631
; SSE41-NEXT: pxor %xmm3, %xmm5
1631-
; SSE41-NEXT: movdqa %xmm0, %xmm2
1632+
; SSE41-NEXT: movdqa %xmm6, %xmm2
16321633
; SSE41-NEXT: pcmpgtd %xmm5, %xmm2
16331634
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1634-
; SSE41-NEXT: movdqa %xmm0, %xmm6
1635-
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1636-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1637-
; SSE41-NEXT: pand %xmm6, %xmm4
1635+
; SSE41-NEXT: movdqa %xmm6, %xmm0
1636+
; SSE41-NEXT: pcmpeqd %xmm5, %xmm0
1637+
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1638+
; SSE41-NEXT: pand %xmm4, %xmm7
16381639
; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1639-
; SSE41-NEXT: por %xmm4, %xmm2
1640+
; SSE41-NEXT: por %xmm7, %xmm2
16401641
; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1,1]
16411642
; SSE41-NEXT: por %xmm2, %xmm4
1642-
; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
1643-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1643+
; SSE41-NEXT: pcmpgtd %xmm6, %xmm5
1644+
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
16441645
; SSE41-NEXT: pand %xmm6, %xmm0
16451646
; SSE41-NEXT: por %xmm5, %xmm0
16461647
; SSE41-NEXT: movdqa %xmm3, %xmm5
@@ -1867,10 +1868,10 @@ define <2 x i64> @vec128_i64_signed_mem_mem(<2 x i64>* %a1_addr, <2 x i64>* %a2_
18671868
; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
18681869
; SSE41-NEXT: movdqa %xmm0, %xmm6
18691870
; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1870-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1871-
; SSE41-NEXT: pand %xmm6, %xmm4
1871+
; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1872+
; SSE41-NEXT: pand %xmm4, %xmm7
18721873
; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1873-
; SSE41-NEXT: por %xmm4, %xmm1
1874+
; SSE41-NEXT: por %xmm7, %xmm1
18741875
; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1,1]
18751876
; SSE41-NEXT: por %xmm1, %xmm4
18761877
; SSE41-NEXT: pcmpgtd %xmm0, %xmm5

llvm/test/CodeGen/X86/psubus.ll

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,55 +1671,54 @@ define <8 x i16> @psubus_8i64_max(<8 x i16> %x, <8 x i64> %y) nounwind {
16711671
; SSE41-LABEL: psubus_8i64_max:
16721672
; SSE41: # %bb.0: # %vector.ph
16731673
; SSE41-NEXT: movdqa %xmm0, %xmm8
1674-
; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1674+
; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
16751675
; SSE41-NEXT: movdqa %xmm4, %xmm0
1676-
; SSE41-NEXT: pxor %xmm6, %xmm0
1677-
; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
1678-
; SSE41-NEXT: movdqa %xmm9, %xmm7
1676+
; SSE41-NEXT: pxor %xmm9, %xmm0
1677+
; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1678+
; SSE41-NEXT: movdqa %xmm5, %xmm7
1679+
; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
1680+
; SSE41-NEXT: movdqa %xmm5, %xmm6
1681+
; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1682+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1683+
; SSE41-NEXT: pand %xmm7, %xmm0
1684+
; SSE41-NEXT: por %xmm6, %xmm0
1685+
; SSE41-NEXT: movapd {{.*#+}} xmm6 = [65535,65535]
1686+
; SSE41-NEXT: movapd %xmm6, %xmm10
1687+
; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm10
1688+
; SSE41-NEXT: movdqa %xmm3, %xmm0
1689+
; SSE41-NEXT: pxor %xmm9, %xmm0
1690+
; SSE41-NEXT: movdqa %xmm5, %xmm4
1691+
; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1692+
; SSE41-NEXT: movdqa %xmm5, %xmm7
16791693
; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1680-
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1681-
; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1682-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1683-
; SSE41-NEXT: pand %xmm5, %xmm0
1694+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1695+
; SSE41-NEXT: pand %xmm4, %xmm0
16841696
; SSE41-NEXT: por %xmm7, %xmm0
1685-
; SSE41-NEXT: movapd {{.*#+}} xmm7 = [65535,65535]
1686-
; SSE41-NEXT: movapd %xmm7, %xmm5
1687-
; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5
1688-
; SSE41-NEXT: movdqa %xmm3, %xmm0
1689-
; SSE41-NEXT: pxor %xmm6, %xmm0
1690-
; SSE41-NEXT: movdqa %xmm9, %xmm4
1691-
; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1692-
; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1693-
; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1694-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1695-
; SSE41-NEXT: pand %xmm10, %xmm0
1696-
; SSE41-NEXT: por %xmm4, %xmm0
1697-
; SSE41-NEXT: movapd %xmm7, %xmm4
1697+
; SSE41-NEXT: movapd %xmm6, %xmm4
16981698
; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
1699-
; SSE41-NEXT: packusdw %xmm5, %xmm4
1699+
; SSE41-NEXT: packusdw %xmm10, %xmm4
17001700
; SSE41-NEXT: movdqa %xmm2, %xmm0
1701-
; SSE41-NEXT: pxor %xmm6, %xmm0
1702-
; SSE41-NEXT: movdqa %xmm9, %xmm3
1703-
; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1704-
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1705-
; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1706-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1707-
; SSE41-NEXT: pand %xmm5, %xmm0
1708-
; SSE41-NEXT: por %xmm3, %xmm0
1709-
; SSE41-NEXT: movapd %xmm7, %xmm3
1701+
; SSE41-NEXT: pxor %xmm9, %xmm0
1702+
; SSE41-NEXT: movdqa %xmm5, %xmm3
1703+
; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
1704+
; SSE41-NEXT: movdqa %xmm5, %xmm7
1705+
; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1706+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1707+
; SSE41-NEXT: pand %xmm3, %xmm0
1708+
; SSE41-NEXT: por %xmm7, %xmm0
1709+
; SSE41-NEXT: movapd %xmm6, %xmm3
17101710
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1711-
; SSE41-NEXT: pxor %xmm1, %xmm6
1712-
; SSE41-NEXT: movdqa %xmm9, %xmm2
1713-
; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
1714-
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1715-
; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
1716-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1717-
; SSE41-NEXT: pand %xmm5, %xmm0
1718-
; SSE41-NEXT: por %xmm2, %xmm0
1719-
; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7
1720-
; SSE41-NEXT: packusdw %xmm3, %xmm7
1721-
; SSE41-NEXT: packusdw %xmm4, %xmm7
1722-
; SSE41-NEXT: psubusw %xmm7, %xmm8
1711+
; SSE41-NEXT: pxor %xmm1, %xmm9
1712+
; SSE41-NEXT: movdqa %xmm5, %xmm2
1713+
; SSE41-NEXT: pcmpeqd %xmm9, %xmm2
1714+
; SSE41-NEXT: pcmpgtd %xmm9, %xmm5
1715+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1716+
; SSE41-NEXT: pand %xmm2, %xmm0
1717+
; SSE41-NEXT: por %xmm5, %xmm0
1718+
; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
1719+
; SSE41-NEXT: packusdw %xmm3, %xmm6
1720+
; SSE41-NEXT: packusdw %xmm4, %xmm6
1721+
; SSE41-NEXT: psubusw %xmm6, %xmm8
17231722
; SSE41-NEXT: movdqa %xmm8, %xmm0
17241723
; SSE41-NEXT: retq
17251724
;

llvm/test/CodeGen/X86/sat-add.ll

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,11 @@ define <2 x i64> @unsigned_sat_constant_v2i64_using_min(<2 x i64> %x) {
581581
; SSE41-NEXT: pxor %xmm1, %xmm0
582582
; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292117,9223372034707292117]
583583
; SSE41-NEXT: movdqa %xmm3, %xmm4
584-
; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
585-
; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
586-
; SSE41-NEXT: pcmpeqd %xmm3, %xmm0
587-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
588-
; SSE41-NEXT: pand %xmm5, %xmm0
589-
; SSE41-NEXT: por %xmm4, %xmm0
584+
; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
585+
; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
586+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
587+
; SSE41-NEXT: pand %xmm4, %xmm0
588+
; SSE41-NEXT: por %xmm3, %xmm0
590589
; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
591590
; SSE41-NEXT: paddq {{.*}}(%rip), %xmm2
592591
; SSE41-NEXT: movdqa %xmm2, %xmm0
@@ -877,12 +876,11 @@ define <2 x i64> @unsigned_sat_variable_v2i64_using_min(<2 x i64> %x, <2 x i64>
877876
; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
878877
; SSE41-NEXT: pxor %xmm1, %xmm4
879878
; SSE41-NEXT: movdqa %xmm4, %xmm5
880-
; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
881-
; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
882-
; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
883-
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
884-
; SSE41-NEXT: pand %xmm6, %xmm0
885-
; SSE41-NEXT: por %xmm5, %xmm0
879+
; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
880+
; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
881+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
882+
; SSE41-NEXT: pand %xmm5, %xmm0
883+
; SSE41-NEXT: por %xmm4, %xmm0
886884
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
887885
; SSE41-NEXT: paddq %xmm1, %xmm3
888886
; SSE41-NEXT: movdqa %xmm3, %xmm0

0 commit comments

Comments
 (0)