forked from OSchip/llvm-project
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:
parent
f159afc951
commit
278606b06e
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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";
|
||||||
|
|
Loading…
Reference in New Issue