18e659401SAlexandros Lamprineas // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 5 28e659401SAlexandros Lamprineas // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s 38e659401SAlexandros Lamprineas 48e659401SAlexandros Lamprineas // Priority biskmasks after feature dependency expansion: 58e659401SAlexandros Lamprineas // 68e659401SAlexandros Lamprineas // MSB LSB 78e659401SAlexandros Lamprineas // 8*474f5d2aSAlexandros Lamprineas // sme2 | wfxt | sme | bf16 | | | fp16 | simd | fp 98e659401SAlexandros Lamprineas // -----+------+-----+------+-------+------+------+------+--- 108e659401SAlexandros Lamprineas // sme2 | | sme | bf16 | rcpc2 | rcpc | fp16 | simd | fp 118e659401SAlexandros Lamprineas // 128e659401SAlexandros Lamprineas // Dependencies should not affect priorities, since a 138e659401SAlexandros Lamprineas // feature can only depend on lower priority features: 148e659401SAlexandros Lamprineas // https://github.com/ARM-software/acle/pull/376 158e659401SAlexandros Lamprineas 16*474f5d2aSAlexandros Lamprineas __attribute__((target_version("sme2+wfxt"))) int fn(void); 178e659401SAlexandros Lamprineas __attribute__((target_version("sme2+rcpc2"))) int fn(void); 188e659401SAlexandros Lamprineas __attribute__((target_version("default"))) int fn(void) { return 0; } 198e659401SAlexandros Lamprineas 208e659401SAlexandros Lamprineas int call() { return fn(); } 218e659401SAlexandros Lamprineas 228e659401SAlexandros Lamprineas // CHECK-LABEL: define dso_local i32 @fn.default( 238e659401SAlexandros Lamprineas // CHECK-SAME: ) #[[ATTR0:[0-9]+]] { 248e659401SAlexandros Lamprineas // CHECK-NEXT: [[ENTRY:.*:]] 258e659401SAlexandros Lamprineas // CHECK-NEXT: ret i32 0 268e659401SAlexandros Lamprineas // 278e659401SAlexandros Lamprineas // 288e659401SAlexandros Lamprineas // CHECK-LABEL: define dso_local i32 @call( 29b93ffa8eSAlexandros Lamprineas // CHECK-SAME: ) #[[ATTR1:[0-9]+]] { 308e659401SAlexandros Lamprineas // CHECK-NEXT: [[ENTRY:.*:]] 318e659401SAlexandros Lamprineas // CHECK-NEXT: [[CALL:%.*]] = call i32 @fn() 328e659401SAlexandros Lamprineas // CHECK-NEXT: ret i32 [[CALL]] 338e659401SAlexandros Lamprineas // 348e659401SAlexandros Lamprineas // 358e659401SAlexandros Lamprineas // CHECK-LABEL: define weak_odr ptr @fn.resolver() comdat { 368e659401SAlexandros Lamprineas // CHECK-NEXT: [[RESOLVER_ENTRY:.*:]] 378e659401SAlexandros Lamprineas // CHECK-NEXT: call void @__init_cpu_features_resolver() 388e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 39*474f5d2aSAlexandros Lamprineas // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 162133984766132992 40*474f5d2aSAlexandros Lamprineas // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 162133984766132992 418e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]] 428e659401SAlexandros Lamprineas // CHECK-NEXT: br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]] 438e659401SAlexandros Lamprineas // CHECK: [[RESOLVER_RETURN]]: 44*474f5d2aSAlexandros Lamprineas // CHECK-NEXT: ret ptr @fn._Msme2Mwfxt 458e659401SAlexandros Lamprineas // CHECK: [[RESOLVER_ELSE]]: 468e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 478e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 144119586269233920 488e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 144119586269233920 498e659401SAlexandros Lamprineas // CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]] 508e659401SAlexandros Lamprineas // CHECK-NEXT: br i1 [[TMP7]], label %[[RESOLVER_RETURN1:.*]], label %[[RESOLVER_ELSE2:.*]] 518e659401SAlexandros Lamprineas // CHECK: [[RESOLVER_RETURN1]]: 528e659401SAlexandros Lamprineas // CHECK-NEXT: ret ptr @fn._Mrcpc2Msme2 538e659401SAlexandros Lamprineas // CHECK: [[RESOLVER_ELSE2]]: 548e659401SAlexandros Lamprineas // CHECK-NEXT: ret ptr @fn.default 558e659401SAlexandros Lamprineas // 56