[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