diff options
author | Quentin Colombet <qcolombet@apple.com> | 2017-12-14 23:44:07 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2017-12-14 23:44:07 +0000 |
commit | 9f7a094913edb32aca3266d4a2ad76c36cf1578f (patch) | |
tree | 036a14b8aecbede958eb4bed4849661da802d0d8 /utils | |
parent | f1cb8efedeb65da55ff87449a6c83ad7e839b090 (diff) |
[TableGen][GlobalISel] Add a common class for all PredicateMatcher
NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320767 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/GlobalISelEmitter.cpp | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/utils/TableGen/GlobalISelEmitter.cpp b/utils/TableGen/GlobalISelEmitter.cpp index 062fe59d820..8b5defd9d32 100644 --- a/utils/TableGen/GlobalISelEmitter.cpp +++ b/utils/TableGen/GlobalISelEmitter.cpp @@ -766,13 +766,7 @@ public: } }; -/// Generates code to check a predicate of an operand. -/// -/// Typical predicates include: -/// * Operand is a particular register. -/// * Operand is assigned a particular register bank. -/// * Operand is an MBB. -class OperandPredicateMatcher { +class PredicateMatcher { public: /// This enum is used for RTTI and also defines the priority that is given to /// the predicate when generating the matcher code. Kinds with higher priority @@ -781,7 +775,13 @@ public: /// The relative priority of OPM_LLT, OPM_RegBank, and OPM_MBB do not matter /// but OPM_Int must have priority over OPM_RegBank since constant integers /// are represented by a virtual register defined by a G_CONSTANT instruction. + /// + /// Note: The relative priority between IPM_ and OPM_ does not matter, they + /// are currently not compared between each other. enum PredicateKind { + IPM_Opcode, + IPM_ImmPredicate, + IPM_AtomicOrderingMMO, OPM_SameOperand, OPM_ComplexPattern, OPM_IntrinsicID, @@ -798,10 +798,27 @@ protected: PredicateKind Kind; public: - OperandPredicateMatcher(PredicateKind Kind) : Kind(Kind) {} - virtual ~OperandPredicateMatcher() {} + PredicateMatcher(PredicateKind Kind) : Kind(Kind) {} + + virtual ~PredicateMatcher() = default; + /// Emit MatchTable opcodes that check the predicate for the given operand. + virtual void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, + unsigned InsnVarID, + unsigned OpIdx = ~0) const = 0; PredicateKind getKind() const { return Kind; } +}; + +/// Generates code to check a predicate of an operand. +/// +/// Typical predicates include: +/// * Operand is a particular register. +/// * Operand is assigned a particular register bank. +/// * Operand is an MBB. +class OperandPredicateMatcher : public PredicateMatcher { +public: + OperandPredicateMatcher(PredicateKind Kind) : PredicateMatcher(Kind) {} + virtual ~OperandPredicateMatcher() {} /// Emit MatchTable opcodes to capture instructions into the MIs table. /// @@ -810,11 +827,6 @@ public: virtual void emitCaptureOpcodes(MatchTable &Table, RuleMatcher &Rule, unsigned InsnVarID, unsigned OpIdx) const {} - /// Emit MatchTable opcodes that check the predicate for the given operand. - virtual void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, - unsigned InsnVarID, - unsigned OpIdx) const = 0; - /// Compare the priority of this object and B. /// /// Returns true if this object is more important than B. @@ -861,7 +873,7 @@ public: KnownTypes.insert(Ty); } - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_LLT; } @@ -922,7 +934,7 @@ public: : OperandPredicateMatcher(OPM_ComplexPattern), Operand(Operand), TheDef(TheDef) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_ComplexPattern; } @@ -951,7 +963,7 @@ public: RegisterBankOperandMatcher(const CodeGenRegisterClass &RC) : OperandPredicateMatcher(OPM_RegBank), RC(RC) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_RegBank; } @@ -971,7 +983,7 @@ class MBBOperandMatcher : public OperandPredicateMatcher { public: MBBOperandMatcher() : OperandPredicateMatcher(OPM_MBB) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_MBB; } @@ -993,7 +1005,7 @@ public: ConstantIntOperandMatcher(int64_t Value) : OperandPredicateMatcher(OPM_Int), Value(Value) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_Int; } @@ -1016,7 +1028,7 @@ public: LiteralIntOperandMatcher(int64_t Value) : OperandPredicateMatcher(OPM_LiteralInt), Value(Value) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_LiteralInt; } @@ -1038,7 +1050,7 @@ public: IntrinsicIDOperandMatcher(const CodeGenIntrinsic *II) : OperandPredicateMatcher(OPM_IntrinsicID), II(II) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_IntrinsicID; } @@ -1199,30 +1211,11 @@ unsigned ComplexPatternOperandMatcher::getAllocatedTemporariesBaseID() const { /// Typical predicates include: /// * The opcode of the instruction is a particular value. /// * The nsw/nuw flag is/isn't set. -class InstructionPredicateMatcher { -protected: - /// This enum is used for RTTI and also defines the priority that is given to - /// the predicate when generating the matcher code. Kinds with higher priority - /// must be tested first. - enum PredicateKind { - IPM_Opcode, - IPM_ImmPredicate, - IPM_AtomicOrderingMMO, - }; - - PredicateKind Kind; - +class InstructionPredicateMatcher : public PredicateMatcher { public: - InstructionPredicateMatcher(PredicateKind Kind) : Kind(Kind) {} + InstructionPredicateMatcher(PredicateKind Kind) : PredicateMatcher(Kind) {} virtual ~InstructionPredicateMatcher() {} - PredicateKind getKind() const { return Kind; } - - /// Emit MatchTable opcodes that test whether the instruction named in - /// InsnVarID matches the predicate. - virtual void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, - unsigned InsnVarID) const = 0; - /// Compare the priority of this object and B. /// /// Returns true if this object is more important than B. @@ -1251,12 +1244,13 @@ public: InstructionOpcodeMatcher(const CodeGenInstruction *I) : InstructionPredicateMatcher(IPM_Opcode), I(I) {} - static bool classof(const InstructionPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == IPM_Opcode; } void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, - unsigned InsnVarID) const override { + unsigned InsnVarID, + unsigned OpIdx = ~0) const override { Table << MatchTable::Opcode("GIM_CheckOpcode") << MatchTable::Comment("MI") << MatchTable::IntValue(InsnVarID) << MatchTable::NamedValue(I->Namespace, I->TheDef->getName()) @@ -1322,12 +1316,13 @@ public: InstructionImmPredicateMatcher(const TreePredicateFn &Predicate) : InstructionPredicateMatcher(IPM_ImmPredicate), Predicate(Predicate) {} - static bool classof(const InstructionPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == IPM_ImmPredicate; } void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, - unsigned InsnVarID) const override { + unsigned InsnVarID, + unsigned OpIdx = ~0) const override { Table << MatchTable::Opcode(getMatchOpcodeForPredicate(Predicate)) << MatchTable::Comment("MI") << MatchTable::IntValue(InsnVarID) << MatchTable::Comment("Predicate") @@ -1361,7 +1356,8 @@ public: } void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule, - unsigned InsnVarID) const override { + unsigned InsnVarID, + unsigned OpIdx = ~0) const override { StringRef Opcode = "GIM_CheckAtomicOrdering"; if (Comparator == AO_OrStronger) @@ -1526,7 +1522,7 @@ public: : OperandPredicateMatcher(OPM_Instruction), InsnMatcher(new InstructionMatcher(Rule, SymbolicName)) {} - static bool classof(const OperandPredicateMatcher *P) { + static bool classof(const PredicateMatcher *P) { return P->getKind() == OPM_Instruction; } |