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

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


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-globalisel

Author: Joel Walker  (Joel-Wwalker)

<details>
<summary>Changes</summary>

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).


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


2 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+8) 
- (added) llvm/test/CodeGen/AArch64/GlobalISel/knownbits-vashr.mir (+57) 


``````````diff
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>)
+...

``````````

</details>


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


More information about the llvm-commits mailing list