summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-07-08 08:45:38 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-07-08 08:45:38 +0000
commit142e966261c3ab61f6df73ad48d2019bfd692ec2 (patch)
tree00983cada5702285015f2ebef4b62e6390857dc5 /llvm/lib/Target
parent84d0b3efee509e4c820096772981adeb6568978f (diff)
downloadbcm5719-llvm-142e966261c3ab61f6df73ad48d2019bfd692ec2.tar.gz
bcm5719-llvm-142e966261c3ab61f6df73ad48d2019bfd692ec2.zip
[x86,SDAG] Sink the logic for folding shuffles of splats more
aggressively from the x86 shuffle lowering to the generic SDAG vector shuffle formation code. This code already tried to fold away shuffles of splats! It just had lots of bugs and couldn't handle the case my new x86 shuffle lowering needed. First, it failed to correctly compute whether N2 was undef because it pre-computed this, then did transformations which could *make* N2 undef, then failed to ever re-consider the precomputed state. Second, it didn't look through bitcasts at all, even in the safe cases where they are just element-type bitcasts with no change to the number of elements. Third, it didn't handle all-zero bit casts nicely the way my code in the x86 side of things did, which is essential to getting good zext-shuffle lowerings. But all of these are generic. I just ported the code down to this layer and fixed the surrounding bugs. Tests exercising this in the x86 backend still pass and some silly code in widen_cast-6.ll gets better. I updated that test to be a bit more precise but it's still pretty unclear what the value of the test is in this day and age. llvm-svn: 212517
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp41
1 files changed, 0 insertions, 41 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 39537e358b9..306a659c983 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -7924,47 +7924,6 @@ static SDValue lowerVectorShuffle(SDValue Op, const X86Subtarget *Subtarget,
return DAG.getVectorShuffle(VT, dl, V1, V2, NewMask);
}
- // Check for a shuffle of a splat, and return just the splat. While DAG
- // combining will do a similar transformation, this shows up with the
- // internally created shuffles and so we handle it specially here as we won't
- // have another chance to DAG-combine the generic shuffle instructions.
- if (V2IsUndef) {
- SDValue V = V1;
-
- // Look through any bitcasts. These can't change the size, just the number
- // of elements which we check later.
- while (V.getOpcode() == ISD::BITCAST)
- V = V->getOperand(0);
-
- // A splat should always show up as a build vector node.
- if (V.getOpcode() == ISD::BUILD_VECTOR) {
- SDValue Base;
- bool AllSame = true;
- for (unsigned i = 0; i != V->getNumOperands(); ++i)
- if (V->getOperand(i).getOpcode() != ISD::UNDEF) {
- Base = V->getOperand(i);
- break;
- }
- // Splat of <u, u, ..., u>, return <u, u, ..., u>
- if (!Base)
- return V1;
- for (unsigned i = 0; i != V->getNumOperands(); ++i)
- if (V->getOperand(i) != Base) {
- AllSame = false;
- break;
- }
- // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
- // number of elements match or the value splatted is a zero constant.
- if (AllSame) {
- if (V.getValueType().getVectorNumElements() == (unsigned)NumElements)
- return V1;
- if (auto *C = dyn_cast<ConstantSDNode>(Base))
- if (C->isNullValue())
- return V1;
- }
- }
- }
-
// For integer vector shuffles, try to collapse them into a shuffle of fewer
// lanes but wider integers. We cap this to not form integers larger than i64
// but it might be interesting to form i128 integers to handle flipping the
OpenPOWER on IntegriCloud