Skip to content

Commit 83ae171

Browse files
authored
[AArch64] Add ComputeNumSignBits for VASHR. (llvm#113957)
As with a normal ISD::SRA node, they take the number of sign bits of the incoming value and increase it by the shifted amount.
1 parent 94e7d9c commit 83ae171

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2536,6 +2536,11 @@ unsigned AArch64TargetLowering::ComputeNumSignBitsForTargetNode(
25362536
case AArch64ISD::FCMLTz:
25372537
// Compares return either 0 or all-ones
25382538
return VTBits;
2539+
case AArch64ISD::VASHR: {
2540+
unsigned Tmp =
2541+
DAG.ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
2542+
return std::min<uint64_t>(Tmp + Op.getConstantOperandVal(1), VTBits);
2543+
}
25392544
}
25402545

25412546
return 1;

llvm/test/CodeGen/AArch64/arm64-vshift.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3560,4 +3560,16 @@ entry:
35603560
ret <4 x i16> %vrshrn_n1
35613561
}
35623562

3563+
define <8 x i16> @signbits_vashr(<8 x i16> %a) {
3564+
; CHECK-LABEL: signbits_vashr:
3565+
; CHECK: // %bb.0:
3566+
; CHECK-NEXT: sshr.8h v0, v0, #8
3567+
; CHECK-NEXT: sshr.8h v0, v0, #9
3568+
; CHECK-NEXT: ret
3569+
%b = call <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16> %a, <8 x i16> <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>)
3570+
%c = call <8 x i16> @llvm.aarch64.neon.sshl.v8i16(<8 x i16> %b, <8 x i16> <i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9>)
3571+
%d = ashr <8 x i16> %c, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
3572+
ret <8 x i16> %d
3573+
}
3574+
35633575
declare <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64>, <2 x i64>)

llvm/unittests/CodeGen/AArch64SelectionDAGTest.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "../lib/Target/AArch64/AArch64ISelLowering.h"
910
#include "llvm/Analysis/MemoryLocation.h"
1011
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
1112
#include "llvm/AsmParser/Parser.h"
@@ -167,6 +168,18 @@ TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_EXTRACT_SUBVECTOR) {
167168
EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 7u);
168169
}
169170

171+
TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_VASHR) {
172+
SDLoc Loc;
173+
auto VecVT = MVT::v8i8;
174+
auto Shift = DAG->getConstant(4, Loc, MVT::i32);
175+
auto Vec0 = DAG->getConstant(1, Loc, VecVT);
176+
auto Op1 = DAG->getNode(AArch64ISD::VASHR, Loc, VecVT, Vec0, Shift);
177+
EXPECT_EQ(DAG->ComputeNumSignBits(Op1), 8u);
178+
auto VecA = DAG->getConstant(0xaa, Loc, VecVT);
179+
auto Op2 = DAG->getNode(AArch64ISD::VASHR, Loc, VecVT, VecA, Shift);
180+
EXPECT_EQ(DAG->ComputeNumSignBits(Op2), 5u);
181+
}
182+
170183
TEST_F(AArch64SelectionDAGTest, SimplifyDemandedVectorElts_EXTRACT_SUBVECTOR) {
171184
TargetLowering TL(*TM);
172185

0 commit comments

Comments
 (0)