Skip to content

Commit

Permalink
AMDGPU: Use ImmLeaf for inline immediate predicates
Browse files Browse the repository at this point in the history
  • Loading branch information
arsenm committed Jan 6, 2020
1 parent 5518a02 commit 14d2505
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 9 deletions.
16 changes: 16 additions & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
Expand Up @@ -171,6 +171,22 @@ class AMDGPUDAGToDAGISel : public SelectionDAGISel {
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;
Expand Down
16 changes: 16 additions & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
Expand Up @@ -2117,3 +2117,19 @@ void AMDGPUInstructionSelector::renderTruncImm32(MachineInstrBuilder &MIB,
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);
}
5 changes: 5 additions & 0 deletions llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h
Expand Up @@ -166,6 +166,11 @@ class AMDGPUInstructionSelector : public InstructionSelector {
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;
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/AMDGPU/SIInstrInfo.h
Expand Up @@ -692,6 +692,10 @@ class SIInstrInfo final : public AMDGPUGenInstrInfo {

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,
Expand Down
21 changes: 17 additions & 4 deletions llvm/lib/Target/AMDGPU/SIInstrInfo.td
Expand Up @@ -737,14 +737,27 @@ def i64imm_32bit : ImmLeaf<i64, [{
return (Imm & 0xffffffffULL) == static_cast<uint64_t>(Imm);
}]>;

class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
return isInlineImmediate(N);
def InlineImm16 : ImmLeaf<i16, [{
return isInlineImmediate16(Imm);
}]>;

class InlineFPImm <ValueType vt> : PatLeaf <(vt fpimm), [{
return isInlineImmediate(N);
def InlineImm32 : ImmLeaf<i32, [{
return isInlineImmediate32(Imm);
}]>;

def InlineImm64 : ImmLeaf<i64, [{
return isInlineImmediate64(Imm);
}]>;

def InlineImmFP32 : FPImmLeaf<f32, [{
return isInlineImmediate(Imm);
}]>;

def InlineImmFP64 : FPImmLeaf<f64, [{
return isInlineImmediate(Imm);
}]>;


class VGPRImm <dag frag> : PatLeaf<frag, [{
return isVGPRImm(N);
}]>;
Expand Down
10 changes: 5 additions & 5 deletions llvm/lib/Target/AMDGPU/SIInstructions.td
Expand Up @@ -660,7 +660,7 @@ def : Pat <
>;

def : Pat <
(int_amdgcn_kill (i1 (setcc f32:$src, InlineFPImm<f32>:$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))
>;

Expand Down Expand Up @@ -1324,8 +1324,8 @@ def : GCNPat <
>;

def : GCNPat <
(i64 InlineImm<i64>:$imm),
(S_MOV_B64 InlineImm<i64>:$imm)
(i64 InlineImm64:$imm),
(S_MOV_B64 InlineImm64:$imm)
>;

// XXX - Should this use a s_cmp to set SCC?
Expand All @@ -1346,8 +1346,8 @@ def : GCNPat <
}

def : GCNPat <
(f64 InlineFPImm<f64>:$imm),
(S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineFPImm<f64>:$imm)))
(f64 InlineImmFP64:$imm),
(S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineImmFP64:$imm)))
>;

/********** ================== **********/
Expand Down

0 comments on commit 14d2505

Please sign in to comment.