@@ -215,11 +215,9 @@ namespace {
215
215
: MI(mi), Def(def), FI(fi) {}
216
216
};
217
217
218
- void HoistRegionPostRA (MachineLoop *CurLoop,
219
- MachineBasicBlock *CurPreheader);
218
+ void HoistRegionPostRA (MachineLoop *CurLoop);
220
219
221
- void HoistPostRA (MachineInstr *MI, Register Def, MachineLoop *CurLoop,
222
- MachineBasicBlock *CurPreheader);
220
+ void HoistPostRA (MachineInstr *MI, Register Def, MachineLoop *CurLoop);
223
221
224
222
void ProcessMI (MachineInstr *MI, BitVector &RUDefs, BitVector &RUClobbers,
225
223
SmallDenseSet<int > &StoredFIs,
@@ -259,8 +257,7 @@ namespace {
259
257
DenseMap<MachineDomTreeNode *, unsigned > &OpenChildren,
260
258
const DenseMap<MachineDomTreeNode *, MachineDomTreeNode *> &ParentMap);
261
259
262
- void HoistOutOfLoop (MachineDomTreeNode *HeaderN, MachineLoop *CurLoop,
263
- MachineBasicBlock *CurPreheader);
260
+ void HoistOutOfLoop (MachineDomTreeNode *HeaderN, MachineLoop *CurLoop);
264
261
265
262
void InitRegPressure (MachineBasicBlock *BB);
266
263
@@ -291,8 +288,7 @@ namespace {
291
288
292
289
bool isTgtHotterThanSrc (MachineBasicBlock *SrcBlock,
293
290
MachineBasicBlock *TgtBlock);
294
- MachineBasicBlock *getCurPreheader (MachineLoop *CurLoop,
295
- MachineBasicBlock *CurPreheader);
291
+ MachineBasicBlock *getOrCreatePreheader (MachineLoop *CurLoop);
296
292
};
297
293
298
294
class MachineLICMBase : public MachineFunctionPass {
@@ -417,16 +413,15 @@ bool MachineLICMImpl::run(MachineFunction &MF) {
417
413
SmallVector<MachineLoop *, 8 > Worklist (MLI->begin (), MLI->end ());
418
414
while (!Worklist.empty ()) {
419
415
MachineLoop *CurLoop = Worklist.pop_back_val ();
420
- MachineBasicBlock *CurPreheader = nullptr ;
421
416
422
- if (!PreRegAlloc)
423
- HoistRegionPostRA (CurLoop, CurPreheader );
424
- else {
417
+ if (!PreRegAlloc) {
418
+ HoistRegionPostRA (CurLoop);
419
+ } else {
425
420
// CSEMap is initialized for loop header when the first instruction is
426
421
// being hoisted.
427
422
MachineDomTreeNode *N = MDTU->getDomTree ().getNode (CurLoop->getHeader ());
428
423
FirstInLoop = true ;
429
- HoistOutOfLoop (N, CurLoop, CurPreheader );
424
+ HoistOutOfLoop (N, CurLoop);
430
425
CSEMap.clear ();
431
426
}
432
427
}
@@ -606,9 +601,8 @@ void MachineLICMImpl::ProcessMI(MachineInstr *MI, BitVector &RUDefs,
606
601
607
602
// / Walk the specified region of the CFG and hoist loop invariants out to the
608
603
// / preheader.
609
- void MachineLICMImpl::HoistRegionPostRA (MachineLoop *CurLoop,
610
- MachineBasicBlock *CurPreheader) {
611
- MachineBasicBlock *Preheader = getCurPreheader (CurLoop, CurPreheader);
604
+ void MachineLICMImpl::HoistRegionPostRA (MachineLoop *CurLoop) {
605
+ MachineBasicBlock *Preheader = getOrCreatePreheader (CurLoop);
612
606
if (!Preheader)
613
607
return ;
614
608
@@ -702,7 +696,7 @@ void MachineLICMImpl::HoistRegionPostRA(MachineLoop *CurLoop,
702
696
}
703
697
704
698
if (Safe)
705
- HoistPostRA (MI, Candidate.Def , CurLoop, CurPreheader );
699
+ HoistPostRA (MI, Candidate.Def , CurLoop);
706
700
}
707
701
}
708
702
@@ -726,9 +720,8 @@ void MachineLICMImpl::AddToLiveIns(MCRegister Reg, MachineLoop *CurLoop) {
726
720
// / When an instruction is found to only use loop invariant operands that is
727
721
// / safe to hoist, this instruction is called to do the dirty work.
728
722
void MachineLICMImpl::HoistPostRA (MachineInstr *MI, Register Def,
729
- MachineLoop *CurLoop,
730
- MachineBasicBlock *CurPreheader) {
731
- MachineBasicBlock *Preheader = getCurPreheader (CurLoop, CurPreheader);
723
+ MachineLoop *CurLoop) {
724
+ MachineBasicBlock *Preheader = CurLoop->getLoopPreheader ();
732
725
733
726
// Now move the instructions to the predecessor, inserting it before any
734
727
// terminator instructions.
@@ -831,9 +824,8 @@ void MachineLICMImpl::ExitScopeIfDone(
831
824
// / order w.r.t the DominatorTree. This allows us to visit definitions before
832
825
// / uses, allowing us to hoist a loop body in one pass without iteration.
833
826
void MachineLICMImpl::HoistOutOfLoop (MachineDomTreeNode *HeaderN,
834
- MachineLoop *CurLoop,
835
- MachineBasicBlock *CurPreheader) {
836
- MachineBasicBlock *Preheader = getCurPreheader (CurLoop, CurPreheader);
827
+ MachineLoop *CurLoop) {
828
+ MachineBasicBlock *Preheader = getOrCreatePreheader (CurLoop);
837
829
if (!Preheader)
838
830
return ;
839
831
@@ -1714,34 +1706,23 @@ unsigned MachineLICMImpl::Hoist(MachineInstr *MI, MachineBasicBlock *Preheader,
1714
1706
}
1715
1707
1716
1708
// / Get the preheader for the current loop, splitting a critical edge if needed.
1717
- MachineBasicBlock *
1718
- MachineLICMImpl::getCurPreheader (MachineLoop *CurLoop,
1719
- MachineBasicBlock *CurPreheader) {
1709
+ MachineBasicBlock *MachineLICMImpl::getOrCreatePreheader (MachineLoop *CurLoop) {
1720
1710
// Determine the block to which to hoist instructions. If we can't find a
1721
1711
// suitable loop predecessor, we can't do any hoisting.
1722
-
1723
- // If we've tried to get a preheader and failed, don't try again.
1724
- if (CurPreheader == reinterpret_cast <MachineBasicBlock *>(-1 ))
1725
- return nullptr ;
1726
-
1727
- if (!CurPreheader) {
1728
- CurPreheader = CurLoop->getLoopPreheader ();
1729
- if (!CurPreheader) {
1730
- MachineBasicBlock *Pred = CurLoop->getLoopPredecessor ();
1731
- if (!Pred) {
1732
- CurPreheader = reinterpret_cast <MachineBasicBlock *>(-1 );
1733
- return nullptr ;
1734
- }
1735
-
1736
- CurPreheader = Pred->SplitCriticalEdge (CurLoop->getHeader (), LegacyPass,
1737
- MFAM, nullptr , MDTU);
1738
- if (!CurPreheader) {
1739
- CurPreheader = reinterpret_cast <MachineBasicBlock *>(-1 );
1740
- return nullptr ;
1741
- }
1742
- }
1712
+ if (MachineBasicBlock *Preheader = CurLoop->getLoopPreheader ())
1713
+ return Preheader;
1714
+
1715
+ // Try forming a preheader by splitting the critical edge between the single
1716
+ // predecessor and the loop header.
1717
+ if (MachineBasicBlock *Pred = CurLoop->getLoopPredecessor ()) {
1718
+ MachineBasicBlock *NewPreheader = Pred->SplitCriticalEdge (
1719
+ CurLoop->getHeader (), LegacyPass, MFAM, nullptr , MDTU);
1720
+ if (NewPreheader)
1721
+ Changed = true ;
1722
+ return NewPreheader;
1743
1723
}
1744
- return CurPreheader;
1724
+
1725
+ return nullptr ;
1745
1726
}
1746
1727
1747
1728
// / Is the target basic block at least "BlockFrequencyRatioThreshold"
0 commit comments