[llvm] [AArch64] Improve the codegen for sdiv 2 (PR #98324)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 11 03:56:42 PDT 2024
https://github.com/vfdff updated https://github.com/llvm/llvm-project/pull/98324
>From 5f26a9ece0c815b2be2d41d93004c3946203aead Mon Sep 17 00:00:00 2001
From: zhongyunde 00443407 <zhongyunde at huawei.com>
Date: Sat, 6 Jul 2024 04:54:11 -0400
Subject: [PATCH] [AArch64] Improve the codegen for sdiv 2
Similar to X86, if X's size is BitWidth, then X sdiv 2 can be expressived as
```
X += X >> (BitWidth - 1)
X = X >> 1
```
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 6 ++++++
llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll | 3 +--
llvm/test/CodeGen/AArch64/sdivpow2.ll | 9 +++------
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index e5d5c6b6832af..bdea14e556cfd 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -17747,6 +17747,12 @@ AArch64TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
!(Divisor.isPowerOf2() || Divisor.isNegatedPowerOf2()))
return SDValue();
+ // If the divisor is 2 or -2, the default expansion is better. It will add
+ // (N->getValueType(0) >> (BitWidth - 1)) to it before shifting right.
+ if (Divisor == 2 ||
+ Divisor == APInt(Divisor.getBitWidth(), -2, /*isSigned*/ true))
+ return SDValue();
+
return TargetLowering::buildSDIVPow2WithCMov(N, Divisor, DAG, Created);
}
diff --git a/llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll b/llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll
index 3a17a95ed71da..6431cfc58a54d 100644
--- a/llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll
+++ b/llvm/test/CodeGen/AArch64/aarch64-bit-gen.ll
@@ -202,9 +202,8 @@ define <4 x i32> @test_bit_sink_operand(<4 x i32> %src, <4 x i32> %dst, <4 x i32
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: sub sp, sp, #32
; CHECK-SD-NEXT: .cfi_def_cfa_offset 32
-; CHECK-SD-NEXT: cmp w0, #0
+; CHECK-SD-NEXT: add w8, w0, w0, lsr #31
; CHECK-SD-NEXT: mov w9, wzr
-; CHECK-SD-NEXT: cinc w8, w0, lt
; CHECK-SD-NEXT: asr w8, w8, #1
; CHECK-SD-NEXT: .LBB11_1: // %do.body
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
diff --git a/llvm/test/CodeGen/AArch64/sdivpow2.ll b/llvm/test/CodeGen/AArch64/sdivpow2.ll
index 4619534151814..2551be8555ce6 100644
--- a/llvm/test/CodeGen/AArch64/sdivpow2.ll
+++ b/llvm/test/CodeGen/AArch64/sdivpow2.ll
@@ -90,8 +90,7 @@ define i64 @test7(i64 %x) {
define i64 @test8(i64 %x) {
; ISEL-LABEL: test8:
; ISEL: // %bb.0:
-; ISEL-NEXT: cmp x0, #0
-; ISEL-NEXT: cinc x8, x0, lt
+; ISEL-NEXT: add x8, x0, x0, lsr #63
; ISEL-NEXT: asr x0, x8, #1
; ISEL-NEXT: ret
;
@@ -110,10 +109,8 @@ define i32 @sdiv_int(i32 %begin, i32 %first) #0 {
; ISEL-LABEL: sdiv_int:
; ISEL: // %bb.0:
; ISEL-NEXT: sub w8, w0, w1
-; ISEL-NEXT: add w9, w8, #1
-; ISEL-NEXT: add w10, w8, #2
-; ISEL-NEXT: cmp w9, #0
-; ISEL-NEXT: csinc w8, w10, w8, lt
+; ISEL-NEXT: add w8, w8, #1
+; ISEL-NEXT: add w8, w8, w8, lsr #31
; ISEL-NEXT: sub w0, w0, w8, asr #1
; ISEL-NEXT: ret
;
More information about the llvm-commits
mailing list