xref: /freebsd/contrib/llvm-project/llvm/lib/Transforms/IPO/MergeFunctions.cpp (revision d54a7d337331d991e039e4f42f6b4dc64aedce08)
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  
91  #include "llvm/Transforms/IPO/MergeFunctions.h"
92  #include "llvm/ADT/ArrayRef.h"
93  #include "llvm/ADT/SmallVector.h"
94  #include "llvm/ADT/Statistic.h"
95  #include "llvm/IR/Argument.h"
96  #include "llvm/IR/BasicBlock.h"
97  #include "llvm/IR/Constant.h"
98  #include "llvm/IR/Constants.h"
99  #include "llvm/IR/DebugInfoMetadata.h"
100  #include "llvm/IR/DebugLoc.h"
101  #include "llvm/IR/DerivedTypes.h"
102  #include "llvm/IR/Function.h"
103  #include "llvm/IR/GlobalValue.h"
104  #include "llvm/IR/IRBuilder.h"
105  #include "llvm/IR/InstrTypes.h"
106  #include "llvm/IR/Instruction.h"
107  #include "llvm/IR/Instructions.h"
108  #include "llvm/IR/IntrinsicInst.h"
109  #include "llvm/IR/Module.h"
110  #include "llvm/IR/Type.h"
111  #include "llvm/IR/Use.h"
112  #include "llvm/IR/User.h"
113  #include "llvm/IR/Value.h"
114  #include "llvm/IR/ValueHandle.h"
115  #include "llvm/InitializePasses.h"
116  #include "llvm/Pass.h"
117  #include "llvm/Support/Casting.h"
118  #include "llvm/Support/CommandLine.h"
119  #include "llvm/Support/Debug.h"
120  #include "llvm/Support/raw_ostream.h"
121  #include "llvm/Transforms/IPO.h"
122  #include "llvm/Transforms/Utils/FunctionComparator.h"
123  #include "llvm/Transforms/Utils/ModuleUtils.h"
124  #include <algorithm>
125  #include <cassert>
126  #include <iterator>
127  #include <set>
128  #include <utility>
129  #include <vector>
130  
131  using namespace llvm;
132  
133  #define DEBUG_TYPE "mergefunc"
134  
135  STATISTIC(NumFunctionsMerged, "Number of functions merged");
136  STATISTIC(NumThunksWritten, "Number of thunks generated");
137  STATISTIC(NumAliasesWritten, "Number of aliases generated");
138  STATISTIC(NumDoubleWeak, "Number of new functions created");
139  
140  static cl::opt<unsigned> NumFunctionsForVerificationCheck(
141      "mergefunc-verify",
142      cl::desc("How many functions in a module could be used for "
143               "MergeFunctions to pass a basic correctness check. "
144               "'0' disables this check. Works only with '-debug' key."),
145      cl::init(0), cl::Hidden);
146  
147  // Under option -mergefunc-preserve-debug-info we:
148  // - Do not create a new function for a thunk.
149  // - Retain the debug info for a thunk's parameters (and associated
150  //   instructions for the debug info) from the entry block.
151  //   Note: -debug will display the algorithm at work.
152  // - Create debug-info for the call (to the shared implementation) made by
153  //   a thunk and its return value.
154  // - Erase the rest of the function, retaining the (minimally sized) entry
155  //   block to create a thunk.
156  // - Preserve a thunk's call site to point to the thunk even when both occur
157  //   within the same translation unit, to aid debugability. Note that this
158  //   behaviour differs from the underlying -mergefunc implementation which
159  //   modifies the thunk's call site to point to the shared implementation
160  //   when both occur within the same translation unit.
161  static cl::opt<bool>
162      MergeFunctionsPDI("mergefunc-preserve-debug-info", cl::Hidden,
163                        cl::init(false),
164                        cl::desc("Preserve debug info in thunk when mergefunc "
165                                 "transformations are made."));
166  
167  static cl::opt<bool>
168      MergeFunctionsAliases("mergefunc-use-aliases", cl::Hidden,
169                            cl::init(false),
170                            cl::desc("Allow mergefunc to create aliases"));
171  
172  namespace {
173  
174  class FunctionNode {
175    mutable AssertingVH<Function> F;
176    FunctionComparator::FunctionHash Hash;
177  
178  public:
179    // Note the hash is recalculated potentially multiple times, but it is cheap.
180    FunctionNode(Function *F)
181      : F(F), Hash(FunctionComparator::functionHash(*F))  {}
182  
183    Function *getFunc() const { return F; }
184    FunctionComparator::FunctionHash getHash() const { return Hash; }
185  
186    /// Replace the reference to the function F by the function G, assuming their
187    /// implementations are equal.
188    void replaceBy(Function *G) const {
189      F = G;
190    }
191  };
192  
193  /// MergeFunctions finds functions which will generate identical machine code,
194  /// by considering all pointer types to be equivalent. Once identified,
195  /// MergeFunctions will fold them by replacing a call to one to a call to a
196  /// bitcast of the other.
197  class MergeFunctions {
198  public:
199    MergeFunctions() : FnTree(FunctionNodeCmp(&GlobalNumbers)) {
200    }
201  
202    bool runOnModule(Module &M);
203  
204  private:
205    // The function comparison operator is provided here so that FunctionNodes do
206    // not need to become larger with another pointer.
207    class FunctionNodeCmp {
208      GlobalNumberState* GlobalNumbers;
209  
210    public:
211      FunctionNodeCmp(GlobalNumberState* GN) : GlobalNumbers(GN) {}
212  
213      bool operator()(const FunctionNode &LHS, const FunctionNode &RHS) const {
214        // Order first by hashes, then full function comparison.
215        if (LHS.getHash() != RHS.getHash())
216          return LHS.getHash() < RHS.getHash();
217        FunctionComparator FCmp(LHS.getFunc(), RHS.getFunc(), GlobalNumbers);
218        return FCmp.compare() < 0;
219      }
220    };
221    using FnTreeType = std::set<FunctionNode, FunctionNodeCmp>;
222  
223    GlobalNumberState GlobalNumbers;
224  
225    /// A work queue of functions that may have been modified and should be
226    /// analyzed again.
227    std::vector<WeakTrackingVH> Deferred;
228  
229    /// Set of values marked as used in llvm.used and llvm.compiler.used.
230    SmallPtrSet<GlobalValue *, 4> Used;
231  
232  #ifndef NDEBUG
233    /// Checks the rules of order relation introduced among functions set.
234    /// Returns true, if check has been passed, and false if failed.
235    bool doFunctionalCheck(std::vector<WeakTrackingVH> &Worklist);
236  #endif
237  
238    /// Insert a ComparableFunction into the FnTree, or merge it away if it's
239    /// equal to one that's already present.
240    bool insert(Function *NewFunction);
241  
242    /// Remove a Function from the FnTree and queue it up for a second sweep of
243    /// analysis.
244    void remove(Function *F);
245  
246    /// Find the functions that use this Value and remove them from FnTree and
247    /// queue the functions.
248    void removeUsers(Value *V);
249  
250    /// Replace all direct calls of Old with calls of New. Will bitcast New if
251    /// necessary to make types match.
252    void replaceDirectCallers(Function *Old, Function *New);
253  
254    /// Merge two equivalent functions. Upon completion, G may be deleted, or may
255    /// be converted into a thunk. In either case, it should never be visited
256    /// again.
257    void mergeTwoFunctions(Function *F, Function *G);
258  
259    /// Fill PDIUnrelatedWL with instructions from the entry block that are
260    /// unrelated to parameter related debug info.
261    void filterInstsUnrelatedToPDI(BasicBlock *GEntryBlock,
262                                   std::vector<Instruction *> &PDIUnrelatedWL);
263  
264    /// Erase the rest of the CFG (i.e. barring the entry block).
265    void eraseTail(Function *G);
266  
267    /// Erase the instructions in PDIUnrelatedWL as they are unrelated to the
268    /// parameter debug info, from the entry block.
269    void eraseInstsUnrelatedToPDI(std::vector<Instruction *> &PDIUnrelatedWL);
270  
271    /// Replace G with a simple tail call to bitcast(F). Also (unless
272    /// MergeFunctionsPDI holds) replace direct uses of G with bitcast(F),
273    /// delete G.
274    void writeThunk(Function *F, Function *G);
275  
276    // Replace G with an alias to F (deleting function G)
277    void writeAlias(Function *F, Function *G);
278  
279    // Replace G with an alias to F if possible, or a thunk to F if possible.
280    // Returns false if neither is the case.
281    bool writeThunkOrAlias(Function *F, Function *G);
282  
283    /// Replace function F with function G in the function tree.
284    void replaceFunctionInTree(const FunctionNode &FN, Function *G);
285  
286    /// The set of all distinct functions. Use the insert() and remove() methods
287    /// to modify it. The map allows efficient lookup and deferring of Functions.
288    FnTreeType FnTree;
289  
290    // Map functions to the iterators of the FunctionNode which contains them
291    // in the FnTree. This must be updated carefully whenever the FnTree is
292    // modified, i.e. in insert(), remove(), and replaceFunctionInTree(), to avoid
293    // dangling iterators into FnTree. The invariant that preserves this is that
294    // there is exactly one mapping F -> FN for each FunctionNode FN in FnTree.
295    DenseMap<AssertingVH<Function>, FnTreeType::iterator> FNodesInTree;
296  };
297  
298  class MergeFunctionsLegacyPass : public ModulePass {
299  public:
300    static char ID;
301  
302    MergeFunctionsLegacyPass(): ModulePass(ID) {
303      initializeMergeFunctionsLegacyPassPass(*PassRegistry::getPassRegistry());
304    }
305  
306    bool runOnModule(Module &M) override {
307      if (skipModule(M))
308        return false;
309  
310      MergeFunctions MF;
311      return MF.runOnModule(M);
312    }
313  };
314  
315  } // end anonymous namespace
316  
317  char MergeFunctionsLegacyPass::ID = 0;
318  INITIALIZE_PASS(MergeFunctionsLegacyPass, "mergefunc",
319                  "Merge Functions", false, false)
320  
321  ModulePass *llvm::createMergeFunctionsPass() {
322    return new MergeFunctionsLegacyPass();
323  }
324  
325  PreservedAnalyses MergeFunctionsPass::run(Module &M,
326                                            ModuleAnalysisManager &AM) {
327    MergeFunctions MF;
328    if (!MF.runOnModule(M))
329      return PreservedAnalyses::all();
330    return PreservedAnalyses::none();
331  }
332  
333  #ifndef NDEBUG
334  bool MergeFunctions::doFunctionalCheck(std::vector<WeakTrackingVH> &Worklist) {
335    if (const unsigned Max = NumFunctionsForVerificationCheck) {
336      unsigned TripleNumber = 0;
337      bool Valid = true;
338  
339      dbgs() << "MERGEFUNC-VERIFY: Started for first " << Max << " functions.\n";
340  
341      unsigned i = 0;
342      for (std::vector<WeakTrackingVH>::iterator I = Worklist.begin(),
343                                                 E = Worklist.end();
344           I != E && i < Max; ++I, ++i) {
345        unsigned j = i;
346        for (std::vector<WeakTrackingVH>::iterator J = I; J != E && j < Max;
347             ++J, ++j) {
348          Function *F1 = cast<Function>(*I);
349          Function *F2 = cast<Function>(*J);
350          int Res1 = FunctionComparator(F1, F2, &GlobalNumbers).compare();
351          int Res2 = FunctionComparator(F2, F1, &GlobalNumbers).compare();
352  
353          // If F1 <= F2, then F2 >= F1, otherwise report failure.
354          if (Res1 != -Res2) {
355            dbgs() << "MERGEFUNC-VERIFY: Non-symmetric; triple: " << TripleNumber
356                   << "\n";
357            dbgs() << *F1 << '\n' << *F2 << '\n';
358            Valid = false;
359          }
360  
361          if (Res1 == 0)
362            continue;
363  
364          unsigned k = j;
365          for (std::vector<WeakTrackingVH>::iterator K = J; K != E && k < Max;
366               ++k, ++K, ++TripleNumber) {
367            if (K == J)
368              continue;
369  
370            Function *F3 = cast<Function>(*K);
371            int Res3 = FunctionComparator(F1, F3, &GlobalNumbers).compare();
372            int Res4 = FunctionComparator(F2, F3, &GlobalNumbers).compare();
373  
374            bool Transitive = true;
375  
376            if (Res1 != 0 && Res1 == Res4) {
377              // F1 > F2, F2 > F3 => F1 > F3
378              Transitive = Res3 == Res1;
379            } else if (Res3 != 0 && Res3 == -Res4) {
380              // F1 > F3, F3 > F2 => F1 > F2
381              Transitive = Res3 == Res1;
382            } else if (Res4 != 0 && -Res3 == Res4) {
383              // F2 > F3, F3 > F1 => F2 > F1
384              Transitive = Res4 == -Res1;
385            }
386  
387            if (!Transitive) {
388              dbgs() << "MERGEFUNC-VERIFY: Non-transitive; triple: "
389                     << TripleNumber << "\n";
390              dbgs() << "Res1, Res3, Res4: " << Res1 << ", " << Res3 << ", "
391                     << Res4 << "\n";
392              dbgs() << *F1 << '\n' << *F2 << '\n' << *F3 << '\n';
393              Valid = false;
394            }
395          }
396        }
397      }
398  
399      dbgs() << "MERGEFUNC-VERIFY: " << (Valid ? "Passed." : "Failed.") << "\n";
400      return Valid;
401    }
402    return true;
403  }
404  #endif
405  
406  /// Check whether \p F is eligible for function merging.
407  static bool isEligibleForMerging(Function &F) {
408    return !F.isDeclaration() && !F.hasAvailableExternallyLinkage();
409  }
410  
411  bool MergeFunctions::runOnModule(Module &M) {
412    bool Changed = false;
413  
414    SmallVector<GlobalValue *, 4> UsedV;
415    collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/false);
416    collectUsedGlobalVariables(M, UsedV, /*CompilerUsed=*/true);
417    Used.insert(UsedV.begin(), UsedV.end());
418  
419    // All functions in the module, ordered by hash. Functions with a unique
420    // hash value are easily eliminated.
421    std::vector<std::pair<FunctionComparator::FunctionHash, Function *>>
422      HashedFuncs;
423    for (Function &Func : M) {
424      if (isEligibleForMerging(Func)) {
425        HashedFuncs.push_back({FunctionComparator::functionHash(Func), &Func});
426      }
427    }
428  
429    llvm::stable_sort(HashedFuncs, less_first());
430  
431    auto S = HashedFuncs.begin();
432    for (auto I = HashedFuncs.begin(), IE = HashedFuncs.end(); I != IE; ++I) {
433      // If the hash value matches the previous value or the next one, we must
434      // consider merging it. Otherwise it is dropped and never considered again.
435      if ((I != S && std::prev(I)->first == I->first) ||
436          (std::next(I) != IE && std::next(I)->first == I->first) ) {
437        Deferred.push_back(WeakTrackingVH(I->second));
438      }
439    }
440  
441    do {
442      std::vector<WeakTrackingVH> Worklist;
443      Deferred.swap(Worklist);
444  
445      LLVM_DEBUG(doFunctionalCheck(Worklist));
446  
447      LLVM_DEBUG(dbgs() << "size of module: " << M.size() << '\n');
448      LLVM_DEBUG(dbgs() << "size of worklist: " << Worklist.size() << '\n');
449  
450      // Insert functions and merge them.
451      for (WeakTrackingVH &I : Worklist) {
452        if (!I)
453          continue;
454        Function *F = cast<Function>(I);
455        if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage()) {
456          Changed |= insert(F);
457        }
458      }
459      LLVM_DEBUG(dbgs() << "size of FnTree: " << FnTree.size() << '\n');
460    } while (!Deferred.empty());
461  
462    FnTree.clear();
463    FNodesInTree.clear();
464    GlobalNumbers.clear();
465    Used.clear();
466  
467    return Changed;
468  }
469  
470  // Replace direct callers of Old with New.
471  void MergeFunctions::replaceDirectCallers(Function *Old, Function *New) {
472    Constant *BitcastNew = ConstantExpr::getBitCast(New, Old->getType());
473    for (Use &U : llvm::make_early_inc_range(Old->uses())) {
474      CallBase *CB = dyn_cast<CallBase>(U.getUser());
475      if (CB && CB->isCallee(&U)) {
476        // Do not copy attributes from the called function to the call-site.
477        // Function comparison ensures that the attributes are the same up to
478        // type congruences in byval(), in which case we need to keep the byval
479        // type of the call-site, not the callee function.
480        remove(CB->getFunction());
481        U.set(BitcastNew);
482      }
483    }
484  }
485  
486  // Helper for writeThunk,
487  // Selects proper bitcast operation,
488  // but a bit simpler then CastInst::getCastOpcode.
489  static Value *createCast(IRBuilder<> &Builder, Value *V, Type *DestTy) {
490    Type *SrcTy = V->getType();
491    if (SrcTy->isStructTy()) {
492      assert(DestTy->isStructTy());
493      assert(SrcTy->getStructNumElements() == DestTy->getStructNumElements());
494      Value *Result = PoisonValue::get(DestTy);
495      for (unsigned int I = 0, E = SrcTy->getStructNumElements(); I < E; ++I) {
496        Value *Element =
497            createCast(Builder, Builder.CreateExtractValue(V, ArrayRef(I)),
498                       DestTy->getStructElementType(I));
499  
500        Result = Builder.CreateInsertValue(Result, Element, ArrayRef(I));
501      }
502      return Result;
503    }
504    assert(!DestTy->isStructTy());
505    if (SrcTy->isIntegerTy() && DestTy->isPointerTy())
506      return Builder.CreateIntToPtr(V, DestTy);
507    else if (SrcTy->isPointerTy() && DestTy->isIntegerTy())
508      return Builder.CreatePtrToInt(V, DestTy);
509    else
510      return Builder.CreateBitCast(V, DestTy);
511  }
512  
513  // Erase the instructions in PDIUnrelatedWL as they are unrelated to the
514  // parameter debug info, from the entry block.
515  void MergeFunctions::eraseInstsUnrelatedToPDI(
516      std::vector<Instruction *> &PDIUnrelatedWL) {
517    LLVM_DEBUG(
518        dbgs() << " Erasing instructions (in reverse order of appearance in "
519                  "entry block) unrelated to parameter debug info from entry "
520                  "block: {\n");
521    while (!PDIUnrelatedWL.empty()) {
522      Instruction *I = PDIUnrelatedWL.back();
523      LLVM_DEBUG(dbgs() << "  Deleting Instruction: ");
524      LLVM_DEBUG(I->print(dbgs()));
525      LLVM_DEBUG(dbgs() << "\n");
526      I->eraseFromParent();
527      PDIUnrelatedWL.pop_back();
528    }
529    LLVM_DEBUG(dbgs() << " } // Done erasing instructions unrelated to parameter "
530                         "debug info from entry block. \n");
531  }
532  
533  // Reduce G to its entry block.
534  void MergeFunctions::eraseTail(Function *G) {
535    std::vector<BasicBlock *> WorklistBB;
536    for (BasicBlock &BB : drop_begin(*G)) {
537      BB.dropAllReferences();
538      WorklistBB.push_back(&BB);
539    }
540    while (!WorklistBB.empty()) {
541      BasicBlock *BB = WorklistBB.back();
542      BB->eraseFromParent();
543      WorklistBB.pop_back();
544    }
545  }
546  
547  // We are interested in the following instructions from the entry block as being
548  // related to parameter debug info:
549  // - @llvm.dbg.declare
550  // - stores from the incoming parameters to locations on the stack-frame
551  // - allocas that create these locations on the stack-frame
552  // - @llvm.dbg.value
553  // - the entry block's terminator
554  // The rest are unrelated to debug info for the parameters; fill up
555  // PDIUnrelatedWL with such instructions.
556  void MergeFunctions::filterInstsUnrelatedToPDI(
557      BasicBlock *GEntryBlock, std::vector<Instruction *> &PDIUnrelatedWL) {
558    std::set<Instruction *> PDIRelated;
559    for (BasicBlock::iterator BI = GEntryBlock->begin(), BIE = GEntryBlock->end();
560         BI != BIE; ++BI) {
561      if (auto *DVI = dyn_cast<DbgValueInst>(&*BI)) {
562        LLVM_DEBUG(dbgs() << " Deciding: ");
563        LLVM_DEBUG(BI->print(dbgs()));
564        LLVM_DEBUG(dbgs() << "\n");
565        DILocalVariable *DILocVar = DVI->getVariable();
566        if (DILocVar->isParameter()) {
567          LLVM_DEBUG(dbgs() << "  Include (parameter): ");
568          LLVM_DEBUG(BI->print(dbgs()));
569          LLVM_DEBUG(dbgs() << "\n");
570          PDIRelated.insert(&*BI);
571        } else {
572          LLVM_DEBUG(dbgs() << "  Delete (!parameter): ");
573          LLVM_DEBUG(BI->print(dbgs()));
574          LLVM_DEBUG(dbgs() << "\n");
575        }
576      } else if (auto *DDI = dyn_cast<DbgDeclareInst>(&*BI)) {
577        LLVM_DEBUG(dbgs() << " Deciding: ");
578        LLVM_DEBUG(BI->print(dbgs()));
579        LLVM_DEBUG(dbgs() << "\n");
580        DILocalVariable *DILocVar = DDI->getVariable();
581        if (DILocVar->isParameter()) {
582          LLVM_DEBUG(dbgs() << "  Parameter: ");
583          LLVM_DEBUG(DILocVar->print(dbgs()));
584          AllocaInst *AI = dyn_cast_or_null<AllocaInst>(DDI->getAddress());
585          if (AI) {
586            LLVM_DEBUG(dbgs() << "  Processing alloca users: ");
587            LLVM_DEBUG(dbgs() << "\n");
588            for (User *U : AI->users()) {
589              if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
590                if (Value *Arg = SI->getValueOperand()) {
591                  if (isa<Argument>(Arg)) {
592                    LLVM_DEBUG(dbgs() << "  Include: ");
593                    LLVM_DEBUG(AI->print(dbgs()));
594                    LLVM_DEBUG(dbgs() << "\n");
595                    PDIRelated.insert(AI);
596                    LLVM_DEBUG(dbgs() << "   Include (parameter): ");
597                    LLVM_DEBUG(SI->print(dbgs()));
598                    LLVM_DEBUG(dbgs() << "\n");
599                    PDIRelated.insert(SI);
600                    LLVM_DEBUG(dbgs() << "  Include: ");
601                    LLVM_DEBUG(BI->print(dbgs()));
602                    LLVM_DEBUG(dbgs() << "\n");
603                    PDIRelated.insert(&*BI);
604                  } else {
605                    LLVM_DEBUG(dbgs() << "   Delete (!parameter): ");
606                    LLVM_DEBUG(SI->print(dbgs()));
607                    LLVM_DEBUG(dbgs() << "\n");
608                  }
609                }
610              } else {
611                LLVM_DEBUG(dbgs() << "   Defer: ");
612                LLVM_DEBUG(U->print(dbgs()));
613                LLVM_DEBUG(dbgs() << "\n");
614              }
615            }
616          } else {
617            LLVM_DEBUG(dbgs() << "  Delete (alloca NULL): ");
618            LLVM_DEBUG(BI->print(dbgs()));
619            LLVM_DEBUG(dbgs() << "\n");
620          }
621        } else {
622          LLVM_DEBUG(dbgs() << "  Delete (!parameter): ");
623          LLVM_DEBUG(BI->print(dbgs()));
624          LLVM_DEBUG(dbgs() << "\n");
625        }
626      } else if (BI->isTerminator() && &*BI == GEntryBlock->getTerminator()) {
627        LLVM_DEBUG(dbgs() << " Will Include Terminator: ");
628        LLVM_DEBUG(BI->print(dbgs()));
629        LLVM_DEBUG(dbgs() << "\n");
630        PDIRelated.insert(&*BI);
631      } else {
632        LLVM_DEBUG(dbgs() << " Defer: ");
633        LLVM_DEBUG(BI->print(dbgs()));
634        LLVM_DEBUG(dbgs() << "\n");
635      }
636    }
637    LLVM_DEBUG(
638        dbgs()
639        << " Report parameter debug info related/related instructions: {\n");
640    for (Instruction &I : *GEntryBlock) {
641      if (PDIRelated.find(&I) == PDIRelated.end()) {
642        LLVM_DEBUG(dbgs() << "  !PDIRelated: ");
643        LLVM_DEBUG(I.print(dbgs()));
644        LLVM_DEBUG(dbgs() << "\n");
645        PDIUnrelatedWL.push_back(&I);
646      } else {
647        LLVM_DEBUG(dbgs() << "   PDIRelated: ");
648        LLVM_DEBUG(I.print(dbgs()));
649        LLVM_DEBUG(dbgs() << "\n");
650      }
651    }
652    LLVM_DEBUG(dbgs() << " }\n");
653  }
654  
655  /// Whether this function may be replaced by a forwarding thunk.
656  static bool canCreateThunkFor(Function *F) {
657    if (F->isVarArg())
658      return false;
659  
660    // Don't merge tiny functions using a thunk, since it can just end up
661    // making the function larger.
662    if (F->size() == 1) {
663      if (F->front().size() <= 2) {
664        LLVM_DEBUG(dbgs() << "canCreateThunkFor: " << F->getName()
665                          << " is too small to bother creating a thunk for\n");
666        return false;
667      }
668    }
669    return true;
670  }
671  
672  // Replace G with a simple tail call to bitcast(F). Also (unless
673  // MergeFunctionsPDI holds) replace direct uses of G with bitcast(F),
674  // delete G. Under MergeFunctionsPDI, we use G itself for creating
675  // the thunk as we preserve the debug info (and associated instructions)
676  // from G's entry block pertaining to G's incoming arguments which are
677  // passed on as corresponding arguments in the call that G makes to F.
678  // For better debugability, under MergeFunctionsPDI, we do not modify G's
679  // call sites to point to F even when within the same translation unit.
680  void MergeFunctions::writeThunk(Function *F, Function *G) {
681    BasicBlock *GEntryBlock = nullptr;
682    std::vector<Instruction *> PDIUnrelatedWL;
683    BasicBlock *BB = nullptr;
684    Function *NewG = nullptr;
685    if (MergeFunctionsPDI) {
686      LLVM_DEBUG(dbgs() << "writeThunk: (MergeFunctionsPDI) Do not create a new "
687                           "function as thunk; retain original: "
688                        << G->getName() << "()\n");
689      GEntryBlock = &G->getEntryBlock();
690      LLVM_DEBUG(
691          dbgs() << "writeThunk: (MergeFunctionsPDI) filter parameter related "
692                    "debug info for "
693                 << G->getName() << "() {\n");
694      filterInstsUnrelatedToPDI(GEntryBlock, PDIUnrelatedWL);
695      GEntryBlock->getTerminator()->eraseFromParent();
696      BB = GEntryBlock;
697    } else {
698      NewG = Function::Create(G->getFunctionType(), G->getLinkage(),
699                              G->getAddressSpace(), "", G->getParent());
700      NewG->setComdat(G->getComdat());
701      BB = BasicBlock::Create(F->getContext(), "", NewG);
702    }
703  
704    IRBuilder<> Builder(BB);
705    Function *H = MergeFunctionsPDI ? G : NewG;
706    SmallVector<Value *, 16> Args;
707    unsigned i = 0;
708    FunctionType *FFTy = F->getFunctionType();
709    for (Argument &AI : H->args()) {
710      Args.push_back(createCast(Builder, &AI, FFTy->getParamType(i)));
711      ++i;
712    }
713  
714    CallInst *CI = Builder.CreateCall(F, Args);
715    ReturnInst *RI = nullptr;
716    bool isSwiftTailCall = F->getCallingConv() == CallingConv::SwiftTail &&
717                           G->getCallingConv() == CallingConv::SwiftTail;
718    CI->setTailCallKind(isSwiftTailCall ? llvm::CallInst::TCK_MustTail
719                                        : llvm::CallInst::TCK_Tail);
720    CI->setCallingConv(F->getCallingConv());
721    CI->setAttributes(F->getAttributes());
722    if (H->getReturnType()->isVoidTy()) {
723      RI = Builder.CreateRetVoid();
724    } else {
725      RI = Builder.CreateRet(createCast(Builder, CI, H->getReturnType()));
726    }
727  
728    if (MergeFunctionsPDI) {
729      DISubprogram *DIS = G->getSubprogram();
730      if (DIS) {
731        DebugLoc CIDbgLoc =
732            DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
733        DebugLoc RIDbgLoc =
734            DILocation::get(DIS->getContext(), DIS->getScopeLine(), 0, DIS);
735        CI->setDebugLoc(CIDbgLoc);
736        RI->setDebugLoc(RIDbgLoc);
737      } else {
738        LLVM_DEBUG(
739            dbgs() << "writeThunk: (MergeFunctionsPDI) No DISubprogram for "
740                   << G->getName() << "()\n");
741      }
742      eraseTail(G);
743      eraseInstsUnrelatedToPDI(PDIUnrelatedWL);
744      LLVM_DEBUG(
745          dbgs() << "} // End of parameter related debug info filtering for: "
746                 << G->getName() << "()\n");
747    } else {
748      NewG->copyAttributesFrom(G);
749      NewG->takeName(G);
750      removeUsers(G);
751      G->replaceAllUsesWith(NewG);
752      G->eraseFromParent();
753    }
754  
755    LLVM_DEBUG(dbgs() << "writeThunk: " << H->getName() << '\n');
756    ++NumThunksWritten;
757  }
758  
759  // Whether this function may be replaced by an alias
760  static bool canCreateAliasFor(Function *F) {
761    if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr())
762      return false;
763  
764    // We should only see linkages supported by aliases here
765    assert(F->hasLocalLinkage() || F->hasExternalLinkage()
766        || F->hasWeakLinkage() || F->hasLinkOnceLinkage());
767    return true;
768  }
769  
770  // Replace G with an alias to F (deleting function G)
771  void MergeFunctions::writeAlias(Function *F, Function *G) {
772    Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType());
773    PointerType *PtrType = G->getType();
774    auto *GA = GlobalAlias::create(G->getValueType(), PtrType->getAddressSpace(),
775                                   G->getLinkage(), "", BitcastF, G->getParent());
776  
777    const MaybeAlign FAlign = F->getAlign();
778    const MaybeAlign GAlign = G->getAlign();
779    if (FAlign || GAlign)
780      F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne()));
781    else
782      F->setAlignment(std::nullopt);
783    GA->takeName(G);
784    GA->setVisibility(G->getVisibility());
785    GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
786  
787    removeUsers(G);
788    G->replaceAllUsesWith(GA);
789    G->eraseFromParent();
790  
791    LLVM_DEBUG(dbgs() << "writeAlias: " << GA->getName() << '\n');
792    ++NumAliasesWritten;
793  }
794  
795  // Replace G with an alias to F if possible, or a thunk to F if
796  // profitable. Returns false if neither is the case.
797  bool MergeFunctions::writeThunkOrAlias(Function *F, Function *G) {
798    if (canCreateAliasFor(G)) {
799      writeAlias(F, G);
800      return true;
801    }
802    if (canCreateThunkFor(F)) {
803      writeThunk(F, G);
804      return true;
805    }
806    return false;
807  }
808  
809  // Merge two equivalent functions. Upon completion, Function G is deleted.
810  void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) {
811    if (F->isInterposable()) {
812      assert(G->isInterposable());
813  
814      // Both writeThunkOrAlias() calls below must succeed, either because we can
815      // create aliases for G and NewF, or because a thunk for F is profitable.
816      // F here has the same signature as NewF below, so that's what we check.
817      if (!canCreateThunkFor(F) &&
818          (!canCreateAliasFor(F) || !canCreateAliasFor(G)))
819        return;
820  
821      // Make them both thunks to the same internal function.
822      Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(),
823                                        F->getAddressSpace(), "", F->getParent());
824      NewF->copyAttributesFrom(F);
825      NewF->takeName(F);
826      removeUsers(F);
827      F->replaceAllUsesWith(NewF);
828  
829      // We collect alignment before writeThunkOrAlias that overwrites NewF and
830      // G's content.
831      const MaybeAlign NewFAlign = NewF->getAlign();
832      const MaybeAlign GAlign = G->getAlign();
833  
834      writeThunkOrAlias(F, G);
835      writeThunkOrAlias(F, NewF);
836  
837      if (NewFAlign || GAlign)
838        F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne()));
839      else
840        F->setAlignment(std::nullopt);
841      F->setLinkage(GlobalValue::PrivateLinkage);
842      ++NumDoubleWeak;
843      ++NumFunctionsMerged;
844    } else {
845      // For better debugability, under MergeFunctionsPDI, we do not modify G's
846      // call sites to point to F even when within the same translation unit.
847      if (!G->isInterposable() && !MergeFunctionsPDI) {
848        // Functions referred to by llvm.used/llvm.compiler.used are special:
849        // there are uses of the symbol name that are not visible to LLVM,
850        // usually from inline asm.
851        if (G->hasGlobalUnnamedAddr() && !Used.contains(G)) {
852          // G might have been a key in our GlobalNumberState, and it's illegal
853          // to replace a key in ValueMap<GlobalValue *> with a non-global.
854          GlobalNumbers.erase(G);
855          // If G's address is not significant, replace it entirely.
856          Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType());
857          removeUsers(G);
858          G->replaceAllUsesWith(BitcastF);
859        } else {
860          // Redirect direct callers of G to F. (See note on MergeFunctionsPDI
861          // above).
862          replaceDirectCallers(G, F);
863        }
864      }
865  
866      // If G was internal then we may have replaced all uses of G with F. If so,
867      // stop here and delete G. There's no need for a thunk. (See note on
868      // MergeFunctionsPDI above).
869      if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) {
870        G->eraseFromParent();
871        ++NumFunctionsMerged;
872        return;
873      }
874  
875      if (writeThunkOrAlias(F, G)) {
876        ++NumFunctionsMerged;
877      }
878    }
879  }
880  
881  /// Replace function F by function G.
882  void MergeFunctions::replaceFunctionInTree(const FunctionNode &FN,
883                                             Function *G) {
884    Function *F = FN.getFunc();
885    assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 &&
886           "The two functions must be equal");
887  
888    auto I = FNodesInTree.find(F);
889    assert(I != FNodesInTree.end() && "F should be in FNodesInTree");
890    assert(FNodesInTree.count(G) == 0 && "FNodesInTree should not contain G");
891  
892    FnTreeType::iterator IterToFNInFnTree = I->second;
893    assert(&(*IterToFNInFnTree) == &FN && "F should map to FN in FNodesInTree.");
894    // Remove F -> FN and insert G -> FN
895    FNodesInTree.erase(I);
896    FNodesInTree.insert({G, IterToFNInFnTree});
897    // Replace F with G in FN, which is stored inside the FnTree.
898    FN.replaceBy(G);
899  }
900  
901  // Ordering for functions that are equal under FunctionComparator
902  static bool isFuncOrderCorrect(const Function *F, const Function *G) {
903    if (F->isInterposable() != G->isInterposable()) {
904      // Strong before weak, because the weak function may call the strong
905      // one, but not the other way around.
906      return !F->isInterposable();
907    }
908    if (F->hasLocalLinkage() != G->hasLocalLinkage()) {
909      // External before local, because we definitely have to keep the external
910      // function, but may be able to drop the local one.
911      return !F->hasLocalLinkage();
912    }
913    // Impose a total order (by name) on the replacement of functions. This is
914    // important when operating on more than one module independently to prevent
915    // cycles of thunks calling each other when the modules are linked together.
916    return F->getName() <= G->getName();
917  }
918  
919  // Insert a ComparableFunction into the FnTree, or merge it away if equal to one
920  // that was already inserted.
921  bool MergeFunctions::insert(Function *NewFunction) {
922    std::pair<FnTreeType::iterator, bool> Result =
923        FnTree.insert(FunctionNode(NewFunction));
924  
925    if (Result.second) {
926      assert(FNodesInTree.count(NewFunction) == 0);
927      FNodesInTree.insert({NewFunction, Result.first});
928      LLVM_DEBUG(dbgs() << "Inserting as unique: " << NewFunction->getName()
929                        << '\n');
930      return false;
931    }
932  
933    const FunctionNode &OldF = *Result.first;
934  
935    if (!isFuncOrderCorrect(OldF.getFunc(), NewFunction)) {
936      // Swap the two functions.
937      Function *F = OldF.getFunc();
938      replaceFunctionInTree(*Result.first, NewFunction);
939      NewFunction = F;
940      assert(OldF.getFunc() != F && "Must have swapped the functions.");
941    }
942  
943    LLVM_DEBUG(dbgs() << "  " << OldF.getFunc()->getName()
944                      << " == " << NewFunction->getName() << '\n');
945  
946    Function *DeleteF = NewFunction;
947    mergeTwoFunctions(OldF.getFunc(), DeleteF);
948    return true;
949  }
950  
951  // Remove a function from FnTree. If it was already in FnTree, add
952  // it to Deferred so that we'll look at it in the next round.
953  void MergeFunctions::remove(Function *F) {
954    auto I = FNodesInTree.find(F);
955    if (I != FNodesInTree.end()) {
956      LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n");
957      FnTree.erase(I->second);
958      // I->second has been invalidated, remove it from the FNodesInTree map to
959      // preserve the invariant.
960      FNodesInTree.erase(I);
961      Deferred.emplace_back(F);
962    }
963  }
964  
965  // For each instruction used by the value, remove() the function that contains
966  // the instruction. This should happen right before a call to RAUW.
967  void MergeFunctions::removeUsers(Value *V) {
968    for (User *U : V->users())
969      if (auto *I = dyn_cast<Instruction>(U))
970        remove(I->getFunction());
971  }
972