change CheckOpcodeMatcher to hold the SDNodeInfo instead of

the opcode name.  This gives the optimizer more semantic info.

llvm-svn: 97346
This commit is contained in:
Chris Lattner 2010-02-27 21:48:43 +00:00
parent f159afc951
commit 278606b06e
5 changed files with 32 additions and 31 deletions

View File

@ -81,7 +81,7 @@ void CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
} }
void CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { void CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n'; OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n';
} }
void CheckMultiOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const{ void CheckMultiOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const{
@ -202,13 +202,13 @@ unsigned CheckPredicateMatcher::getHashImpl() const {
} }
unsigned CheckOpcodeMatcher::getHashImpl() const { unsigned CheckOpcodeMatcher::getHashImpl() const {
return HashString(OpcodeName); return HashString(Opcode.getEnumName());
} }
unsigned CheckMultiOpcodeMatcher::getHashImpl() const { unsigned CheckMultiOpcodeMatcher::getHashImpl() const {
unsigned Result = 0; unsigned Result = 0;
for (unsigned i = 0, e = OpcodeNames.size(); i != e; ++i) for (unsigned i = 0, e = Opcodes.size(); i != e; ++i)
Result |= HashString(OpcodeNames[i]); Result |= HashString(Opcodes[i]->getEnumName());
return Result; return Result;
} }
@ -263,7 +263,7 @@ unsigned CompleteMatchMatcher::getHashImpl() const {
bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) { if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) {
// One node can't have two different opcodes! // One node can't have two different opcodes!
return COM->getOpcodeName() != getOpcodeName(); return &COM->getOpcode() != &getOpcode();
} }
// TODO: CheckMultiOpcodeMatcher? // TODO: CheckMultiOpcodeMatcher?
@ -272,8 +272,8 @@ bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
// ISD::STORE nodes can't have non-void type. // ISD::STORE nodes can't have non-void type.
if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M))
// FIXME: This sucks, get void nodes from type constraints. // FIXME: This sucks, get void nodes from type constraints.
return (getOpcodeName() == "ISD::STORE" || return (getOpcode().getEnumName() == "ISD::STORE" ||
getOpcodeName() == "ISD::INTRINSIC_VOID") && getOpcode().getEnumName() == "ISD::INTRINSIC_VOID") &&
CT->getType() != MVT::isVoid; CT->getType() != MVT::isVoid;
return false; return false;

View File

