[llvm] 75ae202 - [AArch64][GlobalISel] Add sign bits for G_FCMEQ (#198314)
via llvm-commits
llvm-commits at lists.llvm.org
Tue May 19 04:56:38 PDT 2026
Author: David Green
Date: 2026-05-19T12:56:32+01:00
New Revision: 75ae202145b316883caa6074e9c94431ef152c26
URL: https://github.com/llvm/llvm-project/commit/75ae202145b316883caa6074e9c94431ef152c26
DIFF: https://github.com/llvm/llvm-project/commit/75ae202145b316883caa6074e9c94431ef152c26.diff
LOG: [AArch64][GlobalISel] Add sign bits for G_FCMEQ (#198314)
This adds basic num-sign-bits for G_FCMEQ, G_FCMGE and G_FCMGT, which
all produce either all-ones or all-zeros in each vector lane. This
function apparently goes in AArch64ISelLowering.
Added:
llvm/test/CodeGen/AArch64/GlobalISel/knownbits-fcmeq.mir
Modified:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 8c93adac0adf9..c90da5df1a7e9 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -2992,6 +2992,25 @@ unsigned AArch64TargetLowering::ComputeNumSignBitsForTargetNode(
return 1;
}
+unsigned AArch64TargetLowering::computeNumSignBitsForTargetInstr(
+ GISelValueTracking &Analysis, Register R, const APInt &DemandedElts,
+ const MachineRegisterInfo &MRI, unsigned Depth) const {
+ const MachineInstr *MI = MRI.getVRegDef(R);
+ if (!MI)
+ return 1;
+
+ switch (MI->getOpcode()) {
+ case AArch64::G_FCMEQ:
+ case AArch64::G_FCMGE:
+ case AArch64::G_FCMGT: {
+ LLT VT = MRI.getType(R);
+ return VT.getScalarSizeInBits();
+ }
+ default:
+ return 1;
+ }
+}
+
MVT AArch64TargetLowering::getScalarShiftAmountTy(const DataLayout &DL,
EVT) const {
return MVT::i64;
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index 25cab4d3eed7e..808d297d54e10 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -91,6 +91,12 @@ class AArch64TargetLowering : public TargetLowering {
const SelectionDAG &DAG,
unsigned Depth) const override;
+ unsigned computeNumSignBitsForTargetInstr(GISelValueTracking &Analysis,
+ Register R,
+ const APInt &DemandedElts,
+ const MachineRegisterInfo &MRI,
+ unsigned Depth = 0) const override;
+
MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const override {
if ((AS == ARM64AS::PTR32_SPTR) || (AS == ARM64AS::PTR32_UPTR)) {
// These are 32-bit pointers created using the `__ptr32` extension or
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-fcmeq.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-fcmeq.mir
new file mode 100644
index 0000000000000..a72734f9d5a4b
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-fcmeq.mir
@@ -0,0 +1,45 @@
+# 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: FCMEQ
+body: |
+ bb.1:
+ liveins: $q0, $q1
+ ; CHECK-LABEL: name: @FCMEQ
+ ; CHECK-NEXT: %0:fpr KnownBits:???????????????? SignBits:1
+ ; CHECK-NEXT: %1:fpr KnownBits:???????????????? SignBits:1
+ ; CHECK-NEXT: %2:fpr KnownBits:???????????????? SignBits:16
+ %0:fpr(<8 x f16>) = COPY $q0
+ %1:fpr(<8 x f16>) = COPY $q1
+ %2:fpr(<8 x i16>) = G_FCMEQ %0:fpr, %1:fpr(<8 x f16>)
+ $q0 = COPY %2:fpr(<8 x i16>)
+...
+---
+name: FCMGE
+body: |
+ bb.1:
+ liveins: $q0, $q1
+ ; CHECK-LABEL: name: @FCMGE
+ ; CHECK-NEXT: %0:fpr KnownBits:???????????????????????????????? SignBits:1
+ ; CHECK-NEXT: %1:fpr KnownBits:???????????????????????????????? SignBits:1
+ ; CHECK-NEXT: %2:fpr KnownBits:???????????????????????????????? SignBits:32
+ %0:fpr(<4 x f32>) = COPY $q0
+ %1:fpr(<4 x f32>) = COPY $q1
+ %2:fpr(<4 x i32>) = G_FCMGE %0:fpr, %1:fpr(<4 x f32>)
+ $q0 = COPY %2:fpr(<4 x i32>)
+...
+---
+name: FCMGT
+body: |
+ bb.1:
+ liveins: $q0, $q1
+ ; CHECK-LABEL: name: @FCMGT
+ ; CHECK-NEXT: %0:fpr KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
+ ; CHECK-NEXT: %1:fpr KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
+ ; CHECK-NEXT: %2:fpr KnownBits:???????????????????????????????????????????????????????????????? SignBits:64
+ %0:fpr(<2 x f64>) = COPY $q0
+ %1:fpr(<2 x f64>) = COPY $q1
+ %2:fpr(<2 x i64>) = G_FCMGT %0:fpr, %1:fpr(<2 x f64>)
+ $q0 = COPY %2:fpr(<2 x i64>)
+...
More information about the llvm-commits
mailing list