[llvm] [FMV][GlobalOpt] Add an option for static resolution of non-FMV callers. (PR #123757)
Alexandros Lamprineas via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 21 06:40:22 PST 2025
https://github.com/labrinea created https://github.com/llvm/llvm-project/pull/123757
Adds `optimize-non-fmv-callers` (disabled by default) as a short term workaround to keep the llvm testsuite bots green, until we decide what is the right solution for the problem which was previously addressed with https://github.com/llvm/llvm-project/pull/123383.
>From ae67a097e81016c491f7f2ea2fa0a9cfd55e1f52 Mon Sep 17 00:00:00 2001
From: Alexandros Lamprineas <alexandros.lamprineas at arm.com>
Date: Tue, 21 Jan 2025 13:55:59 +0000
Subject: [PATCH] [FMV][GlobalOpt] Add an option for static resolution of
non-FMV callers.
Adds `optimize-non-fmv-callers` (disabled by default) as a short term
workaround to keep the llvm testsuite bots green, until we decide what
is the right solution for the problem which was previously addressed
with https://github.com/llvm/llvm-project/pull/123383.
---
llvm/lib/Transforms/IPO/GlobalOpt.cpp | 35 ++++++++++++++++++---------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index eb97d8b4a74f35..00c20ad5f37094 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -95,6 +95,21 @@ STATISTIC(NumIFuncsDeleted, "Number of IFuncs removed");
STATISTIC(NumGlobalArraysPadded,
"Number of global arrays padded to alignment boundary");
+// FIXME:
+// Optimizing non-FMV callers is causing a regression in the llvm test suite,
+// specifically a 'predres' version is unexpectedly trapping on GravitonG4.
+// My explanation is that when the caller in not a versioned function, the
+// compiler exclusively relies on the command line option, or target attribute
+// to deduce whether a feature is available. However, there is no guarantee
+// that in reality the host supports those implied features, which arguably
+// is a user error. This option allows disabling the optimization as a short
+// term workaround to keep the bots green.
+static cl::opt<bool>
+ OptimizeNonFMVCallers("optimize-non-fmv-callers",
+ cl::desc("Statically resolve calls to versioned "
+ "functions from non-versioned callers."),
+ cl::init(false), cl::Hidden);
+
static cl::opt<bool>
EnableColdCCStressTest("enable-coldcc-stress-test",
cl::desc("Enable stress test of coldcc by adding "
@@ -2715,6 +2730,9 @@ static bool OptimizeNonTrivialIFuncs(
assert(!Callees.empty() && "Expecting successful collection of versions");
+ LLVM_DEBUG(dbgs() << "Statically resolving calls to function "
+ << Resolver->getName() << "\n");
+
// Cache the feature mask for each callee.
for (Function *Callee : Callees) {
auto [It, Inserted] = FeatureMask.try_emplace(Callee);
@@ -2785,20 +2803,15 @@ static bool OptimizeNonTrivialIFuncs(
} else {
// We can't reason much about non-FMV callers. Just pick the highest
// priority callee if it matches, otherwise bail.
- // if (I > 0 || !implies(CallerBits, CalleeBits))
- //
- // FIXME: This is causing a regression in the llvm test suite,
- // specifically a 'predres' version is unexpectedly trapping on
- // GravitonG4. My explanation is that when the caller in not a
- // versioned function, the compiler exclusively relies on the
- // command line option, or target attribute to deduce whether a
- // feature is available. However, there is no guarantee that in
- // reality the host supports those implied features.
- continue;
+ if (!OptimizeNonFMVCallers || I > 0 || !implies(CallerBits, CalleeBits))
+ continue;
}
auto &Calls = CallSites[Caller];
- for (CallBase *CS : Calls)
+ for (CallBase *CS : Calls) {
+ LLVM_DEBUG(dbgs() << "Redirecting call " << Caller->getName() << " -> "
+ << Callee->getName() << "\n");
CS->setCalledOperand(Callee);
+ }
Changed = true;
}
if (IF.use_empty() ||
More information about the llvm-commits
mailing list