Skip to content

Commit 0c629ce

Browse files
committed
Addressed comments
1 parent 05d75c2 commit 0c629ce

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,9 +1445,6 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
14451445
setLoadExtAction(ISD::EXTLOAD, MVT::v2i64, MVT::v2i16, Custom);
14461446
setLoadExtAction(ISD::SEXTLOAD, MVT::v2i64, MVT::v2i16, Custom);
14471447
setLoadExtAction(ISD::ZEXTLOAD, MVT::v2i64, MVT::v2i16, Custom);
1448-
setLoadExtAction(ISD::EXTLOAD, MVT::v4i32, MVT::v4i16, Custom);
1449-
setLoadExtAction(ISD::SEXTLOAD, MVT::v4i32, MVT::v4i16, Custom);
1450-
setLoadExtAction(ISD::ZEXTLOAD, MVT::v4i32, MVT::v4i16, Custom);
14511448

14521449
// ADDP custom lowering
14531450
for (MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 })
@@ -6752,8 +6749,7 @@ static bool isEligibleForSmallVectorLoadOpt(LoadSDNode *LD,
67526749
return false;
67536750

67546751
EVT MemVT = LD->getMemoryVT();
6755-
if (MemVT != MVT::v2i8 && MemVT != MVT::v4i8 && MemVT != MVT::v2i16 &&
6756-
MemVT != MVT::v4i16)
6752+
if (MemVT != MVT::v2i8 && MemVT != MVT::v4i8 && MemVT != MVT::v2i16)
67576753
return false;
67586754

67596755
Align Alignment = LD->getAlign();
@@ -7232,8 +7228,7 @@ SDValue AArch64TargetLowering::LowerStore128(SDValue Op,
72327228

72337229
/// Helper function to optimize loads of extended small vectors.
72347230
/// These patterns would otherwise get scalarized into inefficient sequences.
7235-
static SDValue performSmallVectorLoadExtCombine(LoadSDNode *Load,
7236-
SelectionDAG &DAG) {
7231+
static SDValue tryLowerSmallVectorExtLoad(LoadSDNode *Load, SelectionDAG &DAG) {
72377232
const AArch64Subtarget &Subtarget = DAG.getSubtarget<AArch64Subtarget>();
72387233
if (!isEligibleForSmallVectorLoadOpt(Load, Subtarget))
72397234
return SDValue();
@@ -7308,10 +7303,8 @@ SDValue AArch64TargetLowering::LowerLOAD(SDValue Op,
73087303
LoadSDNode *LoadNode = cast<LoadSDNode>(Op);
73097304
assert(LoadNode && "Expected custom lowering of a load node");
73107305

7311-
if (LoadNode->getExtensionType() != ISD::NON_EXTLOAD) {
7312-
if (SDValue Result = performSmallVectorLoadExtCombine(LoadNode, DAG))
7313-
return Result;
7314-
}
7306+
if (SDValue Result = tryLowerSmallVectorExtLoad(LoadNode, DAG))
7307+
return Result;
73157308

73167309
if (LoadNode->getMemoryVT() == MVT::i64x8) {
73177310
SmallVector<SDValue, 8> Ops;

llvm/test/CodeGen/AArch64/aarch64-load-ext.ll

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,25 @@ define <2 x i64> @zext_v2i16_v2i64(ptr %a) {
604604
ret <2 x i64> %y
605605
}
606606

607+
define <4 x i32> @zext_v4i16_v4i32(ptr %a) {
608+
; CHECK-LE-LABEL: zext_v4i16_v4i32:
609+
; CHECK-LE: // %bb.0:
610+
; CHECK-LE-NEXT: ldr d0, [x0]
611+
; CHECK-LE-NEXT: ushll v0.4s, v0.4h, #0
612+
; CHECK-LE-NEXT: ret
613+
;
614+
; CHECK-BE-LABEL: zext_v4i16_v4i32:
615+
; CHECK-BE: // %bb.0:
616+
; CHECK-BE-NEXT: ld1 { v0.4h }, [x0]
617+
; CHECK-BE-NEXT: ushll v0.4s, v0.4h, #0
618+
; CHECK-BE-NEXT: rev64 v0.4s, v0.4s
619+
; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
620+
; CHECK-BE-NEXT: ret
621+
%x = load <4 x i16>, ptr %a
622+
%y = zext <4 x i16> %x to <4 x i32>
623+
ret <4 x i32> %y
624+
}
625+
607626
define <2 x i64> @sext_v2i8_v2i64(ptr %a) {
608627
; CHECK-LE-LABEL: sext_v2i8_v2i64:
609628
; CHECK-LE: // %bb.0:
@@ -667,3 +686,22 @@ define <2 x i64> @sext_v2i16_v2i64(ptr %a) {
667686
%y = sext <2 x i16> %x to <2 x i64>
668687
ret <2 x i64> %y
669688
}
689+
690+
define <4 x i32> @sext_v4i16_v4i32(ptr %a) {
691+
; CHECK-LE-LABEL: sext_v4i16_v4i32:
692+
; CHECK-LE: // %bb.0:
693+
; CHECK-LE-NEXT: ldr d0, [x0]
694+
; CHECK-LE-NEXT: sshll v0.4s, v0.4h, #0
695+
; CHECK-LE-NEXT: ret
696+
;
697+
; CHECK-BE-LABEL: sext_v4i16_v4i32:
698+
; CHECK-BE: // %bb.0:
699+
; CHECK-BE-NEXT: ld1 { v0.4h }, [x0]
700+
; CHECK-BE-NEXT: sshll v0.4s, v0.4h, #0
701+
; CHECK-BE-NEXT: rev64 v0.4s, v0.4s
702+
; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
703+
; CHECK-BE-NEXT: ret
704+
%x = load <4 x i16>, ptr %a
705+
%y = sext <4 x i16> %x to <4 x i32>
706+
ret <4 x i32> %y
707+
}

llvm/test/CodeGen/AArch64/sve-fixed-length-ext-loads.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ target triple = "aarch64-unknown-linux-gnu"
77
define <4 x i32> @load_zext_v4i16i32(ptr %ap) vscale_range(2,0) #0 {
88
; CHECK-LABEL: load_zext_v4i16i32:
99
; CHECK: // %bb.0:
10-
; CHECK-NEXT: ldr d0, [x0]
10+
; CHECK-NEXT: ldp s0, s1, [x0]
1111
; CHECK-NEXT: ushll v0.4s, v0.4h, #0
12+
; CHECK-NEXT: ushll v1.4s, v1.4h, #0
13+
; CHECK-NEXT: mov v0.d[1], v1.d[0]
1214
; CHECK-NEXT: ret
1315
%a = load <4 x i16>, ptr %ap
1416
%val = zext <4 x i16> %a to <4 x i32>
@@ -97,8 +99,10 @@ define void @load_zext_v64i16i32(ptr %ap, ptr %b) #0 {
9799
define <4 x i32> @load_sext_v4i16i32(ptr %ap) vscale_range(2,0) #0 {
98100
; CHECK-LABEL: load_sext_v4i16i32:
99101
; CHECK: // %bb.0:
100-
; CHECK-NEXT: ldr d0, [x0]
102+
; CHECK-NEXT: ldp s0, s1, [x0]
101103
; CHECK-NEXT: sshll v0.4s, v0.4h, #0
104+
; CHECK-NEXT: sshll v1.4s, v1.4h, #0
105+
; CHECK-NEXT: mov v0.d[1], v1.d[0]
102106
; CHECK-NEXT: ret
103107
%a = load <4 x i16>, ptr %ap
104108
%val = sext <4 x i16> %a to <4 x i32>

0 commit comments

Comments
 (0)