diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-07-10 22:39:56 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-07-10 22:39:56 +0000 |
commit | bc90a4ea8289813a602c820b1d1c020c8db7d412 (patch) | |
tree | 8f96569605c23e0733ae1c9a24d8e289be8e478a /llvm/lib/CodeGen/EarlyIfConversion.cpp | |
parent | 2207f76cd4bc2548d75ba48e1e2a52d212ea0221 (diff) | |
download | bcm5719-llvm-bc90a4ea8289813a602c820b1d1c020c8db7d412.tar.gz bcm5719-llvm-bc90a4ea8289813a602c820b1d1c020c8db7d412.zip |
Require and preserve LoopInfo for early if-conversion.
It will surely be needed by heuristics.
llvm-svn: 160027
Diffstat (limited to 'llvm/lib/CodeGen/EarlyIfConversion.cpp')
-rw-r--r-- | llvm/lib/CodeGen/EarlyIfConversion.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp index fb82a0e901f..9840a402804 100644 --- a/llvm/lib/CodeGen/EarlyIfConversion.cpp +++ b/llvm/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<MachineBasicBlock*> Removed); + void updateLoops(ArrayRef<MachineBasicBlock*> Removed); }; } // end anonymous namespace @@ -541,6 +544,8 @@ void EarlyIfConverter::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<MachineBranchProbabilityInfo>(); AU.addRequired<MachineDominatorTree>(); AU.addPreserved<MachineDominatorTree>(); + AU.addRequired<MachineLoopInfo>(); + AU.addPreserved<MachineLoopInfo>(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -561,6 +566,16 @@ void EarlyIfConverter::updateDomTree(ArrayRef<MachineBasicBlock*> Removed) { } } +/// Update LoopInfo after if-conversion. +void EarlyIfConverter::updateLoops(ArrayRef<MachineBasicBlock*> 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<MachineDominatorTree>(); + Loops = getAnalysisIfAvailable<MachineLoopInfo>(); bool Changed = false; IfConv.runOnMachineFunction(MF); |