[llvm] [AArch64LoadStoreOpt] BaseReg update is searched also in CF successor (PR #145583)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 29 13:15:01 PDT 2025
================
@@ -2529,30 +2529,63 @@ MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnForward(
return E;
}
- for (unsigned Count = 0; MBBI != E && Count < Limit;
- MBBI = next_nodbg(MBBI, E)) {
- MachineInstr &MI = *MBBI;
-
- // Don't count transient instructions towards the search limit since there
- // may be different numbers of them if e.g. debug information is present.
- if (!MI.isTransient())
- ++Count;
-
- // If we found a match, return it.
- if (isMatchingUpdateInsn(*I, MI, BaseReg, UnscaledOffset))
- return MBBI;
-
- // Update the status of what the instruction clobbered and used.
- LiveRegUnits::accumulateUsedDefed(MI, ModifiedRegUnits, UsedRegUnits, TRI);
+ MachineBasicBlock *CurMBB = I->getParent();
+ // choice of next block to visit is liveins-based
+ bool VisitSucc = CurMBB->getParent()->getRegInfo().tracksLiveness();
+
+ while (true) {
+ MachineBasicBlock::iterator CurEnd = CurMBB->end();
+
+ for (unsigned Count = 0; MBBI != CurEnd && Count < Limit;
+ MBBI = next_nodbg(MBBI, CurEnd)) {
+ MachineInstr &MI = *MBBI;
+
+ // Don't count transient instructions towards the search limit since there
+ // may be different numbers of them if e.g. debug information is present.
+ if (!MI.isTransient())
+ ++Count;
+
+ // If we found a match, return it.
+ if (isMatchingUpdateInsn(*I, MI, BaseReg, UnscaledOffset))
+ return MBBI;
+
+ // Update the status of what the instruction clobbered and used.
+ LiveRegUnits::accumulateUsedDefed(MI, ModifiedRegUnits, UsedRegUnits,
+ TRI);
+
+ // Otherwise, if the base register is used or modified, we have no match,
+ // so return early. If we are optimizing SP, do not allow instructions
+ // that may load or store in between the load and the optimized value
+ // update.
+ if (!ModifiedRegUnits.available(BaseReg) ||
+ !UsedRegUnits.available(BaseReg) ||
+ (BaseRegSP && MBBI->mayLoadOrStore()))
+ return E;
+ }
- // Otherwise, if the base register is used or modified, we have no match, so
- // return early.
- // If we are optimizing SP, do not allow instructions that may load or store
- // in between the load and the optimized value update.
- if (!ModifiedRegUnits.available(BaseReg) ||
- !UsedRegUnits.available(BaseReg) ||
- (BaseRegSP && MBBI->mayLoadOrStore()))
- return E;
+ if (VisitSucc) {
+ // Try to go downward to successors along a CF path w/o side enters
+ // such that BaseReg is alive along it but not at its exits
+ MachineBasicBlock *SuccToVisit = nullptr;
+ unsigned LiveSuccCount = 0;
+ for (MachineBasicBlock *Succ : CurMBB->successors()) {
+ if (Succ->isLiveIn(BaseReg)) {
+ if (LiveSuccCount++) {
----------------
davemgreen wrote:
`if (SuccToVisit)`
Then you can remove LiveSuccCount?
https://github.com/llvm/llvm-project/pull/145583
More information about the llvm-commits
mailing list