[llvm] [FunctionAttrs] deduce attr `cold` on functions if all CG paths call a `cold` function (PR #101298)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 11 10:03:32 PDT 2024
================
@@ -1760,6 +1762,70 @@ static void addNoReturnAttrs(const SCCNodeSet &SCCNodes,
}
}
+static bool
+allBBPathsGoThroughCold(BasicBlock *BB,
+ SmallDenseMap<BasicBlock *, bool, 16> &Visited) {
+ // If BB contains a cold callsite this path through the CG is cold.
+ if (any_of(*BB, [](Instruction &I) {
+ if (auto *CB = dyn_cast<CallBase>(&I))
+ return CB->hasFnAttr(Attribute::Cold);
+ return false;
+ })) {
+ Visited[BB] = true;
+ return true;
+ }
+
+ auto Succs = successors(BB);
+ // We found a path that doesn't go through any cold callsite.
+ if (Succs.empty())
+ return false;
+
+ // We didn't find a cold callsite in this BB, so check that all successors
+ // contain a cold callsite (or that their successors do).
+ // Potential TODO: We could use static branch hints to assume certain
+ // successor paths are inherently cold, irrespective of if they contain a cold
+ // callsite.
+ for (auto *Succ : Succs) {
+ // Start with false, this is necessary to ensure we don't turn loops into
+ // cold.
+ auto R = Visited.try_emplace(Succ, false);
+ if (!R.second) {
+ if (R.first->second)
+ continue;
+ return false;
+ }
+ if (!allBBPathsGoThroughCold(Succ, Visited))
+ return false;
+ Visited[Succ] = true;
+ }
+
+ return true;
+}
+
+static bool allPathsGoThroughCold(Function &F) {
+ SmallDenseMap<BasicBlock *, bool, 16> Visited;
+ Visited[&F.front()] = false;
+ return allBBPathsGoThroughCold(&F.front(), Visited);
+}
+
+// Set the cold function attribute if possible.
+static void addColdAttrs(const SCCNodeSet &SCCNodes,
+ SmallSet<Function *, 8> &Changed) {
+ for (Function *F : SCCNodes) {
+ if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) ||
+ F->hasFnAttribute(Attribute::Cold) || F->hasFnAttribute(Attribute::Hot))
+ continue;
+
+ // Potential TODO: We could add attribute `cold` on functions with `coldcc`.
----------------
goldsteinn wrote:
Hmm, this is the other way around where we are `coldcc` to functions. The todo is saying add attribute `cold` on functions that have `coldcc`.
https://github.com/llvm/llvm-project/pull/101298
More information about the llvm-commits
mailing list