When building a VVECTOR_SHUFFLE node from extract_element operations, make

sure to build it as SHUFFLE(X, undef, mask), not SHUFFLE(X, X, mask).

The later is not canonical form, and prevents the PPC splat pattern from
matching.  For a particular splat, we go from generating this:

	li r10, lo16(LCPI1_0)
	lis r11, ha16(LCPI1_0)
	lvx v3, r11, r10
	vperm v3, v2, v2, v3

to generating:

	vspltw v3, v2, 3

llvm-svn: 27236
This commit is contained in:
Chris Lattner 2006-03-28 22:19:47 +00:00
parent a46dfe80c8
commit 20e619fba3
1 changed files with 11 additions and 1 deletions

View File

@ -2419,7 +2419,17 @@ SDOperand DAGCombiner::visitVBUILD_VECTOR(SDNode *N) {
// Return the new VVECTOR_SHUFFLE node.
std::vector<SDOperand> Ops;
Ops.push_back(VecIn1);
Ops.push_back(VecIn2.Val ? VecIn2 : VecIn1); // Use V1 twice if no V2.
if (VecIn2.Val) {
Ops.push_back(VecIn2);
} else {
// Use an undef vbuild_vector as input for the second operand.
std::vector<SDOperand> UnOps(NumInScalars,
DAG.getNode(ISD::UNDEF,
cast<VTSDNode>(EltType)->getVT()));
UnOps.push_back(NumElts);
UnOps.push_back(EltType);
Ops.push_back(DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, UnOps));
}
Ops.push_back(DAG.getNode(ISD::VBUILD_VECTOR,MVT::Vector, BuildVecIndices));
Ops.push_back(NumElts);
Ops.push_back(EltType);