[llvm-commits] [llvm] r98968 - in /llvm/trunk/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h
Chris Lattner
sabre at nondot.org
Fri Mar 19 10:41:26 PDT 2010
Author: lattner
Date: Fri Mar 19 12:41:26 2010
New Revision: 98968
URL: http://llvm.org/viewvc/llvm-project?rev=98968&view=rev
Log:
make FillWithPossibleTypes take a predicate to filter types so that
we don't blow the smallvector as often. No functionality change.
Modified:
llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h
Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=98968&r1=98967&r2=98968&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Fri Mar 19 12:41:26 2010
@@ -28,14 +28,15 @@
static inline bool isInteger(MVT::SimpleValueType VT) {
return EVT(VT).isInteger();
}
-
static inline bool isFloatingPoint(MVT::SimpleValueType VT) {
return EVT(VT).isFloatingPoint();
}
-
static inline bool isVector(MVT::SimpleValueType VT) {
return EVT(VT).isVector();
}
+static inline bool isScalar(MVT::SimpleValueType VT) {
+ return !EVT(VT).isVector();
+}
EEVT::TypeSet::TypeSet(MVT::SimpleValueType VT, TreePattern &TP) {
if (VT == MVT::iAny)
@@ -67,9 +68,28 @@
/// FillWithPossibleTypes - Set to all legal types and return true, only valid
/// on completely unknown type sets.
-bool EEVT::TypeSet::FillWithPossibleTypes(TreePattern &TP) {
+bool EEVT::TypeSet::FillWithPossibleTypes(TreePattern &TP,
+ bool (*Pred)(MVT::SimpleValueType),
+ const char *PredicateName) {
assert(isCompletelyUnknown());
- *this = TP.getDAGPatterns().getTargetInfo().getLegalValueTypes();
+ const std::vector<MVT::SimpleValueType> &LegalTypes =
+ TP.getDAGPatterns().getTargetInfo().getLegalValueTypes();
+
+ for (unsigned i = 0, e = LegalTypes.size(); i != e; ++i)
+ if (Pred == 0 || Pred(LegalTypes[i]))
+ TypeVec.push_back(LegalTypes[i]);
+
+ // If we have nothing that matches the predicate, bail out.
+ if (TypeVec.empty())
+ TP.error("Type inference contradiction found, no " +
+ std::string(PredicateName) + " types found");
+ // No need to sort with one element.
+ if (TypeVec.size() == 1) return true;
+
+ // Remove duplicates.
+ array_pod_sort(TypeVec.begin(), TypeVec.end());
+ TypeVec.erase(std::unique(TypeVec.begin(), TypeVec.end()), TypeVec.end());
+
return true;
}
@@ -205,86 +225,84 @@
/// EnforceInteger - Remove all non-integer types from this set.
bool EEVT::TypeSet::EnforceInteger(TreePattern &TP) {
- TypeSet InputSet(*this);
- bool MadeChange = false;
-
// If we know nothing, then get the full set.
if (TypeVec.empty())
- MadeChange = FillWithPossibleTypes(TP);
-
+ return FillWithPossibleTypes(TP, isInteger, "integer");
if (!hasFloatingPointTypes())
- return MadeChange;
+ return false;
+
+ TypeSet InputSet(*this);
// Filter out all the fp types.
for (unsigned i = 0; i != TypeVec.size(); ++i)
- if (isFloatingPoint(TypeVec[i]))
+ if (!isInteger(TypeVec[i]))
TypeVec.erase(TypeVec.begin()+i--);
if (TypeVec.empty())
TP.error("Type inference contradiction found, '" +
InputSet.getName() + "' needs to be integer");
- return MadeChange;
+ return true;
}
/// EnforceFloatingPoint - Remove all integer types from this set.
bool EEVT::TypeSet::EnforceFloatingPoint(TreePattern &TP) {
- TypeSet InputSet(*this);
- bool MadeChange = false;
-
// If we know nothing, then get the full set.
if (TypeVec.empty())
- MadeChange = FillWithPossibleTypes(TP);
-
+ return FillWithPossibleTypes(TP, isFloatingPoint, "floating point");
+
if (!hasIntegerTypes())
- return MadeChange;
+ return false;
+
+ TypeSet InputSet(*this);
// Filter out all the fp types.
for (unsigned i = 0; i != TypeVec.size(); ++i)
- if (isInteger(TypeVec[i]))
+ if (!isFloatingPoint(TypeVec[i]))
TypeVec.erase(TypeVec.begin()+i--);
if (TypeVec.empty())
TP.error("Type inference contradiction found, '" +
InputSet.getName() + "' needs to be floating point");
- return MadeChange;
+ return true;
}
/// EnforceScalar - Remove all vector types from this.
bool EEVT::TypeSet::EnforceScalar(TreePattern &TP) {
- TypeSet InputSet(*this);
- bool MadeChange = false;
-
// If we know nothing, then get the full set.
if (TypeVec.empty())
- MadeChange = FillWithPossibleTypes(TP);
-
+ return FillWithPossibleTypes(TP, isScalar, "scalar");
+
if (!hasVectorTypes())
- return MadeChange;
+ return false;
+
+ TypeSet InputSet(*this);
// Filter out all the vector types.
for (unsigned i = 0; i != TypeVec.size(); ++i)
- if (isVector(TypeVec[i]))
+ if (!isScalar(TypeVec[i]))
TypeVec.erase(TypeVec.begin()+i--);
if (TypeVec.empty())
TP.error("Type inference contradiction found, '" +
InputSet.getName() + "' needs to be scalar");
- return MadeChange;
+ return true;
}
/// EnforceVector - Remove all vector types from this.
bool EEVT::TypeSet::EnforceVector(TreePattern &TP) {
- TypeSet InputSet(*this);
- bool MadeChange = false;
-
// If we know nothing, then get the full set.
if (TypeVec.empty())
- MadeChange = FillWithPossibleTypes(TP);
+ return FillWithPossibleTypes(TP, isVector, "vector");
+
+ TypeSet InputSet(*this);
+ bool MadeChange = false;
// Filter out all the scalar types.
for (unsigned i = 0; i != TypeVec.size(); ++i)
- if (!isVector(TypeVec[i]))
+ if (!isVector(TypeVec[i])) {
TypeVec.erase(TypeVec.begin()+i--);
+ MadeChange = true;
+ }
if (TypeVec.empty())
TP.error("Type inference contradiction found, '" +
@@ -384,7 +402,7 @@
// If we know nothing, then get the full set.
if (TypeVec.empty())
- MadeChange = FillWithPossibleTypes(TP);
+ MadeChange = FillWithPossibleTypes(TP, isVector, "vector");
// Filter out all the non-vector types and types which don't have the right
// element type.
Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=98968&r1=98967&r2=98968&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original)
+++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Fri Mar 19 12:41:26 2010
@@ -54,7 +54,7 @@
/// Vector has one concrete type: The type is completely known.
///
class TypeSet {
- SmallVector<MVT::SimpleValueType, 2> TypeVec;
+ SmallVector<MVT::SimpleValueType, 4> TypeVec;
public:
TypeSet() {}
TypeSet(MVT::SimpleValueType VT, TreePattern &TP);
@@ -136,8 +136,11 @@
private:
/// FillWithPossibleTypes - Set to all legal types and return true, only
- /// valid on completely unknown type sets
- bool FillWithPossibleTypes(TreePattern &TP);
+ /// valid on completely unknown type sets. If Pred is non-null, only MVTs
+ /// that pass the predicate are added.
+ bool FillWithPossibleTypes(TreePattern &TP,
+ bool (*Pred)(MVT::SimpleValueType) = 0,
+ const char *PredicateName = 0);
};
}
More information about the llvm-commits
mailing list