267 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals --include-generated-funcs --global-value-regex ".*"2// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature -v9.5a -emit-llvm -o - %s | FileCheck %s3// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature -fmv -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-NOFMV4 5// The following is guarded because in NOFMV we get an error for redefining the default.6#ifdef __HAVE_FUNCTION_MULTI_VERSIONING7int implicit_default(void) { return 0; }8__attribute__((target_version("jscvt"))) int implicit_default(void) { return 1; }9__attribute__((target_clones("dotprod", "lse"))) int implicit_default(void) { return 2; }10__attribute__((target_version("rdma"))) int implicit_default(void) { return 3; }11 12int foo(void) { return implicit_default(); }13#endif14 15__attribute__((target_version("jscvt"))) int explicit_default(void) { return 1; }16__attribute__((target_clones("dotprod", "lse", "default"))) int explicit_default(void) { return 2; }17__attribute__((target_version("rdma"))) int explicit_default(void) { return 3; }18 19int bar(void) { return explicit_default(); }20 21// These shouldn't generate anything.22int unused_version_declarations(void);23__attribute__((target_clones("dotprod", "lse"))) int unused_version_declarations(void);24__attribute__((target_version("jscvt"))) int unused_version_declarations(void);25 26// These should generate the default (mangled) version and the resolver.27int default_def_with_version_decls(void) { return 0; }28__attribute__((target_clones("dotprod", "lse"))) int default_def_with_version_decls(void);29__attribute__((target_version("jscvt"))) int default_def_with_version_decls(void);30 31//.32// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }33// CHECK: @implicit_default = weak_odr ifunc i32 (), ptr @implicit_default.resolver34// CHECK: @explicit_default = weak_odr ifunc i32 (), ptr @explicit_default.resolver35// CHECK: @default_def_with_version_decls = weak_odr ifunc i32 (), ptr @default_def_with_version_decls.resolver36//.37// CHECK: Function Attrs: noinline nounwind optnone38// CHECK-LABEL: define {{[^@]+}}@implicit_default.default39// CHECK-SAME: () #[[ATTR0:[0-9]+]] {40// CHECK-NEXT: entry:41// CHECK-NEXT: ret i32 042//43//44// CHECK: Function Attrs: noinline nounwind optnone45// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mjscvt46// CHECK-SAME: () #[[ATTR1:[0-9]+]] {47// CHECK-NEXT: entry:48// CHECK-NEXT: ret i32 149//50//51// CHECK: Function Attrs: noinline nounwind optnone52// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mdotprod53// CHECK-SAME: () #[[ATTR2:[0-9]+]] {54// CHECK-NEXT: entry:55// CHECK-NEXT: ret i32 256//57//58// CHECK: Function Attrs: noinline nounwind optnone59// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mlse60// CHECK-SAME: () #[[ATTR3:[0-9]+]] {61// CHECK-NEXT: entry:62// CHECK-NEXT: ret i32 263//64//65// CHECK: Function Attrs: noinline nounwind optnone66// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mrdm67// CHECK-SAME: () #[[ATTR4:[0-9]+]] {68// CHECK-NEXT: entry:69// CHECK-NEXT: ret i32 370//71//72// CHECK: Function Attrs: noinline nounwind optnone73// CHECK-LABEL: define {{[^@]+}}@foo74// CHECK-SAME: () #[[ATTR0]] {75// CHECK-NEXT: entry:76// CHECK-NEXT: [[CALL:%.*]] = call i32 @implicit_default()77// CHECK-NEXT: ret i32 [[CALL]]78//79//80// CHECK: Function Attrs: noinline nounwind optnone81// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mjscvt82// CHECK-SAME: () #[[ATTR1]] {83// CHECK-NEXT: entry:84// CHECK-NEXT: ret i32 185//86//87// CHECK: Function Attrs: noinline nounwind optnone88// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mdotprod89// CHECK-SAME: () #[[ATTR2]] {90// CHECK-NEXT: entry:91// CHECK-NEXT: ret i32 292//93//94// CHECK: Function Attrs: noinline nounwind optnone95// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mlse96// CHECK-SAME: () #[[ATTR3]] {97// CHECK-NEXT: entry:98// CHECK-NEXT: ret i32 299//100//101// CHECK: Function Attrs: noinline nounwind optnone102// CHECK-LABEL: define {{[^@]+}}@explicit_default.default103// CHECK-SAME: () #[[ATTR5:[0-9]+]] {104// CHECK-NEXT: entry:105// CHECK-NEXT: ret i32 2106//107//108// CHECK: Function Attrs: noinline nounwind optnone109// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mrdm110// CHECK-SAME: () #[[ATTR4]] {111// CHECK-NEXT: entry:112// CHECK-NEXT: ret i32 3113//114//115// CHECK: Function Attrs: noinline nounwind optnone116// CHECK-LABEL: define {{[^@]+}}@bar117// CHECK-SAME: () #[[ATTR0]] {118// CHECK-NEXT: entry:119// CHECK-NEXT: [[CALL:%.*]] = call i32 @explicit_default()120// CHECK-NEXT: ret i32 [[CALL]]121//122//123// CHECK: Function Attrs: noinline nounwind optnone124// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.default125// CHECK-SAME: () #[[ATTR0]] {126// CHECK-NEXT: entry:127// CHECK-NEXT: ret i32 0128//129//130// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver()131// CHECK-SAME: #[[ATTR_RESOLVER:[0-9]+]] comdat {132// CHECK-NEXT: resolver_entry:133// CHECK-NEXT: call void @__init_cpu_features_resolver()134// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8135// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1048832136// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1048832137// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]138// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]139// CHECK: resolver_return:140// CHECK-NEXT: ret ptr @implicit_default._Mjscvt141// CHECK: resolver_else:142// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8143// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 832144// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 832145// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]146// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]147// CHECK: resolver_return1:148// CHECK-NEXT: ret ptr @implicit_default._Mrdm149// CHECK: resolver_else2:150// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8151// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 784152// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 784153// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]154// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]155// CHECK: resolver_return3:156// CHECK-NEXT: ret ptr @implicit_default._Mdotprod157// CHECK: resolver_else4:158// CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8159// CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 128160// CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP13]], 128161// CHECK-NEXT: [[TMP15:%.*]] = and i1 true, [[TMP14]]162// CHECK-NEXT: br i1 [[TMP15]], label [[RESOLVER_RETURN5:%.*]], label [[RESOLVER_ELSE6:%.*]]163// CHECK: resolver_return5:164// CHECK-NEXT: ret ptr @implicit_default._Mlse165// CHECK: resolver_else6:166// CHECK-NEXT: ret ptr @implicit_default.default167//168//169// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver()170// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {171// CHECK-NEXT: resolver_entry:172// CHECK-NEXT: call void @__init_cpu_features_resolver()173// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8174// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1048832175// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1048832176// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]177// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]178// CHECK: resolver_return:179// CHECK-NEXT: ret ptr @explicit_default._Mjscvt180// CHECK: resolver_else:181// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8182// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 832183// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 832184// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]185// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]186// CHECK: resolver_return1:187// CHECK-NEXT: ret ptr @explicit_default._Mrdm188// CHECK: resolver_else2:189// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8190// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 784191// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 784192// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]193// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]194// CHECK: resolver_return3:195// CHECK-NEXT: ret ptr @explicit_default._Mdotprod196// CHECK: resolver_else4:197// CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8198// CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 128199// CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP13]], 128200// CHECK-NEXT: [[TMP15:%.*]] = and i1 true, [[TMP14]]201// CHECK-NEXT: br i1 [[TMP15]], label [[RESOLVER_RETURN5:%.*]], label [[RESOLVER_ELSE6:%.*]]202// CHECK: resolver_return5:203// CHECK-NEXT: ret ptr @explicit_default._Mlse204// CHECK: resolver_else6:205// CHECK-NEXT: ret ptr @explicit_default.default206//207//208// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver()209// CHECK-SAME: #[[ATTR_RESOLVER]] comdat {210// CHECK-NEXT: resolver_entry:211// CHECK-NEXT: call void @__init_cpu_features_resolver()212// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8213// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1048832214// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1048832215// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]216// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]217// CHECK: resolver_return:218// CHECK-NEXT: ret ptr @default_def_with_version_decls._Mjscvt219// CHECK: resolver_else:220// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8221// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 784222// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 784223// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]224// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]225// CHECK: resolver_return1:226// CHECK-NEXT: ret ptr @default_def_with_version_decls._Mdotprod227// CHECK: resolver_else2:228// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8229// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 128230// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 128231// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]232// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]233// CHECK: resolver_return3:234// CHECK-NEXT: ret ptr @default_def_with_version_decls._Mlse235// CHECK: resolver_else4:236// CHECK-NEXT: ret ptr @default_def_with_version_decls.default237//238//239// CHECK-NOFMV: Function Attrs: noinline nounwind optnone240// CHECK-NOFMV-LABEL: define {{[^@]+}}@explicit_default241// CHECK-NOFMV-SAME: () #[[ATTR0:[0-9]+]] {242// CHECK-NOFMV-NEXT: entry:243// CHECK-NOFMV-NEXT: ret i32 2244//245//246// CHECK-NOFMV: Function Attrs: noinline nounwind optnone247// CHECK-NOFMV-LABEL: define {{[^@]+}}@bar248// CHECK-NOFMV-SAME: () #[[ATTR0]] {249// CHECK-NOFMV-NEXT: entry:250// CHECK-NOFMV-NEXT: [[CALL:%.*]] = call i32 @explicit_default()251// CHECK-NOFMV-NEXT: ret i32 [[CALL]]252//253//254// CHECK-NOFMV: Function Attrs: noinline nounwind optnone255// CHECK-NOFMV-LABEL: define {{[^@]+}}@default_def_with_version_decls256// CHECK-NOFMV-SAME: () #[[ATTR0]] {257// CHECK-NOFMV-NEXT: entry:258// CHECK-NOFMV-NEXT: ret i32 0259//260//.261// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}262// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}263//.264// CHECK-NOFMV: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}265// CHECK-NOFMV: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}266//.267