[llvm] [GlobalISel] Add G_UITOFP, G_SITOFP, G_FPTOUI_SAT to computeKnownBits (PR #215766)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 12 20:19:20 PDT 2026
https://github.com/Bhuvan1527 updated https://github.com/llvm/llvm-project/pull/215766
>From e86a3e77781e2bc1452ad43ae4c2403745dda99f Mon Sep 17 00:00:00 2001
From: Bhuvan1527 <balabhuvanvarma at gmail.com>
Date: Wed, 12 Aug 2026 15:17:06 +0530
Subject: [PATCH 1/2] [GlobalISel] Add G_UITOFP, G_SITOFP, and G_FPTOUI_SAT to
computeKnownBits
Related: https://github.com/llvm/llvm-project/issues/150515
Ticks: UINT_TO_FP, SINT_TO_FP, FP_TO_UINT_SAT
---
.../CodeGen/GlobalISel/GISelValueTracking.cpp | 20 ++++++++
.../GlobalISel/int-to-float-conversion.mir | 50 +++++++++++++++++++
2 files changed, 70 insertions(+)
create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 0ffc368178cfc..f77d4eab93418 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -28,6 +28,7 @@
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Register.h"
+#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/IR/ConstantRange.h"
@@ -822,6 +823,25 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
Known.One.clearLowBits(LogOfAlign);
break;
}
+ case TargetOpcode::G_UITOFP: {
+ Known.makeNonNegative();
+ break;
+ }
+ case TargetOpcode::G_SITOFP: {
+ computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, Depth + 1);
+ if(Known2.isNonNegative())
+ Known.makeNonNegative();
+ else if(Known2.isNegative())
+ Known.makeNegative();
+ break;
+ }
+ case TargetOpcode::G_FPTOUI_SAT: {
+ // get scalarsizein bits of the destination type and set all bits to zero
+ Register Reg = MI.getOperand(2).getReg();
+ unsigned DestSize = MRI.getType(Reg).getScalarSizeInBits();
+ Known.Zero |= APInt::getBitsSetFrom(BitWidth, DestSize);
+ break;
+ }
case TargetOpcode::G_MERGE_VALUES: {
unsigned NumOps = MI.getNumOperands();
unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir b/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
new file mode 100644
index 0000000000000..2f10b4f21fa3d
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
@@ -0,0 +1,50 @@
+# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=aarch64 -passes="print<gisel-value-tracking>" -filetype=null %s 2>&1 | FileCheck %s
+
+---
+name: Cst_UITOFP_One
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @Cst_UITOFP_One
+ ; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000000001 SignBits:31 IsKnownNeverZero:1
+ ; CHECK-NEXT: %1:_ KnownBits:0??????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(s32) = G_CONSTANT i32 1
+ %1:_(s32) = G_UITOFP %0
+...
+---
+name: Cst_UITOFP_Max
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @Cst_UITOFP_Max
+ ; CHECK-NEXT: %0:_ KnownBits:11111111111111111111111111111111 SignBits:32 IsKnownNeverZero:1
+ ; CHECK-NEXT: %1:_ KnownBits:0??????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(s32) = G_CONSTANT i32 4294967295
+ %1:_(s32) = G_UITOFP %0
+...
+---
+name: Cst_SITOFP_Neg_One
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @Cst_SITOFP_Neg_One
+ ; CHECK-NEXT: %0:_ KnownBits:11111111111111111111111111111111 SignBits:32 IsKnownNeverZero:1
+ ; CHECK-NEXT: %1:_ KnownBits:1??????????????????????????????? SignBits:1 IsKnownNeverZero:1
+ %0:_(s32) = G_CONSTANT i32 -1
+ %1:_(s32) = G_SITOFP %0
+...
+---
+name: Cst_SITOFP_Max
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @Cst_SITOFP_Max
+ ; CHECK-NEXT: %0:_ KnownBits:01111111111111111111111111111111 SignBits:1 IsKnownNeverZero:1
+ ; CHECK-NEXT: %1:_ KnownBits:0??????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(s32) = G_CONSTANT i32 2147483647
+ %1:_(s32) = G_SITOFP %0
+...
+---
+name: Cst_FPTOUI_SAT_One
+body: |
+ bb.0:
+ %0:_(s32) = G_FCONSTANT float 1.000000e+00
+ %1:_(s32) = G_FPTOUI_SAT %0(s32)
+...
>From f0f087e3a90eb46f5096646de5ab8df5af234cc8 Mon Sep 17 00:00:00 2001
From: Bhuvan1527 <balabhuvanvarma at gmail.com>
Date: Wed, 12 Aug 2026 15:17:06 +0530
Subject: [PATCH 2/2] [GlobalISel] Add G_UITOFP and G_SITOFP to
computeKnownBits
Related: https://github.com/llvm/llvm-project/issues/150515
Ticks: UINT_TO_FP, SINT_TO_FP
---
llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp | 7 -------
.../CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir | 7 -------
2 files changed, 14 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index f77d4eab93418..d2eddf847bc23 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -834,13 +834,6 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
else if(Known2.isNegative())
Known.makeNegative();
break;
- }
- case TargetOpcode::G_FPTOUI_SAT: {
- // get scalarsizein bits of the destination type and set all bits to zero
- Register Reg = MI.getOperand(2).getReg();
- unsigned DestSize = MRI.getType(Reg).getScalarSizeInBits();
- Known.Zero |= APInt::getBitsSetFrom(BitWidth, DestSize);
- break;
}
case TargetOpcode::G_MERGE_VALUES: {
unsigned NumOps = MI.getNumOperands();
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir b/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
index 2f10b4f21fa3d..6145640e97274 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/int-to-float-conversion.mir
@@ -41,10 +41,3 @@ body: |
%0:_(s32) = G_CONSTANT i32 2147483647
%1:_(s32) = G_SITOFP %0
...
----
-name: Cst_FPTOUI_SAT_One
-body: |
- bb.0:
- %0:_(s32) = G_FCONSTANT float 1.000000e+00
- %1:_(s32) = G_FPTOUI_SAT %0(s32)
-...
More information about the llvm-commits
mailing list