[llvm] [ConstantFold] Fix result type when folding powi.f16 (PR #98681)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 13 01:30:22 PDT 2024


https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/98681

>From a0097cbfd275d08831ee02b354fce7011d57eb19 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 03:05:37 +0800
Subject: [PATCH 1/4] [ConstantFold] Fix result type when folding powi.f16

---
 llvm/lib/Analysis/ConstantFolding.cpp                | 12 +++++++-----
 .../Transforms/InstSimplify/ConstProp/pr98665.ll     | 11 +++++++++++
 2 files changed, 18 insertions(+), 5 deletions(-)
 create mode 100644 llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 962880f68f076..b86f91edeb5b9 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2760,11 +2760,13 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
 
       if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
         return nullptr;
-      if (IntrinsicID == Intrinsic::powi && Ty->isHalfTy())
-        return ConstantFP::get(
-            Ty->getContext(),
-            APFloat((float)std::pow((float)Op1V.convertToDouble(),
-                                    (int)Op2C->getZExtValue())));
+      if (IntrinsicID == Intrinsic::powi && Ty->isHalfTy()) {
+        APFloat Res((float)std::pow((float)Op1V.convertToDouble(),
+                                    (int)Op2C->getZExtValue()));
+        bool unused;
+        Res.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &unused);
+        return ConstantFP::get(Ty->getContext(), Res);
+      }
       if (IntrinsicID == Intrinsic::powi && Ty->isFloatTy())
         return ConstantFP::get(
             Ty->getContext(),
diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll b/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll
new file mode 100644
index 0000000000000..8b7d361840936
--- /dev/null
+++ b/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll
@@ -0,0 +1,11 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
+; Make sure that the type is correct after constant folding
+
+define half @pr98665() {
+; CHECK-LABEL: define half @pr98665() {
+; CHECK-NEXT:    ret half 0xH3C00
+;
+  %x = call half @llvm.powi.f16.i32(half 0xH3C00, i32 1)
+  ret half %x
+}

>From b0a1393e34290aa1b4db61c5c842306ab62ec231 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 04:23:07 +0800
Subject: [PATCH 2/4] [ConstandFold] Address review comments. NFC.

---
 llvm/lib/Analysis/ConstantFolding.cpp         | 40 +++++++++----------
 llvm/test/Transforms/EarlyCSE/math-2.ll       | 10 +++++
 .../InstSimplify/ConstProp/pr98665.ll         | 11 -----
 3 files changed, 30 insertions(+), 31 deletions(-)
 delete mode 100644 llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index b86f91edeb5b9..73278ea6b2a97 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2754,29 +2754,29 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
           ((Mask & fcPosInf) && Op1V.isPosInfinity());
         return ConstantInt::get(Ty, Result);
       }
+      case Intrinsic::powi: {
+        int exp = static_cast<int>(Op2C->getZExtValue());
+        switch (Ty->getTypeID()) {
+        case Type::HalfTyID:
+        case Type::FloatTyID: {
+          APFloat Res(std::pow(Op1V.convertToFloat(), exp));
+          if (Ty->isHalfTy()) {
+            bool Unused;
+            Res.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
+                        &Unused);
+          }
+          return ConstantFP::get(Ty->getContext(), Res);
+        }
+        case Type::DoubleTyID:
+          return ConstantFP::get(
+              Ty->getContext(), APFloat(std::pow(Op1V.convertToDouble(), exp)));
+        default:
+          return nullptr;
+        }
+      }
       default:
         break;
       }
