[llvm] [CodeGen][ExpandIRInsts] Fix sitofp integer-to-float exponent overflow bug (PR #189142)

via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 30 23:55:56 PDT 2026


https://github.com/thenirajkushwaha updated https://github.com/llvm/llvm-project/pull/189142

>From 738d54fe9c44a6ced9272b98350aec1a2a177ee6 Mon Sep 17 00:00:00 2001
From: thenirajkushwaha <nirajkushwaha0714 at gmail.com>
Date: Sat, 28 Mar 2026 09:33:09 +0530
Subject: [PATCH 1/2] [CodeGen] Fix sitofp integer-to-float exponent overflow
 bug (#189054)

---
 llvm/lib/CodeGen/ExpandIRInsts.cpp | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/ExpandIRInsts.cpp b/llvm/lib/CodeGen/ExpandIRInsts.cpp
index d8a856d00ae3b..6959b11b6c646 100644
--- a/llvm/lib/CodeGen/ExpandIRInsts.cpp
+++ b/llvm/lib/CodeGen/ExpandIRInsts.cpp
@@ -1111,7 +1111,17 @@ static void expandIToFP(Instruction *IToFP) {
   Retval0->addIncoming(A4, IfEnd26);
   Retval0->addIncoming(ConstantFP::getZero(IToFP->getType(), false), Entry);
 
-  IToFP->replaceAllUsesWith(Retval0);
+  unsigned MaxExp = APFloat::semanticsMaxExponent(IToFP->getType()->getFltSemantics());
+  Value *OvfCmp = Builder.CreateICmpUGE(Sub1, Builder.getIntN(BitWidthNew, MaxExp + 2));
+  Value *Inf = ConstantFP::getInfinity(IToFP->getType());
+  if (IsSigned) {
+    Value *NegInf = ConstantFP::getInfinity(IToFP->getType(), true);
+    Value *SignCmp = Builder.CreateICmpSLT(IntVal, Constant::getNullValue(IntVal->getType()));
+    Inf = Builder.CreateSelect(SignCmp, NegInf, Inf);
+  }
+  Value *Result = Builder.CreateSelect(OvfCmp, Inf, Retval0);
+
+  IToFP->replaceAllUsesWith(Result);
   IToFP->dropAllReferences();
   IToFP->eraseFromParent();
 }

>From 56e76c05af5be4e2cee2f42524a6bb4db0f4fe17 Mon Sep 17 00:00:00 2001
From: thenirajkushwaha <nirajkushwaha0714 at gmail.com>
Date: Tue, 31 Mar 2026 12:10:20 +0530
Subject: [PATCH 2/2] Optimize sitofp integer-to-float exponent overflow check

---
 llvm/lib/CodeGen/ExpandIRInsts.cpp | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/CodeGen/ExpandIRInsts.cpp b/llvm/lib/CodeGen/ExpandIRInsts.cpp
index 6959b11b6c646..f2badd1d2132a 100644
--- a/llvm/lib/CodeGen/ExpandIRInsts.cpp
+++ b/llvm/lib/CodeGen/ExpandIRInsts.cpp
@@ -1111,15 +1111,22 @@ static void expandIToFP(Instruction *IToFP) {
   Retval0->addIncoming(A4, IfEnd26);
   Retval0->addIncoming(ConstantFP::getZero(IToFP->getType(), false), Entry);
 
-  unsigned MaxExp = APFloat::semanticsMaxExponent(IToFP->getType()->getFltSemantics());
-  Value *OvfCmp = Builder.CreateICmpUGE(Sub1, Builder.getIntN(BitWidthNew, MaxExp + 2));
-  Value *Inf = ConstantFP::getInfinity(IToFP->getType());
-  if (IsSigned) {
-    Value *NegInf = ConstantFP::getInfinity(IToFP->getType(), true);
-    Value *SignCmp = Builder.CreateICmpSLT(IntVal, Constant::getNullValue(IntVal->getType()));
-    Inf = Builder.CreateSelect(SignCmp, NegInf, Inf);
+  unsigned MaxExp =
+      APFloat::semanticsMaxExponent(IToFP->getType()->getFltSemantics());
+  Value *Result = Retval0;
+
+  if (BitWidth >= MaxExp + 2) {
+    Value *OvfCmp =
+        Builder.CreateICmpUGE(Sub1, Builder.getIntN(BitWidthNew, MaxExp + 2));
+    Value *Inf = ConstantFP::getInfinity(IToFP->getType());
+    if (IsSigned) {
+      Value *NegInf = ConstantFP::getInfinity(IToFP->getType(), true);
+      Value *SignCmp = Builder.CreateICmpSLT(
+          IntVal, Constant::getNullValue(IntVal->getType()));
+      Inf = Builder.CreateSelect(SignCmp, NegInf, Inf);
+    }
+    Result = Builder.CreateSelect(OvfCmp, Inf, Retval0);
   }
-  Value *Result = Builder.CreateSelect(OvfCmp, Inf, Retval0);
 
   IToFP->replaceAllUsesWith(Result);
   IToFP->dropAllReferences();



More information about the llvm-commits mailing list