aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/AMDGPU/SIInstrInfo.h
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-12-18 20:10:56 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-12-18 20:10:56 +0000
commit044eb2f6afba375a914ac9d8024f8f5142bb912e (patch)
tree1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /lib/Target/AMDGPU/SIInstrInfo.h
parenteb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff)
Notes
Diffstat (limited to 'lib/Target/AMDGPU/SIInstrInfo.h')
-rw-r--r--lib/Target/AMDGPU/SIInstrInfo.h116
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