[llvm] FunctionAttrs: Basic propagation of nofpclass (PR #182444)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 21 00:22:28 PST 2026


================
@@ -2404,6 +2405,48 @@ static bool addNoRecurseAttrsTopDown(Function &F) {
   return true;
 }
 
+static bool addNoFPClassAttrsTopDown(Function &F) {
+  assert(!F.isDeclaration() && "Cannot deduce nofpclass without a definition!");
+  unsigned NumArgs = F.arg_size();
+  SmallVector<FPClassTest, 8> ArgsNoFPClass(NumArgs, fcAllFlags);
+  FPClassTest RetNoFPClass = fcAllFlags;
+
+  bool Changed = false;
+  for (User *U : F.users()) {
+    auto *CB = dyn_cast<CallBase>(U);
+    if (!CB || CB->getCalledFunction() != &F)
+      return false;
+
+    RetNoFPClass &= CB->getRetNoFPClass();
+    for (unsigned I = 0; I != NumArgs; ++I)
+      ArgsNoFPClass[I] &= CB->getParamNoFPClass(I);
+  }
+
+  LLVMContext &Ctx = F.getContext();
+
+  if (RetNoFPClass != fcNone) {
+    FPClassTest OldAttr = F.getAttributes().getRetNoFPClass();
+    if (OldAttr != RetNoFPClass) {
+      F.addRetAttr(Attribute::getWithNoFPClass(Ctx, RetNoFPClass | OldAttr));
+      Changed = true;
+    }
+  }
+
+  for (unsigned I = 0; I != NumArgs; ++I) {
+    FPClassTest ArgNoFPClass = ArgsNoFPClass[I];
+    if (ArgNoFPClass == fcNone)
+      continue;
+    FPClassTest OldAttr = F.getParamNoFPClass(I);
+    if (OldAttr == ArgNoFPClass)
+      continue;
+
+    F.addParamAttr(I, Attribute::getWithNoFPClass(Ctx, ArgNoFPClass | OldAttr));
----------------
dtcxzyw wrote:

```suggestion
    F.addParamAttr(I, Attribute::getWithNoFPClass(Ctx, ArgNoFPClass));
```

https://github.com/llvm/llvm-project/pull/182444


More information about the llvm-commits mailing list