[llvm] [SimplifyLibCalls] Move constant folding logic in `ConstantFoldLibCall2` (PR #172139)
Ron Xavier via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 24 19:18:54 PST 2025
https://github.com/Ronxvier updated https://github.com/llvm/llvm-project/pull/172139
>From ae2549c6b069e998021c1f42080640fa38658b46 Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Sat, 13 Dec 2025 03:45:49 -0500
Subject: [PATCH 1/6] Resolve #171877
Moved constant folding logic from SimplifyLibCalls.cpp to ConstantFoldLibCall2
---
llvm/lib/Analysis/ConstantFolding.cpp | 12 ++++++++++++
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 14 ++------------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index a9b51065a1d99..8a73c02bc363e 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3241,6 +3241,18 @@ static Constant *ConstantFoldLibCall2(StringRef Name, Type *Ty,
if (TLI->has(Func))
return ConstantFoldBinaryFP(atan2, Op1V, Op2V, Ty);
break;
+ case LibFunc_fdim:
+ case LibFunc_fdimf:
+ case LibFunc_fdiml:
+ if (TLI->has(Func)){
+ APFloat Difference = Op1V;
+ Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
+
+ APFloat MaxVal =
+ maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
+ return ConstantFP::get(Ty->getContext(), MaxVal);
+ }
+ break;
}
return nullptr;
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index c3537f544c432..55cd08b3de855 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -3201,18 +3201,8 @@ Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
if (isa<PoisonValue>(CI->getArgOperand(1)))
return CI->getArgOperand(1);
- const APFloat *X, *Y;
- // Check if both values are constants
- if (!match(CI->getArgOperand(0), m_APFloat(X)) ||
- !match(CI->getArgOperand(1), m_APFloat(Y)))
- return nullptr;
-
- APFloat Difference = *X;
- Difference.subtract(*Y, RoundingMode::NearestTiesToEven);
-
- APFloat MaxVal =
- maximum(Difference, APFloat::getZero(CI->getType()->getFltSemantics()));
- return ConstantFP::get(CI->getType(), MaxVal);
+ // Constant folding will be handled by ConstantFoldLibCall2
+ return nullptr;
}
//===----------------------------------------------------------------------===//
>From 9f6988ac52d3f3332f3582a0360a728b4373487c Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Sat, 13 Dec 2025 06:22:09 -0500
Subject: [PATCH 2/6] reformatted
---
llvm/lib/Analysis/ConstantFolding.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 8a73c02bc363e..901f0738cc6d4 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3244,15 +3244,15 @@ static Constant *ConstantFoldLibCall2(StringRef Name, Type *Ty,
case LibFunc_fdim:
case LibFunc_fdimf:
case LibFunc_fdiml:
- if (TLI->has(Func)){
- APFloat Difference = Op1V;
- Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
+ if (TLI->has(Func)){
+ APFloat Difference = Op1V;
+ Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
- APFloat MaxVal =
- maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
- return ConstantFP::get(Ty->getContext(), MaxVal);
- }
- break;
+ APFloat MaxVal =
+ maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
+ return ConstantFP::get(Ty->getContext(), MaxVal);
+ }
+ break;
}
return nullptr;
>From 5d9b081df2966fe8064355d03d8cf0f491a08ccd Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Sat, 13 Dec 2025 13:21:01 -0500
Subject: [PATCH 3/6] Update ConstantFolding.cpp
Might be an overguarding issue
---
llvm/lib/Analysis/ConstantFolding.cpp | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 901f0738cc6d4..dd4a3abf8c89d 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3244,14 +3244,12 @@ static Constant *ConstantFoldLibCall2(StringRef Name, Type *Ty,
case LibFunc_fdim:
case LibFunc_fdimf:
case LibFunc_fdiml:
- if (TLI->has(Func)){
- APFloat Difference = Op1V;
- Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
+ APFloat Difference = Op1V;
+ Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
- APFloat MaxVal =
- maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
- return ConstantFP::get(Ty->getContext(), MaxVal);
- }
+ APFloat MaxVal =
+ maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
+ return ConstantFP::get(Ty->getContext(), MaxVal);
break;
}
>From 1bebb8cffb176cac697cf876adf655e2f6754618 Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Mon, 15 Dec 2025 12:33:52 -0500
Subject: [PATCH 4/6] remove poison handling
---
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 5 -----
1 file changed, 5 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 55cd08b3de855..2ca2986567180 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -3195,11 +3195,6 @@ Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
return nullptr;
// TODO : Handle undef values
- // Propagate poison if any
- if (isa<PoisonValue>(CI->getArgOperand(0)))
- return CI->getArgOperand(0);
- if (isa<PoisonValue>(CI->getArgOperand(1)))
- return CI->getArgOperand(1);
// Constant folding will be handled by ConstantFoldLibCall2
return nullptr;
>From d3d4d7a02bf4b084cc22cd446ccb57b9dc17f851 Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Tue, 16 Dec 2025 01:32:16 +0530
Subject: [PATCH 5/6] Update llvm/lib/Analysis/ConstantFolding.cpp
remove break that isn't reached
Co-authored-by: Antonio Frighetto <me at antoniofrighetto.com>
---
llvm/lib/Analysis/ConstantFolding.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index dd4a3abf8c89d..7877cd0276e04 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3250,7 +3250,6 @@ static Constant *ConstantFoldLibCall2(StringRef Name, Type *Ty,
APFloat MaxVal =
maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
return ConstantFP::get(Ty->getContext(), MaxVal);
- break;
}
return nullptr;
>From 0d14107fe2f54bfc3809773c8b49c618127cb0c4 Mon Sep 17 00:00:00 2001
From: Ron Xavier <Ronelxavi at gmail.com>
Date: Wed, 24 Dec 2025 22:17:29 -0500
Subject: [PATCH 6/6] Remove function + formatting
---
llvm/lib/Analysis/ConstantFolding.cpp | 2 +-
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 12 ------------
2 files changed, 1 insertion(+), 13 deletions(-)
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index dd4a3abf8c89d..8d8d011ee7f7c 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3248,7 +3248,7 @@ static Constant *ConstantFoldLibCall2(StringRef Name, Type *Ty,
Difference.subtract(Op2V, RoundingMode::NearestTiesToEven);
APFloat MaxVal =
- maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
+ maximum(Difference, APFloat::getZero(Ty->getFltSemantics()));
return ConstantFP::get(Ty->getContext(), MaxVal);
break;
}
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 2ca2986567180..665abc6007e88 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -3188,18 +3188,6 @@ Value *LibCallSimplifier::optimizeRemquo(CallInst *CI, IRBuilderBase &B) {
return ConstantFP::get(CI->getType(), Rem);
}
-/// Constant folds fdim
-Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
- // Cannot perform the fold unless the call has attribute memory(none)
- if (!CI->doesNotAccessMemory())
- return nullptr;
-
- // TODO : Handle undef values
-
- // Constant folding will be handled by ConstantFoldLibCall2
- return nullptr;
-}
-
//===----------------------------------------------------------------------===//
// Integer Library Call Optimizations
//===----------------------------------------------------------------------===//
More information about the llvm-commits
mailing list