[llvm] [AArch64][GlobalISel] Add sign bits for G_VASHR (PR #210269)

Joel Walker via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 17 01:15:10 PDT 2026


https://github.com/Joel-Wwalker created https://github.com/llvm/llvm-project/pull/210269

Ports the `AArch64ISD::VASHR` case from `ComputeNumSignBitsForTargetNode` to the GlobalISel hook: an arithmetic right shift by K adds K copies of the sign bit, so the result has `min(SignBits(Src) + K, ScalarSizeInBits)` sign bits. `G_VASHR`'s shift amount is always an immediate in `[1, ElementBits]`.

Follow-up to #198314, which added the `G_FCM*` cases.

Assisted by Claude (Anthropic).


>From 0ca61352c7faf87515422262a3821ed0fa50468c Mon Sep 17 00:00:00 2001
From: Joel-Wwalker <theagingboy05 at gmail.com>
Date: Fri, 17 Jul 2026 04:14:55 -0400
Subject: [PATCH] [AArch64][GlobalISel] Add sign bits for G_VASHR

Ports the AArch64ISD::VASHR case from ComputeNumSignBitsForTargetNode:
an arithmetic right shift by K adds K copies of the sign bit, so the
result has min(SignBits(Src) + K, ScalarSizeInBits) sign bits. G_VASHR's
shift amount is always an immediate in [1, ElementBits].

Follow-up to #198314, which added the G_FCM* cases.
---
 .../Target/AArch64/AArch64ISelLowering.cpp    |  8 +++
 .../AArch64/GlobalISel/knownbits-vashr.mir    | 57 +++++++++++++++++++
 2 files changed, 65 insertions(+)
 create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vashr.mir

diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index c2956226e4a92..46d1a08079423 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -42,6 +42,7 @@
 #include "llvm/CodeGen/Analysis.h"
 #include "llvm/CodeGen/CallingConvLower.h"
 #include "llvm/CodeGen/ComplexDeinterleavingPass.h"
+#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
 #include "llvm/CodeGen/GlobalISel/Utils.h"
 #include "llvm/CodeGen/ISDOpcodes.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
@@ -3099,6 +3100,13 @@ unsigned AArch64TargetLowering::computeNumSignBitsForTargetInstr(
     LLT VT = MRI.getType(R);
     return VT.getScalarSizeInBits();
   }
+  case AArch64::G_VASHR: {
+    unsigned Tmp = Analysis.computeNumSignBits(MI->getOperand(1).getReg(),
+                                               DemandedElts, Depth + 1);
+    LLT VT = MRI.getType(R);
+    return std::min<uint64_t>(Tmp + MI->getOperand(2).getImm(),
+                              VT.getScalarSizeInBits());
+  }
   default:
     return 1;
   }
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vashr.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vashr.mir
new file mode 100644
index 0000000000000..436e03ef1a065
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vashr.mir
@@ -0,0 +1,57 @@
+# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
+# RUN: llc -mtriple=aarch64 -passes="print<gisel-value-tracking>" -filetype=null %s 2>&1 | FileCheck %s
+
+---
+name: VASHR
+body: |
+  bb.1:
+    liveins: $q0
+  ; CHECK-LABEL: name: @VASHR
+  ; CHECK-NEXT: %0:fpr KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %1:fpr KnownBits:???????????????? SignBits:4
+    %0:fpr(<8 x i16>) = COPY $q0
+    %1:fpr(<8 x i16>) = G_VASHR %0, 3
+    $q0 = COPY %1:fpr(<8 x i16>)
+...
+---
+name: VASHR_clamp
+body: |
+  bb.1:
+    liveins: $q0
+  ; CHECK-LABEL: name: @VASHR_clamp
+  ; CHECK-NEXT: %0:fpr KnownBits:???????? SignBits:1
+  ; CHECK-NEXT: %1:fpr KnownBits:???????? SignBits:8
+    %0:fpr(<16 x i8>) = COPY $q0
+    %1:fpr(<16 x i8>) = G_VASHR %0, 8
+    $q0 = COPY %1:fpr(<16 x i8>)
+...
+---
+name: VASHR_chain
+body: |
+  bb.1:
+    liveins: $q0
+  ; CHECK-LABEL: name: @VASHR_chain
+  ; CHECK-NEXT: %0:fpr KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %1:fpr KnownBits:???????????????? SignBits:4
+  ; CHECK-NEXT: %2:fpr KnownBits:???????????????? SignBits:9
+    %0:fpr(<8 x i16>) = COPY $q0
+    %1:fpr(<8 x i16>) = G_VASHR %0, 3
+    %2:fpr(<8 x i16>) = G_VASHR %1, 5
+    $q0 = COPY %2:fpr(<8 x i16>)
+...
+---
+name: VASHR_fcmeq
+body: |
+  bb.1:
+    liveins: $q0, $q1
+  ; CHECK-LABEL: name: @VASHR_fcmeq
+  ; CHECK-NEXT: %0:fpr KnownBits:???????????????????????????????? SignBits:1
+  ; CHECK-NEXT: %1:fpr KnownBits:???????????????????????????????? SignBits:1
+  ; CHECK-NEXT: %2:fpr KnownBits:???????????????????????????????? SignBits:32
+  ; CHECK-NEXT: %3:fpr KnownBits:???????????????????????????????? SignBits:32
+    %0:fpr(<4 x f32>) = COPY $q0
+    %1:fpr(<4 x f32>) = COPY $q1
+    %2:fpr(<4 x i32>) = G_FCMEQ %0:fpr, %1:fpr(<4 x f32>)
+    %3:fpr(<4 x i32>) = G_VASHR %2, 5
+    $q0 = COPY %3:fpr(<4 x i32>)
+...



More information about the llvm-commits mailing list