Skip to content

Commit 3731bbc

Browse files
committed
[SLP]Add a test for geps with non-const indeces in scatter vectorize
nodes, NFC.
1 parent c39fdc8 commit 3731bbc

File tree

1 file changed

+185
-0
lines changed

1 file changed

+185
-0
lines changed
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake-avx512 | FileCheck %s
3+
4+
define void @test(i32* noalias %p, i32* noalias %addr, i32* noalias %s) {
5+
; CHECK-LABEL: @test(
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: [[IDX1:%.*]] = load i32, i32* [[ADDR:%.*]], align 8
8+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i32 [[IDX1]]
9+
; CHECK-NEXT: [[I:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
10+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 1
11+
; CHECK-NEXT: [[IDX2:%.*]] = load i32, i32* [[GEP2]], align 8
12+
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX2]]
13+
; CHECK-NEXT: [[I1:%.*]] = load i32, i32* [[ARRAYIDX1]], align 4
14+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[I1]], [[I]]
15+
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, i32* [[S:%.*]], i32 0
16+
; CHECK-NEXT: store i32 [[ADD]], i32* [[ARRAYIDX2]], align 4
17+
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 2
18+
; CHECK-NEXT: [[IDX3:%.*]] = load i32, i32* [[GEP3]], align 8
19+
; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX3]]
20+
; CHECK-NEXT: [[I2:%.*]] = load i32, i32* [[ARRAYIDX4]], align 4
21+
; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 3
22+
; CHECK-NEXT: [[IDX4:%.*]] = load i32, i32* [[GEP4]], align 8
23+
; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX4]]
24+
; CHECK-NEXT: [[I3:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4
25+
; CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[I3]], [[I2]]
26+
; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 1
27+
; CHECK-NEXT: store i32 [[ADD7]], i32* [[ARRAYIDX9]], align 4
28+
; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 4
29+
; CHECK-NEXT: [[IDX5:%.*]] = load i32, i32* [[GEP5]], align 8
30+
; CHECK-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX5]]
31+
; CHECK-NEXT: [[I4:%.*]] = load i32, i32* [[ARRAYIDX11]], align 4
32+
; CHECK-NEXT: [[GEP6:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 5
33+
; CHECK-NEXT: [[IDX6:%.*]] = load i32, i32* [[GEP6]], align 8
34+
; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX6]]
35+
; CHECK-NEXT: [[I5:%.*]] = load i32, i32* [[ARRAYIDX13]], align 4
36+
; CHECK-NEXT: [[ADD14:%.*]] = add nsw i32 [[I5]], [[I4]]
37+
; CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 2
38+
; CHECK-NEXT: store i32 [[ADD14]], i32* [[ARRAYIDX16]], align 4
39+
; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 6
40+
; CHECK-NEXT: [[IDX7:%.*]] = load i32, i32* [[GEP7]], align 8
41+
; CHECK-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX7]]
42+
; CHECK-NEXT: [[I6:%.*]] = load i32, i32* [[ARRAYIDX18]], align 4
43+
; CHECK-NEXT: [[GEP8:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 7
44+
; CHECK-NEXT: [[IDX8:%.*]] = load i32, i32* [[GEP8]], align 8
45+
; CHECK-NEXT: [[ARRAYIDX20:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX8]]
46+
; CHECK-NEXT: [[I7:%.*]] = load i32, i32* [[ARRAYIDX20]], align 4
47+
; CHECK-NEXT: [[ADD21:%.*]] = add nsw i32 [[I7]], [[I6]]
48+
; CHECK-NEXT: [[ARRAYIDX23:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 3
49+
; CHECK-NEXT: store i32 [[ADD21]], i32* [[ARRAYIDX23]], align 4
50+
; CHECK-NEXT: [[GEP9:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 8
51+
; CHECK-NEXT: [[IDX9:%.*]] = load i32, i32* [[GEP9]], align 8
52+
; CHECK-NEXT: [[ARRAYIDX25:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX9]]
53+
; CHECK-NEXT: [[I8:%.*]] = load i32, i32* [[ARRAYIDX25]], align 4
54+
; CHECK-NEXT: [[GEP10:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 9
55+
; CHECK-NEXT: [[IDX10:%.*]] = load i32, i32* [[GEP10]], align 8
56+
; CHECK-NEXT: [[ARRAYIDX27:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX10]]
57+
; CHECK-NEXT: [[I9:%.*]] = load i32, i32* [[ARRAYIDX27]], align 4
58+
; CHECK-NEXT: [[ADD28:%.*]] = add nsw i32 [[I9]], [[I8]]
59+
; CHECK-NEXT: [[ARRAYIDX30:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 4
60+
; CHECK-NEXT: store i32 [[ADD28]], i32* [[ARRAYIDX30]], align 4
61+
; CHECK-NEXT: [[GEP11:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 10
62+
; CHECK-NEXT: [[IDX11:%.*]] = load i32, i32* [[GEP11]], align 8
63+
; CHECK-NEXT: [[ARRAYIDX32:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX11]]
64+
; CHECK-NEXT: [[I10:%.*]] = load i32, i32* [[ARRAYIDX32]], align 4
65+
; CHECK-NEXT: [[GEP12:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 11
66+
; CHECK-NEXT: [[IDX12:%.*]] = load i32, i32* [[GEP12]], align 8
67+
; CHECK-NEXT: [[ARRAYIDX34:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX12]]
68+
; CHECK-NEXT: [[I11:%.*]] = load i32, i32* [[ARRAYIDX34]], align 4
69+
; CHECK-NEXT: [[ADD35:%.*]] = add nsw i32 [[I11]], [[I10]]
70+
; CHECK-NEXT: [[ARRAYIDX37:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 5
71+
; CHECK-NEXT: store i32 [[ADD35]], i32* [[ARRAYIDX37]], align 4
72+
; CHECK-NEXT: [[GEP13:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 12
73+
; CHECK-NEXT: [[IDX13:%.*]] = load i32, i32* [[GEP13]], align 8
74+
; CHECK-NEXT: [[ARRAYIDX39:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX13]]
75+
; CHECK-NEXT: [[I12:%.*]] = load i32, i32* [[ARRAYIDX39]], align 4
76+
; CHECK-NEXT: [[GEP14:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 13
77+
; CHECK-NEXT: [[IDX14:%.*]] = load i32, i32* [[GEP14]], align 8
78+
; CHECK-NEXT: [[ARRAYIDX41:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX14]]
79+
; CHECK-NEXT: [[I13:%.*]] = load i32, i32* [[ARRAYIDX41]], align 4
80+
; CHECK-NEXT: [[ADD42:%.*]] = add nsw i32 [[I13]], [[I12]]
81+
; CHECK-NEXT: [[ARRAYIDX44:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 6
82+
; CHECK-NEXT: store i32 [[ADD42]], i32* [[ARRAYIDX44]], align 4
83+
; CHECK-NEXT: [[GEP15:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 14
84+
; CHECK-NEXT: [[IDX15:%.*]] = load i32, i32* [[GEP15]], align 8
85+
; CHECK-NEXT: [[ARRAYIDX46:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX15]]
86+
; CHECK-NEXT: [[I14:%.*]] = load i32, i32* [[ARRAYIDX46]], align 4
87+
; CHECK-NEXT: [[GEP16:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 15
88+
; CHECK-NEXT: [[IDX16:%.*]] = load i32, i32* [[GEP16]], align 8
89+
; CHECK-NEXT: [[ARRAYIDX48:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX16]]
90+
; CHECK-NEXT: [[I15:%.*]] = load i32, i32* [[ARRAYIDX48]], align 4
91+
; CHECK-NEXT: [[ADD49:%.*]] = add nsw i32 [[I15]], [[I14]]
92+
; CHECK-NEXT: [[ARRAYIDX51:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 7
93+
; CHECK-NEXT: store i32 [[ADD49]], i32* [[ARRAYIDX51]], align 4
94+
; CHECK-NEXT: ret void
95+
;
96+
entry:
97+
%idx1 = load i32, i32 *%addr, align 8
98+
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %idx1
99+
%i = load i32, i32* %arrayidx, align 4
100+
%gep2 = getelementptr inbounds i32, i32* %addr, i32 1
101+
%idx2 = load i32, i32 *%gep2, align 8
102+
%arrayidx1 = getelementptr inbounds i32, i32* %p, i32 %idx2
103+
%i1 = load i32, i32* %arrayidx1, align 4
104+
%add = add nsw i32 %i1, %i
105+
%arrayidx2 = getelementptr inbounds i32, i32* %s, i32 0
106+
store i32 %add, i32* %arrayidx2, align 4
107+
%gep3 = getelementptr inbounds i32, i32* %addr, i32 2
108+
%idx3 = load i32, i32 *%gep3, align 8
109+
%arrayidx4 = getelementptr inbounds i32, i32* %p, i32 %idx3
110+
%i2 = load i32, i32* %arrayidx4, align 4
111+
%gep4 = getelementptr inbounds i32, i32* %addr, i32 3
112+
%idx4 = load i32, i32 *%gep4, align 8
113+
%arrayidx6 = getelementptr inbounds i32, i32* %p, i32 %idx4
114+
%i3 = load i32, i32* %arrayidx6, align 4
115+
%add7 = add nsw i32 %i3, %i2
116+
%arrayidx9 = getelementptr inbounds i32, i32* %s, i32 1
117+
store i32 %add7, i32* %arrayidx9, align 4
118+
%gep5 = getelementptr inbounds i32, i32* %addr, i32 4
119+
%idx5 = load i32, i32 *%gep5, align 8
120+
%arrayidx11 = getelementptr inbounds i32, i32* %p, i32 %idx5
121+
%i4 = load i32, i32* %arrayidx11, align 4
122+
%gep6 = getelementptr inbounds i32, i32* %addr, i32 5
123+
%idx6 = load i32, i32 *%gep6, align 8
124+
%arrayidx13 = getelementptr inbounds i32, i32* %p, i32 %idx6
125+
%i5 = load i32, i32* %arrayidx13, align 4
126+
%add14 = add nsw i32 %i5, %i4
127+
%arrayidx16 = getelementptr inbounds i32, i32* %s, i32 2
128+
store i32 %add14, i32* %arrayidx16, align 4
129+
%gep7 = getelementptr inbounds i32, i32* %addr, i32 6
130+
%idx7 = load i32, i32 *%gep7, align 8
131+
%arrayidx18 = getelementptr inbounds i32, i32* %p, i32 %idx7
132+
%i6 = load i32, i32* %arrayidx18, align 4
133+
%gep8 = getelementptr inbounds i32, i32* %addr, i32 7
134+
%idx8 = load i32, i32 *%gep8, align 8
135+
%arrayidx20 = getelementptr inbounds i32, i32* %p, i32 %idx8
136+
%i7 = load i32, i32* %arrayidx20, align 4
137+
%add21 = add nsw i32 %i7, %i6
138+
%arrayidx23 = getelementptr inbounds i32, i32* %s, i32 3
139+
store i32 %add21, i32* %arrayidx23, align 4
140+
%gep9 = getelementptr inbounds i32, i32* %addr, i32 8
141+
%idx9 = load i32, i32 *%gep9, align 8
142+
%arrayidx25 = getelementptr inbounds i32, i32* %p, i32 %idx9
143+
%i8 = load i32, i32* %arrayidx25, align 4
144+
%gep10 = getelementptr inbounds i32, i32* %addr, i32 9
145+
%idx10 = load i32, i32 *%gep10, align 8
146+
%arrayidx27 = getelementptr inbounds i32, i32* %p, i32 %idx10
147+
%i9 = load i32, i32* %arrayidx27, align 4
148+
%add28 = add nsw i32 %i9, %i8
149+
%arrayidx30 = getelementptr inbounds i32, i32* %s, i32 4
150+
store i32 %add28, i32* %arrayidx30, align 4
151+
%gep11 = getelementptr inbounds i32, i32* %addr, i32 10
152+
%idx11 = load i32, i32 *%gep11, align 8
153+
%arrayidx32 = getelementptr inbounds i32, i32* %p, i32 %idx11
154+
%i10 = load i32, i32* %arrayidx32, align 4
155+
%gep12 = getelementptr inbounds i32, i32* %addr, i32 11
156+
%idx12 = load i32, i32 *%gep12, align 8
157+
%arrayidx34 = getelementptr inbounds i32, i32* %p, i32 %idx12
158+
%i11 = load i32, i32* %arrayidx34, align 4
159+
%add35 = add nsw i32 %i11, %i10
160+
%arrayidx37 = getelementptr inbounds i32, i32* %s, i32 5
161+
store i32 %add35, i32* %arrayidx37, align 4
162+
%gep13 = getelementptr inbounds i32, i32* %addr, i32 12
163+
%idx13 = load i32, i32 *%gep13, align 8
164+
%arrayidx39 = getelementptr inbounds i32, i32* %p, i32 %idx13
165+
%i12 = load i32, i32* %arrayidx39, align 4
166+
%gep14 = getelementptr inbounds i32, i32* %addr, i32 13
167+
%idx14 = load i32, i32 *%gep14, align 8
168+
%arrayidx41 = getelementptr inbounds i32, i32* %p, i32 %idx14
169+
%i13 = load i32, i32* %arrayidx41, align 4
170+
%add42 = add nsw i32 %i13, %i12
171+
%arrayidx44 = getelementptr inbounds i32, i32* %s, i32 6
172+
store i32 %add42, i32* %arrayidx44, align 4
173+
%gep15 = getelementptr inbounds i32, i32* %addr, i32 14
174+
%idx15 = load i32, i32 *%gep15, align 8
175+
%arrayidx46 = getelementptr inbounds i32, i32* %p, i32 %idx15
176+
%i14 = load i32, i32* %arrayidx46, align 4
177+
%gep16 = getelementptr inbounds i32, i32* %addr, i32 15
178+
%idx16 = load i32, i32 *%gep16, align 8
179+
%arrayidx48 = getelementptr inbounds i32, i32* %p, i32 %idx16
180+
%i15 = load i32, i32* %arrayidx48, align 4
181+
%add49 = add nsw i32 %i15, %i14
182+
%arrayidx51 = getelementptr inbounds i32, i32* %s, i32 7
183+
store i32 %add49, i32* %arrayidx51, align 4
184+
ret void
185+
}

0 commit comments

Comments
 (0)