[llvm] [GlobalISel] Add G_VSCALE to computeKnownBits (PR #216025)
Xaver Fabian via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 13 05:18:24 PDT 2026
https://github.com/XFabian created https://github.com/llvm/llvm-project/pull/216025
Ports the ISD::VSCALE case from SelectionDAG::computeKnownBits over to GISelValueTracking::computeKnownBitsImpl.
Part of #150515.
>From 8c4a3ce3bd509ec9b315644e1be05053cfef9ea2 Mon Sep 17 00:00:00 2001
From: Xaver Fabian <xaver.fabian at gmail.com>
Date: Thu, 13 Aug 2026 12:37:00 +0200
Subject: [PATCH 1/2] [GlobalISel] Add baseline test for G_VSCALE known bits
---
.../AArch64/GlobalISel/knownbits-vscale.mir | 90 +++++++++++++++++++
1 file changed, 90 insertions(+)
create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
new file mode 100644
index 0000000000000..04c21f0c95ea9
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
@@ -0,0 +1,90 @@
+# 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
+
+--- |
+ define void @VScale_NoAttr() { ret void }
+ define void @VScale_One() #0 { ret void }
+ define void @VScale_Pow2() #0 { ret void }
+ define void @VScale_NonPow2() #0 { ret void }
+ define void @VScale_Neg_Pow2() #0 { ret void }
+ define void @VScale_Neg_NonPow2() #0 { ret void }
+
+ define void @VScale_Exact() #1 { ret void }
+ define void @VScale_i8() #0 { ret void }
+ define void @VScale_i8_Overflow() #0 { ret void }
+
+ attributes #0 = { vscale_range(1, 16) }
+ attributes #1 = { vscale_range(2, 2) }
+...
+---
+name: VScale_NoAttr
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_NoAttr
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 1
+...
+---
+name: VScale_One
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_One
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 1
+...
+---
+name: VScale_Pow2
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_Pow2
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 16
+...
+---
+name: VScale_NonPow2
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_NonPow2
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 11
+...
+---
+name: VScale_Neg_Pow2
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_Neg_Pow2
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 -16
+...
+---
+name: VScale_Neg_NonPow2
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_Neg_NonPow2
+ ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i64) = G_VSCALE i64 -11
+...
+---
+name: VScale_Exact
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_Exact
+ ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i8) = G_VSCALE i8 1
+...
+---
+name: VScale_i8
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_i8
+ ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i8) = G_VSCALE i8 3
+...
+---
+name: VScale_i8_Overflow
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: @VScale_i8_Overflow
+ ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+ %0:_(i8) = G_VSCALE i8 16
+...
>From 3f52404ff5f1a73505a40f012a0b9330fa65884c Mon Sep 17 00:00:00 2001
From: Xaver Fabian <xaver.fabian at gmail.com>
Date: Thu, 13 Aug 2026 13:09:54 +0200
Subject: [PATCH 2/2] [GlobalISel] Add G_VSCALE to computeKnownBits
---
llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp | 6 ++++++
.../AArch64/GlobalISel/knownbits-vscale.mir | 14 +++++++-------
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 604649c19a7fa..b7038765c7665 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -407,6 +407,12 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
Known.Zero.setHighBits(MaxValue.countl_zero());
break;
}
+ case TargetOpcode::G_VSCALE: {
+ const Function &F = getMachineFunction().getFunction();
+ const APInt &Multiplier = MI.getOperand(1).getCImm()->getValue();
+ Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
+ break;
+ }
case TargetOpcode::G_CONSTANT: {
Known = KnownBits::makeConstant(MI.getOperand(1).getCImm()->getValue());
break;
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
index 04c21f0c95ea9..083653a090221 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir
@@ -29,7 +29,7 @@ name: VScale_One
body: |
bb.0:
; CHECK-LABEL: name: @VScale_One
- ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000000000000000000000000000000000000????? SignBits:59 IsKnownNeverZero:0
%0:_(i64) = G_VSCALE i64 1
...
---
@@ -37,7 +37,7 @@ name: VScale_Pow2
body: |
bb.0:
; CHECK-LABEL: name: @VScale_Pow2
- ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:0000000000000000000000000000000000000000000000000000000????????? SignBits:55 IsKnownNeverZero:0
%0:_(i64) = G_VSCALE i64 16
...
---
@@ -45,7 +45,7 @@ name: VScale_NonPow2
body: |
bb.0:
; CHECK-LABEL: name: @VScale_NonPow2
- ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000000000000000000000000000000000???????? SignBits:56 IsKnownNeverZero:0
%0:_(i64) = G_VSCALE i64 11
...
---
@@ -53,7 +53,7 @@ name: VScale_Neg_Pow2
body: |
bb.0:
; CHECK-LABEL: name: @VScale_Neg_Pow2
- ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:11111111111111111111111111111111111111111111111111111111???????? SignBits:56 IsKnownNeverZero:1
%0:_(i64) = G_VSCALE i64 -16
...
---
@@ -61,7 +61,7 @@ name: VScale_Neg_NonPow2
body: |
bb.0:
; CHECK-LABEL: name: @VScale_Neg_NonPow2
- ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:11111111111111111111111111111111111111111111111111111111???????? SignBits:56 IsKnownNeverZero:1
%0:_(i64) = G_VSCALE i64 -11
...
---
@@ -69,7 +69,7 @@ name: VScale_Exact
body: |
bb.0:
; CHECK-LABEL: name: @VScale_Exact
- ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:00000010 SignBits:6 IsKnownNeverZero:1
%0:_(i8) = G_VSCALE i8 1
...
---
@@ -77,7 +77,7 @@ name: VScale_i8
body: |
bb.0:
; CHECK-LABEL: name: @VScale_i8
- ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+ ; CHECK-NEXT: %0:_ KnownBits:00?????? SignBits:2 IsKnownNeverZero:0
%0:_(i8) = G_VSCALE i8 3
...
---
More information about the llvm-commits
mailing list