[llvm] r298616 - [X86][SSE] Extract elements from narrower shuffle masks.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 23 09:09:34 PDT 2017
Author: rksimon
Date: Thu Mar 23 11:09:34 2017
New Revision: 298616
URL: http://llvm.org/viewvc/llvm-project?rev=298616&view=rev
Log:
[X86][SSE] Extract elements from narrower shuffle masks.
Add support for widening narrow shuffle masks so we can directly extract from the relevant input vector of the shuffle.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/test/CodeGen/X86/known-signbits-vector.ll
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=298616&r1=298615&r2=298616&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Mar 23 11:09:34 2017
@@ -29165,9 +29165,10 @@ static SDValue combineExtractWithShuffle
SDValue Src = N->getOperand(0);
SDValue Idx = N->getOperand(1);
+ EVT VT = N->getValueType(0);
EVT SrcVT = Src.getValueType();
EVT SrcSVT = SrcVT.getVectorElementType();
- EVT VT = N->getValueType(0);
+ unsigned NumSrcElts = SrcVT.getVectorNumElements();
// Don't attempt this for boolean mask vectors or unknown extraction indices.
if (SrcSVT == MVT::i1 || !isa<ConstantSDNode>(Idx))
@@ -29179,21 +29180,27 @@ static SDValue combineExtractWithShuffle
if (!resolveTargetShuffleInputs(peekThroughBitcasts(Src), Ops, Mask))
return SDValue();
- // At the moment we can only narrow a shuffle mask to handle extractions
- // of smaller scalars.
- // TODO - investigate support for wider shuffle masks with known upper
- // undef/zero elements for implicit zero-extension.
- unsigned NumMaskElts = Mask.size();
- if ((SrcVT.getVectorNumElements() % NumMaskElts) != 0)
- return SDValue();
-
- int Scale = SrcVT.getVectorNumElements() / NumMaskElts;
- if (Scale != 1) {
- SmallVector<int, 16> ScaledMask;
- scaleShuffleMask(Scale, Mask, ScaledMask);
- Mask = ScaledMask;
+ // Attempt to narrow/widen the shuffle mask to the correct size.
+ if (Mask.size() != NumSrcElts) {
+ if ((NumSrcElts % Mask.size()) == 0) {
+ SmallVector<int, 16> ScaledMask;
+ int Scale = NumSrcElts / Mask.size();
+ scaleShuffleMask(Scale, Mask, ScaledMask);
+ Mask = std::move(ScaledMask);
+ } else if ((Mask.size() % NumSrcElts) == 0) {
+ SmallVector<int, 16> WidenedMask;
+ while (Mask.size() > NumSrcElts &&
+ canWidenShuffleElements(Mask, WidenedMask))
+ Mask = std::move(WidenedMask);
+ // TODO - investigate support for wider shuffle masks with known upper
+ // undef/zero elements for implicit zero-extension.
+ }
}
+ // Check if narrowing/widening failed.
+ if (Mask.size() != NumSrcElts)
+ return SDValue();
+
int SrcIdx = Mask[N->getConstantOperandVal(1)];
SDLoc dl(N);
Modified: llvm/trunk/test/CodeGen/X86/known-signbits-vector.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/known-signbits-vector.ll?rev=298616&r1=298615&r2=298616&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/known-signbits-vector.ll (original)
+++ llvm/trunk/test/CodeGen/X86/known-signbits-vector.ll Thu Mar 23 11:09:34 2017
@@ -76,11 +76,8 @@ define float @signbits_ashr_extract_sito
; X32-LABEL: signbits_ashr_extract_sitofp:
; X32: # BB#0:
; X32-NEXT: pushl %eax
-; X32-NEXT: vpsrad $31, %xmm0, %xmm1
-; X32-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
-; X32-NEXT: vmovd %xmm0, %eax
-; X32-NEXT: vcvtsi2ssl %eax, %xmm2, %xmm0
+; X32-NEXT: vpextrd $1, %xmm0, %eax
+; X32-NEXT: vcvtsi2ssl %eax, %xmm1, %xmm0
; X32-NEXT: vmovss %xmm0, (%esp)
; X32-NEXT: flds (%esp)
; X32-NEXT: popl %eax
More information about the llvm-commits
mailing list