[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