[llvm] r293760 - [globalisel] Make the MatchAction hierarchy consistent with the matchers. NFC.
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 1 02:53:10 PST 2017
Author: dsanders
Date: Wed Feb 1 04:53:10 2017
New Revision: 293760
URL: http://llvm.org/viewvc/llvm-project?rev=293760&view=rev
Log:
[globalisel] Make the MatchAction hierarchy consistent with the matchers. NFC.
Reviewers: aditya_nandakumar, rovka, t.p.northover, qcolombet, ab
Subscribers: dberris, llvm-commits, kristof.beyls
Differential Revision: https://reviews.llvm.org/D29321
Modified:
llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
Modified: llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp?rev=293760&r1=293759&r2=293760&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp Wed Feb 1 04:53:10 2017
@@ -110,16 +110,6 @@ static bool isTrivialOperatorNode(const
//===- Matchers -----------------------------------------------------------===//
-struct MatchAction {
- virtual ~MatchAction() {}
- virtual void emit(raw_ostream &OS) const = 0;
-};
-
-raw_ostream &operator<<(raw_ostream &S, const MatchAction &A) {
- A.emit(S);
- return S;
-}
-
template <class PredicateTy> class PredicateListMatcher {
private:
typedef std::vector<std::unique_ptr<PredicateTy>> PredicateVec;
@@ -293,11 +283,22 @@ public:
}
};
-struct MutateOpcode : public MatchAction {
- MutateOpcode(const CodeGenInstruction *I) : I(I) {}
+//===- Actions ------------------------------------------------------------===//
+
+class MatchAction {
+public:
+ virtual ~MatchAction() {}
+ virtual void emitCxxActionStmts(raw_ostream &OS) const = 0;
+};
+
+class MutateOpcodeAction : public MatchAction {
+private:
const CodeGenInstruction *I;
- virtual void emit(raw_ostream &OS) const {
+public:
+ MutateOpcodeAction(const CodeGenInstruction *I) : I(I) {}
+
+ virtual void emitCxxActionStmts(raw_ostream &OS) const {
OS << "I.setDesc(TII.get(" << I->Namespace << "::" << I->TheDef->getName()
<< "));";
}
@@ -312,9 +313,9 @@ class RuleMatcher {
const PatternToMatch &P;
std::vector<std::unique_ptr<InstructionMatcher>> Matchers;
+ std::vector<std::unique_ptr<MatchAction>> Actions;
public:
- std::vector<std::unique_ptr<MatchAction>> Actions;
RuleMatcher(const PatternToMatch &P) : P(P) {}
@@ -323,6 +324,12 @@ public:
return *Matchers.back();
}
+ template <class Kind, class... Args>
+ Kind &addAction(Args&&... args) {
+ Actions.emplace_back(llvm::make_unique<Kind>(std::forward<Args>(args)...));
+ return *static_cast<Kind *>(Actions.back().get());
+ }
+
void emit(raw_ostream &OS) {
if (Matchers.empty())
llvm_unreachable("Unexpected empty matcher!");
@@ -344,8 +351,11 @@ public:
Matchers.front()->emitCxxPredicateExpr(OS, "I");
OS << ") {\n";
- for (auto &MA : Actions)
- OS << " " << *MA << "\n";
+ for (const auto &MA : Actions) {
+ OS << " ";
+ MA->emitCxxActionStmts(OS);
+ OS << "\n";
+ }
OS << " constrainSelectedInstRegOperands(I, TII, TRI, RBI);\n";
OS << " return true;\n";
@@ -410,7 +420,7 @@ GlobalISelEmitter::runOnPattern(const Pa
// The operators look good: match the opcode and mutate it to the new one.
InstructionMatcher &InsnMatcher = M.addInstructionMatcher();
InsnMatcher.addPredicate<InstructionOpcodeMatcher>(&SrcGI);
- M.Actions.emplace_back(new MutateOpcode(&DstI));
+ M.addAction<MutateOpcodeAction>(&DstI);
// Next, analyze the children, only accepting patterns that don't require
// any change to operands.
More information about the llvm-commits
mailing list