Skip to content

Commit 32572df

Browse files
committed
[DAGCombiner] Forward vector store to vector load with extract_subvector
Loading a smaller fixed vector type from a stored larger fixed vector type can be substituted with an extract_subvector, provided the smaller type entirely contained in the larger type, and an extract_element would be legal for the given offset.
1 parent 3568e78 commit 32572df

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19913,6 +19913,27 @@ SDValue DAGCombiner::ForwardStoreValueToDirectLoad(LoadSDNode *LD) {
1991319913
}
1991419914
}
1991519915

19916+
// Loading a smaller fixed vector type from a stored larger fixed vector type
19917+
// can be substituted with an extract_subvector, provided the smaller type
19918+
// entirely contained in the larger type, and an extract_element would be
19919+
// legal for the given offset.
19920+
if (TLI.isOperationLegalOrCustom(ISD::EXTRACT_SUBVECTOR, LDType) &&
19921+
LDType.isFixedLengthVector() && STType.isFixedLengthVector() &&
19922+
!ST->isTruncatingStore() && LD->getExtensionType() == ISD::NON_EXTLOAD &&
19923+
LDType.getVectorElementType() == STType.getVectorElementType() &&
19924+
(Offset * 8 + LDType.getFixedSizeInBits() <=
19925+
STType.getFixedSizeInBits()) &&
19926+
(Offset % LDType.getScalarStoreSize() == 0)) {
19927+
unsigned EltOffset = Offset / LDType.getScalarStoreSize();
19928+
// The extract index must be a multiple of the result's element count.
19929+
if (EltOffset % LDType.getVectorElementCount().getFixedValue() == 0) {
19930+
SDLoc DL(LD);
19931+
SDValue VecIdx = DAG.getVectorIdxConstant(EltOffset, DL);
19932+
Val = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, LDType, Val, VecIdx);
19933+
return ReplaceLd(LD, Val, Chain);
19934+
}
19935+
}
19936+
1991619937
// TODO: Deal with nonzero offset.
1991719938
if (LD->getBasePtr().isUndef() || Offset != 0)
1991819939
return SDValue();

llvm/test/CodeGen/RISCV/forward-vec-store.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44
define void @forward_store(<32 x half> %halves, ptr %p, ptr %p2, ptr %p3, ptr %p4) {
55
; CHECK-LABEL: forward_store:
66
; CHECK: # %bb.0:
7-
; CHECK-NEXT: addi a4, a0, 16
8-
; CHECK-NEXT: li a5, 32
9-
; CHECK-NEXT: vsetvli zero, a5, e16, m4, ta, ma
7+
; CHECK-NEXT: li a4, 32
8+
; CHECK-NEXT: vsetivli zero, 8, e16, m2, ta, ma
9+
; CHECK-NEXT: vslidedown.vi v16, v8, 8
10+
; CHECK-NEXT: vsetivli zero, 8, e16, m4, ta, ma
11+
; CHECK-NEXT: vslidedown.vi v12, v8, 16
12+
; CHECK-NEXT: vsetvli zero, a4, e16, m4, ta, ma
1013
; CHECK-NEXT: vse16.v v8, (a0)
11-
; CHECK-NEXT: addi a5, a0, 32
12-
; CHECK-NEXT: addi a0, a0, 48
14+
; CHECK-NEXT: vsetivli zero, 8, e16, m4, ta, ma
15+
; CHECK-NEXT: vslidedown.vi v8, v8, 24
1316
; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
14-
; CHECK-NEXT: vle16.v v8, (a4)
15-
; CHECK-NEXT: vle16.v v9, (a5)
16-
; CHECK-NEXT: vle16.v v10, (a0)
17-
; CHECK-NEXT: vse16.v v8, (a1)
18-
; CHECK-NEXT: vse16.v v9, (a2)
19-
; CHECK-NEXT: vse16.v v10, (a3)
17+
; CHECK-NEXT: vse16.v v16, (a1)
18+
; CHECK-NEXT: vse16.v v12, (a2)
19+
; CHECK-NEXT: vse16.v v8, (a3)
2020
; CHECK-NEXT: ret
2121
store <32 x half> %halves, ptr %p, align 256
2222
%gep1 = getelementptr inbounds nuw i8, ptr %p, i32 16

0 commit comments

Comments
 (0)