summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
diff options
context:
space:
mode:
authorStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2017-09-11 17:13:57 +0000
committerStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2017-09-11 17:13:57 +0000
commit710da42b86bb7c1756ad74d3b1fd47b76e981eb6 (patch)
tree8f7d509dfb5863591c759eb6c404aeeb711b168b /llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
parent894dbbe8eb0e3d8fc7d8746a76d2380f0c2b6c0f (diff)
downloadbcm5719-llvm-710da42b86bb7c1756ad74d3b1fd47b76e981eb6.tar.gz
bcm5719-llvm-710da42b86bb7c1756ad74d3b1fd47b76e981eb6.zip
[AMDGPU] Produce madak and madmk from the two-address pass
These two instructions are normally selected, but when the two address pass converts mac into mad we end up with the mad where we could have one of these. Differential Revision: https://reviews.llvm.org/D37389 llvm-svn: 312928
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIInstrInfo.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SIInstrInfo.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index f7f6d52e751..e9360701979 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -2083,6 +2083,19 @@ bool SIInstrInfo::areMemAccessesTriviallyDisjoint(MachineInstr &MIa,
return false;
}
+static int64_t getFoldableImm(const MachineOperand* MO) {
+ if (!MO->isReg())
+ return false;
+ const MachineFunction *MF = MO->getParent()->getParent()->getParent();
+ const MachineRegisterInfo &MRI = MF->getRegInfo();
+ auto Def = MRI.getUniqueVRegDef(MO->getReg());
+ if (Def && (Def->getOpcode() == AMDGPU::S_MOV_B32 ||
+ Def->getOpcode() == AMDGPU::V_MOV_B32_e32) &&
+ Def->getOperand(1).isImm())
+ return Def->getOperand(1).getImm();
+ return AMDGPU::NoRegister;
+}
+
MachineInstr *SIInstrInfo::convertToThreeAddress(MachineFunction::iterator &MBB,
MachineInstr &MI,
LiveVariables *LV) const {
@@ -2120,6 +2133,35 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineFunction::iterator &MBB,
const MachineOperand *Clamp = getNamedOperand(MI, AMDGPU::OpName::clamp);
const MachineOperand *Omod = getNamedOperand(MI, AMDGPU::OpName::omod);
+ if (!Src0Mods && !Src1Mods && !Clamp && !Omod) {
+ if (auto Imm = getFoldableImm(Src2)) {
+ return BuildMI(*MBB, MI, MI.getDebugLoc(),
+ get(IsF16 ? AMDGPU::V_MADAK_F16 : AMDGPU::V_MADAK_F32))
+ .add(*Dst)
+ .add(*Src0)
+ .add(*Src1)
+ .addImm(Imm);
+ }
+ if (auto Imm = getFoldableImm(Src1)) {
+ return BuildMI(*MBB, MI, MI.getDebugLoc(),
+ get(IsF16 ? AMDGPU::V_MADMK_F16 : AMDGPU::V_MADMK_F32))
+ .add(*Dst)
+ .add(*Src0)
+ .addImm(Imm)
+ .add(*Src2);
+ }
+ if (auto Imm = getFoldableImm(Src0)) {
+ if (isOperandLegal(MI, AMDGPU::getNamedOperandIdx(AMDGPU::V_MADMK_F32,
+ AMDGPU::OpName::src0), Src1))
+ return BuildMI(*MBB, MI, MI.getDebugLoc(),
+ get(IsF16 ? AMDGPU::V_MADMK_F16 : AMDGPU::V_MADMK_F32))
+ .add(*Dst)
+ .add(*Src1)
+ .addImm(Imm)
+ .add(*Src2);
+ }
+ }
+
return BuildMI(*MBB, MI, MI.getDebugLoc(),
get(IsF16 ? AMDGPU::V_MAD_F16 : AMDGPU::V_MAD_F32))
.add(*Dst)
OpenPOWER on IntegriCloud