]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/SLPVectorizer/X86/vect_copyable_in_binops.ll
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / Transforms / SLPVectorizer / X86 / vect_copyable_in_binops.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=bdver2 < %s | FileCheck %s
3
4 define void @add0(i32* noalias %dst, i32* noalias %src) {
5 ; CHECK-LABEL: @add0(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
8 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
9 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
10 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
11 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
12 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
13 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[SRC]] to <4 x i32>*
14 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
15 ; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> <i32 1, i32 1, i32 2, i32 3>, [[TMP1]]
16 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DST]] to <4 x i32>*
17 ; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP3]], align 4
18 ; CHECK-NEXT:    ret void
19 ;
20 entry:
21   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
22   %0 = load i32, i32* %src, align 4
23   %add = add nsw i32 %0, 1
24   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
25   store i32 %add, i32* %dst, align 4
26   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
27   %1 = load i32, i32* %incdec.ptr, align 4
28   %add3 = add nsw i32 %1, 1
29   %incdec.ptr4 = getelementptr inbounds i32, i32* %dst, i64 2
30   store i32 %add3, i32* %incdec.ptr1, align 4
31   %incdec.ptr5 = getelementptr inbounds i32, i32* %src, i64 3
32   %2 = load i32, i32* %incdec.ptr2, align 4
33   %add6 = add nsw i32 %2, 2
34   %incdec.ptr7 = getelementptr inbounds i32, i32* %dst, i64 3
35   store i32 %add6, i32* %incdec.ptr4, align 4
36   %3 = load i32, i32* %incdec.ptr5, align 4
37   %add9 = add nsw i32 %3, 3
38   store i32 %add9, i32* %incdec.ptr7, align 4
39   ret void
40 }
41
42 define void @add1(i32* noalias %dst, i32* noalias %src) {
43 ; CHECK-LABEL: @add1(
44 ; CHECK-NEXT:  entry:
45 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
46 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
47 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
48 ; CHECK-NEXT:    store i32 [[TMP0]], i32* [[DST]], align 4
49 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
50 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
51 ; CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP1]], 1
52 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
53 ; CHECK-NEXT:    store i32 [[ADD3]], i32* [[INCDEC_PTR1]], align 4
54 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
55 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
56 ; CHECK-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP2]], 2
57 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
58 ; CHECK-NEXT:    store i32 [[ADD6]], i32* [[INCDEC_PTR4]], align 4
59 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR5]], align 4
60 ; CHECK-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP3]], 3
61 ; CHECK-NEXT:    store i32 [[ADD9]], i32* [[INCDEC_PTR7]], align 4
62 ; CHECK-NEXT:    ret void
63 ;
64 entry:
65   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
66   %0 = load i32, i32* %src, align 4
67   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
68   store i32 %0, i32* %dst, align 4
69   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
70   %1 = load i32, i32* %incdec.ptr, align 4
71   %add3 = add nsw i32 %1, 1
72   %incdec.ptr4 = getelementptr inbounds i32, i32* %dst, i64 2
73   store i32 %add3, i32* %incdec.ptr1, align 4
74   %incdec.ptr5 = getelementptr inbounds i32, i32* %src, i64 3
75   %2 = load i32, i32* %incdec.ptr2, align 4
76   %add6 = add nsw i32 %2, 2
77   %incdec.ptr7 = getelementptr inbounds i32, i32* %dst, i64 3
78   store i32 %add6, i32* %incdec.ptr4, align 4
79   %3 = load i32, i32* %incdec.ptr5, align 4
80   %add9 = add nsw i32 %3, 3
81   store i32 %add9, i32* %incdec.ptr7, align 4
82   ret void
83 }
84
85 define void @sub0(i32* noalias %dst, i32* noalias %src) {
86 ; CHECK-LABEL: @sub0(
87 ; CHECK-NEXT:  entry:
88 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
89 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
90 ; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[TMP0]], -1
91 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
92 ; CHECK-NEXT:    store i32 [[SUB]], i32* [[DST]], align 4
93 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
94 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
95 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
96 ; CHECK-NEXT:    store i32 [[TMP1]], i32* [[INCDEC_PTR1]], align 4
97 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
98 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
99 ; CHECK-NEXT:    [[SUB5:%.*]] = add nsw i32 [[TMP2]], -2
100 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
101 ; CHECK-NEXT:    store i32 [[SUB5]], i32* [[INCDEC_PTR3]], align 4
102 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR4]], align 4
103 ; CHECK-NEXT:    [[SUB8:%.*]] = add nsw i32 [[TMP3]], -3
104 ; CHECK-NEXT:    store i32 [[SUB8]], i32* [[INCDEC_PTR6]], align 4
105 ; CHECK-NEXT:    ret void
106 ;
107 entry:
108   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
109   %0 = load i32, i32* %src, align 4
110   %sub = add nsw i32 %0, -1
111   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
112   store i32 %sub, i32* %dst, align 4
113   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
114   %1 = load i32, i32* %incdec.ptr, align 4
115   %incdec.ptr3 = getelementptr inbounds i32, i32* %dst, i64 2
116   store i32 %1, i32* %incdec.ptr1, align 4
117   %incdec.ptr4 = getelementptr inbounds i32, i32* %src, i64 3
118   %2 = load i32, i32* %incdec.ptr2, align 4
119   %sub5 = add nsw i32 %2, -2
120   %incdec.ptr6 = getelementptr inbounds i32, i32* %dst, i64 3
121   store i32 %sub5, i32* %incdec.ptr3, align 4
122   %3 = load i32, i32* %incdec.ptr4, align 4
123   %sub8 = add nsw i32 %3, -3
124   store i32 %sub8, i32* %incdec.ptr6, align 4
125   ret void
126 }
127
128 define void @sub1(i32* noalias %dst, i32* noalias %src) {
129 ; CHECK-LABEL: @sub1(
130 ; CHECK-NEXT:  entry:
131 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
132 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
133 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
134 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
135 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
136 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
137 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[SRC]] to <4 x i32>*
138 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
139 ; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> <i32 4, i32 -1, i32 -2, i32 -3>, [[TMP1]]
140 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DST]] to <4 x i32>*
141 ; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP3]], align 4
142 ; CHECK-NEXT:    ret void
143 ;
144 entry:
145   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
146   %0 = load i32, i32* %src, align 4
147   %add = add nsw i32 %0, 4
148   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
149   store i32 %add, i32* %dst, align 4
150   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
151   %1 = load i32, i32* %incdec.ptr, align 4
152   %sub = add nsw i32 %1, -1
153   %incdec.ptr3 = getelementptr inbounds i32, i32* %dst, i64 2
154   store i32 %sub, i32* %incdec.ptr1, align 4
155   %incdec.ptr4 = getelementptr inbounds i32, i32* %src, i64 3
156   %2 = load i32, i32* %incdec.ptr2, align 4
157   %sub5 = add nsw i32 %2, -2
158   %incdec.ptr6 = getelementptr inbounds i32, i32* %dst, i64 3
159   store i32 %sub5, i32* %incdec.ptr3, align 4
160   %3 = load i32, i32* %incdec.ptr4, align 4
161   %sub8 = add nsw i32 %3, -3
162   store i32 %sub8, i32* %incdec.ptr6, align 4
163   ret void
164 }
165
166 define void @sub2(i32* noalias %dst, i32* noalias %src) {
167 ; CHECK-LABEL: @sub2(
168 ; CHECK-NEXT:  entry:
169 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
170 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
171 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
172 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
173 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
174 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
175 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[SRC]] to <4 x i32>*
176 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
177 ; CHECK-NEXT:    [[TMP2:%.*]] = add nsw <4 x i32> <i32 -1, i32 -1, i32 -2, i32 -3>, [[TMP1]]
178 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DST]] to <4 x i32>*
179 ; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP3]], align 4
180 ; CHECK-NEXT:    ret void
181 ;
182 entry:
183   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
184   %0 = load i32, i32* %src, align 4
185   %sub = add nsw i32 %0, -1
186   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
187   store i32 %sub, i32* %dst, align 4
188   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
189   %1 = load i32, i32* %incdec.ptr, align 4
190   %sub3 = add nsw i32 %1, -1
191   %incdec.ptr4 = getelementptr inbounds i32, i32* %dst, i64 2
192   store i32 %sub3, i32* %incdec.ptr1, align 4
193   %incdec.ptr5 = getelementptr inbounds i32, i32* %src, i64 3
194   %2 = load i32, i32* %incdec.ptr2, align 4
195   %sub6 = add nsw i32 %2, -2
196   %incdec.ptr7 = getelementptr inbounds i32, i32* %dst, i64 3
197   store i32 %sub6, i32* %incdec.ptr4, align 4
198   %3 = load i32, i32* %incdec.ptr5, align 4
199   %sub9 = add nsw i32 %3, -3
200   store i32 %sub9, i32* %incdec.ptr7, align 4
201   ret void
202 }
203
204 define void @addsub0(i32* noalias %dst, i32* noalias %src) {
205 ; CHECK-LABEL: @addsub0(
206 ; CHECK-NEXT:  entry:
207 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
208 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
209 ; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[TMP0]], -1
210 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
211 ; CHECK-NEXT:    store i32 [[SUB]], i32* [[DST]], align 4
212 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
213 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
214 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
215 ; CHECK-NEXT:    store i32 [[TMP1]], i32* [[INCDEC_PTR1]], align 4
216 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
217 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
218 ; CHECK-NEXT:    [[SUB5:%.*]] = add nsw i32 [[TMP2]], -2
219 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
220 ; CHECK-NEXT:    store i32 [[SUB5]], i32* [[INCDEC_PTR3]], align 4
221 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR4]], align 4
222 ; CHECK-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP3]], -3
223 ; CHECK-NEXT:    store i32 [[SUB8]], i32* [[INCDEC_PTR6]], align 4
224 ; CHECK-NEXT:    ret void
225 ;
226 entry:
227   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
228   %0 = load i32, i32* %src, align 4
229   %sub = add nsw i32 %0, -1
230   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
231   store i32 %sub, i32* %dst, align 4
232   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
233   %1 = load i32, i32* %incdec.ptr, align 4
234   %incdec.ptr3 = getelementptr inbounds i32, i32* %dst, i64 2
235   store i32 %1, i32* %incdec.ptr1, align 4
236   %incdec.ptr4 = getelementptr inbounds i32, i32* %src, i64 3
237   %2 = load i32, i32* %incdec.ptr2, align 4
238   %sub5 = add nsw i32 %2, -2
239   %incdec.ptr6 = getelementptr inbounds i32, i32* %dst, i64 3
240   store i32 %sub5, i32* %incdec.ptr3, align 4
241   %3 = load i32, i32* %incdec.ptr4, align 4
242   %sub8 = sub nsw i32 %3, -3
243   store i32 %sub8, i32* %incdec.ptr6, align 4
244   ret void
245 }
246
247 define void @addsub1(i32* noalias %dst, i32* noalias %src) {
248 ; CHECK-LABEL: @addsub1(
249 ; CHECK-NEXT:  entry:
250 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
251 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
252 ; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[TMP0]], -1
253 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
254 ; CHECK-NEXT:    store i32 [[SUB]], i32* [[DST]], align 4
255 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
256 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
257 ; CHECK-NEXT:    [[SUB1:%.*]] = sub nsw i32 [[TMP1]], -1
258 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
259 ; CHECK-NEXT:    store i32 [[SUB1]], i32* [[INCDEC_PTR1]], align 4
260 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
261 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
262 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
263 ; CHECK-NEXT:    store i32 [[TMP2]], i32* [[INCDEC_PTR3]], align 4
264 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR4]], align 4
265 ; CHECK-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP3]], -3
266 ; CHECK-NEXT:    store i32 [[SUB8]], i32* [[INCDEC_PTR6]], align 4
267 ; CHECK-NEXT:    ret void
268 ;
269 entry:
270   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
271   %0 = load i32, i32* %src, align 4
272   %sub = add nsw i32 %0, -1
273   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
274   store i32 %sub, i32* %dst, align 4
275   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
276   %1 = load i32, i32* %incdec.ptr, align 4
277   %sub1 = sub nsw i32 %1, -1
278   %incdec.ptr3 = getelementptr inbounds i32, i32* %dst, i64 2
279   store i32 %sub1, i32* %incdec.ptr1, align 4
280   %incdec.ptr4 = getelementptr inbounds i32, i32* %src, i64 3
281   %2 = load i32, i32* %incdec.ptr2, align 4
282   %incdec.ptr6 = getelementptr inbounds i32, i32* %dst, i64 3
283   store i32 %2, i32* %incdec.ptr3, align 4
284   %3 = load i32, i32* %incdec.ptr4, align 4
285   %sub8 = sub nsw i32 %3, -3
286   store i32 %sub8, i32* %incdec.ptr6, align 4
287   ret void
288 }
289
290 define void @mul(i32* noalias %dst, i32* noalias %src) {
291 ; CHECK-LABEL: @mul(
292 ; CHECK-NEXT:  entry:
293 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
294 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
295 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP0]], 257
296 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
297 ; CHECK-NEXT:    store i32 [[MUL]], i32* [[DST]], align 4
298 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
299 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
300 ; CHECK-NEXT:    [[MUL3:%.*]] = mul nsw i32 [[TMP1]], -3
301 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
302 ; CHECK-NEXT:    store i32 [[MUL3]], i32* [[INCDEC_PTR1]], align 4
303 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
304 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
305 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
306 ; CHECK-NEXT:    store i32 [[TMP2]], i32* [[INCDEC_PTR4]], align 4
307 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR5]], align 4
308 ; CHECK-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[TMP3]], -9
309 ; CHECK-NEXT:    store i32 [[MUL9]], i32* [[INCDEC_PTR7]], align 4
310 ; CHECK-NEXT:    ret void
311 ;
312 entry:
313   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
314   %0 = load i32, i32* %src, align 4
315   %mul = mul nsw i32 %0, 257
316   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
317   store i32 %mul, i32* %dst, align 4
318   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
319   %1 = load i32, i32* %incdec.ptr, align 4
320   %mul3 = mul nsw i32 %1, -3
321   %incdec.ptr4 = getelementptr inbounds i32, i32* %dst, i64 2
322   store i32 %mul3, i32* %incdec.ptr1, align 4
323   %incdec.ptr5 = getelementptr inbounds i32, i32* %src, i64 3
324   %2 = load i32, i32* %incdec.ptr2, align 4
325   %incdec.ptr7 = getelementptr inbounds i32, i32* %dst, i64 3
326   store i32 %2, i32* %incdec.ptr4, align 4
327   %3 = load i32, i32* %incdec.ptr5, align 4
328   %mul9 = mul nsw i32 %3, -9
329   store i32 %mul9, i32* %incdec.ptr7, align 4
330   ret void
331 }
332
333 define void @shl0(i32* noalias %dst, i32* noalias %src) {
334 ; CHECK-LABEL: @shl0(
335 ; CHECK-NEXT:  entry:
336 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
337 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[SRC]], align 4
338 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
339 ; CHECK-NEXT:    store i32 [[TMP0]], i32* [[DST]], align 4
340 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
341 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[INCDEC_PTR]], align 4
342 ; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[TMP1]], 1
343 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
344 ; CHECK-NEXT:    store i32 [[SHL]], i32* [[INCDEC_PTR1]], align 4
345 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
346 ; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[INCDEC_PTR2]], align 4
347 ; CHECK-NEXT:    [[SHL5:%.*]] = shl i32 [[TMP2]], 2
348 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
349 ; CHECK-NEXT:    store i32 [[SHL5]], i32* [[INCDEC_PTR3]], align 4
350 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[INCDEC_PTR4]], align 4
351 ; CHECK-NEXT:    [[SHL8:%.*]] = shl i32 [[TMP3]], 3
352 ; CHECK-NEXT:    store i32 [[SHL8]], i32* [[INCDEC_PTR6]], align 4
353 ; CHECK-NEXT:    ret void
354 ;
355 entry:
356   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
357   %0 = load i32, i32* %src, align 4
358   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
359   store i32 %0, i32* %dst, align 4
360   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
361   %1 = load i32, i32* %incdec.ptr, align 4
362   %shl = shl i32 %1, 1
363   %incdec.ptr3 = getelementptr inbounds i32, i32* %dst, i64 2
364   store i32 %shl, i32* %incdec.ptr1, align 4
365   %incdec.ptr4 = getelementptr inbounds i32, i32* %src, i64 3
366   %2 = load i32, i32* %incdec.ptr2, align 4
367   %shl5 = shl i32 %2, 2
368   %incdec.ptr6 = getelementptr inbounds i32, i32* %dst, i64 3
369   store i32 %shl5, i32* %incdec.ptr3, align 4
370   %3 = load i32, i32* %incdec.ptr4, align 4
371   %shl8 = shl i32 %3, 3
372   store i32 %shl8, i32* %incdec.ptr6, align 4
373   ret void
374 }
375
376 define void @shl1(i32* noalias %dst, i32* noalias %src) {
377 ; CHECK-LABEL: @shl1(
378 ; CHECK-NEXT:  entry:
379 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, i32* [[SRC:%.*]], i64 1
380 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i64 1
381 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
382 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 2
383 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3
384 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds i32, i32* [[DST]], i64 3
385 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[SRC]] to <4 x i32>*
386 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, <4 x i32>* [[TMP0]], align 4
387 ; CHECK-NEXT:    [[TMP2:%.*]] = shl <4 x i32> [[TMP1]], <i32 7, i32 1, i32 2, i32 3>
388 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DST]] to <4 x i32>*
389 ; CHECK-NEXT:    store <4 x i32> [[TMP2]], <4 x i32>* [[TMP3]], align 4
390 ; CHECK-NEXT:    ret void
391 ;
392 entry:
393   %incdec.ptr = getelementptr inbounds i32, i32* %src, i64 1
394   %0 = load i32, i32* %src, align 4
395   %shl = shl i32 %0, 7
396   %incdec.ptr1 = getelementptr inbounds i32, i32* %dst, i64 1
397   store i32 %shl, i32* %dst, align 4
398   %incdec.ptr2 = getelementptr inbounds i32, i32* %src, i64 2
399   %1 = load i32, i32* %incdec.ptr, align 4
400   %shl3 = shl i32 %1, 1
401   %incdec.ptr4 = getelementptr inbounds i32, i32* %dst, i64 2
402   store i32 %shl3, i32* %incdec.ptr1, align 4
403   %incdec.ptr5 = getelementptr inbounds i32, i32* %src, i64 3
404   %2 = load i32, i32* %incdec.ptr2, align 4
405   %shl6 = shl i32 %2, 2
406   %incdec.ptr7 = getelementptr inbounds i32, i32* %dst, i64 3
407   store i32 %shl6, i32* %incdec.ptr4, align 4
408   %3 = load i32, i32* %incdec.ptr5, align 4
409   %shl9 = shl i32 %3, 3
410   store i32 %shl9, i32* %incdec.ptr7, align 4
411   ret void
412 }
413
414 define void @add0f(float* noalias %dst, float* noalias %src) {
415 ; CHECK-LABEL: @add0f(
416 ; CHECK-NEXT:  entry:
417 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
418 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
419 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
420 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
421 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
422 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
423 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
424 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
425 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <4 x float> <float 1.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, [[TMP1]]
426 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
427 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
428 ; CHECK-NEXT:    ret void
429 ;
430 entry:
431   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
432   %0 = load float, float* %src, align 4
433   %add = fadd fast float %0, 1.000000e+00
434   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
435   store float %add, float* %dst, align 4
436   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
437   %1 = load float, float* %incdec.ptr, align 4
438   %add3 = fadd fast float %1, 1.000000e+00
439   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
440   store float %add3, float* %incdec.ptr1, align 4
441   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
442   %2 = load float, float* %incdec.ptr2, align 4
443   %add6 = fadd fast float %2, 2.000000e+00
444   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
445   store float %add6, float* %incdec.ptr4, align 4
446   %3 = load float, float* %incdec.ptr5, align 4
447   %add9 = fadd fast float %3, 3.000000e+00
448   store float %add9, float* %incdec.ptr7, align 4
449   ret void
450 }
451
452 define void @add1f(float* noalias %dst, float* noalias %src) {
453 ; CHECK-LABEL: @add1f(
454 ; CHECK-NEXT:  entry:
455 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
456 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
457 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
458 ; CHECK-NEXT:    store float [[TMP0]], float* [[DST]], align 4
459 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
460 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
461 ; CHECK-NEXT:    [[ADD3:%.*]] = fadd fast float [[TMP1]], 1.000000e+00
462 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
463 ; CHECK-NEXT:    store float [[ADD3]], float* [[INCDEC_PTR1]], align 4
464 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
465 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
466 ; CHECK-NEXT:    [[ADD6:%.*]] = fadd fast float [[TMP2]], 2.000000e+00
467 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
468 ; CHECK-NEXT:    store float [[ADD6]], float* [[INCDEC_PTR4]], align 4
469 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
470 ; CHECK-NEXT:    [[ADD9:%.*]] = fadd fast float [[TMP3]], 3.000000e+00
471 ; CHECK-NEXT:    store float [[ADD9]], float* [[INCDEC_PTR7]], align 4
472 ; CHECK-NEXT:    ret void
473 ;
474 entry:
475   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
476   %0 = load float, float* %src, align 4
477   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
478   store float %0, float* %dst, align 4
479   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
480   %1 = load float, float* %incdec.ptr, align 4
481   %add3 = fadd fast float %1, 1.000000e+00
482   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
483   store float %add3, float* %incdec.ptr1, align 4
484   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
485   %2 = load float, float* %incdec.ptr2, align 4
486   %add6 = fadd fast float %2, 2.000000e+00
487   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
488   store float %add6, float* %incdec.ptr4, align 4
489   %3 = load float, float* %incdec.ptr5, align 4
490   %add9 = fadd fast float %3, 3.000000e+00
491   store float %add9, float* %incdec.ptr7, align 4
492   ret void
493 }
494
495 define void @sub0f(float* noalias %dst, float* noalias %src) {
496 ; CHECK-LABEL: @sub0f(
497 ; CHECK-NEXT:  entry:
498 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
499 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
500 ; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP0]], -1.000000e+00
501 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
502 ; CHECK-NEXT:    store float [[ADD]], float* [[DST]], align 4
503 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
504 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
505 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
506 ; CHECK-NEXT:    store float [[TMP1]], float* [[INCDEC_PTR1]], align 4
507 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
508 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
509 ; CHECK-NEXT:    [[ADD6:%.*]] = fadd fast float [[TMP2]], -2.000000e+00
510 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
511 ; CHECK-NEXT:    store float [[ADD6]], float* [[INCDEC_PTR4]], align 4
512 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
513 ; CHECK-NEXT:    [[ADD9:%.*]] = fadd fast float [[TMP3]], -3.000000e+00
514 ; CHECK-NEXT:    store float [[ADD9]], float* [[INCDEC_PTR7]], align 4
515 ; CHECK-NEXT:    ret void
516 ;
517 entry:
518   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
519   %0 = load float, float* %src, align 4
520   %add = fadd fast float %0, -1.000000e+00
521   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
522   store float %add, float* %dst, align 4
523   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
524   %1 = load float, float* %incdec.ptr, align 4
525   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
526   store float %1, float* %incdec.ptr1, align 4
527   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
528   %2 = load float, float* %incdec.ptr2, align 4
529   %add6 = fadd fast float %2, -2.000000e+00
530   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
531   store float %add6, float* %incdec.ptr4, align 4
532   %3 = load float, float* %incdec.ptr5, align 4
533   %add9 = fadd fast float %3, -3.000000e+00
534   store float %add9, float* %incdec.ptr7, align 4
535   ret void
536 }
537
538 define void @sub1f(float* noalias %dst, float* noalias %src) {
539 ; CHECK-LABEL: @sub1f(
540 ; CHECK-NEXT:  entry:
541 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
542 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
543 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
544 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
545 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
546 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
547 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
548 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
549 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <4 x float> <float 4.000000e+00, float -1.000000e+00, float -2.000000e+00, float -3.000000e+00>, [[TMP1]]
550 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
551 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
552 ; CHECK-NEXT:    ret void
553 ;
554 entry:
555   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
556   %0 = load float, float* %src, align 4
557   %add = fadd fast float %0, 4.000000e+00
558   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
559   store float %add, float* %dst, align 4
560   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
561   %1 = load float, float* %incdec.ptr, align 4
562   %sub = fadd fast float %1, -1.000000e+00
563   %incdec.ptr3 = getelementptr inbounds float, float* %dst, i64 2
564   store float %sub, float* %incdec.ptr1, align 4
565   %incdec.ptr4 = getelementptr inbounds float, float* %src, i64 3
566   %2 = load float, float* %incdec.ptr2, align 4
567   %sub5 = fadd fast float %2, -2.000000e+00
568   %incdec.ptr6 = getelementptr inbounds float, float* %dst, i64 3
569   store float %sub5, float* %incdec.ptr3, align 4
570   %3 = load float, float* %incdec.ptr4, align 4
571   %sub8 = fadd fast float %3, -3.000000e+00
572   store float %sub8, float* %incdec.ptr6, align 4
573   ret void
574 }
575
576 define void @sub2f(float* noalias %dst, float* noalias %src) {
577 ; CHECK-LABEL: @sub2f(
578 ; CHECK-NEXT:  entry:
579 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
580 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
581 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
582 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
583 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
584 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
585 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
586 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
587 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd fast <4 x float> <float -1.000000e+00, float -1.000000e+00, float -2.000000e+00, float -3.000000e+00>, [[TMP1]]
588 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
589 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
590 ; CHECK-NEXT:    ret void
591 ;
592 entry:
593   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
594   %0 = load float, float* %src, align 4
595   %sub = fadd fast float %0, -1.000000e+00
596   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
597   store float %sub, float* %dst, align 4
598   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
599   %1 = load float, float* %incdec.ptr, align 4
600   %sub3 = fadd fast float %1, -1.000000e+00
601   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
602   store float %sub3, float* %incdec.ptr1, align 4
603   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
604   %2 = load float, float* %incdec.ptr2, align 4
605   %sub6 = fadd fast float %2, -2.000000e+00
606   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
607   store float %sub6, float* %incdec.ptr4, align 4
608   %3 = load float, float* %incdec.ptr5, align 4
609   %sub9 = fadd fast float %3, -3.000000e+00
610   store float %sub9, float* %incdec.ptr7, align 4
611   ret void
612 }
613
614 define void @addsub0f(float* noalias %dst, float* noalias %src) {
615 ; CHECK-LABEL: @addsub0f(
616 ; CHECK-NEXT:  entry:
617 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
618 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
619 ; CHECK-NEXT:    [[SUB:%.*]] = fadd fast float [[TMP0]], -1.000000e+00
620 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
621 ; CHECK-NEXT:    store float [[SUB]], float* [[DST]], align 4
622 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
623 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
624 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
625 ; CHECK-NEXT:    store float [[TMP1]], float* [[INCDEC_PTR1]], align 4
626 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
627 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
628 ; CHECK-NEXT:    [[SUB5:%.*]] = fadd fast float [[TMP2]], -2.000000e+00
629 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
630 ; CHECK-NEXT:    store float [[SUB5]], float* [[INCDEC_PTR3]], align 4
631 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR4]], align 4
632 ; CHECK-NEXT:    [[SUB8:%.*]] = fsub fast float [[TMP3]], -3.000000e+00
633 ; CHECK-NEXT:    store float [[SUB8]], float* [[INCDEC_PTR6]], align 4
634 ; CHECK-NEXT:    ret void
635 ;
636 entry:
637   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
638   %0 = load float, float* %src, align 4
639   %sub = fadd fast float %0, -1.000000e+00
640   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
641   store float %sub, float* %dst, align 4
642   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
643   %1 = load float, float* %incdec.ptr, align 4
644   %incdec.ptr3 = getelementptr inbounds float, float* %dst, i64 2
645   store float %1, float* %incdec.ptr1, align 4
646   %incdec.ptr4 = getelementptr inbounds float, float* %src, i64 3
647   %2 = load float, float* %incdec.ptr2, align 4
648   %sub5 = fadd fast float %2, -2.000000e+00
649   %incdec.ptr6 = getelementptr inbounds float, float* %dst, i64 3
650   store float %sub5, float* %incdec.ptr3, align 4
651   %3 = load float, float* %incdec.ptr4, align 4
652   %sub8 = fsub fast float %3, -3.000000e+00
653   store float %sub8, float* %incdec.ptr6, align 4
654   ret void
655 }
656
657 define void @addsub1f(float* noalias %dst, float* noalias %src) {
658 ; CHECK-LABEL: @addsub1f(
659 ; CHECK-NEXT:  entry:
660 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
661 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
662 ; CHECK-NEXT:    [[SUB:%.*]] = fadd fast float [[TMP0]], -1.000000e+00
663 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
664 ; CHECK-NEXT:    store float [[SUB]], float* [[DST]], align 4
665 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
666 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
667 ; CHECK-NEXT:    [[SUB1:%.*]] = fsub fast float [[TMP1]], -1.000000e+00
668 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
669 ; CHECK-NEXT:    store float [[SUB1]], float* [[INCDEC_PTR1]], align 4
670 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
671 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
672 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
673 ; CHECK-NEXT:    store float [[TMP2]], float* [[INCDEC_PTR3]], align 4
674 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR4]], align 4
675 ; CHECK-NEXT:    [[SUB8:%.*]] = fsub fast float [[TMP3]], -3.000000e+00
676 ; CHECK-NEXT:    store float [[SUB8]], float* [[INCDEC_PTR6]], align 4
677 ; CHECK-NEXT:    ret void
678 ;
679 entry:
680   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
681   %0 = load float, float* %src, align 4
682   %sub = fadd fast float %0, -1.000000e+00
683   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
684   store float %sub, float* %dst, align 4
685   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
686   %1 = load float, float* %incdec.ptr, align 4
687   %sub1 = fsub fast float %1, -1.000000e+00
688   %incdec.ptr3 = getelementptr inbounds float, float* %dst, i64 2
689   store float %sub1, float* %incdec.ptr1, align 4
690   %incdec.ptr4 = getelementptr inbounds float, float* %src, i64 3
691   %2 = load float, float* %incdec.ptr2, align 4
692   %incdec.ptr6 = getelementptr inbounds float, float* %dst, i64 3
693   store float %2, float* %incdec.ptr3, align 4
694   %3 = load float, float* %incdec.ptr4, align 4
695   %sub8 = fsub fast float %3, -3.000000e+00
696   store float %sub8, float* %incdec.ptr6, align 4
697   ret void
698 }
699
700 define void @mulf(float* noalias %dst, float* noalias %src) {
701 ; CHECK-LABEL: @mulf(
702 ; CHECK-NEXT:  entry:
703 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
704 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
705 ; CHECK-NEXT:    [[SUB:%.*]] = fmul fast float [[TMP0]], 2.570000e+02
706 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
707 ; CHECK-NEXT:    store float [[SUB]], float* [[DST]], align 4
708 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
709 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
710 ; CHECK-NEXT:    [[SUB3:%.*]] = fmul fast float [[TMP1]], -3.000000e+00
711 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
712 ; CHECK-NEXT:    store float [[SUB3]], float* [[INCDEC_PTR1]], align 4
713 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
714 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
715 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
716 ; CHECK-NEXT:    store float [[TMP2]], float* [[INCDEC_PTR4]], align 4
717 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
718 ; CHECK-NEXT:    [[SUB9:%.*]] = fmul fast float [[TMP3]], -9.000000e+00
719 ; CHECK-NEXT:    store float [[SUB9]], float* [[INCDEC_PTR7]], align 4
720 ; CHECK-NEXT:    ret void
721 ;
722 entry:
723   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
724   %0 = load float, float* %src, align 4
725   %sub = fmul fast float %0, 2.570000e+02
726   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
727   store float %sub, float* %dst, align 4
728   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
729   %1 = load float, float* %incdec.ptr, align 4
730   %sub3 = fmul fast float %1, -3.000000e+00
731   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
732   store float %sub3, float* %incdec.ptr1, align 4
733   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
734   %2 = load float, float* %incdec.ptr2, align 4
735   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
736   store float %2, float* %incdec.ptr4, align 4
737   %3 = load float, float* %incdec.ptr5, align 4
738   %sub9 = fmul fast float %3, -9.000000e+00
739   store float %sub9, float* %incdec.ptr7, align 4
740   ret void
741 }
742
743 define void @add0fn(float* noalias %dst, float* noalias %src) {
744 ; CHECK-LABEL: @add0fn(
745 ; CHECK-NEXT:  entry:
746 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
747 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
748 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
749 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
750 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
751 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
752 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
753 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
754 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd <4 x float> <float 1.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, [[TMP1]]
755 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
756 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
757 ; CHECK-NEXT:    ret void
758 ;
759 entry:
760   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
761   %0 = load float, float* %src, align 4
762   %add = fadd float %0, 1.000000e+00
763   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
764   store float %add, float* %dst, align 4
765   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
766   %1 = load float, float* %incdec.ptr, align 4
767   %add3 = fadd float %1, 1.000000e+00
768   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
769   store float %add3, float* %incdec.ptr1, align 4
770   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
771   %2 = load float, float* %incdec.ptr2, align 4
772   %add6 = fadd float %2, 2.000000e+00
773   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
774   store float %add6, float* %incdec.ptr4, align 4
775   %3 = load float, float* %incdec.ptr5, align 4
776   %add9 = fadd float %3, 3.000000e+00
777   store float %add9, float* %incdec.ptr7, align 4
778   ret void
779 }
780
781 define void @add1fn(float* noalias %dst, float* noalias %src) {
782 ; CHECK-LABEL: @add1fn(
783 ; CHECK-NEXT:  entry:
784 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
785 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
786 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
787 ; CHECK-NEXT:    store float [[TMP0]], float* [[DST]], align 4
788 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
789 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
790 ; CHECK-NEXT:    [[ADD3:%.*]] = fadd float [[TMP1]], 1.000000e+00
791 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
792 ; CHECK-NEXT:    store float [[ADD3]], float* [[INCDEC_PTR1]], align 4
793 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
794 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
795 ; CHECK-NEXT:    [[ADD6:%.*]] = fadd float [[TMP2]], 2.000000e+00
796 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
797 ; CHECK-NEXT:    store float [[ADD6]], float* [[INCDEC_PTR4]], align 4
798 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
799 ; CHECK-NEXT:    [[ADD9:%.*]] = fadd float [[TMP3]], 3.000000e+00
800 ; CHECK-NEXT:    store float [[ADD9]], float* [[INCDEC_PTR7]], align 4
801 ; CHECK-NEXT:    ret void
802 ;
803 entry:
804   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
805   %0 = load float, float* %src, align 4
806   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
807   store float %0, float* %dst, align 4
808   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
809   %1 = load float, float* %incdec.ptr, align 4
810   %add3 = fadd float %1, 1.000000e+00
811   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
812   store float %add3, float* %incdec.ptr1, align 4
813   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
814   %2 = load float, float* %incdec.ptr2, align 4
815   %add6 = fadd float %2, 2.000000e+00
816   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
817   store float %add6, float* %incdec.ptr4, align 4
818   %3 = load float, float* %incdec.ptr5, align 4
819   %add9 = fadd float %3, 3.000000e+00
820   store float %add9, float* %incdec.ptr7, align 4
821   ret void
822 }
823
824 define void @sub0fn(float* noalias %dst, float* noalias %src) {
825 ; CHECK-LABEL: @sub0fn(
826 ; CHECK-NEXT:  entry:
827 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
828 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
829 ; CHECK-NEXT:    [[ADD:%.*]] = fadd fast float [[TMP0]], -1.000000e+00
830 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
831 ; CHECK-NEXT:    store float [[ADD]], float* [[DST]], align 4
832 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
833 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
834 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
835 ; CHECK-NEXT:    store float [[TMP1]], float* [[INCDEC_PTR1]], align 4
836 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
837 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
838 ; CHECK-NEXT:    [[ADD6:%.*]] = fadd float [[TMP2]], -2.000000e+00
839 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
840 ; CHECK-NEXT:    store float [[ADD6]], float* [[INCDEC_PTR4]], align 4
841 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
842 ; CHECK-NEXT:    [[ADD9:%.*]] = fadd float [[TMP3]], -3.000000e+00
843 ; CHECK-NEXT:    store float [[ADD9]], float* [[INCDEC_PTR7]], align 4
844 ; CHECK-NEXT:    ret void
845 ;
846 entry:
847   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
848   %0 = load float, float* %src, align 4
849   %add = fadd fast float %0, -1.000000e+00
850   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
851   store float %add, float* %dst, align 4
852   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
853   %1 = load float, float* %incdec.ptr, align 4
854   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
855   store float %1, float* %incdec.ptr1, align 4
856   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
857   %2 = load float, float* %incdec.ptr2, align 4
858   %add6 = fadd float %2, -2.000000e+00
859   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
860   store float %add6, float* %incdec.ptr4, align 4
861   %3 = load float, float* %incdec.ptr5, align 4
862   %add9 = fadd float %3, -3.000000e+00
863   store float %add9, float* %incdec.ptr7, align 4
864   ret void
865 }
866
867 define void @sub1fn(float* noalias %dst, float* noalias %src) {
868 ; CHECK-LABEL: @sub1fn(
869 ; CHECK-NEXT:  entry:
870 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
871 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
872 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
873 ; CHECK-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
874 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
875 ; CHECK-NEXT:    [[INCDEC_PTR6:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
876 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
877 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
878 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd <4 x float> <float 4.000000e+00, float -1.000000e+00, float -2.000000e+00, float -3.000000e+00>, [[TMP1]]
879 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
880 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
881 ; CHECK-NEXT:    ret void
882 ;
883 entry:
884   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
885   %0 = load float, float* %src, align 4
886   %add = fadd float %0, 4.000000e+00
887   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
888   store float %add, float* %dst, align 4
889   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
890   %1 = load float, float* %incdec.ptr, align 4
891   %sub = fadd float %1, -1.000000e+00
892   %incdec.ptr3 = getelementptr inbounds float, float* %dst, i64 2
893   store float %sub, float* %incdec.ptr1, align 4
894   %incdec.ptr4 = getelementptr inbounds float, float* %src, i64 3
895   %2 = load float, float* %incdec.ptr2, align 4
896   %sub5 = fadd float %2, -2.000000e+00
897   %incdec.ptr6 = getelementptr inbounds float, float* %dst, i64 3
898   store float %sub5, float* %incdec.ptr3, align 4
899   %3 = load float, float* %incdec.ptr4, align 4
900   %sub8 = fadd float %3, -3.000000e+00
901   store float %sub8, float* %incdec.ptr6, align 4
902   ret void
903 }
904
905 define void @sub2fn(float* noalias %dst, float* noalias %src) {
906 ; CHECK-LABEL: @sub2fn(
907 ; CHECK-NEXT:  entry:
908 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
909 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
910 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
911 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
912 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
913 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
914 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float* [[SRC]] to <4 x float>*
915 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[TMP0]], align 4
916 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd <4 x float> <float -1.000000e+00, float -1.000000e+00, float -2.000000e+00, float -3.000000e+00>, [[TMP1]]
917 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[DST]] to <4 x float>*
918 ; CHECK-NEXT:    store <4 x float> [[TMP2]], <4 x float>* [[TMP3]], align 4
919 ; CHECK-NEXT:    ret void
920 ;
921 entry:
922   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
923   %0 = load float, float* %src, align 4
924   %sub = fadd float %0, -1.000000e+00
925   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
926   store float %sub, float* %dst, align 4
927   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
928   %1 = load float, float* %incdec.ptr, align 4
929   %sub3 = fadd float %1, -1.000000e+00
930   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
931   store float %sub3, float* %incdec.ptr1, align 4
932   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
933   %2 = load float, float* %incdec.ptr2, align 4
934   %sub6 = fadd float %2, -2.000000e+00
935   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
936   store float %sub6, float* %incdec.ptr4, align 4
937   %3 = load float, float* %incdec.ptr5, align 4
938   %sub9 = fadd float %3, -3.000000e+00
939   store float %sub9, float* %incdec.ptr7, align 4
940   ret void
941 }
942
943 define void @mulfn(float* noalias %dst, float* noalias %src) {
944 ; CHECK-LABEL: @mulfn(
945 ; CHECK-NEXT:  entry:
946 ; CHECK-NEXT:    [[INCDEC_PTR:%.*]] = getelementptr inbounds float, float* [[SRC:%.*]], i64 1
947 ; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[SRC]], align 4
948 ; CHECK-NEXT:    [[SUB:%.*]] = fmul float [[TMP0]], 2.570000e+02
949 ; CHECK-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds float, float* [[DST:%.*]], i64 1
950 ; CHECK-NEXT:    store float [[SUB]], float* [[DST]], align 4
951 ; CHECK-NEXT:    [[INCDEC_PTR2:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 2
952 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[INCDEC_PTR]], align 4
953 ; CHECK-NEXT:    [[SUB3:%.*]] = fmul float [[TMP1]], -3.000000e+00
954 ; CHECK-NEXT:    [[INCDEC_PTR4:%.*]] = getelementptr inbounds float, float* [[DST]], i64 2
955 ; CHECK-NEXT:    store float [[SUB3]], float* [[INCDEC_PTR1]], align 4
956 ; CHECK-NEXT:    [[INCDEC_PTR5:%.*]] = getelementptr inbounds float, float* [[SRC]], i64 3
957 ; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[INCDEC_PTR2]], align 4
958 ; CHECK-NEXT:    [[INCDEC_PTR7:%.*]] = getelementptr inbounds float, float* [[DST]], i64 3
959 ; CHECK-NEXT:    store float [[TMP2]], float* [[INCDEC_PTR4]], align 4
960 ; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[INCDEC_PTR5]], align 4
961 ; CHECK-NEXT:    [[SUB9:%.*]] = fmul fast float [[TMP3]], -9.000000e+00
962 ; CHECK-NEXT:    store float [[SUB9]], float* [[INCDEC_PTR7]], align 4
963 ; CHECK-NEXT:    ret void
964 ;
965 entry:
966   %incdec.ptr = getelementptr inbounds float, float* %src, i64 1
967   %0 = load float, float* %src, align 4
968   %sub = fmul float %0, 2.570000e+02
969   %incdec.ptr1 = getelementptr inbounds float, float* %dst, i64 1
970   store float %sub, float* %dst, align 4
971   %incdec.ptr2 = getelementptr inbounds float, float* %src, i64 2
972   %1 = load float, float* %incdec.ptr, align 4
973   %sub3 = fmul float %1, -3.000000e+00
974   %incdec.ptr4 = getelementptr inbounds float, float* %dst, i64 2
975   store float %sub3, float* %incdec.ptr1, align 4
976   %incdec.ptr5 = getelementptr inbounds float, float* %src, i64 3
977   %2 = load float, float* %incdec.ptr2, align 4
978   %incdec.ptr7 = getelementptr inbounds float, float* %dst, i64 3
979   store float %2, float* %incdec.ptr4, align 4
980   %3 = load float, float* %incdec.ptr5, align 4
981   %sub9 = fmul fast float %3, -9.000000e+00
982   store float %sub9, float* %incdec.ptr7, align 4
983   ret void
984 }