diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/R600/SIInstrInfo.cpp | 31 | ||||
| -rw-r--r-- | llvm/test/CodeGen/R600/llvm.AMDGPU.clamp.ll | 4 |
2 files changed, 22 insertions, 13 deletions
diff --git a/llvm/lib/Target/R600/SIInstrInfo.cpp b/llvm/lib/Target/R600/SIInstrInfo.cpp index fffd698d14f..3ad448ee421 100644 --- a/llvm/lib/Target/R600/SIInstrInfo.cpp +++ b/llvm/lib/Target/R600/SIInstrInfo.cpp @@ -684,19 +684,28 @@ bool SIInstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) const { MachineInstr *SIInstrInfo::commuteInstruction(MachineInstr *MI, bool NewMI) const { + if (MI->getNumOperands() < 3) + return nullptr; + + int Src0Idx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), + AMDGPU::OpName::src0); + assert(Src0Idx != -1 && "Should always have src0 operand"); - if (MI->getNumOperands() < 3 || !MI->getOperand(1).isReg()) + if (!MI->getOperand(Src0Idx).isReg()) return nullptr; + int Src1Idx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), + AMDGPU::OpName::src1); + // Make sure it s legal to commute operands for VOP2. - if (isVOP2(MI->getOpcode()) && - (!isOperandLegal(MI, 1, &MI->getOperand(2)) || - !isOperandLegal(MI, 2, &MI->getOperand(1)))) + if ((Src1Idx != -1) && isVOP2(MI->getOpcode()) && + (!isOperandLegal(MI, Src0Idx, &MI->getOperand(Src1Idx)) || + !isOperandLegal(MI, Src1Idx, &MI->getOperand(Src0Idx)))) return nullptr; - if (!MI->getOperand(2).isReg()) { + if (Src1Idx != -1 && !MI->getOperand(Src1Idx).isReg()) { // XXX: Commute instructions with FPImm operands - if (NewMI || MI->getOperand(2).isFPImm() || + if (NewMI || MI->getOperand(Src1Idx).isFPImm() || (!isVOP2(MI->getOpcode()) && !isVOP3(MI->getOpcode()))) { return nullptr; } @@ -716,11 +725,11 @@ MachineInstr *SIInstrInfo::commuteInstruction(MachineInstr *MI, (Src2Mods && Src2Mods->getImm())) return nullptr; - unsigned Reg = MI->getOperand(1).getReg(); - unsigned SubReg = MI->getOperand(1).getSubReg(); - MI->getOperand(1).ChangeToImmediate(MI->getOperand(2).getImm()); - MI->getOperand(2).ChangeToRegister(Reg, false); - MI->getOperand(2).setSubReg(SubReg); + unsigned Reg = MI->getOperand(Src0Idx).getReg(); + unsigned SubReg = MI->getOperand(Src0Idx).getSubReg(); + MI->getOperand(Src0Idx).ChangeToImmediate(MI->getOperand(Src1Idx).getImm()); + MI->getOperand(Src1Idx).ChangeToRegister(Reg, false); + MI->getOperand(Src1Idx).setSubReg(SubReg); } else { MI = TargetInstrInfo::commuteInstruction(MI, NewMI); } diff --git a/llvm/test/CodeGen/R600/llvm.AMDGPU.clamp.ll b/llvm/test/CodeGen/R600/llvm.AMDGPU.clamp.ll index d608953a0dd..cafca080df5 100644 --- a/llvm/test/CodeGen/R600/llvm.AMDGPU.clamp.ll +++ b/llvm/test/CodeGen/R600/llvm.AMDGPU.clamp.ll @@ -6,7 +6,7 @@ declare float @llvm.AMDIL.clamp.f32(float, float, float) nounwind readnone ; FUNC-LABEL: @clamp_0_1_f32 ; SI: S_LOAD_DWORD [[ARG:s[0-9]+]], -; SI: V_ADD_F32_e64 [[RESULT:v[0-9]+]], [[ARG]], 0, 1, 0 +; SI: V_ADD_F32_e64 [[RESULT:v[0-9]+]], 0, [[ARG]], 1, 0 ; SI: BUFFER_STORE_DWORD [[RESULT]] ; SI: S_ENDPGM @@ -19,7 +19,7 @@ define void @clamp_0_1_f32(float addrspace(1)* %out, float %src) nounwind { ; FUNC-LABEL: @clamp_0_1_amdil_legacy_f32 ; SI: S_LOAD_DWORD [[ARG:s[0-9]+]], -; SI: V_ADD_F32_e64 [[RESULT:v[0-9]+]], [[ARG]], 0, 1, 0 +; SI: V_ADD_F32_e64 [[RESULT:v[0-9]+]], 0, [[ARG]], 1, 0 ; SI: BUFFER_STORE_DWORD [[RESULT]] define void @clamp_0_1_amdil_legacy_f32(float addrspace(1)* %out, float %src) nounwind { %clamp = call float @llvm.AMDIL.clamp.f32(float %src, float 0.0, float 1.0) nounwind readnone |

