Lines Matching refs:F
177 mutable AssertingVH<Function> F; member in __anonbeb1b5730111::FunctionNode
182 FunctionNode(Function *F) in FunctionNode() argument
183 : F(F), Hash(FunctionComparator::functionHash(*F)) {} in FunctionNode()
185 Function *getFunc() const { return F; } in getFunc()
191 F = G; in replaceBy()
194 void release() { F = nullptr; } in release()
249 void remove(Function *F);
262 void mergeTwoFunctions(Function *F, Function *G);
279 void writeThunk(Function *F, Function *G);
282 void writeAlias(Function *F, Function *G);
286 bool writeThunkOrAlias(Function *F, Function *G);
432 Function *F = cast<Function>(I); in runOnModule() local
433 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage()) { in runOnModule()
434 Changed |= insert(F); in runOnModule()
659 static bool isThunkProfitable(Function * F) { in isThunkProfitable() argument
660 if (F->size() == 1) { in isThunkProfitable()
661 if (F->front().size() <= 2) { in isThunkProfitable()
662 LLVM_DEBUG(dbgs() << "isThunkProfitable: " << F->getName() in isThunkProfitable()
678 void MergeFunctions::writeThunk(Function *F, Function *G) { in writeThunk() argument
698 BB = BasicBlock::Create(F->getContext(), "", NewG); in writeThunk()
705 FunctionType *FFTy = F->getFunctionType(); in writeThunk()
711 CallInst *CI = Builder.CreateCall(F, Args); in writeThunk()
714 CI->setCallingConv(F->getCallingConv()); in writeThunk()
715 CI->setAttributes(F->getAttributes()); in writeThunk()
752 static bool canCreateAliasFor(Function *F) { in canCreateAliasFor() argument
753 if (!MergeFunctionsAliases || !F->hasGlobalUnnamedAddr()) in canCreateAliasFor()
757 assert(F->hasLocalLinkage() || F->hasExternalLinkage() in canCreateAliasFor()
758 || F->hasWeakLinkage() || F->hasLinkOnceLinkage()); in canCreateAliasFor()
763 void MergeFunctions::writeAlias(Function *F, Function *G) { in writeAlias() argument
764 Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType()); in writeAlias()
770 F->setAlignment(std::max(F->getAlignment(), G->getAlignment())); in writeAlias()
785 bool MergeFunctions::writeThunkOrAlias(Function *F, Function *G) { in writeThunkOrAlias() argument
787 writeAlias(F, G); in writeThunkOrAlias()
790 if (isThunkProfitable(F)) { in writeThunkOrAlias()
791 writeThunk(F, G); in writeThunkOrAlias()
798 void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) { in mergeTwoFunctions() argument
799 if (F->isInterposable()) { in mergeTwoFunctions()
805 if (!isThunkProfitable(F) && (!canCreateAliasFor(F) || !canCreateAliasFor(G))) { in mergeTwoFunctions()
810 Function *NewF = Function::Create(F->getFunctionType(), F->getLinkage(), in mergeTwoFunctions()
811 F->getAddressSpace(), "", F->getParent()); in mergeTwoFunctions()
812 NewF->copyAttributesFrom(F); in mergeTwoFunctions()
813 NewF->takeName(F); in mergeTwoFunctions()
814 removeUsers(F); in mergeTwoFunctions()
815 F->replaceAllUsesWith(NewF); in mergeTwoFunctions()
819 writeThunkOrAlias(F, G); in mergeTwoFunctions()
820 writeThunkOrAlias(F, NewF); in mergeTwoFunctions()
822 F->setAlignment(MaxAlignment); in mergeTwoFunctions()
823 F->setLinkage(GlobalValue::PrivateLinkage); in mergeTwoFunctions()
835 Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType()); in mergeTwoFunctions()
841 replaceDirectCallers(G, F); in mergeTwoFunctions()
854 if (writeThunkOrAlias(F, G)) { in mergeTwoFunctions()
863 Function *F = FN.getFunc(); in replaceFunctionInTree() local
864 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 && in replaceFunctionInTree()
867 auto I = FNodesInTree.find(F); in replaceFunctionInTree()
881 static bool isFuncOrderCorrect(const Function *F, const Function *G) { in isFuncOrderCorrect() argument
882 if (F->isInterposable() != G->isInterposable()) { in isFuncOrderCorrect()
885 return !F->isInterposable(); in isFuncOrderCorrect()
887 if (F->hasLocalLinkage() != G->hasLocalLinkage()) { in isFuncOrderCorrect()
890 return !F->hasLocalLinkage(); in isFuncOrderCorrect()
895 return F->getName() <= G->getName(); in isFuncOrderCorrect()
916 Function *F = OldF.getFunc(); in insert() local
918 NewFunction = F; in insert()
919 assert(OldF.getFunc() != F && "Must have swapped the functions."); in insert()
932 void MergeFunctions::remove(Function *F) { in remove() argument
933 auto I = FNodesInTree.find(F); in remove()
935 LLVM_DEBUG(dbgs() << "Deferred " << F->getName() << ".\n"); in remove()
940 Deferred.emplace_back(F); in remove()