[llvm] [LLVM] Add flatten function attribute to LLVM IR and implement recursive inlining in AlwaysInliner (PR #174899)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 2 11:59:31 PST 2026
================
@@ -99,11 +110,78 @@ bool AlwaysInlineImpl(
}
}
+ // Flatten functions with the flatten attribute using a local worklist.
+ for (Function *F : NeedFlattening) {
+ SmallVector<std::pair<CallBase *, int>, 16> Worklist;
+ SmallVector<std::pair<Function *, int>, 16> InlineHistory;
+ SmallVector<CallBase *> NewCallSites;
+ OptimizationRemarkEmitter ORE(F);
+
+ // Collect initial calls.
+ for (BasicBlock &BB : *F) {
+ for (Instruction &I : BB) {
+ if (auto *CB = dyn_cast<CallBase>(&I)) {
+ if (CB->getAttributes().hasFnAttr(Attribute::NoInline))
+ continue;
+ Function *Callee = CB->getCalledFunction();
+ if (!Callee || Callee->isDeclaration())
+ continue;
+ Worklist.push_back({CB, -1});
+ }
+ }
+ }
+
+ while (!Worklist.empty()) {
+ auto Item = Worklist.pop_back_val();
+ CallBase *CB = Item.first;
+ int InlineHistoryID = Item.second;
----------------
nikic wrote:
```suggestion
auto [CB, InlineHistoryID] = Worklist.pop_back_val();
```
https://github.com/llvm/llvm-project/pull/174899
More information about the llvm-commits
mailing list