summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-11-18 13:34:53 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-11-18 13:34:53 +0000
commitcc1f5d24073a8e796805622e705b2eb84a8f1f22 (patch)
treef28475e30ec3b1afc7e15a4c329409d1919596bc /llvm/lib
parent45beaa0bb9330ec1a519f001a54555bee1638840 (diff)
downloadbcm5719-llvm-cc1f5d24073a8e796805622e705b2eb84a8f1f22.tar.gz
bcm5719-llvm-cc1f5d24073a8e796805622e705b2eb84a8f1f22.zip
[X86][SSE] Use raw shuffle mask decode in SimplifyDemandedVectorEltsForTargetNode (PR39549)
We were using the 'normalized' shuffle mask from resolveTargetShuffleInputs, which replaces zero/undef inputs with sentinel values. For SimplifyDemandedVectorElts we need the raw mask so we can correctly demand those 'zero' inputs that got normalized away, this requires an extra bit of logic to locally normalize undef inputs. llvm-svn: 347158
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 7eae08e54c2..d2a5f396d64 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -32085,13 +32085,15 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
}
// Simplify target shuffles.
- if (!isTargetShuffle(Opc))
+ if (!isTargetShuffle(Opc) || !VT.isSimple())
return false;
// Get target shuffle mask.
+ bool IsUnary;
SmallVector<int, 64> OpMask;
SmallVector<SDValue, 2> OpInputs;
- if (!resolveTargetShuffleInputs(Op, OpInputs, OpMask, TLO.DAG))
+ if (!getTargetShuffleMask(Op.getNode(), VT.getSimpleVT(), true, OpInputs,
+ OpMask, IsUnary))
return false;
// Shuffle inputs must be the same type as the result.
@@ -32101,9 +32103,13 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
// Check if shuffle mask can be simplified to undef/zero/identity.
int NumSrcs = OpInputs.size();
- for (int i = 0; i != NumElts; ++i)
+ for (int i = 0; i != NumElts; ++i) {
+ int &M = OpMask[i];
if (!DemandedElts[i])
- OpMask[i] = SM_SentinelUndef;
+ M = SM_SentinelUndef;
+ else if (0 <= M && OpInputs[M / NumElts].isUndef())
+ M = SM_SentinelUndef;
+ }
if (isUndefInRange(OpMask, 0, NumElts)) {
KnownUndef.setAllBits();
OpenPOWER on IntegriCloud