diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2013-11-18 20:09:21 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2013-11-18 20:09:21 +0000 |
commit | 836c5133c66edecedeaa79448964b4c103f99271 (patch) | |
tree | a7424312c56878003d8877e691a25d74b000d7f8 | |
parent | b570599c8f048c2eda78edb9304bd8e283fb6908 (diff) | |
download | external_llvm-836c5133c66edecedeaa79448964b4c103f99271.zip external_llvm-836c5133c66edecedeaa79448964b4c103f99271.tar.gz external_llvm-836c5133c66edecedeaa79448964b4c103f99271.tar.bz2 |
R600/SI: Fix extra defs of VCC / SCC.
When replacing scalar operations with vector,
the wrong implicit output register was used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195033 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/R600/SIInstrInfo.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/Target/R600/SIInstrInfo.cpp b/lib/Target/R600/SIInstrInfo.cpp index 11710b4..9d8dff1 100644 --- a/lib/Target/R600/SIInstrInfo.cpp +++ b/lib/Target/R600/SIInstrInfo.cpp @@ -466,6 +466,8 @@ void SIInstrInfo::legalizeOperands(MachineInstr *MI) const { if (!RI.isSGPRClass(MRI.getRegClass(MO.getReg()))) continue; // VGPRs are legal + assert(MO.getReg() != AMDGPU::SCC && "SCC operand to VOP3 instruction"); + if (SGPRReg == AMDGPU::NoRegister || SGPRReg == MO.getReg()) { SGPRReg = MO.getReg(); // We can use one SGPR in each VOP3 instruction. @@ -543,18 +545,27 @@ void SIInstrInfo::moveToVALU(MachineInstr &TopInst) const { const MCInstrDesc &NewDesc = get(NewOpcode); Inst->setDesc(NewDesc); + // Remove any references to SCC. Vector instructions can't read from it, and + // We're just about to add the implicit use / defs of VCC, and we don't want + // both. + for (unsigned i = Inst->getNumOperands() - 1; i > 0; --i) { + MachineOperand &Op = Inst->getOperand(i); + if (Op.isReg() && Op.getReg() == AMDGPU::SCC) + Inst->RemoveOperand(i); + } + // Add the implict and explicit register definitions. if (NewDesc.ImplicitUses) { for (unsigned i = 0; NewDesc.ImplicitUses[i]; ++i) { - Inst->addOperand(MachineOperand::CreateReg(NewDesc.ImplicitUses[i], - false, true)); + unsigned Reg = NewDesc.ImplicitUses[i]; + Inst->addOperand(MachineOperand::CreateReg(Reg, false, true)); } } if (NewDesc.ImplicitDefs) { for (unsigned i = 0; NewDesc.ImplicitDefs[i]; ++i) { - Inst->addOperand(MachineOperand::CreateReg(NewDesc.ImplicitDefs[i], - true, true)); + unsigned Reg = NewDesc.ImplicitDefs[i]; + Inst->addOperand(MachineOperand::CreateReg(Reg, true, true)); } } |