From 47730a774dd6392744ee62c7385665c780e1c4e1 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Tue, 10 Jul 2012 22:39:56 +0000 Subject: [PATCH] Require and preserve LoopInfo for early if-conversion. It will surely be needed by heuristics. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160027 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/EarlyIfConversion.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/CodeGen/EarlyIfConversion.cpp b/lib/CodeGen/EarlyIfConversion.cpp index fb82a0e901f..9840a402804 100644 --- a/lib/CodeGen/EarlyIfConversion.cpp +++ b/lib/CodeGen/EarlyIfConversion.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetInstrInfo.h" @@ -513,6 +514,7 @@ class EarlyIfConverter : public MachineFunctionPass { const TargetRegisterInfo *TRI; MachineRegisterInfo *MRI; MachineDominatorTree *DomTree; + MachineLoopInfo *Loops; SSAIfConv IfConv; public: @@ -524,6 +526,7 @@ public: private: bool tryConvertIf(MachineBasicBlock*); void updateDomTree(ArrayRef Removed); + void updateLoops(ArrayRef Removed); }; } // end anonymous namespace @@ -541,6 +544,8 @@ void EarlyIfConverter::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addRequired(); AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -561,6 +566,16 @@ void EarlyIfConverter::updateDomTree(ArrayRef Removed) { } } +/// Update LoopInfo after if-conversion. +void EarlyIfConverter::updateLoops(ArrayRef Removed) { + if (!Loops) + return; + // If-conversion doesn't change loop structure, and it doesn't mess with back + // edges, so updating LoopInfo is simply removing the dead blocks. + for (unsigned i = 0, e = Removed.size(); i != e; ++i) + Loops->removeBlock(Removed[i]); +} + /// Attempt repeated if-conversion on MBB, return true if successful. /// bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) { @@ -571,6 +586,7 @@ bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) { IfConv.convertIf(RemovedBlocks); Changed = true; updateDomTree(RemovedBlocks); + updateLoops(RemovedBlocks); } return Changed; } @@ -583,6 +599,7 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) { TRI = MF.getTarget().getRegisterInfo(); MRI = &MF.getRegInfo(); DomTree = &getAnalysis(); + Loops = getAnalysisIfAvailable(); bool Changed = false; IfConv.runOnMachineFunction(MF);