forked from OSchip/llvm-project
[globalisel][tablegen] Require that all registers between instructions of a match are virtual.
Summary: Without this, it's possible to encounter multiple defs for a register. This is triggered by the current version of D32868 when applied to trunk. Reviewers: qcolombet, ab, t.p.northover, rovka, kristof.beyls Reviewed By: qcolombet Subscribers: llvm-commits, igorb Differential Revision: https://reviews.llvm.org/D32869 llvm-svn: 303253
This commit is contained in:
parent
eafa4aa910
commit
ed205a090d
|
@ -138,6 +138,8 @@ def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2),
|
|||
// 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.getNumOperands() < 3)
|
||||
// CHECK-NEXT: return false;
|
||||
|
@ -180,6 +182,8 @@ def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2),
|
|||
// 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.getNumOperands() < 3)
|
||||
// CHECK-NEXT: return false;
|
||||
|
|
|
@ -775,6 +775,8 @@ public:
|
|||
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,
|
||||
|
|
Loading…
Reference in New Issue