mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 20:23:59 +00:00
PR2957
ISD::VECTOR_SHUFFLE now stores an array of integers representing the shuffle mask internal to the node, rather than taking a BUILD_VECTOR of ConstantSDNodes as the shuffle mask. A value of -1 represents UNDEF. In addition to eliminating the creation of illegal BUILD_VECTORS just to represent shuffle masks, we are better about canonicalizing the shuffle mask, resulting in substantially better code for some classes of shuffles. A clean up of x86 shuffle code, and some canonicalizing in DAGCombiner is next. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69952 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -194,10 +194,6 @@ SDTypeConstraint::SDTypeConstraint(Record *R) {
|
||||
ConstraintType = SDTCisOpSmallerThanOp;
|
||||
x.SDTCisOpSmallerThanOp_Info.BigOperandNum =
|
||||
R->getValueAsInt("BigOperandNum");
|
||||
} else if (R->isSubClassOf("SDTCisIntVectorOfSameSize")) {
|
||||
ConstraintType = SDTCisIntVectorOfSameSize;
|
||||
x.SDTCisIntVectorOfSameSize_Info.OtherOperandNum =
|
||||
R->getValueAsInt("OtherOpNum");
|
||||
} else if (R->isSubClassOf("SDTCisEltOfVec")) {
|
||||
ConstraintType = SDTCisEltOfVec;
|
||||
x.SDTCisEltOfVec_Info.OtherOperandNum =
|
||||
@ -365,23 +361,9 @@ bool SDTypeConstraint::ApplyTypeConstraint(TreePatternNode *N,
|
||||
}
|
||||
return MadeChange;
|
||||
}
|
||||
case SDTCisIntVectorOfSameSize: {
|
||||
TreePatternNode *OtherOperand =
|
||||
getOperandNum(x.SDTCisIntVectorOfSameSize_Info.OtherOperandNum,
|
||||
N, NumResults);
|
||||
if (OtherOperand->hasTypeSet()) {
|
||||
if (!isVector(OtherOperand->getTypeNum(0)))
|
||||
TP.error(N->getOperator()->getName() + " VT operand must be a vector!");
|
||||
MVT IVT = OtherOperand->getTypeNum(0);
|
||||
unsigned NumElements = IVT.getVectorNumElements();
|
||||
IVT = MVT::getIntVectorWithNumElements(NumElements);
|
||||
return NodeToApply->UpdateNodeType(IVT.getSimpleVT(), TP);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case SDTCisEltOfVec: {
|
||||
TreePatternNode *OtherOperand =
|
||||
getOperandNum(x.SDTCisIntVectorOfSameSize_Info.OtherOperandNum,
|
||||
getOperandNum(x.SDTCisEltOfVec_Info.OtherOperandNum,
|
||||
N, NumResults);
|
||||
if (OtherOperand->hasTypeSet()) {
|
||||
if (!isVector(OtherOperand->getTypeNum(0)))
|
||||
@ -925,25 +907,6 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
|
||||
if (NI.getNumResults() == 0)
|
||||
MadeChange |= UpdateNodeType(MVT::isVoid, TP);
|
||||
|
||||
// If this is a vector_shuffle operation, apply types to the build_vector
|
||||
// operation. The types of the integers don't matter, but this ensures they
|
||||
// won't get checked.
|
||||
if (getOperator()->getName() == "vector_shuffle" &&
|
||||
getChild(2)->getOperator()->getName() == "build_vector") {
|
||||
TreePatternNode *BV = getChild(2);
|
||||
const std::vector<MVT::SimpleValueType> &LegalVTs
|
||||
= CDP.getTargetInfo().getLegalValueTypes();
|
||||
MVT::SimpleValueType LegalIntVT = MVT::Other;
|
||||
for (unsigned i = 0, e = LegalVTs.size(); i != e; ++i)
|
||||
if (isInteger(LegalVTs[i]) && !isVector(LegalVTs[i])) {
|
||||
LegalIntVT = LegalVTs[i];
|
||||
break;
|
||||
}
|
||||
assert(LegalIntVT != MVT::Other && "No legal integer VT?");
|
||||
|
||||
for (unsigned i = 0, e = BV->getNumChildren(); i != e; ++i)
|
||||
MadeChange |= BV->getChild(i)->UpdateNodeType(LegalIntVT, TP);
|
||||
}
|
||||
return MadeChange;
|
||||
} else if (getOperator()->isSubClassOf("Instruction")) {
|
||||
const DAGInstruction &Inst = CDP.getInstruction(getOperator());
|
||||
@ -2086,6 +2049,9 @@ void CodeGenDAGPatterns::ParsePatterns() {
|
||||
IterateInference |= Result->getTree(0)->
|
||||
UpdateNodeType(Pattern->getTree(0)->getExtTypes(), *Result);
|
||||
} while (IterateInference);
|
||||
|
||||
// Blah?
|
||||
Result->getTree(0)->setTransformFn(Pattern->getTree(0)->getTransformFn());
|
||||
|
||||
// Verify that we inferred enough types that we can do something with the
|
||||
// pattern and result. If these fire the user has to add type casts.
|
||||
|
Reference in New Issue
Block a user