[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