| //===- GIMatchDagPredicate - Represent a predicate to check -----*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_UTILS_TABLEGEN_GIMATCHDAGPREDICATE_H |
| #define LLVM_UTILS_TABLEGEN_GIMATCHDAGPREDICATE_H |
| |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/StringRef.h" |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| #include "llvm/Support/raw_ostream.h" |
| #endif |
| |
| namespace llvm { |
| class CodeExpansions; |
| class CodeGenInstruction; |
| class GIMatchDagOperandList; |
| class GIMatchDagContext; |
| class raw_ostream; |
| |
| /// Represents a predicate on the match DAG. This records the details of the |
| /// predicate. The dependencies are stored in the GIMatchDag as edges. |
| /// |
| /// Instances of this class objects are owned by the GIMatchDag and are not |
| /// shareable between instances of GIMatchDag. |
| class GIMatchDagPredicate { |
| public: |
| enum GIMatchDagPredicateKind { |
| GIMatchDagPredicateKind_Opcode, |
| GIMatchDagPredicateKind_OneOfOpcodes, |
| GIMatchDagPredicateKind_SameMO, |
| }; |
| |
| protected: |
| const GIMatchDagPredicateKind Kind; |
| |
| /// The name of the predicate. For example: |
| /// (FOO $a:s32, $b, $c) |
| /// will cause 's32' to be assigned to this member for the $a predicate. |
| /// Similarly, the opcode predicate will cause 'FOO' to be assigned to this |
| /// member. Anonymous instructions will have a name assigned for debugging |
| /// purposes. |
| StringRef Name; |
| |
| /// The operand list for this predicate. This object may be shared with |
| /// other predicates of a similar 'shape'. |
| const GIMatchDagOperandList &OperandInfo; |
| |
| public: |
| GIMatchDagPredicate(GIMatchDagPredicateKind Kind, StringRef Name, |
| const GIMatchDagOperandList &OperandInfo) |
| : Kind(Kind), Name(Name), OperandInfo(OperandInfo) {} |
| virtual ~GIMatchDagPredicate() {} |
| |
| GIMatchDagPredicateKind getKind() const { return Kind; } |
| |
| StringRef getName() const { return Name; } |
| const GIMatchDagOperandList &getOperandInfo() const { return OperandInfo; } |
| |
| // Generate C++ code to check this predicate. If a partitioner has already |
| // tested this predicate then this function won't be called. If this function |
| // is called, it must emit code and return true to indicate that it did so. If |
| // it ever returns false, then the caller will abort due to an untested |
| // predicate. |
| virtual bool generateCheckCode(raw_ostream &OS, StringRef Indent, |
| const CodeExpansions &Expansions) const { |
| return false; |
| } |
| |
| virtual void print(raw_ostream &OS) const; |
| virtual void printDescription(raw_ostream &OS) const; |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| virtual LLVM_DUMP_METHOD void dump() const { print(errs()); } |
| #endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| }; |
| |
| class GIMatchDagOpcodePredicate : public GIMatchDagPredicate { |
| const CodeGenInstruction &Instr; |
| |
| public: |
| GIMatchDagOpcodePredicate(GIMatchDagContext &Ctx, StringRef Name, |
| const CodeGenInstruction &Instr); |
| |
| static bool classof(const GIMatchDagPredicate *P) { |
| return P->getKind() == GIMatchDagPredicateKind_Opcode; |
| } |
| |
| const CodeGenInstruction *getInstr() const { return &Instr; } |
| |
| void printDescription(raw_ostream &OS) const override; |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| LLVM_DUMP_METHOD void dump() const override { print(errs()); } |
| #endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| }; |
| |
| class GIMatchDagOneOfOpcodesPredicate : public GIMatchDagPredicate { |
| SmallVector<const CodeGenInstruction *, 4> Instrs; |
| |
| public: |
| GIMatchDagOneOfOpcodesPredicate(GIMatchDagContext &Ctx, StringRef Name); |
| |
| void addOpcode(const CodeGenInstruction *Instr) { Instrs.push_back(Instr); } |
| |
| static bool classof(const GIMatchDagPredicate *P) { |
| return P->getKind() == GIMatchDagPredicateKind_OneOfOpcodes; |
| } |
| |
| const SmallVectorImpl<const CodeGenInstruction *> &getInstrs() const { |
| return Instrs; |
| } |
| |
| void printDescription(raw_ostream &OS) const override; |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| LLVM_DUMP_METHOD void dump() const override { print(errs()); } |
| #endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| }; |
| |
| class GIMatchDagSameMOPredicate : public GIMatchDagPredicate { |
| public: |
| GIMatchDagSameMOPredicate(GIMatchDagContext &Ctx, StringRef Name); |
| |
| static bool classof(const GIMatchDagPredicate *P) { |
| return P->getKind() == GIMatchDagPredicateKind_SameMO; |
| } |
| |
| void printDescription(raw_ostream &OS) const override; |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| LLVM_DUMP_METHOD void dump() const override { print(errs()); } |
| #endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| }; |
| |
| raw_ostream &operator<<(raw_ostream &OS, const GIMatchDagPredicate &N); |
| raw_ostream &operator<<(raw_ostream &OS, const GIMatchDagOpcodePredicate &N); |
| |
| } // end namespace llvm |
| #endif // ifndef LLVM_UTILS_TABLEGEN_GIMATCHDAGPREDICATE_H |