summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIFoldOperands.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SIFoldOperands.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
index 1fda9701c39..64654dee4e0 100644
--- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
@@ -208,12 +208,14 @@ static bool updateOperand(FoldCandidate &Fold,
if (Liveness != MachineBasicBlock::LQR_Dead)
return false;
+ MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
int Op32 = Fold.getShrinkOpcode();
MachineOperand &Dst0 = MI->getOperand(0);
MachineOperand &Dst1 = MI->getOperand(1);
assert(Dst0.isDef() && Dst1.isDef());
- MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
+ bool HaveNonDbgCarryUse = !MRI.use_nodbg_empty(Dst1.getReg());
+
const TargetRegisterClass *Dst0RC = MRI.getRegClass(Dst0.getReg());
unsigned NewReg0 = MRI.createVirtualRegister(Dst0RC);
const TargetRegisterClass *Dst1RC = MRI.getRegClass(Dst1.getReg());
@@ -221,6 +223,11 @@ static bool updateOperand(FoldCandidate &Fold,
MachineInstr *Inst32 = TII.buildShrunkInst(*MI, Op32);
+ if (HaveNonDbgCarryUse) {
+ BuildMI(*MBB, MI, MI->getDebugLoc(), TII.get(AMDGPU::COPY), Dst1.getReg())
+ .addReg(AMDGPU::VCC, RegState::Kill);
+ }
+
// Keep the old instruction around to avoid breaking iterators, but
// replace the outputs with dummy registers.
Dst0.setReg(NewReg0);
@@ -351,10 +358,6 @@ static bool tryAddToFoldList(SmallVectorImpl<FoldCandidate> &FoldList,
const MachineOperand &SDst = MI->getOperand(1);
assert(SDst.isDef());
- // TODO: Handle cases with a used carry.
- if (!MRI.use_nodbg_empty(SDst.getReg()))
- return false;
-
int Op32 = AMDGPU::getVOPe32(Opc);
FoldList.push_back(FoldCandidate(MI, CommuteOpNo, OpToFold, true,
Op32));
OpenPOWER on IntegriCloud