[llvm] 895a8e6 - [AArch64][GISel] Support neon.abs intrinsic for vector types (#107226)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 5 19:01:50 PST 2024
Author: Madhur Amilkanthwar
Date: 2024-11-06T08:31:46+05:30
New Revision: 895a8e66c6d1e42519909981ab1bb0ad41231029
URL: https://github.com/llvm/llvm-project/commit/895a8e66c6d1e42519909981ab1bb0ad41231029
DIFF: https://github.com/llvm/llvm-project/commit/895a8e66c6d1e42519909981ab1bb0ad41231029.diff
LOG: [AArch64][GISel] Support neon.abs intrinsic for vector types (#107226)
This patch lowers the intrinsic to G_ABS and thus supports the intrinsic in GISel.
Added:
Modified:
llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
llvm/test/CodeGen/AArch64/arm64-vabs.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 8851ad7ac3503d..f7ca0ca65ac42b 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1711,6 +1711,14 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
return LowerBinOp(AArch64::G_UMULL);
case Intrinsic::aarch64_neon_umull:
return LowerBinOp(AArch64::G_SMULL);
+ case Intrinsic::aarch64_neon_abs: {
+ // Lower the intrinsic to G_ABS.
+ MachineIRBuilder MIB(MI);
+ MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, {MI.getOperand(2)});
+ MI.eraseFromParent();
+ return true;
+ }
+
case Intrinsic::vector_reverse:
// TODO: Add support for vector_reverse
return false;
diff --git a/llvm/test/CodeGen/AArch64/arm64-vabs.ll b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
index 48afcc5c3dd2b6..cc8568709ea21a 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vabs.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
@@ -2,15 +2,7 @@
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck -check-prefixes=CHECK,CHECK-SD %s
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
-; CHECK-GI: warning: Instruction selection used fallback path for abs_8b
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_16b
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_4h
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_8h
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_2s
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_4s
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_1d
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for abs_1d_honestly
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fabds
+; CHECK-GI: warning: Instruction selection used fallback path for fabds
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fabdd
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uabd_i64
@@ -1047,21 +1039,37 @@ define <4 x i32> @abs_4s(ptr %A) nounwind {
}
define <1 x i64> @abs_1d(<1 x i64> %A) nounwind {
-; CHECK-LABEL: abs_1d:
-; CHECK: // %bb.0:
-; CHECK-NEXT: abs d0, d0
-; CHECK-NEXT: ret
+; CHECK-SD-LABEL: abs_1d:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: abs d0, d0
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: abs_1d:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: fmov x8, d0
+; CHECK-GI-NEXT: fmov x9, d0
+; CHECK-GI-NEXT: neg x8, x8
+; CHECK-GI-NEXT: cmp x9, #0
+; CHECK-GI-NEXT: fmov d1, x8
+; CHECK-GI-NEXT: fcsel d0, d0, d1, gt
+; CHECK-GI-NEXT: ret
%abs = call <1 x i64> @llvm.aarch64.neon.abs.v1i64(<1 x i64> %A)
ret <1 x i64> %abs
}
define i64 @abs_1d_honestly(i64 %A) nounwind {
-; CHECK-LABEL: abs_1d_honestly:
-; CHECK: // %bb.0:
-; CHECK-NEXT: fmov d0, x0
-; CHECK-NEXT: abs d0, d0
-; CHECK-NEXT: fmov x0, d0
-; CHECK-NEXT: ret
+; CHECK-SD-LABEL: abs_1d_honestly:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: fmov d0, x0
+; CHECK-SD-NEXT: abs d0, d0
+; CHECK-SD-NEXT: fmov x0, d0
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: abs_1d_honestly:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: cmp x0, #0
+; CHECK-GI-NEXT: cneg x0, x0, le
+; CHECK-GI-NEXT: ret
%abs = call i64 @llvm.aarch64.neon.abs.i64(i64 %A)
ret i64 %abs
}
More information about the llvm-commits
mailing list