Skip to content

Commit 8178de3

Browse files
committed
[AArch64] Change the type of i64 neon shifts to v1i64
This alters the lowering of shifts by a constant, so that the type is lowered to a v1i64 instead of a i64. This helps communicate that the type will live in a neon register, and can help clean up surrounding code. Note this is only currently for the scalar shifts of a constant that go through the nodes in tryCombineShiftImm. ssra instructions are no longer being recognized in places, but that can be cleaned up in a followup patch that combines the i64 add into a v1i64 add. Differential Revision: https://reviews.llvm.org/D148309
1 parent a7752e8 commit 8178de3

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18384,14 +18384,28 @@ static SDValue tryCombineShiftImm(unsigned IID, SDNode *N, SelectionDAG &DAG) {
1838418384
break;
1838518385
}
1838618386

18387+
EVT VT = N->getValueType(0);
18388+
SDValue Op = N->getOperand(1);
18389+
SDLoc dl(N);
18390+
if (VT == MVT::i64) {
18391+
Op = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v1i64, Op);
18392+
VT = MVT::v1i64;
18393+
}
18394+
1838718395
if (IsRightShift && ShiftAmount <= -1 && ShiftAmount >= -(int)ElemBits) {
18388-
SDLoc dl(N);
18389-
return DAG.getNode(Opcode, dl, N->getValueType(0), N->getOperand(1),
18390-
DAG.getConstant(-ShiftAmount, dl, MVT::i32));
18396+
Op = DAG.getNode(Opcode, dl, VT, Op,
18397+
DAG.getConstant(-ShiftAmount, dl, MVT::i32));
18398+
if (N->getValueType(0) == MVT::i64)
18399+
Op = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, Op,
18400+
DAG.getConstant(0, dl, MVT::i64));
18401+
return Op;
1839118402
} else if (!IsRightShift && ShiftAmount >= 0 && ShiftAmount < ElemBits) {
18392-
SDLoc dl(N);
18393-
return DAG.getNode(Opcode, dl, N->getValueType(0), N->getOperand(1),
18394-
DAG.getConstant(ShiftAmount, dl, MVT::i32));
18403+
Op = DAG.getNode(Opcode, dl, VT, Op,
18404+
DAG.getConstant(ShiftAmount, dl, MVT::i32));
18405+
if (N->getValueType(0) == MVT::i64)
18406+
Op = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64, Op,
18407+
DAG.getConstant(0, dl, MVT::i64));
18408+
return Op;
1839518409
}
1839618410

