[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