]> granicus.if.org Git - llvm/commitdiff
[GlobalISel] Print the matched patterns using an action.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Sat, 4 Feb 2017 00:47:08 +0000 (00:47 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Sat, 4 Feb 2017 00:47:08 +0000 (00:47 +0000)
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

test/TableGen/GlobalISelEmitter.td
utils/TableGen/GlobalISelEmitter.cpp

index 9a7fabb75882aa9edb1baf1601af39ef0e18f309..a29ed4aea0144c4919bd340fdac219d9afaa544a 100644 (file)
@@ -34,6 +34,7 @@ class I<dag OOps, dag IOps, list<dag> 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;
index 1d16c5cb6c19844d84daf44b403922989a331155..45567b2378731284c3f94b23c2f67d75ac928a53 100644 (file)
@@ -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<std::unique_ptr<InstructionMatcher>> Matchers;
   std::vector<std::unique_ptr<MatchAction>> 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::SkipReason>
 GlobalISelEmitter::runOnPattern(const PatternToMatch &P, raw_ostream &OS) {
 
   // Keep track of the matchers and actions to emit.
-  RuleMatcher M(P);
+  RuleMatcher M;
+  M.addAction<DebugCommentAction>(P);
 
   // First, analyze the whole pattern.
   // If the entire pattern has a predicate (e.g., target features), ignore it.