-
-      if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
-        return nullptr;
-      if (IntrinsicID == Intrinsic::powi && Ty->isHalfTy()) {
-        APFloat Res((float)std::pow((float)Op1V.convertToDouble(),
-                                    (int)Op2C->getZExtValue()));
-        bool unused;
-        Res.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &unused);
-        return ConstantFP::get(Ty->getContext(), Res);
-      }
-      if (IntrinsicID == Intrinsic::powi && Ty->isFloatTy())
-        return ConstantFP::get(
-            Ty->getContext(),
-            APFloat((float)std::pow((float)Op1V.convertToDouble(),
-                                    (int)Op2C->getZExtValue())));
-      if (IntrinsicID == Intrinsic::powi && Ty->isDoubleTy())
-        return ConstantFP::get(
-            Ty->getContext(),
-            APFloat((double)std::pow(Op1V.convertToDouble(),
-                                     (int)Op2C->getZExtValue())));
     }
     return nullptr;
   }
diff --git a/llvm/test/Transforms/EarlyCSE/math-2.ll b/llvm/test/Transforms/EarlyCSE/math-2.ll
index d9f7c619fa013..60a2f19084c83 100644
--- a/llvm/test/Transforms/EarlyCSE/math-2.ll
+++ b/llvm/test/Transforms/EarlyCSE/math-2.ll
@@ -98,4 +98,14 @@ define double @i_powi() {
   ret double %res
 }
 
+; Make sure that the type is correct after constant folding
+
+define half @pr98665() {
+; CHECK-LABEL: @pr98665(
+; CHECK-NEXT:    ret half 0xH3C00
+;
+  %x = call half @llvm.powi.f16.i32(half 0xH3C00, i32 1)
+  ret half %x
+}
+
 attributes #0 = { nofree nounwind willreturn }
diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll b/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll
deleted file mode 100644
index 8b7d361840936..0000000000000
--- a/llvm/test/Transforms/InstSimplify/ConstProp/pr98665.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
-; Make sure that the type is correct after constant folding
-
-define half @pr98665() {
-; CHECK-LABEL: define half @pr98665() {
-; CHECK-NEXT:    ret half 0xH3C00
-;
-  %x = call half @llvm.powi.f16.i32(half 0xH3C00, i32 1)
-  ret half %x
-}

>From 00fce823e5d7e1b1ecd5d9f1697f83aecca8c1d5 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 04:25:16 +0800
Subject: [PATCH 3/4] [ConstantFold] Use `ConstantFP::get(Ty, double)`

---
 llvm/lib/Analysis/ConstantFolding.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 73278ea6b2a97..b8b82d3578058 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2768,8 +2768,7 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
           return ConstantFP::get(Ty->getContext(), Res);
         }
         case Type::DoubleTyID:
-          return ConstantFP::get(
-              Ty->getContext(), APFloat(std::pow(Op1V.convertToDouble(), exp)));
+          return ConstantFP::get(Ty, std::pow(Op1V.convertToDouble(), exp));
         default:
           return nullptr;
         }

>From 0d11d5ae27f8aea340be96240271eb53ecb21d0a Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 13 Jul 2024 16:29:52 +0800
Subject: [PATCH 4/4] [ConstantFold] Address review comments.

---
 llvm/lib/Analysis/ConstantFolding.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index b8b82d3578058..6c52091cd5d75 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2755,11 +2755,11 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
         return ConstantInt::get(Ty, Result);
       }
       case Intrinsic::powi: {
-        int exp = static_cast<int>(Op2C->getZExtValue());
+        int Exp = static_cast<int>(Op2C->getSExtValue());
         switch (Ty->getTypeID()) {
         case Type::HalfTyID:
         case Type::FloatTyID: {
-          APFloat Res(std::pow(Op1V.convertToFloat(), exp));
+          APFloat Res(std::pow(Op1V.convertToFloat(), Exp));
           if (Ty->isHalfTy()) {
             bool Unused;
             Res.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
@@ -2768,7 +2768,7 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
           return ConstantFP::get(Ty->getContext(), Res);
         }
         case Type::DoubleTyID:
-          return ConstantFP::get(Ty, std::pow(Op1V.convertToDouble(), exp));
+          return ConstantFP::get(Ty, std::pow(Op1V.convertToDouble(), Exp));
         default:
           return nullptr;
         }



More information about the llvm-commits mailing list