xref: /llvm-project/clang/test/CodeGenCXX/attr-target-version.cpp (revision 6f013dbced67948119fe9ca71336f0284975ba4f)
11297ff17SAlexandros Lamprineas // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --global-value-regex ".*" --version 5
2fe5cf480SPavel Iliin // RUN: %clang_cc1 -std=c++11 -triple aarch64-linux-gnu -emit-llvm %s -o - | FileCheck %s
3fe5cf480SPavel Iliin 
4fe5cf480SPavel Iliin int __attribute__((target_version("sme-f64f64+bf16"))) foo(int) { return 1; }
5fe5cf480SPavel Iliin int __attribute__((target_version("default"))) foo(int) { return 2; }
6e8b7d8bfSAlexandros Lamprineas int __attribute__((target_version("sm4+bf16"))) foo(void) { return 3; }
7fe5cf480SPavel Iliin int __attribute__((target_version("default"))) foo(void) { return 4; }
8fe5cf480SPavel Iliin 
9fe5cf480SPavel Iliin struct MyClass {
10fe5cf480SPavel Iliin   int __attribute__((target_version("dotprod"))) goo(int);
11fe5cf480SPavel Iliin   int __attribute__((target_version("crc"))) goo(int);
12fe5cf480SPavel Iliin   int __attribute__((target_version("default"))) goo(int);
139cb50042SAlexandros Lamprineas 
149cb50042SAlexandros Lamprineas   // This should generate one target version but no resolver.
159cb50042SAlexandros Lamprineas   int __attribute__((target_version("default"))) unused_with_forward_default_decl(void);
169cb50042SAlexandros Lamprineas   int __attribute__((target_version("mops"))) unused_with_forward_default_decl(void);
179cb50042SAlexandros Lamprineas 
189cb50042SAlexandros Lamprineas   // This should also generate one target version but no resolver.
199cb50042SAlexandros Lamprineas   int unused_with_implicit_forward_default_decl(void);
209cb50042SAlexandros Lamprineas   int __attribute__((target_version("dotprod"))) unused_with_implicit_forward_default_decl(void);
219cb50042SAlexandros Lamprineas 
229cb50042SAlexandros Lamprineas   // This should also generate one target version but no resolver.
239cb50042SAlexandros Lamprineas   int __attribute__((target_version("aes"))) unused_with_default_decl(void);
249cb50042SAlexandros Lamprineas   int __attribute__((target_version("default"))) unused_with_default_decl(void);
259cb50042SAlexandros Lamprineas 
269cb50042SAlexandros Lamprineas   // This should generate two target versions and the resolver.
279cb50042SAlexandros Lamprineas   int __attribute__((target_version("sve"))) unused_with_default_def(void);
289cb50042SAlexandros Lamprineas   int __attribute__((target_version("default"))) unused_with_default_def(void);
299cb50042SAlexandros Lamprineas 
309cb50042SAlexandros Lamprineas   // This should also generate two target versions and the resolver.
319cb50042SAlexandros Lamprineas   int __attribute__((target_version("fp16"))) unused_with_implicit_default_def(void);
329cb50042SAlexandros Lamprineas   int unused_with_implicit_default_def(void);
339cb50042SAlexandros Lamprineas 
349cb50042SAlexandros Lamprineas   // This should also generate two target versions and the resolver.
359cb50042SAlexandros Lamprineas   int unused_with_implicit_forward_default_def(void);
369cb50042SAlexandros Lamprineas   int __attribute__((target_version("lse"))) unused_with_implicit_forward_default_def(void);
379cb50042SAlexandros Lamprineas 
38772e3164SAlexandros Lamprineas   // This should generate a target version despite the default not being declared.
399cb50042SAlexandros Lamprineas   int __attribute__((target_version("rdm"))) unused_without_default(void);
40fe5cf480SPavel Iliin };
41fe5cf480SPavel Iliin 
42fe5cf480SPavel Iliin int __attribute__((target_version("default"))) MyClass::goo(int) { return 1; }
43fe5cf480SPavel Iliin int __attribute__((target_version("crc"))) MyClass::goo(int) { return 2; }
44fe5cf480SPavel Iliin int __attribute__((target_version("dotprod"))) MyClass::goo(int) { return 3; }
45fe5cf480SPavel Iliin 
469cb50042SAlexandros Lamprineas int __attribute__((target_version("mops"))) MyClass::unused_with_forward_default_decl(void) { return 0; }
479cb50042SAlexandros Lamprineas int __attribute__((target_version("dotprod"))) MyClass::unused_with_implicit_forward_default_decl(void) { return 0; }
489cb50042SAlexandros Lamprineas int __attribute__((target_version("aes"))) MyClass::unused_with_default_decl(void) { return 0; }
499cb50042SAlexandros Lamprineas int __attribute__((target_version("sve"))) MyClass::unused_with_default_def(void) { return 0; }
509cb50042SAlexandros Lamprineas int __attribute__((target_version("default"))) MyClass::unused_with_default_def(void) { return 1; }
519cb50042SAlexandros Lamprineas int __attribute__((target_version("fp16"))) MyClass::unused_with_implicit_default_def(void) { return 0; }
529cb50042SAlexandros Lamprineas int MyClass::unused_with_implicit_default_def(void) { return 1; }
539cb50042SAlexandros Lamprineas int MyClass::unused_with_implicit_forward_default_def(void) { return 0; }
549cb50042SAlexandros Lamprineas int __attribute__((target_version("lse"))) MyClass::unused_with_implicit_forward_default_def(void) { return 1; }
559cb50042SAlexandros Lamprineas int __attribute__((target_version("rdm"))) MyClass::unused_without_default(void) { return 0; }
569cb50042SAlexandros Lamprineas 
57fe5cf480SPavel Iliin int bar() {
58fe5cf480SPavel Iliin   MyClass m;
59fe5cf480SPavel Iliin   return m.goo(1) + foo(1) + foo();
60fe5cf480SPavel Iliin }
61fe5cf480SPavel Iliin 
621be0d9d7SDani //.
63fe5cf480SPavel Iliin // CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
6499d74332SJon Roelofs // CHECK: @_Z3fooi = weak_odr ifunc i32 (i32), ptr @_Z3fooi.resolver
6599d74332SJon Roelofs // CHECK: @_Z3foov = weak_odr ifunc i32 (), ptr @_Z3foov.resolver
66a2d30991SAlexandros Lamprineas // CHECK: @_ZN7MyClass3gooEi = weak_odr ifunc i32 (ptr, i32), ptr @_ZN7MyClass3gooEi.resolver
679cb50042SAlexandros Lamprineas // CHECK: @_ZN7MyClass23unused_with_default_defEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClass23unused_with_default_defEv.resolver
689cb50042SAlexandros Lamprineas // CHECK: @_ZN7MyClass32unused_with_implicit_default_defEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClass32unused_with_implicit_default_defEv.resolver
699cb50042SAlexandros Lamprineas // CHECK: @_ZN7MyClass40unused_with_implicit_forward_default_defEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClass40unused_with_implicit_forward_default_defEv.resolver
701be0d9d7SDani //.
71a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_Z3fooi._Mbf16Msme-f64f64(
72a2d30991SAlexandros Lamprineas // CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
73a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
74772e3164SAlexandros Lamprineas // CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
75a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4
76772e3164SAlexandros Lamprineas // CHECK-NEXT:    ret i32 1
77772e3164SAlexandros Lamprineas //
78772e3164SAlexandros Lamprineas //
79a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_Z3fooi.default(
80a2d30991SAlexandros Lamprineas // CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] {
81a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
82fe5cf480SPavel Iliin // CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
83a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4
849cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 2
859cb50042SAlexandros Lamprineas //
869cb50042SAlexandros Lamprineas //
87e8b7d8bfSAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_Z3foov._Mbf16Msm4(
88a2d30991SAlexandros Lamprineas // CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
89a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
90772e3164SAlexandros Lamprineas // CHECK-NEXT:    ret i32 3
91772e3164SAlexandros Lamprineas //
92772e3164SAlexandros Lamprineas //
93a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_Z3foov.default(
94a2d30991SAlexandros Lamprineas // CHECK-SAME: ) #[[ATTR1]] {
95a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
969cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 4
979cb50042SAlexandros Lamprineas //
989cb50042SAlexandros Lamprineas //
99a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass3gooEi.default(
100a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]], i32 noundef [[TMP0:%.*]]) #[[ATTR1]] {
101a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1029cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1039cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
104a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
105a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4
1069cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
107fe5cf480SPavel Iliin // CHECK-NEXT:    ret i32 1
1081be0d9d7SDani //
1091be0d9d7SDani //
110a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass3gooEi._Mcrc(
111a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]], i32 noundef [[TMP0:%.*]]) #[[ATTR3:[0-9]+]] {
112a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1139cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1149cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
115a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
116a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4
1179cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1189cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 2
1199cb50042SAlexandros Lamprineas //
1209cb50042SAlexandros Lamprineas //
121a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass3gooEi._Mdotprod(
122a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]], i32 noundef [[TMP0:%.*]]) #[[ATTR4:[0-9]+]] {
123a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1249cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
1259cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
126a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
127a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4
1289cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
129fe5cf480SPavel Iliin // CHECK-NEXT:    ret i32 3
1301be0d9d7SDani //
1311be0d9d7SDani //
132a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass32unused_with_forward_default_declEv._Mmops(
133a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR5:[0-9]+]] {
134a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1359cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
136a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1379cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1389cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
1399cb50042SAlexandros Lamprineas //
1409cb50042SAlexandros Lamprineas //
141a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass41unused_with_implicit_forward_default_declEv._Mdotprod(
142a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR4]] {
143a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1449cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
145a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1469cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1479cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
1489cb50042SAlexandros Lamprineas //
1499cb50042SAlexandros Lamprineas //
150a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass24unused_with_default_declEv._Maes(
151a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR6:[0-9]+]] {
152a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1539cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
154a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1559cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1569cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
1579cb50042SAlexandros Lamprineas //
1589cb50042SAlexandros Lamprineas //
159a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass23unused_with_default_defEv._Msve(
160a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR7:[0-9]+]] {
161a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1629cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
163a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1649cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1659cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
1669cb50042SAlexandros Lamprineas //
1679cb50042SAlexandros Lamprineas //
168a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass23unused_with_default_defEv.default(
169a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] {
170a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1719cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
172a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1739cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1749cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 1
1759cb50042SAlexandros Lamprineas //
1769cb50042SAlexandros Lamprineas //
177a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass32unused_with_implicit_default_defEv._Mfp16(
178a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR8:[0-9]+]] {
179a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1809cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
181a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1829cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1839cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
1849cb50042SAlexandros Lamprineas //
1859cb50042SAlexandros Lamprineas //
186a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass32unused_with_implicit_default_defEv.default(
187a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] {
188a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1899cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
190a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1919cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1929cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 1
1939cb50042SAlexandros Lamprineas //
1949cb50042SAlexandros Lamprineas //
195a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass40unused_with_implicit_forward_default_defEv.default(
196a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] {
197a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
1989cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
199a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2009cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2019cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
2029cb50042SAlexandros Lamprineas //
2039cb50042SAlexandros Lamprineas //
204a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass40unused_with_implicit_forward_default_defEv._Mlse(
205a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR9:[0-9]+]] {
206a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
2079cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
208a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2099cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2109cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 1
2119cb50042SAlexandros Lamprineas //
2129cb50042SAlexandros Lamprineas //
213a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_ZN7MyClass22unused_without_defaultEv._Mrdm(
214a2d30991SAlexandros Lamprineas // CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR10:[0-9]+]] {
215a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
216772e3164SAlexandros Lamprineas // CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8
217a2d30991SAlexandros Lamprineas // CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
218772e3164SAlexandros Lamprineas // CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
219772e3164SAlexandros Lamprineas // CHECK-NEXT:    ret i32 0
220772e3164SAlexandros Lamprineas //
221772e3164SAlexandros Lamprineas //
222a2d30991SAlexandros Lamprineas // CHECK-LABEL: define dso_local noundef i32 @_Z3barv(
223461a0d6cSAlexandros Lamprineas // CHECK-SAME: ) #[[ATTR11:[0-9]+]] {
224a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[ENTRY:.*:]]
2259cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[M:%.*]] = alloca [[STRUCT_MYCLASS:%.*]], align 1
2269cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 @_ZN7MyClass3gooEi(ptr noundef nonnull align 1 dereferenceable(1) [[M]], i32 noundef 1)
2279cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[CALL1:%.*]] = call noundef i32 @_Z3fooi(i32 noundef 1)
2289cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
2299cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[CALL2:%.*]] = call noundef i32 @_Z3foov()
2309cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
2319cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret i32 [[ADD3]]
2329cb50042SAlexandros Lamprineas //
2339cb50042SAlexandros Lamprineas //
234a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_Z3fooi.resolver() comdat {
235a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
23699d74332SJon Roelofs // CHECK-NEXT:    call void @__init_cpu_features_resolver()
23799d74332SJon Roelofs // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
238*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 36033195199759104
239*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 36033195199759104
24099d74332SJon Roelofs // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
241a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
242a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
24399d74332SJon Roelofs // CHECK-NEXT:    ret ptr @_Z3fooi._Mbf16Msme-f64f64
244a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
24599d74332SJon Roelofs // CHECK-NEXT:    ret ptr @_Z3fooi.default
2461be0d9d7SDani //
2471be0d9d7SDani //
248a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_Z3foov.resolver() comdat {
249a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
25099d74332SJon Roelofs // CHECK-NEXT:    call void @__init_cpu_features_resolver()
25199d74332SJon Roelofs // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
252*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 134218528
253*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134218528
25499d74332SJon Roelofs // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
255a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
256a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
257e8b7d8bfSAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_Z3foov._Mbf16Msm4
258a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
25999d74332SJon Roelofs // CHECK-NEXT:    ret ptr @_Z3foov.default
2601be0d9d7SDani //
2611be0d9d7SDani //
262a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_ZN7MyClass3gooEi.resolver() comdat {
263a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
264a2d30991SAlexandros Lamprineas // CHECK-NEXT:    call void @__init_cpu_features_resolver()
265a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
266a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 1024
267a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1024
268a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
269a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
270a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
271a2d30991SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass3gooEi._Mcrc
272a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
273a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
274*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP5:%.*]] = and i64 [[TMP4]], 784
275*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 784
276a2d30991SAlexandros Lamprineas // CHECK-NEXT:    [[TMP7:%.*]] = and i1 true, [[TMP6]]
277a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP7]], label %[[RESOLVER_RETURN1:.*]], label %[[RESOLVER_ELSE2:.*]]
278a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN1]]:
279a2d30991SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass3gooEi._Mdotprod
280a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE2]]:
281a2d30991SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass3gooEi.default
282a2d30991SAlexandros Lamprineas //
283a2d30991SAlexandros Lamprineas //
284a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_ZN7MyClass23unused_with_default_defEv.resolver() comdat {
285a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
2869cb50042SAlexandros Lamprineas // CHECK-NEXT:    call void @__init_cpu_features_resolver()
2879cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
288*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 1073807616
289*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1073807616
2909cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
291a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
292a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
2939cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass23unused_with_default_defEv._Msve
294a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
2959cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass23unused_with_default_defEv.default
2969cb50042SAlexandros Lamprineas //
2979cb50042SAlexandros Lamprineas //
298a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_ZN7MyClass32unused_with_implicit_default_defEv.resolver() comdat {
299a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
3009cb50042SAlexandros Lamprineas // CHECK-NEXT:    call void @__init_cpu_features_resolver()
3019cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
302*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 65792
303*6f013dbcSAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 65792
3049cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
305a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
306a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
3079cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass32unused_with_implicit_default_defEv._Mfp16
308a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
3099cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass32unused_with_implicit_default_defEv.default
3109cb50042SAlexandros Lamprineas //
3119cb50042SAlexandros Lamprineas //
312a2d30991SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @_ZN7MyClass40unused_with_implicit_forward_default_defEv.resolver() comdat {
313a2d30991SAlexandros Lamprineas // CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]
3149cb50042SAlexandros Lamprineas // CHECK-NEXT:    call void @__init_cpu_features_resolver()
3159cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
3169cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 128
3179cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 128
3189cb50042SAlexandros Lamprineas // CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]
319a2d30991SAlexandros Lamprineas // CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
320a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_RETURN]]:
3219cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass40unused_with_implicit_forward_default_defEv._Mlse
322a2d30991SAlexandros Lamprineas // CHECK:       [[RESOLVER_ELSE]]:
3239cb50042SAlexandros Lamprineas // CHECK-NEXT:    ret ptr @_ZN7MyClass40unused_with_implicit_forward_default_defEv.default
32499d74332SJon Roelofs //
3251be0d9d7SDani //.
3261be0d9d7SDani // CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
3271be0d9d7SDani // CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
3281be0d9d7SDani //.
329