From: Ahmed Bougacha Date: Sat, 4 Feb 2017 00:47:08 +0000 (+0000) Subject: [GlobalISel] Print the matched patterns using an action. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f2992531eb97eb920ed970dbd801e488042fa274;p=llvm [GlobalISel] Print the matched patterns using an action. This lets us split out PatternToMatch from the top-level RuleMatcher, where it doesn't really belong. That, in turn, lets us eventually generate RuleMatchers from non-SelectionDAG sources. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294076 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/TableGen/GlobalISelEmitter.td b/test/TableGen/GlobalISelEmitter.td index 9a7fabb7588..a29ed4aea01 100644 --- a/test/TableGen/GlobalISelEmitter.td +++ b/test/TableGen/GlobalISelEmitter.td @@ -34,6 +34,7 @@ class I Pat> // CHECK-NEXT: (((MRI.getType(I.getOperand(2).getReg()) == (LLT::scalar(32))) && // CHECK-NEXT: ((&RBI.getRegBankFromRegClass(MyTarget::GPR32RegClass) == RBI.getRegBank(I.getOperand(2).getReg(), MRI, TRI)))))) { +// CHECK-NEXT: // (add:i32 GPR32:i32:$src1, GPR32:i32:$src2) => (ADD:i32 GPR32:i32:$src1, GPR32:i32:$src2) // CHECK-NEXT: I.setDesc(TII.get(MyTarget::ADD)); // CHECK-NEXT: constrainSelectedInstRegOperands(I, TII, TRI, RBI); // CHECK-NEXT: return true; @@ -47,6 +48,7 @@ def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2), // CHECK: if ((I.getOpcode() == TargetOpcode::G_BR) && // CHECK-NEXT: (((I.getOperand(0).isMBB())))) { +// CHECK-NEXT: // (br (bb:Other):$target) => (BR (bb:Other):$target) // CHECK-NEXT: I.setDesc(TII.get(MyTarget::BR)); // CHECK-NEXT: constrainSelectedInstRegOperands(I, TII, TRI, RBI); // CHECK-NEXT: return true; diff --git a/utils/TableGen/GlobalISelEmitter.cpp b/utils/TableGen/GlobalISelEmitter.cpp index 1d16c5cb6c1..45567b23787 100644 --- a/utils/TableGen/GlobalISelEmitter.cpp +++ b/utils/TableGen/GlobalISelEmitter.cpp @@ -291,6 +291,19 @@ public: virtual void emitCxxActionStmts(raw_ostream &OS) const = 0; }; +/// Generates a comment describing the matched rule being acted upon. +class DebugCommentAction : public MatchAction { +private: + const PatternToMatch &P; + +public: + DebugCommentAction(const PatternToMatch &P) : P(P) {} + + virtual void emitCxxActionStmts(raw_ostream &OS) const { + OS << "// " << *P.getSrcPattern() << " => " << *P.getDstPattern(); + } +}; + class MutateOpcodeAction : public MatchAction { private: const CodeGenInstruction *I; @@ -310,14 +323,11 @@ public: /// support multiple positions to support div/rem fusion or load-multiple /// instructions. class RuleMatcher { - const PatternToMatch &P; - std::vector> Matchers; std::vector> Actions; public: - - RuleMatcher(const PatternToMatch &P) : P(P) {} + RuleMatcher() {} InstructionMatcher &addInstructionMatcher() { Matchers.emplace_back(new InstructionMatcher()); @@ -334,9 +344,6 @@ public: if (Matchers.empty()) llvm_unreachable("Unexpected empty matcher!"); - OS << " // Src: " << *P.getSrcPattern() << "\n" - << " // Dst: " << *P.getDstPattern() << "\n"; - // The representation supports rules that require multiple roots such as: // %ptr(p0) = ... // %elt0(s32) = G_LOAD %ptr @@ -385,7 +392,8 @@ Optional GlobalISelEmitter::runOnPattern(const PatternToMatch &P, raw_ostream &OS) { // Keep track of the matchers and actions to emit. - RuleMatcher M(P); + RuleMatcher M; + M.addAction(P); // First, analyze the whole pattern. // If the entire pattern has a predicate (e.g., target features), ignore it.