forked from OSchip/llvm-project
[TableGen] Some optimizations to TableGen.
This changes some STL data types to corresponding LLVM data types that have better performance characteristics. Differential Revision: https://reviews.llvm.org/D37957 llvm-svn: 313783
This commit is contained in:
parent
e2ef050067
commit
249dc14979
|
@ -13,10 +13,12 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "CodeGenDAGPatterns.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
@ -25,7 +27,6 @@
|
|||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "dag-patterns"
|
||||
|
@ -98,7 +99,7 @@ bool TypeSetByHwMode::isPossible() const {
|
|||
|
||||
bool TypeSetByHwMode::insert(const ValueTypeByHwMode &VVT) {
|
||||
bool Changed = false;
|
||||
std::set<unsigned> Modes;
|
||||
SmallDenseSet<unsigned, 4> Modes;
|
||||
for (const auto &P : VVT) {
|
||||
unsigned M = P.first;
|
||||
Modes.insert(M);
|
||||
|
@ -114,7 +115,6 @@ bool TypeSetByHwMode::insert(const ValueTypeByHwMode &VVT) {
|
|||
if (!Modes.count(I.first))
|
||||
Changed |= I.second.insert(DT).second;
|
||||
}
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
|
@ -164,40 +164,37 @@ bool TypeSetByHwMode::assign_if(const TypeSetByHwMode &VTS, Predicate P) {
|
|||
return !empty();
|
||||
}
|
||||
|
||||
std::string TypeSetByHwMode::getAsString() const {
|
||||
std::stringstream str;
|
||||
std::vector<unsigned> Modes;
|
||||
void TypeSetByHwMode::writeToStream(raw_ostream &OS) const {
|
||||
SmallVector<unsigned, 4> Modes;
|
||||
Modes.reserve(Map.size());
|
||||
|
||||
for (const auto &I : *this)
|
||||
Modes.push_back(I.first);
|
||||
if (Modes.empty())
|
||||
return "{}";
|
||||
if (Modes.empty()) {
|
||||
OS << "{}";
|
||||
return;
|
||||
}
|
||||
array_pod_sort(Modes.begin(), Modes.end());
|
||||
|
||||
str << '{';
|
||||
OS << '{';
|
||||
for (unsigned M : Modes) {
|
||||
const SetType &S = get(M);
|
||||
str << ' ' << getModeName(M) << ':' << getAsString(S);
|
||||
OS << ' ' << getModeName(M) << ':';
|
||||
writeToStream(get(M), OS);
|
||||
}
|
||||
str << " }";
|
||||
return str.str();
|
||||
OS << " }";
|
||||
}
|
||||
|
||||
std::string TypeSetByHwMode::getAsString(const SetType &S) {
|
||||
std::vector<MVT> Types;
|
||||
for (MVT T : S)
|
||||
Types.push_back(T);
|
||||
void TypeSetByHwMode::writeToStream(const SetType &S, raw_ostream &OS) {
|
||||
SmallVector<MVT, 4> Types(S.begin(), S.end());
|
||||
array_pod_sort(Types.begin(), Types.end());
|
||||
|
||||
std::stringstream str;
|
||||
str << '[';
|
||||
OS << '[';
|
||||
for (unsigned i = 0, e = Types.size(); i != e; ++i) {
|
||||
str << ValueTypeByHwMode::getMVTName(Types[i]);
|
||||
OS << ValueTypeByHwMode::getMVTName(Types[i]);
|
||||
if (i != e-1)
|
||||
str << ' ';
|
||||
OS << ' ';
|
||||
}
|
||||
str << ']';
|
||||
return str.str();
|
||||
OS << ']';
|
||||
}
|
||||
|
||||
bool TypeSetByHwMode::operator==(const TypeSetByHwMode &VTS) const {
|
||||
|
@ -211,7 +208,7 @@ bool TypeSetByHwMode::operator==(const TypeSetByHwMode &VTS) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
std::set<unsigned> Modes;
|
||||
SmallDenseSet<unsigned, 4> Modes;
|
||||
for (auto &I : *this)
|
||||
Modes.insert(I.first);
|
||||
for (const auto &I : VTS)
|
||||
|
@ -243,7 +240,8 @@ bool TypeSetByHwMode::operator==(const TypeSetByHwMode &VTS) const {
|
|||
|
||||
LLVM_DUMP_METHOD
|
||||
void TypeSetByHwMode::dump() const {
|
||||
dbgs() << getAsString() << '\n';
|
||||
writeToStream(dbgs());
|
||||
dbgs() << '\n';
|
||||
}
|
||||
|
||||
bool TypeSetByHwMode::intersect(SetType &Out, const SetType &In) {
|
||||
|
@ -784,6 +782,7 @@ void TypeInfer::expandOverloads(TypeSetByHwMode::SetType &Out,
|
|||
for (MVT T : Out) {
|
||||
if (!T.isOverloaded())
|
||||
continue;
|
||||
|
||||
Ovs.insert(T);
|
||||
// MachineValueTypeSet allows iteration and erasing.
|
||||
Out.erase(T);
|
||||
|
@ -1410,8 +1409,10 @@ void TreePatternNode::print(raw_ostream &OS) const {
|
|||
else
|
||||
OS << '(' << getOperator()->getName();
|
||||
|
||||
for (unsigned i = 0, e = Types.size(); i != e; ++i)
|
||||
OS << ':' << getExtType(i).getAsString();
|
||||
for (unsigned i = 0, e = Types.size(); i != e; ++i) {
|
||||
OS << ':';
|
||||
getExtType(i).writeToStream(OS);
|
||||
}
|
||||
|
||||
if (!isLeaf()) {
|
||||
if (getNumChildren() != 0) {
|
||||
|
@ -2628,7 +2629,10 @@ void CodeGenDAGPatterns::ParsePatternFragments(bool OutFrags) {
|
|||
|
||||
// Validate the argument list, converting it to set, to discard duplicates.
|
||||
std::vector<std::string> &Args = P->getArgList();
|
||||
std::set<std::string> OperandsSet(Args.begin(), Args.end());
|
||||
// Copy the args so we can take StringRefs to them.
|
||||
auto ArgsCopy = Args;
|
||||
SmallDenseSet<StringRef, 4> OperandsSet;
|
||||
OperandsSet.insert(ArgsCopy.begin(), ArgsCopy.end());
|
||||
|
||||
if (OperandsSet.count(""))
|
||||
P->error("Cannot have unnamed 'node' values in pattern fragment!");
|
||||
|
@ -3120,17 +3124,20 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern(
|
|||
|
||||
// Verify that the top-level forms in the instruction are of void type, and
|
||||
// fill in the InstResults map.
|
||||
SmallString<32> TypesString;
|
||||
for (unsigned j = 0, e = I->getNumTrees(); j != e; ++j) {
|
||||
TypesString.clear();
|
||||
TreePatternNode *Pat = I->getTree(j);
|
||||
if (Pat->getNumTypes() != 0) {
|
||||
std::string Types;
|
||||
raw_svector_ostream OS(TypesString);
|
||||
for (unsigned k = 0, ke = Pat->getNumTypes(); k != ke; ++k) {
|
||||
if (k > 0)
|
||||
Types += ", ";
|
||||
Types += Pat->getExtType(k).getAsString();
|
||||
OS << ", ";
|
||||
Pat->getExtType(k).writeToStream(OS);
|
||||
}
|
||||
I->error("Top-level forms in instruction pattern should have"
|
||||
" void types, has types " + Types);
|
||||
" void types, has types " +
|
||||
OS.str());
|
||||
}
|
||||
|
||||
// Find inputs and outputs, and verify the structure of the uses/defs.
|
||||
|
@ -3812,11 +3819,11 @@ void CodeGenDAGPatterns::ExpandHwModeBasedTypes() {
|
|||
}
|
||||
|
||||
/// Dependent variable map for CodeGenDAGPattern variant generation
|
||||
typedef std::map<std::string, int> DepVarMap;
|
||||
typedef StringMap<int> DepVarMap;
|
||||
|
||||
static void FindDepVarsOf(TreePatternNode *N, DepVarMap &DepMap) {
|
||||
if (N->isLeaf()) {
|
||||
if (isa<DefInit>(N->getLeafValue()))
|
||||
if (N->hasName() && isa<DefInit>(N->getLeafValue()))
|
||||
DepMap[N->getName()]++;
|
||||
} else {
|
||||
for (size_t i = 0, e = N->getNumChildren(); i != e; ++i)
|
||||
|
@ -3828,9 +3835,9 @@ static void FindDepVarsOf(TreePatternNode *N, DepVarMap &DepMap) {
|
|||
static void FindDepVars(TreePatternNode *N, MultipleUseVarSet &DepVars) {
|
||||
DepVarMap depcounts;
|
||||
FindDepVarsOf(N, depcounts);
|
||||
for (const std::pair<std::string, int> &Pair : depcounts) {
|
||||
if (Pair.second > 1)
|
||||
DepVars.insert(Pair.first);
|
||||
for (const auto &Pair : depcounts) {
|
||||
if (Pair.getValue() > 1)
|
||||
DepVars.insert(Pair.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3841,8 +3848,8 @@ static void DumpDepVars(MultipleUseVarSet &DepVars) {
|
|||
DEBUG(errs() << "<empty set>");
|
||||
} else {
|
||||
DEBUG(errs() << "[ ");
|
||||
for (const std::string &DepVar : DepVars) {
|
||||
DEBUG(errs() << DepVar << " ");
|
||||
for (const auto &DepVar : DepVars) {
|
||||
DEBUG(errs() << DepVar.getKey() << " ");
|
||||
}
|
||||
DEBUG(errs() << "]");
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "CodeGenTarget.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include <algorithm>
|
||||
|
@ -222,11 +223,11 @@ struct TypeSetByHwMode : public InfoByHwMode<MachineValueTypeSet> {
|
|||
bool insert(const ValueTypeByHwMode &VVT);
|
||||
bool constrain(const TypeSetByHwMode &VTS);
|
||||
template <typename Predicate> bool constrain(Predicate P);
|
||||
template <typename Predicate> bool assign_if(const TypeSetByHwMode &VTS,
|
||||
Predicate P);
|
||||
template <typename Predicate>
|
||||
bool assign_if(const TypeSetByHwMode &VTS, Predicate P);
|
||||
|
||||
std::string getAsString() const;
|
||||
static std::string getAsString(const SetType &S);
|
||||
void writeToStream(raw_ostream &OS) const;
|
||||
static void writeToStream(const SetType &S, raw_ostream &OS);
|
||||
|
||||
bool operator==(const TypeSetByHwMode &VTS) const;
|
||||
bool operator!=(const TypeSetByHwMode &VTS) const { return !(*this == VTS); }
|
||||
|
@ -333,7 +334,7 @@ private:
|
|||
};
|
||||
|
||||
/// Set type used to track multiply used variables in patterns
|
||||
typedef std::set<std::string> MultipleUseVarSet;
|
||||
typedef StringSet<> MultipleUseVarSet;
|
||||
|
||||
/// SDTypeConstraint - This is a discriminated union of constraints,
|
||||
/// corresponding to the SDTypeConstraint tablegen class in Target.td.
|
||||
|
|
Loading…
Reference in New Issue