diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-04-26 19:45:00 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-04-26 19:45:00 +0000 |
| commit | 12f3ca4cdb95b193af905a00e722a4dcb40b3de3 (patch) | |
| tree | ae1a7fcfc24a8d4b23206c57121c3f361d4b7f84 /include/llvm/CodeGen/GlobalISel | |
| parent | d99dafe2e4a385dd2a6c76da6d8258deb100657b (diff) | |
Notes
Diffstat (limited to 'include/llvm/CodeGen/GlobalISel')
| -rw-r--r-- | include/llvm/CodeGen/GlobalISel/InstructionSelector.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/GlobalISel/InstructionSelector.h b/include/llvm/CodeGen/GlobalISel/InstructionSelector.h index 911e8756070b2..899563acc330b 100644 --- a/include/llvm/CodeGen/GlobalISel/InstructionSelector.h +++ b/include/llvm/CodeGen/GlobalISel/InstructionSelector.h @@ -18,20 +18,52 @@ #include "llvm/ADT/Optional.h" #include <cstdint> +#include <bitset> +#include <functional> namespace llvm { class MachineInstr; +class MachineInstrBuilder; +class MachineFunction; class MachineOperand; class MachineRegisterInfo; class RegisterBankInfo; class TargetInstrInfo; class TargetRegisterInfo; +/// Container class for CodeGen predicate results. +/// This is convenient because std::bitset does not have a constructor +/// with an initializer list of set bits. +/// +/// Each InstructionSelector subclass should define a PredicateBitset class with: +/// const unsigned MAX_SUBTARGET_PREDICATES = 192; +/// using PredicateBitset = PredicateBitsetImpl<MAX_SUBTARGET_PREDICATES>; +/// and updating the constant to suit the target. Tablegen provides a suitable +/// definition for the predicates in use in <Target>GenGlobalISel.inc when +/// GET_GLOBALISEL_PREDICATE_BITSET is defined. +template <std::size_t MaxPredicates> +class PredicateBitsetImpl : public std::bitset<MaxPredicates> { +public: + // Cannot inherit constructors because it's not supported by VC++.. + PredicateBitsetImpl() = default; + + PredicateBitsetImpl(const std::bitset<MaxPredicates> &B) + : std::bitset<MaxPredicates>(B) {} + + PredicateBitsetImpl(std::initializer_list<unsigned> Init) { + for (auto I : Init) + std::bitset<MaxPredicates>::set(I); + } +}; + /// Provides the logic to select generic machine instructions. class InstructionSelector { public: virtual ~InstructionSelector() {} + /// This is executed before selecting a function. + virtual void beginFunction(const MachineFunction &MF) {} + /// Select the (possibly generic) instruction \p I to only use target-specific /// opcodes. It is OK to insert multiple instructions, but they cannot be /// generic pre-isel instructions. @@ -46,6 +78,8 @@ public: virtual bool select(MachineInstr &I) const = 0; protected: + typedef std::function<void(MachineInstrBuilder &)> ComplexRendererFn; + InstructionSelector(); /// Mutate the newly-selected instruction \p I to constrain its (possibly |
