aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp42
1 files changed, 36 insertions, 6 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp
index e1018bdfde46..607383ab8cde 100644
--- a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp
+++ b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp
@@ -509,8 +509,35 @@ MachineBasicBlock *SILowerControlFlow::emitEndCf(MachineInstr &MI) {
BuildMI(MBB, InsPt, DL, TII->get(Opcode), Exec)
.addReg(Exec)
.add(MI.getOperand(0));
- if (LV)
- LV->replaceKillInstruction(MI.getOperand(0).getReg(), MI, *NewMI);
+ if (LV) {
+ LV->replaceKillInstruction(DataReg, MI, *NewMI);
+
+ if (SplitBB != &MBB) {
+ // Track the set of registers defined in the split block so we don't
+ // accidentally add the original block to AliveBlocks.
+ DenseSet<Register> SplitDefs;
+ for (MachineInstr &X : *SplitBB) {
+ for (MachineOperand &Op : X.operands()) {
+ if (Op.isReg() && Op.isDef() && Op.getReg().isVirtual())
+ SplitDefs.insert(Op.getReg());
+ }
+ }
+
+ for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
+ Register Reg = Register::index2VirtReg(i);
+ LiveVariables::VarInfo &VI = LV->getVarInfo(Reg);
+
+ if (VI.AliveBlocks.test(MBB.getNumber()))
+ VI.AliveBlocks.set(SplitBB->getNumber());
+ else {
+ for (MachineInstr *Kill : VI.Kills) {
+ if (Kill->getParent() == SplitBB && !SplitDefs.contains(Reg))
+ VI.AliveBlocks.set(MBB.getNumber());
+ }
+ }
+ }
+ }
+ }
LoweredEndCf.insert(NewMI);
@@ -540,7 +567,7 @@ void SILowerControlFlow::findMaskOperands(MachineInstr &MI, unsigned OpNo,
return;
// Make sure we do not modify exec between def and use.
- // A copy with implcitly defined exec inserted earlier is an exclusion, it
+ // A copy with implicitly defined exec inserted earlier is an exclusion, it
// does not really modify exec.
for (auto I = Def->getIterator(); I != MI.getIterator(); ++I)
if (I->modifiesRegister(AMDGPU::EXEC, TRI) &&
@@ -573,14 +600,14 @@ void SILowerControlFlow::combineMasks(MachineInstr &MI) {
else return;
Register Reg = MI.getOperand(OpToReplace).getReg();
- MI.RemoveOperand(OpToReplace);
+ MI.removeOperand(OpToReplace);
MI.addOperand(Ops[UniqueOpndIdx]);
if (MRI->use_empty(Reg))
MRI->getUniqueVRegDef(Reg)->eraseFromParent();
}
void SILowerControlFlow::optimizeEndCf() {
- // If the only instruction immediately following this END_CF is an another
+ // If the only instruction immediately following this END_CF is another
// END_CF in the only successor we can avoid emitting exec mask restore here.
if (!EnableOptimizeEndCf)
return;
@@ -865,6 +892,7 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) {
}
}
+ bool Changed = false;
MachineFunction::iterator NextBB;
for (MachineFunction::iterator BI = MF.begin();
BI != MF.end(); BI = NextBB) {
@@ -886,6 +914,7 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) {
case AMDGPU::SI_LOOP:
case AMDGPU::SI_END_CF:
SplitMBB = process(MI);
+ Changed = true;
break;
// FIXME: find a better place for this
@@ -894,6 +923,7 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) {
lowerInitExec(MBB, MI);
if (LIS)
LIS->removeAllRegUnitsForPhysReg(AMDGPU::EXEC);
+ Changed = true;
break;
default:
@@ -913,5 +943,5 @@ bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) {
LoweredIf.clear();
KillBlocks.clear();
- return true;
+ return Changed;
}