Lines Matching refs:F
172 mutable AssertingVH<Function> F; member in __anonc9c4572e0111::FunctionNode
177 FunctionNode(Function *F) : F(F), Hash(StructuralHash(*F)) {} in FunctionNode() argument
179 Function *getFunc() const { return F; } in getFunc()
185 F = G; in replaceBy()
199 DenseMap<Function *, Function *> runOnFunctions(ArrayRef<Function *> F);
243 void remove(Function *F);
256 void mergeTwoFunctions(Function *F, Function *G);
280 void writeThunk(Function *F, Function *G);
283 void writeAlias(Function *F, Function *G);
288 bool writeThunkOrAliasIfNeeded(Function *F, Function *G);
328 MergeFunctionsPass::runOnFunctions(ArrayRef<Function *> F) { in runOnFunctions() argument
330 return MF.runOnFunctions(F); in runOnFunctions()
409 static bool hasDistinctMetadataIntrinsic(const Function &F) { in hasDistinctMetadataIntrinsic() argument
410 for (const BasicBlock &BB : F) { in hasDistinctMetadataIntrinsic()
429 static bool isEligibleForMerging(Function &F) { in isEligibleForMerging() argument
430 return !F.isDeclaration() && !F.hasAvailableExternallyLinkage() && in isEligibleForMerging()
431 !hasDistinctMetadataIntrinsic(F); in isEligibleForMerging()
475 Function *F = cast<Function>(I); in run() local
476 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage()) { in run()
477 Changed |= insert(F); in run()
492 MergeFunctions::runOnFunctions(ArrayRef<Function *> F) { in runOnFunctions() argument
493 [[maybe_unused]] bool MergeResult = this->run(F); in runOnFunctions()
699 static bool canCreateThunkFor(Function *F) { in canCreateThunkFor() argument
700 if (F->isVarArg()) in canCreateThunkFor()
705 if (F->size() == 1) { in canCreateThunkFor()
706 if (F->front().sizeWithoutDebug() < 2) { in canCreateThunkFor()
707 LLVM_DEBUG(dbgs() << "canCreateThunkFor: " << F->getName() in canCreateThunkFor()
732 void MergeFunctions::writeThunk(Function *F, Function *G) { in writeThunk() argument
754 BB = BasicBlock::Create(F->getContext(), "", NewG); in writeThunk()
761 FunctionType *FFTy = F->getFunctionType(); in writeThunk()
767 CallInst *CI = Builder.CreateCall(F, Args); in writeThunk()
769 bool isSwiftTailCall = F->getCallingConv() == CallingConv::SwiftTail && in writeThunk()
773 CI->setCallingConv(F->getCallingConv()); in writeThunk()
774 CI->setAttributes(F->getAttributes()); in writeThunk()
816 static bool canCreateAliasFor(Function *F) { in canCreateAliasFor() argument
817 if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr()) in canCreateAliasFor()
821 assert(F->hasLocalLinkage() || F->hasExternalLinkage() in canCreateAliasFor()
822 || F->hasWeakLinkage() || F->hasLinkOnceLinkage()); in canCreateAliasFor()
827 void MergeFunctions::writeAlias(Function *F, Function *G) { in writeAlias() argument
830 G->getLinkage(), "", F, G->getParent()); in writeAlias()
832 const MaybeAlign FAlign = F->getAlign(); in writeAlias()
835 F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne())); in writeAlias()
837 F->setAlignment(std::nullopt); in writeAlias()
853 bool MergeFunctions::writeThunkOrAliasIfNeeded(Function *F, Function *G) { in writeThunkOrAliasIfNeeded() argument
859 writeAlias(F, G); in writeThunkOrAliasIfNeeded()
862 if (canCreateThunkFor(F)) { in writeThunkOrAliasIfNeeded()
863 writeThunk(F, G); in writeThunkOrAliasIfNeeded()
870 static bool isODR(const Function *F) { in isODR() argument
871 return F->hasWeakODRLinkage() || F->hasLinkOnceODRLinkage(); in isODR()
875 void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) { in mergeTwoFunctions() argument
880 if (F->isInterposable() || (isODR(F) && isODR(G))) { in mergeTwoFunctions()
881 assert((!isODR(G) || isODR(F)) && in mergeTwoFunctions()
888 if (!canCreateThunkFor(F) && in mergeTwoFunctions()
889 (!canCreateAliasFor(F) || !canCreateAliasFor(G))) in mergeTwoFunctions()
893 Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(), in mergeTwoFunctions()
894 F->getAddressSpace(), "", F->getParent()); in mergeTwoFunctions()
895 NewF->copyAttributesFrom(F); in mergeTwoFunctions()
896 NewF->takeName(F); in mergeTwoFunctions()
897 NewF->setComdat(F->getComdat()); in mergeTwoFunctions()
898 F->setComdat(nullptr); in mergeTwoFunctions()
900 copyMetadataIfPresent(F, NewF, "type"); in mergeTwoFunctions()
901 copyMetadataIfPresent(F, NewF, "kcfi_type"); in mergeTwoFunctions()
902 removeUsers(F); in mergeTwoFunctions()
903 F->replaceAllUsesWith(NewF); in mergeTwoFunctions()
908 replaceDirectCallers(G, F); in mergeTwoFunctions()
909 if (isODR(F)) in mergeTwoFunctions()
910 replaceDirectCallers(NewF, F); in mergeTwoFunctions()
917 writeThunkOrAliasIfNeeded(F, G); in mergeTwoFunctions()
918 writeThunkOrAliasIfNeeded(F, NewF); in mergeTwoFunctions()
921 F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne())); in mergeTwoFunctions()
923 F->setAlignment(std::nullopt); in mergeTwoFunctions()
924 F->setLinkage(GlobalValue::PrivateLinkage); in mergeTwoFunctions()
940 G->replaceAllUsesWith(F); in mergeTwoFunctions()
944 replaceDirectCallers(G, F); in mergeTwoFunctions()
957 if (writeThunkOrAliasIfNeeded(F, G)) { in mergeTwoFunctions()
966 Function *F = FN.getFunc(); in replaceFunctionInTree() local
967 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 && in replaceFunctionInTree()
970 auto I = FNodesInTree.find(F); in replaceFunctionInTree()
984 static bool isFuncOrderCorrect(const Function *F, const Function *G) { in isFuncOrderCorrect() argument
985 if (isODR(F) != isODR(G)) { in isFuncOrderCorrect()
991 if (F->isInterposable() != G->isInterposable()) { in isFuncOrderCorrect()
994 return !F->isInterposable(); in isFuncOrderCorrect()
997 if (F->hasLocalLinkage() != G->hasLocalLinkage()) { in isFuncOrderCorrect()
1000 return !F->hasLocalLinkage(); in isFuncOrderCorrect()
1006 return F->getName() <= G->getName(); in isFuncOrderCorrect()
1027 Function *F = OldF.getFunc(); in insert() local
1029 NewFunction = F; in insert()
1030 assert(OldF.getFunc() != F && "Must have swapped the functions."); in insert()
1044 void MergeFunctions::remove(Function *F) { in remove() argument
1045 auto I = FNodesInTree.find(F); in remove()
1047 LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n"); in remove()
1052 Deferred.emplace_back(F); in remove()