Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / AArch64 / vec3-reorder-reshuffle.ll
blob5707e143ad5515bf62eead4e3b833bbff145372e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: opt -passes=slp-vectorizer -mtriple=arm64-apple-ios -S %s | FileCheck %s
4 %struct.zot = type { i32, i32, i32 }
6 define i1 @reorder_results(ptr %arg, i1 %arg1, ptr %arg2, i64 %arg3, ptr %arg4) {
7 ; CHECK-LABEL: define i1 @reorder_results(
8 ; CHECK-SAME: ptr [[ARG:%.*]], i1 [[ARG1:%.*]], ptr [[ARG2:%.*]], i64 [[ARG3:%.*]], ptr [[ARG4:%.*]]) {
9 ; CHECK-NEXT:  bb:
10 ; CHECK-NEXT:    [[LOAD:%.*]] = load ptr, ptr [[ARG4]], align 8
11 ; CHECK-NEXT:    [[LOAD4:%.*]] = load i32, ptr [[LOAD]], align 4
12 ; CHECK-NEXT:    [[GETELEMENTPTR:%.*]] = getelementptr i8, ptr [[LOAD]], i64 4
13 ; CHECK-NEXT:    [[LOAD5:%.*]] = load i32, ptr [[GETELEMENTPTR]], align 4
14 ; CHECK-NEXT:    [[GETELEMENTPTR6:%.*]] = getelementptr i8, ptr [[LOAD]], i64 8
15 ; CHECK-NEXT:    [[LOAD7:%.*]] = load i32, ptr [[GETELEMENTPTR6]], align 4
16 ; CHECK-NEXT:    br i1 [[ARG1]], label [[BB12:%.*]], label [[BB9:%.*]]
17 ; CHECK:       bb8:
18 ; CHECK-NEXT:    ret i1 false
19 ; CHECK:       bb9:
20 ; CHECK-NEXT:    [[FREEZE:%.*]] = freeze ptr [[ARG]]
21 ; CHECK-NEXT:    store i32 [[LOAD4]], ptr [[FREEZE]], align 4
22 ; CHECK-NEXT:    [[GETELEMENTPTR10:%.*]] = getelementptr i8, ptr [[FREEZE]], i64 4
23 ; CHECK-NEXT:    store i32 [[LOAD7]], ptr [[GETELEMENTPTR10]], align 4
24 ; CHECK-NEXT:    [[GETELEMENTPTR11:%.*]] = getelementptr i8, ptr [[FREEZE]], i64 8
25 ; CHECK-NEXT:    store i32 [[LOAD5]], ptr [[GETELEMENTPTR11]], align 4
26 ; CHECK-NEXT:    br label [[BB8:%.*]]
27 ; CHECK:       bb12:
28 ; CHECK-NEXT:    [[GETELEMENTPTR13:%.*]] = getelementptr [[STRUCT_ZOT:%.*]], ptr [[ARG2]], i64 [[ARG3]]
29 ; CHECK-NEXT:    store i32 [[LOAD4]], ptr [[GETELEMENTPTR13]], align 4
30 ; CHECK-NEXT:    [[GETELEMENTPTR14:%.*]] = getelementptr i8, ptr [[GETELEMENTPTR13]], i64 4
31 ; CHECK-NEXT:    store i32 [[LOAD7]], ptr [[GETELEMENTPTR14]], align 4
32 ; CHECK-NEXT:    [[GETELEMENTPTR15:%.*]] = getelementptr i8, ptr [[GETELEMENTPTR13]], i64 8
33 ; CHECK-NEXT:    store i32 [[LOAD5]], ptr [[GETELEMENTPTR15]], align 4
34 ; CHECK-NEXT:    br label [[BB8]]
36 bb:
37   %load = load ptr, ptr %arg4, align 8
38   %load4 = load i32, ptr %load, align 4
39   %getelementptr = getelementptr i8, ptr %load, i64 4
40   %load5 = load i32, ptr %getelementptr, align 4
41   %getelementptr6 = getelementptr i8, ptr %load, i64 8
42   %load7 = load i32, ptr %getelementptr6, align 4
43   br i1 %arg1, label %bb12, label %bb9
45 bb8:                                              ; preds = %bb12, %bb9
46   ret i1 false
48 bb9:                                              ; preds = %bb
49   %freeze = freeze ptr %arg
50   store i32 %load4, ptr %freeze, align 4
51   %getelementptr10 = getelementptr i8, ptr %freeze, i64 4
52   store i32 %load7, ptr %getelementptr10, align 4
53   %getelementptr11 = getelementptr i8, ptr %freeze, i64 8
54   store i32 %load5, ptr %getelementptr11, align 4
55   br label %bb8
57 bb12:                                             ; preds = %bb
58   %getelementptr13 = getelementptr %struct.zot, ptr %arg2, i64 %arg3
59   store i32 %load4, ptr %getelementptr13, align 4
60   %getelementptr14 = getelementptr i8, ptr %getelementptr13, i64 4
61   store i32 %load7, ptr %getelementptr14, align 4
62   %getelementptr15 = getelementptr i8, ptr %getelementptr13, i64 8
63   store i32 %load5, ptr %getelementptr15, align 4
64   br label %bb8
67 define void @extract_mask(ptr %object, double %conv503, double %conv520) {
68 ; CHECK-LABEL: define void @extract_mask(
69 ; CHECK-SAME: ptr [[OBJECT:%.*]], double [[CONV503:%.*]], double [[CONV520:%.*]]) {
70 ; CHECK-NEXT:  entry:
71 ; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[OBJECT]], align 8
72 ; CHECK-NEXT:    [[BBOX483:%.*]] = getelementptr float, ptr [[TMP0]]
73 ; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x float>, ptr [[BBOX483]], align 8
74 ; CHECK-NEXT:    [[TMP2:%.*]] = fpext <2 x float> [[TMP1]] to <2 x double>
75 ; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> poison, <2 x i32> <i32 1, i32 0>
76 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x double> [[TMP3]], double [[CONV503]], i32 0
77 ; CHECK-NEXT:    [[TMP5:%.*]] = fcmp ogt <2 x double> [[TMP4]], <double 0.000000e+00, double -2.000000e+10>
78 ; CHECK-NEXT:    [[TMP6:%.*]] = select <2 x i1> [[TMP5]], <2 x double> [[TMP3]], <2 x double> <double 0.000000e+00, double -2.000000e+10>
79 ; CHECK-NEXT:    [[TMP7:%.*]] = fsub <2 x double> zeroinitializer, [[TMP6]]
80 ; CHECK-NEXT:    [[TMP8:%.*]] = fptrunc <2 x double> [[TMP7]] to <2 x float>
81 ; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x float> [[TMP8]], i32 0
82 ; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x float> [[TMP8]], i32 1
83 ; CHECK-NEXT:    [[MUL646:%.*]] = fmul float [[TMP9]], [[TMP10]]
84 ; CHECK-NEXT:    [[CMP663:%.*]] = fcmp olt float [[MUL646]], 0.000000e+00
85 ; CHECK-NEXT:    br i1 [[CMP663]], label [[IF_THEN665:%.*]], label [[IF_END668:%.*]]
86 ; CHECK:       if.then665:
87 ; CHECK-NEXT:    [[ARRAYIDX656:%.*]] = getelementptr float, ptr [[OBJECT]], i64 10
88 ; CHECK-NEXT:    [[BBOX651:%.*]] = getelementptr float, ptr [[OBJECT]]
89 ; CHECK-NEXT:    [[CONV621:%.*]] = fptrunc double [[CONV520]] to float
90 ; CHECK-NEXT:    [[TMP11:%.*]] = shufflevector <2 x double> [[TMP6]], <2 x double> poison, <2 x i32> <i32 poison, i32 0>
91 ; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <2 x double> [[TMP11]], double [[CONV503]], i32 0
92 ; CHECK-NEXT:    [[TMP13:%.*]] = fptrunc <2 x double> [[TMP12]] to <2 x float>
93 ; CHECK-NEXT:    store <2 x float> [[TMP13]], ptr [[BBOX651]], align 8
94 ; CHECK-NEXT:    [[BBOX_SROA_8_0_BBOX666_SROA_IDX:%.*]] = getelementptr float, ptr [[OBJECT]], i64 2
95 ; CHECK-NEXT:    store float [[CONV621]], ptr [[BBOX_SROA_8_0_BBOX666_SROA_IDX]], align 8
96 ; CHECK-NEXT:    store <2 x float> [[TMP8]], ptr [[ARRAYIDX656]], align 8
97 ; CHECK-NEXT:    br label [[IF_END668]]
98 ; CHECK:       if.end668:
99 ; CHECK-NEXT:    ret void
101 entry:
102   %0 = load ptr, ptr %object, align 8
103   %bbox483 = getelementptr float, ptr %0
104   %1 = load float, ptr %bbox483, align 8
105   %conv486 = fpext float %1 to double
106   %cmp487 = fcmp ogt double %conv486, -2.000000e+10
107   %conv486.2 = select i1 %cmp487, double %conv486, double -2.000000e+10
108   %arrayidx502 = getelementptr float, ptr %0, i64 1
109   %2 = load float, ptr %arrayidx502, align 4
110   %conv5033 = fpext float %2 to double
111   %cmp504 = fcmp ogt double %conv503, 0.000000e+00
112   %cond514 = select i1 %cmp504, double %conv5033, double 0.000000e+00
113   %sub626 = fsub double 0.000000e+00, %conv486.2
114   %conv627 = fptrunc double %sub626 to float
115   %sub632 = fsub double 0.000000e+00, %cond514
116   %conv633 = fptrunc double %sub632 to float
117   %mul646 = fmul float %conv633, %conv627
118   %cmp663 = fcmp olt float %mul646, 0.000000e+00
119   br i1 %cmp663, label %if.then665, label %if.end668
121 if.then665:                                       ; preds = %entry
122   %arrayidx656 = getelementptr float, ptr %object, i64 10
123   %lengths652 = getelementptr float, ptr %object, i64 11
124   %bbox651 = getelementptr float, ptr %object
125   %conv621 = fptrunc double %conv520 to float
126   %conv617 = fptrunc double %cond514 to float
127   %conv613 = fptrunc double %conv503 to float
128   store float %conv613, ptr %bbox651, align 8
129   %bbox.sroa.6.0.bbox666.sroa_idx = getelementptr float, ptr %object, i64 1
130   store float %conv617, ptr %bbox.sroa.6.0.bbox666.sroa_idx, align 4
131   %bbox.sroa.8.0.bbox666.sroa_idx = getelementptr float, ptr %object, i64 2
132   store float %conv621, ptr %bbox.sroa.8.0.bbox666.sroa_idx, align 8
133   store float %conv627, ptr %lengths652, align 4
134   store float %conv633, ptr %arrayidx656, align 8
135   br label %if.end668
137 if.end668:                                        ; preds = %if.then665, %entry
138   ret void
141 define void @gather_2(ptr %mat1, float %0, float %1) {
142 ; CHECK-LABEL: define void @gather_2(
143 ; CHECK-SAME: ptr [[MAT1:%.*]], float [[TMP0:%.*]], float [[TMP1:%.*]]) {
144 ; CHECK-NEXT:  entry:
145 ; CHECK-NEXT:    [[TMP2:%.*]] = call float @llvm.fmuladd.f32(float [[TMP0]], float 0.000000e+00, float 0.000000e+00)
146 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> poison, float [[TMP1]], i32 0
147 ; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x float> [[TMP3]], float [[TMP0]], i32 1
148 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
149 ; CHECK-NEXT:    [[TMP6:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> zeroinitializer)
150 ; CHECK-NEXT:    [[TMP7:%.*]] = fmul float [[TMP2]], 0.000000e+00
151 ; CHECK-NEXT:    [[ARRAYIDX163:%.*]] = getelementptr [4 x [4 x float]], ptr [[MAT1]], i64 0, i64 1
152 ; CHECK-NEXT:    [[ARRAYIDX2_I_I_I278:%.*]] = getelementptr [4 x [4 x float]], ptr [[MAT1]], i64 0, i64 1, i64 1
153 ; CHECK-NEXT:    store float [[TMP7]], ptr [[ARRAYIDX163]], align 4
154 ; CHECK-NEXT:    [[TMP8:%.*]] = fmul <2 x float> [[TMP6]], zeroinitializer
155 ; CHECK-NEXT:    store <2 x float> [[TMP8]], ptr [[ARRAYIDX2_I_I_I278]], align 4
156 ; CHECK-NEXT:    ret void
158 entry:
159   %2 = call float @llvm.fmuladd.f32(float %0, float 0.000000e+00, float 0.000000e+00)
160   %3 = call float @llvm.fmuladd.f32(float %1, float %0, float 0.000000e+00)
161   %4 = call float @llvm.fmuladd.f32(float %0, float %1, float 0.000000e+00)
162   %5 = fmul float %2, 0.000000e+00
163   %6 = fmul float %3, 0.000000e+00
164   %7 = fmul float %4, 0.000000e+00
165   %arrayidx163 = getelementptr [4 x [4 x float]], ptr %mat1, i64 0, i64 1
166   %arrayidx2.i.i.i278 = getelementptr [4 x [4 x float]], ptr %mat1, i64 0, i64 1, i64 1
167   %arrayidx5.i.i.i280 = getelementptr [4 x [4 x float]], ptr %mat1, i64 0, i64 1, i64 2
168   store float %5, ptr %arrayidx163, align 4
169   store float %6, ptr %arrayidx2.i.i.i278, align 4
170   store float %7, ptr %arrayidx5.i.i.i280, align 4
171   ret void
174 define i32 @reorder_indices_1(float %0) {
175 ; CHECK-LABEL: define i32 @reorder_indices_1(
176 ; CHECK-SAME: float [[TMP0:%.*]]) {
177 ; CHECK-NEXT:  entry:
178 ; CHECK-NEXT:    [[NOR1:%.*]] = alloca [0 x [3 x float]], i32 0, align 4
179 ; CHECK-NEXT:    [[ARRAYIDX2_I265:%.*]] = getelementptr float, ptr [[NOR1]], i64 2
180 ; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[ARRAYIDX2_I265]], align 4
181 ; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x float>, ptr [[NOR1]], align 4
182 ; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x float> [[TMP2]], i32 0
183 ; CHECK-NEXT:    [[TMP4:%.*]] = fneg float [[TMP3]]
184 ; CHECK-NEXT:    [[NEG11_I:%.*]] = fmul float [[TMP4]], [[TMP0]]
185 ; CHECK-NEXT:    [[TMP5:%.*]] = call float @llvm.fmuladd.f32(float [[TMP1]], float 0.000000e+00, float [[NEG11_I]])
186 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x float> poison, float [[TMP1]], i32 0
187 ; CHECK-NEXT:    [[TMP7:%.*]] = shufflevector <2 x float> [[TMP6]], <2 x float> [[TMP2]], <2 x i32> <i32 0, i32 3>
188 ; CHECK-NEXT:    [[TMP8:%.*]] = fneg <2 x float> [[TMP7]]
189 ; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <2 x float> poison, float [[TMP0]], i32 0
190 ; CHECK-NEXT:    [[TMP10:%.*]] = shufflevector <2 x float> [[TMP9]], <2 x float> poison, <2 x i32> zeroinitializer
191 ; CHECK-NEXT:    [[TMP11:%.*]] = fmul <2 x float> [[TMP8]], [[TMP10]]
192 ; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <2 x float> [[TMP11]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
193 ; CHECK-NEXT:    [[TMP13:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP2]], <2 x float> zeroinitializer, <2 x float> [[TMP12]])
194 ; CHECK-NEXT:    [[TMP14:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP10]], <2 x float> [[TMP13]], <2 x float> zeroinitializer)
195 ; CHECK-NEXT:    [[TMP15:%.*]] = call float @llvm.fmuladd.f32(float [[TMP0]], float [[TMP5]], float 0.000000e+00)
196 ; CHECK-NEXT:    [[TMP16:%.*]] = fmul <2 x float> [[TMP14]], zeroinitializer
197 ; CHECK-NEXT:    [[MUL6_I_I_I:%.*]] = fmul float [[TMP15]], 0.000000e+00
198 ; CHECK-NEXT:    store <2 x float> [[TMP16]], ptr [[NOR1]], align 4
199 ; CHECK-NEXT:    store float [[MUL6_I_I_I]], ptr [[ARRAYIDX2_I265]], align 4
200 ; CHECK-NEXT:    ret i32 0
202 entry:
203   %nor1 = alloca [0 x [3 x float]], i32 0, align 4
204   %arrayidx.i = getelementptr float, ptr %nor1, i64 1
205   %1 = load float, ptr %arrayidx.i, align 4
206   %arrayidx2.i265 = getelementptr float, ptr %nor1, i64 2
207   %2 = load float, ptr %arrayidx2.i265, align 4
208   %3 = fneg float %2
209   %neg.i267 = fmul float %3, %0
210   %4 = call float @llvm.fmuladd.f32(float %1, float 0.000000e+00, float %neg.i267)
211   %5 = load float, ptr %nor1, align 4
212   %6 = fneg float %5
213   %neg11.i = fmul float %6, %0
214   %7 = call float @llvm.fmuladd.f32(float %2, float 0.000000e+00, float %neg11.i)
215   %8 = fneg float %1
216   %neg18.i = fmul float %8, %0
217   %9 = call float @llvm.fmuladd.f32(float %5, float 0.000000e+00, float %neg18.i)
218   %10 = call float @llvm.fmuladd.f32(float %0, float %9, float 0.000000e+00)
219   %11 = call float @llvm.fmuladd.f32(float %0, float %4, float 0.000000e+00)
220   %12 = call float @llvm.fmuladd.f32(float %0, float %7, float 0.000000e+00)
221   %mul.i.i.i = fmul float %10, 0.000000e+00
222   %mul3.i.i.i = fmul float %11, 0.000000e+00
223   %mul6.i.i.i = fmul float %12, 0.000000e+00
224   store float %mul.i.i.i, ptr %nor1, align 4
225   store float %mul3.i.i.i, ptr %arrayidx.i, align 4
226   store float %mul6.i.i.i, ptr %arrayidx2.i265, align 4
227   ret i32 0
230 define void @reorder_indices_2(ptr %spoint) {
231 ; CHECK-LABEL: define void @reorder_indices_2(
232 ; CHECK-SAME: ptr [[SPOINT:%.*]]) {
233 ; CHECK-NEXT:  entry:
234 ; CHECK-NEXT:    [[TMP0:%.*]] = extractelement <3 x float> zeroinitializer, i64 0
235 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call float @llvm.fmuladd.f32(float [[TMP0]], float 0.000000e+00, float 0.000000e+00)
236 ; CHECK-NEXT:    [[MUL4_I461:%.*]] = fmul float [[TMP1]], 0.000000e+00
237 ; CHECK-NEXT:    [[DSCO:%.*]] = getelementptr float, ptr [[SPOINT]], i64 0
238 ; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x float> zeroinitializer)
239 ; CHECK-NEXT:    [[TMP3:%.*]] = fmul <2 x float> [[TMP2]], zeroinitializer
240 ; CHECK-NEXT:    store <2 x float> [[TMP3]], ptr [[DSCO]], align 4
241 ; CHECK-NEXT:    [[ARRAYIDX5_I476:%.*]] = getelementptr float, ptr [[SPOINT]], i64 2
242 ; CHECK-NEXT:    store float [[MUL4_I461]], ptr [[ARRAYIDX5_I476]], align 4
243 ; CHECK-NEXT:    ret void
245 entry:
246   %0 = extractelement <3 x float> zeroinitializer, i64 1
247   %1 = extractelement <3 x float> zeroinitializer, i64 2
248   %2 = extractelement <3 x float> zeroinitializer, i64 0
249   %3 = tail call float @llvm.fmuladd.f32(float %0, float 0.000000e+00, float 0.000000e+00)
250   %4 = tail call float @llvm.fmuladd.f32(float %1, float 0.000000e+00, float 0.000000e+00)
251   %5 = tail call float @llvm.fmuladd.f32(float %2, float 0.000000e+00, float 0.000000e+00)
252   %mul.i457 = fmul float %3, 0.000000e+00
253   %mul2.i459 = fmul float %4, 0.000000e+00
254   %mul4.i461 = fmul float %5, 0.000000e+00
255   %dsco = getelementptr float, ptr %spoint, i64 0
256   store float %mul.i457, ptr %dsco, align 4
257   %arrayidx3.i474 = getelementptr float, ptr %spoint, i64 1
258   store float %mul2.i459, ptr %arrayidx3.i474, align 4
259   %arrayidx5.i476 = getelementptr float, ptr %spoint, i64 2
260   store float %mul4.i461, ptr %arrayidx5.i476, align 4
261   ret void
264 define void @reorder_indices_2x_load(ptr %png_ptr, ptr %info_ptr) {
265 ; CHECK-LABEL: define void @reorder_indices_2x_load(
266 ; CHECK-SAME: ptr [[PNG_PTR:%.*]], ptr [[INFO_PTR:%.*]]) {
267 ; CHECK-NEXT:  entry:
268 ; CHECK-NEXT:    [[BIT_DEPTH:%.*]] = getelementptr i8, ptr [[INFO_PTR]], i64 0
269 ; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[BIT_DEPTH]], align 4
270 ; CHECK-NEXT:    [[COLOR_TYPE:%.*]] = getelementptr i8, ptr [[INFO_PTR]], i64 1
271 ; CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr [[COLOR_TYPE]], align 1
272 ; CHECK-NEXT:    [[BIT_DEPTH37_I:%.*]] = getelementptr i8, ptr [[PNG_PTR]], i64 11
273 ; CHECK-NEXT:    store i8 [[TMP0]], ptr [[BIT_DEPTH37_I]], align 1
274 ; CHECK-NEXT:    [[COLOR_TYPE39_I:%.*]] = getelementptr i8, ptr [[PNG_PTR]], i64 10
275 ; CHECK-NEXT:    store i8 [[TMP1]], ptr [[COLOR_TYPE39_I]], align 2
276 ; CHECK-NEXT:    [[USR_BIT_DEPTH_I:%.*]] = getelementptr i8, ptr [[PNG_PTR]], i64 12
277 ; CHECK-NEXT:    store i8 [[TMP0]], ptr [[USR_BIT_DEPTH_I]], align 8
278 ; CHECK-NEXT:    ret void
280 entry:
281   %bit_depth = getelementptr i8, ptr %info_ptr, i64 0
282   %0 = load i8, ptr %bit_depth, align 4
283   %color_type = getelementptr i8, ptr %info_ptr, i64 1
284   %1 = load i8, ptr %color_type, align 1
285   %bit_depth37.i = getelementptr i8, ptr %png_ptr, i64 11
286   store i8 %0, ptr %bit_depth37.i, align 1
287   %color_type39.i = getelementptr i8, ptr %png_ptr, i64 10
288   store i8 %1, ptr %color_type39.i, align 2
289   %usr_bit_depth.i = getelementptr i8, ptr %png_ptr, i64 12
290   store i8 %0, ptr %usr_bit_depth.i, align 8
291   ret void
294 define void @reuse_shuffle_indidces_1(ptr %col, float %0, float %1) {
295 ; CHECK-LABEL: define void @reuse_shuffle_indidces_1(
296 ; CHECK-SAME: ptr [[COL:%.*]], float [[TMP0:%.*]], float [[TMP1:%.*]]) {
297 ; CHECK-NEXT:  entry:
298 ; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x float> poison, float [[TMP1]], i32 0
299 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[TMP0]], i32 1
300 ; CHECK-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP3]], zeroinitializer
301 ; CHECK-NEXT:    [[TMP5:%.*]] = fadd <2 x float> [[TMP4]], zeroinitializer
302 ; CHECK-NEXT:    store <2 x float> [[TMP5]], ptr [[COL]], align 4
303 ; CHECK-NEXT:    [[ARRAYIDX33:%.*]] = getelementptr float, ptr [[COL]], i64 2
304 ; CHECK-NEXT:    [[MUL38:%.*]] = fmul float [[TMP0]], 0.000000e+00
305 ; CHECK-NEXT:    [[TMP6:%.*]] = fadd float [[MUL38]], 0.000000e+00
306 ; CHECK-NEXT:    store float [[TMP6]], ptr [[ARRAYIDX33]], align 4
307 ; CHECK-NEXT:    ret void
309 entry:
310   %mul24 = fmul float %1, 0.000000e+00
311   %2 = fadd float %mul24, 0.000000e+00
312   store float %2, ptr %col, align 4
313   %arrayidx26 = getelementptr float, ptr %col, i64 1
314   %mul31 = fmul float %0, 0.000000e+00
315   %3 = fadd float %mul31, 0.000000e+00
316   store float %3, ptr %arrayidx26, align 4
317   %arrayidx33 = getelementptr float, ptr %col, i64 2
318   %mul38 = fmul float %0, 0.000000e+00
319   %4 = fadd float %mul38, 0.000000e+00
320   store float %4, ptr %arrayidx33, align 4
321   ret void
324 define void @reuse_shuffle_indices_2(ptr %inertia, double %0) {
325 ; CHECK-LABEL: define void @reuse_shuffle_indices_2(
326 ; CHECK-SAME: ptr [[INERTIA:%.*]], double [[TMP0:%.*]]) {
327 ; CHECK-NEXT:  entry:
328 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[TMP0]], i32 0
329 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x double> [[TMP1]], <2 x double> poison, <2 x i32> zeroinitializer
330 ; CHECK-NEXT:    [[TMP3:%.*]] = fptrunc <2 x double> [[TMP2]] to <2 x float>
331 ; CHECK-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP3]], zeroinitializer
332 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 1, i32 poison>
333 ; CHECK-NEXT:    [[TMP6:%.*]] = fadd <4 x float> [[TMP5]], <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
334 ; CHECK-NEXT:    [[TMP7:%.*]] = fmul <4 x float> [[TMP6]], <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
335 ; CHECK-NEXT:    [[TMP8:%.*]] = fadd <4 x float> [[TMP7]], <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
336 ; CHECK-NEXT:    [[TMP9:%.*]] = shufflevector <4 x float> [[TMP8]], <4 x float> poison, <3 x i32> <i32 0, i32 1, i32 2>
337 ; CHECK-NEXT:    store <3 x float> [[TMP9]], ptr [[INERTIA]], align 4
338 ; CHECK-NEXT:    ret void
340 entry:
341   %1 = insertelement <2 x double> poison, double %0, i32 0
342   %2 = shufflevector <2 x double> %1, <2 x double> poison, <2 x i32> zeroinitializer
343   %3 = fptrunc <2 x double> %2 to <2 x float>
344   %4 = fmul <2 x float> %3, zeroinitializer
345   %5 = shufflevector <2 x float> %4, <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 1, i32 poison>
346   %6 = fadd <4 x float> %5, <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
347   %7 = fmul <4 x float> %6, <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
348   %8 = fadd <4 x float> %7, <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float undef>
349   %9 = shufflevector <4 x float> %8, <4 x float> poison, <3 x i32> <i32 0, i32 1, i32 2>
350   store <3 x float> %9, ptr %inertia, align 4
351   ret void
354 define void @reuse_shuffle_indices_cost_crash_2(ptr %bezt, float %0) {
355 ; CHECK-LABEL: define void @reuse_shuffle_indices_cost_crash_2(
356 ; CHECK-SAME: ptr [[BEZT:%.*]], float [[TMP0:%.*]]) {
357 ; CHECK-NEXT:  entry:
358 ; CHECK-NEXT:    [[FNEG:%.*]] = fmul float [[TMP0]], 0.000000e+00
359 ; CHECK-NEXT:    [[TMP1:%.*]] = tail call float @llvm.fmuladd.f32(float [[TMP0]], float [[FNEG]], float 0.000000e+00)
360 ; CHECK-NEXT:    store float [[TMP1]], ptr [[BEZT]], align 4
361 ; CHECK-NEXT:    [[TMP2:%.*]] = tail call float @llvm.fmuladd.f32(float [[TMP0]], float [[FNEG]], float 0.000000e+00)
362 ; CHECK-NEXT:    [[ARRAYIDX5_I:%.*]] = getelementptr float, ptr [[BEZT]], i64 1
363 ; CHECK-NEXT:    store float [[TMP2]], ptr [[ARRAYIDX5_I]], align 4
364 ; CHECK-NEXT:    [[TMP3:%.*]] = tail call float @llvm.fmuladd.f32(float [[FNEG]], float 0.000000e+00, float 0.000000e+00)
365 ; CHECK-NEXT:    [[ARRAYIDX8_I831:%.*]] = getelementptr float, ptr [[BEZT]], i64 2
366 ; CHECK-NEXT:    store float [[TMP3]], ptr [[ARRAYIDX8_I831]], align 4
367 ; CHECK-NEXT:    ret void
369 entry:
370   %fneg = fmul float %0, 0.000000e+00
371   %1 = tail call float @llvm.fmuladd.f32(float %0, float %fneg, float 0.000000e+00)
372   store float %1, ptr %bezt, align 4
373   %2 = tail call float @llvm.fmuladd.f32(float %0, float %fneg, float 0.000000e+00)
374   %arrayidx5.i = getelementptr float, ptr %bezt, i64 1
375   store float %2, ptr %arrayidx5.i, align 4
376   %3 = tail call float @llvm.fmuladd.f32(float %fneg, float 0.000000e+00, float 0.000000e+00)
377   %arrayidx8.i831 = getelementptr float, ptr %bezt, i64 2
378   store float %3, ptr %arrayidx8.i831, align 4
379   ret void
382 define void @reuse_shuffle_indices_cost_crash_3(ptr %m, double %conv, double %conv2) {
383 ; CHECK-LABEL: define void @reuse_shuffle_indices_cost_crash_3(
384 ; CHECK-SAME: ptr [[M:%.*]], double [[CONV:%.*]], double [[CONV2:%.*]]) {
385 ; CHECK-NEXT:  entry:
386 ; CHECK-NEXT:    [[SUB19:%.*]] = fsub double 0.000000e+00, [[CONV2]]
387 ; CHECK-NEXT:    [[CONV20:%.*]] = fptrunc double [[SUB19]] to float
388 ; CHECK-NEXT:    store float [[CONV20]], ptr [[M]], align 4
389 ; CHECK-NEXT:    [[ADD:%.*]] = fadd double [[CONV]], 0.000000e+00
390 ; CHECK-NEXT:    [[CONV239:%.*]] = fptrunc double [[ADD]] to float
391 ; CHECK-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr [4 x float], ptr [[M]], i64 0, i64 1
392 ; CHECK-NEXT:    store float [[CONV239]], ptr [[ARRAYIDX25]], align 4
393 ; CHECK-NEXT:    [[ADD26:%.*]] = fsub double [[CONV]], [[CONV]]
394 ; CHECK-NEXT:    [[CONV27:%.*]] = fptrunc double [[ADD26]] to float
395 ; CHECK-NEXT:    [[ARRAYIDX29:%.*]] = getelementptr [4 x float], ptr [[M]], i64 0, i64 2
396 ; CHECK-NEXT:    store float [[CONV27]], ptr [[ARRAYIDX29]], align 4
397 ; CHECK-NEXT:    ret void
399 entry:
400   %sub19 = fsub double 0.000000e+00, %conv2
401   %conv20 = fptrunc double %sub19 to float
402   store float %conv20, ptr %m, align 4
403   %add = fadd double %conv, 0.000000e+00
404   %conv239 = fptrunc double %add to float
405   %arrayidx25 = getelementptr [4 x float], ptr %m, i64 0, i64 1
406   store float %conv239, ptr %arrayidx25, align 4
407   %add26 = fsub double %conv, %conv
408   %conv27 = fptrunc double %add26 to float
409   %arrayidx29 = getelementptr [4 x float], ptr %m, i64 0, i64 2
410   store float %conv27, ptr %arrayidx29, align 4
411   ret void
414 define void @reuse_shuffle_indices_cost_crash_4(double %conv7.i) {
415 ; CHECK-LABEL: define void @reuse_shuffle_indices_cost_crash_4(
416 ; CHECK-SAME: double [[CONV7_I:%.*]]) {
417 ; CHECK-NEXT:  entry:
418 ; CHECK-NEXT:    [[DATA_I111:%.*]] = alloca [0 x [0 x [0 x [3 x float]]]], i32 0, align 4
419 ; CHECK-NEXT:    [[ARRAYIDX_2_I:%.*]] = getelementptr [3 x float], ptr [[DATA_I111]], i64 0, i64 2
420 ; CHECK-NEXT:    [[MUL17_I_US:%.*]] = fmul double [[CONV7_I]], 0.000000e+00
421 ; CHECK-NEXT:    [[MUL_2_I_I_US:%.*]] = fmul double [[MUL17_I_US]], 0.000000e+00
422 ; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x double> poison, double [[CONV7_I]], i32 0
423 ; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <2 x double> [[TMP0]], <2 x double> poison, <2 x i32> zeroinitializer
424 ; CHECK-NEXT:    [[TMP2:%.*]] = fadd <2 x double> [[TMP1]], zeroinitializer
425 ; CHECK-NEXT:    [[ADD_2_I_I_US:%.*]] = fadd double [[MUL_2_I_I_US]], 0.000000e+00
426 ; CHECK-NEXT:    [[TMP3:%.*]] = fmul <2 x double> [[TMP2]], [[TMP1]]
427 ; CHECK-NEXT:    [[TMP4:%.*]] = fadd <2 x double> [[TMP3]], zeroinitializer
428 ; CHECK-NEXT:    [[TMP5:%.*]] = fptrunc <2 x double> [[TMP4]] to <2 x float>
429 ; CHECK-NEXT:    store <2 x float> [[TMP5]], ptr [[DATA_I111]], align 4
430 ; CHECK-NEXT:    [[CONV_2_I46_US:%.*]] = fptrunc double [[ADD_2_I_I_US]] to float
431 ; CHECK-NEXT:    store float [[CONV_2_I46_US]], ptr [[ARRAYIDX_2_I]], align 4
432 ; CHECK-NEXT:    [[CALL2_I_US:%.*]] = load volatile ptr, ptr [[DATA_I111]], align 8
433 ; CHECK-NEXT:    ret void
435 entry:
436   %data.i111 = alloca [0 x [0 x [0 x [3 x float]]]], i32 0, align 4
437   %arrayidx.1.i = getelementptr [3 x float], ptr %data.i111, i64 0, i64 1
438   %arrayidx.2.i = getelementptr [3 x float], ptr %data.i111, i64 0, i64 2
439   %mul17.i.us = fmul double %conv7.i, 0.000000e+00
440   %mul.2.i.i.us = fmul double %mul17.i.us, 0.000000e+00
441   %add.i.i82.i.us = fadd double %conv7.i, 0.000000e+00
442   %add.1.i.i84.i.us = fadd double %conv7.i, 0.000000e+00
443   %mul.i.i91.i.us = fmul double %add.i.i82.i.us, %conv7.i
444   %mul.1.i.i92.i.us = fmul double %add.1.i.i84.i.us, %conv7.i
445   %add.i96.i.us = fadd double %mul.i.i91.i.us, 0.000000e+00
446   %add.1.i.i.us = fadd double %mul.1.i.i92.i.us, 0.000000e+00
447   %add.2.i.i.us = fadd double %mul.2.i.i.us, 0.000000e+00
448   %conv.i42.us = fptrunc double %add.i96.i.us to float
449   store float %conv.i42.us, ptr %data.i111, align 4
450   %conv.1.i44.us = fptrunc double %add.1.i.i.us to float
451   store float %conv.1.i44.us, ptr %arrayidx.1.i, align 4
452   %conv.2.i46.us = fptrunc double %add.2.i.i.us to float
453   store float %conv.2.i46.us, ptr %arrayidx.2.i, align 4
454   %call2.i.us = load volatile ptr, ptr %data.i111, align 8
455   ret void
458 define void @common_mask(ptr %m, double %conv, double %conv2) {
459 ; CHECK-LABEL: define void @common_mask(
460 ; CHECK-SAME: ptr [[M:%.*]], double [[CONV:%.*]], double [[CONV2:%.*]]) {
461 ; CHECK-NEXT:  entry:
462 ; CHECK-NEXT:    [[SUB19:%.*]] = fsub double [[CONV]], [[CONV]]
463 ; CHECK-NEXT:    [[CONV20:%.*]] = fptrunc double [[SUB19]] to float
464 ; CHECK-NEXT:    store float [[CONV20]], ptr [[M]], align 4
465 ; CHECK-NEXT:    [[ADD:%.*]] = fadd double [[CONV2]], 0.000000e+00
466 ; CHECK-NEXT:    [[CONV239:%.*]] = fptrunc double [[ADD]] to float
467 ; CHECK-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr [4 x float], ptr [[M]], i64 0, i64 1
468 ; CHECK-NEXT:    store float [[CONV239]], ptr [[ARRAYIDX25]], align 4
469 ; CHECK-NEXT:    [[ADD26:%.*]] = fsub double 0.000000e+00, [[CONV]]
470 ; CHECK-NEXT:    [[CONV27:%.*]] = fptrunc double [[ADD26]] to float
471 ; CHECK-NEXT:    [[ARRAYIDX29:%.*]] = getelementptr [4 x float], ptr [[M]], i64 0, i64 2
472 ; CHECK-NEXT:    store float [[CONV27]], ptr [[ARRAYIDX29]], align 4
473 ; CHECK-NEXT:    ret void
475 entry:
476   %sub19 = fsub double %conv, %conv
477   %conv20 = fptrunc double %sub19 to float
478   store float %conv20, ptr %m, align 4
479   %add = fadd double %conv2, 0.000000e+00
480   %conv239 = fptrunc double %add to float
481   %arrayidx25 = getelementptr [4 x float], ptr %m, i64 0, i64 1
482   store float %conv239, ptr %arrayidx25, align 4
483   %add26 = fsub double 0.000000e+00, %conv
484   %conv27 = fptrunc double %add26 to float
485   %arrayidx29 = getelementptr [4 x float], ptr %m, i64 0, i64 2
486   store float %conv27, ptr %arrayidx29, align 4
487   ret void
490 define void @vec3_extract(<3 x i16> %pixel.sroa.0.4.vec.insert606, ptr %call3.i536) {
491 ; CHECK-LABEL: define void @vec3_extract(
492 ; CHECK-SAME: <3 x i16> [[PIXEL_SROA_0_4_VEC_INSERT606:%.*]], ptr [[CALL3_I536:%.*]]) {
493 ; CHECK-NEXT:  entry:
494 ; CHECK-NEXT:    [[PIXEL_SROA_0_4_VEC_EXTRACT:%.*]] = extractelement <3 x i16> [[PIXEL_SROA_0_4_VEC_INSERT606]], i64 2
495 ; CHECK-NEXT:    [[RED668:%.*]] = getelementptr i16, ptr [[CALL3_I536]], i64 2
496 ; CHECK-NEXT:    store i16 [[PIXEL_SROA_0_4_VEC_EXTRACT]], ptr [[RED668]], align 2
497 ; CHECK-NEXT:    [[PIXEL_SROA_0_2_VEC_EXTRACT:%.*]] = extractelement <3 x i16> [[PIXEL_SROA_0_4_VEC_INSERT606]], i64 1
498 ; CHECK-NEXT:    [[GREEN670:%.*]] = getelementptr i16, ptr [[CALL3_I536]], i64 1
499 ; CHECK-NEXT:    store i16 [[PIXEL_SROA_0_2_VEC_EXTRACT]], ptr [[GREEN670]], align 2
500 ; CHECK-NEXT:    [[PIXEL_SROA_0_0_VEC_EXTRACT:%.*]] = extractelement <3 x i16> [[PIXEL_SROA_0_4_VEC_INSERT606]], i64 0
501 ; CHECK-NEXT:    store i16 [[PIXEL_SROA_0_0_VEC_EXTRACT]], ptr [[CALL3_I536]], align 2
502 ; CHECK-NEXT:    ret void
504 entry:
505   %pixel.sroa.0.4.vec.extract = extractelement <3 x i16> %pixel.sroa.0.4.vec.insert606, i64 2
506   %red668 = getelementptr i16, ptr %call3.i536, i64 2
507   store i16 %pixel.sroa.0.4.vec.extract, ptr %red668, align 2
508   %pixel.sroa.0.2.vec.extract = extractelement <3 x i16> %pixel.sroa.0.4.vec.insert606, i64 1
509   %green670 = getelementptr i16, ptr %call3.i536, i64 1
510   store i16 %pixel.sroa.0.2.vec.extract, ptr %green670, align 2
511   %pixel.sroa.0.0.vec.extract = extractelement <3 x i16> %pixel.sroa.0.4.vec.insert606, i64 0
512   store i16 %pixel.sroa.0.0.vec.extract, ptr %call3.i536, align 2
513   ret void
516 declare float @llvm.fmuladd.f32(float, float, float)