[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / clang / test / CodeGen / attr-target-mv.c
blobbdf8c49de4ae869cc6053518a8f656fc8c222886
1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX
2 // RUN: %clang_cc1 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefix=WINDOWS
4 int __attribute__((target("sse4.2"))) foo(void) { return 0; }
5 int __attribute__((target("arch=sandybridge"))) foo(void);
6 int __attribute__((target("arch=ivybridge"))) foo(void) {return 1;}
7 int __attribute__((target("arch=goldmont"))) foo(void) {return 3;}
8 int __attribute__((target("arch=goldmont-plus"))) foo(void) {return 4;}
9 int __attribute__((target("arch=tremont"))) foo(void) {return 5;}
10 int __attribute__((target("arch=icelake-client"))) foo(void) {return 6;}
11 int __attribute__((target("arch=icelake-server"))) foo(void) {return 7;}
12 int __attribute__((target("arch=cooperlake"))) foo(void) {return 8;}
13 int __attribute__((target("arch=tigerlake"))) foo(void) {return 9;}
14 int __attribute__((target("arch=sapphirerapids"))) foo(void) {return 10;}
15 int __attribute__((target("arch=alderlake"))) foo(void) {return 11;}
16 int __attribute__((target("arch=rocketlake"))) foo(void) {return 12;}
17 int __attribute__((target("arch=core2"))) foo(void) {return 13;}
18 int __attribute__((target("arch=raptorlake"))) foo(void) {return 14;}
19 int __attribute__((target("arch=meteorlake"))) foo(void) {return 15;}
20 int __attribute__((target("arch=sierraforest"))) foo(void) {return 16;}
21 int __attribute__((target("arch=grandridge"))) foo(void) {return 17;}
22 int __attribute__((target("arch=graniterapids"))) foo(void) {return 18;}
23 int __attribute__((target("arch=emeraldrapids"))) foo(void) {return 19;}
24 int __attribute__((target("arch=graniterapids-d"))) foo(void) {return 20;}
25 int __attribute__((target("arch=arrowlake"))) foo(void) {return 21;}
26 int __attribute__((target("arch=arrowlake-s"))) foo(void) {return 22;}
27 int __attribute__((target("arch=lunarlake"))) foo(void) {return 23;}
28 int __attribute__((target("arch=gracemont"))) foo(void) {return 24;}
29 int __attribute__((target("arch=pantherlake"))) foo(void) {return 25;}
30 int __attribute__((target("arch=clearwaterforest"))) foo(void) {return 26;}
31 int __attribute__((target("default"))) foo(void) { return 2; }
33 int bar(void) {
34 return foo();
37 static int __attribute__((target("arch=meteorlake"))) foo_internal(void) {return 15;}
38 static int __attribute__((target("default"))) foo_internal(void) { return 2; }
40 int bar1(void) {
41 return foo_internal();
44 inline int __attribute__((target("sse4.2"))) foo_inline(void) { return 0; }
45 inline int __attribute__((target("arch=sandybridge"))) foo_inline(void);
46 inline int __attribute__((target("arch=ivybridge"))) foo_inline(void) {return 1;}
47 inline int __attribute__((target("default"))) foo_inline(void) { return 2; }
49 int bar2(void) {
50 return foo_inline();
53 inline __attribute__((target("default"))) void foo_decls(void);
54 inline __attribute__((target("sse4.2"))) void foo_decls(void);
55 void bar3(void) {
56 foo_decls();
58 inline __attribute__((target("default"))) void foo_decls(void) {}
59 inline __attribute__((target("sse4.2"))) void foo_decls(void) {}
61 inline __attribute__((target("default"))) void foo_multi(int i, double d) {}
62 inline __attribute__((target("avx,sse4.2"))) void foo_multi(int i, double d) {}
63 inline __attribute__((target("sse4.2,fma4"))) void foo_multi(int i, double d) {}
64 inline __attribute__((target("arch=ivybridge,fma4,sse4.2"))) void foo_multi(int i, double d) {}
65 void bar4(void) {
66 foo_multi(1, 5.0);
69 int fwd_decl_default(void);
70 int __attribute__((target("default"))) fwd_decl_default(void) { return 2; }
72 int fwd_decl_avx(void);
73 int __attribute__((target("avx"))) fwd_decl_avx(void) { return 2; }
74 int __attribute__((target("default"))) fwd_decl_avx(void) { return 2; }
76 void bar5(void) {
77 fwd_decl_default();
78 fwd_decl_avx();
81 int __attribute__((target("avx"))) changed_to_mv(void) { return 0;}
82 int __attribute__((target("fma4"))) changed_to_mv(void) { return 1;}
84 __attribute__((target("default"), used)) inline void foo_used(int i, double d) {}
85 __attribute__((target("avx,sse4.2"))) inline void foo_used(int i, double d) {}
87 __attribute__((target("default"))) inline void foo_used2(int i, double d) {}
88 __attribute__((target("avx,sse4.2"), used)) inline void foo_used2(int i, double d) {}
90 // PR50025:
91 static void must_be_emitted(void) {}
92 inline __attribute__((target("default"))) void pr50025(void) { must_be_emitted(); }
93 void calls_pr50025(void) { pr50025(); }
95 // Also need to make sure we get other multiversion functions.
96 inline __attribute__((target("default"))) void pr50025b(void) { must_be_emitted(); }
97 inline __attribute__((target("default"))) void pr50025c(void) { pr50025b(); }
98 void calls_pr50025c(void) { pr50025c(); }
100 // LINUX: $foo.resolver = comdat any
101 // LINUX: $foo_inline.resolver = comdat any
102 // LINUX: $foo_decls.resolver = comdat any
103 // LINUX: $foo_multi.resolver = comdat any
104 // LINUX: $fwd_decl_default.resolver = comdat any
105 // LINUX: $fwd_decl_avx.resolver = comdat any
106 // LINUX: $pr50025.resolver = comdat any
107 // LINUX: $pr50025c.resolver = comdat any
108 // LINUX: $pr50025b.resolver = comdat any
110 // WINDOWS: $foo.resolver = comdat any
111 // WINDOWS: $foo_inline.resolver = comdat any
112 // WINDOWS: $foo_decls.resolver = comdat any
113 // WINDOWS: $foo_multi.resolver = comdat any
114 // WINDOWS: $fwd_decl_default.resolver = comdat any
115 // WINDOWS: $fwd_decl_avx.resolver = comdat any
116 // WINDOWS: $foo_used = comdat any
117 // WINDOWS: $foo_used2.avx_sse4.2 = comdat any
118 // WINDOWS: $pr50025.resolver = comdat any
119 // WINDOWS: $pr50025c.resolver = comdat any
120 // WINDOWS: $foo_inline.sse4.2 = comdat any
121 // WINDOWS: $foo_inline.arch_ivybridge = comdat any
122 // WINDOWS: $foo_inline = comdat any
123 // WINDOWS: $foo_decls = comdat any
124 // WINDOWS: $foo_decls.sse4.2 = comdat any
125 // WINDOWS: $foo_multi = comdat any
126 // WINDOWS: $foo_multi.avx_sse4.2 = comdat any
127 // WINDOWS: $foo_multi.fma4_sse4.2 = comdat any
128 // WINDOWS: $foo_multi.arch_ivybridge_fma4_sse4.2 = comdat any
129 // WINDOWS: $pr50025 = comdat any
130 // WINDOWS: $pr50025c = comdat any
131 // WINDOWS: $pr50025b.resolver = comdat any
132 // WINDOWS: $pr50025b = comdat any
135 // LINUX: @llvm.compiler.used = appending global [2 x ptr] [ptr @foo_used, ptr @foo_used2.avx_sse4.2], section "llvm.metadata"
136 // WINDOWS: @llvm.used = appending global [2 x ptr] [ptr @foo_used, ptr @foo_used2.avx_sse4.2], section "llvm.metadata"
139 // LINUX: @foo.ifunc = weak_odr ifunc i32 (), ptr @foo.resolver
140 // LINUX: @foo_internal.ifunc = internal ifunc i32 (), ptr @foo_internal.resolver
141 // LINUX: @foo_inline.ifunc = weak_odr ifunc i32 (), ptr @foo_inline.resolver
142 // LINUX: @foo_decls.ifunc = weak_odr ifunc void (), ptr @foo_decls.resolver
143 // LINUX: @foo_multi.ifunc = weak_odr ifunc void (i32, double), ptr @foo_multi.resolver
144 // LINUX: @fwd_decl_default.ifunc = weak_odr ifunc i32 (), ptr @fwd_decl_default.resolver
145 // LINUX: @fwd_decl_avx.ifunc = weak_odr ifunc i32 (), ptr @fwd_decl_avx.resolver
147 // LINUX: define{{.*}} i32 @foo.sse4.2()
148 // LINUX: ret i32 0
149 // LINUX: define{{.*}} i32 @foo.arch_ivybridge()
150 // LINUX: ret i32 1
151 // LINUX: define{{.*}} i32 @foo.arch_goldmont()
152 // LINUX: ret i32 3
153 // LINUX: define{{.*}} i32 @foo.arch_goldmont-plus()
154 // LINUX: ret i32 4
155 // LINUX: define{{.*}} i32 @foo.arch_tremont()
156 // LINUX: ret i32 5
157 // LINUX: define{{.*}} i32 @foo.arch_icelake-client()
158 // LINUX: ret i32 6
159 // LINUX: define{{.*}} i32 @foo.arch_icelake-server()
160 // LINUX: ret i32 7
161 // LINUX: define{{.*}} i32 @foo.arch_cooperlake()
162 // LINUX: ret i32 8
163 // LINUX: define{{.*}} i32 @foo.arch_tigerlake()
164 // LINUX: ret i32 9
165 // LINUX: define{{.*}} i32 @foo.arch_sapphirerapids()
166 // LINUX: ret i32 10
167 // LINUX: define{{.*}} i32 @foo.arch_alderlake()
168 // LINUX: ret i32 11
169 // LINUX: define{{.*}} i32 @foo.arch_rocketlake()
170 // LINUX: ret i32 12
171 // LINUX: define{{.*}} i32 @foo.arch_core2()
172 // LINUX: ret i32 13
173 // LINUX: define{{.*}} i32 @foo.arch_raptorlake()
174 // LINUX: ret i32 14
175 // LINUX: define{{.*}} i32 @foo.arch_meteorlake()
176 // LINUX: ret i32 15
177 // LINUX: define{{.*}} i32 @foo.arch_sierraforest()
178 // LINUX: ret i32 16
179 // LINUX: define{{.*}} i32 @foo.arch_grandridge()
180 // LINUX: ret i32 17
181 // LINUX: define{{.*}} i32 @foo.arch_graniterapids()
182 // LINUX: ret i32 18
183 // LINUX: define{{.*}} i32 @foo.arch_emeraldrapids()
184 // LINUX: ret i32 19
185 // LINUX: define{{.*}} i32 @foo.arch_graniterapids-d()
186 // LINUX: ret i32 20
187 // LINUX: define{{.*}} i32 @foo.arch_arrowlake()
188 // LINUX: ret i32 21
189 // LINUX: define{{.*}} i32 @foo.arch_arrowlake-s()
190 // LINUX: ret i32 22
191 // LINUX: define{{.*}} i32 @foo.arch_lunarlake()
192 // LINUX: ret i32 23
193 // LINUX: define{{.*}} i32 @foo.arch_gracemont()
194 // LINUX: ret i32 24
195 // LINUX: define{{.*}} i32 @foo.arch_pantherlake()
196 // LINUX: ret i32 25
197 // LINUX: define{{.*}} i32 @foo.arch_clearwaterforest()
198 // LINUX: ret i32 26
199 // LINUX: define{{.*}} i32 @foo()
200 // LINUX: ret i32 2
201 // LINUX: define{{.*}} i32 @bar()
202 // LINUX: call i32 @foo.ifunc()
204 // WINDOWS: define dso_local i32 @foo.sse4.2()
205 // WINDOWS: ret i32 0
206 // WINDOWS: define dso_local i32 @foo.arch_ivybridge()
207 // WINDOWS: ret i32 1
208 // WINDOWS: define dso_local i32 @foo.arch_goldmont()
209 // WINDOWS: ret i32 3
210 // WINDOWS: define dso_local i32 @foo.arch_goldmont-plus()
211 // WINDOWS: ret i32 4
212 // WINDOWS: define dso_local i32 @foo.arch_tremont()
213 // WINDOWS: ret i32 5
214 // WINDOWS: define dso_local i32 @foo.arch_icelake-client()
215 // WINDOWS: ret i32 6
216 // WINDOWS: define dso_local i32 @foo.arch_icelake-server()
217 // WINDOWS: ret i32 7
218 // WINDOWS: define dso_local i32 @foo.arch_cooperlake()
219 // WINDOWS: ret i32 8
220 // WINDOWS: define dso_local i32 @foo.arch_tigerlake()
221 // WINDOWS: ret i32 9
222 // WINDOWS: define dso_local i32 @foo.arch_sapphirerapids()
223 // WINDOWS: ret i32 10
224 // WINDOWS: define dso_local i32 @foo.arch_alderlake()
225 // WINDOWS: ret i32 11
226 // WINDOWS: define dso_local i32 @foo.arch_rocketlake()
227 // WINDOWS: ret i32 12
228 // WINDOWS: define dso_local i32 @foo.arch_core2()
229 // WINDOWS: ret i32 13
230 // WINDOWS: define dso_local i32 @foo.arch_raptorlake()
231 // WINDOWS: ret i32 14
232 // WINDOWS: define dso_local i32 @foo.arch_meteorlake()
233 // WINDOWS: ret i32 15
234 // WINDOWS: define{{.*}} i32 @foo.arch_sierraforest()
235 // WINDOWS: ret i32 16
236 // WINDOWS: define{{.*}} i32 @foo.arch_grandridge()
237 // WINDOWS: ret i32 17
238 // WINDOWS: define{{.*}} i32 @foo.arch_graniterapids()
239 // WINDOWS: ret i32 18
240 // WINDOWS: define dso_local i32 @foo.arch_emeraldrapids()
241 // WINDOWS: ret i32 19
242 // WINDOWS: define dso_local i32 @foo.arch_graniterapids-d()
243 // WINDOWS: ret i32 20
244 // WINDOWS: define dso_local i32 @foo.arch_arrowlake()
245 // WINDOWS: ret i32 21
246 // WINDOWS: define dso_local i32 @foo.arch_arrowlake-s()
247 // WINDOWS: ret i32 22
248 // WINDOWS: define dso_local i32 @foo.arch_lunarlake()
249 // WINDOWS: ret i32 23
250 // WINDOWS: define dso_local i32 @foo.arch_gracemont()
251 // WINDOWS: ret i32 24
252 // WINDOWS: define dso_local i32 @foo.arch_pantherlake()
253 // WINDOWS: ret i32 25
254 // WINDOWS: define dso_local i32 @foo.arch_clearwaterforest()
255 // WINDOWS: ret i32 26
256 // WINDOWS: define dso_local i32 @foo()
257 // WINDOWS: ret i32 2
258 // WINDOWS: define dso_local i32 @bar()
259 // WINDOWS: call i32 @foo.resolver()
261 // LINUX: define weak_odr ptr @foo.resolver() comdat
262 // LINUX: call void @__cpu_indicator_init()
263 // LINUX: ret ptr @foo.arch_sandybridge
264 // LINUX: ret ptr @foo.arch_ivybridge
265 // LINUX: ret ptr @foo.sse4.2
266 // LINUX: ret ptr @foo
268 // WINDOWS: define weak_odr dso_local i32 @foo.resolver() comdat
269 // WINDOWS: call void @__cpu_indicator_init()
270 // WINDOWS: call i32 @foo.arch_sandybridge
271 // WINDOWS: call i32 @foo.arch_ivybridge
272 // WINDOWS: call i32 @foo.sse4.2
273 // WINDOWS: call i32 @foo
275 /// Internal linkage resolvers do not use comdat.
276 // LINUX: define internal ptr @foo_internal.resolver() {
278 // WINDOWS: define internal i32 @foo_internal.resolver() {
280 // LINUX: define{{.*}} i32 @bar2()
281 // LINUX: call i32 @foo_inline.ifunc()
283 // WINDOWS: define dso_local i32 @bar2()
284 // WINDOWS: call i32 @foo_inline.resolver()
286 // LINUX: define weak_odr ptr @foo_inline.resolver() comdat
287 // LINUX: call void @__cpu_indicator_init()
288 // LINUX: ret ptr @foo_inline.arch_sandybridge
289 // LINUX: ret ptr @foo_inline.arch_ivybridge
290 // LINUX: ret ptr @foo_inline.sse4.2
291 // LINUX: ret ptr @foo_inline
293 // WINDOWS: define weak_odr dso_local i32 @foo_inline.resolver() comdat
294 // WINDOWS: call void @__cpu_indicator_init()
295 // WINDOWS: call i32 @foo_inline.arch_sandybridge
296 // WINDOWS: call i32 @foo_inline.arch_ivybridge
297 // WINDOWS: call i32 @foo_inline.sse4.2
298 // WINDOWS: call i32 @foo_inline
300 // LINUX: define{{.*}} void @bar3()
301 // LINUX: call void @foo_decls.ifunc()
303 // WINDOWS: define dso_local void @bar3()
304 // WINDOWS: call void @foo_decls.resolver()
306 // LINUX: define weak_odr ptr @foo_decls.resolver() comdat
307 // LINUX: ret ptr @foo_decls.sse4.2
308 // LINUX: ret ptr @foo_decls
310 // WINDOWS: define weak_odr dso_local void @foo_decls.resolver() comdat
311 // WINDOWS: call void @foo_decls.sse4.2
312 // WINDOWS: call void @foo_decls
314 // LINUX: define{{.*}} void @bar4()
315 // LINUX: call void @foo_multi.ifunc(i32 noundef 1, double noundef 5.{{[0+e]*}})
317 // WINDOWS: define dso_local void @bar4()
318 // WINDOWS: call void @foo_multi.resolver(i32 noundef 1, double noundef 5.{{[0+e]*}})
320 // LINUX: define weak_odr ptr @foo_multi.resolver() comdat
321 // LINUX: and i32 %{{.*}}, 4352
322 // LINUX: icmp eq i32 %{{.*}}, 4352
323 // LINUX: ret ptr @foo_multi.fma4_sse4.2
324 // LINUX: icmp eq i32 %{{.*}}, 12
325 // LINUX: and i32 %{{.*}}, 4352
326 // LINUX: icmp eq i32 %{{.*}}, 4352
327 // LINUX: ret ptr @foo_multi.arch_ivybridge_fma4_sse4.2
328 // LINUX: and i32 %{{.*}}, 768
329 // LINUX: icmp eq i32 %{{.*}}, 768
330 // LINUX: ret ptr @foo_multi.avx_sse4.2
331 // LINUX: ret ptr @foo_multi
333 // WINDOWS: define weak_odr dso_local void @foo_multi.resolver(i32 %0, double %1) comdat
334 // WINDOWS: and i32 %{{.*}}, 4352
335 // WINDOWS: icmp eq i32 %{{.*}}, 4352
336 // WINDOWS: call void @foo_multi.fma4_sse4.2(i32 %0, double %1)
337 // WINDOWS-NEXT: ret void
338 // WINDOWS: icmp eq i32 %{{.*}}, 12
339 // WINDOWS: and i32 %{{.*}}, 4352
340 // WINDOWS: icmp eq i32 %{{.*}}, 4352
341 // WINDOWS: call void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 %0, double %1)
342 // WINDOWS-NEXT: ret void
343 // WINDOWS: and i32 %{{.*}}, 768
344 // WINDOWS: icmp eq i32 %{{.*}}, 768
345 // WINDOWS: call void @foo_multi.avx_sse4.2(i32 %0, double %1)
346 // WINDOWS-NEXT: ret void
347 // WINDOWS: call void @foo_multi(i32 %0, double %1)
348 // WINDOWS-NEXT: ret void
350 // LINUX: define{{.*}} i32 @fwd_decl_default()
351 // LINUX: ret i32 2
352 // LINUX: define{{.*}} i32 @fwd_decl_avx.avx()
353 // LINUX: ret i32 2
354 // LINUX: define{{.*}} i32 @fwd_decl_avx()
355 // LINUX: ret i32 2
357 // WINDOWS: define dso_local i32 @fwd_decl_default()
358 // WINDOWS: ret i32 2
359 // WINDOWS: define dso_local i32 @fwd_decl_avx.avx()
360 // WINDOWS: ret i32 2
361 // WINDOWS: define dso_local i32 @fwd_decl_avx()
362 // WINDOWS: ret i32 2
364 // LINUX: define{{.*}} void @bar5()
365 // LINUX: call i32 @fwd_decl_default.ifunc()
366 // LINUX: call i32 @fwd_decl_avx.ifunc()
368 // WINDOWS: define dso_local void @bar5()
369 // WINDOWS: call i32 @fwd_decl_default.resolver()
370 // WINDOWS: call i32 @fwd_decl_avx.resolver()
372 // LINUX: define weak_odr ptr @fwd_decl_default.resolver() comdat
373 // LINUX: call void @__cpu_indicator_init()
374 // LINUX: ret ptr @fwd_decl_default
375 // LINUX: define weak_odr ptr @fwd_decl_avx.resolver() comdat
376 // LINUX: call void @__cpu_indicator_init()
377 // LINUX: ret ptr @fwd_decl_avx.avx
378 // LINUX: ret ptr @fwd_decl_avx
380 // WINDOWS: define weak_odr dso_local i32 @fwd_decl_default.resolver() comdat
381 // WINDOWS: call void @__cpu_indicator_init()
382 // WINDOWS: call i32 @fwd_decl_default
383 // WINDOWS: define weak_odr dso_local i32 @fwd_decl_avx.resolver() comdat
384 // WINDOWS: call void @__cpu_indicator_init()
385 // WINDOWS: call i32 @fwd_decl_avx.avx
386 // WINDOWS: call i32 @fwd_decl_avx
388 // LINUX: define{{.*}} i32 @changed_to_mv.avx()
389 // LINUX: define{{.*}} i32 @changed_to_mv.fma4()
391 // WINDOWS: define dso_local i32 @changed_to_mv.avx()
392 // WINDOWS: define dso_local i32 @changed_to_mv.fma4()
394 // LINUX: define linkonce void @foo_used(i32 noundef %{{.*}}, double noundef %{{.*}})
395 // LINUX-NOT: @foo_used.avx_sse4.2(
396 // LINUX-NOT: @foo_used2(
397 // LINUX: define linkonce void @foo_used2.avx_sse4.2(i32 noundef %{{.*}}, double noundef %{{.*}})
399 // WINDOWS: define linkonce_odr dso_local void @foo_used(i32 noundef %{{.*}}, double noundef %{{.*}})
400 // WINDOWS-NOT: @foo_used.avx_sse4.2(
401 // WINDOWS-NOT: @foo_used2(
402 // WINDOWS: define linkonce_odr dso_local void @foo_used2.avx_sse4.2(i32 noundef %{{.*}}, double noundef %{{.*}})
404 // LINUX: declare i32 @foo.arch_sandybridge()
405 // WINDOWS: declare dso_local i32 @foo.arch_sandybridge()
407 // LINUX: define linkonce i32 @foo_inline.sse4.2()
408 // LINUX: ret i32 0
410 // WINDOWS: define linkonce_odr dso_local i32 @foo_inline.sse4.2()
411 // WINDOWS: ret i32 0
413 // LINUX: declare i32 @foo_inline.arch_sandybridge()
415 // WINDOWS: declare dso_local i32 @foo_inline.arch_sandybridge()
417 // LINUX: define linkonce i32 @foo_inline.arch_ivybridge()
418 // LINUX: ret i32 1
419 // LINUX: define linkonce i32 @foo_inline()
420 // LINUX: ret i32 2
422 // WINDOWS: define linkonce_odr dso_local i32 @foo_inline.arch_ivybridge()
423 // WINDOWS: ret i32 1
424 // WINDOWS: define linkonce_odr dso_local i32 @foo_inline()
425 // WINDOWS: ret i32 2
427 // LINUX: define linkonce void @foo_decls()
428 // LINUX: define linkonce void @foo_decls.sse4.2()
430 // WINDOWS: define linkonce_odr dso_local void @foo_decls()
431 // WINDOWS: define linkonce_odr dso_local void @foo_decls.sse4.2()
433 // LINUX: define linkonce void @foo_multi(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
434 // LINUX: define linkonce void @foo_multi.avx_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
435 // LINUX: define linkonce void @foo_multi.fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
436 // LINUX: define linkonce void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
438 // WINDOWS: define linkonce_odr dso_local void @foo_multi(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
439 // WINDOWS: define linkonce_odr dso_local void @foo_multi.avx_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
440 // WINDOWS: define linkonce_odr dso_local void @foo_multi.fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
441 // WINDOWS: define linkonce_odr dso_local void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})
443 // Ensure that we emit the 'static' function here.
444 // LINUX: define linkonce void @pr50025()
445 // LINUX: call void @must_be_emitted
446 // LINUX: define internal void @must_be_emitted()
447 // WINDOWS: define linkonce_odr dso_local void @pr50025() #{{[0-9]*}} comdat
448 // WINDOWS: call void @must_be_emitted
449 // WINDOWS: define internal void @must_be_emitted()
451 // LINUX: define linkonce void @pr50025c()
452 // LINUX: call void @pr50025b.ifunc()
453 // WINDOWS: define linkonce_odr dso_local void @pr50025c() #{{[0-9]*}} comdat
454 // WINDOWS: call void @pr50025b.resolver()
456 // LINUX: define weak_odr ptr @pr50025b.resolver() comdat
457 // LINUX: ret ptr @pr50025b
458 // LINUX: define linkonce void @pr50025b()
459 // LINUX: call void @must_be_emitted()
460 // WINDOWS: define weak_odr dso_local void @pr50025b.resolver() comdat
461 // WINDOWS: musttail call void @pr50025b()
462 // WINDOWS: define linkonce_odr dso_local void @pr50025b() #{{[0-9]*}} comdat
463 // WINDOWS: call void @must_be_emitted()