[llvm] InstCombine: Preserve flags when simplifying exp (PR #174078)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 31 01:44:23 PST 2025


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/174078

None

>From 12ac70a58620ec2c7cea3bae52b0498230db396f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 31 Dec 2025 10:42:31 +0100
Subject: [PATCH] InstCombine: Preserve flags when simplifying exp

---
 .../InstCombineSimplifyDemanded.cpp           | 11 +++++-----
 .../simplify-demanded-fpclass-exp.ll          | 21 +++++++++++++++++++
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 85672cdfe1377..6cc7fba3d6d0f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2172,8 +2172,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
 
         // fadd +/-0, 1.0 => 1.0
         // fadd nan, 1.0 => nan
-        return Builder.CreateFAdd(CI->getArgOperand(0),
-                                  ConstantFP::get(VTy, 1.0));
+        return Builder.CreateFAddFMF(CI->getArgOperand(0),
+                                     ConstantFP::get(VTy, 1.0), FMF);
       }
 
       if (KnownSrc.isKnownAlways(fcInf | fcNan)) {
@@ -2184,9 +2184,10 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
 
         // Note: Dropping canonicalize / quiet of signaling nan.
         Value *X = CI->getArgOperand(0);
-        Value *IsPosInfOrNan =
-            Builder.CreateFCmpUEQ(X, ConstantFP::getInfinity(VTy));
-        return Builder.CreateSelect(IsPosInfOrNan, X, ConstantFP::getZero(VTy));
+        Value *IsPosInfOrNan = Builder.CreateFCmpFMF(
+            FCmpInst::FCMP_UEQ, X, ConstantFP::getInfinity(VTy), FMF);
+        return Builder.CreateSelectFMF(IsPosInfOrNan, X,
+                                       ConstantFP::getZero(VTy), FMF);
       }
 
       // Only perform nan propagation.
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
index 8311243e45580..737f7aee0e0f6 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
@@ -417,6 +417,16 @@ define nofpclass(nzero) float @source_is_known_nan(float nofpclass(inf norm sub
   ret float %exp
 }
 
+define nofpclass(nzero) float @source_is_known_nan_preserve_flags(float nofpclass(inf norm sub zero) %must.be.nan) {
+; CHECK-LABEL: define nofpclass(nzero) float @source_is_known_nan_preserve_flags(
+; CHECK-SAME: float nofpclass(inf zero sub norm) [[MUST_BE_NAN:%.*]]) {
+; CHECK-NEXT:    [[TMP1:%.*]] = fadd nsz contract float [[MUST_BE_NAN]], 1.000000e+00
+; CHECK-NEXT:    ret float [[TMP1]]
+;
+  %exp = call contract nsz float @llvm.exp2.f32(float %must.be.nan)
+  ret float %exp
+}
+
 define nofpclass(nzero) float @source_is_known_inf_or_nan(float nofpclass(norm sub zero) %must.be.inf.or.nan) {
 ; CHECK-LABEL: define nofpclass(nzero) float @source_is_known_inf_or_nan(
 ; CHECK-SAME: float nofpclass(zero sub norm) [[MUST_BE_INF_OR_NAN:%.*]]) {
@@ -428,6 +438,17 @@ define nofpclass(nzero) float @source_is_known_inf_or_nan(float nofpclass(norm s
   ret float %exp
 }
 
+define nofpclass(nzero) float @source_is_known_inf_or_nan_preserve_flags(float nofpclass(norm sub zero) %must.be.inf.or.nan) {
+; CHECK-LABEL: define nofpclass(nzero) float @source_is_known_inf_or_nan_preserve_flags(
+; CHECK-SAME: float nofpclass(zero sub norm) [[MUST_BE_INF_OR_NAN:%.*]]) {
+; CHECK-NEXT:    [[TMP1:%.*]] = fcmp nsz contract ueq float [[MUST_BE_INF_OR_NAN]], 0x7FF0000000000000
+; CHECK-NEXT:    [[TMP2:%.*]] = select nsz contract i1 [[TMP1]], float [[MUST_BE_INF_OR_NAN]], float 0.000000e+00
+; CHECK-NEXT:    ret float [[TMP2]]
+;
+  %exp = call contract nsz float @llvm.exp2.f32(float %must.be.inf.or.nan)
+  ret float %exp
+}
+
 define nofpclass(nzero nan) float @source_is_known_inf_or_nan__nnan_result(float nofpclass(norm sub zero) %must.be.inf.or.nan) {
 ; CHECK-LABEL: define nofpclass(nan nzero) float @source_is_known_inf_or_nan__nnan_result(
 ; CHECK-SAME: float nofpclass(zero sub norm) [[MUST_BE_INF_OR_NAN:%.*]]) {



More information about the llvm-commits mailing list