[llvm] r261433 - [X86][SSE] Move all undef/zero cases before target shuffle combining.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 20 04:57:32 PST 2016
Author: rksimon
Date: Sat Feb 20 06:57:32 2016
New Revision: 261433
URL: http://llvm.org/viewvc/llvm-project?rev=261433&view=rev
Log:
[X86][SSE] Move all undef/zero cases before target shuffle combining.
First small step towards fixing PR26667 - we need to ensure that combineX86ShuffleChain only gets called with a valid shuffle input node (a similar issue was found in D17041).
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=261433&r1=261432&r2=261433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Sat Feb 20 06:57:32 2016
@@ -23525,21 +23525,9 @@ static bool combineX86ShuffleChain(SDVal
SDValue Res;
if (Mask.size() == 1) {
- int Index = Mask[0];
- assert((Index >= 0 || Index == SM_SentinelUndef ||
- Index == SM_SentinelZero) &&
- "Invalid shuffle index found!");
-
- // We may end up with an accumulated mask of size 1 as a result of
- // widening of shuffle operands (see function canWidenShuffleElements).
- // If the only shuffle index is equal to SM_SentinelZero then propagate
- // a zero vector. Otherwise, the combine shuffle mask is a no-op shuffle
- // mask, and therefore the entire chain of shuffles can be folded away.
- if (Index == SM_SentinelZero)
- DCI.CombineTo(Root.getNode(), getZeroVector(RootVT, Subtarget, DAG, DL));
- else
- DCI.CombineTo(Root.getNode(), DAG.getBitcast(RootVT, Input),
- /*AddTo*/ true);
+ assert(Mask[0] == 0 && "Invalid shuffle index found!");
+ DCI.CombineTo(Root.getNode(), DAG.getBitcast(RootVT, Input),
+ /*AddTo*/ true);
return true;
}
@@ -23802,20 +23790,26 @@ static bool combineX86ShufflesRecursivel
RootMaskedIdx % OpRatio);
}
- // Handle the all undef case early.
- // TODO - should we handle zero/undef case as well? Widening the mask
- // will lose information on undef elements possibly reducing future
- // combine possibilities.
+ // Handle the all undef/zero cases early.
if (std::all_of(Mask.begin(), Mask.end(),
[](int Idx) { return Idx == SM_SentinelUndef; })) {
DCI.CombineTo(Root.getNode(), DAG.getUNDEF(Root.getValueType()));
return true;
}
+ if (std::all_of(Mask.begin(), Mask.end(), [](int Idx) { return Idx < 0; })) {
+ // TODO - should we handle the mixed zero/undef case as well? Just returning
+ // a zero mask will lose information on undef elements possibly reducing
+ // future combine possibilities.
+ DCI.CombineTo(Root.getNode(), getZeroVector(Root.getSimpleValueType(),
+ Subtarget, DAG, SDLoc(Root)));
+ return true;
+ }
+ assert(Input0 && "Shuffle with no inputs detected");
HasPSHUFB |= (Op.getOpcode() == X86ISD::PSHUFB);
// See if we can recurse into Input0 (if it's a target shuffle).
- if (Input0 && Op->isOnlyUserOf(Input0.getNode()) &&
+ if (Op->isOnlyUserOf(Input0.getNode()) &&
combineX86ShufflesRecursively(Input0, Root, Mask, Depth + 1, HasPSHUFB,
DAG, DCI, Subtarget))
return true;
More information about the llvm-commits
mailing list