Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- llvm/CodeGen/MachineInstrBundle.h - MI bundle utilities --*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file provide utility functions to manipulate machine instruction
  10. // bundles.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLE_H
  15. #define LLVM_CODEGEN_MACHINEINSTRBUNDLE_H
  16.  
  17. #include "llvm/CodeGen/MachineBasicBlock.h"
  18.  
  19. namespace llvm {
  20.  
  21. /// finalizeBundle - Finalize a machine instruction bundle which includes
  22. /// a sequence of instructions starting from FirstMI to LastMI (exclusive).
  23. /// This routine adds a BUNDLE instruction to represent the bundle, it adds
  24. /// IsInternalRead markers to MachineOperands which are defined inside the
  25. /// bundle, and it copies externally visible defs and uses to the BUNDLE
  26. /// instruction.
  27. void finalizeBundle(MachineBasicBlock &MBB,
  28.                     MachineBasicBlock::instr_iterator FirstMI,
  29.                     MachineBasicBlock::instr_iterator LastMI);
  30.  
  31. /// finalizeBundle - Same functionality as the previous finalizeBundle except
  32. /// the last instruction in the bundle is not provided as an input. This is
  33. /// used in cases where bundles are pre-determined by marking instructions
  34. /// with 'InsideBundle' marker. It returns the MBB instruction iterator that
  35. /// points to the end of the bundle.
  36. MachineBasicBlock::instr_iterator finalizeBundle(MachineBasicBlock &MBB,
  37.                     MachineBasicBlock::instr_iterator FirstMI);
  38.  
  39. /// finalizeBundles - Finalize instruction bundles in the specified
  40. /// MachineFunction. Return true if any bundles are finalized.
  41. bool finalizeBundles(MachineFunction &MF);
  42.  
  43. /// Returns an iterator to the first instruction in the bundle containing \p I.
  44. inline MachineBasicBlock::instr_iterator getBundleStart(
  45.     MachineBasicBlock::instr_iterator I) {
  46.   while (I->isBundledWithPred())
  47.     --I;
  48.   return I;
  49. }
  50.  
  51. /// Returns an iterator to the first instruction in the bundle containing \p I.
  52. inline MachineBasicBlock::const_instr_iterator getBundleStart(
  53.     MachineBasicBlock::const_instr_iterator I) {
  54.   while (I->isBundledWithPred())
  55.     --I;
  56.   return I;
  57. }
  58.  
  59. /// Returns an iterator pointing beyond the bundle containing \p I.
  60. inline MachineBasicBlock::instr_iterator getBundleEnd(
  61.     MachineBasicBlock::instr_iterator I) {
  62.   while (I->isBundledWithSucc())
  63.     ++I;
  64.   ++I;
  65.   return I;
  66. }
  67.  
  68. /// Returns an iterator pointing beyond the bundle containing \p I.
  69. inline MachineBasicBlock::const_instr_iterator getBundleEnd(
  70.     MachineBasicBlock::const_instr_iterator I) {
  71.   while (I->isBundledWithSucc())
  72.     ++I;
  73.   ++I;
  74.   return I;
  75. }
  76.  
  77. //===----------------------------------------------------------------------===//
  78. // MachineBundleOperand iterator
  79. //
  80.  
  81. /// MIBundleOperandIteratorBase - Iterator that visits all operands in a bundle
  82. /// of MachineInstrs. This class is not intended to be used directly, use one
  83. /// of the sub-classes instead.
  84. ///
  85. /// Intended use:
  86. ///
  87. ///   for (MIBundleOperands MIO(MI); MIO.isValid(); ++MIO) {
  88. ///     if (!MIO->isReg())
  89. ///       continue;
  90. ///     ...
  91. ///   }
  92. ///
  93. template <typename ValueT>
  94. class MIBundleOperandIteratorBase
  95.     : public iterator_facade_base<MIBundleOperandIteratorBase<ValueT>,
  96.                                   std::forward_iterator_tag, ValueT> {
  97.   MachineBasicBlock::instr_iterator InstrI, InstrE;
  98.   MachineInstr::mop_iterator OpI, OpE;
  99.  
  100.   // If the operands on InstrI are exhausted, advance InstrI to the next
  101.   // bundled instruction with operands.
  102.   void advance() {
  103.     while (OpI == OpE) {
  104.       // Don't advance off the basic block, or into a new bundle.
  105.       if (++InstrI == InstrE || !InstrI->isInsideBundle()) {
  106.         InstrI = InstrE;
  107.         break;
  108.       }
  109.       OpI = InstrI->operands_begin();
  110.       OpE = InstrI->operands_end();
  111.     }
  112.   }
  113.  
  114. protected:
  115.   /// MIBundleOperandIteratorBase - Create an iterator that visits all operands
  116.   /// on MI, or all operands on every instruction in the bundle containing MI.
  117.   ///
  118.   /// @param MI The instruction to examine.
  119.   ///
  120.   explicit MIBundleOperandIteratorBase(MachineInstr &MI) {
  121.     InstrI = getBundleStart(MI.getIterator());
  122.     InstrE = MI.getParent()->instr_end();
  123.     OpI = InstrI->operands_begin();
  124.     OpE = InstrI->operands_end();
  125.     advance();
  126.   }
  127.  
  128.   /// Constructor for an iterator past the last iteration: both instruction
  129.   /// iterators point to the end of the BB and OpI == OpE.
  130.   explicit MIBundleOperandIteratorBase(MachineBasicBlock::instr_iterator InstrE,
  131.                                        MachineInstr::mop_iterator OpE)
  132.       : InstrI(InstrE), InstrE(InstrE), OpI(OpE), OpE(OpE) {}
  133.  
  134. public:
  135.   /// isValid - Returns true until all the operands have been visited.
  136.   bool isValid() const { return OpI != OpE; }
  137.  
  138.   /// Preincrement.  Move to the next operand.
  139.   void operator++() {
  140.     assert(isValid() && "Cannot advance MIOperands beyond the last operand");
  141.     ++OpI;
  142.     advance();
  143.   }
  144.  
  145.   ValueT &operator*() const { return *OpI; }
  146.   ValueT *operator->() const { return &*OpI; }
  147.  
  148.   bool operator==(const MIBundleOperandIteratorBase &Arg) const {
  149.     // Iterators are equal, if InstrI matches and either OpIs match or OpI ==
  150.     // OpE match for both. The second condition allows us to construct an 'end'
  151.     // iterator, without finding the last instruction in a bundle up-front.
  152.     return InstrI == Arg.InstrI &&
  153.            (OpI == Arg.OpI || (OpI == OpE && Arg.OpI == Arg.OpE));
  154.   }
  155.   /// getOperandNo - Returns the number of the current operand relative to its
  156.   /// instruction.
  157.   ///
  158.   unsigned getOperandNo() const {
  159.     return OpI - InstrI->operands_begin();
  160.   }
  161. };
  162.  
  163. /// MIBundleOperands - Iterate over all operands in a bundle of machine
  164. /// instructions.
  165. ///
  166. class MIBundleOperands : public MIBundleOperandIteratorBase<MachineOperand> {
  167.   /// Constructor for an iterator past the last iteration.
  168.   MIBundleOperands(MachineBasicBlock::instr_iterator InstrE,
  169.                    MachineInstr::mop_iterator OpE)
  170.       : MIBundleOperandIteratorBase(InstrE, OpE) {}
  171.  
  172. public:
  173.   MIBundleOperands(MachineInstr &MI) : MIBundleOperandIteratorBase(MI) {}
  174.  
  175.   /// Returns an iterator past the last iteration.
  176.   static MIBundleOperands end(const MachineBasicBlock &MBB) {
  177.     return {const_cast<MachineBasicBlock &>(MBB).instr_end(),
  178.             const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()};
  179.   }
  180. };
  181.  
  182. /// ConstMIBundleOperands - Iterate over all operands in a const bundle of
  183. /// machine instructions.
  184. ///
  185. class ConstMIBundleOperands
  186.     : public MIBundleOperandIteratorBase<const MachineOperand> {
  187.  
  188.   /// Constructor for an iterator past the last iteration.
  189.   ConstMIBundleOperands(MachineBasicBlock::instr_iterator InstrE,
  190.                         MachineInstr::mop_iterator OpE)
  191.       : MIBundleOperandIteratorBase(InstrE, OpE) {}
  192.  
  193. public:
  194.   ConstMIBundleOperands(const MachineInstr &MI)
  195.       : MIBundleOperandIteratorBase(const_cast<MachineInstr &>(MI)) {}
  196.  
  197.   /// Returns an iterator past the last iteration.
  198.   static ConstMIBundleOperands end(const MachineBasicBlock &MBB) {
  199.     return {const_cast<MachineBasicBlock &>(MBB).instr_end(),
  200.             const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()};
  201.   }
  202. };
  203.  
  204. inline iterator_range<ConstMIBundleOperands>
  205. const_mi_bundle_ops(const MachineInstr &MI) {
  206.   return make_range(ConstMIBundleOperands(MI),
  207.                     ConstMIBundleOperands::end(*MI.getParent()));
  208. }
  209.  
  210. inline iterator_range<MIBundleOperands> mi_bundle_ops(MachineInstr &MI) {
  211.   return make_range(MIBundleOperands(MI),
  212.                     MIBundleOperands::end(*MI.getParent()));
  213. }
  214.  
  215. /// VirtRegInfo - Information about a virtual register used by a set of
  216. /// operands.
  217. ///
  218. struct VirtRegInfo {
  219.   /// Reads - One of the operands read the virtual register.  This does not
  220.   /// include undef or internal use operands, see MO::readsReg().
  221.   bool Reads;
  222.  
  223.   /// Writes - One of the operands writes the virtual register.
  224.   bool Writes;
  225.  
  226.   /// Tied - Uses and defs must use the same register. This can be because of
  227.   /// a two-address constraint, or there may be a partial redefinition of a
  228.   /// sub-register.
  229.   bool Tied;
  230. };
  231.  
  232. /// AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses
  233. /// a virtual register.  This function should not be called after operator++(),
  234. /// it expects a fresh iterator.
  235. ///
  236. /// @param Reg The virtual register to analyze.
  237. /// @param Ops When set, this vector will receive an (MI, OpNum) entry for
  238. ///            each operand referring to Reg.
  239. /// @returns A filled-in RegInfo struct.
  240. VirtRegInfo AnalyzeVirtRegInBundle(
  241.     MachineInstr &MI, Register Reg,
  242.     SmallVectorImpl<std::pair<MachineInstr *, unsigned>> *Ops = nullptr);
  243.  
  244. /// Information about how a physical register Reg is used by a set of
  245. /// operands.
  246. struct PhysRegInfo {
  247.   /// There is a regmask operand indicating Reg is clobbered.
  248.   /// \see MachineOperand::CreateRegMask().
  249.   bool Clobbered;
  250.  
  251.   /// Reg or one of its aliases is defined. The definition may only cover
  252.   /// parts of the register.
  253.   bool Defined;
  254.   /// Reg or a super-register is defined. The definition covers the full
  255.   /// register.
  256.   bool FullyDefined;
  257.  
  258.   /// Reg or one of its aliases is read. The register may only be read
  259.   /// partially.
  260.   bool Read;
  261.   /// Reg or a super-register is read. The full register is read.
  262.   bool FullyRead;
  263.  
  264.   /// Either:
  265.   /// - Reg is FullyDefined and all defs of reg or an overlapping
  266.   ///   register are dead, or
  267.   /// - Reg is completely dead because "defined" by a clobber.
  268.   bool DeadDef;
  269.  
  270.   /// Reg is Defined and all defs of reg or an overlapping register are
  271.   /// dead.
  272.   bool PartialDeadDef;
  273.  
  274.   /// There is a use operand of reg or a super-register with kill flag set.
  275.   bool Killed;
  276. };
  277.  
  278. /// AnalyzePhysRegInBundle - Analyze how the current instruction or bundle uses
  279. /// a physical register.  This function should not be called after operator++(),
  280. /// it expects a fresh iterator.
  281. ///
  282. /// @param Reg The physical register to analyze.
  283. /// @returns A filled-in PhysRegInfo struct.
  284. PhysRegInfo AnalyzePhysRegInBundle(const MachineInstr &MI, Register Reg,
  285.                                    const TargetRegisterInfo *TRI);
  286.  
  287. } // End llvm namespace
  288.  
  289. #endif
  290.