[llvm] [NFC] Refactor looping over recomputeLiveIns into function (PR #88040)
Kai Nacke via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 15 13:52:45 PDT 2024
https://github.com/redstar updated https://github.com/llvm/llvm-project/pull/88040
>From 7d7486a69e21a72ef2810328d258e103b73b3738 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Mon, 8 Apr 2024 20:52:22 +0000
Subject: [PATCH 1/3] [NFC] Refactor looping over recomputeLiveIns into
function
https://github.com/llvm/llvm-project/pull/79940 put calls to recomputeLiveIns into
a loop, to repeatedly call the function until the computation converges. However,
this repeats a lot of code. This changes moves the loop into a function to simplify
the handling.
Note that this changes the order in which recomputeLiveIns is called. For example,
```
bool anyChange = false;
do {
anyChange = recomputeLiveIns(*ExitMBB) || recomputeLiveIns(*LoopMBB);
} while (anyChange);
```
only begins to recompute the live-ins for LoopMBB after the computation for ExitMBB
has converged. With this change, all basic blocks have a recomputation of the live-ins
for each loop iteration. This can result in less or more calls, depending on the
situation.
---
llvm/include/llvm/CodeGen/LivePhysRegs.h | 14 ++++++++++++++
llvm/lib/CodeGen/BranchFolding.cpp | 8 ++------
llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 5 +----
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 11 ++---------
llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp | 8 +-------
.../Target/PowerPC/PPCExpandAtomicPseudoInsts.cpp | 11 ++---------
llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 11 ++---------
llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | 10 ++--------
llvm/lib/Target/X86/X86FrameLowering.cpp | 11 ++---------
9 files changed, 28 insertions(+), 61 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/LivePhysRegs.h b/llvm/include/llvm/CodeGen/LivePhysRegs.h
index 1d40b1cbb0eaa3..a2447e7702c77f 100644
--- a/llvm/include/llvm/CodeGen/LivePhysRegs.h
+++ b/llvm/include/llvm/CodeGen/LivePhysRegs.h
@@ -39,6 +39,8 @@
namespace llvm {
+template <typename T> class ArrayRef;
+
class MachineInstr;
class MachineFunction;
class MachineOperand;
@@ -207,6 +209,18 @@ static inline bool recomputeLiveIns(MachineBasicBlock &MBB) {
return oldLiveIns != newLiveIns;
}
+/// Convenience function for recomputing live-in's for a set of MBBs until the
+/// computation converges.
+static inline void
+fullyRecomputeLiveIns(ArrayRef<MachineBasicBlock *> MBBs) {
+ bool AnyChange;
+ do {
+ AnyChange = false;
+ for (MachineBasicBlock *MBB : MBBs)
+ AnyChange = recomputeLiveIns(*MBB) || AnyChange;
+ } while (AnyChange);
+}
+
} // end namespace llvm
#endif // LLVM_CODEGEN_LIVEPHYSREGS_H
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
index ecf7bc30913f51..55aa1d438b2a66 100644
--- a/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/llvm/lib/CodeGen/BranchFolding.cpp
@@ -2047,12 +2047,8 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
MBB->splice(Loc, TBB, TBB->begin(), TIB);
FBB->erase(FBB->begin(), FIB);
- if (UpdateLiveIns) {
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*TBB) || recomputeLiveIns(*FBB);
- } while (anyChange);
- }
+ if (UpdateLiveIns)
+ fullyRecomputeLiveIns({TBB, FBB});
++NumHoist;
return true;
diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
index 5cc612e89162af..419c141121c325 100644
--- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
@@ -4325,10 +4325,7 @@ AArch64FrameLowering::inlineStackProbeLoopExactMultiple(
ExitMBB->transferSuccessorsAndUpdatePHIs(&MBB);
MBB.addSuccessor(LoopMBB);
// Update liveins.
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ExitMBB) || recomputeLiveIns(*LoopMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({ExitMBB, LoopMBB});
return ExitMBB->begin();
}
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 92647cb405252f..9518d573bccdd1 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -9556,15 +9556,8 @@ AArch64InstrInfo::probedStackAlloc(MachineBasicBlock::iterator MBBI,
MBB.addSuccessor(LoopTestMBB);
// Update liveins.
- if (MF.getRegInfo().reservedRegsFrozen()) {
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ExitMBB) ||
- recomputeLiveIns(*LoopBodyMBB) ||
- recomputeLiveIns(*LoopTestMBB);
- } while (anyChange);
- ;
- }
+ if (MF.getRegInfo().reservedRegsFrozen())
+ fullyRecomputeLiveIns({ExitMBB, LoopBodyMBB, LoopTestMBB});
return ExitMBB->begin();
}
diff --git a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
index 8629551152cb64..ea5dd5427ce720 100644
--- a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
+++ b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
@@ -1806,13 +1806,7 @@ void ARMLowOverheadLoops::Expand(LowOverheadLoop &LoLoop) {
PostOrderLoopTraversal DFS(LoLoop.ML, *MLI);
DFS.ProcessLoop();
const SmallVectorImpl<MachineBasicBlock*> &PostOrder = DFS.getOrder();
- bool anyChange = false;
- do {
- anyChange = false;
- for (auto *MBB : PostOrder) {
- anyChange = recomputeLiveIns(*MBB) || anyChange;
- }
- } while (anyChange);
+ fullyRecomputeLiveIns(PostOrder);
for (auto *MBB : reverse(PostOrder))
recomputeLivenessFlags(*MBB);
diff --git a/llvm/lib/Target/PowerPC/PPCExpandAtomicPseudoInsts.cpp b/llvm/lib/Target/PowerPC/PPCExpandAtomicPseudoInsts.cpp
index b43eee8fdd8c0f..b3cfcb2aa14405 100644
--- a/llvm/lib/Target/PowerPC/PPCExpandAtomicPseudoInsts.cpp
+++ b/llvm/lib/Target/PowerPC/PPCExpandAtomicPseudoInsts.cpp
@@ -208,10 +208,7 @@ bool PPCExpandAtomicPseudo::expandAtomicRMW128(
.addMBB(LoopMBB);
CurrentMBB->addSuccessor(LoopMBB);
CurrentMBB->addSuccessor(ExitMBB);
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ExitMBB) || recomputeLiveIns(*LoopMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({ExitMBB, LoopMBB});
NMBBI = MBB.end();
MI.eraseFromParent();
return true;
@@ -288,11 +285,7 @@ bool PPCExpandAtomicPseudo::expandAtomicCmpSwap128(
CurrentMBB->addSuccessor(LoopCmpMBB);
CurrentMBB->addSuccessor(ExitMBB);
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ExitMBB) || recomputeLiveIns(*CmpSuccMBB) ||
- recomputeLiveIns(*LoopCmpMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({ExitMBB, CmpSuccMBB, LoopCmpMBB});
NMBBI = MBB.end();
MI.eraseFromParent();
return true;
diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
index 6dcb59a3a57f85..04e9f9e2366edd 100644
--- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
@@ -1435,11 +1435,7 @@ void PPCFrameLowering::inlineStackProbe(MachineFunction &MF,
ProbeLoopBodyMBB->addSuccessor(ProbeLoopBodyMBB);
}
// Update liveins.
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ProbeExitMBB) ||
- recomputeLiveIns(*ProbeLoopBodyMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({ProbeExitMBB, ProbeLoopBodyMBB});
return ProbeExitMBB;
};
// For case HasBP && MaxAlign > 1, we have to realign the SP by performing
@@ -1531,10 +1527,7 @@ void PPCFrameLowering::inlineStackProbe(MachineFunction &MF,
buildDefCFAReg(*ExitMBB, ExitMBB->begin(), SPReg);
}
// Update liveins.
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*ExitMBB) || recomputeLiveIns(*LoopMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({ExitMBB, LoopMBB});
}
}
++NumPrologProbed;
diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
index 4897b37d8eb1ef..50ecd6e0744147 100644
--- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
@@ -824,10 +824,7 @@ void SystemZELFFrameLowering::inlineStackProbe(
StackAllocMI->eraseFromParent();
if (DoneMBB != nullptr) {
// Compute the live-in lists for the new blocks.
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*DoneMBB) || recomputeLiveIns(*LoopMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({DoneMBB, LoopMBB});
}
}
@@ -1425,10 +1422,7 @@ void SystemZXPLINKFrameLowering::inlineStackProbe(
StackAllocMI->eraseFromParent();
// Compute the live-in lists for the new blocks.
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*StackExtMBB) || recomputeLiveIns(*NextMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({StackExtMBB, NextMBB});
}
bool SystemZXPLINKFrameLowering::hasFP(const MachineFunction &MF) const {
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index d914e1b61ab075..4521401d8741c7 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -885,10 +885,7 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
}
// Update Live In information
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*tailMBB) || recomputeLiveIns(*testMBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({tailMBB, testMBB});
}
void X86FrameLowering::emitStackProbeInlineWindowsCoreCLR64(
@@ -1380,11 +1377,7 @@ void X86FrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
footMBB->addSuccessor(&MBB);
}
- bool anyChange = false;
- do {
- anyChange = recomputeLiveIns(*footMBB) || recomputeLiveIns(*bodyMBB) ||
- recomputeLiveIns(*headMBB) || recomputeLiveIns(MBB);
- } while (anyChange);
+ fullyRecomputeLiveIns({footMBB, bodyMBB, headMBB, &MBB});
}
} else {
MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(AndOp), Reg)
>From 2bb10d2eae34990e5c3c4374414a806641c0fcbf Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Mon, 15 Apr 2024 13:50:14 +0000
Subject: [PATCH 2/3] Remove static keyword
as suggested by review comment.
---
llvm/include/llvm/CodeGen/LivePhysRegs.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/CodeGen/LivePhysRegs.h b/llvm/include/llvm/CodeGen/LivePhysRegs.h
index a2447e7702c77f..329503a0b33b1e 100644
--- a/llvm/include/llvm/CodeGen/LivePhysRegs.h
+++ b/llvm/include/llvm/CodeGen/LivePhysRegs.h
@@ -211,7 +211,7 @@ static inline bool recomputeLiveIns(MachineBasicBlock &MBB) {
/// Convenience function for recomputing live-in's for a set of MBBs until the
/// computation converges.
-static inline void
+inline void
fullyRecomputeLiveIns(ArrayRef<MachineBasicBlock *> MBBs) {
bool AnyChange;
do {
>From c722f4728e13e22b4896131f5dc0bc8094c09494 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Mon, 15 Apr 2024 20:52:02 +0000
Subject: [PATCH 3/3] Remove all the syntactic sugar.
---
llvm/include/llvm/CodeGen/LivePhysRegs.h | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/LivePhysRegs.h b/llvm/include/llvm/CodeGen/LivePhysRegs.h
index 329503a0b33b1e..9574a6f0c7c005 100644
--- a/llvm/include/llvm/CodeGen/LivePhysRegs.h
+++ b/llvm/include/llvm/CodeGen/LivePhysRegs.h
@@ -211,16 +211,20 @@ static inline bool recomputeLiveIns(MachineBasicBlock &MBB) {
/// Convenience function for recomputing live-in's for a set of MBBs until the
/// computation converges.
-inline void
-fullyRecomputeLiveIns(ArrayRef<MachineBasicBlock *> MBBs) {
- bool AnyChange;
- do {
- AnyChange = false;
- for (MachineBasicBlock *MBB : MBBs)
- AnyChange = recomputeLiveIns(*MBB) || AnyChange;
- } while (AnyChange);
+inline void fullyRecomputeLiveIns(ArrayRef<MachineBasicBlock *> MBBs) {
+ MachineBasicBlock *const *Data = MBBs.data();
+ const size_t Len = MBBs.size();
+ while (true) {
+ bool AnyChange = false;
+ for (size_t I = 0; I < Len; ++I)
+ if (recomputeLiveIns(*Data[I]))
+ AnyChange = true;
+ if (!AnyChange)
+ return;
+ }
}
+
} // end namespace llvm
#endif // LLVM_CODEGEN_LIVEPHYSREGS_H
More information about the llvm-commits
mailing list