[llvm] [CodeGen] [EarlyIfConversion] Prioritize conversion of hard to predict branches (PR #174457)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 27 12:52:55 PST 2026
================
@@ -896,6 +916,109 @@ void EarlyIfConverter::invalidateTraces() {
Traces->verifyAnalysis();
}
+static bool isConstantPoolLoad(const MachineInstr *MI) {
+ if (!MI->mayLoad())
+ return false;
+
+ return any_of(MI->memoperands(), [](MachineMemOperand *MOp) {
+ const PseudoSourceValue *PSV = MOp->getPseudoValue();
+ return PSV && PSV->isConstantPool();
+ });
+
+ return false;
+}
+
+/// Check if a register's value comes from a memory load by walking the
+/// def-use chain. We want to prioritize converting branches which
+/// depend on values loaded from memory (unless they are loop invariant,
+/// or come from a constant pool).
+bool EarlyIfConverter::doOperandsComeFromMemory(Register Reg) {
+ if (!Reg.isVirtual())
+ return false;
+
+ // Walk the def-use chain.
+ SmallPtrSet<const MachineInstr *, 8> VisitedInstrs;
+ SmallVector<const MachineInstr *> Worklist;
+ SmallVector<Register, 16> VisitedRegs;
+
+ MachineInstr *DefMI = MRI->getVRegDef(Reg);
+ // The operand is defined outside of the function - it does not
+ // come from memory access.
+ if (!DefMI)
+ return false;
+
+ // Get the loop containing the branch to ensure we only consider loads
+ // that are "recent" in program time (i.e., in the same loop iteration).
----------------
fhahn wrote:
If that works, it would be good to limit the initial scope
https://github.com/llvm/llvm-project/pull/174457
More information about the llvm-commits
mailing list