Lines Matching refs:F
106 static MemoryAccessKind checkFunctionMemoryAccess(Function &F, bool ThisBody, in checkFunctionMemoryAccess() argument
109 FunctionModRefBehavior MRB = AAR.getModRefBehavior(&F); in checkFunctionMemoryAccess()
128 for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) { in checkFunctionMemoryAccess()
224 MemoryAccessKind llvm::computeFunctionBodyMemoryAccess(Function &F, in computeFunctionBodyMemoryAccess() argument
226 return checkFunctionMemoryAccess(F, /*ThisBody=*/true, AAR, {}); in computeFunctionBodyMemoryAccess()
236 for (Function *F : SCCNodes) { in addReadAttrs()
238 AAResults &AAR = AARGetter(*F); in addReadAttrs()
243 switch (checkFunctionMemoryAccess(*F, F->hasExactDefinition(), in addReadAttrs()
265 for (Function *F : SCCNodes) { in addReadAttrs()
266 if (F->doesNotAccessMemory()) in addReadAttrs()
270 if (F->onlyReadsMemory() && ReadsMemory) in addReadAttrs()
274 if (F->doesNotReadMemory() && WritesMemory) in addReadAttrs()
280 F->removeFnAttr(Attribute::ReadOnly); in addReadAttrs()
281 F->removeFnAttr(Attribute::ReadNone); in addReadAttrs()
282 F->removeFnAttr(Attribute::WriteOnly); in addReadAttrs()
286 F->removeFnAttr(Attribute::ArgMemOnly); in addReadAttrs()
287 F->removeFnAttr(Attribute::InaccessibleMemOnly); in addReadAttrs()
288 F->removeFnAttr(Attribute::InaccessibleMemOrArgMemOnly); in addReadAttrs()
293 F->addFnAttr(Attribute::WriteOnly); in addReadAttrs()
295 F->addFnAttr(ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone); in addReadAttrs()
365 Function *F = CS.getCalledFunction(); in captured() local
366 if (!F || !F->hasExactDefinition() || !SCCNodes.count(F)) { in captured()
393 if (UseIndex >= F->arg_size()) { in captured()
394 assert(F->isVarArg() && "More params than args in non-varargs call"); in captured()
399 Uses.push_back(&*std::next(F->arg_begin(), UseIndex)); in captured()
493 Function *F = CS.getCalledFunction(); in determinePointerReadAttrs() local
494 if (!F) { in determinePointerReadAttrs()
518 if (UseIndex >= F->arg_size() && !IsOperandBundleUse) { in determinePointerReadAttrs()
519 assert(F->isVarArg() && "More params than args in non-varargs call"); in determinePointerReadAttrs()
530 !SCCNodes.count(&*std::next(F->arg_begin(), UseIndex))) { in determinePointerReadAttrs()
571 for (Function *F : SCCNodes) { in addArgumentReturnedAttrs()
575 if (!F->hasExactDefinition()) in addArgumentReturnedAttrs()
578 if (F->getReturnType()->isVoidTy()) in addArgumentReturnedAttrs()
582 if (llvm::any_of(F->args(), in addArgumentReturnedAttrs()
588 for (BasicBlock &BB : *F) in addArgumentReturnedAttrs()
593 if (!isa<Argument>(RetVal) || RetVal->getType() != F->getReturnType()) in addArgumentReturnedAttrs()
620 static bool addArgumentAttrsFromCallsites(Function &F) { in addArgumentAttrsFromCallsites() argument
633 BasicBlock &Entry = F.getEntryBlock(); in addArgumentAttrsFromCallsites()
667 for (Function *F : SCCNodes) { in addArgumentAttrs()
671 if (!F->hasExactDefinition()) in addArgumentAttrs()
674 Changed |= addArgumentAttrsFromCallsites(*F); in addArgumentAttrs()
678 if (F->onlyReadsMemory() && F->doesNotThrow() && in addArgumentAttrs()
679 F->getReturnType()->isVoidTy()) { in addArgumentAttrs()
680 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; in addArgumentAttrs()
691 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; in addArgumentAttrs()
845 static bool isFunctionMallocLike(Function *F, const SCCNodeSet &SCCNodes) { in isFunctionMallocLike() argument
847 for (BasicBlock &BB : *F) in isFunctionMallocLike()
912 for (Function *F : SCCNodes) { in addNoAliasAttrs()
914 if (F->returnDoesNotAlias()) in addNoAliasAttrs()
920 if (!F->hasExactDefinition()) in addNoAliasAttrs()
925 if (!F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
928 if (!isFunctionMallocLike(F, SCCNodes)) in addNoAliasAttrs()
933 for (Function *F : SCCNodes) { in addNoAliasAttrs()
934 if (F->returnDoesNotAlias() || in addNoAliasAttrs()
935 !F->getReturnType()->isPointerTy()) in addNoAliasAttrs()
938 F->setReturnDoesNotAlias(); in addNoAliasAttrs()
953 static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes, in isReturnNonNull() argument
955 assert(F->getReturnType()->isPointerTy() && in isReturnNonNull()
960 for (BasicBlock &BB : *F) in isReturnNonNull()
964 auto &DL = F->getParent()->getDataLayout(); in isReturnNonNull()
1028 for (Function *F : SCCNodes) { in addNonNullAttrs()
1030 if (F->getAttributes().hasAttribute(AttributeList::ReturnIndex, in addNonNullAttrs()
1037 if (!F->hasExactDefinition()) in addNonNullAttrs()
1042 if (!F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1046 if (isReturnNonNull(F, SCCNodes, Speculative)) { in addNonNullAttrs()
1050 LLVM_DEBUG(dbgs() << "Eagerly marking " << F->getName() in addNonNullAttrs()
1052 F->addAttribute(AttributeList::ReturnIndex, Attribute::NonNull); in addNonNullAttrs()
1064 for (Function *F : SCCNodes) { in addNonNullAttrs()
1065 if (F->getAttributes().hasAttribute(AttributeList::ReturnIndex, in addNonNullAttrs()
1067 !F->getReturnType()->isPointerTy()) in addNonNullAttrs()
1070 LLVM_DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n"); in addNonNullAttrs()
1071 F->addAttribute(AttributeList::ReturnIndex, Attribute::NonNull); in addNonNullAttrs()
1140 for (Function *F : SCCNodes) { in run()
1147 llvm::erase_if(InferInSCC, [F](const InferenceDescriptor &ID) { in run()
1148 if (ID.SkipFunction(*F)) in run()
1153 return F->isDeclaration() || in run()
1154 (ID.RequiresExactDefinition && !F->hasExactDefinition()); in run()
1162 [F](const InferenceDescriptor &ID) { return !ID.SkipFunction(*F); }); in run()
1168 for (Instruction &I : instructions(*F)) { in run()
1190 for (Function *F : SCCNodes) in run()
1196 if (ID.SkipFunction(*F)) in run()
1199 ID.SetAttribute(*F); in run()
1250 [](const Function &F) { return !F.isConvergent(); }, in inferAttrsFromFunctionBodies() argument
1255 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1256 LLVM_DEBUG(dbgs() << "Removing convergent attr from fn " << F.getName() in inferAttrsFromFunctionBodies()
1258 F.setNotConvergent(); in inferAttrsFromFunctionBodies()
1271 [](const Function &F) { return F.doesNotThrow(); }, in inferAttrsFromFunctionBodies() argument
1276 [](Function &F) { in inferAttrsFromFunctionBodies() argument
1278 << "Adding nounwind attr to fn " << F.getName() << "\n"); in inferAttrsFromFunctionBodies()
1279 F.setDoesNotThrow(); in inferAttrsFromFunctionBodies()
1288 static bool setDoesNotRecurse(Function &F) { in setDoesNotRecurse() argument
1289 if (F.doesNotRecurse()) in setDoesNotRecurse()
1291 F.setDoesNotRecurse(); in setDoesNotRecurse()
1303 Function *F = *SCCNodes.begin(); in addNoRecurseAttrs() local
1304 if (!F || F->isDeclaration() || F->doesNotRecurse()) in addNoRecurseAttrs()
1310 for (auto &BB : *F) in addNoRecurseAttrs()
1314 if (!Callee || Callee == F || !Callee->doesNotRecurse()) in addNoRecurseAttrs()
1322 return setDoesNotRecurse(*F); in addNoRecurseAttrs()
1359 auto AARGetter = [&](Function &F) -> AAResults & { in run() argument
1360 return FAM.getResult<AAManager>(F); in run()
1369 Function &F = N.getFunction(); in run() local
1370 if (F.hasFnAttribute(Attribute::OptimizeNone) || in run()
1371 F.hasFnAttribute(Attribute::Naked)) { in run()
1382 for (Instruction &I : instructions(F)) in run()
1389 SCCNodes.insert(&F); in run()
1443 Function *F = I->getFunction(); in runImpl() local
1444 if (!F || F->hasFnAttribute(Attribute::OptimizeNone) || in runImpl()
1445 F->hasFnAttribute(Attribute::Naked)) { in runImpl()
1452 SCCNodes.insert(F); in runImpl()
1498 static bool addNoRecurseAttrsTopDown(Function &F) { in addNoRecurseAttrsTopDown() argument
1502 assert(!F.isDeclaration() && "Cannot deduce norecurse without a definition!"); in addNoRecurseAttrsTopDown()
1503 assert(!F.doesNotRecurse() && in addNoRecurseAttrsTopDown()
1505 assert(F.hasInternalLinkage() && in addNoRecurseAttrsTopDown()
1516 for (auto *U : F.users()) { in addNoRecurseAttrsTopDown()
1524 return setDoesNotRecurse(F); in addNoRecurseAttrsTopDown()
1540 Function *F = I->front()->getFunction(); in deduceFunctionAttributeInRPO() local
1541 if (F && !F->isDeclaration() && !F->doesNotRecurse() && in deduceFunctionAttributeInRPO()
1542 F->hasInternalLinkage()) in deduceFunctionAttributeInRPO()
1543 Worklist.push_back(F); in deduceFunctionAttributeInRPO()
1547 for (auto *F : llvm::reverse(Worklist)) in deduceFunctionAttributeInRPO() local
1548 Changed |= addNoRecurseAttrsTopDown(*F); in deduceFunctionAttributeInRPO()