summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineLICM.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MachineLICM.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineLICM.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp
index d21059189b18..d1d5509dc482 100644
--- a/llvm/lib/CodeGen/MachineLICM.cpp
+++ b/llvm/lib/CodeGen/MachineLICM.cpp
@@ -24,6 +24,7 @@
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
+#include "llvm/CodeGen/MachineDomTreeUpdater.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -133,7 +134,7 @@ namespace {
AliasAnalysis *AA = nullptr; // Alias analysis info.
MachineBlockFrequencyInfo *MBFI = nullptr; // Machine block frequncy info
MachineLoopInfo *MLI = nullptr; // Current MachineLoopInfo
- MachineDominatorTree *DT = nullptr; // Machine dominator tree for the cur loop
+ MachineDomTreeUpdater *MDTU = nullptr; // Wraps current dominator tree
// State that is updated as we process loops
bool Changed = false; // True if a loop is changed.
@@ -375,7 +376,9 @@ bool MachineLICMImpl::run(MachineFunction &MF) {
.getManager()
.getResult<AAManager>(MF.getFunction())
: &LegacyPass->getAnalysis<AAResultsWrapperPass>().getAAResults();
- DT = GET_RESULT(MachineDominatorTree, getDomTree, );
+ MachineDomTreeUpdater DTU(GET_RESULT(MachineDominatorTree, getDomTree, ),
+ MachineDomTreeUpdater::UpdateStrategy::Lazy);
+ MDTU = &DTU;
MLI = GET_RESULT(MachineLoop, getLI, Info);
MBFI = DisableHoistingToHotterBlocks != UseBFI::None
? GET_RESULT(MachineBlockFrequency, getMBFI, Info)
@@ -421,7 +424,7 @@ bool MachineLICMImpl::run(MachineFunction &MF) {
else {
// CSEMap is initialized for loop header when the first instruction is
// being hoisted.
- MachineDomTreeNode *N = DT->getNode(CurLoop->getHeader());
+ MachineDomTreeNode *N = MDTU->getDomTree().getNode(CurLoop->getHeader());
FirstInLoop = true;
HoistOutOfLoop(N, CurLoop, CurPreheader);
CSEMap.clear();
@@ -764,7 +767,7 @@ bool MachineLICMImpl::IsGuaranteedToExecute(MachineBasicBlock *BB,
SmallVector<MachineBasicBlock*, 8> CurrentLoopExitingBlocks;
CurLoop->getExitingBlocks(CurrentLoopExitingBlocks);
for (MachineBasicBlock *CurrentLoopExitingBlock : CurrentLoopExitingBlocks)
- if (!DT->dominates(BB, CurrentLoopExitingBlock)) {
+ if (!MDTU->getDomTree().dominates(BB, CurrentLoopExitingBlock)) {
SpeculationState = SpeculateTrue;
return false;
}
@@ -1600,7 +1603,7 @@ bool MachineLICMImpl::MayCSE(MachineInstr *MI) {
unsigned Opcode = MI->getOpcode();
for (auto &Map : CSEMap) {
// Check this CSEMap's preheader dominates MI's basic block.
- if (DT->dominates(Map.first, MI->getParent())) {
+ if (MDTU->getDomTree().dominates(Map.first, MI->getParent())) {
DenseMap<unsigned, std::vector<MachineInstr *>>::iterator CI =
Map.second.find(Opcode);
// Do not CSE implicit_def so ProcessImplicitDefs can properly propagate
@@ -1668,7 +1671,7 @@ unsigned MachineLICMImpl::Hoist(MachineInstr *MI, MachineBasicBlock *Preheader,
bool HasCSEDone = false;
for (auto &Map : CSEMap) {
// Check this CSEMap's preheader dominates MI's basic block.
- if (DT->dominates(Map.first, MI->getParent())) {
+ if (MDTU->getDomTree().dominates(Map.first, MI->getParent())) {
DenseMap<unsigned, std::vector<MachineInstr *>>::iterator CI =
Map.second.find(Opcode);
if (CI != Map.second.end()) {
@@ -1732,7 +1735,7 @@ MachineLICMImpl::getCurPreheader(MachineLoop *CurLoop,
}
CurPreheader = Pred->SplitCriticalEdge(CurLoop->getHeader(), LegacyPass,
- MFAM, nullptr);
+ MFAM, nullptr, MDTU);
if (!CurPreheader) {
CurPreheader = reinterpret_cast<MachineBasicBlock *>(-1);
return nullptr;