[llvm] [IR] treat nofpclass as a poison-generating return attribute (PR #192016)

via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 01:09:14 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Shonie Caplan (shoniecaplan)

<details>
<summary>Changes</summary>

- For: #<!-- -->191338

Failing nofpclass attribute will generate poison.
This change adds nofpclass attributes to `hasPoisonGeneratingReturnAttributes`/`dropPoisonGeneratingReturnAttributes`.

---
Full diff: https://github.com/llvm/llvm-project/pull/192016.diff


2 Files Affected:

- (modified) llvm/lib/IR/Instruction.cpp (+3-1) 
- (modified) llvm/test/Transforms/InstCombine/freeze.ll (+12) 


``````````diff
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index 8aa19a436a157..7db36ed5f8bbb 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -538,7 +538,8 @@ bool Instruction::hasPoisonGeneratingReturnAttributes() const {
     AttributeSet RetAttrs = CB->getAttributes().getRetAttrs();
     return RetAttrs.hasAttribute(Attribute::Range) ||
            RetAttrs.hasAttribute(Attribute::Alignment) ||
-           RetAttrs.hasAttribute(Attribute::NonNull);
+           RetAttrs.hasAttribute(Attribute::NonNull) ||
+           RetAttrs.hasAttribute(Attribute::NoFPClass);
   }
   return false;
 }
@@ -549,6 +550,7 @@ void Instruction::dropPoisonGeneratingReturnAttributes() {
     AM.addAttribute(Attribute::Range);
     AM.addAttribute(Attribute::Alignment);
     AM.addAttribute(Attribute::NonNull);
+    AM.addAttribute(Attribute::NoFPClass);
     CB->removeRetAttrs(AM);
   }
   assert(!hasPoisonGeneratingReturnAttributes() && "must be kept in sync");
diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll
index 80db307ff5e25..3a401acb6d3ee 100644
--- a/llvm/test/Transforms/InstCombine/freeze.ll
+++ b/llvm/test/Transforms/InstCombine/freeze.ll
@@ -1721,6 +1721,18 @@ bb.13:                                             ; preds = %bb.8, %bb.2
   br label %bb.2
 }
 
+define float @freeze_fabs_nofpclass(float %a) {
+; CHECK-LABEL: define float @freeze_fabs_nofpclass(
+; CHECK-SAME: float [[A:%.*]]) {
+; CHECK-NEXT:    [[A_FR:%.*]] = freeze float [[A]]
+; CHECK-NEXT:    [[X:%.*]] = call float @llvm.fabs.f32(float [[A_FR]])
+; CHECK-NEXT:    ret float [[X]]
+;
+  %x = call nofpclass(nan) float @llvm.fabs.f32(float %a)
+  %x.fr = freeze float %x
+  ret float %x.fr
+}
+
 !0 = !{}
 !1 = !{i64 4}
 !2 = !{i32 0, i32 100}

``````````

</details>


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


More information about the llvm-commits mailing list