diff options
author | Jay Foad <jay.foad@amd.com> | 2021-10-27 16:05:40 +0100 |
---|---|---|
committer | Jay Foad <jay.foad@amd.com> | 2021-11-02 15:03:37 +0000 |
commit | be1a8f8834c9c515a192a27ae5c633ca9145d95f (patch) | |
tree | 5acfb7a84c34be61a4bc1715ec52822ccb610b55 /llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | |
parent | 7fbb0678fa4d6a8920fe7ddf3e734fba4406bd24 (diff) | |
download | llvm-be1a8f8834c9c515a192a27ae5c633ca9145d95f.zip llvm-be1a8f8834c9c515a192a27ae5c633ca9145d95f.tar.gz llvm-be1a8f8834c9c515a192a27ae5c633ca9145d95f.tar.bz2 |
[AMDGPU] Really preserve LiveVariables in SILowerControlFlow
https://bugs.llvm.org/show_bug.cgi?id=52204
Differential Revision: https://reviews.llvm.org/D112731
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp index 1069693..ec89de2 100644 --- a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp @@ -52,6 +52,7 @@ #include "MCTargetDesc/AMDGPUMCTargetDesc.h" #include "llvm/ADT/SmallSet.h" #include "llvm/CodeGen/LiveIntervals.h" +#include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -70,6 +71,7 @@ private: const SIRegisterInfo *TRI = nullptr; const SIInstrInfo *TII = nullptr; LiveIntervals *LIS = nullptr; + LiveVariables *LV = nullptr; MachineDominatorTree *MDT = nullptr; MachineRegisterInfo *MRI = nullptr; SetVector<MachineInstr*> LoweredEndCf; @@ -237,6 +239,8 @@ void SILowerControlFlow::emitIf(MachineInstr &MI) { BuildMI(MBB, I, DL, TII->get(AndOpc), Tmp) .addReg(CopyReg) .add(Cond); + if (LV) + LV->replaceKillInstruction(Cond.getReg(), MI, *And); setImpSCCDefDead(*And, true); @@ -254,6 +258,8 @@ void SILowerControlFlow::emitIf(MachineInstr &MI) { MachineInstr *SetExec = BuildMI(MBB, I, DL, TII->get(MovTermOpc), Exec) .addReg(Tmp, RegState::Kill); + if (LV) + LV->getVarInfo(Tmp).Kills.push_back(SetExec); // Skip ahead to the unconditional branch in case there are other terminators // present. @@ -307,6 +313,8 @@ void SILowerControlFlow::emitElse(MachineInstr &MI) { MachineInstr *OrSaveExec = BuildMI(MBB, Start, DL, TII->get(OrSaveExecOpc), SaveReg) .add(MI.getOperand(1)); // Saved EXEC + if (LV) + LV->replaceKillInstruction(MI.getOperand(1).getReg(), MI, *OrSaveExec); MachineBasicBlock *DestBB = MI.getOperand(2).getMBB(); @@ -380,15 +388,22 @@ void SILowerControlFlow::emitIfBreak(MachineInstr &MI) { And = BuildMI(MBB, &MI, DL, TII->get(AndOpc), AndReg) .addReg(Exec) .add(MI.getOperand(1)); + if (LV) + LV->replaceKillInstruction(MI.getOperand(1).getReg(), MI, *And); Or = BuildMI(MBB, &MI, DL, TII->get(OrOpc), Dst) .addReg(AndReg) .add(MI.getOperand(2)); if (LIS) LIS->createAndComputeVirtRegInterval(AndReg); - } else + } else { Or = BuildMI(MBB, &MI, DL, TII->get(OrOpc), Dst) .add(MI.getOperand(1)) .add(MI.getOperand(2)); + if (LV) + LV->replaceKillInstruction(MI.getOperand(1).getReg(), MI, *Or); + } + if (LV) + LV->replaceKillInstruction(MI.getOperand(2).getReg(), MI, *Or); if (LIS) { if (And) @@ -490,6 +505,8 @@ 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); LoweredEndCf.insert(NewMI); @@ -581,7 +598,12 @@ void SILowerControlFlow::optimizeEndCf() { LLVM_DEBUG(dbgs() << "Skip redundant "; MI->dump()); if (LIS) LIS->RemoveMachineInstrFromMaps(*MI); + Register Reg; + if (LV) + Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::src1)->getReg(); MI->eraseFromParent(); + if (LV) + LV->recomputeForSingleDefVirtReg(Reg); removeMBBifRedundant(MBB); } } @@ -697,6 +719,8 @@ void SILowerControlFlow::lowerInitExec(MachineBasicBlock *MBB, auto BfeMI = BuildMI(*MBB, FirstMI, DL, TII->get(AMDGPU::S_BFE_U32), CountReg) .addReg(InputReg) .addImm((MI.getOperand(1).getImm() & Mask) | 0x70000); + if (LV) + LV->recomputeForSingleDefVirtReg(InputReg); auto BfmMI = BuildMI(*MBB, FirstMI, DL, TII->get(IsWave32 ? AMDGPU::S_BFM_B32 : AMDGPU::S_BFM_B64), Exec) @@ -705,6 +729,8 @@ void SILowerControlFlow::lowerInitExec(MachineBasicBlock *MBB, auto CmpMI = BuildMI(*MBB, FirstMI, DL, TII->get(AMDGPU::S_CMP_EQ_U32)) .addReg(CountReg, RegState::Kill) .addImm(WavefrontSize); + if (LV) + LV->getVarInfo(CountReg).Kills.push_back(CmpMI); auto CmovMI = BuildMI(*MBB, FirstMI, DL, TII->get(IsWave32 ? AMDGPU::S_CMOV_B32 : AMDGPU::S_CMOV_B64), @@ -777,17 +803,14 @@ bool SILowerControlFlow::removeMBBifRedundant(MachineBasicBlock &MBB) { } bool SILowerControlFlow::runOnMachineFunction(MachineFunction &MF) { - // FIXME: This pass causes verification failures. - // See: https://bugs.llvm.org/show_bug.cgi?id=52204 - MF.getProperties().set( - MachineFunctionProperties::Property::FailsVerification); - const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); TII = ST.getInstrInfo(); TRI = &TII->getRegisterInfo(); // This doesn't actually need LiveIntervals, but we can preserve them. LIS = getAnalysisIfAvailable<LiveIntervals>(); + // This doesn't actually need LiveVariables, but we can preserve them. + LV = getAnalysisIfAvailable<LiveVariables>(); MDT = getAnalysisIfAvailable<MachineDominatorTree>(); MRI = &MF.getRegInfo(); BoolRC = TRI->getBoolRC(); |