From aeab09fb8f13bec05e088e8f45a1c2cd4b034c2f Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Tue, 12 Jul 2016 18:44:33 +0000 Subject: [PATCH] BranchFolding: Use LivePhysReg to update live in lists. Use LivePhysRegs with a backwards walking algorithm to update live in lists, this way the results do not depend on the presence of kill flags anymore. This patch also reduces the number of registers added as live-in. Previously all pristine registers as well as all sub registers of a super register were added resulting in unnecessarily large live in lists. This fixed https://llvm.org/PR25263. Differential Revision: http://reviews.llvm.org/D22027 llvm-svn: 275201 --- llvm/lib/CodeGen/BranchFolding.cpp | 51 +++++++++++++++--------------- llvm/lib/CodeGen/BranchFolding.h | 8 ++--- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 3a18f2afb25d..e867aa4d162a 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -32,7 +32,6 @@ #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetPassConfig.h" -#include "llvm/CodeGen/RegisterScavenging.h" #include "llvm/IR/Function.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" @@ -212,13 +211,10 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF, TRI = tri; MMI = mmi; MLI = mli; - RS = nullptr; - // Use a RegScavenger to help update liveness when required. MachineRegisterInfo &MRI = MF.getRegInfo(); - if (MRI.tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF)) - RS = new RegScavenger(); - else + UpdateLiveIns = MRI.tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF); + if (!UpdateLiveIns) MRI.invalidateLiveness(); // Fix CFG. The later algorithms expect it to be right. @@ -249,10 +245,8 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF, // See if any jump tables have become dead as the code generator // did its thing. MachineJumpTableInfo *JTI = MF.getJumpTableInfo(); - if (!JTI) { - delete RS; + if (!JTI) return MadeChange; - } // Walk the function to find jump tables that are live. BitVector JTIsLive(JTI->getJumpTables().size()); @@ -274,7 +268,6 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF, MadeChange = true; } - delete RS; return MadeChange; } @@ -406,15 +399,27 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, return TailLen; } -void BranchFolder::MaintainLiveIns(MachineBasicBlock *CurMBB, - MachineBasicBlock *NewMBB) { - if (RS) { - RS->enterBasicBlock(*CurMBB); - if (!CurMBB->empty()) - RS->forward(std::prev(CurMBB->end())); - for (unsigned int i = 1, e = TRI->getNumRegs(); i != e; i++) - if (RS->isRegUsed(i, false)) - NewMBB->addLiveIn(i); +void BranchFolder::computeLiveIns(MachineBasicBlock &MBB) { + if (!UpdateLiveIns) + return; + + LiveRegs.init(TRI); + LiveRegs.addLiveOutsNoPristines(MBB); + for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) + LiveRegs.stepBackward(MI); + + for (unsigned Reg : LiveRegs) { + // Skip the register if we are about to add one of its super registers. + bool ContainsSuperReg = false; + for (MCSuperRegIterator SReg(Reg, TRI); SReg.isValid(); ++SReg) { + if (LiveRegs.contains(*SReg)) { + ContainsSuperReg = true; + break; + } + } + if (ContainsSuperReg) + continue; + MBB.addLiveIn(Reg); } } @@ -422,12 +427,9 @@ void BranchFolder::MaintainLiveIns(MachineBasicBlock *CurMBB, /// after it, replacing it with an unconditional branch to NewDest. void BranchFolder::ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, MachineBasicBlock *NewDest) { - MachineBasicBlock *CurMBB = OldInst->getParent(); - TII->ReplaceTailWithBranchTo(OldInst, NewDest); - // For targets that use the register scavenger, we must maintain LiveIns. - MaintainLiveIns(CurMBB, NewDest); + computeLiveIns(*NewDest); ++NumTailMerge; } @@ -465,8 +467,7 @@ MachineBasicBlock *BranchFolder::SplitMBBAt(MachineBasicBlock &CurMBB, // NewMBB inherits CurMBB's block frequency. MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB)); - // For targets that use the register scavenger, we must maintain LiveIns. - MaintainLiveIns(&CurMBB, NewMBB); + computeLiveIns(*NewMBB); // Add the new block to the funclet. const auto &FuncletI = FuncletMembership.find(&CurMBB); diff --git a/llvm/lib/CodeGen/BranchFolding.h b/llvm/lib/CodeGen/BranchFolding.h index f7040990f131..36a5a2e2c97c 100644 --- a/llvm/lib/CodeGen/BranchFolding.h +++ b/llvm/lib/CodeGen/BranchFolding.h @@ -11,6 +11,7 @@ #define LLVM_LIB_CODEGEN_BRANCHFOLDING_H #include "llvm/ADT/SmallPtrSet.h" +#include "llvm/CodeGen/LivePhysRegs.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/Support/BlockFrequency.h" #include @@ -21,7 +22,6 @@ namespace llvm { class MachineFunction; class MachineModuleInfo; class MachineLoopInfo; - class RegScavenger; class TargetInstrInfo; class TargetRegisterInfo; @@ -98,11 +98,12 @@ namespace llvm { bool AfterBlockPlacement; bool EnableTailMerge; bool EnableHoistCommonCode; + bool UpdateLiveIns; const TargetInstrInfo *TII; const TargetRegisterInfo *TRI; MachineModuleInfo *MMI; MachineLoopInfo *MLI; - RegScavenger *RS; + LivePhysRegs LiveRegs; public: /// \brief This class keeps track of branch frequencies of newly created @@ -130,8 +131,7 @@ namespace llvm { bool TryTailMergeBlocks(MachineBasicBlock* SuccBB, MachineBasicBlock* PredBB); void setCommonTailEdgeWeights(MachineBasicBlock &TailMBB); - void MaintainLiveIns(MachineBasicBlock *CurMBB, - MachineBasicBlock *NewMBB); + void computeLiveIns(MachineBasicBlock &MBB); void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, MachineBasicBlock *NewDest); MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,