Lines Matching refs:F

174   mutable AssertingVH<Function> F;  member in __anonf67519a40111::FunctionNode
179 FunctionNode(Function *F) : F(F), Hash(StructuralHash(*F)) {} in FunctionNode() argument
181 Function *getFunc() const { return F; } in getFunc()
187 F = G; in replaceBy()
242 void remove(Function *F);
255 void mergeTwoFunctions(Function *F, Function *G);
272 void writeThunk(Function *F, Function *G);
275 void writeAlias(Function *F, Function *G);
279 bool writeThunkOrAlias(Function *F, Function *G);
381 static bool hasDistinctMetadataIntrinsic(const Function &F) { in hasDistinctMetadataIntrinsic() argument
382 for (const BasicBlock &BB : F) { in hasDistinctMetadataIntrinsic()
401 static bool isEligibleForMerging(Function &F) { in isEligibleForMerging() argument
402 return !F.isDeclaration() && !F.hasAvailableExternallyLinkage() && in isEligibleForMerging()
403 !hasDistinctMetadataIntrinsic(F); in isEligibleForMerging()
448 Function *F = cast<Function>(I); in runOnModule() local
449 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage()) { in runOnModule()
450 Changed |= insert(F); in runOnModule()
649 static bool canCreateThunkFor(Function *F) { in canCreateThunkFor() argument
650 if (F->isVarArg()) in canCreateThunkFor()
655 if (F->size() == 1) { in canCreateThunkFor()
656 if (F->front().sizeWithoutDebug() < 2) { in canCreateThunkFor()
657 LLVM_DEBUG(dbgs() << "canCreateThunkFor: " << F->getName() in canCreateThunkFor()
680 void MergeFunctions::writeThunk(Function *F, Function *G) { in writeThunk() argument
701 BB = BasicBlock::Create(F->getContext(), "", NewG); in writeThunk()
708 FunctionType *FFTy = F->getFunctionType(); in writeThunk()
714 CallInst *CI = Builder.CreateCall(F, Args); in writeThunk()
716 bool isSwiftTailCall = F->getCallingConv() == CallingConv::SwiftTail && in writeThunk()
720 CI->setCallingConv(F->getCallingConv()); in writeThunk()
721 CI->setAttributes(F->getAttributes()); in writeThunk()
763 static bool canCreateAliasFor(Function *F) { in canCreateAliasFor() argument
764 if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr()) in canCreateAliasFor()
768 assert(F->hasLocalLinkage() || F->hasExternalLinkage() in canCreateAliasFor()
769 || F->hasWeakLinkage() || F->hasLinkOnceLinkage()); in canCreateAliasFor()
774 void MergeFunctions::writeAlias(Function *F, Function *G) { in writeAlias() argument
777 G->getLinkage(), "", F, G->getParent()); in writeAlias()
779 const MaybeAlign FAlign = F->getAlign(); in writeAlias()
782 F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne())); in writeAlias()
784 F->setAlignment(std::nullopt); in writeAlias()
799 bool MergeFunctions::writeThunkOrAlias(Function *F, Function *G) { in writeThunkOrAlias() argument
801 writeAlias(F, G); in writeThunkOrAlias()
804 if (canCreateThunkFor(F)) { in writeThunkOrAlias()
805 writeThunk(F, G); in writeThunkOrAlias()
812 void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) { in mergeTwoFunctions() argument
813 if (F->isInterposable()) { in mergeTwoFunctions()
819 if (!canCreateThunkFor(F) && in mergeTwoFunctions()
820 (!canCreateAliasFor(F) || !canCreateAliasFor(G))) in mergeTwoFunctions()
824 Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(), in mergeTwoFunctions()
825 F->getAddressSpace(), "", F->getParent()); in mergeTwoFunctions()
826 NewF->copyAttributesFrom(F); in mergeTwoFunctions()
827 NewF->takeName(F); in mergeTwoFunctions()
829 copyMetadataIfPresent(F, NewF, "type"); in mergeTwoFunctions()
830 copyMetadataIfPresent(F, NewF, "kcfi_type"); in mergeTwoFunctions()
831 removeUsers(F); in mergeTwoFunctions()
832 F->replaceAllUsesWith(NewF); in mergeTwoFunctions()
839 writeThunkOrAlias(F, G); in mergeTwoFunctions()
840 writeThunkOrAlias(F, NewF); in mergeTwoFunctions()
843 F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne())); in mergeTwoFunctions()
845 F->setAlignment(std::nullopt); in mergeTwoFunctions()
846 F->setLinkage(GlobalValue::PrivateLinkage); in mergeTwoFunctions()
862 G->replaceAllUsesWith(F); in mergeTwoFunctions()
866 replaceDirectCallers(G, F); in mergeTwoFunctions()
879 if (writeThunkOrAlias(F, G)) { in mergeTwoFunctions()
888 Function *F = FN.getFunc(); in replaceFunctionInTree() local
889 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 && in replaceFunctionInTree()
892 auto I = FNodesInTree.find(F); in replaceFunctionInTree()
906 static bool isFuncOrderCorrect(const Function *F, const Function *G) { in isFuncOrderCorrect() argument
907 if (F->isInterposable() != G->isInterposable()) { in isFuncOrderCorrect()
910 return !F->isInterposable(); in isFuncOrderCorrect()
912 if (F->hasLocalLinkage() != G->hasLocalLinkage()) { in isFuncOrderCorrect()
915 return !F->hasLocalLinkage(); in isFuncOrderCorrect()
920 return F->getName() <= G->getName(); in isFuncOrderCorrect()
941 Function *F = OldF.getFunc(); in insert() local
943 NewFunction = F; in insert()
944 assert(OldF.getFunc() != F && "Must have swapped the functions."); in insert()
957 void MergeFunctions::remove(Function *F) { in remove() argument
958 auto I = FNodesInTree.find(F); in remove()
960 LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n"); in remove()
965 Deferred.emplace_back(F); in remove()