Lines Matching refs:F

173 checkFunctionMemoryAccess(Function &F, bool ThisBody, AAResults &AAR,  in checkFunctionMemoryAccess()  argument
175 MemoryEffects OrigME = AAR.getMemoryEffects(&F); in checkFunctionMemoryAccess()
188 if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) || in checkFunctionMemoryAccess()
189 F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) in checkFunctionMemoryAccess()
193 for (Instruction &I : instructions(F)) { in checkFunctionMemoryAccess()
268 MemoryEffects llvm::computeFunctionBodyMemoryAccess(Function &F, in computeFunctionBodyMemoryAccess() argument
270 return checkFunctionMemoryAccess(F, /*ThisBody=*/true, AAR, {}).first; in computeFunctionBodyMemoryAccess()
279 for (Function *F : SCCNodes) { in addMemoryAttrs()
281 AAResults &AAR = AARGetter(*F); in addMemoryAttrs()
286 checkFunctionMemoryAccess(*F, F->hasExactDefinition(), AAR, SCCNodes); in addMemoryAttrs()
299 for (Function *F : SCCNodes) { in addMemoryAttrs()
300 MemoryEffects OldME = F->getMemoryEffects(); in addMemoryAttrs()
304 F->setMemoryEffects(NewME); in addMemoryAttrs()
307 for (Argument &A : F->args()) in addMemoryAttrs()
309 Changed.insert(F); in addMemoryAttrs()
582 Function *F = CB->getCalledFunction(); in updateCaptureInfo() local
583 if (!F || !F->hasExactDefinition() || !SCCNodes.count(F)) { in updateCaptureInfo()
602 if (UseIndex >= F->arg_size()) { in updateCaptureInfo()
603 assert(F->isVarArg() && "More params than args in non-varargs call"); in updateCaptureInfo()
610 Uses.push_back(&*std::next(F->arg_begin(), UseIndex)); in updateCaptureInfo()
765 ArgumentUsesSummary collectArgumentUsesPerBlock(Argument &A, Function &F) { in collectArgumentUsesPerBlock() argument
766 auto &DL = F.getParent()->getDataLayout(); in collectArgumentUsesPerBlock()
771 BasicBlock &EntryBB = F.getEntryBlock(); in collectArgumentUsesPerBlock()
939 if (Function *F = CB.getCalledFunction()) in determinePointerAccessAttrs() local
940 if (CB.isArgOperand(U) && UseIndex < F->arg_size() && in determinePointerAccessAttrs()
941 SCCNodes.count(F->getArg(UseIndex))) in determinePointerAccessAttrs()
1007 for (Function *F : SCCNodes) { in addArgumentReturnedAttrs()
1011 if (!F->hasExactDefinition()) in addArgumentReturnedAttrs()
1014 if (F->getReturnType()->isVoidTy()) in addArgumentReturnedAttrs()
1018 if (F->getAttributes().hasAttrSomewhere(Attribute::Returned)) in addArgumentReturnedAttrs()
1023 for (BasicBlock &BB : *F) in addArgumentReturnedAttrs()
1029 if (!RetVal || RetVal->getType() != F->getReturnType()) in addArgumentReturnedAttrs()
1044 Changed.insert(F); in addArgumentReturnedAttrs()
1053 static bool addArgumentAttrsFromCallsites(Function &F) { in addArgumentAttrsFromCallsites() argument
1066 BasicBlock &Entry = F.getEntryBlock(); in addArgumentAttrsFromCallsites()
1120 static bool inferInitializes(Argument &A, Function &F) { in inferInitializes() argument
1121 auto ArgumentUses = collectArgumentUsesPerBlock(A, F); in inferInitializes()
1127 BasicBlock &EntryBB = F.getEntryBlock(); in inferInitializes()
1209 for (const BasicBlock *BB : post_order(&F)) { in inferInitializes()
1256 for (Function *F : SCCNodes) { in addArgumentAttrs()
1260 if (!F->hasExactDefinition()) in addArgumentAttrs()
1263 if (addArgumentAttrsFromCallsites(*F)) in addArgumentAttrs()
1264 Changed.insert(F); in addArgumentAttrs()
1268 if (F->onlyReadsMemory() && F->doesNotThrow() && F->willReturn() && in addArgumentAttrs()
1269 F->getReturnType()->isVoidTy()) { in addArgumentAttrs()
1270 for (Argument &A : F->args()) { in addArgumentAttrs()
1275 Changed.insert(F); in addArgumentAttrs()
1281 for (Argument &A : F->args()) { in addArgumentAttrs()
1295 Changed.insert(F); in addArgumentAttrs()
1317 Changed.insert(F); in addArgumentAttrs()
1320 if (inferInitializes(A, *F)) in addArgumentAttrs()
1321 Changed.insert(F); in addArgumentAttrs()
1449 static bool isFunctionMallocLike(Function *F, const SCCNodeSet &SCCNodes) { in isFunctionMallocLike() argument
1451 for (BasicBlock &BB : *F) in isFunctionMallocLike()
1516 for (Function *F : SCCNodes) { in addNoAliasAttrs()
1518 if (F->returnDoesNotAlias()) in addNoAliasAttrs()
1524 if (!F->hasExactDefinition()) in addNoAliasAttrs()
1529 if (!F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
1532 if (!isFunctionMallocLike(F, SCCNodes)) in addNoAliasAttrs()
1536 for (Function *F : SCCNodes) { in addNoAliasAttrs()
1537 if (F->returnDoesNotAlias() || in addNoAliasAttrs()
1538 !F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
1541 F->setReturnDoesNotAlias(); in addNoAliasAttrs()
1543 Changed.insert(F); in addNoAliasAttrs()
1554 static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes, in isReturnNonNull() argument
1556 assert(F->getReturnType()->isPointerTy() && in isReturnNonNull()
1561 for (BasicBlock &BB : *F) in isReturnNonNull()
1565 auto &DL = F->getDataLayout(); in isReturnNonNull()
1633 for (Function *F : SCCNodes) { in addNonNullAttrs()
1635 if (F->getAttributes().hasRetAttr(Attribute::NonNull)) in addNonNullAttrs()
1641 if (!F->hasExactDefinition()) in addNonNullAttrs()
1646 if (!F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1650 if (isReturnNonNull(F, SCCNodes, Speculative)) { in addNonNullAttrs()
1654 LLVM_DEBUG(dbgs() << "Eagerly marking " << F->getName() in addNonNullAttrs()
1656 F->addRetAttr(Attribute::NonNull); in addNonNullAttrs()
1658 Changed.insert(F); in addNonNullAttrs()
1668 for (Function *F : SCCNodes) { in addNonNullAttrs()
1669 if (F->getAttributes().hasRetAttr(Attribute::NonNull) || in addNonNullAttrs()
1670 !F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1673 LLVM_DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n"); in addNonNullAttrs()
1674 F->addRetAttr(Attribute::NonNull); in addNonNullAttrs()
1676 Changed.insert(F); in addNonNullAttrs()
1686 for (Function *F : SCCNodes) { in addNoUndefAttrs()
1688 AttributeList Attrs = F->getAttributes(); in addNoUndefAttrs()
1695 if (!F->hasExactDefinition()) in addNoUndefAttrs()
1701 if (F->hasFnAttribute(Attribute::SanitizeMemory)) in addNoUndefAttrs()
1704 if (F->getReturnType()->isVoidTy()) in addNoUndefAttrs()
1707 const DataLayout &DL = F->getDataLayout(); in addNoUndefAttrs()
1708 if (all_of(*F, [&](BasicBlock &BB) { in addNoUndefAttrs()
1734 F->addRetAttr(Attribute::NoUndef); in addNoUndefAttrs()
1736 Changed.insert(F); in addNoUndefAttrs()
1802 for (Function *F : SCCNodes) { in run()
1809 llvm::erase_if(InferInSCC, [F](const InferenceDescriptor &ID) { in run()
1810 if (ID.SkipFunction(*F)) in run()
1815 return F->isDeclaration() || in run()
1816 (ID.RequiresExactDefinition && !F->hasExactDefinition()); in run()
1824 [F](const InferenceDescriptor &ID) { return !ID.SkipFunction(*F); }); in run()
1830 for (Instruction &I : instructions(*F)) { in run()
1851 for (Function *F : SCCNodes) in run()
1857 if (ID.SkipFunction(*F)) in run()
1859 Changed.insert(F); in run()
1860 ID.SetAttribute(*F); in run()
1984 [](const Function &F) { return !F.isConvergent(); }, in inferConvergent() argument
1989 [](Function &F) { in inferConvergent() argument
1990 LLVM_DEBUG(dbgs() << "Removing convergent attr from fn " << F.getName() in inferConvergent()
1992 F.setNotConvergent(); in inferConvergent()
2016 [](const Function &F) { return F.doesNotThrow(); }, in inferAttrsFromFunctionBodies() argument
2021 [](Function &F) { in inferAttrsFromFunctionBodies() argument
2023 << "Adding nounwind attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
2024 F.setDoesNotThrow(); in inferAttrsFromFunctionBodies()
2039 [](const Function &F) { return F.doesNotFreeMemory(); }, in inferAttrsFromFunctionBodies() argument
2044 [](Function &F) { in inferAttrsFromFunctionBodies() argument
2046 << "Adding nofree attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
2047 F.setDoesNotFreeMemory(); in inferAttrsFromFunctionBodies()
2055 [](const Function &F) { return F.hasNoSync(); }, in inferAttrsFromFunctionBodies() argument
2060 [](Function &F) { in inferAttrsFromFunctionBodies() argument
2062 << "Adding nosync attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
2063 F.setNoSync(); in inferAttrsFromFunctionBodies()
2080 Function *F = *SCCNodes.begin(); in addNoRecurseAttrs() local
2081 if (!F || !F->hasExactDefinition() || F->doesNotRecurse()) in addNoRecurseAttrs()
2087 for (auto &BB : *F) in addNoRecurseAttrs()
2091 if (!Callee || Callee == F || in addNoRecurseAttrs()
2102 F->setDoesNotRecurse(); in addNoRecurseAttrs()
2104 Changed.insert(F); in addNoRecurseAttrs()
2110 for (Function *F : SCCNodes) { in addNoReturnAttrs()
2111 if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) || in addNoReturnAttrs()
2112 F->doesNotReturn()) in addNoReturnAttrs()
2115 if (!canReturn(*F)) { in addNoReturnAttrs()
2116 F->setDoesNotReturn(); in addNoReturnAttrs()
2117 Changed.insert(F); in addNoReturnAttrs()
2122 static bool allPathsGoThroughCold(Function &F) { in allPathsGoThroughCold() argument
2124 ColdPaths[&F.front()] = false; in allPathsGoThroughCold()
2126 Jobs.push_back(&F.front()); in allPathsGoThroughCold()
2171 for (Function *F : SCCNodes) { in addColdAttrs()
2172 if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) || in addColdAttrs()
2173 F->hasFnAttribute(Attribute::Cold) || F->hasFnAttribute(Attribute::Hot)) in addColdAttrs()
2177 if (allPathsGoThroughCold(*F)) { in addColdAttrs()
2178 F->addFnAttr(Attribute::Cold); in addColdAttrs()
2180 Changed.insert(F); in addColdAttrs()
2186 static bool functionWillReturn(const Function &F) { in functionWillReturn() argument
2190 if (!F.hasExactDefinition()) in functionWillReturn()
2194 if (F.mustProgress() && F.onlyReadsMemory()) in functionWillReturn()
2198 if (F.isDeclaration()) in functionWillReturn()
2204 FindFunctionBackedges(F, Backedges); in functionWillReturn()
2210 return all_of(instructions(F), [](const Instruction &I) { in functionWillReturn()
2218 for (Function *F : SCCNodes) { in addWillReturn()
2219 if (!F || F->willReturn() || !functionWillReturn(*F)) in addWillReturn()
2222 F->setWillReturn(); in addWillReturn()
2224 Changed.insert(F); in addWillReturn()
2231 for (Function *F : Functions) { in createSCCNodeSet()
2232 if (!F || F->hasOptNone() || F->hasFnAttribute(Attribute::Naked) || in createSCCNodeSet()
2233 F->isPresplitCoroutine()) { in createSCCNodeSet()
2244 for (Instruction &I : instructions(*F)) { in createSCCNodeSet()
2253 Res.SCCNodes.insert(F); in createSCCNodeSet()
2299 for (Function *F : Nodes.SCCNodes) in deriveAttrsInPostOrder()
2300 if (F) in deriveAttrsInPostOrder()
2301 if (inferAttributesFromOthers(*F)) in deriveAttrsInPostOrder()
2302 Changed.insert(F); in deriveAttrsInPostOrder()
2326 auto AARGetter = [&](Function &F) -> AAResults & { in run() argument
2327 return FAM.getResult<AAManager>(F); in run()
2385 static bool addNoRecurseAttrsTopDown(Function &F) { in addNoRecurseAttrsTopDown() argument
2389 assert(!F.isDeclaration() && "Cannot deduce norecurse without a definition!"); in addNoRecurseAttrsTopDown()
2390 assert(!F.doesNotRecurse() && in addNoRecurseAttrsTopDown()
2392 assert(F.hasInternalLinkage() && in addNoRecurseAttrsTopDown()
2403 for (auto &U : F.uses()) { in addNoRecurseAttrsTopDown()
2412 F.setDoesNotRecurse(); in addNoRecurseAttrsTopDown()
2432 Function &F = SCC.begin()->getFunction(); in deduceFunctionAttributeInRPO() local
2433 if (!F.isDeclaration() && !F.doesNotRecurse() && F.hasInternalLinkage()) in deduceFunctionAttributeInRPO()
2434 Worklist.push_back(&F); in deduceFunctionAttributeInRPO()
2438 for (auto *F : llvm::reverse(Worklist)) in deduceFunctionAttributeInRPO() local
2439 Changed |= addNoRecurseAttrsTopDown(*F); in deduceFunctionAttributeInRPO()