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 // If \p MergeAnnotations is true, annotations on G such as profiling
311 // information and poison-generating flags are merged into F before G is
312 // erased or rewritten.
313 bool writeThunkOrAliasIfNeeded(Function *F, Function *G,
314 bool MergeAnnotations);
315
316 /// Replace function F with function G in the function tree.
317 void replaceFunctionInTree(const FunctionNode &FN, Function *G);
318
319 /// The set of all distinct functions. Use the insert() and remove() methods
320 /// to modify it. The map allows efficient lookup and deferring of Functions.
321 FnTreeType FnTree;
322
323 // Map functions to the iterators of the FunctionNode which contains them
324 // in the FnTree. This must be updated carefully whenever the FnTree is
325 // modified, i.e. in insert(), remove(), and replaceFunctionInTree(), to avoid
326 // dangling iterators into FnTree. The invariant that preserves this is that
327 // there is exactly one mapping F -> FN for each FunctionNode FN in FnTree.
328 DenseMap<AssertingVH<Function>, FnTreeType::iterator> FNodesInTree;
329
330 /// Deleted-New functions mapping
331 DenseMap<Function *, Function *> DelToNewMap;
332
334};
335} // end anonymous namespace
336
343
344SmallPtrSet<GlobalValue *, 4> &MergeFunctions::getUsed() { return Used; }
345
347 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
348 MergeFunctions MF(FAM);
350 collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/false);
351 collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/true);
352 MF.getUsed().insert_range(UsedV);
353 return MF.run(M);
354}
355
359 if (Funcs.empty())
361
362 Module &M = *Funcs.front()->getParent();
363 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
364 MergeFunctions MF(FAM);
365 return MF.runOnFunctions(Funcs);
366}
367
368#ifndef NDEBUG
369bool MergeFunctions::doFunctionalCheck(std::vector<WeakTrackingVH> &Worklist) {
370 if (const unsigned Max = NumFunctionsForVerificationCheck) {
371 unsigned TripleNumber = 0;
372 bool Valid = true;
373
374 dbgs() << "MERGEFUNC-VERIFY: Started for first " << Max << " functions.\n";
375
376 unsigned i = 0;
377 for (std::vector<WeakTrackingVH>::iterator I = Worklist.begin(),
378 E = Worklist.end();
379 I != E && i < Max; ++I, ++i) {
380 unsigned j = i;
381 for (std::vector<WeakTrackingVH>::iterator J = I; J != E && j < Max;
382 ++J, ++j) {
383 Function *F1 = cast<Function>(*I);
384 Function *F2 = cast<Function>(*J);
385 int Res1 = FunctionComparator(F1, F2, &GlobalNumbers).compare();
386 int Res2 = FunctionComparator(F2, F1, &GlobalNumbers).compare();
387
388 // If F1 <= F2, then F2 >= F1, otherwise report failure.
389 if (Res1 != -Res2) {
390 dbgs() << "MERGEFUNC-VERIFY: Non-symmetric; triple: " << TripleNumber
391 << "\n";
392 dbgs() << *F1 << '\n' << *F2 << '\n';
393 Valid = false;
394 }
395
396 if (Res1 == 0)
397 continue;
398
399 unsigned k = j;
400 for (std::vector<WeakTrackingVH>::iterator K = J; K != E && k < Max;
401 ++k, ++K, ++TripleNumber) {
402 if (K == J)
403 continue;
404
405 Function *F3 = cast<Function>(*K);
406 int Res3 = FunctionComparator(F1, F3, &GlobalNumbers).compare();
407 int Res4 = FunctionComparator(F2, F3, &GlobalNumbers).compare();
408
409 bool Transitive = true;
410
411 if (Res1 != 0 && Res1 == Res4) {
412 // F1 > F2, F2 > F3 => F1 > F3
413 Transitive = Res3 == Res1;
414 } else if (Res3 != 0 && Res3 == -Res4) {
415 // F1 > F3, F3 > F2 => F1 > F2
416 Transitive = Res3 == Res1;
417 } else if (Res4 != 0 && -Res3 == Res4) {
418 // F2 > F3, F3 > F1 => F2 > F1
419 Transitive = Res4 == -Res1;
420 }
421
422 if (!Transitive) {
423 dbgs() << "MERGEFUNC-VERIFY: Non-transitive; triple: "
424 << TripleNumber << "\n";
425 dbgs() << "Res1, Res3, Res4: " << Res1 << ", " << Res3 << ", "
426 << Res4 << "\n";
427 dbgs() << *F1 << '\n' << *F2 << '\n' << *F3 << '\n';
428 Valid = false;
429 }
430 }
431 }
432 }
433
434 dbgs() << "MERGEFUNC-VERIFY: " << (Valid ? "Passed." : "Failed.") << "\n";
435 return Valid;
436 }
437 return true;
438}
439#endif
440
441/// Check whether \p F has an intrinsic which references
442/// distinct metadata as an operand. The most common
443/// instance of this would be CFI checks for function-local types.
445 for (const BasicBlock &BB : F) {
446 for (const Instruction &I : BB) {
447 if (!isa<IntrinsicInst>(&I))
448 continue;
449
450 for (Value *Op : I.operands()) {
451 auto *MDL = dyn_cast<MetadataAsValue>(Op);
452 if (!MDL)
453 continue;
454 if (MDNode *N = dyn_cast<MDNode>(MDL->getMetadata()))
455 if (N->isDistinct())
456 return true;
457 }
458 }
459 }
460 return false;
461}
462
463/// Check whether \p F is eligible for function merging.
465 return !F.isDeclaration() && !F.hasAvailableExternallyLinkage() &&
466 !F.hasFnAttribute(Attribute::NoIPA) &&
468}
469
470inline Function *asPtr(Function *Fn) { return Fn; }
471inline Function *asPtr(Function &Fn) { return &Fn; }
472
473template <typename FuncContainer> bool MergeFunctions::run(FuncContainer &M) {
474 bool Changed = false;
475
476 // All functions in the module, ordered by hash. Functions with a unique
477 // hash value are easily eliminated.
478 std::vector<std::pair<stable_hash, Function *>> HashedFuncs;
479 for (auto &Func : M) {
480 Function *FuncPtr = asPtr(Func);
481 if (isEligibleForMerging(*FuncPtr)) {
482 HashedFuncs.push_back({StructuralHash(*FuncPtr), FuncPtr});
483 }
484 }
485
486 llvm::stable_sort(HashedFuncs, less_first());
487
488 auto S = HashedFuncs.begin();
489 for (auto I = HashedFuncs.begin(), IE = HashedFuncs.end(); I != IE; ++I) {
490 // If the hash value matches the previous value or the next one, we must
491 // consider merging it. Otherwise it is dropped and never considered again.
492 if ((I != S && std::prev(I)->first == I->first) ||
493 (std::next(I) != IE && std::next(I)->first == I->first)) {
494 Deferred.push_back(WeakTrackingVH(I->second));
495 }
496 }
497
498 do {
499 std::vector<WeakTrackingVH> Worklist;
500 Deferred.swap(Worklist);
501
502 LLVM_DEBUG(doFunctionalCheck(Worklist));
503
504 LLVM_DEBUG(dbgs() << "size of module: " << M.size() << '\n');
505 LLVM_DEBUG(dbgs() << "size of worklist: " << Worklist.size() << '\n');
506
507 // Insert functions and merge them.
508 for (WeakTrackingVH &I : Worklist) {
509 if (!I)
510 continue;
512 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage() &&
513 !F->hasFnAttribute(Attribute::NoIPA)) {
514 Changed |= insert(F);
515 }
516 }
517 LLVM_DEBUG(dbgs() << "size of FnTree: " << FnTree.size() << '\n');
518 } while (!Deferred.empty());
519
520 FnTree.clear();
521 FNodesInTree.clear();
522 GlobalNumbers.clear();
523 Used.clear();
524
525 return Changed;
526}
527
529MergeFunctions::runOnFunctions(ArrayRef<Function *> Funcs) {
530 [[maybe_unused]] bool MergeResult = this->run(Funcs);
531 assert(MergeResult == !DelToNewMap.empty());
532 return this->DelToNewMap;
533}
534
535// Replace direct callers of Old with New.
536void MergeFunctions::replaceDirectCallers(Function *Old, Function *New) {
537 for (Use &U : make_early_inc_range(Old->uses())) {
538 CallBase *CB = dyn_cast<CallBase>(U.getUser());
539 if (CB && CB->isCallee(&U)) {
540 // Do not copy attributes from the called function to the call-site.
541 // Function comparison ensures that the attributes are the same up to
542 // type congruences in byval(), in which case we need to keep the byval
543 // type of the call-site, not the callee function.
544 remove(CB->getFunction());
545 U.set(New);
546 }
547 }
548}
549
550// Erase the instructions in PDIUnrelatedWL as they are unrelated to the
551// parameter debug info, from the entry block.
552void MergeFunctions::eraseInstsUnrelatedToPDI(
553 std::vector<Instruction *> &PDIUnrelatedWL,
554 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL) {
556 dbgs() << " Erasing instructions (in reverse order of appearance in "
557 "entry block) unrelated to parameter debug info from entry "
558 "block: {\n");
559 while (!PDIUnrelatedWL.empty()) {
560 Instruction *I = PDIUnrelatedWL.back();
561 LLVM_DEBUG(dbgs() << " Deleting Instruction: ");
562 LLVM_DEBUG(I->print(dbgs()));
563 LLVM_DEBUG(dbgs() << "\n");
564 I->eraseFromParent();
565 PDIUnrelatedWL.pop_back();
566 }
567
568 while (!PDVRUnrelatedWL.empty()) {
569 DbgVariableRecord *DVR = PDVRUnrelatedWL.back();
570 LLVM_DEBUG(dbgs() << " Deleting DbgVariableRecord ");
571 LLVM_DEBUG(DVR->print(dbgs()));
572 LLVM_DEBUG(dbgs() << "\n");
573 DVR->eraseFromParent();
574 PDVRUnrelatedWL.pop_back();
575 }
576
577 LLVM_DEBUG(dbgs() << " } // Done erasing instructions unrelated to parameter "
578 "debug info from entry block. \n");
579}
580
581// Reduce G to its entry block.
582void MergeFunctions::eraseTail(Function *G) {
583 std::vector<BasicBlock *> WorklistBB;
584 for (BasicBlock &BB : drop_begin(*G)) {
585 BB.dropAllReferences();
586 WorklistBB.push_back(&BB);
587 }
588 while (!WorklistBB.empty()) {
589 BasicBlock *BB = WorklistBB.back();
590 BB->eraseFromParent();
591 WorklistBB.pop_back();
592 }
593}
594
595// We are interested in the following instructions from the entry block as being
596// related to parameter debug info:
597// - @llvm.dbg.declare
598// - stores from the incoming parameters to locations on the stack-frame
599// - allocas that create these locations on the stack-frame
600// - @llvm.dbg.value
601// - the entry block's terminator
602// The rest are unrelated to debug info for the parameters; fill up
603// PDIUnrelatedWL with such instructions.
604void MergeFunctions::filterInstsUnrelatedToPDI(
605 BasicBlock *GEntryBlock, std::vector<Instruction *> &PDIUnrelatedWL,
606 std::vector<DbgVariableRecord *> &PDVRUnrelatedWL) {
607 std::set<Instruction *> PDIRelated;
608 std::set<DbgVariableRecord *> PDVRRelated;
609
610 // Work out whether a dbg.value intrinsic or an equivalent DbgVariableRecord
611 // is a parameter to be preserved.
612 auto ExamineDbgValue = [&PDVRRelated](DbgVariableRecord *DbgVal) {
613 LLVM_DEBUG(dbgs() << " Deciding: ");
614 LLVM_DEBUG(DbgVal->print(dbgs()));
615 LLVM_DEBUG(dbgs() << "\n");
616 DILocalVariable *DILocVar = DbgVal->getVariable();
617 if (DILocVar->isParameter()) {
618 LLVM_DEBUG(dbgs() << " Include (parameter): ");
619 LLVM_DEBUG(DbgVal->print(dbgs()));
620 LLVM_DEBUG(dbgs() << "\n");
621 PDVRRelated.insert(DbgVal);
622 } else {
623 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
624 LLVM_DEBUG(DbgVal->print(dbgs()));
625 LLVM_DEBUG(dbgs() << "\n");
626 }
627 };
628
629 auto ExamineDbgDeclare = [&PDIRelated,
630 &PDVRRelated](DbgVariableRecord *DbgDecl) {
631 LLVM_DEBUG(dbgs() << " Deciding: ");
632 LLVM_DEBUG(DbgDecl->print(dbgs()));
633 LLVM_DEBUG(dbgs() << "\n");
634 DILocalVariable *DILocVar = DbgDecl->getVariable();
635 if (DILocVar->isParameter()) {
636 LLVM_DEBUG(dbgs() << " Parameter: ");
637 LLVM_DEBUG(DILocVar->print(dbgs()));
638 AllocaInst *AI = dyn_cast_or_null<AllocaInst>(DbgDecl->getAddress());
639 if (AI) {
640 LLVM_DEBUG(dbgs() << " Processing alloca users: ");
641 LLVM_DEBUG(dbgs() << "\n");
642 for (User *U : AI->users()) {
643 if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
644 if (Value *Arg = SI->getValueOperand()) {
645 if (isa<Argument>(Arg)) {
646 LLVM_DEBUG(dbgs() << " Include: ");
647 LLVM_DEBUG(AI->print(dbgs()));
648 LLVM_DEBUG(dbgs() << "\n");
649 PDIRelated.insert(AI);
650 LLVM_DEBUG(dbgs() << " Include (parameter): ");
651 LLVM_DEBUG(SI->print(dbgs()));
652 LLVM_DEBUG(dbgs() << "\n");
653 PDIRelated.insert(SI);
654 LLVM_DEBUG(dbgs() << " Include: ");
655 LLVM_DEBUG(DbgDecl->print(dbgs()));
656 LLVM_DEBUG(dbgs() << "\n");
657 PDVRRelated.insert(DbgDecl);
658 } else {
659 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
660 LLVM_DEBUG(SI->print(dbgs()));
661 LLVM_DEBUG(dbgs() << "\n");
662 }
663 }
664 } else {
665 LLVM_DEBUG(dbgs() << " Defer: ");
666 LLVM_DEBUG(U->print(dbgs()));
667 LLVM_DEBUG(dbgs() << "\n");
668 }
669 }
670 } else {
671 LLVM_DEBUG(dbgs() << " Delete (alloca NULL): ");
672 LLVM_DEBUG(DbgDecl->print(dbgs()));
673 LLVM_DEBUG(dbgs() << "\n");
674 }
675 } else {
676 LLVM_DEBUG(dbgs() << " Delete (!parameter): ");
677 LLVM_DEBUG(DbgDecl->print(dbgs()));
678 LLVM_DEBUG(dbgs() << "\n");
679 }
680 };
681
682 for (BasicBlock::iterator BI = GEntryBlock->begin(), BIE = GEntryBlock->end();
683 BI != BIE; ++BI) {
684 // Examine DbgVariableRecords as they happen "before" the instruction. Are
685 // they connected to parameters?
686 for (DbgVariableRecord &DVR : filterDbgVars(BI->getDbgRecordRange())) {
687 if (DVR.isDbgValue() || DVR.isDbgAssign()) {
688 ExamineDbgValue(&DVR);
689 } else {
690 assert(DVR.isDbgDeclare());
691 ExamineDbgDeclare(&DVR);
692 }
693 }
694
695 if (BI->isTerminator() && &*BI == GEntryBlock->getTerminator()) {
696 LLVM_DEBUG(dbgs() << " Will Include Terminator: ");
697 LLVM_DEBUG(BI->print(dbgs()));
698 LLVM_DEBUG(dbgs() << "\n");
699 PDIRelated.insert(&*BI);
700 } else {
701 LLVM_DEBUG(dbgs() << " Defer: ");
702 LLVM_DEBUG(BI->print(dbgs()));
703 LLVM_DEBUG(dbgs() << "\n");
704 }
705 }
707 dbgs()
708 << " Report parameter debug info related/related instructions: {\n");
709
710 auto IsPDIRelated = [](auto *Rec, auto &Container, auto &UnrelatedCont) {
711 if (Container.find(Rec) == Container.end()) {
712 LLVM_DEBUG(dbgs() << " !PDIRelated: ");
713 LLVM_DEBUG(Rec->print(dbgs()));
714 LLVM_DEBUG(dbgs() << "\n");
715 UnrelatedCont.push_back(Rec);
716 } else {
717 LLVM_DEBUG(dbgs() << " PDIRelated: ");
718 LLVM_DEBUG(Rec->print(dbgs()));
719 LLVM_DEBUG(dbgs() << "\n");
720 }
721 };
722
723 // Collect the set of unrelated instructions and debug records.
724 for (Instruction &I : *GEntryBlock) {
725 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange()))
726 IsPDIRelated(&DVR, PDVRRelated, PDVRUnrelatedWL);
727 IsPDIRelated(&I, PDIRelated, PDIUnrelatedWL);
728 }
729 LLVM_DEBUG(dbgs() << " }\n");
730}
731
732/// Whether this function may be replaced by a forwarding thunk.
734 if (F->isVarArg())
735 return false;
736
737 if (F->hasKernelCallingConv())
738 return false;
739
740 // Don't merge tiny functions using a thunk, since it can just end up
741 // making the function larger.
742 if (F->size() == 1) {
743 if (F->front().size() < 2) {
744 LLVM_DEBUG(dbgs() << "canCreateThunkFor: " << F->getName()
745 << " is too small to bother creating a thunk for\n");
746 return false;
747 }
748 }
749 return true;
750}
751
752/// Copy all metadata of a specific kind from one function to another.
754 StringRef Kind) {
756 From->getMetadata(Kind, MDs);
757 for (MDNode *MD : MDs)
758 To->addMetadata(Kind, *MD);
759}
760
761// Replace G with a simple tail call to bitcast(F). Also (unless
762// MergeFunctionsPDI holds) replace direct uses of G with bitcast(F),
763// delete G. Under MergeFunctionsPDI, we use G itself for creating
764// the thunk as we preserve the debug info (and associated instructions)
765// from G's entry block pertaining to G's incoming arguments which are
766// passed on as corresponding arguments in the call that G makes to F.
767// For better debugability, under MergeFunctionsPDI, we do not modify G's
768// call sites to point to F even when within the same translation unit.
769void MergeFunctions::writeThunk(Function *F, Function *G) {
770 std::optional<uint64_t> GEntryCount = G->getEntryCount();
771 BasicBlock *GEntryBlock = nullptr;
772 std::vector<Instruction *> PDIUnrelatedWL;
773 std::vector<DbgVariableRecord *> PDVRUnrelatedWL;
774 BasicBlock *BB = nullptr;
775 Function *NewG = nullptr;
776 if (MergeFunctionsPDI) {
777 LLVM_DEBUG(dbgs() << "writeThunk: (MergeFunctionsPDI) Do not create a new "
778 "function as thunk; retain original: "
779 << G->getName() << "()\n");
780 GEntryBlock = &G->getEntryBlock();
782 dbgs() << "writeThunk: (MergeFunctionsPDI) filter parameter related "
783 "debug info for "
784 << G->getName() << "() {\n");
785 filterInstsUnrelatedToPDI(GEntryBlock, PDIUnrelatedWL, PDVRUnrelatedWL);
786 GEntryBlock->getTerminator()->eraseFromParent();
787 BB = GEntryBlock;
788 } else {
789 NewG = Function::Create(G->getFunctionType(), G->getLinkage(),
790 G->getAddressSpace(), "", G->getParent());
791 NewG->setComdat(G->getComdat());
792 BB = BasicBlock::Create(F->getContext(), "", NewG);
793 }
794
795 IRBuilder<> Builder(BB);
796 Function *H = MergeFunctionsPDI ? G : NewG;
798 unsigned i = 0;
799 FunctionType *FFTy = F->getFunctionType();
800 for (Argument &AI : H->args()) {
801 Args.push_back(Builder.CreateAggregateCast(&AI, FFTy->getParamType(i)));
802 ++i;
803 }
804
805 CallInst *CI = Builder.CreateCall(F, Args);
806 ReturnInst *RI = nullptr;
807 bool isSwiftTailCall = F->getCallingConv() == CallingConv::SwiftTail &&
808 G->getCallingConv() == CallingConv::SwiftTail;
809 CI->setTailCallKind(isSwiftTailCall ? CallInst::TCK_MustTail
811 CI->setCallingConv(F->getCallingConv());
812 CI->setAttributes(F->getAttributes());
813 if (H->getReturnType()->isVoidTy()) {
814 RI = Builder.CreateRetVoid();
815 } else {
816 RI = Builder.CreateRet(Builder.CreateAggregateCast(CI, H->getReturnType()));
817 }
818
819 if (MergeFunctionsPDI) {
820 DISubprogram *DIS = G->getSubprogram();
821 if (DIS) {
822 DebugLoc CIDbgLoc =
823 DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
824 DebugLoc RIDbgLoc =
825 DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
826 CI->setDebugLoc(CIDbgLoc);
827 RI->setDebugLoc(RIDbgLoc);
828 } else {
830 dbgs() << "writeThunk: (MergeFunctionsPDI) No DISubprogram for "
831 << G->getName() << "()\n");
832 }
833 eraseTail(G);
834 eraseInstsUnrelatedToPDI(PDIUnrelatedWL, PDVRUnrelatedWL);
836 dbgs() << "} // End of parameter related debug info filtering for: "
837 << G->getName() << "()\n");
838 } else {
839 NewG->copyAttributesFrom(G);
840 if (GEntryCount)
841 NewG->setEntryCount(*GEntryCount);
842 NewG->takeName(G);
843 // Ensure CFI type metadata is propagated to the new function.
844 copyMetadataIfPresent(G, NewG, "type");
845 copyMetadataIfPresent(G, NewG, "kcfi_type");
846 copyMetadataIfPresent(G, NewG, "callgraph");
847 removeUsers(G);
848 G->replaceAllUsesWith(NewG);
849 G->eraseFromParent();
850 }
851
852 LLVM_DEBUG(dbgs() << "writeThunk: " << H->getName() << '\n');
853 ++NumThunksWritten;
854}
855
856// Whether this function may be replaced by an alias
858 if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr())
859 return false;
860
861 // We should only see linkages supported by aliases here
862 assert(F->hasLocalLinkage() || F->hasExternalLinkage()
863 || F->hasWeakLinkage() || F->hasLinkOnceLinkage());
864 return true;
865}
866
867// Replace G with an alias to F (deleting function G)
868void MergeFunctions::writeAlias(Function *F, Function *G) {
869 PointerType *PtrType = G->getType();
870 auto *GA =
871 GlobalAlias::create(G->getFunctionType(), PtrType->getAddressSpace(),
872 G->getLinkage(), "", F, G->getParent());
873
874 const MaybeAlign FAlign = F->getAlign();
875 const MaybeAlign GAlign = G->getAlign();
876 if (FAlign || GAlign)
877 F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne()));
878 else
879 F->setAlignment(std::nullopt);
880 GA->takeName(G);
881 GA->setVisibility(G->getVisibility());
882 GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
883
884 removeUsers(G);
885 G->replaceAllUsesWith(GA);
886 G->eraseFromParent();
887
888 LLVM_DEBUG(dbgs() << "writeAlias: " << GA->getName() << '\n');
889 ++NumAliasesWritten;
890}
891
893 const Function &G) {
894 DenseSet<GlobalValue::GUID> AllImports = F.getImportGUIDs();
895 DenseSet<GlobalValue::GUID> GImports = G.getImportGUIDs();
896 AllImports.insert(GImports.begin(), GImports.end());
897 return AllImports;
898}
899
901 std::optional<uint64_t> FEntryCount = F.getEntryCount();
902 std::optional<uint64_t> GEntryCount = G.getEntryCount();
904 if (!FEntryCount && !GEntryCount && AllImports.empty())
905 return;
906
907 // -1 is a safe placeholder here, getEntryCount() already treats it as
908 // "unknown" (same sentinel SamplePGO uses for no-sample functions), so
909 // it won't look hot to anyone reading the count back.
910 uint64_t Sum = static_cast<uint64_t>(-1);
911 if (FEntryCount || GEntryCount)
912 Sum = SaturatingAdd(FEntryCount ? *FEntryCount : uint64_t{0},
913 GEntryCount ? *GEntryCount : uint64_t{0});
914 F.setEntryCount(Sum, AllImports.empty() ? nullptr : &AllImports);
915}
916
917bool MergeFunctions::writeThunkOrAliasIfNeeded(Function *F, Function *G,
918 bool MergeAnnotations) {
919 bool ShouldErase =
920 G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI;
921 bool ShouldAlias = canCreateAliasFor(G);
922 bool ShouldThunk = canCreateThunkFor(F);
923
924 if (!ShouldErase && !ShouldAlias && !ShouldThunk)
925 return false;
926
927 if (MergeAnnotations) {
928 mergeInstrAnnotations(F, G);
930 }
931
932 if (ShouldErase) {
933 G->eraseFromParent();
934 return true;
935 }
936
937 if (ShouldAlias) {
938 writeAlias(F, G);
939 return true;
940 }
941 if (ShouldThunk) {
942 writeThunk(F, G);
943 return true;
944 }
945
946 llvm_unreachable("Erase, alias or thunk must apply");
947}
948
949/// Returns true if \p F is either weak_odr or linkonce_odr.
950static bool isODR(const Function *F) {
951 return F->hasWeakODRLinkage() || F->hasLinkOnceODRLinkage();
952}
953
955 const BasicBlock *BB) {
956 if (auto Count = BFI.getBlockProfileCount(BB, /*AllowSynthetic=*/true))
957 return *Count;
958 return 1;
959}
960
961// The branch weights are relative within a function. Before merging we
962// normalize these to absolute counts.
963// (weight * BlockCount / TotalWeight)
964static uint64_t scaleToBlockCount(uint64_t Weight, uint64_t TotalWeight,
965 uint64_t BlockCount) {
966 if (Weight == 0 || TotalWeight == 0 || BlockCount == 0)
967 return 0;
968 APInt Num(128, BlockCount);
969 Num *= APInt(128, Weight);
970 APInt Den(128, TotalWeight);
971 Num = (Num + Den.lshr(1)).udiv(Den);
972 assert(Num.getActiveBits() <= 64 &&
973 "scaleToBlockCount: result exceeds uint64_t; Weight > TotalWeight?");
974 return Num.getLimitedValue();
975}
976
977// Combine the scaled branch_weights of corresponding instructions of F and G.
979 const Instruction *SrcI,
980 const BlockFrequencyInfo &DstBFI,
981 const BlockFrequencyInfo &SrcBFI) {
982 SmallVector<uint32_t, 8> DstWeights, SrcWeights;
983 bool HasDst = extractBranchWeights(*DstI, DstWeights);
984 bool HasSrc = extractBranchWeights(*SrcI, SrcWeights);
985 if (!HasDst && !HasSrc)
986 return;
987
988 uint64_t DstBlockCount = getBlockCountForMerging(DstBFI, DstI->getParent());
989 uint64_t SrcBlockCount = getBlockCountForMerging(SrcBFI, SrcI->getParent());
990
991 uint64_t DstTotal = 0, SrcTotal = 0;
992 if (HasDst)
993 extractProfTotalWeight(*DstI, DstTotal);
994 if (HasSrc)
995 extractProfTotalWeight(*SrcI, SrcTotal);
996
997 assert((!HasDst || !HasSrc || DstWeights.size() == SrcWeights.size()) &&
998 "equivalent branch/select instructions must have matching weight "
999 "arity");
1000 size_t NumWeights = HasDst ? DstWeights.size() : SrcWeights.size();
1001 SmallVector<uint64_t, 8> MergedWeights;
1002 MergedWeights.reserve(NumWeights);
1003 for (size_t I = 0; I < NumWeights; ++I) {
1004 uint64_t DstW = HasDst ? DstWeights[I] : 0;
1005 uint64_t SrcW = HasSrc ? SrcWeights[I] : 0;
1006 uint64_t DstAbs = scaleToBlockCount(DstW, DstTotal, DstBlockCount);
1007 uint64_t SrcAbs = scaleToBlockCount(SrcW, SrcTotal, SrcBlockCount);
1008 MergedWeights.push_back(SaturatingAdd(DstAbs, SrcAbs));
1009 }
1010
1011 bool IsExpected =
1013 setFittedBranchWeights(*DstI, MergedWeights, IsExpected);
1014}
1015
1016// Accumulate value profile counts of Instruction I into Merged. Value profile
1017// counts are absolute, not relative branch-style weights.
1020 uint64_t Total = 0;
1022 getValueProfDataFromInst(I, Kind, /*MaxNumValueData=*/UINT32_MAX, Total);
1023 if (VDs.empty())
1024 return;
1025 for (const InstrProfValueData &VD : VDs)
1026 Merged[VD.Value] = SaturatingAdd(Merged[VD.Value], VD.Count);
1027}
1028
1029// Merge (union) value profiles of Dst and Src.
1031 const Instruction *SrcI) {
1032 MDNode *DstProf = DstI->getMetadata(LLVMContext::MD_prof);
1033 MDNode *SrcProf = SrcI->getMetadata(LLVMContext::MD_prof);
1034 bool HasDst = DstProf && isValueProfileMD(DstProf);
1035 bool HasSrc = SrcProf && isValueProfileMD(SrcProf);
1036 if (!HasDst && !HasSrc)
1037 return;
1038
1039 auto *DstKind =
1040 HasDst ? mdconst::dyn_extract<ConstantInt>(DstProf->getOperand(1))
1041 : nullptr;
1042 auto *SrcKind =
1043 HasSrc ? mdconst::dyn_extract<ConstantInt>(SrcProf->getOperand(1))
1044 : nullptr;
1045 if (HasDst && HasSrc && DstKind && SrcKind &&
1046 DstKind->getZExtValue() != SrcKind->getZExtValue()) {
1047 DstI->setMetadata(LLVMContext::MD_prof, nullptr);
1048 return;
1049 }
1050
1051 const ConstantInt *KindCI = DstKind ? DstKind : SrcKind;
1052 if (!KindCI) {
1053 DstI->setMetadata(LLVMContext::MD_prof, nullptr);
1054 return;
1055 }
1056
1057 InstrProfValueKind Kind =
1058 static_cast<InstrProfValueKind>(KindCI->getZExtValue());
1059
1061 if (HasDst)
1062 addValueProfile(*DstI, Kind, Merged);
1063 if (HasSrc)
1064 addValueProfile(*SrcI, Kind, Merged);
1065
1066 if (Merged.empty())
1067 return;
1068
1070 VDs.reserve(Merged.size());
1071 uint64_t Sum = 0;
1072 for (auto &[Value, Count] : Merged) {
1073 VDs.push_back({Value, Count});
1074 Sum = SaturatingAdd(Sum, Count);
1075 }
1076 llvm::sort(VDs, [](const InstrProfValueData &A, const InstrProfValueData &B) {
1077 return A.Count > B.Count;
1078 });
1079 annotateValueSite(*DstI->getFunction()->getParent(), *DstI, VDs, Sum, Kind,
1080 VDs.size());
1081}
1082
1083void MergeFunctions::mergeInstrAnnotations(Function *Dst, Function *Src) {
1084 const BlockFrequencyInfo &DstBFI =
1086 const BlockFrequencyInfo &SrcBFI =
1088
1089 // FunctionComparator guarantees identical CFG topology and instruction
1090 // ordering. Walk the CFGs in RPO rather than function block-list order, as
1091 // equivalent functions need not store their basic blocks in the same order.
1094 for (auto [DstBB, SrcBB] : llvm::zip_equal(DstRPOT, SrcRPOT)) {
1095 for (auto [DstI, SrcI] : llvm::zip_equal(*DstBB, *SrcBB)) {
1096 // Merge poison-generating flags.
1097 DstI.andIRFlags(&SrcI);
1098
1099 MDNode *DstProf = DstI.getMetadata(LLVMContext::MD_prof);
1100 MDNode *SrcProf = SrcI.getMetadata(LLVMContext::MD_prof);
1101 if ((DstProf && isValueProfileMD(DstProf)) ||
1102 (SrcProf && isValueProfileMD(SrcProf)))
1103 mergeValueProfileOnInstructions(&DstI, &SrcI);
1104
1105 // Handle branch weights on SelectInsts here. Terminators are handled
1106 // separately below, outside the instruction loop.
1107 if (isa<SelectInst>(DstI))
1108 mergeBranchWeightsOnInstructions(&DstI, &SrcI, DstBFI, SrcBFI);
1109 }
1110 Instruction *DstTerm = DstBB->getTerminator();
1111 const Instruction *SrcTerm = SrcBB->getTerminator();
1112 mergeBranchWeightsOnInstructions(DstTerm, SrcTerm, DstBFI, SrcBFI);
1113 }
1114
1118 FAM.invalidate(*Dst, PA);
1119}
1120
1121// Merge two equivalent functions. Upon completion, Function G is deleted.
1122void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
1123
1124 std::optional<uint64_t> FEntryCount = F->getEntryCount();
1125
1126 // Create a new thunk that both F and G can call, if F cannot call G directly.
1127 // That is the case if F is either interposable or if G is either weak_odr or
1128 // linkonce_odr.
1129 if (F->isInterposable() || (isODR(F) && isODR(G))) {
1130 assert((!isODR(G) || isODR(F)) &&
1131 "if G is ODR, F must also be ODR due to ordering");
1132
1133 // Both writeThunkOrAliasIfNeeded() calls below must succeed, either because
1134 // we can create aliases for G and NewF, or because a thunk for F is
1135 // profitable. F here has the same signature as NewF below, so that's what
1136 // we check.
1137 if (!canCreateThunkFor(F) &&
1139 return;
1140
1141 // Make them both thunks to the same internal function.
1142 Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(),
1143 F->getAddressSpace(), "", F->getParent());
1144 NewF->copyAttributesFrom(F);
1145 NewF->takeName(F);
1146 NewF->setComdat(F->getComdat());
1147 F->setComdat(nullptr);
1148 // Ensure CFI type metadata is propagated to the new function.
1149 copyMetadataIfPresent(F, NewF, "type");
1150 copyMetadataIfPresent(F, NewF, "kcfi_type");
1151 copyMetadataIfPresent(F, NewF, "callgraph");
1152 removeUsers(F);
1153 F->replaceAllUsesWith(NewF);
1154
1155 // If G or NewF are (weak|linkonce)_odr, update all callers to call the
1156 // thunk.
1157 if (isODR(G))
1158 replaceDirectCallers(G, F);
1159 if (isODR(F))
1160 replaceDirectCallers(NewF, F);
1161
1162 // We collect alignment before writeThunkOrAliasIfNeeded that overwrites
1163 // NewF and G's content.
1164 const MaybeAlign NewFAlign = NewF->getAlign();
1165 const MaybeAlign GAlign = G->getAlign();
1166
1167 // Merge !prof, while G still has its body.
1168 writeThunkOrAliasIfNeeded(F, G, /*MergeAnnotations=*/true);
1169 if (FEntryCount)
1170 NewF->setEntryCount(*FEntryCount);
1171 // NewF becomes thunk/alias to the shared body F, it has no annotations to
1172 // be merged.
1173 writeThunkOrAliasIfNeeded(F, NewF, /*MergeAnnotations=*/false);
1174
1175 if (NewFAlign || GAlign)
1176 F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne()));
1177 else
1178 F->setAlignment(std::nullopt);
1179 F->setLinkage(GlobalValue::PrivateLinkage);
1180 ++NumDoubleWeak;
1181 ++NumFunctionsMerged;
1182 } else {
1183 // For better debugability, under MergeFunctionsPDI, we do not modify G's
1184 // call sites to point to F even when within the same translation unit.
1185 if (!G->isInterposable() && !MergeFunctionsPDI) {
1186 // Functions referred to by llvm.used/llvm.compiler.used are special:
1187 // there are uses of the symbol name that are not visible to LLVM,
1188 // usually from inline asm.
1189 if (G->hasGlobalUnnamedAddr() && !Used.contains(G)) {
1190 // G might have been a key in our GlobalNumberState, and it's illegal
1191 // to replace a key in ValueMap<GlobalValue *> with a non-global.
1192 GlobalNumbers.erase(G);
1193 // If G's address is not significant, replace it entirely.
1194 removeUsers(G);
1195 G->replaceAllUsesWith(F);
1196 } else {
1197 // Redirect direct callers of G to F. (See note on MergeFunctionsPDI
1198 // above).
1199 replaceDirectCallers(G, F);
1200 }
1201 }
1202
1203 // If G was internal then we may have replaced all uses of G with F. If so,
1204 // stop here and delete G. There's no need for a thunk. (See note on
1205 // MergeFunctionsPDI above).
1206 if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) {
1207 mergeInstrAnnotations(F, G);
1209 G->eraseFromParent();
1210 ++NumFunctionsMerged;
1211 return;
1212 }
1213
1214 if (writeThunkOrAliasIfNeeded(F, G, /*MergeAnnotations=*/true))
1215 ++NumFunctionsMerged;
1216 }
1217}
1218
1219/// Replace function F by function G.
1220void MergeFunctions::replaceFunctionInTree(const FunctionNode &FN,
1221 Function *G) {
1222 Function *F = FN.getFunc();
1223 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 &&
1224 "The two functions must be equal");
1225
1226 auto I = FNodesInTree.find(F);
1227 assert(I != FNodesInTree.end() && "F should be in FNodesInTree");
1228 assert(FNodesInTree.count(G) == 0 && "FNodesInTree should not contain G");
1229
1230 FnTreeType::iterator IterToFNInFnTree = I->second;
1231 assert(&(*IterToFNInFnTree) == &FN && "F should map to FN in FNodesInTree.");
1232 // Remove F -> FN and insert G -> FN
1233 FNodesInTree.erase(I);
1234 FNodesInTree.insert({G, IterToFNInFnTree});
1235 // Replace F with G in FN, which is stored inside the FnTree.
1236 FN.replaceBy(G);
1237}
1238
1239// Ordering for functions that are equal under FunctionComparator
1240static bool isFuncOrderCorrect(const Function *F, const Function *G) {
1241 if (isODR(F) != isODR(G)) {
1242 // ODR functions before non-ODR functions. A ODR function can call a non-ODR
1243 // function if it is not interposable, but not the other way around.
1244 return isODR(G);
1245 }
1246
1247 if (F->isInterposable() != G->isInterposable()) {
1248 // Strong before weak, because the weak function may call the strong
1249 // one, but not the other way around.
1250 return !F->isInterposable();
1251 }
1252
1253 if (F->hasLocalLinkage() != G->hasLocalLinkage()) {
1254 // External before local, because we definitely have to keep the external
1255 // function, but may be able to drop the local one.
1256 return !F->hasLocalLinkage();
1257 }
1258
1259 // Impose a total order (by name) on the replacement of functions. This is
1260 // important when operating on more than one module independently to prevent
1261 // cycles of thunks calling each other when the modules are linked together.
1262 return F->getName() <= G->getName();
1263}
1264
1265// Insert a ComparableFunction into the FnTree, or merge it away if equal to one
1266// that was already inserted.
1267bool MergeFunctions::insert(Function *NewFunction) {
1268 std::pair<FnTreeType::iterator, bool> Result =
1269 FnTree.insert(FunctionNode(NewFunction));
1270
1271 if (Result.second) {
1272 assert(FNodesInTree.count(NewFunction) == 0);
1273 FNodesInTree.insert({NewFunction, Result.first});
1274 LLVM_DEBUG(dbgs() << "Inserting as unique: " << NewFunction->getName()
1275 << '\n');
1276 return false;
1277 }
1278
1279 const FunctionNode &OldF = *Result.first;
1280
1281 if (!isFuncOrderCorrect(OldF.getFunc(), NewFunction)) {
1282 // Swap the two functions.
1283 Function *F = OldF.getFunc();
1284 replaceFunctionInTree(*Result.first, NewFunction);
1285 NewFunction = F;
1286 assert(OldF.getFunc() != F && "Must have swapped the functions.");
1287 }
1288
1289 // Capture the Function pointer before mergeTwoFunctions, which may invalidate
1290 // OldF by erasing it from FnTree via removeUsers().
1291 Function *OldFunc = OldF.getFunc();
1292
1293 LLVM_DEBUG(dbgs() << " " << OldFunc->getName()
1294 << " == " << NewFunction->getName() << '\n');
1295
1296 Function *DeleteF = NewFunction;
1297 mergeTwoFunctions(OldFunc, DeleteF);
1298 this->DelToNewMap.insert({DeleteF, OldFunc});
1299 return true;
1300}
1301
1302// Remove a function from FnTree. If it was already in FnTree, add
1303// it to Deferred so that we'll look at it in the next round.
1304void MergeFunctions::remove(Function *F) {
1305 auto I = FNodesInTree.find(F);
1306 if (I != FNodesInTree.end()) {
1307 LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n");
1308 FnTree.erase(I->second);
1309 // I->second has been invalidated, remove it from the FNodesInTree map to
1310 // preserve the invariant.
1311 FNodesInTree.erase(I);
1312 Deferred.emplace_back(F);
1313 }
1314}
1315
1316// For each instruction used by the value, remove() the function that contains
1317// the instruction. This should happen right before a call to RAUW.
1318void MergeFunctions::removeUsers(Value *V) {
1319 for (User *U : V->users())
1320 if (auto *I = dyn_cast<Instruction>(U))
1321 remove(I->getFunction());
1322}
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 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 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:1600
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1533
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:472
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:854
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:172
bool empty() const
Definition DenseMap.h:171
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:2910
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.
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:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
LLVMContext & getContext() const
Definition Metadata.h:1233
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)
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< user_iterator > users()
Definition Value.h:426
iterator_range< use_iterator > uses()
Definition Value.h:380
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)
DXILDebugInfoMap run(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:696
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:315
void stable_sort(R &&Range)
Definition STLExtras.h:2116
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:840
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:633
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 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:1636
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
DWARFExpression::Operation Op
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:932
#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:1439