[llvm] [GlobalISel] Add G_VSCALE to computeKnownBits (PR #216025)

via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 05:22:41 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: Xaver Fabian (XFabian)

<details>
<summary>Changes</summary>

Ports the ISD::VSCALE case from SelectionDAG::computeKnownBits over to GISelValueTracking::computeKnownBitsImpl.
Part of #<!-- -->150515.

---
Full diff: https://github.com/llvm/llvm-project/pull/216025.diff


2 Files Affected:

- (modified) llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp (+6) 
- (added) llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vscale.mir (+90) 


``````````diff
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
new file mode 100644
index 0000000000000..083653a090221
--- /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:00000000000000000000000000000000000000000000000000000000000????? SignBits:59 IsKnownNeverZero:0
+    %0:_(i64) = G_VSCALE i64 1
+...
+---
+name: VScale_Pow2
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @VScale_Pow2
+  ; CHECK-NEXT: %0:_ KnownBits:0000000000000000000000000000000000000000000000000000000????????? SignBits:55 IsKnownNeverZero:0
+    %0:_(i64) = G_VSCALE i64 16
+...
+---
+name: VScale_NonPow2
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @VScale_NonPow2
+  ; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000000000000000000000000000000000???????? SignBits:56 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:11111111111111111111111111111111111111111111111111111111???????? SignBits:56 IsKnownNeverZero:1
+    %0:_(i64) = G_VSCALE i64 -16
+...
+---
+name: VScale_Neg_NonPow2
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @VScale_Neg_NonPow2
+  ; CHECK-NEXT: %0:_ KnownBits:11111111111111111111111111111111111111111111111111111111???????? SignBits:56 IsKnownNeverZero:1
+    %0:_(i64) = G_VSCALE i64 -11
+...
+---
+name: VScale_Exact
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @VScale_Exact
+  ; CHECK-NEXT: %0:_ KnownBits:00000010 SignBits:6 IsKnownNeverZero:1
+    %0:_(i8) = G_VSCALE i8 1
+...
+---
+name: VScale_i8
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @VScale_i8
+  ; CHECK-NEXT: %0:_ KnownBits:00?????? SignBits:2 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
+...

``````````

</details>


https://github.com/llvm/llvm-project/pull/216025


More information about the llvm-commits mailing list