1839718411
return SDValue();

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ define i64 @sqshl_scalar(ptr %A, ptr %B) nounwind {
8383
define i64 @sqshl_scalar_constant(ptr %A) nounwind {
8484
; CHECK-LABEL: sqshl_scalar_constant:
8585
; CHECK: // %bb.0:
86-
; CHECK-NEXT: ldr x8, [x0]
87-
; CHECK-NEXT: fmov d0, x8
86+
; CHECK-NEXT: ldr d0, [x0]
8887
; CHECK-NEXT: sqshl d0, d0, #1
8988
; CHECK-NEXT: fmov x0, d0
9089
; CHECK-NEXT: ret
@@ -279,8 +278,7 @@ define i64 @uqshl_scalar(ptr %A, ptr %B) nounwind {
279278
define i64 @uqshl_scalar_constant(ptr %A) nounwind {
280279
; CHECK-LABEL: uqshl_scalar_constant:
281280
; CHECK: // %bb.0:
282-
; CHECK-NEXT: ldr x8, [x0]
283-
; CHECK-NEXT: fmov d0, x8
281+
; CHECK-NEXT: ldr d0, [x0]
284282
; CHECK-NEXT: uqshl d0, d0, #1
285283
; CHECK-NEXT: fmov x0, d0
286284
; CHECK-NEXT: ret
@@ -1039,8 +1037,7 @@ define <1 x i64> @urshr1d(ptr %A) nounwind {
10391037
define i64 @urshr_scalar(ptr %A) nounwind {
10401038
; CHECK-LABEL: urshr_scalar:
10411039
; CHECK: // %bb.0:
1042-
; CHECK-NEXT: ldr x8, [x0]
1043-
; CHECK-NEXT: fmov d0, x8
1040+
; CHECK-NEXT: ldr d0, [x0]
10441041
; CHECK-NEXT: urshr d0, d0, #1
10451042
; CHECK-NEXT: fmov x0, d0
10461043
; CHECK-NEXT: ret
@@ -1140,8 +1137,7 @@ define <1 x i64> @srshr1d(ptr %A) nounwind {
11401137
define i64 @srshr_scalar(ptr %A) nounwind {
11411138
; CHECK-LABEL: srshr_scalar:
11421139
; CHECK: // %bb.0:
1143-
; CHECK-NEXT: ldr x8, [x0]
1144-
; CHECK-NEXT: fmov d0, x8
1140+
; CHECK-NEXT: ldr d0, [x0]
11451141
; CHECK-NEXT: srshr d0, d0, #1
11461142
; CHECK-NEXT: fmov x0, d0
11471143
; CHECK-NEXT: ret
@@ -1241,8 +1237,7 @@ define <1 x i64> @sqshlu1d_constant(ptr %A) nounwind {
12411237
define i64 @sqshlu_i64_constant(ptr %A) nounwind {
12421238
; CHECK-LABEL: sqshlu_i64_constant:
12431239
; CHECK: // %bb.0:
1244-
; CHECK-NEXT: ldr x8, [x0]
1245-
; CHECK-NEXT: fmov d0, x8
1240+
; CHECK-NEXT: ldr d0, [x0]
12461241
; CHECK-NEXT: sqshlu d0, d0, #1
12471242
; CHECK-NEXT: fmov x0, d0
12481243
; CHECK-NEXT: ret
@@ -2737,12 +2732,11 @@ define <1 x i64> @ursra1d(ptr %A, ptr %B) nounwind {
27372732
define i64 @ursra_scalar(ptr %A, ptr %B) nounwind {
27382733
; CHECK-LABEL: ursra_scalar:
27392734
; CHECK: // %bb.0:
2740-
; CHECK-NEXT: ldr x8, [x0]
2735+
; CHECK-NEXT: ldr d0, [x0]
27412736
; CHECK-NEXT: ldr x9, [x1]
2742-
; CHECK-NEXT: fmov d1, x8
2743-
; CHECK-NEXT: fmov d0, x9
2744-
; CHECK-NEXT: ursra d0, d1, #1
2745-
; CHECK-NEXT: fmov x0, d0
2737+
; CHECK-NEXT: urshr d0, d0, #1
2738+
; CHECK-NEXT: fmov x8, d0
2739+
; CHECK-NEXT: add x0, x8, x9
27462740
; CHECK-NEXT: ret
27472741
%tmp1 = load i64, ptr %A
27482742
%tmp3 = call i64 @llvm.aarch64.neon.urshl.i64(i64 %tmp1, i64 -1)
@@ -2866,12 +2860,11 @@ define <1 x i64> @srsra1d(ptr %A, ptr %B) nounwind {
28662860
define i64 @srsra_scalar(ptr %A, ptr %B) nounwind {
28672861
; CHECK-LABEL: srsra_scalar:
28682862
; CHECK: // %bb.0:
2869-
; CHECK-NEXT: ldr x8, [x0]
2863+
; CHECK-NEXT: ldr d0, [x0]
28702864
; CHECK-NEXT: ldr x9, [x1]
2871-
; CHECK-NEXT: fmov d1, x8
2872-
; CHECK-NEXT: fmov d0, x9
2873-
; CHECK-NEXT: srsra d0, d1, #1
2874-
; CHECK-NEXT: fmov x0, d0
2865+
; CHECK-NEXT: srshr d0, d0, #1
2866+
; CHECK-NEXT: fmov x8, d0
2867+
; CHECK-NEXT: add x0, x8, x9
28752868
; CHECK-NEXT: ret
28762869
%tmp1 = load i64, ptr %A
28772870
%tmp3 = call i64 @llvm.aarch64.neon.srshl.i64(i64 %tmp1, i64 -1)

0 commit comments

Comments
 (0)