[llvm] [clang] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
Nikita Popov via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 29 03:30:05 PST 2023
================
@@ -1279,6 +1280,43 @@ static void addNonNullAttrs(const SCCNodeSet &SCCNodes,
}
}
+/// Deduce noundef attributes for the SCC.
+static void addNoUndefAttrs(const SCCNodeSet &SCCNodes,
+ SmallSet<Function *, 8> &Changed) {
+ // Check each function in turn, determining which functions return noundef
+ // values.
+ for (Function *F : SCCNodes) {
+ // Already noundef.
+ if (F->getAttributes().hasRetAttr(Attribute::NoUndef))
+ continue;
+
+ // We can infer and propagate function attributes only when we know that the
+ // definition we'll get at link time is *exactly* the definition we see now.
+ // For more details, see GlobalValue::mayBeDerefined.
+ if (!F->hasExactDefinition())
+ return;
+
+ if (F->getReturnType()->isVoidTy())
+ continue;
+
+ bool HasAnyUndefs = false;
+ for (BasicBlock &BB : *F)
+ if (auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator())) {
+ // TODO: performs context-sensitive analysis?
+ if (!isGuaranteedNotToBeUndefOrPoison(Ret->getReturnValue())) {
+ HasAnyUndefs = true;
+ break;
----------------
nikic wrote:
Use `any_of` (or `none_of` or whatever is most convenient).
https://github.com/llvm/llvm-project/pull/76553
More information about the cfe-commits
mailing list