[PATCH] D32869: [globalisel][tablegen] Require that all registers between instructions of a match are virtual.

Daniel Sanders via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 4 09:57:41 PDT 2017


dsanders created this revision.
Herald added a subscriber: igorb.

Without this, it's possible to encounter multiple defs for a register.

This is triggered by the current version of https://reviews.llvm.org/D32868 when applied to trunk.


https://reviews.llvm.org/D32869

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


Index: utils/TableGen/GlobalISelEmitter.cpp
===================================================================
--- utils/TableGen/GlobalISelEmitter.cpp
+++ utils/TableGen/GlobalISelEmitter.cpp
@@ -776,6 +776,8 @@
   void emitCxxCaptureStmts(raw_ostream &OS, RuleMatcher &Rule,
                            StringRef OperandExpr) const override {
     OS << "if (!" << OperandExpr + ".isReg())\n"
+       << "  return false;\n"
+       << "if (TRI.isPhysicalRegister(" << OperandExpr + ".getReg()))\n"
        << "  return false;\n";
     std::string InsnVarName = Rule.defineInsnVar(
         OS, *InsnMatcher,
Index: test/TableGen/GlobalISelEmitter.td
===================================================================
--- test/TableGen/GlobalISelEmitter.td
+++ test/TableGen/GlobalISelEmitter.td
@@ -138,6 +138,8 @@
 // CHECK-NEXT:      return false;
 // CHECK-NEXT:    if (!MI0->getOperand(1).isReg())
 // CHECK-NEXT:      return false;
+// CHECK-NEXT:    if (TRI.isPhysicalRegister(MI0->getOperand(1).getReg()))
+// CHECK-NEXT:      return false;
 // CHECK-NEXT:    MachineInstr *MI1 = MRI.getVRegDef(MI0->getOperand(1).getReg());
 // CHECK-NEXT:    if (!MI1 || MI1->getNumOperands() < 3)
 // CHECK-NEXT:      return false;
@@ -180,6 +182,8 @@
 // CHECK-NEXT:      return false;
 // CHECK-NEXT:    if (!MI0->getOperand(2).isReg())
 // CHECK-NEXT:      return false;
+// CHECK-NEXT:    if (TRI.isPhysicalRegister(MI0->getOperand(2).getReg()))
+// CHECK-NEXT:      return false;
 // CHECK-NEXT:    MachineInstr *MI1 = MRI.getVRegDef(MI0->getOperand(2).getReg());
 // CHECK-NEXT:    if (!MI1 || MI1->getNumOperands() < 3)
 // CHECK-NEXT:      return false;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32869.97841.patch
Type: text/x-patch
Size: 1659 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170504/556f9b60/attachment.bin>


More information about the llvm-commits mailing list