Skip to content

Commit 7d33743

Browse files
committed
[LV] Add tests for narrowing interleave groups with scalable vectors.
1 parent 59b3324 commit 7d33743

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --filter-out-after "^scalar.ph:" --version 5
2+
; RUN: opt -p loop-vectorize -force-vector-interleave=1 -S -mcpu=neoverse-512tvb %s | FileCheck --check-prefixes=CHECK %s
3+
4+
target triple = "aarch64-unknown-linux"
5+
6+
define void @load_store_interleave_group(ptr noalias %data) {
7+
; CHECK-LABEL: define void @load_store_interleave_group(
8+
; CHECK-SAME: ptr noalias [[DATA:%.*]]) #[[ATTR0:[0-9]+]] {
9+
; CHECK-NEXT: [[ENTRY:.*:]]
10+
; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
11+
; CHECK-NEXT: [[TMP5:%.*]] = shl nuw i64 [[TMP4]], 1
12+
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 100, [[TMP5]]
13+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
14+
; CHECK: [[VECTOR_PH]]:
15+
; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
16+
; CHECK-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 2
17+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 100, [[TMP3]]
18+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 100, [[N_MOD_VF]]
19+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
20+
; CHECK: [[VECTOR_BODY]]:
21+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
22+
; CHECK-NEXT: [[TMP0:%.*]] = shl nsw i64 [[INDEX]], 1
23+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP0]]
24+
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <vscale x 4 x i64>, ptr [[TMP1]], align 8
25+
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = call { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave2.nxv4i64(<vscale x 4 x i64> [[WIDE_VEC]])
26+
; CHECK-NEXT: [[TMP6:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[STRIDED_VEC]], 0
27+
; CHECK-NEXT: [[TMP7:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[STRIDED_VEC]], 1
28+
; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = call <vscale x 4 x i64> @llvm.vector.interleave2.nxv4i64(<vscale x 2 x i64> [[TMP6]], <vscale x 2 x i64> [[TMP7]])
29+
; CHECK-NEXT: store <vscale x 4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP1]], align 8
30+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]
31+
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
32+
; CHECK-NEXT: br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
33+
; CHECK: [[MIDDLE_BLOCK]]:
34+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 100, [[N_VEC]]
35+
; CHECK-NEXT: br i1 [[CMP_N]], [[EXIT:label %.*]], label %[[SCALAR_PH]]
36+
; CHECK: [[SCALAR_PH]]:
37+
;
38+
entry:
39+
br label %loop
40+
41+
loop:
42+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
43+
%mul.2 = shl nsw i64 %iv, 1
44+
%data.0 = getelementptr inbounds i64, ptr %data, i64 %mul.2
45+
%l.0 = load i64, ptr %data.0, align 8
46+
store i64 %l.0, ptr %data.0, align 8
47+
%add.1 = or disjoint i64 %mul.2, 1
48+
%data.1 = getelementptr inbounds i64, ptr %data, i64 %add.1
49+
%l.1 = load i64, ptr %data.1, align 8
50+
store i64 %l.1, ptr %data.1, align 8
51+
%iv.next = add nuw nsw i64 %iv, 1
52+
%ec = icmp eq i64 %iv.next, 100
53+
br i1 %ec, label %exit, label %loop
54+
55+
exit:
56+
ret void
57+
}
58+
59+
define void @test_2xi64_unary_op_load_interleave_group(ptr noalias %data, ptr noalias %factor) {
60+
; CHECK-LABEL: define void @test_2xi64_unary_op_load_interleave_group(
61+
; CHECK-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) #[[ATTR0]] {
62+
; CHECK-NEXT: [[ENTRY:.*:]]
63+
; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
64+
; CHECK-NEXT: [[TMP5:%.*]] = shl nuw i64 [[TMP4]], 1
65+
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 1111, [[TMP5]]
66+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
67+
; CHECK: [[VECTOR_PH]]:
68+
; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
69+
; CHECK-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 2
70+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 1111, [[TMP3]]
71+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 1111, [[N_MOD_VF]]
72+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
73+
; CHECK: [[VECTOR_BODY]]:
74+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
75+
; CHECK-NEXT: [[TMP0:%.*]] = shl nsw i64 [[INDEX]], 1
76+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds double, ptr [[DATA]], i64 [[TMP0]]
77+
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <vscale x 4 x double>, ptr [[TMP1]], align 8
78+
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> [[WIDE_VEC]])
79+
; CHECK-NEXT: [[TMP6:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[STRIDED_VEC]], 0
80+
; CHECK-NEXT: [[TMP7:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[STRIDED_VEC]], 1
81+
; CHECK-NEXT: [[TMP8:%.*]] = fneg <vscale x 2 x double> [[TMP6]]
82+
; CHECK-NEXT: [[TMP9:%.*]] = fneg <vscale x 2 x double> [[TMP7]]
83+
; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> [[TMP8]], <vscale x 2 x double> [[TMP9]])
84+
; CHECK-NEXT: store <vscale x 4 x double> [[INTERLEAVED_VEC]], ptr [[TMP1]], align 8
85+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]
86+
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
87+
; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
88+
; CHECK: [[MIDDLE_BLOCK]]:
89+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 1111, [[N_VEC]]
90+
; CHECK-NEXT: br i1 [[CMP_N]], [[EXIT:label %.*]], label %[[SCALAR_PH]]
91+
; CHECK: [[SCALAR_PH]]:
92+
;
93+
entry:
94+
br label %loop
95+
96+
loop:
97+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
98+
%1 = shl nsw i64 %iv, 1
99+
%data.0 = getelementptr inbounds double, ptr %data, i64 %1
100+
%l.0 = load double, ptr %data.0, align 8
101+
%neg.0 = fneg double %l.0
102+
store double %neg.0, ptr %data.0, align 8
103+
%3 = or disjoint i64 %1, 1
104+
%data.1 = getelementptr inbounds double, ptr %data, i64 %3
105+
%l.1 = load double, ptr %data.1, align 8
106+
%neg.1 = fneg double %l.1
107+
store double %neg.1, ptr %data.1, align 8
108+
%iv.next = add nuw nsw i64 %iv, 1
109+
%ec = icmp eq i64 %iv.next, 1111
110+
br i1 %ec, label %exit, label %loop
111+
112+
exit:
113+
ret void
114+
}

0 commit comments

Comments
 (0)