Index: llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -171,6 +171,22 @@ return isInlineImmediate(N, true); } + bool isInlineImmediate16(int64_t Imm) const { + return AMDGPU::isInlinableLiteral16(Imm, Subtarget->hasInv2PiInlineImm()); + } + + bool isInlineImmediate32(int64_t Imm) const { + return AMDGPU::isInlinableLiteral32(Imm, Subtarget->hasInv2PiInlineImm()); + } + + bool isInlineImmediate64(int64_t Imm) const { + return AMDGPU::isInlinableLiteral64(Imm, Subtarget->hasInv2PiInlineImm()); + } + + bool isInlineImmediate(const APFloat &Imm) const { + return Subtarget->getInstrInfo()->isInlineConstant(Imm); + } + bool isVGPRImm(const SDNode *N) const; bool isUniformLoad(const SDNode *N) const; bool isUniformBr(const SDNode *N) const; Index: llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h +++ llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h @@ -171,6 +171,11 @@ void renderTruncImm32(MachineInstrBuilder &MIB, const MachineInstr &MI) const; + bool isInlineImmediate16(int64_t Imm) const; + bool isInlineImmediate32(int64_t Imm) const; + bool isInlineImmediate64(int64_t Imm) const; + bool isInlineImmediate(const APFloat &Imm) const; + const SIInstrInfo &TII; const SIRegisterInfo &TRI; const AMDGPURegisterBankInfo &RBI; Index: llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp @@ -2110,3 +2110,19 @@ assert(CstVal && "Expected constant value"); MIB.addImm(CstVal.getValue()); } + +bool AMDGPUInstructionSelector::isInlineImmediate16(int64_t Imm) const { + return AMDGPU::isInlinableLiteral16(Imm, STI.hasInv2PiInlineImm()); +} + +bool AMDGPUInstructionSelector::isInlineImmediate32(int64_t Imm) const { + return AMDGPU::isInlinableLiteral32(Imm, STI.hasInv2PiInlineImm()); +} + +bool AMDGPUInstructionSelector::isInlineImmediate64(int64_t Imm) const { + return AMDGPU::isInlinableLiteral64(Imm, STI.hasInv2PiInlineImm()); +} + +bool AMDGPUInstructionSelector::isInlineImmediate(const APFloat &Imm) const { + return TII.isInlineConstant(Imm); +} Index: llvm/lib/Target/AMDGPU/SIInstrInfo.h =================================================================== --- llvm/lib/Target/AMDGPU/SIInstrInfo.h +++ llvm/lib/Target/AMDGPU/SIInstrInfo.h @@ -692,6 +692,10 @@ bool isInlineConstant(const APInt &Imm) const; + bool isInlineConstant(const APFloat &Imm) const { + return isInlineConstant(Imm.bitcastToAPInt()); + } + bool isInlineConstant(const MachineOperand &MO, uint8_t OperandType) const; bool isInlineConstant(const MachineOperand &MO, Index: llvm/lib/Target/AMDGPU/SIInstrInfo.td =================================================================== --- llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -745,6 +745,27 @@ return isInlineImmediate(N); }]>; +def InlineImm16 : ImmLeaf; + +def InlineImm32 : ImmLeaf; + +def InlineImm64 : ImmLeaf; + +def InlineImmFP32 : FPImmLeaf; + +def InlineImmFP64 : FPImmLeaf; + + class VGPRImm : PatLeaf; Index: llvm/lib/Target/AMDGPU/SIInstructions.td =================================================================== --- llvm/lib/Target/AMDGPU/SIInstructions.td +++ llvm/lib/Target/AMDGPU/SIInstructions.td @@ -660,7 +660,7 @@ >; def : Pat < - (int_amdgcn_kill (i1 (setcc f32:$src, InlineFPImm:$imm, cond:$cond))), + (int_amdgcn_kill (i1 (setcc f32:$src, InlineImmFP32:$imm, cond:$cond))), (SI_KILL_F32_COND_IMM_PSEUDO $src, (bitcast_fpimm_to_i32 $imm), (cond_as_i32imm $cond)) >; @@ -1324,8 +1324,8 @@ >; def : GCNPat < - (i64 InlineImm:$imm), - (S_MOV_B64 InlineImm:$imm) + (i64 InlineImm64:$imm), + (S_MOV_B64 InlineImm64:$imm) >; // XXX - Should this use a s_cmp to set SCC? @@ -1346,8 +1346,8 @@ } def : GCNPat < - (f64 InlineFPImm:$imm), - (S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineFPImm:$imm))) + (f64 InlineImmFP64:$imm), + (S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineImmFP64:$imm))) >; /********** ================== **********/