@ -23,6 +23,7 @@ namespace llvm {
class raw_ostream; class raw_ostream;
class ComplexPattern; class ComplexPattern;
class Record; class Record;
class SDNodeInfo;
Matcher *ConvertPatternToMatcher(const PatternToMatch &Pattern, Matcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,
const CodeGenDAGPatterns &CGP); const CodeGenDAGPatterns &CGP);
@ -386,12 +387,12 @@ private:
/// CheckOpcodeMatcher - This checks to see if the current node has the /// CheckOpcodeMatcher - This checks to see if the current node has the
/// specified opcode, if not it fails to match. /// specified opcode, if not it fails to match.
class CheckOpcodeMatcher : public Matcher { class CheckOpcodeMatcher : public Matcher {
StringRef OpcodeName; const SDNodeInfo &Opcode;
public: public:
CheckOpcodeMatcher(StringRef opcodename) CheckOpcodeMatcher(const SDNodeInfo &opcode)
: Matcher(CheckOpcode), OpcodeName(opcodename) {} : Matcher(CheckOpcode), Opcode(opcode) {}
StringRef getOpcodeName() const { return OpcodeName; } const SDNodeInfo &getOpcode() const { return Opcode; }
static inline bool classof(const Matcher *N) { static inline bool classof(const Matcher *N) {
return N->getKind() == CheckOpcode; return N->getKind() == CheckOpcode;
@ -402,7 +403,7 @@ public:
private: private:
virtual void printImpl(raw_ostream &OS, unsigned indent) const; virtual void printImpl(raw_ostream &OS, unsigned indent) const;
virtual bool isEqualImpl(const Matcher *M) const { virtual bool isEqualImpl(const Matcher *M) const {
return cast<CheckOpcodeMatcher>(M)->OpcodeName == OpcodeName; return &cast<CheckOpcodeMatcher>(M)->Opcode == &Opcode;
} }
virtual unsigned getHashImpl() const; virtual unsigned getHashImpl() const;
virtual bool isContradictoryImpl(const Matcher *M) const; virtual bool isContradictoryImpl(const Matcher *M) const;
@ -411,13 +412,13 @@ private:
/// CheckMultiOpcodeMatcher - This checks to see if the current node has one /// CheckMultiOpcodeMatcher - This checks to see if the current node has one
/// of the specified opcode, if not it fails to match. /// of the specified opcode, if not it fails to match.
class CheckMultiOpcodeMatcher : public Matcher { class CheckMultiOpcodeMatcher : public Matcher {
SmallVector<StringRef, 4> OpcodeNames; SmallVector<const SDNodeInfo*, 4> Opcodes;
public: public:
CheckMultiOpcodeMatcher(const StringRef *opcodes, unsigned numops) CheckMultiOpcodeMatcher(const SDNodeInfo * const *opcodes, unsigned numops)
: Matcher(CheckMultiOpcode), OpcodeNames(opcodes, opcodes+numops) {} : Matcher(CheckMultiOpcode), Opcodes(opcodes, opcodes+numops) {}
unsigned getNumOpcodeNames() const { return OpcodeNames.size(); } unsigned getNumOpcodes() const { return Opcodes.size(); }
StringRef getOpcodeName(unsigned i) const { return OpcodeNames[i]; } const SDNodeInfo &getOpcode(unsigned i) const { return *Opcodes[i]; }
static inline bool classof(const Matcher *N) { static inline bool classof(const Matcher *N) {
return N->getKind() == CheckMultiOpcode; return N->getKind() == CheckMultiOpcode;
@ -428,7 +429,7 @@ public:
private: private:
virtual void printImpl(raw_ostream &OS, unsigned indent) const; virtual void printImpl(raw_ostream &OS, unsigned indent) const;
virtual bool isEqualImpl(const Matcher *M) const { virtual bool isEqualImpl(const Matcher *M) const {
return cast<CheckMultiOpcodeMatcher>(M)->OpcodeNames == OpcodeNames; return cast<CheckMultiOpcodeMatcher>(M)->Opcodes == Opcodes;
} }
virtual unsigned getHashImpl() const; virtual unsigned getHashImpl() const;
}; };

View File

@ -269,16 +269,16 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
case Matcher::CheckOpcode: case Matcher::CheckOpcode:
OS << "OPC_CheckOpcode, " OS << "OPC_CheckOpcode, "
<< cast<CheckOpcodeMatcher>(N)->getOpcodeName() << ",\n"; << cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << ",\n";
return 2; return 2;
case Matcher::CheckMultiOpcode: { case Matcher::CheckMultiOpcode: {
const CheckMultiOpcodeMatcher *CMO = cast<CheckMultiOpcodeMatcher>(N); const CheckMultiOpcodeMatcher *CMO = cast<CheckMultiOpcodeMatcher>(N);
OS << "OPC_CheckMultiOpcode, " << CMO->getNumOpcodeNames() << ", "; OS << "OPC_CheckMultiOpcode, " << CMO->getNumOpcodes() << ", ";
for (unsigned i = 0, e = CMO->getNumOpcodeNames(); i != e; ++i) for (unsigned i = 0, e = CMO->getNumOpcodes(); i != e; ++i)
OS << CMO->getOpcodeName(i) << ", "; OS << CMO->getOpcode(i).getEnumName() << ", ";
OS << '\n'; OS << '\n';
return 2 + CMO->getNumOpcodeNames(); return 2 + CMO->getNumOpcodes();
} }
case Matcher::CheckType: case Matcher::CheckType:

View File

@ -252,14 +252,12 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
if (N == Pattern.getSrcPattern()) { if (N == Pattern.getSrcPattern()) {
const std::vector<Record*> &OpNodes = CP.getRootNodes(); const std::vector<Record*> &OpNodes = CP.getRootNodes();
if (OpNodes.size() == 1) { if (OpNodes.size() == 1) {
StringRef OpName = CGP.getSDNodeInfo(OpNodes[0]).getEnumName(); AddMatcher(new CheckOpcodeMatcher(CGP.getSDNodeInfo(OpNodes[0])));
AddMatcher(new CheckOpcodeMatcher(OpName));
} else if (!OpNodes.empty()) { } else if (!OpNodes.empty()) {
SmallVector<StringRef, 4> OpNames; SmallVector<const SDNodeInfo*, 4> OpNames;
for (unsigned i = 0, e = OpNodes.size(); i != e; i++) for (unsigned i = 0, e = OpNodes.size(); i != e; i++)
OpNames.push_back(CGP.getSDNodeInfo(OpNodes[i]).getEnumName()); OpNames.push_back(&CGP.getSDNodeInfo(OpNodes[i]));
AddMatcher(new CheckMultiOpcodeMatcher(OpNames.data(), AddMatcher(new CheckMultiOpcodeMatcher(OpNames.data(), OpNames.size()));
OpNames.size()));
} }
} }
@ -337,7 +335,7 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N,
} }
// Check that the current opcode lines up. // Check that the current opcode lines up.
AddMatcher(new CheckOpcodeMatcher(CInfo.getEnumName())); AddMatcher(new CheckOpcodeMatcher(CInfo));
// If there are node predicates for this node, generate their checks. // If there are node predicates for this node, generate their checks.
for (unsigned i = 0, e = N->getPredicateFns().size(); i != e; ++i) for (unsigned i = 0, e = N->getPredicateFns().size(); i != e; ++i)

View File

@ -201,7 +201,9 @@ static void FactorNodes(OwningPtr<Matcher> &MatcherPtr) {
--e; --e;
} }
if (Scan != e) { if (Scan != e &&
// Don't print it's obvious nothing extra could be merged anyway.
Scan+1 != e) {
DEBUG(errs() << "Couldn't merge this:\n"; DEBUG(errs() << "Couldn't merge this:\n";
Optn->print(errs(), 4); Optn->print(errs(), 4);
errs() << "into this:\n"; errs() << "into this:\n";