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