• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s
2
3; CHECK-LABEL: julia_2xdouble
4; CHECK: load <2 x double>
5; CHECK: load <2 x double>
6; CHECK: fmul <2 x double>
7; CHECK: fadd <2 x double>
8define void @julia_2xdouble([2 x double]* sret, [2 x double]*, [2 x double]*, [2 x double]*) {
9top:
10  %px0 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0
11  %x0 = load double, double* %px0, align 4
12  %py0 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 0
13  %y0 = load double, double* %py0, align 4
14  %m0 = fmul double %x0, %y0
15  %px1 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1
16  %x1 = load double, double* %px1, align 4
17  %py1 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 1
18  %y1 = load double, double* %py1, align 4
19  %m1 = fmul double %x1, %y1
20  %pz0 = getelementptr inbounds [2 x double], [2 x double]* %1, i64 0, i64 0
21  %z0 = load double, double* %pz0, align 4
22  %a0 = fadd double %m0, %z0
23  %i0 = insertvalue [2 x double] undef, double %a0, 0
24  %pz1 = getelementptr inbounds [2 x double], [2 x double]* %1, i64 0, i64 1
25  %z1 = load double, double* %pz1, align 4
26  %a1 = fadd double %m1, %z1
27  %i1 = insertvalue [2 x double] %i0, double %a1, 1
28  store [2 x double] %i1, [2 x double]* %0, align 4
29  ret void
30}
31
32; CHECK-LABEL: julia_4xfloat
33; CHECK: load <4 x float>
34; CHECK: load <4 x float>
35; CHECK: fmul <4 x float>
36; CHECK: fadd <4 x float>
37define void @julia_4xfloat([4 x float]* sret, [4 x float]*, [4 x float]*, [4 x float]*) {
38top:
39  %px0 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 0
40  %x0 = load float, float* %px0, align 4
41  %py0 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 0
42  %y0 = load float, float* %py0, align 4
43  %m0 = fmul float %x0, %y0
44  %px1 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 1
45  %x1 = load float, float* %px1, align 4
46  %py1 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 1
47  %y1 = load float, float* %py1, align 4
48  %m1 = fmul float %x1, %y1
49  %px2 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 2
50  %x2 = load float, float* %px2, align 4
51  %py2 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 2
52  %y2 = load float, float* %py2, align 4
53  %m2 = fmul float %x2, %y2
54  %px3 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 3
55  %x3 = load float, float* %px3, align 4
56  %py3 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 3
57  %y3 = load float, float* %py3, align 4
58  %m3 = fmul float %x3, %y3
59  %pz0 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 0
60  %z0 = load float, float* %pz0, align 4
61  %a0 = fadd float %m0, %z0
62  %i0 = insertvalue [4 x float] undef, float %a0, 0
63  %pz1 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 1
64  %z1 = load float, float* %pz1, align 4
65  %a1 = fadd float %m1, %z1
66  %i1 = insertvalue [4 x float] %i0, float %a1, 1
67  %pz2 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 2
68  %z2 = load float, float* %pz2, align 4
69  %a2 = fadd float %m2, %z2
70  %i2 = insertvalue [4 x float] %i1, float %a2, 2
71  %pz3 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 3
72  %z3 = load float, float* %pz3, align 4
73  %a3 = fadd float %m3, %z3
74  %i3 = insertvalue [4 x float] %i2, float %a3, 3
75  store [4 x float] %i3, [4 x float]* %0, align 4
76  ret void
77}
78
79; CHECK-LABEL: julia_load_array_of_float
80; CHECK: fsub <4 x float>
81define void @julia_load_array_of_float([4 x float]* %a, [4 x float]* %b, [4 x float]* %c) {
82top:
83  %a_arr = load [4 x float], [4 x float]* %a, align 4
84  %a0 = extractvalue [4 x float] %a_arr, 0
85  %a2 = extractvalue [4 x float] %a_arr, 2
86  %a1 = extractvalue [4 x float] %a_arr, 1
87  %b_arr = load [4 x float], [4 x float]* %b, align 4
88  %b0 = extractvalue [4 x float] %b_arr, 0
89  %b2 = extractvalue [4 x float] %b_arr, 2
90  %b1 = extractvalue [4 x float] %b_arr, 1
91  %a3 = extractvalue [4 x float] %a_arr, 3
92  %c1 = fsub float %a1, %b1
93  %b3 = extractvalue [4 x float] %b_arr, 3
94  %c0 = fsub float %a0, %b0
95  %c2 = fsub float %a2, %b2
96  %c_arr0 = insertvalue [4 x float] undef, float %c0, 0
97  %c_arr1 = insertvalue [4 x float] %c_arr0, float %c1, 1
98  %c3 = fsub float %a3, %b3
99  %c_arr2 = insertvalue [4 x float] %c_arr1, float %c2, 2
100  %c_arr3 = insertvalue [4 x float] %c_arr2, float %c3, 3
101  store [4 x float] %c_arr3, [4 x float]* %c, align 4
102  ret void
103}
104
105; CHECK-LABEL: julia_load_array_of_i32
106; CHECK: load <4 x i32>
107; CHECK: load <4 x i32>
108; CHECK: sub <4 x i32>
109define void @julia_load_array_of_i32([4 x i32]* %a, [4 x i32]* %b, [4 x i32]* %c) {
110top:
111  %a_arr = load [4 x i32], [4 x i32]* %a, align 4
112  %a0 = extractvalue [4 x i32] %a_arr, 0
113  %a2 = extractvalue [4 x i32] %a_arr, 2
114  %a1 = extractvalue [4 x i32] %a_arr, 1
115  %b_arr = load [4 x i32], [4 x i32]* %b, align 4
116  %b0 = extractvalue [4 x i32] %b_arr, 0
117  %b2 = extractvalue [4 x i32] %b_arr, 2
118  %b1 = extractvalue [4 x i32] %b_arr, 1
119  %a3 = extractvalue [4 x i32] %a_arr, 3
120  %c1 = sub i32 %a1, %b1
121  %b3 = extractvalue [4 x i32] %b_arr, 3
122  %c0 = sub i32 %a0, %b0
123  %c2 = sub i32 %a2, %b2
124  %c_arr0 = insertvalue [4 x i32] undef, i32 %c0, 0
125  %c_arr1 = insertvalue [4 x i32] %c_arr0, i32 %c1, 1
126  %c3 = sub i32 %a3, %b3
127  %c_arr2 = insertvalue [4 x i32] %c_arr1, i32 %c2, 2
128  %c_arr3 = insertvalue [4 x i32] %c_arr2, i32 %c3, 3
129  store [4 x i32] %c_arr3, [4 x i32]* %c, align 4
130  ret void
131}
132
133; Almost identical to previous test, but for type that should NOT be vectorized.
134;
135; CHECK-LABEL: julia_load_array_of_i16
136; CHECK-NOT: i2>
137define void @julia_load_array_of_i16([4 x i16]* %a, [4 x i16]* %b, [4 x i16]* %c) {
138top:
139  %a_arr = load [4 x i16], [4 x i16]* %a, align 4
140  %a0 = extractvalue [4 x i16] %a_arr, 0
141  %a2 = extractvalue [4 x i16] %a_arr, 2
142  %a1 = extractvalue [4 x i16] %a_arr, 1
143  %b_arr = load [4 x i16], [4 x i16]* %b, align 4
144  %b0 = extractvalue [4 x i16] %b_arr, 0
145  %b2 = extractvalue [4 x i16] %b_arr, 2
146  %b1 = extractvalue [4 x i16] %b_arr, 1
147  %a3 = extractvalue [4 x i16] %a_arr, 3
148  %c1 = sub i16 %a1, %b1
149  %b3 = extractvalue [4 x i16] %b_arr, 3
150  %c0 = sub i16 %a0, %b0
151  %c2 = sub i16 %a2, %b2
152  %c_arr0 = insertvalue [4 x i16] undef, i16 %c0, 0
153  %c_arr1 = insertvalue [4 x i16] %c_arr0, i16 %c1, 1
154  %c3 = sub i16 %a3, %b3
155  %c_arr2 = insertvalue [4 x i16] %c_arr1, i16 %c2, 2
156  %c_arr3 = insertvalue [4 x i16] %c_arr2, i16 %c3, 3
157  store [4 x i16] %c_arr3, [4 x i16]* %c, align 4
158  ret void
159}
160
161%pseudovec = type { float, float, float, float }
162
163; CHECK-LABEL: julia_load_struct_of_float
164; CHECK: load <4 x float>
165; CHECK: load <4 x float>
166; CHECK: fsub <4 x float>
167define void @julia_load_struct_of_float(%pseudovec* %a, %pseudovec* %b, %pseudovec* %c) {
168top:
169  %a_struct = load %pseudovec, %pseudovec* %a, align 4
170  %a0 = extractvalue %pseudovec %a_struct, 0
171  %a1 = extractvalue %pseudovec %a_struct, 1
172  %b_struct = load %pseudovec, %pseudovec* %b, align 4
173  %a2 = extractvalue %pseudovec %a_struct, 2
174  %b0 = extractvalue %pseudovec %b_struct, 0
175  %a3 = extractvalue %pseudovec %a_struct, 3
176  %c0 = fsub float %a0, %b0
177  %b1 = extractvalue %pseudovec %b_struct, 1
178  %b2 = extractvalue %pseudovec %b_struct, 2
179  %c1 = fsub float %a1, %b1
180  %c_struct0 = insertvalue %pseudovec undef, float %c0, 0
181  %b3 = extractvalue %pseudovec %b_struct, 3
182  %c3 = fsub float %a3, %b3
183  %c_struct1 = insertvalue %pseudovec %c_struct0, float %c1, 1
184  %c2 = fsub float %a2, %b2
185  %c_struct2 = insertvalue %pseudovec %c_struct1, float %c2, 2
186  %c_struct3 = insertvalue %pseudovec %c_struct2, float %c3, 3
187  store %pseudovec %c_struct3, %pseudovec* %c, align 4
188  ret void
189}
190