Lines Matching refs:F

160 checkFunctionMemoryAccess(Function &F, bool ThisBody, AAResults &AAR,  in checkFunctionMemoryAccess()  argument
162 MemoryEffects OrigME = AAR.getMemoryEffects(&F); in checkFunctionMemoryAccess()
175 if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) || in checkFunctionMemoryAccess()
176 F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) in checkFunctionMemoryAccess()
180 for (Instruction &I : instructions(F)) { in checkFunctionMemoryAccess()
252 MemoryEffects llvm::computeFunctionBodyMemoryAccess(Function &F, in computeFunctionBodyMemoryAccess() argument
254 return checkFunctionMemoryAccess(F, /*ThisBody=*/true, AAR, {}).first; in computeFunctionBodyMemoryAccess()
263 for (Function *F : SCCNodes) { in addMemoryAttrs()
265 AAResults &AAR = AARGetter(*F); in addMemoryAttrs()
270 checkFunctionMemoryAccess(*F, F->hasExactDefinition(), AAR, SCCNodes); in addMemoryAttrs()
283 for (Function *F : SCCNodes) { in addMemoryAttrs()
284 MemoryEffects OldME = F->getMemoryEffects(); in addMemoryAttrs()
288 F->setMemoryEffects(NewME); in addMemoryAttrs()
291 for (Argument &A : F->args()) in addMemoryAttrs()
293 Changed.insert(F); in addMemoryAttrs()
544 Function *F = CB->getCalledFunction(); in captured() local
545 if (!F || !F->hasExactDefinition() || !SCCNodes.count(F)) { in captured()
564 if (UseIndex >= F->arg_size()) { in captured()
565 assert(F->isVarArg() && "More params than args in non-varargs call"); in captured()
570 Uses.push_back(&*std::next(F->arg_begin(), UseIndex)); in captured()
688 if (Function *F = CB.getCalledFunction()) in determinePointerAccessAttrs() local
689 if (CB.isArgOperand(U) && UseIndex < F->arg_size() && in determinePointerAccessAttrs()
690 SCCNodes.count(F->getArg(UseIndex))) in determinePointerAccessAttrs()
756 for (Function *F : SCCNodes) { in addArgumentReturnedAttrs()
760 if (!F->hasExactDefinition()) in addArgumentReturnedAttrs()
763 if (F->getReturnType()->isVoidTy()) in addArgumentReturnedAttrs()
767 if (F->getAttributes().hasAttrSomewhere(Attribute::Returned)) in addArgumentReturnedAttrs()
772 for (BasicBlock &BB : *F) in addArgumentReturnedAttrs()
778 if (!RetVal || RetVal->getType() != F->getReturnType()) in addArgumentReturnedAttrs()
793 Changed.insert(F); in addArgumentReturnedAttrs()
802 static bool addArgumentAttrsFromCallsites(Function &F) { in addArgumentAttrsFromCallsites() argument
815 BasicBlock &Entry = F.getEntryBlock(); in addArgumentAttrsFromCallsites()
876 for (Function *F : SCCNodes) { in addArgumentAttrs()
880 if (!F->hasExactDefinition()) in addArgumentAttrs()
883 if (addArgumentAttrsFromCallsites(*F)) in addArgumentAttrs()
884 Changed.insert(F); in addArgumentAttrs()
888 if (F->onlyReadsMemory() && F->doesNotThrow() && in addArgumentAttrs()
889 F->getReturnType()->isVoidTy()) { in addArgumentAttrs()
890 for (Argument &A : F->args()) { in addArgumentAttrs()
894 Changed.insert(F); in addArgumentAttrs()
900 for (Argument &A : F->args()) { in addArgumentAttrs()
912 Changed.insert(F); in addArgumentAttrs()
937 Changed.insert(F); in addArgumentAttrs()
1055 static bool isFunctionMallocLike(Function *F, const SCCNodeSet &SCCNodes) { in isFunctionMallocLike() argument
1057 for (BasicBlock &BB : *F) in isFunctionMallocLike()
1123 for (Function *F : SCCNodes) { in addNoAliasAttrs()
1125 if (F->returnDoesNotAlias()) in addNoAliasAttrs()
1131 if (!F->hasExactDefinition()) in addNoAliasAttrs()
1136 if (!F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
1139 if (!isFunctionMallocLike(F, SCCNodes)) in addNoAliasAttrs()
1143 for (Function *F : SCCNodes) { in addNoAliasAttrs()
1144 if (F->returnDoesNotAlias() || in addNoAliasAttrs()
1145 !F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
1148 F->setReturnDoesNotAlias(); in addNoAliasAttrs()
1150 Changed.insert(F); in addNoAliasAttrs()
1161 static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes, in isReturnNonNull() argument
1163 assert(F->getReturnType()->isPointerTy() && in isReturnNonNull()
1168 for (BasicBlock &BB : *F) in isReturnNonNull()
1172 auto &DL = F->getParent()->getDataLayout(); in isReturnNonNull()
1240 for (Function *F : SCCNodes) { in addNonNullAttrs()
1242 if (F->getAttributes().hasRetAttr(Attribute::NonNull)) in addNonNullAttrs()
1248 if (!F->hasExactDefinition()) in addNonNullAttrs()
1253 if (!F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1257 if (isReturnNonNull(F, SCCNodes, Speculative)) { in addNonNullAttrs()
1261 LLVM_DEBUG(dbgs() << "Eagerly marking " << F->getName() in addNonNullAttrs()
1263 F->addRetAttr(Attribute::NonNull); in addNonNullAttrs()
1265 Changed.insert(F); in addNonNullAttrs()
1275 for (Function *F : SCCNodes) { in addNonNullAttrs()
1276 if (F->getAttributes().hasRetAttr(Attribute::NonNull) || in addNonNullAttrs()
1277 !F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1280 LLVM_DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n"); in addNonNullAttrs()
1281 F->addRetAttr(Attribute::NonNull); in addNonNullAttrs()
1283 Changed.insert(F); in addNonNullAttrs()
1293 for (Function *F : SCCNodes) { in addNoUndefAttrs()
1295 if (F->getAttributes().hasRetAttr(Attribute::NoUndef)) in addNoUndefAttrs()
1301 if (!F->hasExactDefinition()) in addNoUndefAttrs()
1307 if (F->hasFnAttribute(Attribute::SanitizeMemory)) in addNoUndefAttrs()
1310 if (F->getReturnType()->isVoidTy()) in addNoUndefAttrs()
1313 if (all_of(*F, [](BasicBlock &BB) { in addNoUndefAttrs()
1320 F->addRetAttr(Attribute::NoUndef); in addNoUndefAttrs()
1322 Changed.insert(F); in addNoUndefAttrs()
1388 for (Function *F : SCCNodes) { in run()
1395 llvm::erase_if(InferInSCC, [F](const InferenceDescriptor &ID) { in run()
1396 if (ID.SkipFunction(*F)) in run()
1401 return F->isDeclaration() || in run()
1402 (ID.RequiresExactDefinition && !F->hasExactDefinition()); in run()
1410 [F](const InferenceDescriptor &ID) { return !ID.SkipFunction(*F); }); in run()
1416 for (Instruction &I : instructions(*F)) { in run()
1437 for (Function *F : SCCNodes) in run()
1443 if (ID.SkipFunction(*F)) in run()
1445 Changed.insert(F); in run()
1446 ID.SetAttribute(*F); in run()
1570 [](const Function &F) { return !F.isConvergent(); }, in inferConvergent() argument
1575 [](Function &F) { in inferConvergent() argument
1576 LLVM_DEBUG(dbgs() << "Removing convergent attr from fn " << F.getName() in inferConvergent()
1578 F.setNotConvergent(); in inferConvergent()
1602 [](const Function &F) { return F.doesNotThrow(); }, in inferAttrsFromFunctionBodies() argument
1607 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1609 << "Adding nounwind attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1610 F.setDoesNotThrow(); in inferAttrsFromFunctionBodies()
1625 [](const Function &F) { return F.doesNotFreeMemory(); }, in inferAttrsFromFunctionBodies() argument
1630 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1632 << "Adding nofree attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1633 F.setDoesNotFreeMemory(); in inferAttrsFromFunctionBodies()
1641 [](const Function &F) { return F.hasNoSync(); }, in inferAttrsFromFunctionBodies() argument
1646 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1648 << "Adding nosync attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1649 F.setNoSync(); in inferAttrsFromFunctionBodies()
1666 Function *F = *SCCNodes.begin(); in addNoRecurseAttrs() local
1667 if (!F || !F->hasExactDefinition() || F->doesNotRecurse()) in addNoRecurseAttrs()
1673 for (auto &BB : *F) in addNoRecurseAttrs()
1677 if (!Callee || Callee == F || in addNoRecurseAttrs()
1688 F->setDoesNotRecurse(); in addNoRecurseAttrs()
1690 Changed.insert(F); in addNoRecurseAttrs()
1708 static bool canReturn(Function &F) { in canReturn() argument
1712 Visited.insert(&F.front()); in canReturn()
1713 Worklist.push_back(&F.front()); in canReturn()
1730 for (Function *F : SCCNodes) { in addNoReturnAttrs()
1731 if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) || in addNoReturnAttrs()
1732 F->doesNotReturn()) in addNoReturnAttrs()
1735 if (!canReturn(*F)) { in addNoReturnAttrs()
1736 F->setDoesNotReturn(); in addNoReturnAttrs()
1737 Changed.insert(F); in addNoReturnAttrs()
1742 static bool functionWillReturn(const Function &F) { in functionWillReturn() argument
1746 if (!F.hasExactDefinition()) in functionWillReturn()
1750 if (F.mustProgress() && F.onlyReadsMemory()) in functionWillReturn()
1754 if (F.isDeclaration()) in functionWillReturn()
1760 FindFunctionBackedges(F, Backedges); in functionWillReturn()
1766 return all_of(instructions(F), [](const Instruction &I) { in functionWillReturn()
1774 for (Function *F : SCCNodes) { in addWillReturn()
1775 if (!F || F->willReturn() || !functionWillReturn(*F)) in addWillReturn()
1778 F->setWillReturn(); in addWillReturn()
1780 Changed.insert(F); in addWillReturn()
1787 for (Function *F : Functions) { in createSCCNodeSet()
1788 if (!F || F->hasOptNone() || F->hasFnAttribute(Attribute::Naked) || in createSCCNodeSet()
1789 F->isPresplitCoroutine()) { in createSCCNodeSet()
1800 for (Instruction &I : instructions(*F)) { in createSCCNodeSet()
1809 Res.SCCNodes.insert(F); in createSCCNodeSet()
1851 for (Function *F : Nodes.SCCNodes) in deriveAttrsInPostOrder()
1852 if (F) in deriveAttrsInPostOrder()
1853 if (inferAttributesFromOthers(*F)) in deriveAttrsInPostOrder()
1854 Changed.insert(F); in deriveAttrsInPostOrder()
1878 auto AARGetter = [&](Function &F) -> AAResults & { in run() argument
1879 return FAM.getResult<AAManager>(F); in run()
1937 static bool addNoRecurseAttrsTopDown(Function &F) { in addNoRecurseAttrsTopDown() argument
1941 assert(!F.isDeclaration() && "Cannot deduce norecurse without a definition!"); in addNoRecurseAttrsTopDown()
1942 assert(!F.doesNotRecurse() && in addNoRecurseAttrsTopDown()
1944 assert(F.hasInternalLinkage() && in addNoRecurseAttrsTopDown()
1955 for (auto &U : F.uses()) { in addNoRecurseAttrsTopDown()
1964 F.setDoesNotRecurse(); in addNoRecurseAttrsTopDown()
1984 Function &F = SCC.begin()->getFunction(); in deduceFunctionAttributeInRPO() local
1985 if (!F.isDeclaration() && !F.doesNotRecurse() && F.hasInternalLinkage()) in deduceFunctionAttributeInRPO()
1986 Worklist.push_back(&F); in deduceFunctionAttributeInRPO()
1990 for (auto *F : llvm::reverse(Worklist)) in deduceFunctionAttributeInRPO() local
1991 Changed |= addNoRecurseAttrsTopDown(*F); in deduceFunctionAttributeInRPO()