[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