aboutsummaryrefslogtreecommitdiffstats
path: root/utils/TableGen
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2009-04-24 12:40:33 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2009-04-24 12:40:33 +0000
commit15684b29552393553524171bff1913e750f390f8 (patch)
tree2d43d8f19d7fc59d2c61b282b789a704c96b16b0 /utils/TableGen
parentf6b9f260ede8c65b0de53dc9dd3ba42c1a286c13 (diff)
downloadexternal_llvm-15684b29552393553524171bff1913e750f390f8.zip
external_llvm-15684b29552393553524171bff1913e750f390f8.tar.gz
external_llvm-15684b29552393553524171bff1913e750f390f8.tar.bz2
Revert 69952. Causes testsuite failures on linux x86-64.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69967 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r--utils/TableGen/CodeGenDAGPatterns.cpp42
-rw-r--r--utils/TableGen/CodeGenDAGPatterns.h6
2 files changed, 43 insertions, 5 deletions
diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp
index 52d8ca4..804d1df 100644
--- a/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -194,6 +194,10 @@ 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 =
@@ -361,9 +365,23 @@ 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.SDTCisEltOfVec_Info.OtherOperandNum,
+ getOperandNum(x.SDTCisIntVectorOfSameSize_Info.OtherOperandNum,
N, NumResults);
if (OtherOperand->hasTypeSet()) {
if (!isVector(OtherOperand->getTypeNum(0)))
@@ -907,6 +925,25 @@ 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());
@@ -2049,9 +2086,6 @@ 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.
diff --git a/utils/TableGen/CodeGenDAGPatterns.h b/utils/TableGen/CodeGenDAGPatterns.h
index 9ce14dc..f1b0d37 100644
--- a/utils/TableGen/CodeGenDAGPatterns.h
+++ b/utils/TableGen/CodeGenDAGPatterns.h
@@ -62,7 +62,8 @@ struct SDTypeConstraint {
unsigned OperandNo; // The operand # this constraint applies to.
enum {
SDTCisVT, SDTCisPtrTy, SDTCisInt, SDTCisFP, SDTCisSameAs,
- SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisEltOfVec
+ SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisIntVectorOfSameSize,
+ SDTCisEltOfVec
} ConstraintType;
union { // The discriminated union.
@@ -80,6 +81,9 @@ struct SDTypeConstraint {
} SDTCisOpSmallerThanOp_Info;
struct {
unsigned OtherOperandNum;
+ } SDTCisIntVectorOfSameSize_Info;
+ struct {
+ unsigned OtherOperandNum;
} SDTCisEltOfVec_Info;
} x;