[llvm] InstCombine: Preserve flags when simplifying exp (PR #174078)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 31 01:45:25 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/174078.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp (+6-5)
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll (+21)
``````````diff
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:%.*]]) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/174078
More information about the llvm-commits
mailing list