diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
| commit | 044eb2f6afba375a914ac9d8024f8f5142bb912e (patch) | |
| tree | 1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /lib/Target/AMDGPU/SIInstrInfo.h | |
| parent | eb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff) | |
Notes
Diffstat (limited to 'lib/Target/AMDGPU/SIInstrInfo.h')
| -rw-r--r-- | lib/Target/AMDGPU/SIInstrInfo.h | 116 |
1 files changed, 94 insertions, 22 deletions
diff --git a/lib/Target/AMDGPU/SIInstrInfo.h b/lib/Target/AMDGPU/SIInstrInfo.h index 3dd5bc89e6c77..24ee843e6adec 100644 --- a/lib/Target/AMDGPU/SIInstrInfo.h +++ b/lib/Target/AMDGPU/SIInstrInfo.h @@ -1,4 +1,4 @@ -//===-- SIInstrInfo.h - SI Instruction Info Interface -----------*- C++ -*-===// +//===- SIInstrInfo.h - SI Instruction Info Interface ------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -12,17 +12,33 @@ // //===----------------------------------------------------------------------===// - #ifndef LLVM_LIB_TARGET_AMDGPU_SIINSTRINFO_H #define LLVM_LIB_TARGET_AMDGPU_SIINSTRINFO_H #include "AMDGPUInstrInfo.h" #include "SIDefines.h" #include "SIRegisterInfo.h" +#include "Utils/AMDGPUBaseInfo.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SetVector.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineOperand.h" +#include "llvm/MC/MCInstrDesc.h" +#include "llvm/Support/Compiler.h" +#include <cassert> +#include <cstdint> namespace llvm { +class APInt; +class MachineRegisterInfo; +class RegScavenger; +class SISubtarget; +class TargetRegisterClass; + class SIInstrInfo final : public AMDGPUInstrInfo { private: const SIRegisterInfo RI; @@ -39,11 +55,12 @@ private: EXECZ = 3 }; - typedef SmallSetVector<MachineInstr *, 32> SetVectorType; + using SetVectorType = SmallSetVector<MachineInstr *, 32>; static unsigned getBranchOpcode(BranchPredicate Cond); static BranchPredicate getBranchPredicate(unsigned Opcode); +public: unsigned buildExtractSubReg(MachineBasicBlock::iterator MI, MachineRegisterInfo &MRI, MachineOperand &SuperReg, @@ -56,15 +73,24 @@ private: const TargetRegisterClass *SuperRC, unsigned SubIdx, const TargetRegisterClass *SubRC) const; - +private: void swapOperands(MachineInstr &Inst) const; + bool moveScalarAddSub(SetVectorType &Worklist, + MachineInstr &Inst) const; + void lowerScalarAbs(SetVectorType &Worklist, MachineInstr &Inst) const; + void lowerScalarXnor(SetVectorType &Worklist, + MachineInstr &Inst) const; + void splitScalar64BitUnaryOp(SetVectorType &Worklist, MachineInstr &Inst, unsigned Opcode) const; + void splitScalar64BitAddSub(SetVectorType &Worklist, + MachineInstr &Inst) const; + void splitScalar64BitBinaryOp(SetVectorType &Worklist, MachineInstr &Inst, unsigned Opcode) const; @@ -76,9 +102,8 @@ private: MachineRegisterInfo &MRI, MachineInstr &Inst) const; - void addUsersToMoveToVALUWorklist( - unsigned Reg, MachineRegisterInfo &MRI, - SetVectorType &Worklist) const; + void addUsersToMoveToVALUWorklist(unsigned Reg, MachineRegisterInfo &MRI, + SetVectorType &Worklist) const; void addSCCDefUsersToVALUWorklist(MachineInstr &SCCDefInst, @@ -101,7 +126,6 @@ protected: unsigned OpIdx1) const override; public: - enum TargetOperandFlags { MO_MASK = 0x7, @@ -120,7 +144,7 @@ public: MO_REL32_HI = 5 }; - explicit SIInstrInfo(const SISubtarget &); + explicit SIInstrInfo(const SISubtarget &ST); const SIRegisterInfo &getRegisterInfo() const { return RI; @@ -137,7 +161,8 @@ public: int64_t &Offset, const TargetRegisterInfo *TRI) const final; - bool shouldClusterMemOps(MachineInstr &FirstLdSt, MachineInstr &SecondLdSt, + bool shouldClusterMemOps(MachineInstr &FirstLdSt, unsigned BaseReg1, + MachineInstr &SecondLdSt, unsigned BaseReg2, unsigned NumLoads) const final; void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, @@ -159,7 +184,7 @@ public: unsigned insertNE(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, - unsigned SrcReg, int Value) const; + unsigned SrcReg, int Value) const; unsigned insertEQ(MachineBasicBlock *MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, @@ -228,7 +253,6 @@ public: bool reverseBranchCondition( SmallVectorImpl<MachineOperand> &Cond) const override; - bool canInsertSelect(const MachineBasicBlock &MBB, ArrayRef<MachineOperand> Cond, unsigned TrueReg, unsigned FalseReg, @@ -245,6 +269,9 @@ public: unsigned DstReg, ArrayRef<MachineOperand> Cond, unsigned TrueReg, unsigned FalseReg) const; + unsigned getAddressSpaceForPseudoSourceKind( + PseudoSourceValue::PSVKind Kind) const override; + bool areMemAccessesTriviallyDisjoint(MachineInstr &MIa, MachineInstr &MIb, AliasAnalysis *AA = nullptr) const override; @@ -392,6 +419,19 @@ public: return get(Opcode).TSFlags & SIInstrFlags::SMRD; } + bool isBufferSMRD(const MachineInstr &MI) const { + if (!isSMRD(MI)) + return false; + + // Check that it is using a buffer resource. + int Idx = AMDGPU::getNamedOperandIdx(MI.getOpcode(), AMDGPU::OpName::sbase); + if (Idx == -1) // e.g. s_memtime + return false; + + const auto RCID = MI.getDesc().OpInfo[Idx].RegClass; + return RCID == AMDGPU::SReg_128RegClassID; + } + static bool isDS(const MachineInstr &MI) { return MI.getDesc().TSFlags & SIInstrFlags::DS; } @@ -420,6 +460,14 @@ public: return MI.getDesc().TSFlags & SIInstrFlags::FLAT; } + // Is a FLAT encoded instruction which accesses a specific segment, + // i.e. global_* or scratch_*. + static bool isSegmentSpecificFLAT(const MachineInstr &MI) { + auto Flags = MI.getDesc().TSFlags; + return (Flags & SIInstrFlags::FLAT) && !(Flags & SIInstrFlags::LGKM_CNT); + } + + // Any FLAT encoded instruction, including global_* and scratch_*. bool isFLAT(uint16_t Opcode) const { return get(Opcode).TSFlags & SIInstrFlags::FLAT; } @@ -496,6 +544,10 @@ public: return MI.getDesc().TSFlags & SIInstrFlags::VM_CNT; } + static bool usesLGKM_CNT(const MachineInstr &MI) { + return MI.getDesc().TSFlags & SIInstrFlags::LGKM_CNT; + } + static bool sopkIsZext(const MachineInstr &MI) { return MI.getDesc().TSFlags & SIInstrFlags::SOPK_ZEXT; } @@ -523,11 +575,23 @@ public: } static bool hasFPClamp(const MachineInstr &MI) { - return MI.getDesc().TSFlags & SIInstrFlags::HasFPClamp; + return MI.getDesc().TSFlags & SIInstrFlags::FPClamp; } bool hasFPClamp(uint16_t Opcode) const { - return get(Opcode).TSFlags & SIInstrFlags::HasFPClamp; + return get(Opcode).TSFlags & SIInstrFlags::FPClamp; + } + + static bool hasIntClamp(const MachineInstr &MI) { + return MI.getDesc().TSFlags & SIInstrFlags::IntClamp; + } + + uint64_t getClampMask(const MachineInstr &MI) const { + const uint64_t ClampFlags = SIInstrFlags::FPClamp | + SIInstrFlags::IntClamp | + SIInstrFlags::ClampLo | + SIInstrFlags::ClampHi; + return MI.getDesc().TSFlags & ClampFlags; } bool isVGPRCopy(const MachineInstr &MI) const { @@ -630,9 +694,7 @@ public: bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override; - static unsigned getVALUOp(const MachineInstr &MI); - - bool isSALUOpSupportedOnVALU(const MachineInstr &MI) const; + unsigned getVALUOp(const MachineInstr &MI) const; /// \brief Return the correct register class for \p OpNo. For target-specific /// instructions, this will return the register class that has been defined @@ -774,6 +836,7 @@ public: unsigned isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override; + unsigned getInstBundleSize(const MachineInstr &MI) const; unsigned getInstSizeInBytes(const MachineInstr &MI) const override; bool mayAccessFlatAddressSpace(const MachineInstr &MI) const; @@ -812,9 +875,17 @@ public: MachineBasicBlock::iterator I, const DebugLoc &DL, unsigned DestReg) const; + + static bool isKillTerminator(unsigned Opcode); + const MCInstrDesc &getKillTerminatorFromPseudo(unsigned Opcode) const; + + static bool isLegalMUBUFImmOffset(unsigned Imm) { + return isUInt<12>(Imm); + } }; namespace AMDGPU { + LLVM_READONLY int getVOPe64(uint16_t Opcode); @@ -855,7 +926,8 @@ namespace AMDGPU { TF_LONG_BRANCH_FORWARD = 1 << 0, TF_LONG_BRANCH_BACKWARD = 1 << 1 }; -} // End namespace AMDGPU + +} // end namespace AMDGPU namespace SI { namespace KernelInputOffsets { @@ -873,9 +945,9 @@ enum Offsets { LOCAL_SIZE_Z = 32 }; -} // End namespace KernelInputOffsets -} // End namespace SI +} // end namespace KernelInputOffsets +} // end namespace SI -} // End namespace llvm +} // end namespace llvm -#endif +#endif // LLVM_LIB_TARGET_AMDGPU_SIINSTRINFO_H |
