brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.4 KiB · 4ab5d6f Raw
492 lines · c
1// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,ITANIUM,LINUX2// RUN: %clang_cc1 -triple x86_64-apple-macos -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,ITANIUM,DARWIN3// RUN: %clang_cc1 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,WINDOWS4 5int __attribute__((target("sse4.2"))) foo(void) { return 0; }6int __attribute__((target("arch=sandybridge"))) foo(void);7int __attribute__((target("arch=ivybridge"))) foo(void) {return 1;}8int __attribute__((target("arch=goldmont"))) foo(void) {return 3;}9int __attribute__((target("arch=goldmont-plus"))) foo(void) {return 4;}10int __attribute__((target("arch=tremont"))) foo(void) {return 5;}11int __attribute__((target("arch=icelake-client"))) foo(void) {return 6;}12int __attribute__((target("arch=icelake-server"))) foo(void) {return 7;}13int __attribute__((target("arch=cooperlake"))) foo(void) {return 8;}14int __attribute__((target("arch=tigerlake"))) foo(void) {return 9;}15int __attribute__((target("arch=sapphirerapids"))) foo(void) {return 10;}16int __attribute__((target("arch=alderlake"))) foo(void) {return 11;}17int __attribute__((target("arch=rocketlake"))) foo(void) {return 12;}18int __attribute__((target("arch=core2"))) foo(void) {return 13;}19int __attribute__((target("arch=raptorlake"))) foo(void) {return 14;}20int __attribute__((target("arch=meteorlake"))) foo(void) {return 15;}21int __attribute__((target("arch=sierraforest"))) foo(void) {return 16;}22int __attribute__((target("arch=grandridge"))) foo(void) {return 17;}23int __attribute__((target("arch=graniterapids"))) foo(void) {return 18;}24int __attribute__((target("arch=emeraldrapids"))) foo(void) {return 19;}25int __attribute__((target("arch=graniterapids-d"))) foo(void) {return 20;}26int __attribute__((target("arch=arrowlake"))) foo(void) {return 21;}27int __attribute__((target("arch=arrowlake-s"))) foo(void) {return 22;}28int __attribute__((target("arch=lunarlake"))) foo(void) {return 23;}29int __attribute__((target("arch=gracemont"))) foo(void) {return 24;}30int __attribute__((target("arch=pantherlake"))) foo(void) {return 25;}31int __attribute__((target("arch=clearwaterforest"))) foo(void) {return 26;}32int __attribute__((target("arch=diamondrapids"))) foo(void) {return 27;}33int __attribute__((target("arch=wildcatlake"))) foo(void) {return 28;}34int __attribute__((target("arch=novalake"))) foo(void) {return 29;}35int __attribute__((target("default"))) foo(void) { return 2; }36 37int bar(void) {38  return foo();39}40 41static int __attribute__((target("arch=meteorlake"))) foo_internal(void) {return 15;}42static int __attribute__((target("default"))) foo_internal(void) { return 2; }43 44int bar1(void) {45  return foo_internal();46}47 48inline int __attribute__((target("sse4.2"))) foo_inline(void) { return 0; }49inline int __attribute__((target("arch=sandybridge"))) foo_inline(void);50inline int __attribute__((target("arch=ivybridge"))) foo_inline(void) {return 1;}51inline int __attribute__((target("default"))) foo_inline(void) { return 2; }52 53int bar2(void) {54  return foo_inline();55}56 57inline __attribute__((target("default"))) void foo_decls(void);58inline __attribute__((target("sse4.2"))) void foo_decls(void);59void bar3(void) {60  foo_decls();61}62inline __attribute__((target("default"))) void foo_decls(void) {}63inline __attribute__((target("sse4.2"))) void foo_decls(void) {}64 65inline __attribute__((target("default"))) void foo_multi(int i, double d) {}66inline __attribute__((target("avx,sse4.2"))) void foo_multi(int i, double d) {}67inline __attribute__((target("sse4.2,fma4"))) void foo_multi(int i, double d) {}68inline __attribute__((target("arch=ivybridge,fma4,sse4.2"))) void foo_multi(int i, double d) {}69void bar4(void) {70  foo_multi(1, 5.0);71}72 73int fwd_decl_default(void);74int __attribute__((target("default"))) fwd_decl_default(void) { return 2; }75 76int fwd_decl_avx(void);77int __attribute__((target("avx"))) fwd_decl_avx(void) { return 2; }78int __attribute__((target("default"))) fwd_decl_avx(void) { return 2; }79 80void bar5(void) {81  fwd_decl_default();82  fwd_decl_avx();83}84 85int __attribute__((target("avx"))) changed_to_mv(void) { return 0;}86int __attribute__((target("fma4"))) changed_to_mv(void) { return 1;}87 88__attribute__((target("default"), used)) inline void foo_used(int i, double d) {}89__attribute__((target("avx,sse4.2"))) inline void foo_used(int i, double d) {}90 91__attribute__((target("default"))) inline void foo_used2(int i, double d) {}92__attribute__((target("avx,sse4.2"), used)) inline void foo_used2(int i, double d) {}93 94// PR50025:95static void must_be_emitted(void) {}96inline __attribute__((target("default"))) void pr50025(void) { must_be_emitted(); }97void calls_pr50025(void) { pr50025(); }98 99// Also need to make sure we get other multiversion functions.100inline __attribute__((target("default"))) void pr50025b(void) { must_be_emitted(); }101inline __attribute__((target("default"))) void pr50025c(void) { pr50025b(); }102void calls_pr50025c(void) { pr50025c(); }103 104// LINUX: $foo.resolver = comdat any105// LINUX: $foo_inline.resolver = comdat any106// LINUX: $foo_decls.resolver = comdat any107// LINUX: $foo_multi.resolver = comdat any108// LINUX: $fwd_decl_default.resolver = comdat any109// LINUX: $fwd_decl_avx.resolver = comdat any110// LINUX: $pr50025.resolver = comdat any111// LINUX: $pr50025c.resolver = comdat any112// LINUX: $pr50025b.resolver = comdat any113 114// DARWIN-NOT: comdat115 116// WINDOWS: $foo.resolver = comdat any117// WINDOWS: $foo_inline.resolver = comdat any118// WINDOWS: $foo_decls.resolver = comdat any119// WINDOWS: $foo_multi.resolver = comdat any120// WINDOWS: $fwd_decl_default.resolver = comdat any121// WINDOWS: $fwd_decl_avx.resolver = comdat any122// WINDOWS: $foo_used = comdat any123// WINDOWS: $foo_used2.avx_sse4.2 = comdat any124// WINDOWS: $pr50025.resolver = comdat any125// WINDOWS: $pr50025c.resolver = comdat any126// WINDOWS: $foo_inline.sse4.2 = comdat any127// WINDOWS: $foo_inline.arch_ivybridge = comdat any128// WINDOWS: $foo_inline = comdat any129// WINDOWS: $foo_decls = comdat any130// WINDOWS: $foo_decls.sse4.2 = comdat any131// WINDOWS: $foo_multi = comdat any132// WINDOWS: $foo_multi.avx_sse4.2 = comdat any133// WINDOWS: $foo_multi.fma4_sse4.2 = comdat any134// WINDOWS: $foo_multi.arch_ivybridge_fma4_sse4.2 = comdat any135// WINDOWS: $pr50025 = comdat any136// WINDOWS: $pr50025c = comdat any137// WINDOWS: $pr50025b.resolver = comdat any138// WINDOWS: $pr50025b = comdat any139 140 141// LINUX: @llvm.compiler.used = appending global [2 x ptr] [ptr @foo_used, ptr @foo_used2.avx_sse4.2], section "llvm.metadata"142// DARWIN: @llvm.used = appending global [2 x ptr] [ptr @foo_used, ptr @foo_used2.avx_sse4.2], section "llvm.metadata"143// WINDOWS: @llvm.used = appending global [2 x ptr] [ptr @foo_used, ptr @foo_used2.avx_sse4.2], section "llvm.metadata"144 145 146// ITANIUM: @foo.ifunc = weak_odr ifunc i32 (), ptr @foo.resolver147// ITANIUM: @foo_internal.ifunc = internal ifunc i32 (), ptr @foo_internal.resolver148// ITANIUM: @foo_inline.ifunc = weak_odr ifunc i32 (), ptr @foo_inline.resolver149// ITANIUM: @foo_decls.ifunc = weak_odr ifunc void (), ptr @foo_decls.resolver150// ITANIUM: @foo_multi.ifunc = weak_odr ifunc void (i32, double), ptr @foo_multi.resolver151// ITANIUM: @fwd_decl_default.ifunc = weak_odr ifunc i32 (), ptr @fwd_decl_default.resolver152// ITANIUM: @fwd_decl_avx.ifunc = weak_odr ifunc i32 (), ptr @fwd_decl_avx.resolver153 154// ITANIUM: define{{.*}} i32 @foo.sse4.2()155// ITANIUM: ret i32 0156// ITANIUM: define{{.*}} i32 @foo.arch_ivybridge()157// ITANIUM: ret i32 1158// ITANIUM: define{{.*}} i32 @foo.arch_goldmont()159// ITANIUM: ret i32 3160// ITANIUM: define{{.*}} i32 @foo.arch_goldmont-plus()161// ITANIUM: ret i32 4162// ITANIUM: define{{.*}} i32 @foo.arch_tremont()163// ITANIUM: ret i32 5164// ITANIUM: define{{.*}} i32 @foo.arch_icelake-client()165// ITANIUM: ret i32 6166// ITANIUM: define{{.*}} i32 @foo.arch_icelake-server()167// ITANIUM: ret i32 7168// ITANIUM: define{{.*}} i32 @foo.arch_cooperlake()169// ITANIUM: ret i32 8170// ITANIUM: define{{.*}} i32 @foo.arch_tigerlake()171// ITANIUM: ret i32 9172// ITANIUM: define{{.*}} i32 @foo.arch_sapphirerapids()173// ITANIUM: ret i32 10174// ITANIUM: define{{.*}} i32 @foo.arch_alderlake()175// ITANIUM: ret i32 11176// ITANIUM: define{{.*}} i32 @foo.arch_rocketlake()177// ITANIUM: ret i32 12178// ITANIUM: define{{.*}} i32 @foo.arch_core2()179// ITANIUM: ret i32 13180// ITANIUM: define{{.*}} i32 @foo.arch_raptorlake()181// ITANIUM: ret i32 14182// ITANIUM: define{{.*}} i32 @foo.arch_meteorlake()183// ITANIUM: ret i32 15184// ITANIUM: define{{.*}} i32 @foo.arch_sierraforest()185// ITANIUM: ret i32 16186// ITANIUM: define{{.*}} i32 @foo.arch_grandridge()187// ITANIUM: ret i32 17188// ITANIUM: define{{.*}} i32 @foo.arch_graniterapids()189// ITANIUM: ret i32 18190// ITANIUM: define{{.*}} i32 @foo.arch_emeraldrapids()191// ITANIUM: ret i32 19192// ITANIUM: define{{.*}} i32 @foo.arch_graniterapids-d()193// ITANIUM: ret i32 20194// ITANIUM: define{{.*}} i32 @foo.arch_arrowlake()195// ITANIUM: ret i32 21196// ITANIUM: define{{.*}} i32 @foo.arch_arrowlake-s()197// ITANIUM: ret i32 22198// ITANIUM: define{{.*}} i32 @foo.arch_lunarlake()199// ITANIUM: ret i32 23200// ITANIUM: define{{.*}} i32 @foo.arch_gracemont()201// ITANIUM: ret i32 24202// ITANIUM: define{{.*}} i32 @foo.arch_pantherlake()203// ITANIUM: ret i32 25204// ITANIUM: define{{.*}} i32 @foo.arch_clearwaterforest()205// ITANIUM: ret i32 26206// ITANIUM: define{{.*}} i32 @foo.arch_diamondrapids()207// ITANIUM: ret i32 27208// ITANIUM: define{{.*}} i32 @foo.arch_wildcatlake()209// ITANIUM: ret i32 28210// ITANIUM: define{{.*}} i32 @foo.arch_novalake()211// ITANIUM: ret i32 29212// ITANIUM: define{{.*}} i32 @foo()213// ITANIUM: ret i32 2214// ITANIUM: define{{.*}} i32 @bar()215// ITANIUM: call i32 @foo.ifunc()216 217// WINDOWS: define dso_local i32 @foo.sse4.2()218// WINDOWS: ret i32 0219// WINDOWS: define dso_local i32 @foo.arch_ivybridge()220// WINDOWS: ret i32 1221// WINDOWS: define dso_local i32 @foo.arch_goldmont()222// WINDOWS: ret i32 3223// WINDOWS: define dso_local i32 @foo.arch_goldmont-plus()224// WINDOWS: ret i32 4225// WINDOWS: define dso_local i32 @foo.arch_tremont()226// WINDOWS: ret i32 5227// WINDOWS: define dso_local i32 @foo.arch_icelake-client()228// WINDOWS: ret i32 6229// WINDOWS: define dso_local i32 @foo.arch_icelake-server()230// WINDOWS: ret i32 7231// WINDOWS: define dso_local i32 @foo.arch_cooperlake()232// WINDOWS: ret i32 8233// WINDOWS: define dso_local i32 @foo.arch_tigerlake()234// WINDOWS: ret i32 9235// WINDOWS: define dso_local i32 @foo.arch_sapphirerapids()236// WINDOWS: ret i32 10237// WINDOWS: define dso_local i32 @foo.arch_alderlake()238// WINDOWS: ret i32 11239// WINDOWS: define dso_local i32 @foo.arch_rocketlake()240// WINDOWS: ret i32 12241// WINDOWS: define dso_local i32 @foo.arch_core2()242// WINDOWS: ret i32 13243// WINDOWS: define dso_local i32 @foo.arch_raptorlake()244// WINDOWS: ret i32 14245// WINDOWS: define dso_local i32 @foo.arch_meteorlake()246// WINDOWS: ret i32 15247// WINDOWS: define{{.*}} i32 @foo.arch_sierraforest()248// WINDOWS: ret i32 16249// WINDOWS: define{{.*}} i32 @foo.arch_grandridge()250// WINDOWS: ret i32 17251// WINDOWS: define{{.*}} i32 @foo.arch_graniterapids()252// WINDOWS: ret i32 18253// WINDOWS: define dso_local i32 @foo.arch_emeraldrapids()254// WINDOWS: ret i32 19255// WINDOWS: define dso_local i32 @foo.arch_graniterapids-d()256// WINDOWS: ret i32 20257// WINDOWS: define dso_local i32 @foo.arch_arrowlake()258// WINDOWS: ret i32 21259// WINDOWS: define dso_local i32 @foo.arch_arrowlake-s()260// WINDOWS: ret i32 22261// WINDOWS: define dso_local i32 @foo.arch_lunarlake()262// WINDOWS: ret i32 23263// WINDOWS: define dso_local i32 @foo.arch_gracemont()264// WINDOWS: ret i32 24265// WINDOWS: define dso_local i32 @foo.arch_pantherlake()266// WINDOWS: ret i32 25267// WINDOWS: define dso_local i32 @foo.arch_clearwaterforest()268// WINDOWS: ret i32 26269// WINDOWS: define dso_local i32 @foo.arch_diamondrapids()270// WINDOWS: ret i32 27271// WINDOWS: define dso_local i32 @foo.arch_wildcatlake()272// WINDOWS: ret i32 28273// WINDOWS: define dso_local i32 @foo.arch_novalake()274// WINDOWS: ret i32 29275// WINDOWS: define dso_local i32 @foo()276// WINDOWS: ret i32 2277// WINDOWS: define dso_local i32 @bar()278// WINDOWS: call i32 @foo.resolver()279 280// ITANIUM: define weak_odr ptr @foo.resolver() #[[ATTR_RESOLVER:[0-9]+]] 281// LINUX-SAME: comdat282// ITANIUM: call void @__cpu_indicator_init()283// ITANIUM: ret ptr @foo.arch_sandybridge284// ITANIUM: ret ptr @foo.arch_ivybridge285// ITANIUM: ret ptr @foo.sse4.2286// ITANIUM: ret ptr @foo287 288// WINDOWS: define weak_odr dso_local i32 @foo.resolver() #[[ATTR_RESOLVER:[0-9]+]] comdat289// WINDOWS: call void @__cpu_indicator_init()290// WINDOWS: call i32 @foo.arch_sandybridge291// WINDOWS: call i32 @foo.arch_ivybridge292// WINDOWS: call i32 @foo.sse4.2293// WINDOWS: call i32 @foo294 295/// Internal linkage resolvers do not use comdat.296// ITANIUM: define internal ptr @foo_internal.resolver() #[[ATTR_RESOLVER]] {297 298// WINDOWS: define internal i32 @foo_internal.resolver() #[[ATTR_RESOLVER]] {299 300// ITANIUM: define{{.*}} i32 @bar2()301// ITANIUM: call i32 @foo_inline.ifunc()302 303// WINDOWS: define dso_local i32 @bar2()304// WINDOWS: call i32 @foo_inline.resolver()305 306// ITANIUM: define weak_odr ptr @foo_inline.resolver() #[[ATTR_RESOLVER]] 307// LINUX-SAME: comdat308// ITANIUM: call void @__cpu_indicator_init()309// ITANIUM: ret ptr @foo_inline.arch_sandybridge310// ITANIUM: ret ptr @foo_inline.arch_ivybridge311// ITANIUM: ret ptr @foo_inline.sse4.2312// ITANIUM: ret ptr @foo_inline313 314// WINDOWS: define weak_odr dso_local i32 @foo_inline.resolver() #[[ATTR_RESOLVER]] comdat315// WINDOWS: call void @__cpu_indicator_init()316// WINDOWS: call i32 @foo_inline.arch_sandybridge317// WINDOWS: call i32 @foo_inline.arch_ivybridge318// WINDOWS: call i32 @foo_inline.sse4.2319// WINDOWS: call i32 @foo_inline320 321// ITANIUM: define{{.*}} void @bar3()322// ITANIUM: call void @foo_decls.ifunc()323 324// WINDOWS: define dso_local void @bar3()325// WINDOWS: call void @foo_decls.resolver()326 327// ITANIUM: define weak_odr ptr @foo_decls.resolver() #[[ATTR_RESOLVER]]328// LINUX-SAME: comdat329// ITANIUM: ret ptr @foo_decls.sse4.2330// ITANIUM: ret ptr @foo_decls331 332// WINDOWS: define weak_odr dso_local void @foo_decls.resolver() #[[ATTR_RESOLVER]] comdat333// WINDOWS: call void @foo_decls.sse4.2334// WINDOWS: call void @foo_decls335 336// ITANIUM: define{{.*}} void @bar4()337// ITANIUM: call void @foo_multi.ifunc(i32 noundef 1, double noundef 5.{{[0+e]*}})338 339// WINDOWS: define dso_local void @bar4()340// WINDOWS: call void @foo_multi.resolver(i32 noundef 1, double noundef 5.{{[0+e]*}})341 342// ITANIUM: define weak_odr ptr @foo_multi.resolver() #[[ATTR_RESOLVER]] 343// LINUX-SAME: comdat344// ITANIUM: and i32 %{{.*}}, 4352345// ITANIUM: icmp eq i32 %{{.*}}, 4352346// ITANIUM: ret ptr @foo_multi.fma4_sse4.2347// ITANIUM: icmp eq i32 %{{.*}}, 12348// ITANIUM: and i32 %{{.*}}, 4352349// ITANIUM: icmp eq i32 %{{.*}}, 4352350// ITANIUM: ret ptr @foo_multi.arch_ivybridge_fma4_sse4.2351// ITANIUM: and i32 %{{.*}}, 768352// ITANIUM: icmp eq i32 %{{.*}}, 768353// ITANIUM: ret ptr @foo_multi.avx_sse4.2354// ITANIUM: ret ptr @foo_multi355 356// WINDOWS: define weak_odr dso_local void @foo_multi.resolver(i32 %0, double %1) #[[ATTR_RESOLVER]] comdat357// WINDOWS: and i32 %{{.*}}, 4352358// WINDOWS: icmp eq i32 %{{.*}}, 4352359// WINDOWS: call void @foo_multi.fma4_sse4.2(i32 %0, double %1)360// WINDOWS-NEXT: ret void361// WINDOWS: icmp eq i32 %{{.*}}, 12362// WINDOWS: and i32 %{{.*}}, 4352363// WINDOWS: icmp eq i32 %{{.*}}, 4352364// WINDOWS: call void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 %0, double %1)365// WINDOWS-NEXT: ret void366// WINDOWS: and i32 %{{.*}}, 768367// WINDOWS: icmp eq i32 %{{.*}}, 768368// WINDOWS: call void @foo_multi.avx_sse4.2(i32 %0, double %1)369// WINDOWS-NEXT: ret void370// WINDOWS: call void @foo_multi(i32 %0, double %1)371// WINDOWS-NEXT: ret void372 373// ITANIUM: define{{.*}} i32 @fwd_decl_default()374// ITANIUM: ret i32 2375// ITANIUM: define{{.*}} i32 @fwd_decl_avx.avx()376// ITANIUM: ret i32 2377// ITANIUM: define{{.*}} i32 @fwd_decl_avx()378// ITANIUM: ret i32 2379 380// WINDOWS: define dso_local i32 @fwd_decl_default()381// WINDOWS: ret i32 2382// WINDOWS: define dso_local i32 @fwd_decl_avx.avx()383// WINDOWS: ret i32 2384// WINDOWS: define dso_local i32 @fwd_decl_avx()385// WINDOWS: ret i32 2386 387// ITANIUM: define{{.*}} void @bar5()388// ITANIUM: call i32 @fwd_decl_default.ifunc()389// ITANIUM: call i32 @fwd_decl_avx.ifunc()390 391// WINDOWS: define dso_local void @bar5()392// WINDOWS: call i32 @fwd_decl_default.resolver()393// WINDOWS: call i32 @fwd_decl_avx.resolver()394 395// ITANIUM: define weak_odr ptr @fwd_decl_default.resolver() #[[ATTR_RESOLVER]]396// LINUX-SAME: comdat397// ITANIUM: call void @__cpu_indicator_init()398// ITANIUM: ret ptr @fwd_decl_default399// ITANIUM: define weak_odr ptr @fwd_decl_avx.resolver() #[[ATTR_RESOLVER]]400// LINUX-SAME: comdat401// ITANIUM: call void @__cpu_indicator_init()402// ITANIUM: ret ptr @fwd_decl_avx.avx403// ITANIUM: ret ptr @fwd_decl_avx404 405// WINDOWS: define weak_odr dso_local i32 @fwd_decl_default.resolver() #[[ATTR_RESOLVER]] comdat406// WINDOWS: call void @__cpu_indicator_init()407// WINDOWS: call i32 @fwd_decl_default408// WINDOWS: define weak_odr dso_local i32 @fwd_decl_avx.resolver() #[[ATTR_RESOLVER]] comdat409// WINDOWS: call void @__cpu_indicator_init()410// WINDOWS: call i32 @fwd_decl_avx.avx411// WINDOWS: call i32 @fwd_decl_avx412 413// ITANIUM: define{{.*}} i32 @changed_to_mv.avx()414// ITANIUM: define{{.*}} i32 @changed_to_mv.fma4()415 416// WINDOWS: define dso_local i32 @changed_to_mv.avx()417// WINDOWS: define dso_local i32 @changed_to_mv.fma4()418 419// ITANIUM: define linkonce void @foo_used(i32 noundef %{{.*}}, double noundef %{{.*}})420// ITANIUM-NOT: @foo_used.avx_sse4.2(421// ITANIUM-NOT: @foo_used2(422// ITANIUM: define linkonce void @foo_used2.avx_sse4.2(i32 noundef %{{.*}}, double noundef %{{.*}})423 424// WINDOWS: define linkonce_odr dso_local void @foo_used(i32 noundef %{{.*}}, double noundef %{{.*}})425// WINDOWS-NOT: @foo_used.avx_sse4.2(426// WINDOWS-NOT: @foo_used2(427// WINDOWS: define linkonce_odr dso_local void @foo_used2.avx_sse4.2(i32 noundef %{{.*}}, double noundef %{{.*}})428 429// ITANIUM: declare i32 @foo.arch_sandybridge()430// WINDOWS: declare dso_local i32 @foo.arch_sandybridge()431 432// ITANIUM: define linkonce i32 @foo_inline.sse4.2()433// ITANIUM: ret i32 0434 435// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.sse4.2()436// WINDOWS: ret i32 0437 438// ITANIUM: declare i32 @foo_inline.arch_sandybridge()439 440// WINDOWS: declare dso_local i32 @foo_inline.arch_sandybridge()441 442// ITANIUM: define linkonce i32 @foo_inline.arch_ivybridge()443// ITANIUM: ret i32 1444// ITANIUM: define linkonce i32 @foo_inline()445// ITANIUM: ret i32 2446 447// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.arch_ivybridge()448// WINDOWS: ret i32 1449// WINDOWS: define linkonce_odr dso_local i32 @foo_inline()450// WINDOWS: ret i32 2451 452// ITANIUM: define linkonce void @foo_decls()453// ITANIUM: define linkonce void @foo_decls.sse4.2()454 455// WINDOWS: define linkonce_odr dso_local void @foo_decls()456// WINDOWS: define linkonce_odr dso_local void @foo_decls.sse4.2()457 458// ITANIUM: define linkonce void @foo_multi(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})459// ITANIUM: define linkonce void @foo_multi.avx_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})460// ITANIUM: define linkonce void @foo_multi.fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})461// ITANIUM: define linkonce void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})462 463// WINDOWS: define linkonce_odr dso_local void @foo_multi(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})464// WINDOWS: define linkonce_odr dso_local void @foo_multi.avx_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})465// WINDOWS: define linkonce_odr dso_local void @foo_multi.fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})466// WINDOWS: define linkonce_odr dso_local void @foo_multi.arch_ivybridge_fma4_sse4.2(i32 noundef %{{[^,]+}}, double noundef %{{[^\)]+}})467 468// Ensure that we emit the 'static' function here.469// ITANIUM: define linkonce void @pr50025()470// ITANIUM: call void @must_be_emitted471// ITANIUM: define internal void @must_be_emitted()472// WINDOWS: define linkonce_odr dso_local void @pr50025() #{{[0-9]*}} comdat473// WINDOWS: call void @must_be_emitted474// WINDOWS: define internal void @must_be_emitted()475 476// ITANIUM: define linkonce void @pr50025c()477// ITANIUM: call void @pr50025b.ifunc()478// WINDOWS: define linkonce_odr dso_local void @pr50025c() #{{[0-9]*}} comdat479// WINDOWS: call void @pr50025b.resolver()480 481// ITANIUM: define weak_odr ptr @pr50025b.resolver() #[[ATTR_RESOLVER]] 482// LINUX-SAME: comdat483// ITANIUM: ret ptr @pr50025b484// ITANIUM: define linkonce void @pr50025b()485// ITANIUM: call void @must_be_emitted()486// WINDOWS: define weak_odr dso_local void @pr50025b.resolver() #[[ATTR_RESOLVER]] comdat487// WINDOWS: musttail call void @pr50025b()488// WINDOWS: define linkonce_odr dso_local void @pr50025b() #{{[0-9]*}} comdat489// WINDOWS: call void @must_be_emitted()490 491// CHECK: attributes #[[ATTR_RESOLVER]] = { disable_sanitizer_instrumentation }492