[llvm] c94e6c0 - [NFC][AArch64] Extract helper functions in AArch64ConditionOptimizer (#182197)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 19 01:53:19 PST 2026
Author: Hussam A.
Date: 2026-02-19T09:53:14Z
New Revision: c94e6c0a0cb7143d2872dad7c13decb7664d2d2a
URL: https://github.com/llvm/llvm-project/commit/c94e6c0a0cb7143d2872dad7c13decb7664d2d2a
DIFF: https://github.com/llvm/llvm-project/commit/c94e6c0a0cb7143d2872dad7c13decb7664d2d2a.diff
LOG: [NFC][AArch64] Extract helper functions in AArch64ConditionOptimizer (#182197)
Extract shared logic between the cross- and intra-block paths into new
helper functions
Added:
Modified:
llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
index f428252e143ba..311cb1800cc39 100644
--- a/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp
@@ -115,6 +115,8 @@ class AArch64ConditionOptimizer : public MachineFunctionPass {
AArch64ConditionOptimizer() : MachineFunctionPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const override;
+ bool registersMatch(MachineInstr *FirstMI, MachineInstr *SecondMI);
+ bool nzcvLivesOut(MachineBasicBlock *MBB);
MachineInstr *findSuitableCompare(MachineBasicBlock *MBB);
CmpInfo adjustCmp(MachineInstr *CmpMI, AArch64CC::CondCode Cmp);
void modifyCmp(MachineInstr *CmpMI, const CmpInfo &Info);
@@ -150,6 +152,36 @@ void AArch64ConditionOptimizer::getAnalysisUsage(AnalysisUsage &AU) const {
MachineFunctionPass::getAnalysisUsage(AU);
}
+// Ensure both compare MIs use the same register, tracing through copies.
+bool AArch64ConditionOptimizer::registersMatch(MachineInstr *FirstMI,
+ MachineInstr *SecondMI) {
+ Register FirstReg = FirstMI->getOperand(1).getReg();
+ Register SecondReg = SecondMI->getOperand(1).getReg();
+ Register FirstCmpReg =
+ FirstReg.isVirtual() ? TRI->lookThruCopyLike(FirstReg, MRI) : FirstReg;
+ Register SecondCmpReg =
+ SecondReg.isVirtual() ? TRI->lookThruCopyLike(SecondReg, MRI) : SecondReg;
+ if (FirstCmpReg != SecondCmpReg) {
+ LLVM_DEBUG(dbgs() << "CMPs compare
diff erent registers\n");
+ return false;
+ }
+
+ return true;
+}
+
+// Check if NZCV lives out to any successor block.
+bool AArch64ConditionOptimizer::nzcvLivesOut(MachineBasicBlock *MBB) {
+ for (auto *SuccBB : MBB->successors()) {
+ if (SuccBB->isLiveIn(AArch64::NZCV)) {
+ LLVM_DEBUG(dbgs() << "NZCV live into successor "
+ << printMBBReference(*SuccBB) << " from "
+ << printMBBReference(*MBB) << '\n');
+ return true;
+ }
+ }
+ return false;
+}
+
// Finds compare instruction that corresponds to supported types of branching.
// Returns the instruction or nullptr on failures or detecting unsupported
// instructions.
@@ -163,9 +195,8 @@ MachineInstr *AArch64ConditionOptimizer::findSuitableCompare(
return nullptr;
// Since we may modify cmp of this MBB, make sure NZCV does not live out.
- for (auto *SuccBB : MBB->successors())
- if (SuccBB->isLiveIn(AArch64::NZCV))
- return nullptr;
+ if (nzcvLivesOut(MBB))
+ return nullptr;
// Now find the instruction controlling the terminator.
for (MachineBasicBlock::iterator B = MBB->begin(), It = Term; It != B;) {
@@ -394,10 +425,12 @@ bool AArch64ConditionOptimizer::optimizeIntraBlock(MachineBasicBlock &MBB) {
return false;
}
- if (FirstCmp->getOperand(1).getReg() != SecondCmp->getOperand(1).getReg()) {
- LLVM_DEBUG(dbgs() << "CMPs compare
diff erent registers\n");
+ // Since we may modify cmps in this MBB, make sure NZCV does not live out.
+ if (nzcvLivesOut(&MBB))
+ return false;
+
+ if (!registersMatch(FirstCmp, SecondCmp))
return false;
- }
if (!isPureCmp(*FirstCmp) || !isPureCmp(*SecondCmp)) {
LLVM_DEBUG(dbgs() << "One or both CMPs are not pure\n");
@@ -424,11 +457,6 @@ bool AArch64ConditionOptimizer::optimizeIntraBlock(MachineBasicBlock &MBB) {
}
}
- // Since we may modify a cmp in this MBB, make sure NZCV does not live out.
- for (auto *SuccBB : MBB.successors())
- if (SuccBB->isLiveIn(AArch64::NZCV))
- return false;
-
// Extract condition codes from both CSINCs (operand 3)
AArch64CC::CondCode FirstCond =
(AArch64CC::CondCode)(int)FirstCSINC->getOperand(3).getImm();
@@ -508,15 +536,7 @@ bool AArch64ConditionOptimizer::optimizeCrossBlock(MachineBasicBlock &HBB) {
return false;
}
- // Ensure both compares use the same register, tracing through copies.
- Register HeadReg = HeadCmpMI->getOperand(1).getReg();
- Register TrueReg = TrueCmpMI->getOperand(1).getReg();
- Register HeadCmpReg =
- HeadReg.isVirtual() ? TRI->lookThruCopyLike(HeadReg, MRI) : HeadReg;
- Register TrueCmpReg =
- TrueReg.isVirtual() ? TRI->lookThruCopyLike(TrueReg, MRI) : TrueReg;
- if (HeadCmpReg != TrueCmpReg) {
- LLVM_DEBUG(dbgs() << "CMPs compare
diff erent registers\n");
+ if (!registersMatch(HeadCmpMI, TrueCmpMI)) {
return false;
}
More information about the llvm-commits
mailing list