LLVM 24.0.0git
MergeFunctions.cpp
Go to the documentation of this file.
1//===- MergeFunctions.cpp - Merge identical functions ---------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass looks for equivalent functions that are mergable and folds them.
10//
11// Order relation is defined on set of functions. It was made through
12// special function comparison procedure that returns
13// 0 when functions are equal,
14// -1 when Left function is less than right function, and
15// 1 for opposite case. We need total-ordering, so we need to maintain
16// four properties on the functions set:
17// a <= a (reflexivity)
18// if a <= b and b <= a then a = b (antisymmetry)
19// if a <= b and b <= c then a <= c (transitivity).
20// for all a and b: a <= b or b <= a (totality).
21//
22// Comparison iterates through each instruction in each basic block.
23// Functions are kept on binary tree. For each new function F we perform
24// lookup in binary tree.
25// In practice it works the following way:
26// -- We define Function* container class with custom "operator<" (FunctionPtr).
27// -- "FunctionPtr" instances are stored in std::set collection, so every
28// std::set::insert operation will give you result in log(N) time.
29//
30// As an optimization, a hash of the function structure is calculated first, and
31// two functions are only compared if they have the same hash. This hash is
32// cheap to compute, and has the property that if function F == G according to
33// the comparison function, then hash(F) == hash(G). This consistency property
34// is critical to ensuring all possible merging opportunities are exploited.
35// Collisions in the hash affect the speed of the pass but not the correctness
36// or determinism of the resulting transformation.
37//
38// When a match is found the functions are folded. If both functions are
39// overridable, we move the functionality into a new internal function and
40// leave two overridable thunks to it.
41//
42//===----------------------------------------------------------------------===//
43//
44// Future work:
45//
46// * virtual functions.
47//
48// Many functions have their address taken by the virtual function table for
49// the object they belong to. However, as long as it's only used for a lookup
50// and call, this is irrelevant, and we'd like to fold such functions.
51//
52// * be smarter about bitcasts.
53//
54// In order to fold functions, we will sometimes add either bitcast instructions
55// or bitcast constant expressions. Unfortunately, this can confound further
56// analysis since the two functions differ where one has a bitcast and the
57// other doesn't. We should learn to look through bitcasts.
58//
59// * Compare complex types with pointer types inside.
60// * Compare cross-reference cases.
61// * Compare complex expressions.
62//
63// All the three issues above could be described as ability to prove that
64// fA == fB == fC == fE == fF == fG in example below:
65//
66// void fA() {
67// fB();
68// }
69// void fB() {
70// fA();
71// }
72//
73// void fE() {
74// fF();
75// }
76// void fF() {
77// fG();
78// }
79// void fG() {
80// fE();
81// }
82//
83// Simplest cross-reference case (fA <--> fB) was implemented in previous
84// versions of MergeFunctions, though it presented only in two function pairs
85// in test-suite (that counts >50k functions)
86// Though possibility to detect complex cross-referencing (e.g.: A->B->C->D->A)
87// could cover much more cases.
88//
89//===----------------------------------------------------------------------===//
90
92#include "llvm/ADT/APInt.h"
93#include "llvm/ADT/ArrayRef.h"
94#include "llvm/ADT/DenseMap.h"
95#include "llvm/ADT/DenseSet.h"
97#include "llvm/ADT/STLExtras.h"
99#include "llvm/ADT/Statistic.h"
102#include "llvm/IR/Argument.h"
103#include "llvm/IR/BasicBlock.h"
105#include "llvm/IR/DebugLoc.h"
106#include "llvm/IR/DerivedTypes.h"
107#include "llvm/IR/Function.h"
108#include "llvm/IR/GlobalValue.h"
109#include "llvm/IR/IRBuilder.h"
110#include "llvm/IR/InstrTypes.h"
111#include "llvm/IR/Instruction.h"
112#include "llvm/IR/Instructions.h"
114#include "llvm/IR/Metadata.h"
115#include "llvm/IR/Module.h"
116#include "llvm/IR/PassManager.h"
119#include "llvm/IR/Type.h"
120#include "llvm/IR/Use.h"
121#include "llvm/IR/User.h"
122#include "llvm/IR/Value.h"
123#include "llvm/IR/ValueHandle.h"
125#include "llvm/Support/Casting.h"
127#include "llvm/Support/Debug.h"
131#include "llvm/Transforms/IPO.h"
134#include <algorithm>
135#include <cassert>
136#include <cstddef>
137#include <cstdint>
138#include <iterator>
139#include <optional>
140#include <set>
141#include <utility>
142#include <vector>
143
144using namespace llvm;
145
146#define DEBUG_TYPE "mergefunc"
147
148STATISTIC(NumFunctionsMerged, "Number of functions merged");
149STATISTIC(NumThunksWritten, "Number of thunks generated");
150STATISTIC(NumAliasesWritten, "Number of aliases generated");
151STATISTIC(NumDoubleWeak, "Number of new functions created");
152
154 "mergefunc-verify",
155 cl::desc("How many functions in a module could be used for "
156 "MergeFunctions to pass a basic correctness check. "
157 "'0' disables this check. Works only with '-debug' key."),
158 cl::init(0), cl::Hidden);
159
160// Under option -mergefunc-preserve-debug-info we:
161// - Do not create a new function for a thunk.
162// - Retain the debug info for a thunk's parameters (and associated
163// instructions for the debug info) from the entry block.
164// Note: -debug will display the algorithm at work.
165// - Create debug-info for the call (to the shared implementation) made by
166// a thunk and its return value.
167// - Erase the rest of the function, retaining the (minimally sized) entry
168// block to create a thunk.
169// - Preserve a thunk's call site to point to the thunk even when both occur
170// within the same translation unit, to aid debugability. Note that this
171// behaviour differs from the underlying -mergefunc implementation which
172// modifies the thunk's call site to point to the shared implementation
173// when both occur within the same translation unit.
174static cl::opt<bool>
175 MergeFunctionsPDI("mergefunc-preserve-debug-info", cl::Hidden,
176 cl::init(false),
177 cl::desc("Preserve debug info in thunk when mergefunc "
178 "transformations are made."));
179
180static cl::opt<bool>
181 MergeFunctionsAliases("mergefunc-use-aliases", cl::Hidden,
182 cl::init(false),
183 cl::desc("Allow mergefunc to create aliases"));
184
185namespace {
186
187class FunctionNode {
188 mutable AssertingVH<Function> F;
189 stable_hash Hash;
190
191public:
192 // Note the hash is recalculated potentially multiple times, but it is cheap.
193 FunctionNode(Function *F) : F(F), Hash(StructuralHash(*F)) {}
194
195 Function *getFunc() const { return F; }
196 stable_hash getHash() const { return Hash; }
197
198 /// Replace the reference to the function F by the function G, assuming their
199 /// implementations are equal.
200 void replaceBy(Function *G) const {
201 F = G;
202 }
203};
204
205/// MergeFunctions finds functions which will generate identical machine code,
206/// by considering all pointer types to be equivalent. Once identified,
207/// MergeFunctions will fold them by replacing a call to one to a call to a
208/// bitcast of the other.
209class MergeFunctions {
210public:
211 explicit MergeFunctions(FunctionAnalysisManager &FAM)
212 : FnTree(FunctionNodeCmp(&GlobalNumbers)), FAM(FAM) {}
213
214 template <typename FuncContainer> bool run(FuncContainer &Functions);
215 DenseMap<Function *, Function *> runOnFunctions(ArrayRef<Function *> Funcs);
216
217 SmallPtrSet<GlobalValue *, 4> &getUsed();
218
219private:
220 // The function comparison operator is provided here so that FunctionNodes do
221 // not need to become larger with another pointer.
222 class FunctionNodeCmp {
223 GlobalNumberState* GlobalNumbers;
224
225 public:
226 FunctionNodeCmp(GlobalNumberState* GN) : GlobalNumbers(GN) {}
227
228 bool operator()(const FunctionNode &LHS, const FunctionNode &RHS) const {
229 // Order first by hashes, then full function comparison.
230 if (LHS.getHash() != RHS.getHash())
231 return LHS.getHash() < RHS.getHash();
232 FunctionComparator FCmp(LHS.getFunc(), RHS.getFunc(), GlobalNumbers);
233 return FCmp.compare() < 0;
234 }
235 };
236 using FnTreeType = std::set<FunctionNode, FunctionNodeCmp>;
237
238 GlobalNumberState GlobalNumbers;
239
240 /// A work queue of functions that may have been modified and should be
241 /// analyzed again.
242 std::vector<WeakTrackingVH> Deferred;
243
244 /// Set of values marked as used in llvm.used and llvm.compiler.used.
245 SmallPtrSet<GlobalValue *, 4> Used;
246
247#ifndef NDEBUG
248 /// Checks the rules of order relation introduced among functions set.
249 /// Returns true, if check has been passed, and false if failed.
250 bool doFunctionalCheck(std::vector<WeakTrackingVH> &Worklist);
251#endif
252
253 /// Insert a ComparableFunction into the FnTree, or merge it away if it's
254 /// equal to one that's already present.
255 bool insert(Function *NewFunction);
256
257 /// Remove a Function from the FnTree and queue it up for a second sweep of
258 /// analysis.
259 void remove(Function *F);
260
261 /// Find the functions that use this Value and remove them from FnTree and
262 /// queue the functions.
263 void removeUsers(Value *V);
264
265 /// Replace all direct calls of Old with calls of New. Will bitcast New if
266 /// necessary to make types match.
267 void replaceDirectCallers(Function *Old, Function *New);
268
269 /// Merge two equivalent functions. Upon completion, G may be deleted, or may
270 /// be converted into a thunk. In either case, it should never be visited
271 /// again.
272 void mergeTwoFunctions(Function *F, Function *G);
273
274 /// Merge \p Src's instruction-level annotations into the corresponding
275 /// instructions of \p Dst. \p Dst is the surviving function; \p Src will be
276 /// erased or rewritten after this call.
277 /// Both functions must be structurally identical.
278 void mergeInstrAnnotations(Function *Dst, Function *Src);
279
280 /// Fill PDIUnrelatedWL with instructions from the entry block that are
281 /// unrelated to parameter related debug info.
282 /// \param PDVRUnrelatedWL The equivalent non-intrinsic debug records.
283 void
284 filterInstsUnrelatedToPDI(BasicBlock *GEntryBlock,
285 std::vector<Instruction *> &PDIUnrelatedWL,
286 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL);
287
288 /// Erase the rest of the CFG (i.e. barring the entry block).
289 void eraseTail(Function *G);
290
291 /// Erase the instructions in PDIUnrelatedWL as they are unrelated to the
292 /// parameter debug info, from the entry block.
293 /// \param PDVRUnrelatedWL contains the equivalent set of non-instruction
294 /// debug-info records.
295 void
296 eraseInstsUnrelatedToPDI(std::vector<Instruction *> &PDIUnrelatedWL,
297 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL);
298
299 /// Replace G with a simple tail call to bitcast(F). Also (unless
300 /// MergeFunctionsPDI holds) replace direct uses of G with bitcast(F),
301 /// delete G.
302 void writeThunk(Function *F, Function *G);
303
304 // Replace G with an alias to F (deleting function G)
305 void writeAlias(Function *F, Function *G);
306
307 // If needed, replace G with an alias to F if possible, or a thunk to F if
308 // profitable. Returns false if neither is the case. If \p G is not needed
309 // (i.e. it is discardable and not used), \p G is removed directly.
310 bool writeThunkOrAliasIfNeeded(Function *F, Function *G);
311
312 /// Replace function F with function G in the function tree.
313 void replaceFunctionInTree(const FunctionNode &FN, Function *G);
314
315 /// The set of all distinct functions. Use the insert() and remove() methods
316 /// to modify it. The map allows efficient lookup and deferring of Functions.
317 FnTreeType FnTree;
318
319 // Map functions to the iterators of the FunctionNode which contains them
320 // in the FnTree. This must be updated carefully whenever the FnTree is
321 // modified, i.e. in insert(), remove(), and replaceFunctionInTree(), to avoid
322 // dangling iterators into FnTree. The invariant that preserves this is that
323 // there is exactly one mapping F -> FN for each FunctionNode FN in FnTree.
324 DenseMap<AssertingVH<Function>, FnTreeType::iterator> FNodesInTree;
325
326 /// Deleted-New functions mapping
327 DenseMap<Function *, Function *> DelToNewMap;
328
330};
331} // end anonymous namespace
332
339
340SmallPtrSet<GlobalValue *, 4> &MergeFunctions::getUsed() { return Used; }
341
343 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
344 MergeFunctions MF(FAM);
346 collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/false);
347 collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/true);
348 MF.getUsed().insert_range(UsedV);
349 return MF.run(M);
350}
351
355 if (Funcs.empty())
357
358 Module &M = *Funcs.front()->getParent();
359 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
360 MergeFunctions MF(FAM);
361 return MF.runOnFunctions(Funcs);
362}
363
364#ifndef NDEBUG
365bool MergeFunctions::doFunctionalCheck(std::vector<WeakTrackingVH> &Worklist) {
366 if (const unsigned Max = NumFunctionsForVerificationCheck) {
367 unsigned TripleNumber = 0;
368 bool Valid = true;
369
370 dbgs() << "MERGEFUNC-VERIFY: Started for first " << Max << " functions.\n";
371
372 unsigned i = 0;
373 for (std::vector<WeakTrackingVH>::iterator I = Worklist.begin(),
374 E = Worklist.end();
375 I != E && i < Max; ++I, ++i) {
376 unsigned j = i;
377 for (std::vector<WeakTrackingVH>::iterator J = I; J != E && j < Max;
378 ++J, ++j) {
379 Function *F1 = cast<Function>(*I);
380 Function *F2 = cast<Function>(*J);
381 int Res1 = FunctionComparator(F1, F2, &GlobalNumbers).compare();
382 int Res2 = FunctionComparator(F2, F1, &GlobalNumbers).compare();
383
384 // If F1 <= F2, then F2 >= F1, otherwise report failure.
385 if (Res1 != -Res2) {
386 dbgs() << "MERGEFUNC-VERIFY: Non-symmetric; triple: " << TripleNumber
387 << "\n";
388 dbgs() << *F1 << '\n' << *F2 << '\n';
389 Valid = false;
390 }
391
392 if (Res1 == 0)
393 continue;
394
395 unsigned k = j;
396 for (std::vector<WeakTrackingVH>::iterator K = J; K != E && k < Max;
397 ++k, ++K, ++TripleNumber) {
398 if (K == J)
399 continue;
400
401 Function *F3 = cast<Function>(*K);
402 int Res3 = FunctionComparator(F1, F3, &GlobalNumbers).compare();
403 int Res4 = FunctionComparator(F2, F3, &GlobalNumbers).compare();
404
405 bool Transitive = true;
406
407 if (Res1 != 0 && Res1 == Res4) {
408 // F1 > F2, F2 > F3 => F1 > F3
409 Transitive = Res3 == Res1;
410 } else if (Res3 != 0 && Res3 == -Res4) {
411 // F1 > F3, F3 > F2 => F1 > F2
412 Transitive = Res3 == Res1;
413 } else if (Res4 != 0 && -Res3 == Res4) {
414 // F2 > F3, F3 > F1 => F2 > F1
415 Transitive = Res4 == -Res1;
416 }
417
418 if (!Transitive) {
419 dbgs() << "MERGEFUNC-VERIFY: Non-transitive; triple: "
420 << TripleNumber << "\n";
421 dbgs() << "Res1, Res3, Res4: " << Res1 << ", " << Res3 << ", "
422 << Res4 << "\n";
423 dbgs() << *F1 << '\n' << *F2 << '\n' << *F3 << '\n';
424 Valid = false;
425 }
426 }
427 }
428 }
429
430 dbgs() << "MERGEFUNC-VERIFY: " << (Valid ? "Passed." : "Failed.") << "\n";
431 return Valid;
432 }
433 return true;
434}
435#endif
436
437/// Check whether \p F has an intrinsic which references
438/// distinct metadata as an operand. The most common
439/// instance of this would be CFI checks for function-local types.
441 for (const BasicBlock &BB : F) {
442 for (const Instruction &I : BB) {
443 if (!isa<IntrinsicInst>(&I))
444 continue;
445
446 for (MetadataAsValue *MDL :
448 if (MDNode *N = dyn_cast<MDNode>(MDL->getMetadata()))
449 if (N->isDistinct())
450 return true;
451 }
452 }
453 }
454 return false;
455}
456
457/// Check whether \p F is eligible for function merging.
459 return !F.isDeclaration() && !F.hasAvailableExternallyLinkage() &&
460 !F.hasFnAttribute(Attribute::NoIPA) &&
462}
463
464inline Function *asPtr(Function *Fn) { return Fn; }
465inline Function *asPtr(Function &Fn) { return &Fn; }
466
467template <typename FuncContainer> bool MergeFunctions::run(FuncContainer &M) {
468 bool Changed = false;
469
470 // All functions in the module, ordered by hash. Functions with a unique
471 // hash value are easily eliminated.
472 std::vector<std::pair<stable_hash, Function *>> HashedFuncs;
473 for (auto &Func : M) {
474 Function *FuncPtr = asPtr(Func);
475 if (isEligibleForMerging(*FuncPtr)) {
476 HashedFuncs.push_back({StructuralHash(*FuncPtr), FuncPtr});
477 }
478 }
479
480 llvm::stable_sort(HashedFuncs, less_first());
481
482 auto S = HashedFuncs.begin();
483 for (auto I = HashedFuncs.begin(), IE = HashedFuncs.end(); I != IE; ++I) {
484 // If the hash value matches the previous value or the next one, we must
485 // consider merging it. Otherwise it is dropped and never considered again.
486 if ((I != S && std::prev(I)->first == I->first) ||
487 (std::next(I) != IE && std::next(I)->first == I->first)) {
488 Deferred.push_back(WeakTrackingVH(I->second));
489 }
490 }
491
492 do {
493 std::vector<WeakTrackingVH> Worklist;
494 Deferred.swap(Worklist);
495
496 LLVM_DEBUG(doFunctionalCheck(Worklist));
497
498 LLVM_DEBUG(dbgs() << "size of module: " << M.size() << '\n');
499 LLVM_DEBUG(dbgs() << "size of worklist: " << Worklist.size() << '\n');
500
501 // Insert functions and merge them.
502 for (WeakTrackingVH &I : Worklist) {
503 if (!I)
504 continue;
506 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage() &&
507 !F->hasFnAttribute(Attribute::NoIPA)) {
508 Changed |= insert(F);
509 }
510 }
511 LLVM_DEBUG(dbgs() << "size of FnTree: " << FnTree.size() << '\n');
512 } while (!Deferred.empty());
513
514 FnTree.clear();
515 FNodesInTree.clear();
516 GlobalNumbers.clear();
517 Used.clear();
518
519 return Changed;
520}
521
523MergeFunctions::runOnFunctions(ArrayRef<Function *> Funcs) {
524 [[maybe_unused]] bool MergeResult = this->run(Funcs);
525 assert(MergeResult == !DelToNewMap.empty());
526 return this->DelToNewMap;
527}
528
529// Replace direct callers of Old with New.
530void MergeFunctions::replaceDirectCallers(Function *Old, Function *New) {
531 for (Use &U : make_early_inc_range(Old->uses())) {
532 CallBase *CB = dyn_cast<CallBase>(U.getUser());
533 if (CB && CB->isCallee(&U)) {
534 // Do not copy attributes from the called function to the call-site.
535 // Function comparison ensures that the attributes are the same up to
536 // type congruences in byval(), in which case we need to keep the byval
537 // type of the call-site, not the callee function.
538 remove(CB->getFunction());
539 U.set(New);
540 }
541 }
542}
543
544// Erase the instructions in PDIUnrelatedWL as they are unrelated to the
545// parameter debug info, from the entry block.
546void MergeFunctions::eraseInstsUnrelatedToPDI(
547 std::vector<Instruction *> &PDIUnrelatedWL,
548 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL) {
550 dbgs() << " Erasing instructions (in reverse order of appearance in "
551 "entry block) unrelated to parameter debug info from entry "
552 "block: {\n");
553 while (!PDIUnrelatedWL.empty()) {
554 Instruction *I = PDIUnrelatedWL.back();
555 LLVM_DEBUG(dbgs() << " Deleting Instruction: ");
556 LLVM_DEBUG(I->print(dbgs()));
557 LLVM_DEBUG(dbgs() << "\n");
558 I->eraseFromParent();
559 PDIUnrelatedWL.pop_back();
560 }
561
562 while (!PDVRUnrelatedWL.empty()) {
563 DbgVariableRecord *DVR = PDVRUnrelatedWL.back();
564 LLVM_DEBUG(dbgs() << " Deleting DbgVariableRecord ");
565 LLVM_DEBUG(DVR->print(dbgs()));
566 LLVM_DEBUG(dbgs() << "\n");
567 DVR->eraseFromParent();
568 PDVRUnrelatedWL.pop_back();
569 }
570
571 LLVM_DEBUG(dbgs() << " } // Done erasing instructions unrelated to parameter "
572 "debug info from entry block. \n");
573}
574
575// Reduce G to its entry block.
576void MergeFunctions::eraseTail(Function *G) {
577 std::vector<BasicBlock *> WorklistBB;
578 for (BasicBlock &BB : drop_begin(*G)) {
579 BB.dropAllReferences();
580 WorklistBB.push_back(&BB);
581 }
582 while (!WorklistBB.empty()) {
583 BasicBlock *BB = WorklistBB.back();
584 BB->eraseFromParent();
585 WorklistBB.pop_back();
586 }
587}
588
589// We are interested in the following instructions from the entry block as being
590// related to parameter debug info:
591// - @llvm.dbg.declare
592// - stores from the incoming parameters to locations on the stack-frame
593// - allocas that create these locations on the stack-frame
594// - @llvm.dbg.value
595// - the entry block's terminator
596// The rest are unrelated to debug info for the parameters; fill up
597// PDIUnrelatedWL with such instructions.
598void MergeFunctions::filterInstsUnrelatedToPDI(
599 BasicBlock *GEntryBlock, std::vector<Instruction *> &PDIUnrelatedWL,
600 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL) {
601 std::set<Instruction *> PDIRelated;
602 std::set<DbgVariableRecord *> PDVRRelated;
603
604 // Work out whether a dbg.value intrinsic or an equivalent DbgVariableRecord
605 // is a parameter to be preserved.
606 auto ExamineDbgValue = [&PDVRRelated](DbgVariableRecord *DbgVal) {
607 LLVM_DEBUG(dbgs() << " Deciding: ");
608 LLVM_DEBUG(DbgVal->print(dbgs()));
609 LLVM_DEBUG(dbgs() << "\n");
610 DILocalVariable *DILocVar = DbgVal->getVariable();
611 if (DILocVar->isParameter()) {
612 LLVM_DEBUG(dbgs() << " Include (parameter): ");
613 LLVM_DEBUG(DbgVal->print(dbgs()));
614 LLVM_DEBUG(dbgs() << "\n");
615 PDVRRelated.insert(DbgVal);
616 } else {
617 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
618 LLVM_DEBUG(DbgVal->print(dbgs()));
619 LLVM_DEBUG(dbgs() << "\n");
620 }
621 };
622
623 auto ExamineDbgDeclare = [&PDIRelated,
624 &PDVRRelated](DbgVariableRecord *DbgDecl) {
625 LLVM_DEBUG(dbgs() << " Deciding: ");
626 LLVM_DEBUG(DbgDecl->print(dbgs()));
627 LLVM_DEBUG(dbgs() << "\n");
628 DILocalVariable *DILocVar = DbgDecl->getVariable();
629 if (DILocVar->isParameter()) {
630 LLVM_DEBUG(dbgs() << " Parameter: ");
631 LLVM_DEBUG(DILocVar->print(dbgs()));
632 AllocaInst *AI = dyn_cast_or_null<AllocaInst>(DbgDecl->getAddress());
633 if (AI) {
634 LLVM_DEBUG(dbgs() << " Processing alloca users: ");
635 LLVM_DEBUG(dbgs() << "\n");
636 for (User *U : AI->users()) {
637 if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
638 if (Value *Arg = SI->getValueOperand()) {
639 if (isa<Argument>(Arg)) {
640 LLVM_DEBUG(dbgs() << " Include: ");
641 LLVM_DEBUG(AI->print(dbgs()));
642 LLVM_DEBUG(dbgs() << "\n");
643 PDIRelated.insert(AI);
644 LLVM_DEBUG(dbgs() << " Include (parameter): ");
645 LLVM_DEBUG(SI->print(dbgs()));
646 LLVM_DEBUG(dbgs() << "\n");
647 PDIRelated.insert(SI);
648 LLVM_DEBUG(dbgs() << " Include: ");
649 LLVM_DEBUG(DbgDecl->print(dbgs()));
650 LLVM_DEBUG(dbgs() << "\n");
651 PDVRRelated.insert(DbgDecl);
652 } else {
653 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
654 LLVM_DEBUG(SI->print(dbgs()));
655 LLVM_DEBUG(dbgs() << "\n");
656 }
657 }
658 } else {
659 LLVM_DEBUG(dbgs() << " Defer: ");
660 LLVM_DEBUG(U->print(dbgs()));
661 LLVM_DEBUG(dbgs() << "\n");
662 }
663 }
664 } else {
665 LLVM_DEBUG(dbgs() << " Delete (alloca NULL): ");
666 LLVM_DEBUG(DbgDecl->print(dbgs()));
667 LLVM_DEBUG(dbgs() << "\n");
668 }
669 } else {
670 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
671 LLVM_DEBUG(DbgDecl->print(dbgs()));
672 LLVM_DEBUG(dbgs() << "\n");
673 }
674 };
675
676 for (BasicBlock::iterator BI = GEntryBlock->begin(), BIE = GEntryBlock->end();
677 BI != BIE; ++BI) {
678 // Examine DbgVariableRecords as they happen "before" the instruction. Are
679 // they connected to parameters?
680 for (DbgVariableRecord &DVR : filterDbgVars(BI->getDbgRecordRange())) {
681 if (DVR.isDbgValue() || DVR.isDbgAssign()) {
682 ExamineDbgValue(&DVR);
683 } else {
684 assert(DVR.isDbgDeclare());
685 ExamineDbgDeclare(&DVR);
686 }
687 }
688
689 if (BI->isTerminator() && &*BI == GEntryBlock->getTerminator()) {
690 LLVM_DEBUG(dbgs() << " Will Include Terminator: ");
691 LLVM_DEBUG(BI->print(dbgs()));
692 LLVM_DEBUG(dbgs() << "\n");
693 PDIRelated.insert(&*BI);
694 } else {
695 LLVM_DEBUG(dbgs() << " Defer: ");
696 LLVM_DEBUG(BI->print(dbgs()));
697 LLVM_DEBUG(dbgs() << "\n");
698 }
699 }
701 dbgs()
702 << " Report parameter debug info related/related instructions: {\n");
703
704 auto IsPDIRelated = [](auto *Rec, auto &Container, auto &UnrelatedCont) {
705 if (Container.find(Rec) == Container.end()) {
706 LLVM_DEBUG(dbgs() << " !PDIRelated: ");
707 LLVM_DEBUG(Rec->print(dbgs()));
708 LLVM_DEBUG(dbgs() << "\n");
709 UnrelatedCont.push_back(Rec);
710 } else {
711 LLVM_DEBUG(dbgs() << " PDIRelated: ");
712 LLVM_DEBUG(Rec->print(dbgs()));
713 LLVM_DEBUG(dbgs() << "\n");
714 }
715 };
716
717 // Collect the set of unrelated instructions and debug records.
718 for (Instruction &I : *GEntryBlock) {
719 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange()))
720 IsPDIRelated(&DVR, PDVRRelated, PDVRUnrelatedWL);
721 IsPDIRelated(&I, PDIRelated, PDIUnrelatedWL);
722 }
723 LLVM_DEBUG(dbgs() << " }\n");
724}
725
726/// Whether this function may be replaced by a forwarding thunk.
728 if (F->isVarArg())
729 return false;
730
731 if (F->hasKernelCallingConv())
732 return false;
733
734 // Don't merge tiny functions using a thunk, since it can just end up
735 // making the function larger.
736 if (F->size() == 1) {
737 if (F->front().size() < 2) {
738 LLVM_DEBUG(dbgs() << "canCreateThunkFor: " << F->getName()
739 << " is too small to bother creating a thunk for\n");
740 return false;
741 }
742 }
743 return true;
744}
745
746/// Copy all metadata of a specific kind from one function to another.
748 StringRef Kind) {
750 From->getMetadata(Kind, MDs);
751 for (MDNode *MD : MDs)
752 To->addMetadata(Kind, *MD);
753}
754
755// Replace G with a simple tail call to bitcast(F). Also (unless
756// MergeFunctionsPDI holds) replace direct uses of G with bitcast(F),
757// delete G. Under MergeFunctionsPDI, we use G itself for creating
758// the thunk as we preserve the debug info (and associated instructions)
759// from G's entry block pertaining to G's incoming arguments which are
760// passed on as corresponding arguments in the call that G makes to F.
761// For better debugability, under MergeFunctionsPDI, we do not modify G's
762// call sites to point to F even when within the same translation unit.
763void MergeFunctions::writeThunk(Function *F, Function *G) {
764 std::optional<uint64_t> GEntryCount = G->getEntryCount();
765 BasicBlock *GEntryBlock = nullptr;
766 std::vector<Instruction *> PDIUnrelatedWL;
767 std::vector<DbgVariableRecord *> PDVRUnrelatedWL;
768 BasicBlock *BB = nullptr;
769 Function *NewG = nullptr;
770 if (MergeFunctionsPDI) {
771 LLVM_DEBUG(dbgs() << "writeThunk: (MergeFunctionsPDI) Do not create a new "
772 "function as thunk; retain original: "
773 << G->getName() << "()\n");
774 GEntryBlock = &G->getEntryBlock();
776 dbgs() << "writeThunk: (MergeFunctionsPDI) filter parameter related "
777 "debug info for "
778 << G->getName() << "() {\n");
779 filterInstsUnrelatedToPDI(GEntryBlock, PDIUnrelatedWL, PDVRUnrelatedWL);
780 GEntryBlock->getTerminator()->eraseFromParent();
781 BB = GEntryBlock;
782 } else {
783 NewG = Function::Create(G->getFunctionType(), G->getLinkage(),
784 G->getAddressSpace(), "", G->getParent());
785 NewG->setComdat(G->getComdat());
786 BB = BasicBlock::Create(F->getContext(), "", NewG);
787 }
788
789 IRBuilder<> Builder(BB);
790 Function *H = MergeFunctionsPDI ? G : NewG;
792 unsigned i = 0;
793 FunctionType *FFTy = F->getFunctionType();
794 for (Argument &AI : H->args()) {
795 Args.push_back(Builder.CreateAggregateCast(&AI, FFTy->getParamType(i)));
796 ++i;
797 }
798
799 CallInst *CI = Builder.CreateCall(F, Args);
800 ReturnInst *RI = nullptr;
801 bool isSwiftTailCall = F->getCallingConv() == CallingConv::SwiftTail &&
802 G->getCallingConv() == CallingConv::SwiftTail;
803 CI->setTailCallKind(isSwiftTailCall ? CallInst::TCK_MustTail
805 CI->setCallingConv(F->getCallingConv());
806 CI->setAttributes(F->getAttributes());
807 if (H->getReturnType()->isVoidTy()) {
808 RI = Builder.CreateRetVoid();
809 } else {
810 RI = Builder.CreateRet(Builder.CreateAggregateCast(CI, H->getReturnType()));
811 }
812
813 if (MergeFunctionsPDI) {
814 DISubprogram *DIS = G->getSubprogram();
815 if (DIS) {
816 DebugLoc CIDbgLoc =
817 DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
818 DebugLoc RIDbgLoc =
819 DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
820 CI->setDebugLoc(CIDbgLoc);
821 RI->setDebugLoc(RIDbgLoc);
822 } else {
824 dbgs() << "writeThunk: (MergeFunctionsPDI) No DISubprogram for "
825 << G->getName() << "()\n");
826 }
827 eraseTail(G);
828 eraseInstsUnrelatedToPDI(PDIUnrelatedWL, PDVRUnrelatedWL);
830 dbgs() << "} // End of parameter related debug info filtering for: "
831 << G->getName() << "()\n");
832 } else {
833 NewG->copyAttributesFrom(G);
834 if (GEntryCount)
835 NewG->setEntryCount(*GEntryCount);
836 NewG->takeName(G);
837 // Ensure CFI type metadata is propagated to the new function.
838 copyMetadataIfPresent(G, NewG, "type");
839 copyMetadataIfPresent(G, NewG, "kcfi_type");
840 copyMetadataIfPresent(G, NewG, "callgraph");
841 removeUsers(G);
842 G->replaceAllUsesWith(NewG);
843 G->eraseFromParent();
844 }
845
846 LLVM_DEBUG(dbgs() << "writeThunk: " << H->getName() << '\n');
847 ++NumThunksWritten;
848}
849
850// Whether this function may be replaced by an alias
852 if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr())
853 return false;
854
855 // We should only see linkages supported by aliases here
856 assert(F->hasLocalLinkage() || F->hasExternalLinkage()
857 || F->hasWeakLinkage() || F->hasLinkOnceLinkage());
858 return true;
859}
860
861static bool hasNonLocalAlias(const Function *F) {
862 for (const GlobalAlias &GA : F->getParent()->aliases())
863 if (!GA.hasLocalLinkage() && GA.getAliaseeObject() == F)
864 return true;
865 return false;
866}
867
868/// A COFF weak external must name its target, and a local symbol has no name
869/// the linker can agree on across objects (LNK1227).
870static bool canBeAliasee(const Function *F) {
871 if (!F->getParent()->getTargetTriple().isOSBinFormatCOFF())
872 return true;
873 return F->hasName() && !F->hasLocalLinkage();
874}
875
876// Replace G with an alias to F (deleting function G)
877void MergeFunctions::writeAlias(Function *F, Function *G) {
878 PointerType *PtrType = G->getType();
879 auto *GA =
880 GlobalAlias::create(G->getFunctionType(), PtrType->getAddressSpace(),
881 G->getLinkage(), "", F, G->getParent());
882
883 const MaybeAlign FAlign = F->getAlign();
884 const MaybeAlign GAlign = G->getAlign();
885 if (FAlign || GAlign)
886 F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne()));
887 else
888 F->setAlignment(std::nullopt);
889 GA->takeName(G);
890 GA->setVisibility(G->getVisibility());
891 GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
892
893 removeUsers(G);
894 G->replaceAllUsesWith(GA);
895 G->eraseFromParent();
896
897 LLVM_DEBUG(dbgs() << "writeAlias: " << GA->getName() << '\n');
898 ++NumAliasesWritten;
899}
900
902 const Function &G) {
903 DenseSet<GlobalValue::GUID> AllImports = F.getImportGUIDs();
904 DenseSet<GlobalValue::GUID> GImports = G.getImportGUIDs();
905 AllImports.insert(GImports.begin(), GImports.end());
906 return AllImports;
907}
908
910 std::optional<uint64_t> FEntryCount = F.getEntryCount();
911 std::optional<uint64_t> GEntryCount = G.getEntryCount();
913 if (!FEntryCount && !GEntryCount && AllImports.empty())
914 return;
915
916 // -1 is a safe placeholder here, getEntryCount() already treats it as
917 // "unknown" (same sentinel SamplePGO uses for no-sample functions), so
918 // it won't look hot to anyone reading the count back.
919 uint64_t Sum = static_cast<uint64_t>(-1);
920 if (FEntryCount || GEntryCount)
921 Sum = SaturatingAdd(FEntryCount ? *FEntryCount : uint64_t{0},
922 GEntryCount ? *GEntryCount : uint64_t{0});
923 F.setEntryCount(Sum, AllImports.empty() ? nullptr : &AllImports);
924}
925
926bool MergeFunctions::writeThunkOrAliasIfNeeded(Function *F, Function *G) {
927 bool ShouldErase =
928 G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI;
929 bool ShouldAlias = canCreateAliasFor(G) && canBeAliasee(F);
930 bool ShouldThunk = canCreateThunkFor(F);
931
932 if (!ShouldErase && !ShouldAlias && !ShouldThunk)
933 return false;
934
935 if (ShouldErase) {
936 G->eraseFromParent();
937 return true;
938 }
939
940 if (ShouldAlias) {
941 writeAlias(F, G);
942 return true;
943 }
944 if (ShouldThunk) {
945 writeThunk(F, G);
946 return true;
947 }
948
949 llvm_unreachable("Erase, alias or thunk must apply");
950}
951
952/// Returns true if \p F is either weak_odr or linkonce_odr.
953static bool isODR(const Function *F) {
954 return F->hasWeakODRLinkage() || F->hasLinkOnceODRLinkage();
955}
956
958 const BasicBlock *BB) {
959 if (auto Count = BFI.getBlockProfileCount(BB, /*AllowSynthetic=*/true))
960 return *Count;
961 return 1;
962}
963
964// The branch weights are relative within a function. Before merging we
965// normalize these to absolute counts.
966// (weight * BlockCount / TotalWeight)
967static uint64_t scaleToBlockCount(uint64_t Weight, uint64_t TotalWeight,
968 uint64_t BlockCount) {
969 if (Weight == 0 || TotalWeight == 0 || BlockCount == 0)
970 return 0;
971 APInt Num(128, BlockCount);
972 Num *= APInt(128, Weight);
973 APInt Den(128, TotalWeight);
974 Num = (Num + Den.lshr(1)).udiv(Den);
975 assert(Num.getActiveBits() <= 64 &&
976 "scaleToBlockCount: result exceeds uint64_t; Weight > TotalWeight?");
977 return Num.getLimitedValue();
978}
979
980// Combine the scaled branch_weights of corresponding instructions of F and G.
982 const Instruction *SrcI,
983 const BlockFrequencyInfo &DstBFI,
984 const BlockFrequencyInfo &SrcBFI) {
985 SmallVector<uint32_t, 8> DstWeights, SrcWeights;
986 bool HasDst = extractBranchWeights(*DstI, DstWeights);
987 bool HasSrc = extractBranchWeights(*SrcI, SrcWeights);
988 if (!HasDst && !HasSrc)
989 return;
990
991 uint64_t DstBlockCount = getBlockCountForMerging(DstBFI, DstI->getParent());
992 uint64_t SrcBlockCount = getBlockCountForMerging(SrcBFI, SrcI->getParent());
993
994 uint64_t DstTotal = 0, SrcTotal = 0;
995 if (HasDst)
996 extractProfTotalWeight(*DstI, DstTotal);
997 if (HasSrc)
998 extractProfTotalWeight(*SrcI, SrcTotal);
999
1000 assert((!HasDst || !HasSrc || DstWeights.size() == SrcWeights.size()) &&
1001 "equivalent branch/select instructions must have matching weight "
1002 "arity");
1003 size_t NumWeights = HasDst ? DstWeights.size() : SrcWeights.size();
1004 SmallVector<uint64_t, 8> MergedWeights;
1005 MergedWeights.reserve(NumWeights);
1006 for (size_t I = 0; I < NumWeights; ++I) {
1007 uint64_t DstW = HasDst ? DstWeights[I] : 0;
1008 uint64_t SrcW = HasSrc ? SrcWeights[I] : 0;
1009 uint64_t DstAbs = scaleToBlockCount(DstW, DstTotal, DstBlockCount);
1010 uint64_t SrcAbs = scaleToBlockCount(SrcW, SrcTotal, SrcBlockCount);
1011 MergedWeights.push_back(SaturatingAdd(DstAbs, SrcAbs));
1012 }
1013
1014 bool IsExpected =
1016 setFittedBranchWeights(*DstI, MergedWeights, IsExpected);
1017}
1018
1019// Accumulate value profile counts of Instruction I into Merged. Value profile
1020// counts are absolute, not relative branch-style weights.
1023 uint64_t Total = 0;
1025 getValueProfDataFromInst(I, Kind, /*MaxNumValueData=*/UINT32_MAX, Total);
1026 if (VDs.empty())
1027 return;
1028 for (const InstrProfValueData &VD : VDs)
1029 Merged[VD.Value] = SaturatingAdd(Merged[VD.Value], VD.Count);
1030}
1031
1032// Merge (union) value profiles of Dst and Src.
1034 const Instruction *SrcI) {
1035 MDNode *DstProf = DstI->getMetadata(LLVMContext::MD_prof);
1036 MDNode *SrcProf = SrcI->getMetadata(LLVMContext::MD_prof);
1037 bool HasDst = DstProf && isValueProfileMD(DstProf);
1038 bool HasSrc = SrcProf && isValueProfileMD(SrcProf);
1039 if (!HasDst && !HasSrc)
1040 return;
1041
1042 auto *DstKind =
1043 HasDst ? mdconst::dyn_extract<ConstantInt>(DstProf->getOperand(1))
1044 : nullptr;
1045 auto *SrcKind =
1046 HasSrc ? mdconst::dyn_extract<ConstantInt>(SrcProf->getOperand(1))
1047 : nullptr;
1048 if (HasDst && HasSrc && DstKind && SrcKind &&
1049 DstKind->getZExtValue() != SrcKind->getZExtValue()) {
1050 DstI->setMetadata(LLVMContext::MD_prof, nullptr);
1051 return;
1052 }
1053
1054 const ConstantInt *KindCI = DstKind ? DstKind : SrcKind;
1055 if (!KindCI) {
1056 DstI->setMetadata(LLVMContext::MD_prof, nullptr);
1057 return;
1058 }
1059
1060 InstrProfValueKind Kind =
1061 static_cast<InstrProfValueKind>(KindCI->getZExtValue());
1062
1064 if (HasDst)
1065 addValueProfile(*DstI, Kind, Merged);
1066 if (HasSrc)
1067 addValueProfile(*SrcI, Kind, Merged);
1068
1069 if (Merged.empty())
1070 return;
1071
1073 VDs.reserve(Merged.size());
1074 uint64_t Sum = 0;
1075 for (auto &[Value, Count] : Merged) {
1076 VDs.push_back({Value, Count});
1077 Sum = SaturatingAdd(Sum, Count);
1078 }
1079 llvm::sort(VDs, [](const InstrProfValueData &A, const InstrProfValueData &B) {
1080 return A.Count > B.Count;
1081 });
1082 annotateValueSite(*DstI->getFunction()->getParent(), *DstI, VDs, Sum, Kind,
1083 VDs.size());
1084}
1085
1086void MergeFunctions::mergeInstrAnnotations(Function *Dst, Function *Src) {
1087 const BlockFrequencyInfo &DstBFI =
1089 const BlockFrequencyInfo &SrcBFI =
1091
1092 // FunctionComparator guarantees identical CFG topology and instruction
1093 // ordering. Walk the CFGs in RPO rather than function block-list order, as
1094 // equivalent functions need not store their basic blocks in the same order.
1097 for (auto [DstBB, SrcBB] : llvm::zip_equal(DstRPOT, SrcRPOT)) {
1098 for (auto [DstI, SrcI] : llvm::zip_equal(*DstBB, *SrcBB)) {
1099 // Merge poison-generating flags.
1100 DstI.andIRFlags(&SrcI);
1101
1102 MDNode *DstProf = DstI.getMetadata(LLVMContext::MD_prof);
1103 MDNode *SrcProf = SrcI.getMetadata(LLVMContext::MD_prof);
1104 if ((DstProf && isValueProfileMD(DstProf)) ||
1105 (SrcProf && isValueProfileMD(SrcProf)))
1106 mergeValueProfileOnInstructions(&DstI, &SrcI);
1107
1108 // Handle branch weights on SelectInsts here. Terminators are handled
1109 // separately below, outside the instruction loop.
1110 if (isa<SelectInst>(DstI))
1111 mergeBranchWeightsOnInstructions(&DstI, &SrcI, DstBFI, SrcBFI);
1112 }
1113 Instruction *DstTerm = DstBB->getTerminator();
1114 const Instruction *SrcTerm = SrcBB->getTerminator();
1115 mergeBranchWeightsOnInstructions(DstTerm, SrcTerm, DstBFI, SrcBFI);
1116 }
1117
1121 FAM.invalidate(*Dst, PA);
1122}
1123
1124// Merge two equivalent functions. Upon completion, Function G is deleted.
1125void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
1126
1127 std::optional<uint64_t> FEntryCount = F->getEntryCount();
1128
1129 // Create a new thunk that both F and G can call, if F cannot call G directly.
1130 // That is the case if F is either interposable or if G is either weak_odr or
1131 // linkonce_odr.
1132 if (F->isInterposable() || (isODR(F) && isODR(G))) {
1133 assert((!isODR(G) || isODR(F)) &&
1134 "if G is ODR, F must also be ODR due to ordering");
1135
1136 // Both writeThunkOrAliasIfNeeded() calls below must succeed, either because
1137 // we can create aliases for G and NewF, or because a thunk for F is
1138 // profitable. F here has the same signature as NewF below, so that's what
1139 // we check.
1140 if (!canCreateThunkFor(F) &&
1142 return;
1143
1144 // Make them both thunks to the same internal function.
1145 Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(),
1146 F->getAddressSpace(), "", F->getParent());
1147 NewF->copyAttributesFrom(F);
1148 NewF->takeName(F);
1149 NewF->setComdat(F->getComdat());
1150 F->setComdat(nullptr);
1151 // Ensure CFI type metadata is propagated to the new function.
1152 copyMetadataIfPresent(F, NewF, "type");
1153 copyMetadataIfPresent(F, NewF, "kcfi_type");
1154 copyMetadataIfPresent(F, NewF, "callgraph");
1155 removeUsers(F);
1156 F->replaceAllUsesWith(NewF);
1157
1158 // If G or NewF are (weak|linkonce)_odr, update all callers to call the
1159 // thunk.
1160 if (isODR(G))
1161 replaceDirectCallers(G, F);
1162 if (isODR(F))
1163 replaceDirectCallers(NewF, F);
1164
1165 // We collect alignment before writeThunkOrAliasIfNeeded that overwrites
1166 // NewF and G's content.
1167 const MaybeAlign NewFAlign = NewF->getAlign();
1168 const MaybeAlign GAlign = G->getAlign();
1169
1170 // Merge annotations, while G still has its body.
1171 mergeInstrAnnotations(F, G);
1173
1174 writeThunkOrAliasIfNeeded(F, G);
1175 if (FEntryCount)
1176 NewF->setEntryCount(*FEntryCount);
1177 // NewF becomes thunk/alias to the shared body F, it has no annotations to
1178 // be merged.
1179 writeThunkOrAliasIfNeeded(F, NewF);
1180
1181 if (NewFAlign || GAlign)
1182 F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne()));
1183 else
1184 F->setAlignment(std::nullopt);
1185 F->setLinkage(GlobalValue::PrivateLinkage);
1186 ++NumDoubleWeak;
1187 ++NumFunctionsMerged;
1188 } else {
1189 // For better debugability, under MergeFunctionsPDI, we do not modify G's
1190 // call sites to point to F even when within the same translation unit.
1191 if (!G->isInterposable() && !MergeFunctionsPDI) {
1192 // Functions referred to by llvm.used/llvm.compiler.used are special:
1193 // there are uses of the symbol name that are not visible to LLVM,
1194 // usually from inline asm.
1195 // Replacing G also retargets G's aliases at F.
1196 if (G->hasGlobalUnnamedAddr() && !Used.contains(G) &&
1197 (!hasNonLocalAlias(G) || canBeAliasee(F))) {
1198 // G might have been a key in our GlobalNumberState, and it's illegal
1199 // to replace a key in ValueMap<GlobalValue *> with a non-global.
1200 GlobalNumbers.erase(G);
1201 // If G's address is not significant, replace it entirely.
1202 removeUsers(G);
1203 G->replaceAllUsesWith(F);
1204 } else {
1205 // Redirect direct callers of G to F. (See note on MergeFunctionsPDI
1206 // above).
1207 replaceDirectCallers(G, F);
1208 }
1209 }
1210
1211 mergeInstrAnnotations(F, G);
1213
1214 // If G was internal then we may have replaced all uses of G with F. If so,
1215 // stop here and delete G. There's no need for a thunk. (See note on
1216 // MergeFunctionsPDI above).
1217 if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) {
1218 G->eraseFromParent();
1219 ++NumFunctionsMerged;
1220 return;
1221 }
1222
1223 if (writeThunkOrAliasIfNeeded(F, G))
1224 ++NumFunctionsMerged;
1225 }
1226}
1227
1228/// Replace function F by function G.
1229void MergeFunctions::replaceFunctionInTree(const FunctionNode &FN,
1230 Function *G) {
1231 Function *F = FN.getFunc();
1232 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 &&
1233 "The two functions must be equal");
1234
1235 auto I = FNodesInTree.find(F);
1236 assert(I != FNodesInTree.end() && "F should be in FNodesInTree");
1237 assert(FNodesInTree.count(G) == 0 && "FNodesInTree should not contain G");
1238
1239 FnTreeType::iterator IterToFNInFnTree = I->second;
1240 assert(&(*IterToFNInFnTree) == &FN && "F should map to FN in FNodesInTree.");
1241 // Remove F -> FN and insert G -> FN
1242 FNodesInTree.erase(I);
1243 FNodesInTree.insert({G, IterToFNInFnTree});
1244 // Replace F with G in FN, which is stored inside the FnTree.
1245 FN.replaceBy(G);
1246}
1247
1248// Ordering for functions that are equal under FunctionComparator
1249static bool isFuncOrderCorrect(const Function *F, const Function *G) {
1250 if (isODR(F) != isODR(G)) {
1251 // ODR functions before non-ODR functions. A ODR function can call a non-ODR
1252 // function if it is not interposable, but not the other way around.
1253 return isODR(G);
1254 }
1255
1256 if (F->isInterposable() != G->isInterposable()) {
1257 // Strong before weak, because the weak function may call the strong
1258 // one, but not the other way around.
1259 return !F->isInterposable();
1260 }
1261
1262 if (F->hasLocalLinkage() != G->hasLocalLinkage()) {
1263 // External before local, because we definitely have to keep the external
1264 // function, but may be able to drop the local one.
1265 return !F->hasLocalLinkage();
1266 }
1267
1268 // Impose a total order (by name) on the replacement of functions. This is
1269 // important when operating on more than one module independently to prevent
1270 // cycles of thunks calling each other when the modules are linked together.
1271 return F->getName() <= G->getName();
1272}
1273
1274// Insert a ComparableFunction into the FnTree, or merge it away if equal to one
1275// that was already inserted.
1276bool MergeFunctions::insert(Function *NewFunction) {
1277 std::pair<FnTreeType::iterator, bool> Result =
1278 FnTree.insert(FunctionNode(NewFunction));
1279
1280 if (Result.second) {
1281 assert(FNodesInTree.count(NewFunction) == 0);
1282 FNodesInTree.insert({NewFunction, Result.first});
1283 LLVM_DEBUG(dbgs() << "Inserting as unique: " << NewFunction->getName()
1284 << '\n');
1285 return false;
1286 }
1287
1288 const FunctionNode &OldF = *Result.first;
1289
1290 if (!isFuncOrderCorrect(OldF.getFunc(), NewFunction)) {
1291 // Swap the two functions.
1292 Function *F = OldF.getFunc();
1293 replaceFunctionInTree(*Result.first, NewFunction);
1294 NewFunction = F;
1295 assert(OldF.getFunc() != F && "Must have swapped the functions.");
1296 }
1297
1298 // Capture the Function pointer before mergeTwoFunctions, which may invalidate
1299 // OldF by erasing it from FnTree via removeUsers().
1300 Function *OldFunc = OldF.getFunc();
1301
1302 LLVM_DEBUG(dbgs() << " " << OldFunc->getName()
1303 << " == " << NewFunction->getName() << '\n');
1304
1305 Function *DeleteF = NewFunction;
1306 mergeTwoFunctions(OldFunc, DeleteF);
1307 this->DelToNewMap.insert({DeleteF, OldFunc});
1308 return true;
1309}
1310
1311// Remove a function from FnTree. If it was already in FnTree, add
1312// it to Deferred so that we'll look at it in the next round.
1313void MergeFunctions::remove(Function *F) {
1314 auto I = FNodesInTree.find(F);
1315 if (I != FNodesInTree.end()) {
1316 LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n");
1317 FnTree.erase(I->second);
1318 // I->second has been invalidated, remove it from the FNodesInTree map to
1319 // preserve the invariant.
1320 FNodesInTree.erase(I);
1321 Deferred.emplace_back(F);
1322 }
1323}
1324
1325// For each instruction used by the value, remove() the function that contains
1326// the instruction. This should happen right before a call to RAUW.
1327void MergeFunctions::removeUsers(Value *V) {
1328 for (User *U : V->users())
1329 if (auto *I = dyn_cast<Instruction>(U))
1330 remove(I->getFunction());
1331}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define H(x, y, z)
Definition MD5.cpp:56
static void mergeEntryCountsAndImportsInto(Function &F, Function &G)
static uint64_t getBlockCountForMerging(const BlockFrequencyInfo &BFI, const BasicBlock *BB)
static void mergeValueProfileOnInstructions(Instruction *DstI, const Instruction *SrcI)
static bool canCreateAliasFor(Function *F)
static bool isEligibleForMerging(Function &F)
Check whether F is eligible for function merging.
static bool isODR(const Function *F)
Returns true if F is either weak_odr or linkonce_odr.
static cl::opt< unsigned > NumFunctionsForVerificationCheck("mergefunc-verify", cl::desc("How many functions in a module could be used for " "MergeFunctions to pass a basic correctness check. " "'0' disables this check. Works only with '-debug' key."), cl::init(0), cl::Hidden)
static bool hasNonLocalAlias(const Function *F)
static DenseSet< GlobalValue::GUID > unionImportGUIDs(const Function &F, const Function &G)
static bool canCreateThunkFor(Function *F)
Whether this function may be replaced by a forwarding thunk.
static bool canBeAliasee(const Function *F)
A COFF weak external must name its target, and a local symbol has no name the linker can agree on acr...
static cl::opt< bool > MergeFunctionsPDI("mergefunc-preserve-debug-info", cl::Hidden, cl::init(false), cl::desc("Preserve debug info in thunk when mergefunc " "transformations are made."))
static uint64_t scaleToBlockCount(uint64_t Weight, uint64_t TotalWeight, uint64_t BlockCount)
static bool hasDistinctMetadataIntrinsic(const Function &F)
Check whether F has an intrinsic which references distinct metadata as an operand.
Function * asPtr(Function *Fn)
static void addValueProfile(const Instruction &I, InstrProfValueKind Kind, DenseMap< uint64_t, uint64_t > &Merged)
static void copyMetadataIfPresent(Function *From, Function *To, StringRef Kind)
Copy all metadata of a specific kind from one function to another.
static cl::opt< bool > MergeFunctionsAliases("mergefunc-use-aliases", cl::Hidden, cl::init(false), cl::desc("Allow mergefunc to create aliases"))
static void mergeBranchWeightsOnInstructions(Instruction *DstI, const Instruction *SrcI, const BlockFrequencyInfo &DstBFI, const BlockFrequencyInfo &SrcBFI)
static bool isFuncOrderCorrect(const Function *F, const Function *G)
This file contains the declarations for metadata subclasses.
FunctionAnalysisManager FAM
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file contains the declarations for profiling metadata utility functions.
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:471
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:853
an instruction to allocate memory on the stack
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
const T & front() const
Get the first element.
Definition ArrayRef.h:144
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
Value handle that asserts if the Value is deleted.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI std::optional< uint64_t > getBlockProfileCount(const BasicBlock *BB, bool AllowSynthetic=false) const
Returns the estimated profile count of BB.
Analysis pass which computes BranchProbabilityInfo.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
bool isCallee(Value::const_user_iterator UI) const
Determine whether the passed iterator points to the callee operand's Use.
void setAttributes(AttributeList A)
Set the attributes for this call.
This class represents a function call, abstracting a target machine's calling convention.
void setTailCallKind(TailCallKind TCK)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
Subprogram description. Uses SubclassData1.
LLVM_ABI void eraseFromParent()
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
A debug info location.
Definition DebugLoc.h:126
unsigned size() const
Definition DenseMap.h:207
bool empty() const
Definition DenseMap.h:206
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
FunctionComparator - Compares two functions to determine whether or not they will generate machine co...
LLVM_ABI int compare()
Test whether the two functions have equivalent behaviour.
Class to represent function types.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:169
MaybeAlign getAlign() const
Returns the alignment of the given function.
Definition Function.h:1022
void setEntryCount(uint64_t Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:845
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
Definition Globals.cpp:692
void erase(GlobalValue *Global)
LLVM_ABI void setComdat(Comdat *C)
Definition Globals.cpp:287
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
Module * getParent()
Get the module that this global value is contained inside of...
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2908
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1578
LLVMContext & getContext() const
Definition Metadata.h:1245
static LLVM_ABI bool runOnModule(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
static LLVM_ABI DenseMap< Function *, Function * > runOnFunctions(ArrayRef< Function * > Funcs, ModuleAnalysisManager &AM)
Metadata wrapper in the Value hierarchy.
Definition Metadata.h:184
LLVM_ABI void print(raw_ostream &OS, const Module *M=nullptr, bool IsForDebug=false) const
Print.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Class to represent pointers.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & abandon()
Mark an analysis as abandoned.
Definition Analysis.h:171
Return a value (possibly void), from a function.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
iterator_range< use_iterator > uses()
Definition Value.h:382
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
Value handle that is nullable, but tries to track the Value.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
const ParentTy * getParent() const
Definition ilist_node.h:34
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition CallingConv.h:87
int compare(DigitsT LDigits, int16_t LScale, DigitsT RDigits, int16_t RScale)
Compare two scaled numbers.
@ Valid
The data is already valid.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition Metadata.h:707
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
void stable_sort(R &&Range)
Definition STLExtras.h:2132
LLVM_ABI bool extractProfTotalWeight(const MDNode *ProfileData, uint64_t &TotalWeights)
Retrieve the total of all weights from MD_prof data.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
Definition STLExtras.h:856
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
uint64_t stable_hash
An opaque object representing a stable hash code.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI bool hasBranchWeightOrigin(const Instruction &I)
Check if Branch Weight Metadata has an "expected" field from an llvm.expect* intrinsic.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
Definition STLExtras.h:567
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
LLVM_ABI void annotateValueSite(Module &M, Instruction &Inst, const InstrProfRecord &InstrProfR, InstrProfValueKind ValueKind, uint32_t SiteIndx, uint32_t MaxMDCount=3)
Get the value profile data for value site SiteIdx from InstrProfR and annotate the instruction Inst w...
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI SmallVector< InstrProfValueData, 4 > getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)
Extract the value profile data from Inst and returns them if Inst is annotated with value profile dat...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isValueProfileMD(const MDNode *ProfileData)
Checks if an MDNode contains value profiling Metadata.
InstrProfValueKind
Definition InstrProf.h:323
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI void setFittedBranchWeights(Instruction &I, ArrayRef< uint64_t > Weights, bool IsExpected, bool ElideAllZero=false)
Variant of setBranchWeights where the Weights will be fit first to uint32_t by shifting right.
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)
Add two unsigned integers, X and Y, of type T.
Definition MathExtras.h:604
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI stable_hash StructuralHash(const Function &F, bool DetailedHash=false)
Returns a hash of the function F.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:952
#define N
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
Function object to check whether the first component of a container supported by std::get (like std::...
Definition STLExtras.h:1455