Lines Matching refs:F
112 static MemoryAccessKind checkFunctionMemoryAccess(Function &F, bool ThisBody, in checkFunctionMemoryAccess() argument
115 FunctionModRefBehavior MRB = AAR.getModRefBehavior(&F); in checkFunctionMemoryAccess()
134 for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) { in checkFunctionMemoryAccess()
236 MemoryAccessKind llvm::computeFunctionBodyMemoryAccess(Function &F, in computeFunctionBodyMemoryAccess() argument
238 return checkFunctionMemoryAccess(F, /*ThisBody=*/true, AAR, {}); in computeFunctionBodyMemoryAccess()
248 for (Function *F : SCCNodes) { in addReadAttrs()
250 AAResults &AAR = AARGetter(*F); in addReadAttrs()
255 switch (checkFunctionMemoryAccess(*F, F->hasExactDefinition(), in addReadAttrs()
280 for (Function *F : SCCNodes) { in addReadAttrs()
281 if (F->doesNotAccessMemory()) in addReadAttrs()
285 if (F->onlyReadsMemory() && ReadsMemory) in addReadAttrs()
289 if (F->doesNotReadMemory() && WritesMemory) in addReadAttrs()
306 F->removeAttributes(AttributeList::FunctionIndex, AttrsToRemove); in addReadAttrs()
310 F->addFnAttr(Attribute::WriteOnly); in addReadAttrs()
312 F->addFnAttr(ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone); in addReadAttrs()
382 Function *F = CB->getCalledFunction(); in captured() local
383 if (!F || !F->hasExactDefinition() || !SCCNodes.count(F)) { in captured()
410 if (UseIndex >= F->arg_size()) { in captured()
411 assert(F->isVarArg() && "More params than args in non-varargs call"); in captured()
416 Uses.push_back(&*std::next(F->arg_begin(), UseIndex)); in captured()
510 Function *F = CB.getCalledFunction(); in determinePointerReadAttrs() local
511 if (!F) { in determinePointerReadAttrs()
535 if (UseIndex >= F->arg_size() && !IsOperandBundleUse) { in determinePointerReadAttrs()
536 assert(F->isVarArg() && "More params than args in non-varargs call"); in determinePointerReadAttrs()
547 !SCCNodes.count(&*std::next(F->arg_begin(), UseIndex))) { in determinePointerReadAttrs()
588 for (Function *F : SCCNodes) { in addArgumentReturnedAttrs()
592 if (!F->hasExactDefinition()) in addArgumentReturnedAttrs()
595 if (F->getReturnType()->isVoidTy()) in addArgumentReturnedAttrs()
599 if (llvm::any_of(F->args(), in addArgumentReturnedAttrs()
605 for (BasicBlock &BB : *F) in addArgumentReturnedAttrs()
610 if (!isa<Argument>(RetVal) || RetVal->getType() != F->getReturnType()) in addArgumentReturnedAttrs()
637 static bool addArgumentAttrsFromCallsites(Function &F) { in addArgumentAttrsFromCallsites() argument
650 BasicBlock &Entry = F.getEntryBlock(); in addArgumentAttrsFromCallsites()
703 for (Function *F : SCCNodes) { in addArgumentAttrs()
707 if (!F->hasExactDefinition()) in addArgumentAttrs()
710 Changed |= addArgumentAttrsFromCallsites(*F); in addArgumentAttrs()
714 if (F->onlyReadsMemory() && F->doesNotThrow() && in addArgumentAttrs()
715 F->getReturnType()->isVoidTy()) { in addArgumentAttrs()
716 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; in addArgumentAttrs()
727 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; in addArgumentAttrs()
873 static bool isFunctionMallocLike(Function *F, const SCCNodeSet &SCCNodes) { in isFunctionMallocLike() argument
875 for (BasicBlock &BB : *F) in isFunctionMallocLike()
940 for (Function *F : SCCNodes) { in addNoAliasAttrs()
942 if (F->returnDoesNotAlias()) in addNoAliasAttrs()
948 if (!F->hasExactDefinition()) in addNoAliasAttrs()
953 if (!F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
956 if (!isFunctionMallocLike(F, SCCNodes)) in addNoAliasAttrs()
961 for (Function *F : SCCNodes) { in addNoAliasAttrs()
962 if (F->returnDoesNotAlias() || in addNoAliasAttrs()
963 !F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
966 F->setReturnDoesNotAlias(); in addNoAliasAttrs()
981 static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes, in isReturnNonNull() argument
983 assert(F->getReturnType()->isPointerTy() && in isReturnNonNull()
988 for (BasicBlock &BB : *F) in isReturnNonNull()
992 auto &DL = F->getParent()->getDataLayout(); in isReturnNonNull()
1056 for (Function *F : SCCNodes) { in addNonNullAttrs()
1058 if (F->getAttributes().hasAttribute(AttributeList::ReturnIndex, in addNonNullAttrs()
1065 if (!F->hasExactDefinition()) in addNonNullAttrs()
1070 if (!F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1074 if (isReturnNonNull(F, SCCNodes, Speculative)) { in addNonNullAttrs()
1078 LLVM_DEBUG(dbgs() << "Eagerly marking " << F->getName() in addNonNullAttrs()
1080 F->addAttribute(AttributeList::ReturnIndex, Attribute::NonNull); in addNonNullAttrs()
1092 for (Function *F : SCCNodes) { in addNonNullAttrs()
1093 if (F->getAttributes().hasAttribute(AttributeList::ReturnIndex, in addNonNullAttrs()
1095 !F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1098 LLVM_DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n"); in addNonNullAttrs()
1099 F->addAttribute(AttributeList::ReturnIndex, Attribute::NonNull); in addNonNullAttrs()
1168 for (Function *F : SCCNodes) { in run()
1175 llvm::erase_if(InferInSCC, [F](const InferenceDescriptor &ID) { in run()
1176 if (ID.SkipFunction(*F)) in run()
1181 return F->isDeclaration() || in run()
1182 (ID.RequiresExactDefinition && !F->hasExactDefinition()); in run()
1190 [F](const InferenceDescriptor &ID) { return !ID.SkipFunction(*F); }); in run()
1196 for (Instruction &I : instructions(*F)) { in run()
1218 for (Function *F : SCCNodes) in run()
1224 if (ID.SkipFunction(*F)) in run()
1227 ID.SetAttribute(*F); in run()
1296 [](const Function &F) { return !F.isConvergent(); }, in inferConvergent() argument
1301 [](Function &F) { in inferConvergent() argument
1302 LLVM_DEBUG(dbgs() << "Removing convergent attr from fn " << F.getName() in inferConvergent()
1304 F.setNotConvergent(); in inferConvergent()
1329 [](const Function &F) { return F.doesNotThrow(); }, in inferAttrsFromFunctionBodies() argument
1334 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1336 << "Adding nounwind attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1337 F.setDoesNotThrow(); in inferAttrsFromFunctionBodies()
1352 [](const Function &F) { return F.doesNotFreeMemory(); }, in inferAttrsFromFunctionBodies() argument
1357 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1359 << "Adding nofree attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1360 F.setDoesNotFreeMemory(); in inferAttrsFromFunctionBodies()
1376 Function *F = *SCCNodes.begin(); in addNoRecurseAttrs() local
1377 if (!F || !F->hasExactDefinition() || F->doesNotRecurse()) in addNoRecurseAttrs()
1383 for (auto &BB : *F) in addNoRecurseAttrs()
1387 if (!Callee || Callee == F || !Callee->doesNotRecurse()) in addNoRecurseAttrs()
1395 F->setDoesNotRecurse(); in addNoRecurseAttrs()
1418 for (Function *F : SCCNodes) { in addNoReturnAttrs()
1419 if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) || in addNoReturnAttrs()
1420 F->doesNotReturn()) in addNoReturnAttrs()
1425 if (none_of(*F, basicBlockCanReturn)) { in addNoReturnAttrs()
1426 F->setDoesNotReturn(); in addNoReturnAttrs()
1434 static bool functionWillReturn(const Function &F) { in functionWillReturn() argument
1438 if (!F.hasExactDefinition()) in functionWillReturn()
1442 if (F.mustProgress() && F.onlyReadsMemory()) in functionWillReturn()
1446 if (F.isDeclaration()) in functionWillReturn()
1452 FindFunctionBackedges(F, Backedges); in functionWillReturn()
1458 return all_of(instructions(F), [](const Instruction &I) { in functionWillReturn()
1467 for (Function *F : SCCNodes) { in addWillReturn()
1468 if (!F || F->willReturn() || !functionWillReturn(*F)) in addWillReturn()
1471 F->setWillReturn(); in addWillReturn()
1540 [](const Function &F) { return F.hasNoSync(); }, in addNoSyncAttr() argument
1545 [](Function &F) { in addNoSyncAttr() argument
1547 << "Adding nosync attr to fn " << F.getName() << "\n"); in addNoSyncAttr()
1548 F.setNoSync(); in addNoSyncAttr()
1558 for (Function *F : Functions) { in createSCCNodeSet()
1559 if (!F || F->hasOptNone() || F->hasFnAttribute(Attribute::Naked)) { in createSCCNodeSet()
1570 for (Instruction &I : instructions(*F)) { in createSCCNodeSet()
1579 Res.SCCNodes.insert(F); in createSCCNodeSet()
1616 for (Function *F : Nodes.SCCNodes) in deriveAttrsInPostOrder()
1617 if (F) in deriveAttrsInPostOrder()
1618 Changed |= inferAttributesFromOthers(*F); in deriveAttrsInPostOrder()
1632 auto AARGetter = [&](Function &F) -> AAResults & { in run() argument
1633 return FAM.getResult<AAManager>(F); in run()
1738 static bool addNoRecurseAttrsTopDown(Function &F) { in addNoRecurseAttrsTopDown() argument
1742 assert(!F.isDeclaration() && "Cannot deduce norecurse without a definition!"); in addNoRecurseAttrsTopDown()
1743 assert(!F.doesNotRecurse() && in addNoRecurseAttrsTopDown()
1745 assert(F.hasInternalLinkage() && in addNoRecurseAttrsTopDown()
1756 for (auto *U : F.users()) { in addNoRecurseAttrsTopDown()
1764 F.setDoesNotRecurse(); in addNoRecurseAttrsTopDown()
1782 Function *F = I->front()->getFunction(); in deduceFunctionAttributeInRPO() local
1783 if (F && !F->isDeclaration() && !F->doesNotRecurse() && in deduceFunctionAttributeInRPO()
1784 F->hasInternalLinkage()) in deduceFunctionAttributeInRPO()
1785 Worklist.push_back(F); in deduceFunctionAttributeInRPO()
1789 for (auto *F : llvm::reverse(Worklist)) in deduceFunctionAttributeInRPO() local
1790 Changed |= addNoRecurseAttrsTopDown(*F); in deduceFunctionAttributeInRPO()