Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===- llvm/CodeGen/TargetInstrInfo.h - Instruction Info --------*- 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 describes the target machine instruction set to the code generator. | ||
| 10 | // | ||
| 11 | //===----------------------------------------------------------------------===// | ||
| 12 | |||
| 13 | #ifndef LLVM_CODEGEN_TARGETINSTRINFO_H | ||
| 14 | #define LLVM_CODEGEN_TARGETINSTRINFO_H | ||
| 15 | |||
| 16 | #include "llvm/ADT/ArrayRef.h" | ||
| 17 | #include "llvm/ADT/DenseMap.h" | ||
| 18 | #include "llvm/ADT/DenseMapInfo.h" | ||
| 19 | #include "llvm/ADT/Uniformity.h" | ||
| 20 | #include "llvm/CodeGen/MIRFormatter.h" | ||
| 21 | #include "llvm/CodeGen/MachineBasicBlock.h" | ||
| 22 | #include "llvm/CodeGen/MachineFunction.h" | ||
| 23 | #include "llvm/CodeGen/MachineInstr.h" | ||
| 24 | #include "llvm/CodeGen/MachineInstrBuilder.h" | ||
| 25 | #include "llvm/CodeGen/MachineOperand.h" | ||
| 26 | #include "llvm/CodeGen/MachineOutliner.h" | ||
| 27 | #include "llvm/CodeGen/RegisterClassInfo.h" | ||
| 28 | #include "llvm/CodeGen/VirtRegMap.h" | ||
| 29 | #include "llvm/MC/MCInstrInfo.h" | ||
| 30 | #include "llvm/Support/BranchProbability.h" | ||
| 31 | #include "llvm/Support/ErrorHandling.h" | ||
| 32 | #include <cassert> | ||
| 33 | #include <cstddef> | ||
| 34 | #include <cstdint> | ||
| 35 | #include <utility> | ||
| 36 | #include <vector> | ||
| 37 | |||
| 38 | namespace llvm { | ||
| 39 | |||
| 40 | class DFAPacketizer; | ||
| 41 | class InstrItineraryData; | ||
| 42 | class LiveIntervals; | ||
| 43 | class LiveVariables; | ||
| 44 | class MachineLoop; | ||
| 45 | class MachineMemOperand; | ||
| 46 | class MachineRegisterInfo; | ||
| 47 | class MCAsmInfo; | ||
| 48 | class MCInst; | ||
| 49 | struct MCSchedModel; | ||
| 50 | class Module; | ||
| 51 | class ScheduleDAG; | ||
| 52 | class ScheduleDAGMI; | ||
| 53 | class ScheduleHazardRecognizer; | ||
| 54 | class SDNode; | ||
| 55 | class SelectionDAG; | ||
| 56 | class SMSchedule; | ||
| 57 | class SwingSchedulerDAG; | ||
| 58 | class RegScavenger; | ||
| 59 | class TargetRegisterClass; | ||
| 60 | class TargetRegisterInfo; | ||
| 61 | class TargetSchedModel; | ||
| 62 | class TargetSubtargetInfo; | ||
| 63 | enum class MachineCombinerPattern; | ||
| 64 | |||
| 65 | template <class T> class SmallVectorImpl; | ||
| 66 | |||
| 67 | using ParamLoadedValue = std::pair<MachineOperand, DIExpression*>; | ||
| 68 | |||
| 69 | struct DestSourcePair { | ||
| 70 | const MachineOperand *Destination; | ||
| 71 | const MachineOperand *Source; | ||
| 72 | |||
| 73 | DestSourcePair(const MachineOperand &Dest, const MachineOperand &Src) | ||
| 74 | : Destination(&Dest), Source(&Src) {} | ||
| 75 | }; | ||
| 76 | |||
| 77 | /// Used to describe a register and immediate addition. | ||
| 78 | struct RegImmPair { | ||
| 79 |   Register Reg; | ||
| 80 | int64_t Imm; | ||
| 81 | |||
| 82 | RegImmPair(Register Reg, int64_t Imm) : Reg(Reg), Imm(Imm) {} | ||
| 83 | }; | ||
| 84 | |||
| 85 | /// Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare. | ||
| 86 | /// It holds the register values, the scale value and the displacement. | ||
| 87 | struct ExtAddrMode { | ||
| 88 |   Register BaseReg; | ||
| 89 |   Register ScaledReg; | ||
| 90 | int64_t Scale; | ||
| 91 | int64_t Displacement; | ||
| 92 | }; | ||
| 93 | |||
| 94 | //--------------------------------------------------------------------------- | ||
| 95 | /// | ||
| 96 | /// TargetInstrInfo - Interface to description of machine instruction set | ||
| 97 | /// | ||
| 98 | class TargetInstrInfo : public MCInstrInfo { | ||
| 99 | public: | ||
| 100 | TargetInstrInfo(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u, | ||
| 101 | unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u) | ||
| 102 | : CallFrameSetupOpcode(CFSetupOpcode), | ||
| 103 | CallFrameDestroyOpcode(CFDestroyOpcode), CatchRetOpcode(CatchRetOpcode), | ||
| 104 | ReturnOpcode(ReturnOpcode) {} | ||
| 105 | TargetInstrInfo(const TargetInstrInfo &) = delete; | ||
| 106 | TargetInstrInfo &operator=(const TargetInstrInfo &) = delete; | ||
| 107 | virtual ~TargetInstrInfo(); | ||
| 108 | |||
| 109 | static bool isGenericOpcode(unsigned Opc) { | ||
| 110 | return Opc <= TargetOpcode::GENERIC_OP_END; | ||
| 111 |   } | ||
| 112 | |||
| 113 | static bool isGenericAtomicRMWOpcode(unsigned Opc) { | ||
| 114 | return Opc >= TargetOpcode::GENERIC_ATOMICRMW_OP_START && | ||
| 115 | Opc <= TargetOpcode::GENERIC_ATOMICRMW_OP_END; | ||
| 116 |   } | ||
| 117 | |||
| 118 |   /// Given a machine instruction descriptor, returns the register | ||
| 119 |   /// class constraint for OpNum, or NULL. | ||
| 120 |   virtual | ||
| 121 | const TargetRegisterClass *getRegClass(const MCInstrDesc &MCID, unsigned OpNum, | ||
| 122 | const TargetRegisterInfo *TRI, | ||
| 123 | const MachineFunction &MF) const; | ||
| 124 | |||
| 125 |   /// Return true if the instruction is trivially rematerializable, meaning it | ||
| 126 |   /// has no side effects and requires no operands that aren't always available. | ||
| 127 |   /// This means the only allowed uses are constants and unallocatable physical | ||
| 128 |   /// registers so that the instructions result is independent of the place | ||
| 129 |   /// in the function. | ||
| 130 | bool isTriviallyReMaterializable(const MachineInstr &MI) const { | ||
| 131 | return MI.getOpcode() == TargetOpcode::IMPLICIT_DEF || | ||
| 132 | (MI.getDesc().isRematerializable() && | ||
| 133 | (isReallyTriviallyReMaterializable(MI) || | ||
| 134 | isReallyTriviallyReMaterializableGeneric(MI))); | ||
| 135 |   } | ||
| 136 | |||
| 137 |   /// Given \p MO is a PhysReg use return if it can be ignored for the purpose | ||
| 138 |   /// of instruction rematerialization or sinking. | ||
| 139 | virtual bool isIgnorableUse(const MachineOperand &MO) const { | ||
| 140 | return false; | ||
| 141 |   } | ||
| 142 | |||
| 143 | protected: | ||
| 144 |   /// For instructions with opcodes for which the M_REMATERIALIZABLE flag is | ||
| 145 |   /// set, this hook lets the target specify whether the instruction is actually | ||
| 146 |   /// trivially rematerializable, taking into consideration its operands. This | ||
| 147 |   /// predicate must return false if the instruction has any side effects other | ||
| 148 |   /// than producing a value, or if it requres any address registers that are | ||
| 149 |   /// not always available. | ||
| 150 |   /// Requirements must be check as stated in isTriviallyReMaterializable() . | ||
| 151 | virtual bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const { | ||
| 152 | return false; | ||
| 153 |   } | ||
| 154 | |||
| 155 |   /// This method commutes the operands of the given machine instruction MI. | ||
| 156 |   /// The operands to be commuted are specified by their indices OpIdx1 and | ||
| 157 |   /// OpIdx2. | ||
| 158 |   /// | ||
| 159 |   /// If a target has any instructions that are commutable but require | ||
| 160 |   /// converting to different instructions or making non-trivial changes | ||
| 161 |   /// to commute them, this method can be overloaded to do that. | ||
| 162 |   /// The default implementation simply swaps the commutable operands. | ||
| 163 |   /// | ||
| 164 |   /// If NewMI is false, MI is modified in place and returned; otherwise, a | ||
| 165 |   /// new machine instruction is created and returned. | ||
| 166 |   /// | ||
| 167 |   /// Do not call this method for a non-commutable instruction. | ||
| 168 |   /// Even though the instruction is commutable, the method may still | ||
| 169 |   /// fail to commute the operands, null pointer is returned in such cases. | ||
| 170 | virtual MachineInstr *commuteInstructionImpl(MachineInstr &MI, bool NewMI, | ||
| 171 |                                                unsigned OpIdx1, | ||
| 172 | unsigned OpIdx2) const; | ||
| 173 | |||
| 174 |   /// Assigns the (CommutableOpIdx1, CommutableOpIdx2) pair of commutable | ||
| 175 |   /// operand indices to (ResultIdx1, ResultIdx2). | ||
| 176 |   /// One or both input values of the pair: (ResultIdx1, ResultIdx2) may be | ||
| 177 |   /// predefined to some indices or be undefined (designated by the special | ||
| 178 |   /// value 'CommuteAnyOperandIndex'). | ||
| 179 |   /// The predefined result indices cannot be re-defined. | ||
| 180 |   /// The function returns true iff after the result pair redefinition | ||
| 181 |   /// the fixed result pair is equal to or equivalent to the source pair of | ||
| 182 |   /// indices: (CommutableOpIdx1, CommutableOpIdx2). It is assumed here that | ||
| 183 |   /// the pairs (x,y) and (y,x) are equivalent. | ||
| 184 | static bool fixCommutedOpIndices(unsigned &ResultIdx1, unsigned &ResultIdx2, | ||
| 185 |                                    unsigned CommutableOpIdx1, | ||
| 186 | unsigned CommutableOpIdx2); | ||
| 187 | |||
| 188 | private: | ||
| 189 |   /// For instructions with opcodes for which the M_REMATERIALIZABLE flag is | ||
| 190 |   /// set and the target hook isReallyTriviallyReMaterializable returns false, | ||
| 191 |   /// this function does target-independent tests to determine if the | ||
| 192 |   /// instruction is really trivially rematerializable. | ||
| 193 | bool isReallyTriviallyReMaterializableGeneric(const MachineInstr &MI) const; | ||
| 194 | |||
| 195 | public: | ||
| 196 |   /// These methods return the opcode of the frame setup/destroy instructions | ||
| 197 |   /// if they exist (-1 otherwise).  Some targets use pseudo instructions in | ||
| 198 |   /// order to abstract away the difference between operating with a frame | ||
| 199 |   /// pointer and operating without, through the use of these two instructions. | ||
| 200 |   /// | ||
| 201 | unsigned getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; } | ||
| 202 | unsigned getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; } | ||
| 203 | |||
| 204 |   /// Returns true if the argument is a frame pseudo instruction. | ||
| 205 | bool isFrameInstr(const MachineInstr &I) const { | ||
| 206 | return I.getOpcode() == getCallFrameSetupOpcode() || | ||
| 207 | I.getOpcode() == getCallFrameDestroyOpcode(); | ||
| 208 |   } | ||
| 209 | |||
| 210 |   /// Returns true if the argument is a frame setup pseudo instruction. | ||
| 211 | bool isFrameSetup(const MachineInstr &I) const { | ||
| 212 | return I.getOpcode() == getCallFrameSetupOpcode(); | ||
| 213 |   } | ||
| 214 | |||
| 215 |   /// Returns size of the frame associated with the given frame instruction. | ||
| 216 |   /// For frame setup instruction this is frame that is set up space set up | ||
| 217 |   /// after the instruction. For frame destroy instruction this is the frame | ||
| 218 |   /// freed by the caller. | ||
| 219 |   /// Note, in some cases a call frame (or a part of it) may be prepared prior | ||
| 220 |   /// to the frame setup instruction. It occurs in the calls that involve | ||
| 221 |   /// inalloca arguments. This function reports only the size of the frame part | ||
| 222 |   /// that is set up between the frame setup and destroy pseudo instructions. | ||
| 223 | int64_t getFrameSize(const MachineInstr &I) const { | ||
| 224 | assert(isFrameInstr(I) && "Not a frame instruction"); | ||
| 225 | assert(I.getOperand(0).getImm() >= 0); | ||
| 226 | return I.getOperand(0).getImm(); | ||
| 227 |   } | ||
| 228 | |||
| 229 |   /// Returns the total frame size, which is made up of the space set up inside | ||
| 230 |   /// the pair of frame start-stop instructions and the space that is set up | ||
| 231 |   /// prior to the pair. | ||
| 232 | int64_t getFrameTotalSize(const MachineInstr &I) const { | ||
| 233 | if (isFrameSetup(I)) { | ||
| 234 | assert(I.getOperand(1).getImm() >= 0 && | ||
| 235 | "Frame size must not be negative"); | ||
| 236 | return getFrameSize(I) + I.getOperand(1).getImm(); | ||
| 237 |     } | ||
| 238 | return getFrameSize(I); | ||
| 239 |   } | ||
| 240 | |||
| 241 | unsigned getCatchReturnOpcode() const { return CatchRetOpcode; } | ||
| 242 | unsigned getReturnOpcode() const { return ReturnOpcode; } | ||
| 243 | |||
| 244 |   /// Returns the actual stack pointer adjustment made by an instruction | ||
| 245 |   /// as part of a call sequence. By default, only call frame setup/destroy | ||
| 246 |   /// instructions adjust the stack, but targets may want to override this | ||
| 247 |   /// to enable more fine-grained adjustment, or adjust by a different value. | ||
| 248 | virtual int getSPAdjust(const MachineInstr &MI) const; | ||
| 249 | |||
| 250 |   /// Return true if the instruction is a "coalescable" extension instruction. | ||
| 251 |   /// That is, it's like a copy where it's legal for the source to overlap the | ||
| 252 |   /// destination. e.g. X86::MOVSX64rr32. If this returns true, then it's | ||
| 253 |   /// expected the pre-extension value is available as a subreg of the result | ||
| 254 |   /// register. This also returns the sub-register index in SubIdx. | ||
| 255 | virtual bool isCoalescableExtInstr(const MachineInstr &MI, Register &SrcReg, | ||
| 256 | Register &DstReg, unsigned &SubIdx) const { | ||
| 257 | return false; | ||
| 258 |   } | ||
| 259 | |||
| 260 |   /// If the specified machine instruction is a direct | ||
| 261 |   /// load from a stack slot, return the virtual or physical register number of | ||
| 262 |   /// the destination along with the FrameIndex of the loaded stack slot.  If | ||
| 263 |   /// not, return 0.  This predicate must return 0 if the instruction has | ||
| 264 |   /// any side effects other than loading from the stack slot. | ||
| 265 | virtual unsigned isLoadFromStackSlot(const MachineInstr &MI, | ||
| 266 | int &FrameIndex) const { | ||
| 267 | return 0; | ||
| 268 |   } | ||
| 269 | |||
| 270 |   /// Optional extension of isLoadFromStackSlot that returns the number of | ||
| 271 |   /// bytes loaded from the stack. This must be implemented if a backend | ||
| 272 |   /// supports partial stack slot spills/loads to further disambiguate | ||
| 273 |   /// what the load does. | ||
| 274 | virtual unsigned isLoadFromStackSlot(const MachineInstr &MI, | ||
| 275 | int &FrameIndex, | ||
| 276 | unsigned &MemBytes) const { | ||
| 277 | MemBytes = 0; | ||
| 278 | return isLoadFromStackSlot(MI, FrameIndex); | ||
| 279 |   } | ||
| 280 | |||
| 281 |   /// Check for post-frame ptr elimination stack locations as well. | ||
| 282 |   /// This uses a heuristic so it isn't reliable for correctness. | ||
| 283 | virtual unsigned isLoadFromStackSlotPostFE(const MachineInstr &MI, | ||
| 284 | int &FrameIndex) const { | ||
| 285 | return 0; | ||
| 286 |   } | ||
| 287 | |||
| 288 |   /// If the specified machine instruction has a load from a stack slot, | ||
| 289 |   /// return true along with the FrameIndices of the loaded stack slot and the | ||
| 290 |   /// machine mem operands containing the reference. | ||
| 291 |   /// If not, return false.  Unlike isLoadFromStackSlot, this returns true for | ||
| 292 |   /// any instructions that loads from the stack.  This is just a hint, as some | ||
| 293 |   /// cases may be missed. | ||
| 294 | virtual bool hasLoadFromStackSlot( | ||
| 295 | const MachineInstr &MI, | ||
| 296 | SmallVectorImpl<const MachineMemOperand *> &Accesses) const; | ||
| 297 | |||
| 298 |   /// If the specified machine instruction is a direct | ||
| 299 |   /// store to a stack slot, return the virtual or physical register number of | ||
| 300 |   /// the source reg along with the FrameIndex of the loaded stack slot.  If | ||
| 301 |   /// not, return 0.  This predicate must return 0 if the instruction has | ||
| 302 |   /// any side effects other than storing to the stack slot. | ||
| 303 | virtual unsigned isStoreToStackSlot(const MachineInstr &MI, | ||
| 304 | int &FrameIndex) const { | ||
| 305 | return 0; | ||
| 306 |   } | ||
| 307 | |||
| 308 |   /// Optional extension of isStoreToStackSlot that returns the number of | ||
| 309 |   /// bytes stored to the stack. This must be implemented if a backend | ||
| 310 |   /// supports partial stack slot spills/loads to further disambiguate | ||
| 311 |   /// what the store does. | ||
| 312 | virtual unsigned isStoreToStackSlot(const MachineInstr &MI, | ||
| 313 | int &FrameIndex, | ||
| 314 | unsigned &MemBytes) const { | ||
| 315 | MemBytes = 0; | ||
| 316 | return isStoreToStackSlot(MI, FrameIndex); | ||
| 317 |   } | ||
| 318 | |||
| 319 |   /// Check for post-frame ptr elimination stack locations as well. | ||
| 320 |   /// This uses a heuristic, so it isn't reliable for correctness. | ||
| 321 | virtual unsigned isStoreToStackSlotPostFE(const MachineInstr &MI, | ||
| 322 | int &FrameIndex) const { | ||
| 323 | return 0; | ||
| 324 |   } | ||
| 325 | |||
| 326 |   /// If the specified machine instruction has a store to a stack slot, | ||
| 327 |   /// return true along with the FrameIndices of the loaded stack slot and the | ||
| 328 |   /// machine mem operands containing the reference. | ||
| 329 |   /// If not, return false.  Unlike isStoreToStackSlot, | ||
| 330 |   /// this returns true for any instructions that stores to the | ||
| 331 |   /// stack.  This is just a hint, as some cases may be missed. | ||
| 332 | virtual bool hasStoreToStackSlot( | ||
| 333 | const MachineInstr &MI, | ||
| 334 | SmallVectorImpl<const MachineMemOperand *> &Accesses) const; | ||
| 335 | |||
| 336 |   /// Return true if the specified machine instruction | ||
| 337 |   /// is a copy of one stack slot to another and has no other effect. | ||
| 338 |   /// Provide the identity of the two frame indices. | ||
| 339 | virtual bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex, | ||
| 340 | int &SrcFrameIndex) const { | ||
| 341 | return false; | ||
| 342 |   } | ||
| 343 | |||
| 344 |   /// Compute the size in bytes and offset within a stack slot of a spilled | ||
| 345 |   /// register or subregister. | ||
| 346 |   /// | ||
| 347 |   /// \param [out] Size in bytes of the spilled value. | ||
| 348 |   /// \param [out] Offset in bytes within the stack slot. | ||
| 349 |   /// \returns true if both Size and Offset are successfully computed. | ||
| 350 |   /// | ||
| 351 |   /// Not all subregisters have computable spill slots. For example, | ||
| 352 |   /// subregisters registers may not be byte-sized, and a pair of discontiguous | ||
| 353 |   /// subregisters has no single offset. | ||
| 354 |   /// | ||
| 355 |   /// Targets with nontrivial bigendian implementations may need to override | ||
| 356 |   /// this, particularly to support spilled vector registers. | ||
| 357 | virtual bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, | ||
| 358 | unsigned &Size, unsigned &Offset, | ||
| 359 | const MachineFunction &MF) const; | ||
| 360 | |||
| 361 |   /// Return true if the given instruction is terminator that is unspillable, | ||
| 362 |   /// according to isUnspillableTerminatorImpl. | ||
| 363 | bool isUnspillableTerminator(const MachineInstr *MI) const { | ||
| 364 | return MI->isTerminator() && isUnspillableTerminatorImpl(MI); | ||
| 365 |   } | ||
| 366 | |||
| 367 |   /// Returns the size in bytes of the specified MachineInstr, or ~0U | ||
| 368 |   /// when this function is not implemented by a target. | ||
| 369 | virtual unsigned getInstSizeInBytes(const MachineInstr &MI) const { | ||
| 370 | return ~0U; | ||
| 371 |   } | ||
| 372 | |||
| 373 |   /// Return true if the instruction is as cheap as a move instruction. | ||
| 374 |   /// | ||
| 375 |   /// Targets for different archs need to override this, and different | ||
| 376 |   /// micro-architectures can also be finely tuned inside. | ||
| 377 | virtual bool isAsCheapAsAMove(const MachineInstr &MI) const { | ||
| 378 | return MI.isAsCheapAsAMove(); | ||
| 379 |   } | ||
| 380 | |||
| 381 |   /// Return true if the instruction should be sunk by MachineSink. | ||
| 382 |   /// | ||
| 383 |   /// MachineSink determines on its own whether the instruction is safe to sink; | ||
| 384 |   /// this gives the target a hook to override the default behavior with regards | ||
| 385 |   /// to which instructions should be sunk. | ||
| 386 | virtual bool shouldSink(const MachineInstr &MI) const { return true; } | ||
| 387 | |||
| 388 |   /// Return false if the instruction should not be hoisted by MachineLICM. | ||
| 389 |   /// | ||
| 390 |   /// MachineLICM determines on its own whether the instruction is safe to | ||
| 391 |   /// hoist; this gives the target a hook to extend this assessment and prevent | ||
| 392 |   /// an instruction being hoisted from a given loop for target specific | ||
| 393 |   /// reasons. | ||
| 394 | virtual bool shouldHoist(const MachineInstr &MI, | ||
| 395 | const MachineLoop *FromLoop) const { | ||
| 396 | return true; | ||
| 397 |   } | ||
| 398 | |||
| 399 |   /// Re-issue the specified 'original' instruction at the | ||
| 400 |   /// specific location targeting a new destination register. | ||
| 401 |   /// The register in Orig->getOperand(0).getReg() will be substituted by | ||
| 402 |   /// DestReg:SubIdx. Any existing subreg index is preserved or composed with | ||
| 403 |   /// SubIdx. | ||
| 404 | virtual void reMaterialize(MachineBasicBlock &MBB, | ||
| 405 | MachineBasicBlock::iterator MI, Register DestReg, | ||
| 406 | unsigned SubIdx, const MachineInstr &Orig, | ||
| 407 | const TargetRegisterInfo &TRI) const; | ||
| 408 | |||
| 409 |   /// Clones instruction or the whole instruction bundle \p Orig and | ||
| 410 |   /// insert into \p MBB before \p InsertBefore. The target may update operands | ||
| 411 |   /// that are required to be unique. | ||
| 412 |   /// | ||
| 413 |   /// \p Orig must not return true for MachineInstr::isNotDuplicable(). | ||
| 414 | virtual MachineInstr &duplicate(MachineBasicBlock &MBB, | ||
| 415 | MachineBasicBlock::iterator InsertBefore, | ||
| 416 | const MachineInstr &Orig) const; | ||
| 417 | |||
| 418 |   /// This method must be implemented by targets that | ||
| 419 |   /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target | ||
| 420 |   /// may be able to convert a two-address instruction into one or more true | ||
| 421 |   /// three-address instructions on demand.  This allows the X86 target (for | ||
| 422 |   /// example) to convert ADD and SHL instructions into LEA instructions if they | ||
| 423 |   /// would require register copies due to two-addressness. | ||
| 424 |   /// | ||
| 425 |   /// This method returns a null pointer if the transformation cannot be | ||
| 426 |   /// performed, otherwise it returns the last new instruction. | ||
| 427 |   /// | ||
| 428 |   /// If \p LIS is not nullptr, the LiveIntervals info should be updated for | ||
| 429 |   /// replacing \p MI with new instructions, even though this function does not | ||
| 430 |   /// remove MI. | ||
| 431 | virtual MachineInstr *convertToThreeAddress(MachineInstr &MI, | ||
| 432 |                                               LiveVariables *LV, | ||
| 433 | LiveIntervals *LIS) const { | ||
| 434 | return nullptr; | ||
| 435 |   } | ||
| 436 | |||
| 437 |   // This constant can be used as an input value of operand index passed to | ||
| 438 |   // the method findCommutedOpIndices() to tell the method that the | ||
| 439 |   // corresponding operand index is not pre-defined and that the method | ||
| 440 |   // can pick any commutable operand. | ||
| 441 | static const unsigned CommuteAnyOperandIndex = ~0U; | ||
| 442 | |||
| 443 |   /// This method commutes the operands of the given machine instruction MI. | ||
| 444 |   /// | ||
| 445 |   /// The operands to be commuted are specified by their indices OpIdx1 and | ||
| 446 |   /// OpIdx2. OpIdx1 and OpIdx2 arguments may be set to a special value | ||
| 447 |   /// 'CommuteAnyOperandIndex', which means that the method is free to choose | ||
| 448 |   /// any arbitrarily chosen commutable operand. If both arguments are set to | ||
| 449 |   /// 'CommuteAnyOperandIndex' then the method looks for 2 different commutable | ||
| 450 |   /// operands; then commutes them if such operands could be found. | ||
| 451 |   /// | ||
| 452 |   /// If NewMI is false, MI is modified in place and returned; otherwise, a | ||
| 453 |   /// new machine instruction is created and returned. | ||
| 454 |   /// | ||
| 455 |   /// Do not call this method for a non-commutable instruction or | ||
| 456 |   /// for non-commuable operands. | ||
| 457 |   /// Even though the instruction is commutable, the method may still | ||
| 458 |   /// fail to commute the operands, null pointer is returned in such cases. | ||
| 459 |   MachineInstr * | ||
| 460 | commuteInstruction(MachineInstr &MI, bool NewMI = false, | ||
| 461 | unsigned OpIdx1 = CommuteAnyOperandIndex, | ||
| 462 | unsigned OpIdx2 = CommuteAnyOperandIndex) const; | ||
| 463 | |||
| 464 |   /// Returns true iff the routine could find two commutable operands in the | ||
| 465 |   /// given machine instruction. | ||
| 466 |   /// The 'SrcOpIdx1' and 'SrcOpIdx2' are INPUT and OUTPUT arguments. | ||
| 467 |   /// If any of the INPUT values is set to the special value | ||
| 468 |   /// 'CommuteAnyOperandIndex' then the method arbitrarily picks a commutable | ||
| 469 |   /// operand, then returns its index in the corresponding argument. | ||
| 470 |   /// If both of INPUT values are set to 'CommuteAnyOperandIndex' then method | ||
| 471 |   /// looks for 2 commutable operands. | ||
| 472 |   /// If INPUT values refer to some operands of MI, then the method simply | ||
| 473 |   /// returns true if the corresponding operands are commutable and returns | ||
| 474 |   /// false otherwise. | ||
| 475 |   /// | ||
| 476 |   /// For example, calling this method this way: | ||
| 477 |   ///     unsigned Op1 = 1, Op2 = CommuteAnyOperandIndex; | ||
| 478 |   ///     findCommutedOpIndices(MI, Op1, Op2); | ||
| 479 |   /// can be interpreted as a query asking to find an operand that would be | ||
| 480 |   /// commutable with the operand#1. | ||
| 481 | virtual bool findCommutedOpIndices(const MachineInstr &MI, | ||
| 482 | unsigned &SrcOpIdx1, | ||
| 483 | unsigned &SrcOpIdx2) const; | ||
| 484 | |||
| 485 |   /// Returns true if the target has a preference on the operands order of | ||
| 486 |   /// the given machine instruction. And specify if \p Commute is required to | ||
| 487 |   /// get the desired operands order. | ||
| 488 | virtual bool hasCommutePreference(MachineInstr &MI, bool &Commute) const { | ||
| 489 | return false; | ||
| 490 |   } | ||
| 491 | |||
| 492 |   /// A pair composed of a register and a sub-register index. | ||
| 493 |   /// Used to give some type checking when modeling Reg:SubReg. | ||
| 494 | struct RegSubRegPair { | ||
| 495 |     Register Reg; | ||
| 496 | unsigned SubReg; | ||
| 497 | |||
| 498 | RegSubRegPair(Register Reg = Register(), unsigned SubReg = 0) | ||
| 499 | : Reg(Reg), SubReg(SubReg) {} | ||
| 500 | |||
| 501 | bool operator==(const RegSubRegPair& P) const { | ||
| 502 | return Reg == P.Reg && SubReg == P.SubReg; | ||
| 503 |     } | ||
| 504 | bool operator!=(const RegSubRegPair& P) const { | ||
| 505 | return !(*this == P); | ||
| 506 |     } | ||
| 507 | }; | ||
| 508 | |||
| 509 |   /// A pair composed of a pair of a register and a sub-register index, | ||
| 510 |   /// and another sub-register index. | ||
| 511 |   /// Used to give some type checking when modeling Reg:SubReg1, SubReg2. | ||
| 512 | struct RegSubRegPairAndIdx : RegSubRegPair { | ||
| 513 | unsigned SubIdx; | ||
| 514 | |||
| 515 | RegSubRegPairAndIdx(Register Reg = Register(), unsigned SubReg = 0, | ||
| 516 | unsigned SubIdx = 0) | ||
| 517 | : RegSubRegPair(Reg, SubReg), SubIdx(SubIdx) {} | ||
| 518 | }; | ||
| 519 | |||
| 520 |   /// Build the equivalent inputs of a REG_SEQUENCE for the given \p MI | ||
| 521 |   /// and \p DefIdx. | ||
| 522 |   /// \p [out] InputRegs of the equivalent REG_SEQUENCE. Each element of | ||
| 523 |   /// the list is modeled as <Reg:SubReg, SubIdx>. Operands with the undef | ||
| 524 |   /// flag are not added to this list. | ||
| 525 |   /// E.g., REG_SEQUENCE %1:sub1, sub0, %2, sub1 would produce | ||
| 526 |   /// two elements: | ||
| 527 |   /// - %1:sub1, sub0 | ||
| 528 |   /// - %2<:0>, sub1 | ||
| 529 |   /// | ||
| 530 |   /// \returns true if it is possible to build such an input sequence | ||
| 531 |   /// with the pair \p MI, \p DefIdx. False otherwise. | ||
| 532 |   /// | ||
| 533 |   /// \pre MI.isRegSequence() or MI.isRegSequenceLike(). | ||
| 534 |   /// | ||
| 535 |   /// \note The generic implementation does not provide any support for | ||
| 536 |   /// MI.isRegSequenceLike(). In other words, one has to override | ||
| 537 |   /// getRegSequenceLikeInputs for target specific instructions. | ||
| 538 |   bool | ||
| 539 | getRegSequenceInputs(const MachineInstr &MI, unsigned DefIdx, | ||
| 540 | SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const; | ||
| 541 | |||
| 542 |   /// Build the equivalent inputs of a EXTRACT_SUBREG for the given \p MI | ||
| 543 |   /// and \p DefIdx. | ||
| 544 |   /// \p [out] InputReg of the equivalent EXTRACT_SUBREG. | ||
| 545 |   /// E.g., EXTRACT_SUBREG %1:sub1, sub0, sub1 would produce: | ||
| 546 |   /// - %1:sub1, sub0 | ||
| 547 |   /// | ||
| 548 |   /// \returns true if it is possible to build such an input sequence | ||
| 549 |   /// with the pair \p MI, \p DefIdx and the operand has no undef flag set. | ||
| 550 |   /// False otherwise. | ||
| 551 |   /// | ||
| 552 |   /// \pre MI.isExtractSubreg() or MI.isExtractSubregLike(). | ||
| 553 |   /// | ||
| 554 |   /// \note The generic implementation does not provide any support for | ||
| 555 |   /// MI.isExtractSubregLike(). In other words, one has to override | ||
| 556 |   /// getExtractSubregLikeInputs for target specific instructions. | ||
| 557 | bool getExtractSubregInputs(const MachineInstr &MI, unsigned DefIdx, | ||
| 558 | RegSubRegPairAndIdx &InputReg) const; | ||
| 559 | |||
| 560 |   /// Build the equivalent inputs of a INSERT_SUBREG for the given \p MI | ||
| 561 |   /// and \p DefIdx. | ||
| 562 |   /// \p [out] BaseReg and \p [out] InsertedReg contain | ||
| 563 |   /// the equivalent inputs of INSERT_SUBREG. | ||
| 564 |   /// E.g., INSERT_SUBREG %0:sub0, %1:sub1, sub3 would produce: | ||
| 565 |   /// - BaseReg: %0:sub0 | ||
| 566 |   /// - InsertedReg: %1:sub1, sub3 | ||
| 567 |   /// | ||
| 568 |   /// \returns true if it is possible to build such an input sequence | ||
| 569 |   /// with the pair \p MI, \p DefIdx and the operand has no undef flag set. | ||
| 570 |   /// False otherwise. | ||
| 571 |   /// | ||
| 572 |   /// \pre MI.isInsertSubreg() or MI.isInsertSubregLike(). | ||
| 573 |   /// | ||
| 574 |   /// \note The generic implementation does not provide any support for | ||
| 575 |   /// MI.isInsertSubregLike(). In other words, one has to override | ||
| 576 |   /// getInsertSubregLikeInputs for target specific instructions. | ||
| 577 | bool getInsertSubregInputs(const MachineInstr &MI, unsigned DefIdx, | ||
| 578 |                              RegSubRegPair &BaseReg, | ||
| 579 | RegSubRegPairAndIdx &InsertedReg) const; | ||
| 580 | |||
| 581 |   /// Return true if two machine instructions would produce identical values. | ||
| 582 |   /// By default, this is only true when the two instructions | ||
| 583 |   /// are deemed identical except for defs. If this function is called when the | ||
| 584 |   /// IR is still in SSA form, the caller can pass the MachineRegisterInfo for | ||
| 585 |   /// aggressive checks. | ||
| 586 | virtual bool produceSameValue(const MachineInstr &MI0, | ||
| 587 | const MachineInstr &MI1, | ||
| 588 | const MachineRegisterInfo *MRI = nullptr) const; | ||
| 589 | |||
| 590 |   /// \returns true if a branch from an instruction with opcode \p BranchOpc | ||
| 591 |   ///  bytes is capable of jumping to a position \p BrOffset bytes away. | ||
| 592 | virtual bool isBranchOffsetInRange(unsigned BranchOpc, | ||
| 593 | int64_t BrOffset) const { | ||
| 594 | llvm_unreachable("target did not implement"); | ||
| 595 |   } | ||
| 596 | |||
| 597 |   /// \returns The block that branch instruction \p MI jumps to. | ||
| 598 | virtual MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const { | ||
| 599 | llvm_unreachable("target did not implement"); | ||
| 600 |   } | ||
| 601 | |||
| 602 |   /// Insert an unconditional indirect branch at the end of \p MBB to \p | ||
| 603 |   /// NewDestBB. Optionally, insert the clobbered register restoring in \p | ||
| 604 |   /// RestoreBB. \p BrOffset indicates the offset of \p NewDestBB relative to | ||
| 605 |   /// the offset of the position to insert the new branch. | ||
| 606 | virtual void insertIndirectBranch(MachineBasicBlock &MBB, | ||
| 607 |                                     MachineBasicBlock &NewDestBB, | ||
| 608 |                                     MachineBasicBlock &RestoreBB, | ||
| 609 | const DebugLoc &DL, int64_t BrOffset = 0, | ||
| 610 | RegScavenger *RS = nullptr) const { | ||
| 611 | llvm_unreachable("target did not implement"); | ||
| 612 |   } | ||
| 613 | |||
| 614 |   /// Analyze the branching code at the end of MBB, returning | ||
| 615 |   /// true if it cannot be understood (e.g. it's a switch dispatch or isn't | ||
| 616 |   /// implemented for a target).  Upon success, this returns false and returns | ||
| 617 |   /// with the following information in various cases: | ||
| 618 |   /// | ||
| 619 |   /// 1. If this block ends with no branches (it just falls through to its succ) | ||
| 620 |   ///    just return false, leaving TBB/FBB null. | ||
| 621 |   /// 2. If this block ends with only an unconditional branch, it sets TBB to be | ||
| 622 |   ///    the destination block. | ||
| 623 |   /// 3. If this block ends with a conditional branch and it falls through to a | ||
| 624 |   ///    successor block, it sets TBB to be the branch destination block and a | ||
| 625 |   ///    list of operands that evaluate the condition. These operands can be | ||
| 626 |   ///    passed to other TargetInstrInfo methods to create new branches. | ||
| 627 |   /// 4. If this block ends with a conditional branch followed by an | ||
| 628 |   ///    unconditional branch, it returns the 'true' destination in TBB, the | ||
| 629 |   ///    'false' destination in FBB, and a list of operands that evaluate the | ||
| 630 |   ///    condition.  These operands can be passed to other TargetInstrInfo | ||
| 631 |   ///    methods to create new branches. | ||
| 632 |   /// | ||
| 633 |   /// Note that removeBranch and insertBranch must be implemented to support | ||
| 634 |   /// cases where this method returns success. | ||
| 635 |   /// | ||
| 636 |   /// If AllowModify is true, then this routine is allowed to modify the basic | ||
| 637 |   /// block (e.g. delete instructions after the unconditional branch). | ||
| 638 |   /// | ||
| 639 |   /// The CFG information in MBB.Predecessors and MBB.Successors must be valid | ||
| 640 |   /// before calling this function. | ||
| 641 | virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, | ||
| 642 | MachineBasicBlock *&FBB, | ||
| 643 | SmallVectorImpl<MachineOperand> &Cond, | ||
| 644 | bool AllowModify = false) const { | ||
| 645 | return true; | ||
| 646 |   } | ||
| 647 | |||
| 648 |   /// Represents a predicate at the MachineFunction level.  The control flow a | ||
| 649 |   /// MachineBranchPredicate represents is: | ||
| 650 |   /// | ||
| 651 |   ///  Reg = LHS `Predicate` RHS         == ConditionDef | ||
| 652 |   ///  if Reg then goto TrueDest else goto FalseDest | ||
| 653 |   /// | ||
| 654 | struct MachineBranchPredicate { | ||
| 655 | enum ComparePredicate { | ||
| 656 |       PRED_EQ,     // True if two values are equal | ||
| 657 |       PRED_NE,     // True if two values are not equal | ||
| 658 |       PRED_INVALID // Sentinel value | ||
| 659 | }; | ||
| 660 | |||
| 661 | ComparePredicate Predicate = PRED_INVALID; | ||
| 662 | MachineOperand LHS = MachineOperand::CreateImm(0); | ||
| 663 | MachineOperand RHS = MachineOperand::CreateImm(0); | ||
| 664 | MachineBasicBlock *TrueDest = nullptr; | ||
| 665 | MachineBasicBlock *FalseDest = nullptr; | ||
| 666 | MachineInstr *ConditionDef = nullptr; | ||
| 667 | |||
| 668 |     /// SingleUseCondition is true if ConditionDef is dead except for the | ||
| 669 |     /// branch(es) at the end of the basic block. | ||
| 670 |     /// | ||
| 671 | bool SingleUseCondition = false; | ||
| 672 | |||
| 673 | explicit MachineBranchPredicate() = default; | ||
| 674 | }; | ||
| 675 | |||
| 676 |   /// Analyze the branching code at the end of MBB and parse it into the | ||
| 677 |   /// MachineBranchPredicate structure if possible.  Returns false on success | ||
| 678 |   /// and true on failure. | ||
| 679 |   /// | ||
| 680 |   /// If AllowModify is true, then this routine is allowed to modify the basic | ||
| 681 |   /// block (e.g. delete instructions after the unconditional branch). | ||
| 682 |   /// | ||
| 683 | virtual bool analyzeBranchPredicate(MachineBasicBlock &MBB, | ||
| 684 |                                       MachineBranchPredicate &MBP, | ||
| 685 | bool AllowModify = false) const { | ||
| 686 | return true; | ||
| 687 |   } | ||
| 688 | |||
| 689 |   /// Remove the branching code at the end of the specific MBB. | ||
| 690 |   /// This is only invoked in cases where analyzeBranch returns success. It | ||
| 691 |   /// returns the number of instructions that were removed. | ||
| 692 |   /// If \p BytesRemoved is non-null, report the change in code size from the | ||
| 693 |   /// removed instructions. | ||
| 694 | virtual unsigned removeBranch(MachineBasicBlock &MBB, | ||
| 695 | int *BytesRemoved = nullptr) const { | ||
| 696 | llvm_unreachable("Target didn't implement TargetInstrInfo::removeBranch!"); | ||
| 697 |   } | ||
| 698 | |||
| 699 |   /// Insert branch code into the end of the specified MachineBasicBlock. The | ||
| 700 |   /// operands to this method are the same as those returned by analyzeBranch. | ||
| 701 |   /// This is only invoked in cases where analyzeBranch returns success. It | ||
| 702 |   /// returns the number of instructions inserted. If \p BytesAdded is non-null, | ||
| 703 |   /// report the change in code size from the added instructions. | ||
| 704 |   /// | ||
| 705 |   /// It is also invoked by tail merging to add unconditional branches in | ||
| 706 |   /// cases where analyzeBranch doesn't apply because there was no original | ||
| 707 |   /// branch to analyze.  At least this much must be implemented, else tail | ||
| 708 |   /// merging needs to be disabled. | ||
| 709 |   /// | ||
| 710 |   /// The CFG information in MBB.Predecessors and MBB.Successors must be valid | ||
| 711 |   /// before calling this function. | ||
| 712 | virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, | ||
| 713 |                                 MachineBasicBlock *FBB, | ||
| 714 | ArrayRef<MachineOperand> Cond, | ||
| 715 | const DebugLoc &DL, | ||
| 716 | int *BytesAdded = nullptr) const { | ||
| 717 | llvm_unreachable("Target didn't implement TargetInstrInfo::insertBranch!"); | ||
| 718 |   } | ||
| 719 | |||
| 720 | unsigned insertUnconditionalBranch(MachineBasicBlock &MBB, | ||
| 721 |                                      MachineBasicBlock *DestBB, | ||
| 722 | const DebugLoc &DL, | ||
| 723 | int *BytesAdded = nullptr) const { | ||
| 724 | return insertBranch(MBB, DestBB, nullptr, ArrayRef<MachineOperand>(), DL, | ||
| 725 | BytesAdded); | ||
| 726 |   } | ||
| 727 | |||
| 728 |   /// Object returned by analyzeLoopForPipelining. Allows software pipelining | ||
| 729 |   /// implementations to query attributes of the loop being pipelined and to | ||
| 730 |   /// apply target-specific updates to the loop once pipelining is complete. | ||
| 731 | class PipelinerLoopInfo { | ||
| 732 | public: | ||
| 733 | virtual ~PipelinerLoopInfo(); | ||
| 734 |     /// Return true if the given instruction should not be pipelined and should | ||
| 735 |     /// be ignored. An example could be a loop comparison, or induction variable | ||
| 736 |     /// update with no users being pipelined. | ||
| 737 | virtual bool shouldIgnoreForPipelining(const MachineInstr *MI) const = 0; | ||
| 738 | |||
| 739 |     /// Return true if the proposed schedule should used.  Otherwise return | ||
| 740 |     /// false to not pipeline the loop. This function should be used to ensure | ||
| 741 |     /// that pipelined loops meet target-specific quality heuristics. | ||
| 742 | virtual bool shouldUseSchedule(SwingSchedulerDAG &SSD, SMSchedule &SMS) { | ||
| 743 | return true; | ||
| 744 |     } | ||
| 745 | |||
| 746 |     /// Create a condition to determine if the trip count of the loop is greater | ||
| 747 |     /// than TC, where TC is always one more than for the previous prologue or | ||
| 748 |     /// 0 if this is being called for the outermost prologue. | ||
| 749 |     /// | ||
| 750 |     /// If the trip count is statically known to be greater than TC, return | ||
| 751 |     /// true. If the trip count is statically known to be not greater than TC, | ||
| 752 |     /// return false. Otherwise return nullopt and fill out Cond with the test | ||
| 753 |     /// condition. | ||
| 754 |     /// | ||
| 755 |     /// Note: This hook is guaranteed to be called from the innermost to the | ||
| 756 |     /// outermost prologue of the loop being software pipelined. | ||
| 757 | virtual std::optional<bool> | ||
| 758 | createTripCountGreaterCondition(int TC, MachineBasicBlock &MBB, | ||
| 759 | SmallVectorImpl<MachineOperand> &Cond) = 0; | ||
| 760 | |||
| 761 |     /// Modify the loop such that the trip count is | ||
| 762 |     /// OriginalTC + TripCountAdjust. | ||
| 763 | virtual void adjustTripCount(int TripCountAdjust) = 0; | ||
| 764 | |||
| 765 |     /// Called when the loop's preheader has been modified to NewPreheader. | ||
| 766 | virtual void setPreheader(MachineBasicBlock *NewPreheader) = 0; | ||
| 767 | |||
| 768 |     /// Called when the loop is being removed. Any instructions in the preheader | ||
| 769 |     /// should be removed. | ||
| 770 |     /// | ||
| 771 |     /// Once this function is called, no other functions on this object are | ||
| 772 |     /// valid; the loop has been removed. | ||
| 773 | virtual void disposed() = 0; | ||
| 774 | }; | ||
| 775 | |||
| 776 |   /// Analyze loop L, which must be a single-basic-block loop, and if the | ||
| 777 |   /// conditions can be understood enough produce a PipelinerLoopInfo object. | ||
| 778 | virtual std::unique_ptr<PipelinerLoopInfo> | ||
| 779 | analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const { | ||
| 780 | return nullptr; | ||
| 781 |   } | ||
| 782 | |||
| 783 |   /// Analyze the loop code, return true if it cannot be understood. Upon | ||
| 784 |   /// success, this function returns false and returns information about the | ||
| 785 |   /// induction variable and compare instruction used at the end. | ||
| 786 | virtual bool analyzeLoop(MachineLoop &L, MachineInstr *&IndVarInst, | ||
| 787 | MachineInstr *&CmpInst) const { | ||
| 788 | return true; | ||
| 789 |   } | ||
| 790 | |||
| 791 |   /// Generate code to reduce the loop iteration by one and check if the loop | ||
| 792 |   /// is finished.  Return the value/register of the new loop count.  We need | ||
| 793 |   /// this function when peeling off one or more iterations of a loop. This | ||
| 794 |   /// function assumes the nth iteration is peeled first. | ||
| 795 | virtual unsigned reduceLoopCount(MachineBasicBlock &MBB, | ||
| 796 |                                    MachineBasicBlock &PreHeader, | ||
| 797 | MachineInstr *IndVar, MachineInstr &Cmp, | ||
| 798 | SmallVectorImpl<MachineOperand> &Cond, | ||
| 799 | SmallVectorImpl<MachineInstr *> &PrevInsts, | ||
| 800 | unsigned Iter, unsigned MaxIter) const { | ||
| 801 | llvm_unreachable("Target didn't implement ReduceLoopCount"); | ||
| 802 |   } | ||
| 803 | |||
| 804 |   /// Delete the instruction OldInst and everything after it, replacing it with | ||
| 805 |   /// an unconditional branch to NewDest. This is used by the tail merging pass. | ||
| 806 | virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, | ||
| 807 | MachineBasicBlock *NewDest) const; | ||
| 808 | |||
| 809 |   /// Return true if it's legal to split the given basic | ||
| 810 |   /// block at the specified instruction (i.e. instruction would be the start | ||
| 811 |   /// of a new basic block). | ||
| 812 | virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, | ||
| 813 | MachineBasicBlock::iterator MBBI) const { | ||
| 814 | return true; | ||
| 815 |   } | ||
| 816 | |||
| 817 |   /// Return true if it's profitable to predicate | ||
| 818 |   /// instructions with accumulated instruction latency of "NumCycles" | ||
| 819 |   /// of the specified basic block, where the probability of the instructions | ||
| 820 |   /// being executed is given by Probability, and Confidence is a measure | ||
| 821 |   /// of our confidence that it will be properly predicted. | ||
| 822 | virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, | ||
| 823 |                                    unsigned ExtraPredCycles, | ||
| 824 | BranchProbability Probability) const { | ||
| 825 | return false; | ||
| 826 |   } | ||
| 827 | |||
| 828 |   /// Second variant of isProfitableToIfCvt. This one | ||
| 829 |   /// checks for the case where two basic blocks from true and false path | ||
| 830 |   /// of a if-then-else (diamond) are predicated on mutually exclusive | ||
| 831 |   /// predicates, where the probability of the true path being taken is given | ||
| 832 |   /// by Probability, and Confidence is a measure of our confidence that it | ||
| 833 |   /// will be properly predicted. | ||
| 834 | virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumTCycles, | ||
| 835 |                                    unsigned ExtraTCycles, | ||
| 836 | MachineBasicBlock &FMBB, unsigned NumFCycles, | ||
| 837 |                                    unsigned ExtraFCycles, | ||
| 838 | BranchProbability Probability) const { | ||
| 839 | return false; | ||
| 840 |   } | ||
| 841 | |||
| 842 |   /// Return true if it's profitable for if-converter to duplicate instructions | ||
| 843 |   /// of specified accumulated instruction latencies in the specified MBB to | ||
| 844 |   /// enable if-conversion. | ||
| 845 |   /// The probability of the instructions being executed is given by | ||
| 846 |   /// Probability, and Confidence is a measure of our confidence that it | ||
| 847 |   /// will be properly predicted. | ||
| 848 | virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, | ||
| 849 |                                          unsigned NumCycles, | ||
| 850 | BranchProbability Probability) const { | ||
| 851 | return false; | ||
| 852 |   } | ||
| 853 | |||
| 854 |   /// Return the increase in code size needed to predicate a contiguous run of | ||
| 855 |   /// NumInsts instructions. | ||
| 856 | virtual unsigned extraSizeToPredicateInstructions(const MachineFunction &MF, | ||
| 857 | unsigned NumInsts) const { | ||
| 858 | return 0; | ||
| 859 |   } | ||
| 860 | |||
| 861 |   /// Return an estimate for the code size reduction (in bytes) which will be | ||
| 862 |   /// caused by removing the given branch instruction during if-conversion. | ||
| 863 | virtual unsigned predictBranchSizeForIfCvt(MachineInstr &MI) const { | ||
| 864 | return getInstSizeInBytes(MI); | ||
| 865 |   } | ||
| 866 | |||
| 867 |   /// Return true if it's profitable to unpredicate | ||
| 868 |   /// one side of a 'diamond', i.e. two sides of if-else predicated on mutually | ||
| 869 |   /// exclusive predicates. | ||
| 870 |   /// e.g. | ||
| 871 |   ///   subeq  r0, r1, #1 | ||
| 872 |   ///   addne  r0, r1, #1 | ||
| 873 |   /// => | ||
| 874 |   ///   sub    r0, r1, #1 | ||
| 875 |   ///   addne  r0, r1, #1 | ||
| 876 |   /// | ||
| 877 |   /// This may be profitable is conditional instructions are always executed. | ||
| 878 | virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, | ||
| 879 | MachineBasicBlock &FMBB) const { | ||
| 880 | return false; | ||
| 881 |   } | ||
| 882 | |||
| 883 |   /// Return true if it is possible to insert a select | ||
| 884 |   /// instruction that chooses between TrueReg and FalseReg based on the | ||
| 885 |   /// condition code in Cond. | ||
| 886 |   /// | ||
| 887 |   /// When successful, also return the latency in cycles from TrueReg, | ||
| 888 |   /// FalseReg, and Cond to the destination register. In most cases, a select | ||
| 889 |   /// instruction will be 1 cycle, so CondCycles = TrueCycles = FalseCycles = 1 | ||
| 890 |   /// | ||
| 891 |   /// Some x86 implementations have 2-cycle cmov instructions. | ||
| 892 |   /// | ||
| 893 |   /// @param MBB         Block where select instruction would be inserted. | ||
| 894 |   /// @param Cond        Condition returned by analyzeBranch. | ||
| 895 |   /// @param DstReg      Virtual dest register that the result should write to. | ||
| 896 |   /// @param TrueReg     Virtual register to select when Cond is true. | ||
| 897 |   /// @param FalseReg    Virtual register to select when Cond is false. | ||
| 898 |   /// @param CondCycles  Latency from Cond+Branch to select output. | ||
| 899 |   /// @param TrueCycles  Latency from TrueReg to select output. | ||
| 900 |   /// @param FalseCycles Latency from FalseReg to select output. | ||
| 901 | virtual bool canInsertSelect(const MachineBasicBlock &MBB, | ||
| 902 | ArrayRef<MachineOperand> Cond, Register DstReg, | ||
| 903 | Register TrueReg, Register FalseReg, | ||
| 904 | int &CondCycles, int &TrueCycles, | ||
| 905 | int &FalseCycles) const { | ||
| 906 | return false; | ||
| 907 |   } | ||
| 908 | |||
| 909 |   /// Insert a select instruction into MBB before I that will copy TrueReg to | ||
| 910 |   /// DstReg when Cond is true, and FalseReg to DstReg when Cond is false. | ||
| 911 |   /// | ||
| 912 |   /// This function can only be called after canInsertSelect() returned true. | ||
| 913 |   /// The condition in Cond comes from analyzeBranch, and it can be assumed | ||
| 914 |   /// that the same flags or registers required by Cond are available at the | ||
| 915 |   /// insertion point. | ||
| 916 |   /// | ||
| 917 |   /// @param MBB      Block where select instruction should be inserted. | ||
| 918 |   /// @param I        Insertion point. | ||
| 919 |   /// @param DL       Source location for debugging. | ||
| 920 |   /// @param DstReg   Virtual register to be defined by select instruction. | ||
| 921 |   /// @param Cond     Condition as computed by analyzeBranch. | ||
| 922 |   /// @param TrueReg  Virtual register to copy when Cond is true. | ||
| 923 |   /// @param FalseReg Virtual register to copy when Cons is false. | ||
| 924 | virtual void insertSelect(MachineBasicBlock &MBB, | ||
| 925 | MachineBasicBlock::iterator I, const DebugLoc &DL, | ||
| 926 | Register DstReg, ArrayRef<MachineOperand> Cond, | ||
| 927 | Register TrueReg, Register FalseReg) const { | ||
| 928 | llvm_unreachable("Target didn't implement TargetInstrInfo::insertSelect!"); | ||
| 929 |   } | ||
| 930 | |||
| 931 |   /// Analyze the given select instruction, returning true if | ||
| 932 |   /// it cannot be understood. It is assumed that MI->isSelect() is true. | ||
| 933 |   /// | ||
| 934 |   /// When successful, return the controlling condition and the operands that | ||
| 935 |   /// determine the true and false result values. | ||
| 936 |   /// | ||
| 937 |   ///   Result = SELECT Cond, TrueOp, FalseOp | ||
| 938 |   /// | ||
| 939 |   /// Some targets can optimize select instructions, for example by predicating | ||
| 940 |   /// the instruction defining one of the operands. Such targets should set | ||
| 941 |   /// Optimizable. | ||
| 942 |   /// | ||
| 943 |   /// @param         MI Select instruction to analyze. | ||
| 944 |   /// @param Cond    Condition controlling the select. | ||
| 945 |   /// @param TrueOp  Operand number of the value selected when Cond is true. | ||
| 946 |   /// @param FalseOp Operand number of the value selected when Cond is false. | ||
| 947 |   /// @param Optimizable Returned as true if MI is optimizable. | ||
| 948 |   /// @returns False on success. | ||
| 949 | virtual bool analyzeSelect(const MachineInstr &MI, | ||
| 950 | SmallVectorImpl<MachineOperand> &Cond, | ||
| 951 | unsigned &TrueOp, unsigned &FalseOp, | ||
| 952 | bool &Optimizable) const { | ||
| 953 | assert(MI.getDesc().isSelect() && "MI must be a select instruction"); | ||
| 954 | return true; | ||
| 955 |   } | ||
| 956 | |||
| 957 |   /// Given a select instruction that was understood by | ||
| 958 |   /// analyzeSelect and returned Optimizable = true, attempt to optimize MI by | ||
| 959 |   /// merging it with one of its operands. Returns NULL on failure. | ||
| 960 |   /// | ||
| 961 |   /// When successful, returns the new select instruction. The client is | ||
| 962 |   /// responsible for deleting MI. | ||
| 963 |   /// | ||
| 964 |   /// If both sides of the select can be optimized, PreferFalse is used to pick | ||
| 965 |   /// a side. | ||
| 966 |   /// | ||
| 967 |   /// @param MI          Optimizable select instruction. | ||
| 968 |   /// @param NewMIs     Set that record all MIs in the basic block up to \p | ||
| 969 |   /// MI. Has to be updated with any newly created MI or deleted ones. | ||
| 970 |   /// @param PreferFalse Try to optimize FalseOp instead of TrueOp. | ||
| 971 |   /// @returns Optimized instruction or NULL. | ||
| 972 | virtual MachineInstr *optimizeSelect(MachineInstr &MI, | ||
| 973 | SmallPtrSetImpl<MachineInstr *> &NewMIs, | ||
| 974 | bool PreferFalse = false) const { | ||
| 975 |     // This function must be implemented if Optimizable is ever set. | ||
| 976 | llvm_unreachable("Target must implement TargetInstrInfo::optimizeSelect!"); | ||
| 977 |   } | ||
| 978 | |||
| 979 |   /// Emit instructions to copy a pair of physical registers. | ||
| 980 |   /// | ||
| 981 |   /// This function should support copies within any legal register class as | ||
| 982 |   /// well as any cross-class copies created during instruction selection. | ||
| 983 |   /// | ||
| 984 |   /// The source and destination registers may overlap, which may require a | ||
| 985 |   /// careful implementation when multiple copy instructions are required for | ||
| 986 |   /// large registers. See for example the ARM target. | ||
| 987 | virtual void copyPhysReg(MachineBasicBlock &MBB, | ||
| 988 | MachineBasicBlock::iterator MI, const DebugLoc &DL, | ||
| 989 | MCRegister DestReg, MCRegister SrcReg, | ||
| 990 | bool KillSrc) const { | ||
| 991 | llvm_unreachable("Target didn't implement TargetInstrInfo::copyPhysReg!"); | ||
| 992 |   } | ||
| 993 | |||
| 994 |   /// Allow targets to tell MachineVerifier whether a specific register | ||
| 995 |   /// MachineOperand can be used as part of PC-relative addressing. | ||
| 996 |   /// PC-relative addressing modes in many CISC architectures contain | ||
| 997 |   /// (non-PC) registers as offsets or scaling values, which inherently | ||
| 998 |   /// tags the corresponding MachineOperand with OPERAND_PCREL. | ||
| 999 |   /// | ||
| 1000 |   /// @param MO The MachineOperand in question. MO.isReg() should always | ||
| 1001 |   /// be true. | ||
| 1002 |   /// @return Whether this operand is allowed to be used PC-relatively. | ||
| 1003 | virtual bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const { | ||
| 1004 | return false; | ||
| 1005 |   } | ||
| 1006 | |||
| 1007 | protected: | ||
| 1008 |   /// Target-dependent implementation for IsCopyInstr. | ||
| 1009 |   /// If the specific machine instruction is a instruction that moves/copies | ||
| 1010 |   /// value from one register to another register return destination and source | ||
| 1011 |   /// registers as machine operands. | ||
| 1012 | virtual std::optional<DestSourcePair> | ||
| 1013 | isCopyInstrImpl(const MachineInstr &MI) const { | ||
| 1014 | return std::nullopt; | ||
| 1015 |   } | ||
| 1016 | |||
| 1017 |   /// Return true if the given terminator MI is not expected to spill. This | ||
| 1018 |   /// sets the live interval as not spillable and adjusts phi node lowering to | ||
| 1019 |   /// not introduce copies after the terminator. Use with care, these are | ||
| 1020 |   /// currently used for hardware loop intrinsics in very controlled situations, | ||
| 1021 |   /// created prior to registry allocation in loops that only have single phi | ||
| 1022 |   /// users for the terminators value. They may run out of registers if not used | ||
| 1023 |   /// carefully. | ||
| 1024 | virtual bool isUnspillableTerminatorImpl(const MachineInstr *MI) const { | ||
| 1025 | return false; | ||
| 1026 |   } | ||
| 1027 | |||
| 1028 | public: | ||
| 1029 |   /// If the specific machine instruction is a instruction that moves/copies | ||
| 1030 |   /// value from one register to another register return destination and source | ||
| 1031 |   /// registers as machine operands. | ||
| 1032 |   /// For COPY-instruction the method naturally returns destination and source | ||
| 1033 |   /// registers as machine operands, for all other instructions the method calls | ||
| 1034 |   /// target-dependent implementation. | ||
| 1035 | std::optional<DestSourcePair> isCopyInstr(const MachineInstr &MI) const { | ||
| 1036 | if (MI.isCopy()) { | ||
| 1037 | return DestSourcePair{MI.getOperand(0), MI.getOperand(1)}; | ||
| 1038 |     } | ||
| 1039 | return isCopyInstrImpl(MI); | ||
| 1040 |   } | ||
| 1041 | |||
| 1042 |   /// If the specific machine instruction is an instruction that adds an | ||
| 1043 |   /// immediate value and a physical register, and stores the result in | ||
| 1044 |   /// the given physical register \c Reg, return a pair of the source | ||
| 1045 |   /// register and the offset which has been added. | ||
| 1046 | virtual std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI, | ||
| 1047 | Register Reg) const { | ||
| 1048 | return std::nullopt; | ||
| 1049 |   } | ||
| 1050 | |||
| 1051 |   /// Returns true if MI is an instruction that defines Reg to have a constant | ||
| 1052 |   /// value and the value is recorded in ImmVal. The ImmVal is a result that | ||
| 1053 |   /// should be interpreted as modulo size of Reg. | ||
| 1054 | virtual bool getConstValDefinedInReg(const MachineInstr &MI, | ||
| 1055 |                                        const Register Reg, | ||
| 1056 | int64_t &ImmVal) const { | ||
| 1057 | return false; | ||
| 1058 |   } | ||
| 1059 | |||
| 1060 |   /// Store the specified register of the given register class to the specified | ||
| 1061 |   /// stack frame index. The store instruction is to be added to the given | ||
| 1062 |   /// machine basic block before the specified machine instruction. If isKill | ||
| 1063 |   /// is true, the register operand is the last use and must be marked kill. If | ||
| 1064 |   /// \p SrcReg is being directly spilled as part of assigning a virtual | ||
| 1065 |   /// register, \p VReg is the register being assigned. This additional register | ||
| 1066 |   /// argument is needed for certain targets when invoked from RegAllocFast to | ||
| 1067 |   /// map the spilled physical register to its virtual register. A null register | ||
| 1068 |   /// can be passed elsewhere. | ||
| 1069 | virtual void storeRegToStackSlot(MachineBasicBlock &MBB, | ||
| 1070 | MachineBasicBlock::iterator MI, | ||
| 1071 | Register SrcReg, bool isKill, int FrameIndex, | ||
| 1072 | const TargetRegisterClass *RC, | ||
| 1073 | const TargetRegisterInfo *TRI, | ||
| 1074 | Register VReg) const { | ||
| 1075 | llvm_unreachable("Target didn't implement " | ||
| 1076 | "TargetInstrInfo::storeRegToStackSlot!"); | ||
| 1077 |   } | ||
| 1078 | |||
| 1079 |   /// Load the specified register of the given register class from the specified | ||
| 1080 |   /// stack frame index. The load instruction is to be added to the given | ||
| 1081 |   /// machine basic block before the specified machine instruction. If \p | ||
| 1082 |   /// DestReg is being directly reloaded as part of assigning a virtual | ||
| 1083 |   /// register, \p VReg is the register being assigned. This additional register | ||
| 1084 |   /// argument is needed for certain targets when invoked from RegAllocFast to | ||
| 1085 |   /// map the loaded physical register to its virtual register. A null register | ||
| 1086 |   /// can be passed elsewhere. | ||
| 1087 | virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, | ||
| 1088 | MachineBasicBlock::iterator MI, | ||
| 1089 |                                     Register DestReg, int FrameIndex, | ||
| 1090 | const TargetRegisterClass *RC, | ||
| 1091 | const TargetRegisterInfo *TRI, | ||
| 1092 | Register VReg) const { | ||
| 1093 | llvm_unreachable("Target didn't implement " | ||
| 1094 | "TargetInstrInfo::loadRegFromStackSlot!"); | ||
| 1095 |   } | ||
| 1096 | |||
| 1097 |   /// This function is called for all pseudo instructions | ||
| 1098 |   /// that remain after register allocation. Many pseudo instructions are | ||
| 1099 |   /// created to help register allocation. This is the place to convert them | ||
| 1100 |   /// into real instructions. The target can edit MI in place, or it can insert | ||
| 1101 |   /// new instructions and erase MI. The function should return true if | ||
| 1102 |   /// anything was changed. | ||
| 1103 | virtual bool expandPostRAPseudo(MachineInstr &MI) const { return false; } | ||
| 1104 | |||
| 1105 |   /// Check whether the target can fold a load that feeds a subreg operand | ||
| 1106 |   /// (or a subreg operand that feeds a store). | ||
| 1107 |   /// For example, X86 may want to return true if it can fold | ||
| 1108 |   /// movl (%esp), %eax | ||
| 1109 |   /// subb, %al, ... | ||
| 1110 |   /// Into: | ||
| 1111 |   /// subb (%esp), ... | ||
| 1112 |   /// | ||
| 1113 |   /// Ideally, we'd like the target implementation of foldMemoryOperand() to | ||
| 1114 |   /// reject subregs - but since this behavior used to be enforced in the | ||
| 1115 |   /// target-independent code, moving this responsibility to the targets | ||
| 1116 |   /// has the potential of causing nasty silent breakage in out-of-tree targets. | ||
| 1117 | virtual bool isSubregFoldable() const { return false; } | ||
| 1118 | |||
| 1119 |   /// For a patchpoint, stackmap, or statepoint intrinsic, return the range of | ||
| 1120 |   /// operands which can't be folded into stack references. Operands outside | ||
| 1121 |   /// of the range are most likely foldable but it is not guaranteed. | ||
| 1122 |   /// These instructions are unique in that stack references for some operands | ||
| 1123 |   /// have the same execution cost (e.g. none) as the unfolded register forms. | ||
| 1124 |   /// The ranged return is guaranteed to include all operands which can't be | ||
| 1125 |   /// folded at zero cost. | ||
| 1126 | virtual std::pair<unsigned, unsigned> | ||
| 1127 | getPatchpointUnfoldableRange(const MachineInstr &MI) const; | ||
| 1128 | |||
| 1129 |   /// Attempt to fold a load or store of the specified stack | ||
| 1130 |   /// slot into the specified machine instruction for the specified operand(s). | ||
| 1131 |   /// If this is possible, a new instruction is returned with the specified | ||
| 1132 |   /// operand folded, otherwise NULL is returned. | ||
| 1133 |   /// The new instruction is inserted before MI, and the client is responsible | ||
| 1134 |   /// for removing the old instruction. | ||
| 1135 |   /// If VRM is passed, the assigned physregs can be inspected by target to | ||
| 1136 |   /// decide on using an opcode (note that those assignments can still change). | ||
| 1137 | MachineInstr *foldMemoryOperand(MachineInstr &MI, ArrayRef<unsigned> Ops, | ||
| 1138 |                                   int FI, | ||
| 1139 | LiveIntervals *LIS = nullptr, | ||
| 1140 | VirtRegMap *VRM = nullptr) const; | ||
| 1141 | |||
| 1142 |   /// Same as the previous version except it allows folding of any load and | ||
| 1143 |   /// store from / to any address, not just from a specific stack slot. | ||
| 1144 | MachineInstr *foldMemoryOperand(MachineInstr &MI, ArrayRef<unsigned> Ops, | ||
| 1145 |                                   MachineInstr &LoadMI, | ||
| 1146 | LiveIntervals *LIS = nullptr) const; | ||
| 1147 | |||
| 1148 |   /// Return true when there is potentially a faster code sequence | ||
| 1149 |   /// for an instruction chain ending in \p Root. All potential patterns are | ||
| 1150 |   /// returned in the \p Pattern vector. Pattern should be sorted in priority | ||
| 1151 |   /// order since the pattern evaluator stops checking as soon as it finds a | ||
| 1152 |   /// faster sequence. | ||
| 1153 |   /// \param Root - Instruction that could be combined with one of its operands | ||
| 1154 |   /// \param Patterns - Vector of possible combination patterns | ||
| 1155 | virtual bool | ||
| 1156 | getMachineCombinerPatterns(MachineInstr &Root, | ||
| 1157 | SmallVectorImpl<MachineCombinerPattern> &Patterns, | ||
| 1158 | bool DoRegPressureReduce) const; | ||
| 1159 | |||
| 1160 |   /// Return true if target supports reassociation of instructions in machine | ||
| 1161 |   /// combiner pass to reduce register pressure for a given BB. | ||
| 1162 | virtual bool | ||
| 1163 | shouldReduceRegisterPressure(const MachineBasicBlock *MBB, | ||
| 1164 | const RegisterClassInfo *RegClassInfo) const { | ||
| 1165 | return false; | ||
| 1166 |   } | ||
| 1167 | |||
| 1168 |   /// Fix up the placeholder we may add in genAlternativeCodeSequence(). | ||
| 1169 | virtual void | ||
| 1170 | finalizeInsInstrs(MachineInstr &Root, MachineCombinerPattern &P, | ||
| 1171 | SmallVectorImpl<MachineInstr *> &InsInstrs) const {} | ||
| 1172 | |||
| 1173 |   /// Return true when a code sequence can improve throughput. It | ||
| 1174 |   /// should be called only for instructions in loops. | ||
| 1175 |   /// \param Pattern - combiner pattern | ||
| 1176 | virtual bool isThroughputPattern(MachineCombinerPattern Pattern) const; | ||
| 1177 | |||
| 1178 |   /// Return true if the input \P Inst is part of a chain of dependent ops | ||
| 1179 |   /// that are suitable for reassociation, otherwise return false. | ||
| 1180 |   /// If the instruction's operands must be commuted to have a previous | ||
| 1181 |   /// instruction of the same type define the first source operand, \P Commuted | ||
| 1182 |   /// will be set to true. | ||
| 1183 | bool isReassociationCandidate(const MachineInstr &Inst, bool &Commuted) const; | ||
| 1184 | |||
| 1185 |   /// Return true when \P Inst is both associative and commutative. If \P Invert | ||
| 1186 |   /// is true, then the inverse of \P Inst operation must be tested. | ||
| 1187 | virtual bool isAssociativeAndCommutative(const MachineInstr &Inst, | ||
| 1188 | bool Invert = false) const { | ||
| 1189 | return false; | ||
| 1190 |   } | ||
| 1191 | |||
| 1192 |   /// Return the inverse operation opcode if it exists for \P Opcode (e.g. add | ||
| 1193 |   /// for sub and vice versa). | ||
| 1194 | virtual std::optional<unsigned> getInverseOpcode(unsigned Opcode) const { | ||
| 1195 | return std::nullopt; | ||
| 1196 |   } | ||
| 1197 | |||
| 1198 |   /// Return true when \P Opcode1 or its inversion is equal to \P Opcode2. | ||
| 1199 | bool areOpcodesEqualOrInverse(unsigned Opcode1, unsigned Opcode2) const; | ||
| 1200 | |||
| 1201 |   /// Return true when \P Inst has reassociable operands in the same \P MBB. | ||
| 1202 | virtual bool hasReassociableOperands(const MachineInstr &Inst, | ||
| 1203 | const MachineBasicBlock *MBB) const; | ||
| 1204 | |||
| 1205 |   /// Return true when \P Inst has reassociable sibling. | ||
| 1206 | virtual bool hasReassociableSibling(const MachineInstr &Inst, | ||
| 1207 | bool &Commuted) const; | ||
| 1208 | |||
| 1209 |   /// When getMachineCombinerPatterns() finds patterns, this function generates | ||
| 1210 |   /// the instructions that could replace the original code sequence. The client | ||
| 1211 |   /// has to decide whether the actual replacement is beneficial or not. | ||
| 1212 |   /// \param Root - Instruction that could be combined with one of its operands | ||
| 1213 |   /// \param Pattern - Combination pattern for Root | ||
| 1214 |   /// \param InsInstrs - Vector of new instructions that implement P | ||
| 1215 |   /// \param DelInstrs - Old instructions, including Root, that could be | ||
| 1216 |   /// replaced by InsInstr | ||
| 1217 |   /// \param InstIdxForVirtReg - map of virtual register to instruction in | ||
| 1218 |   /// InsInstr that defines it | ||
| 1219 | virtual void genAlternativeCodeSequence( | ||
| 1220 |       MachineInstr &Root, MachineCombinerPattern Pattern, | ||
| 1221 | SmallVectorImpl<MachineInstr *> &InsInstrs, | ||
| 1222 | SmallVectorImpl<MachineInstr *> &DelInstrs, | ||
| 1223 | DenseMap<unsigned, unsigned> &InstIdxForVirtReg) const; | ||
| 1224 | |||
| 1225 |   /// Attempt to reassociate \P Root and \P Prev according to \P Pattern to | ||
| 1226 |   /// reduce critical path length. | ||
| 1227 | void reassociateOps(MachineInstr &Root, MachineInstr &Prev, | ||
| 1228 | MachineCombinerPattern Pattern, | ||
| 1229 | SmallVectorImpl<MachineInstr *> &InsInstrs, | ||
| 1230 | SmallVectorImpl<MachineInstr *> &DelInstrs, | ||
| 1231 | DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) const; | ||
| 1232 | |||
| 1233 |   /// Reassociation of some instructions requires inverse operations (e.g. | ||
| 1234 |   /// (X + A) - Y => (X - Y) + A). This method returns a pair of new opcodes | ||
| 1235 |   /// (new root opcode, new prev opcode) that must be used to reassociate \P | ||
| 1236 |   /// Root and \P Prev accoring to \P Pattern. | ||
| 1237 | std::pair<unsigned, unsigned> | ||
| 1238 |   getReassociationOpcodes(MachineCombinerPattern Pattern, | ||
| 1239 | const MachineInstr &Root, | ||
| 1240 | const MachineInstr &Prev) const; | ||
| 1241 | |||
| 1242 |   /// The limit on resource length extension we accept in MachineCombiner Pass. | ||
| 1243 | virtual int getExtendResourceLenLimit() const { return 0; } | ||
| 1244 | |||
| 1245 |   /// This is an architecture-specific helper function of reassociateOps. | ||
| 1246 |   /// Set special operand attributes for new instructions after reassociation. | ||
| 1247 | virtual void setSpecialOperandAttr(MachineInstr &OldMI1, MachineInstr &OldMI2, | ||
| 1248 |                                      MachineInstr &NewMI1, | ||
| 1249 | MachineInstr &NewMI2) const {} | ||
| 1250 | |||
| 1251 |   /// Return true when a target supports MachineCombiner. | ||
| 1252 | virtual bool useMachineCombiner() const { return false; } | ||
| 1253 | |||
| 1254 |   /// Return true if the given SDNode can be copied during scheduling | ||
| 1255 |   /// even if it has glue. | ||
| 1256 | virtual bool canCopyGluedNodeDuringSchedule(SDNode *N) const { return false; } | ||
| 1257 | |||
| 1258 | protected: | ||
| 1259 |   /// Target-dependent implementation for foldMemoryOperand. | ||
| 1260 |   /// Target-independent code in foldMemoryOperand will | ||
| 1261 |   /// take care of adding a MachineMemOperand to the newly created instruction. | ||
| 1262 |   /// The instruction and any auxiliary instructions necessary will be inserted | ||
| 1263 |   /// at InsertPt. | ||
| 1264 | virtual MachineInstr * | ||
| 1265 | foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, | ||
| 1266 | ArrayRef<unsigned> Ops, | ||
| 1267 | MachineBasicBlock::iterator InsertPt, int FrameIndex, | ||
| 1268 | LiveIntervals *LIS = nullptr, | ||
| 1269 | VirtRegMap *VRM = nullptr) const { | ||
| 1270 | return nullptr; | ||
| 1271 |   } | ||
| 1272 | |||
| 1273 |   /// Target-dependent implementation for foldMemoryOperand. | ||
| 1274 |   /// Target-independent code in foldMemoryOperand will | ||
| 1275 |   /// take care of adding a MachineMemOperand to the newly created instruction. | ||
| 1276 |   /// The instruction and any auxiliary instructions necessary will be inserted | ||
| 1277 |   /// at InsertPt. | ||
| 1278 | virtual MachineInstr *foldMemoryOperandImpl( | ||
| 1279 | MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops, | ||
| 1280 | MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI, | ||
| 1281 | LiveIntervals *LIS = nullptr) const { | ||
| 1282 | return nullptr; | ||
| 1283 |   } | ||
| 1284 | |||
| 1285 |   /// Target-dependent implementation of getRegSequenceInputs. | ||
| 1286 |   /// | ||
| 1287 |   /// \returns true if it is possible to build the equivalent | ||
| 1288 |   /// REG_SEQUENCE inputs with the pair \p MI, \p DefIdx. False otherwise. | ||
| 1289 |   /// | ||
| 1290 |   /// \pre MI.isRegSequenceLike(). | ||
| 1291 |   /// | ||
| 1292 |   /// \see TargetInstrInfo::getRegSequenceInputs. | ||
| 1293 | virtual bool getRegSequenceLikeInputs( | ||
| 1294 | const MachineInstr &MI, unsigned DefIdx, | ||
| 1295 | SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const { | ||
| 1296 | return false; | ||
| 1297 |   } | ||
| 1298 | |||
| 1299 |   /// Target-dependent implementation of getExtractSubregInputs. | ||
| 1300 |   /// | ||
| 1301 |   /// \returns true if it is possible to build the equivalent | ||
| 1302 |   /// EXTRACT_SUBREG inputs with the pair \p MI, \p DefIdx. False otherwise. | ||
| 1303 |   /// | ||
| 1304 |   /// \pre MI.isExtractSubregLike(). | ||
| 1305 |   /// | ||
| 1306 |   /// \see TargetInstrInfo::getExtractSubregInputs. | ||
| 1307 | virtual bool getExtractSubregLikeInputs(const MachineInstr &MI, | ||
| 1308 |                                           unsigned DefIdx, | ||
| 1309 | RegSubRegPairAndIdx &InputReg) const { | ||
| 1310 | return false; | ||
| 1311 |   } | ||
| 1312 | |||
| 1313 |   /// Target-dependent implementation of getInsertSubregInputs. | ||
| 1314 |   /// | ||
| 1315 |   /// \returns true if it is possible to build the equivalent | ||
| 1316 |   /// INSERT_SUBREG inputs with the pair \p MI, \p DefIdx. False otherwise. | ||
| 1317 |   /// | ||
| 1318 |   /// \pre MI.isInsertSubregLike(). | ||
| 1319 |   /// | ||
| 1320 |   /// \see TargetInstrInfo::getInsertSubregInputs. | ||
| 1321 | virtual bool | ||
| 1322 | getInsertSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, | ||
| 1323 |                             RegSubRegPair &BaseReg, | ||
| 1324 | RegSubRegPairAndIdx &InsertedReg) const { | ||
| 1325 | return false; | ||
| 1326 |   } | ||
| 1327 | |||
| 1328 | public: | ||
| 1329 |   /// unfoldMemoryOperand - Separate a single instruction which folded a load or | ||
| 1330 |   /// a store or a load and a store into two or more instruction. If this is | ||
| 1331 |   /// possible, returns true as well as the new instructions by reference. | ||
| 1332 | virtual bool | ||
| 1333 | unfoldMemoryOperand(MachineFunction &MF, MachineInstr &MI, unsigned Reg, | ||
| 1334 | bool UnfoldLoad, bool UnfoldStore, | ||
| 1335 | SmallVectorImpl<MachineInstr *> &NewMIs) const { | ||
| 1336 | return false; | ||
| 1337 |   } | ||
| 1338 | |||
| 1339 | virtual bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N, | ||
| 1340 | SmallVectorImpl<SDNode *> &NewNodes) const { | ||
| 1341 | return false; | ||
| 1342 |   } | ||
| 1343 | |||
| 1344 |   /// Returns the opcode of the would be new | ||
| 1345 |   /// instruction after load / store are unfolded from an instruction of the | ||
| 1346 |   /// specified opcode. It returns zero if the specified unfolding is not | ||
| 1347 |   /// possible. If LoadRegIndex is non-null, it is filled in with the operand | ||
| 1348 |   /// index of the operand which will hold the register holding the loaded | ||
| 1349 |   /// value. | ||
| 1350 | virtual unsigned | ||
| 1351 | getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore, | ||
| 1352 | unsigned *LoadRegIndex = nullptr) const { | ||
| 1353 | return 0; | ||
| 1354 |   } | ||
| 1355 | |||
| 1356 |   /// This is used by the pre-regalloc scheduler to determine if two loads are | ||
| 1357 |   /// loading from the same base address. It should only return true if the base | ||
| 1358 |   /// pointers are the same and the only differences between the two addresses | ||
| 1359 |   /// are the offset. It also returns the offsets by reference. | ||
| 1360 | virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, | ||
| 1361 | int64_t &Offset1, | ||
| 1362 | int64_t &Offset2) const { | ||
| 1363 | return false; | ||
| 1364 |   } | ||
| 1365 | |||
| 1366 |   /// This is a used by the pre-regalloc scheduler to determine (in conjunction | ||
| 1367 |   /// with areLoadsFromSameBasePtr) if two loads should be scheduled together. | ||
| 1368 |   /// On some targets if two loads are loading from | ||
| 1369 |   /// addresses in the same cache line, it's better if they are scheduled | ||
| 1370 |   /// together. This function takes two integers that represent the load offsets | ||
| 1371 |   /// from the common base address. It returns true if it decides it's desirable | ||
| 1372 |   /// to schedule the two loads together. "NumLoads" is the number of loads that | ||
| 1373 |   /// have already been scheduled after Load1. | ||
| 1374 | virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, | ||
| 1375 | int64_t Offset1, int64_t Offset2, | ||
| 1376 | unsigned NumLoads) const { | ||
| 1377 | return false; | ||
| 1378 |   } | ||
| 1379 | |||
| 1380 |   /// Get the base operand and byte offset of an instruction that reads/writes | ||
| 1381 |   /// memory. This is a convenience function for callers that are only prepared | ||
| 1382 |   /// to handle a single base operand. | ||
| 1383 | bool getMemOperandWithOffset(const MachineInstr &MI, | ||
| 1384 | const MachineOperand *&BaseOp, int64_t &Offset, | ||
| 1385 | bool &OffsetIsScalable, | ||
| 1386 | const TargetRegisterInfo *TRI) const; | ||
| 1387 | |||
| 1388 |   /// Get zero or more base operands and the byte offset of an instruction that | ||
| 1389 |   /// reads/writes memory. Note that there may be zero base operands if the | ||
| 1390 |   /// instruction accesses a constant address. | ||
| 1391 |   /// It returns false if MI does not read/write memory. | ||
| 1392 |   /// It returns false if base operands and offset could not be determined. | ||
| 1393 |   /// It is not guaranteed to always recognize base operands and offsets in all | ||
| 1394 |   /// cases. | ||
| 1395 | virtual bool getMemOperandsWithOffsetWidth( | ||
| 1396 | const MachineInstr &MI, SmallVectorImpl<const MachineOperand *> &BaseOps, | ||
| 1397 | int64_t &Offset, bool &OffsetIsScalable, unsigned &Width, | ||
| 1398 | const TargetRegisterInfo *TRI) const { | ||
| 1399 | return false; | ||
| 1400 |   } | ||
| 1401 | |||
| 1402 |   /// Return true if the instruction contains a base register and offset. If | ||
| 1403 |   /// true, the function also sets the operand position in the instruction | ||
| 1404 |   /// for the base register and offset. | ||
| 1405 | virtual bool getBaseAndOffsetPosition(const MachineInstr &MI, | ||
| 1406 | unsigned &BasePos, | ||
| 1407 | unsigned &OffsetPos) const { | ||
| 1408 | return false; | ||
| 1409 |   } | ||
| 1410 | |||
| 1411 |   /// Target dependent implementation to get the values constituting the address | ||
| 1412 |   /// MachineInstr that is accessing memory. These values are returned as a | ||
| 1413 |   /// struct ExtAddrMode which contains all relevant information to make up the | ||
| 1414 |   /// address. | ||
| 1415 | virtual std::optional<ExtAddrMode> | ||
| 1416 | getAddrModeFromMemoryOp(const MachineInstr &MemI, | ||
| 1417 | const TargetRegisterInfo *TRI) const { | ||
| 1418 | return std::nullopt; | ||
| 1419 |   } | ||
| 1420 | |||
| 1421 |   /// Returns true if MI's Def is NullValueReg, and the MI | ||
| 1422 |   /// does not change the Zero value. i.e. cases such as rax = shr rax, X where | ||
| 1423 |   /// NullValueReg = rax. Note that if the NullValueReg is non-zero, this | ||
| 1424 |   /// function can return true even if becomes zero. Specifically cases such as | ||
| 1425 |   /// NullValueReg = shl NullValueReg, 63. | ||
| 1426 | virtual bool preservesZeroValueInReg(const MachineInstr *MI, | ||
| 1427 |                                        const Register NullValueReg, | ||
| 1428 | const TargetRegisterInfo *TRI) const { | ||
| 1429 | return false; | ||
| 1430 |   } | ||
| 1431 | |||
| 1432 |   /// If the instruction is an increment of a constant value, return the amount. | ||
| 1433 | virtual bool getIncrementValue(const MachineInstr &MI, int &Value) const { | ||
| 1434 | return false; | ||
| 1435 |   } | ||
| 1436 | |||
| 1437 |   /// Returns true if the two given memory operations should be scheduled | ||
| 1438 |   /// adjacent. Note that you have to add: | ||
| 1439 |   ///   DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI)); | ||
| 1440 |   /// or | ||
| 1441 |   ///   DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI)); | ||
| 1442 |   /// to TargetPassConfig::createMachineScheduler() to have an effect. | ||
| 1443 |   /// | ||
| 1444 |   /// \p BaseOps1 and \p BaseOps2 are memory operands of two memory operations. | ||
| 1445 |   /// \p NumLoads is the number of loads that will be in the cluster if this | ||
| 1446 |   /// hook returns true. | ||
| 1447 |   /// \p NumBytes is the number of bytes that will be loaded from all the | ||
| 1448 |   /// clustered loads if this hook returns true. | ||
| 1449 | virtual bool shouldClusterMemOps(ArrayRef<const MachineOperand *> BaseOps1, | ||
| 1450 | ArrayRef<const MachineOperand *> BaseOps2, | ||
| 1451 | unsigned NumLoads, unsigned NumBytes) const { | ||
| 1452 | llvm_unreachable("target did not implement shouldClusterMemOps()"); | ||
| 1453 |   } | ||
| 1454 | |||
| 1455 |   /// Reverses the branch condition of the specified condition list, | ||
| 1456 |   /// returning false on success and true if it cannot be reversed. | ||
| 1457 | virtual bool | ||
| 1458 | reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const { | ||
| 1459 | return true; | ||
| 1460 |   } | ||
| 1461 | |||
| 1462 |   /// Insert a noop into the instruction stream at the specified point. | ||
| 1463 | virtual void insertNoop(MachineBasicBlock &MBB, | ||
| 1464 | MachineBasicBlock::iterator MI) const; | ||
| 1465 | |||
| 1466 |   /// Insert noops into the instruction stream at the specified point. | ||
| 1467 | virtual void insertNoops(MachineBasicBlock &MBB, | ||
| 1468 | MachineBasicBlock::iterator MI, | ||
| 1469 | unsigned Quantity) const; | ||
| 1470 | |||
| 1471 |   /// Return the noop instruction to use for a noop. | ||
| 1472 | virtual MCInst getNop() const; | ||
| 1473 | |||
| 1474 |   /// Return true for post-incremented instructions. | ||
| 1475 | virtual bool isPostIncrement(const MachineInstr &MI) const { return false; } | ||
| 1476 | |||
| 1477 |   /// Returns true if the instruction is already predicated. | ||
| 1478 | virtual bool isPredicated(const MachineInstr &MI) const { return false; } | ||
| 1479 | |||
| 1480 |   /// Assumes the instruction is already predicated and returns true if the | ||
| 1481 |   /// instruction can be predicated again. | ||
| 1482 | virtual bool canPredicatePredicatedInstr(const MachineInstr &MI) const { | ||
| 1483 | assert(isPredicated(MI) && "Instruction is not predicated"); | ||
| 1484 | return false; | ||
| 1485 |   } | ||
| 1486 | |||
| 1487 |   // Returns a MIRPrinter comment for this machine operand. | ||
| 1488 | virtual std::string | ||
| 1489 | createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, | ||
| 1490 | unsigned OpIdx, const TargetRegisterInfo *TRI) const; | ||
| 1491 | |||
| 1492 |   /// Returns true if the instruction is a | ||
| 1493 |   /// terminator instruction that has not been predicated. | ||
| 1494 | bool isUnpredicatedTerminator(const MachineInstr &MI) const; | ||
| 1495 | |||
| 1496 |   /// Returns true if MI is an unconditional tail call. | ||
| 1497 | virtual bool isUnconditionalTailCall(const MachineInstr &MI) const { | ||
| 1498 | return false; | ||
| 1499 |   } | ||
| 1500 | |||
| 1501 |   /// Returns true if the tail call can be made conditional on BranchCond. | ||
| 1502 | virtual bool canMakeTailCallConditional(SmallVectorImpl<MachineOperand> &Cond, | ||
| 1503 | const MachineInstr &TailCall) const { | ||
| 1504 | return false; | ||
| 1505 |   } | ||
| 1506 | |||
| 1507 |   /// Replace the conditional branch in MBB with a conditional tail call. | ||
| 1508 | virtual void replaceBranchWithTailCall(MachineBasicBlock &MBB, | ||
| 1509 | SmallVectorImpl<MachineOperand> &Cond, | ||
| 1510 | const MachineInstr &TailCall) const { | ||
| 1511 | llvm_unreachable("Target didn't implement replaceBranchWithTailCall!"); | ||
| 1512 |   } | ||
| 1513 | |||
| 1514 |   /// Convert the instruction into a predicated instruction. | ||
| 1515 |   /// It returns true if the operation was successful. | ||
| 1516 | virtual bool PredicateInstruction(MachineInstr &MI, | ||
| 1517 | ArrayRef<MachineOperand> Pred) const; | ||
| 1518 | |||
| 1519 |   /// Returns true if the first specified predicate | ||
| 1520 |   /// subsumes the second, e.g. GE subsumes GT. | ||
| 1521 | virtual bool SubsumesPredicate(ArrayRef<MachineOperand> Pred1, | ||
| 1522 | ArrayRef<MachineOperand> Pred2) const { | ||
| 1523 | return false; | ||
| 1524 |   } | ||
| 1525 | |||
| 1526 |   /// If the specified instruction defines any predicate | ||
| 1527 |   /// or condition code register(s) used for predication, returns true as well | ||
| 1528 |   /// as the definition predicate(s) by reference. | ||
| 1529 |   /// SkipDead should be set to false at any point that dead | ||
| 1530 |   /// predicate instructions should be considered as being defined. | ||
| 1531 |   /// A dead predicate instruction is one that is guaranteed to be removed | ||
| 1532 |   /// after a call to PredicateInstruction. | ||
| 1533 | virtual bool ClobbersPredicate(MachineInstr &MI, | ||
| 1534 | std::vector<MachineOperand> &Pred, | ||
| 1535 | bool SkipDead) const { | ||
| 1536 | return false; | ||
| 1537 |   } | ||
| 1538 | |||
| 1539 |   /// Return true if the specified instruction can be predicated. | ||
| 1540 |   /// By default, this returns true for every instruction with a | ||
| 1541 |   /// PredicateOperand. | ||
| 1542 | virtual bool isPredicable(const MachineInstr &MI) const { | ||
| 1543 | return MI.getDesc().isPredicable(); | ||
| 1544 |   } | ||
| 1545 | |||
| 1546 |   /// Return true if it's safe to move a machine | ||
| 1547 |   /// instruction that defines the specified register class. | ||
| 1548 | virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const { | ||
| 1549 | return true; | ||
| 1550 |   } | ||
| 1551 | |||
| 1552 |   /// Test if the given instruction should be considered a scheduling boundary. | ||
| 1553 |   /// This primarily includes labels and terminators. | ||
| 1554 | virtual bool isSchedulingBoundary(const MachineInstr &MI, | ||
| 1555 | const MachineBasicBlock *MBB, | ||
| 1556 | const MachineFunction &MF) const; | ||
| 1557 | |||
| 1558 |   /// Measure the specified inline asm to determine an approximation of its | ||
| 1559 |   /// length. | ||
| 1560 | virtual unsigned getInlineAsmLength( | ||
| 1561 | const char *Str, const MCAsmInfo &MAI, | ||
| 1562 | const TargetSubtargetInfo *STI = nullptr) const; | ||
| 1563 | |||
| 1564 |   /// Allocate and return a hazard recognizer to use for this target when | ||
| 1565 |   /// scheduling the machine instructions before register allocation. | ||
| 1566 | virtual ScheduleHazardRecognizer * | ||
| 1567 | CreateTargetHazardRecognizer(const TargetSubtargetInfo *STI, | ||
| 1568 | const ScheduleDAG *DAG) const; | ||
| 1569 | |||
| 1570 |   /// Allocate and return a hazard recognizer to use for this target when | ||
| 1571 |   /// scheduling the machine instructions before register allocation. | ||
| 1572 | virtual ScheduleHazardRecognizer * | ||
| 1573 | CreateTargetMIHazardRecognizer(const InstrItineraryData *, | ||
| 1574 | const ScheduleDAGMI *DAG) const; | ||
| 1575 | |||
| 1576 |   /// Allocate and return a hazard recognizer to use for this target when | ||
| 1577 |   /// scheduling the machine instructions after register allocation. | ||
| 1578 | virtual ScheduleHazardRecognizer * | ||
| 1579 | CreateTargetPostRAHazardRecognizer(const InstrItineraryData *, | ||
| 1580 | const ScheduleDAG *DAG) const; | ||
| 1581 | |||
| 1582 |   /// Allocate and return a hazard recognizer to use for by non-scheduling | ||
| 1583 |   /// passes. | ||
| 1584 | virtual ScheduleHazardRecognizer * | ||
| 1585 | CreateTargetPostRAHazardRecognizer(const MachineFunction &MF) const { | ||
| 1586 | return nullptr; | ||
| 1587 |   } | ||
| 1588 | |||
| 1589 |   /// Provide a global flag for disabling the PreRA hazard recognizer that | ||
| 1590 |   /// targets may choose to honor. | ||
| 1591 | bool usePreRAHazardRecognizer() const; | ||
| 1592 | |||
| 1593 |   /// For a comparison instruction, return the source registers | ||
| 1594 |   /// in SrcReg and SrcReg2 if having two register operands, and the value it | ||
| 1595 |   /// compares against in CmpValue. Return true if the comparison instruction | ||
| 1596 |   /// can be analyzed. | ||
| 1597 | virtual bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, | ||
| 1598 | Register &SrcReg2, int64_t &Mask, | ||
| 1599 | int64_t &Value) const { | ||
| 1600 | return false; | ||
| 1601 |   } | ||
| 1602 | |||
| 1603 |   /// See if the comparison instruction can be converted | ||
| 1604 |   /// into something more efficient. E.g., on ARM most instructions can set the | ||
| 1605 |   /// flags register, obviating the need for a separate CMP. | ||
| 1606 | virtual bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg, | ||
| 1607 |                                     Register SrcReg2, int64_t Mask, | ||
| 1608 |                                     int64_t Value, | ||
| 1609 | const MachineRegisterInfo *MRI) const { | ||
| 1610 | return false; | ||
| 1611 |   } | ||
| 1612 | virtual bool optimizeCondBranch(MachineInstr &MI) const { return false; } | ||
| 1613 | |||
| 1614 |   /// Try to remove the load by folding it to a register operand at the use. | ||
| 1615 |   /// We fold the load instructions if and only if the | ||
| 1616 |   /// def and use are in the same BB. We only look at one load and see | ||
| 1617 |   /// whether it can be folded into MI. FoldAsLoadDefReg is the virtual register | ||
| 1618 |   /// defined by the load we are trying to fold. DefMI returns the machine | ||
| 1619 |   /// instruction that defines FoldAsLoadDefReg, and the function returns | ||
| 1620 |   /// the machine instruction generated due to folding. | ||
| 1621 | virtual MachineInstr *optimizeLoadInstr(MachineInstr &MI, | ||
| 1622 | const MachineRegisterInfo *MRI, | ||
| 1623 |                                           Register &FoldAsLoadDefReg, | ||
| 1624 | MachineInstr *&DefMI) const { | ||
| 1625 | return nullptr; | ||
| 1626 |   } | ||
| 1627 | |||
| 1628 |   /// 'Reg' is known to be defined by a move immediate instruction, | ||
| 1629 |   /// try to fold the immediate into the use instruction. | ||
| 1630 |   /// If MRI->hasOneNonDBGUse(Reg) is true, and this function returns true, | ||
| 1631 |   /// then the caller may assume that DefMI has been erased from its parent | ||
| 1632 |   /// block. The caller may assume that it will not be erased by this | ||
| 1633 |   /// function otherwise. | ||
| 1634 | virtual bool FoldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, | ||
| 1635 | Register Reg, MachineRegisterInfo *MRI) const { | ||
| 1636 | return false; | ||
| 1637 |   } | ||
| 1638 | |||
| 1639 |   /// Return the number of u-operations the given machine | ||
| 1640 |   /// instruction will be decoded to on the target cpu. The itinerary's | ||
| 1641 |   /// IssueWidth is the number of microops that can be dispatched each | ||
| 1642 |   /// cycle. An instruction with zero microops takes no dispatch resources. | ||
| 1643 | virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, | ||
| 1644 | const MachineInstr &MI) const; | ||
| 1645 | |||
| 1646 |   /// Return true for pseudo instructions that don't consume any | ||
| 1647 |   /// machine resources in their current form. These are common cases that the | ||
| 1648 |   /// scheduler should consider free, rather than conservatively handling them | ||
| 1649 |   /// as instructions with no itinerary. | ||
| 1650 | bool isZeroCost(unsigned Opcode) const { | ||
| 1651 | return Opcode <= TargetOpcode::COPY; | ||
| 1652 |   } | ||
| 1653 | |||
| 1654 | virtual int getOperandLatency(const InstrItineraryData *ItinData, | ||
| 1655 | SDNode *DefNode, unsigned DefIdx, | ||
| 1656 | SDNode *UseNode, unsigned UseIdx) const; | ||
| 1657 | |||
| 1658 |   /// Compute and return the use operand latency of a given pair of def and use. | ||
| 1659 |   /// In most cases, the static scheduling itinerary was enough to determine the | ||
| 1660 |   /// operand latency. But it may not be possible for instructions with variable | ||
| 1661 |   /// number of defs / uses. | ||
| 1662 |   /// | ||
| 1663 |   /// This is a raw interface to the itinerary that may be directly overridden | ||
| 1664 |   /// by a target. Use computeOperandLatency to get the best estimate of | ||
| 1665 |   /// latency. | ||
| 1666 | virtual int getOperandLatency(const InstrItineraryData *ItinData, | ||
| 1667 | const MachineInstr &DefMI, unsigned DefIdx, | ||
| 1668 | const MachineInstr &UseMI, | ||
| 1669 | unsigned UseIdx) const; | ||
| 1670 | |||
| 1671 |   /// Compute the instruction latency of a given instruction. | ||
| 1672 |   /// If the instruction has higher cost when predicated, it's returned via | ||
| 1673 |   /// PredCost. | ||
| 1674 | virtual unsigned getInstrLatency(const InstrItineraryData *ItinData, | ||
| 1675 | const MachineInstr &MI, | ||
| 1676 | unsigned *PredCost = nullptr) const; | ||
| 1677 | |||
| 1678 | virtual unsigned getPredicationCost(const MachineInstr &MI) const; | ||
| 1679 | |||
| 1680 | virtual int getInstrLatency(const InstrItineraryData *ItinData, | ||
| 1681 | SDNode *Node) const; | ||
| 1682 | |||
| 1683 |   /// Return the default expected latency for a def based on its opcode. | ||
| 1684 | unsigned defaultDefLatency(const MCSchedModel &SchedModel, | ||
| 1685 | const MachineInstr &DefMI) const; | ||
| 1686 | |||
| 1687 |   /// Return true if this opcode has high latency to its result. | ||
| 1688 | virtual bool isHighLatencyDef(int opc) const { return false; } | ||
| 1689 | |||
| 1690 |   /// Compute operand latency between a def of 'Reg' | ||
| 1691 |   /// and a use in the current loop. Return true if the target considered | ||
| 1692 |   /// it 'high'. This is used by optimization passes such as machine LICM to | ||
| 1693 |   /// determine whether it makes sense to hoist an instruction out even in a | ||
| 1694 |   /// high register pressure situation. | ||
| 1695 | virtual bool hasHighOperandLatency(const TargetSchedModel &SchedModel, | ||
| 1696 | const MachineRegisterInfo *MRI, | ||
| 1697 | const MachineInstr &DefMI, unsigned DefIdx, | ||
| 1698 | const MachineInstr &UseMI, | ||
| 1699 | unsigned UseIdx) const { | ||
| 1700 | return false; | ||
| 1701 |   } | ||
| 1702 | |||
| 1703 |   /// Compute operand latency of a def of 'Reg'. Return true | ||
| 1704 |   /// if the target considered it 'low'. | ||
| 1705 | virtual bool hasLowDefLatency(const TargetSchedModel &SchedModel, | ||
| 1706 | const MachineInstr &DefMI, | ||
| 1707 | unsigned DefIdx) const; | ||
| 1708 | |||
| 1709 |   /// Perform target-specific instruction verification. | ||
| 1710 | virtual bool verifyInstruction(const MachineInstr &MI, | ||
| 1711 | StringRef &ErrInfo) const { | ||
| 1712 | return true; | ||
| 1713 |   } | ||
| 1714 | |||
| 1715 |   /// Return the current execution domain and bit mask of | ||
| 1716 |   /// possible domains for instruction. | ||
| 1717 |   /// | ||
| 1718 |   /// Some micro-architectures have multiple execution domains, and multiple | ||
| 1719 |   /// opcodes that perform the same operation in different domains.  For | ||
| 1720 |   /// example, the x86 architecture provides the por, orps, and orpd | ||
| 1721 |   /// instructions that all do the same thing.  There is a latency penalty if a | ||
| 1722 |   /// register is written in one domain and read in another. | ||
| 1723 |   /// | ||
| 1724 |   /// This function returns a pair (domain, mask) containing the execution | ||
| 1725 |   /// domain of MI, and a bit mask of possible domains.  The setExecutionDomain | ||
| 1726 |   /// function can be used to change the opcode to one of the domains in the | ||
| 1727 |   /// bit mask.  Instructions whose execution domain can't be changed should | ||
| 1728 |   /// return a 0 mask. | ||
| 1729 |   /// | ||
| 1730 |   /// The execution domain numbers don't have any special meaning except domain | ||
| 1731 |   /// 0 is used for instructions that are not associated with any interesting | ||
| 1732 |   /// execution domain. | ||
| 1733 |   /// | ||
| 1734 | virtual std::pair<uint16_t, uint16_t> | ||
| 1735 | getExecutionDomain(const MachineInstr &MI) const { | ||
| 1736 | return std::make_pair(0, 0); | ||
| 1737 |   } | ||
| 1738 | |||
| 1739 |   /// Change the opcode of MI to execute in Domain. | ||
| 1740 |   /// | ||
| 1741 |   /// The bit (1 << Domain) must be set in the mask returned from | ||
| 1742 |   /// getExecutionDomain(MI). | ||
| 1743 | virtual void setExecutionDomain(MachineInstr &MI, unsigned Domain) const {} | ||
| 1744 | |||
| 1745 |   /// Returns the preferred minimum clearance | ||
| 1746 |   /// before an instruction with an unwanted partial register update. | ||
| 1747 |   /// | ||
| 1748 |   /// Some instructions only write part of a register, and implicitly need to | ||
| 1749 |   /// read the other parts of the register.  This may cause unwanted stalls | ||
| 1750 |   /// preventing otherwise unrelated instructions from executing in parallel in | ||
| 1751 |   /// an out-of-order CPU. | ||
| 1752 |   /// | ||
| 1753 |   /// For example, the x86 instruction cvtsi2ss writes its result to bits | ||
| 1754 |   /// [31:0] of the destination xmm register. Bits [127:32] are unaffected, so | ||
| 1755 |   /// the instruction needs to wait for the old value of the register to become | ||
| 1756 |   /// available: | ||
| 1757 |   /// | ||
| 1758 |   ///   addps %xmm1, %xmm0 | ||
| 1759 |   ///   movaps %xmm0, (%rax) | ||
| 1760 |   ///   cvtsi2ss %rbx, %xmm0 | ||
| 1761 |   /// | ||
| 1762 |   /// In the code above, the cvtsi2ss instruction needs to wait for the addps | ||
| 1763 |   /// instruction before it can issue, even though the high bits of %xmm0 | ||
| 1764 |   /// probably aren't needed. | ||
| 1765 |   /// | ||
| 1766 |   /// This hook returns the preferred clearance before MI, measured in | ||
| 1767 |   /// instructions.  Other defs of MI's operand OpNum are avoided in the last N | ||
| 1768 |   /// instructions before MI.  It should only return a positive value for | ||
| 1769 |   /// unwanted dependencies.  If the old bits of the defined register have | ||
| 1770 |   /// useful values, or if MI is determined to otherwise read the dependency, | ||
| 1771 |   /// the hook should return 0. | ||
| 1772 |   /// | ||
| 1773 |   /// The unwanted dependency may be handled by: | ||
| 1774 |   /// | ||
| 1775 |   /// 1. Allocating the same register for an MI def and use.  That makes the | ||
| 1776 |   ///    unwanted dependency identical to a required dependency. | ||
| 1777 |   /// | ||
| 1778 |   /// 2. Allocating a register for the def that has no defs in the previous N | ||
| 1779 |   ///    instructions. | ||
| 1780 |   /// | ||
| 1781 |   /// 3. Calling breakPartialRegDependency() with the same arguments.  This | ||
| 1782 |   ///    allows the target to insert a dependency breaking instruction. | ||
| 1783 |   /// | ||
| 1784 | virtual unsigned | ||
| 1785 | getPartialRegUpdateClearance(const MachineInstr &MI, unsigned OpNum, | ||
| 1786 | const TargetRegisterInfo *TRI) const { | ||
| 1787 |     // The default implementation returns 0 for no partial register dependency. | ||
| 1788 | return 0; | ||
| 1789 |   } | ||
| 1790 | |||
| 1791 |   /// Return the minimum clearance before an instruction that reads an | ||
| 1792 |   /// unused register. | ||
| 1793 |   /// | ||
| 1794 |   /// For example, AVX instructions may copy part of a register operand into | ||
| 1795 |   /// the unused high bits of the destination register. | ||
| 1796 |   /// | ||
| 1797 |   /// vcvtsi2sdq %rax, undef %xmm0, %xmm14 | ||
| 1798 |   /// | ||
| 1799 |   /// In the code above, vcvtsi2sdq copies %xmm0[127:64] into %xmm14 creating a | ||
| 1800 |   /// false dependence on any previous write to %xmm0. | ||
| 1801 |   /// | ||
| 1802 |   /// This hook works similarly to getPartialRegUpdateClearance, except that it | ||
| 1803 |   /// does not take an operand index. Instead sets \p OpNum to the index of the | ||
| 1804 |   /// unused register. | ||
| 1805 | virtual unsigned getUndefRegClearance(const MachineInstr &MI, unsigned OpNum, | ||
| 1806 | const TargetRegisterInfo *TRI) const { | ||
| 1807 |     // The default implementation returns 0 for no undef register dependency. | ||
| 1808 | return 0; | ||
| 1809 |   } | ||
| 1810 | |||
| 1811 |   /// Insert a dependency-breaking instruction | ||
| 1812 |   /// before MI to eliminate an unwanted dependency on OpNum. | ||
| 1813 |   /// | ||
| 1814 |   /// If it wasn't possible to avoid a def in the last N instructions before MI | ||
| 1815 |   /// (see getPartialRegUpdateClearance), this hook will be called to break the | ||
| 1816 |   /// unwanted dependency. | ||
| 1817 |   /// | ||
| 1818 |   /// On x86, an xorps instruction can be used as a dependency breaker: | ||
| 1819 |   /// | ||
| 1820 |   ///   addps %xmm1, %xmm0 | ||
| 1821 |   ///   movaps %xmm0, (%rax) | ||
| 1822 |   ///   xorps %xmm0, %xmm0 | ||
| 1823 |   ///   cvtsi2ss %rbx, %xmm0 | ||
| 1824 |   /// | ||
| 1825 |   /// An <imp-kill> operand should be added to MI if an instruction was | ||
| 1826 |   /// inserted.  This ties the instructions together in the post-ra scheduler. | ||
| 1827 |   /// | ||
| 1828 | virtual void breakPartialRegDependency(MachineInstr &MI, unsigned OpNum, | ||
| 1829 | const TargetRegisterInfo *TRI) const {} | ||
| 1830 | |||
| 1831 |   /// Create machine specific model for scheduling. | ||
| 1832 | virtual DFAPacketizer * | ||
| 1833 | CreateTargetScheduleState(const TargetSubtargetInfo &) const { | ||
| 1834 | return nullptr; | ||
| 1835 |   } | ||
| 1836 | |||
| 1837 |   /// Sometimes, it is possible for the target | ||
| 1838 |   /// to tell, even without aliasing information, that two MIs access different | ||
| 1839 |   /// memory addresses. This function returns true if two MIs access different | ||
| 1840 |   /// memory addresses and false otherwise. | ||
| 1841 |   /// | ||
| 1842 |   /// Assumes any physical registers used to compute addresses have the same | ||
| 1843 |   /// value for both instructions. (This is the most useful assumption for | ||
| 1844 |   /// post-RA scheduling.) | ||
| 1845 |   /// | ||
| 1846 |   /// See also MachineInstr::mayAlias, which is implemented on top of this | ||
| 1847 |   /// function. | ||
| 1848 | virtual bool | ||
| 1849 | areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, | ||
| 1850 | const MachineInstr &MIb) const { | ||
| 1851 | assert(MIa.mayLoadOrStore() && | ||
| 1852 | "MIa must load from or modify a memory location"); | ||
| 1853 | assert(MIb.mayLoadOrStore() && | ||
| 1854 | "MIb must load from or modify a memory location"); | ||
| 1855 | return false; | ||
| 1856 |   } | ||
| 1857 | |||
| 1858 |   /// Return the value to use for the MachineCSE's LookAheadLimit, | ||
| 1859 |   /// which is a heuristic used for CSE'ing phys reg defs. | ||
| 1860 | virtual unsigned getMachineCSELookAheadLimit() const { | ||
| 1861 |     // The default lookahead is small to prevent unprofitable quadratic | ||
| 1862 |     // behavior. | ||
| 1863 | return 5; | ||
| 1864 |   } | ||
| 1865 | |||
| 1866 |   /// Return the maximal number of alias checks on memory operands. For | ||
| 1867 |   /// instructions with more than one memory operands, the alias check on a | ||
| 1868 |   /// single MachineInstr pair has quadratic overhead and results in | ||
| 1869 |   /// unacceptable performance in the worst case. The limit here is to clamp | ||
| 1870 |   /// that maximal checks performed. Usually, that's the product of memory | ||
| 1871 |   /// operand numbers from that pair of MachineInstr to be checked. For | ||
| 1872 |   /// instance, with two MachineInstrs with 4 and 5 memory operands | ||
| 1873 |   /// correspondingly, a total of 20 checks are required. With this limit set to | ||
| 1874 |   /// 16, their alias check is skipped. We choose to limit the product instead | ||
| 1875 |   /// of the individual instruction as targets may have special MachineInstrs | ||
| 1876 |   /// with a considerably high number of memory operands, such as `ldm` in ARM. | ||
| 1877 |   /// Setting this limit per MachineInstr would result in either too high | ||
| 1878 |   /// overhead or too rigid restriction. | ||
| 1879 | virtual unsigned getMemOperandAACheckLimit() const { return 16; } | ||
| 1880 | |||
| 1881 |   /// Return an array that contains the ids of the target indices (used for the | ||
| 1882 |   /// TargetIndex machine operand) and their names. | ||
| 1883 |   /// | ||
| 1884 |   /// MIR Serialization is able to serialize only the target indices that are | ||
| 1885 |   /// defined by this method. | ||
| 1886 | virtual ArrayRef<std::pair<int, const char *>> | ||
| 1887 | getSerializableTargetIndices() const { | ||
| 1888 | return std::nullopt; | ||
| 1889 |   } | ||
| 1890 | |||
| 1891 |   /// Decompose the machine operand's target flags into two values - the direct | ||
| 1892 |   /// target flag value and any of bit flags that are applied. | ||
| 1893 | virtual std::pair<unsigned, unsigned> | ||
| 1894 | decomposeMachineOperandsTargetFlags(unsigned /*TF*/) const { | ||
| 1895 | return std::make_pair(0u, 0u); | ||
| 1896 |   } | ||
| 1897 | |||
| 1898 |   /// Return an array that contains the direct target flag values and their | ||
| 1899 |   /// names. | ||
| 1900 |   /// | ||
| 1901 |   /// MIR Serialization is able to serialize only the target flags that are | ||
| 1902 |   /// defined by this method. | ||
| 1903 | virtual ArrayRef<std::pair<unsigned, const char *>> | ||
| 1904 | getSerializableDirectMachineOperandTargetFlags() const { | ||
| 1905 | return std::nullopt; | ||
| 1906 |   } | ||
| 1907 | |||
| 1908 |   /// Return an array that contains the bitmask target flag values and their | ||
| 1909 |   /// names. | ||
| 1910 |   /// | ||
| 1911 |   /// MIR Serialization is able to serialize only the target flags that are | ||
| 1912 |   /// defined by this method. | ||
| 1913 | virtual ArrayRef<std::pair<unsigned, const char *>> | ||
| 1914 | getSerializableBitmaskMachineOperandTargetFlags() const { | ||
| 1915 | return std::nullopt; | ||
| 1916 |   } | ||
| 1917 | |||
| 1918 |   /// Return an array that contains the MMO target flag values and their | ||
| 1919 |   /// names. | ||
| 1920 |   /// | ||
| 1921 |   /// MIR Serialization is able to serialize only the MMO target flags that are | ||
| 1922 |   /// defined by this method. | ||
| 1923 | virtual ArrayRef<std::pair<MachineMemOperand::Flags, const char *>> | ||
| 1924 | getSerializableMachineMemOperandTargetFlags() const { | ||
| 1925 | return std::nullopt; | ||
| 1926 |   } | ||
| 1927 | |||
| 1928 |   /// Determines whether \p Inst is a tail call instruction. Override this | ||
| 1929 |   /// method on targets that do not properly set MCID::Return and MCID::Call on | ||
| 1930 |   /// tail call instructions." | ||
| 1931 | virtual bool isTailCall(const MachineInstr &Inst) const { | ||
| 1932 | return Inst.isReturn() && Inst.isCall(); | ||
| 1933 |   } | ||
| 1934 | |||
| 1935 |   /// True if the instruction is bound to the top of its basic block and no | ||
| 1936 |   /// other instructions shall be inserted before it. This can be implemented | ||
| 1937 |   /// to prevent register allocator to insert spills before such instructions. | ||
| 1938 | virtual bool isBasicBlockPrologue(const MachineInstr &MI) const { | ||
| 1939 | return false; | ||
| 1940 |   } | ||
| 1941 | |||
| 1942 |   /// During PHI eleimination lets target to make necessary checks and | ||
| 1943 |   /// insert the copy to the PHI destination register in a target specific | ||
| 1944 |   /// manner. | ||
| 1945 | virtual MachineInstr *createPHIDestinationCopy( | ||
| 1946 | MachineBasicBlock &MBB, MachineBasicBlock::iterator InsPt, | ||
| 1947 | const DebugLoc &DL, Register Src, Register Dst) const { | ||
| 1948 | return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst) | ||
| 1949 | .addReg(Src); | ||
| 1950 |   } | ||
| 1951 | |||
| 1952 |   /// During PHI eleimination lets target to make necessary checks and | ||
| 1953 |   /// insert the copy to the PHI destination register in a target specific | ||
| 1954 |   /// manner. | ||
| 1955 | virtual MachineInstr *createPHISourceCopy(MachineBasicBlock &MBB, | ||
| 1956 | MachineBasicBlock::iterator InsPt, | ||
| 1957 | const DebugLoc &DL, Register Src, | ||
| 1958 |                                             unsigned SrcSubReg, | ||
| 1959 | Register Dst) const { | ||
| 1960 | return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst) | ||
| 1961 | .addReg(Src, 0, SrcSubReg); | ||
| 1962 |   } | ||
| 1963 | |||
| 1964 |   /// Returns a \p outliner::OutlinedFunction struct containing target-specific | ||
| 1965 |   /// information for a set of outlining candidates. | ||
| 1966 | virtual outliner::OutlinedFunction getOutliningCandidateInfo( | ||
| 1967 | std::vector<outliner::Candidate> &RepeatedSequenceLocs) const { | ||
| 1968 |     llvm_unreachable( | ||
| 1969 | "Target didn't implement TargetInstrInfo::getOutliningCandidateInfo!"); | ||
| 1970 |   } | ||
| 1971 | |||
| 1972 |   /// Optional target hook to create the LLVM IR attributes for the outlined | ||
| 1973 |   /// function. If overridden, the overriding function must call the default | ||
| 1974 |   /// implementation. | ||
| 1975 | virtual void mergeOutliningCandidateAttributes( | ||
| 1976 | Function &F, std::vector<outliner::Candidate> &Candidates) const; | ||
| 1977 | |||
| 1978 |   /// Returns how or if \p MI should be outlined. | ||
| 1979 | virtual outliner::InstrType | ||
| 1980 | getOutliningType(MachineBasicBlock::iterator &MIT, unsigned Flags) const { | ||
| 1981 |     llvm_unreachable( | ||
| 1982 | "Target didn't implement TargetInstrInfo::getOutliningType!"); | ||
| 1983 |   } | ||
| 1984 | |||
| 1985 |   /// Optional target hook that returns true if \p MBB is safe to outline from, | ||
| 1986 |   /// and returns any target-specific information in \p Flags. | ||
| 1987 | virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB, | ||
| 1988 | unsigned &Flags) const; | ||
| 1989 | |||
| 1990 |   /// Insert a custom frame for outlined functions. | ||
| 1991 | virtual void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF, | ||
| 1992 | const outliner::OutlinedFunction &OF) const { | ||
| 1993 |     llvm_unreachable( | ||
| 1994 | "Target didn't implement TargetInstrInfo::buildOutlinedFrame!"); | ||
| 1995 |   } | ||
| 1996 | |||
| 1997 |   /// Insert a call to an outlined function into the program. | ||
| 1998 |   /// Returns an iterator to the spot where we inserted the call. This must be | ||
| 1999 |   /// implemented by the target. | ||
| 2000 | virtual MachineBasicBlock::iterator | ||
| 2001 | insertOutlinedCall(Module &M, MachineBasicBlock &MBB, | ||
| 2002 | MachineBasicBlock::iterator &It, MachineFunction &MF, | ||
| 2003 | outliner::Candidate &C) const { | ||
| 2004 |     llvm_unreachable( | ||
| 2005 | "Target didn't implement TargetInstrInfo::insertOutlinedCall!"); | ||
| 2006 |   } | ||
| 2007 | |||
| 2008 |   /// Return true if the function can safely be outlined from. | ||
| 2009 |   /// A function \p MF is considered safe for outlining if an outlined function | ||
| 2010 |   /// produced from instructions in F will produce a program which produces the | ||
| 2011 |   /// same output for any set of given inputs. | ||
| 2012 | virtual bool isFunctionSafeToOutlineFrom(MachineFunction &MF, | ||
| 2013 | bool OutlineFromLinkOnceODRs) const { | ||
| 2014 | llvm_unreachable("Target didn't implement " | ||
| 2015 | "TargetInstrInfo::isFunctionSafeToOutlineFrom!"); | ||
| 2016 |   } | ||
| 2017 | |||
| 2018 |   /// Return true if the function should be outlined from by default. | ||
| 2019 | virtual bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const { | ||
| 2020 | return false; | ||
| 2021 |   } | ||
| 2022 | |||
| 2023 |   /// Produce the expression describing the \p MI loading a value into | ||
| 2024 |   /// the physical register \p Reg. This hook should only be used with | ||
| 2025 |   /// \p MIs belonging to VReg-less functions. | ||
| 2026 | virtual std::optional<ParamLoadedValue> | ||
| 2027 | describeLoadedValue(const MachineInstr &MI, Register Reg) const; | ||
| 2028 | |||
| 2029 |   /// Given the generic extension instruction \p ExtMI, returns true if this | ||
| 2030 |   /// extension is a likely candidate for being folded into an another | ||
| 2031 |   /// instruction. | ||
| 2032 | virtual bool isExtendLikelyToBeFolded(MachineInstr &ExtMI, | ||
| 2033 | MachineRegisterInfo &MRI) const { | ||
| 2034 | return false; | ||
| 2035 |   } | ||
| 2036 | |||
| 2037 |   /// Return MIR formatter to format/parse MIR operands.  Target can override | ||
| 2038 |   /// this virtual function and return target specific MIR formatter. | ||
| 2039 | virtual const MIRFormatter *getMIRFormatter() const { | ||
| 2040 | if (!Formatter.get()) | ||
| 2041 | Formatter = std::make_unique<MIRFormatter>(); | ||
| 2042 | return Formatter.get(); | ||
| 2043 |   } | ||
| 2044 | |||
| 2045 |   /// Returns the target-specific default value for tail duplication. | ||
| 2046 |   /// This value will be used if the tail-dup-placement-threshold argument is | ||
| 2047 |   /// not provided. | ||
| 2048 | virtual unsigned getTailDuplicateSize(CodeGenOpt::Level OptLevel) const { | ||
| 2049 | return OptLevel >= CodeGenOpt::Aggressive ? 4 : 2; | ||
| 2050 |   } | ||
| 2051 | |||
| 2052 |   /// Returns the callee operand from the given \p MI. | ||
| 2053 | virtual const MachineOperand &getCalleeOperand(const MachineInstr &MI) const { | ||
| 2054 | return MI.getOperand(0); | ||
| 2055 |   } | ||
| 2056 | |||
| 2057 |   /// Return the uniformity behavior of the given instruction. | ||
| 2058 |   virtual InstructionUniformity | ||
| 2059 | getInstructionUniformity(const MachineInstr &MI) const { | ||
| 2060 | return InstructionUniformity::Default; | ||
| 2061 |   } | ||
| 2062 | |||
| 2063 |   /// Returns true if the given \p MI defines a TargetIndex operand that can be | ||
| 2064 |   /// tracked by their offset, can have values, and can have debug info | ||
| 2065 |   /// associated with it. If so, sets \p Index and \p Offset of the target index | ||
| 2066 |   /// operand. | ||
| 2067 | virtual bool isExplicitTargetIndexDef(const MachineInstr &MI, int &Index, | ||
| 2068 | int64_t &Offset) const { | ||
| 2069 | return false; | ||
| 2070 |   } | ||
| 2071 | |||
| 2072 | private: | ||
| 2073 | mutable std::unique_ptr<MIRFormatter> Formatter; | ||
| 2074 | unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode; | ||
| 2075 | unsigned CatchRetOpcode; | ||
| 2076 | unsigned ReturnOpcode; | ||
| 2077 | }; | ||
| 2078 | |||
| 2079 | /// Provide DenseMapInfo for TargetInstrInfo::RegSubRegPair. | ||
| 2080 | template <> struct DenseMapInfo<TargetInstrInfo::RegSubRegPair> { | ||
| 2081 | using RegInfo = DenseMapInfo<unsigned>; | ||
| 2082 | |||
| 2083 | static inline TargetInstrInfo::RegSubRegPair getEmptyKey() { | ||
| 2084 | return TargetInstrInfo::RegSubRegPair(RegInfo::getEmptyKey(), | ||
| 2085 | RegInfo::getEmptyKey()); | ||
| 2086 |   } | ||
| 2087 | |||
| 2088 | static inline TargetInstrInfo::RegSubRegPair getTombstoneKey() { | ||
| 2089 | return TargetInstrInfo::RegSubRegPair(RegInfo::getTombstoneKey(), | ||
| 2090 | RegInfo::getTombstoneKey()); | ||
| 2091 |   } | ||
| 2092 | |||
| 2093 |   /// Reuse getHashValue implementation from | ||
| 2094 |   /// std::pair<unsigned, unsigned>. | ||
| 2095 | static unsigned getHashValue(const TargetInstrInfo::RegSubRegPair &Val) { | ||
| 2096 | std::pair<unsigned, unsigned> PairVal = std::make_pair(Val.Reg, Val.SubReg); | ||
| 2097 | return DenseMapInfo<std::pair<unsigned, unsigned>>::getHashValue(PairVal); | ||
| 2098 |   } | ||
| 2099 | |||
| 2100 | static bool isEqual(const TargetInstrInfo::RegSubRegPair &LHS, | ||
| 2101 | const TargetInstrInfo::RegSubRegPair &RHS) { | ||
| 2102 | return RegInfo::isEqual(LHS.Reg, RHS.Reg) && | ||
| 2103 | RegInfo::isEqual(LHS.SubReg, RHS.SubReg); | ||
| 2104 |   } | ||
| 2105 | }; | ||
| 2106 | |||
| 2107 | } // end namespace llvm | ||
| 2108 | |||
| 2109 | #endif // LLVM_CODEGEN_TARGETINSTRINFO_H |