193011fe2SAlexandros Lamprineas // Test all of the AArch64 fmv-features metadata without any dependency expansion. 293011fe2SAlexandros Lamprineas // It is used to propagate the attribute string information from C/C++ source to LLVM IR. 393011fe2SAlexandros Lamprineas 493011fe2SAlexandros Lamprineas // RUN: %clang --target=aarch64-linux-gnu --rtlib=compiler-rt -emit-llvm -S -o - %s | FileCheck %s 593011fe2SAlexandros Lamprineas 693011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Maes() #[[aes:[0-9]+]] { 793011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mbf16() #[[bf16:[0-9]+]] { 893011fe2SAlexandros Lamprineas __attribute__((target_clones("aes", "bf16"))) int fmv(void) { return 0; } 993011fe2SAlexandros Lamprineas 1093011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mbti() #[[bti:[0-9]+]] { 1193011fe2SAlexandros Lamprineas __attribute__((target_version("bti"))) int fmv(void) { return 0; } 1293011fe2SAlexandros Lamprineas 1393011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mcrc() #[[crc:[0-9]+]] { 1493011fe2SAlexandros Lamprineas __attribute__((target_version("crc"))) int fmv(void) { return 0; } 1593011fe2SAlexandros Lamprineas 1693011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mdit() #[[dit:[0-9]+]] { 1793011fe2SAlexandros Lamprineas __attribute__((target_version("dit"))) int fmv(void) { return 0; } 1893011fe2SAlexandros Lamprineas 1993011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mdotprod() #[[dotprod:[0-9]+]] { 2093011fe2SAlexandros Lamprineas __attribute__((target_version("dotprod"))) int fmv(void) { return 0; } 2193011fe2SAlexandros Lamprineas 2293011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mdpb() #[[dpb:[0-9]+]] { 2393011fe2SAlexandros Lamprineas __attribute__((target_version("dpb"))) int fmv(void) { return 0; } 2493011fe2SAlexandros Lamprineas 2593011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mdpb2() #[[dpb2:[0-9]+]] { 2693011fe2SAlexandros Lamprineas __attribute__((target_version("dpb2"))) int fmv(void) { return 0; } 2793011fe2SAlexandros Lamprineas 2893011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mf32mm() #[[f32mm:[0-9]+]] { 2993011fe2SAlexandros Lamprineas __attribute__((target_version("f32mm"))) int fmv(void) { return 0; } 3093011fe2SAlexandros Lamprineas 3193011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mf64mm() #[[f64mm:[0-9]+]] { 3293011fe2SAlexandros Lamprineas __attribute__((target_version("f64mm"))) int fmv(void) { return 0; } 3393011fe2SAlexandros Lamprineas 3493011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mfcma() #[[fcma:[0-9]+]] { 3593011fe2SAlexandros Lamprineas __attribute__((target_version("fcma"))) int fmv(void) { return 0; } 3693011fe2SAlexandros Lamprineas 3793011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mflagm() #[[flagm:[0-9]+]] { 3893011fe2SAlexandros Lamprineas __attribute__((target_version("flagm"))) int fmv(void) { return 0; } 3993011fe2SAlexandros Lamprineas 4093011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mflagm2() #[[flagm2:[0-9]+]] { 4193011fe2SAlexandros Lamprineas __attribute__((target_version("flagm2"))) int fmv(void) { return 0; } 4293011fe2SAlexandros Lamprineas 4393011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mfp() #[[fp:[0-9]+]] { 4493011fe2SAlexandros Lamprineas __attribute__((target_version("fp"))) int fmv(void) { return 0; } 4593011fe2SAlexandros Lamprineas 4693011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mfp16() #[[fp16:[0-9]+]] { 4793011fe2SAlexandros Lamprineas __attribute__((target_version("fp16"))) int fmv(void) { return 0; } 4893011fe2SAlexandros Lamprineas 4993011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mfp16fml() #[[fp16fml:[0-9]+]] { 5093011fe2SAlexandros Lamprineas __attribute__((target_version("fp16fml"))) int fmv(void) { return 0; } 5193011fe2SAlexandros Lamprineas 5293011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mfrintts() #[[frintts:[0-9]+]] { 5393011fe2SAlexandros Lamprineas __attribute__((target_version("frintts"))) int fmv(void) { return 0; } 5493011fe2SAlexandros Lamprineas 5593011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mi8mm() #[[i8mm:[0-9]+]] { 5693011fe2SAlexandros Lamprineas __attribute__((target_version("i8mm"))) int fmv(void) { return 0; } 5793011fe2SAlexandros Lamprineas 5893011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mjscvt() #[[jscvt:[0-9]+]] { 5993011fe2SAlexandros Lamprineas __attribute__((target_version("jscvt"))) int fmv(void) { return 0; } 6093011fe2SAlexandros Lamprineas 6193011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mlse() #[[lse:[0-9]+]] { 6293011fe2SAlexandros Lamprineas __attribute__((target_version("lse"))) int fmv(void) { return 0; } 6393011fe2SAlexandros Lamprineas 6493011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mmemtag() #[[memtag:[0-9]+]] { 6593011fe2SAlexandros Lamprineas __attribute__((target_version("memtag"))) int fmv(void) { return 0; } 6693011fe2SAlexandros Lamprineas 6793011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mmops() #[[mops:[0-9]+]] { 6893011fe2SAlexandros Lamprineas __attribute__((target_version("mops"))) int fmv(void) { return 0; } 6993011fe2SAlexandros Lamprineas 7093011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mrcpc() #[[rcpc:[0-9]+]] { 7193011fe2SAlexandros Lamprineas __attribute__((target_version("rcpc"))) int fmv(void) { return 0; } 7293011fe2SAlexandros Lamprineas 7393011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mrcpc2() #[[rcpc2:[0-9]+]] { 7493011fe2SAlexandros Lamprineas __attribute__((target_version("rcpc2"))) int fmv(void) { return 0; } 7593011fe2SAlexandros Lamprineas 7693011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mrcpc3() #[[rcpc3:[0-9]+]] { 7793011fe2SAlexandros Lamprineas __attribute__((target_version("rcpc3"))) int fmv(void) { return 0; } 7893011fe2SAlexandros Lamprineas 7993011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mrdm() #[[rdm:[0-9]+]] { 8093011fe2SAlexandros Lamprineas __attribute__((target_version("rdm"))) int fmv(void) { return 0; } 8193011fe2SAlexandros Lamprineas 8293011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mrng() #[[rng:[0-9]+]] { 8393011fe2SAlexandros Lamprineas __attribute__((target_version("rng"))) int fmv(void) { return 0; } 8493011fe2SAlexandros Lamprineas 8593011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msb() #[[sb:[0-9]+]] { 8693011fe2SAlexandros Lamprineas __attribute__((target_version("sb"))) int fmv(void) { return 0; } 8793011fe2SAlexandros Lamprineas 8893011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msha2() #[[sha2:[0-9]+]] { 8993011fe2SAlexandros Lamprineas __attribute__((target_version("sha2"))) int fmv(void) { return 0; } 9093011fe2SAlexandros Lamprineas 9193011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msha3() #[[sha3:[0-9]+]] { 9293011fe2SAlexandros Lamprineas __attribute__((target_version("sha3"))) int fmv(void) { return 0; } 9393011fe2SAlexandros Lamprineas 9493011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msimd() #[[simd:[0-9]+]] { 9593011fe2SAlexandros Lamprineas __attribute__((target_version("simd"))) int fmv(void) { return 0; } 9693011fe2SAlexandros Lamprineas 9793011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msm4() #[[sm4:[0-9]+]] { 9893011fe2SAlexandros Lamprineas __attribute__((target_version("sm4"))) int fmv(void) { return 0; } 9993011fe2SAlexandros Lamprineas 10093011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msme() #[[sme:[0-9]+]] { 10193011fe2SAlexandros Lamprineas __attribute__((target_version("sme"))) int fmv(void) { return 0; } 10293011fe2SAlexandros Lamprineas 10393011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msme-f64f64() #[[sme_f64f64:[0-9]+]] { 10493011fe2SAlexandros Lamprineas __attribute__((target_version("sme-f64f64"))) int fmv(void) { return 0; } 10593011fe2SAlexandros Lamprineas 10693011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msme-i16i64() #[[sme_i16i64:[0-9]+]] { 10793011fe2SAlexandros Lamprineas __attribute__((target_version("sme-i16i64"))) int fmv(void) { return 0; } 10893011fe2SAlexandros Lamprineas 10993011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msme2() #[[sme2:[0-9]+]] { 11093011fe2SAlexandros Lamprineas __attribute__((target_version("sme2"))) int fmv(void) { return 0; } 11193011fe2SAlexandros Lamprineas 11293011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mssbs() #[[ssbs:[0-9]+]] { 11393011fe2SAlexandros Lamprineas __attribute__((target_version("ssbs"))) int fmv(void) { return 0; } 11493011fe2SAlexandros Lamprineas 11593011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve() #[[sve:[0-9]+]] { 11693011fe2SAlexandros Lamprineas __attribute__((target_version("sve"))) int fmv(void) { return 0; } 11793011fe2SAlexandros Lamprineas 11893011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve2() #[[sve2:[0-9]+]] { 11993011fe2SAlexandros Lamprineas __attribute__((target_version("sve2"))) int fmv(void) { return 0; } 12093011fe2SAlexandros Lamprineas 12193011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve2-aes() #[[sve2_aes:[0-9]+]] { 12293011fe2SAlexandros Lamprineas __attribute__((target_version("sve2-aes"))) int fmv(void) { return 0; } 12393011fe2SAlexandros Lamprineas 12493011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve2-bitperm() #[[sve2_bitperm:[0-9]+]] { 12593011fe2SAlexandros Lamprineas __attribute__((target_version("sve2-bitperm"))) int fmv(void) { return 0; } 12693011fe2SAlexandros Lamprineas 12793011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve2-sha3() #[[sve2_sha3:[0-9]+]] { 12893011fe2SAlexandros Lamprineas __attribute__((target_version("sve2-sha3"))) int fmv(void) { return 0; } 12993011fe2SAlexandros Lamprineas 13093011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Msve2-sm4() #[[sve2_sm4:[0-9]+]] { 13193011fe2SAlexandros Lamprineas __attribute__((target_version("sve2-sm4"))) int fmv(void) { return 0; } 13293011fe2SAlexandros Lamprineas 13393011fe2SAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._Mwfxt() #[[wfxt:[0-9]+]] { 13493011fe2SAlexandros Lamprineas __attribute__((target_version("wfxt"))) int fmv(void) { return 0; } 13593011fe2SAlexandros Lamprineas 136*b93ffa8eSAlexandros Lamprineas // CHECK: define dso_local i32 @fmv._MaesMbf16MbtiMcrc() #[[unordered_features_with_duplicates:[0-9]+]] { 137*b93ffa8eSAlexandros Lamprineas __attribute__((target_version("crc+bti+bti+bti+aes+aes+bf16"))) int fmv(void) { return 0; } 13893011fe2SAlexandros Lamprineas 13993011fe2SAlexandros Lamprineas // CHECK-NOT: define dso_local i32 @fmv._M{{.*}} 14093011fe2SAlexandros Lamprineas __attribute__((target_version("non_existent_extension"))) int fmv(void); 14193011fe2SAlexandros Lamprineas 142*b93ffa8eSAlexandros Lamprineas // CHECK: define dso_local i32 @fmv.default() #[[default:[0-9]+]] { 14393011fe2SAlexandros Lamprineas __attribute__((target_version("default"))) int fmv(void); 14493011fe2SAlexandros Lamprineas 14593011fe2SAlexandros Lamprineas int caller() { 14693011fe2SAlexandros Lamprineas return fmv(); 14793011fe2SAlexandros Lamprineas } 14893011fe2SAlexandros Lamprineas 149*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[aes]] = {{.*}} "fmv-features"="aes" 150*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[bf16]] = {{.*}} "fmv-features"="bf16" 151*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[bti]] = {{.*}} "fmv-features"="bti" 152*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[crc]] = {{.*}} "fmv-features"="crc" 153*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[dit]] = {{.*}} "fmv-features"="dit" 154*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[dotprod]] = {{.*}} "fmv-features"="dotprod" 155*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[dpb]] = {{.*}} "fmv-features"="dpb" 156*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[dpb2]] = {{.*}} "fmv-features"="dpb2" 157*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[f32mm]] = {{.*}} "fmv-features"="f32mm" 158*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[f64mm]] = {{.*}} "fmv-features"="f64mm" 159*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[fcma]] = {{.*}} "fmv-features"="fcma" 160*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[flagm]] = {{.*}} "fmv-features"="flagm" 161*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[flagm2]] = {{.*}} "fmv-features"="flagm2" 162*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[fp]] = {{.*}} "fmv-features"="fp" 163*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[fp16]] = {{.*}} "fmv-features"="fp16" 164*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[fp16fml]] = {{.*}} "fmv-features"="fp16fml" 165*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[frintts]] = {{.*}} "fmv-features"="frintts" 166*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[i8mm]] = {{.*}} "fmv-features"="i8mm" 167*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[jscvt]] = {{.*}} "fmv-features"="jscvt" 168*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[lse]] = {{.*}} "fmv-features"="lse" 169*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[memtag]] = {{.*}} "fmv-features"="memtag" 170*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[mops]] = {{.*}} "fmv-features"="mops" 171*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[rcpc]] = {{.*}} "fmv-features"="rcpc" 172*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[rcpc2]] = {{.*}} "fmv-features"="rcpc2" 173*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[rcpc3]] = {{.*}} "fmv-features"="rcpc3" 174*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[rdm]] = {{.*}} "fmv-features"="rdm" 175*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[rng]] = {{.*}} "fmv-features"="rng" 176*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sb]] = {{.*}} "fmv-features"="sb" 177*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sha2]] = {{.*}} "fmv-features"="sha2" 178*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sha3]] = {{.*}} "fmv-features"="sha3" 179*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[simd]] = {{.*}} "fmv-features"="simd" 180*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sm4]] = {{.*}} "fmv-features"="sm4" 181*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sme]] = {{.*}} "fmv-features"="sme" 182*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sme_f64f64]] = {{.*}} "fmv-features"="sme-f64f64" 183*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sme_i16i64]] = {{.*}} "fmv-features"="sme-i16i64" 184*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sme2]] = {{.*}} "fmv-features"="sme2" 185*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[ssbs]] = {{.*}} "fmv-features"="ssbs" 186*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve]] = {{.*}} "fmv-features"="sve" 187*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve2]] = {{.*}} "fmv-features"="sve2" 188*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve2_aes]] = {{.*}} "fmv-features"="sve2-aes" 189*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve2_bitperm]] = {{.*}} "fmv-features"="sve2-bitperm" 190*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve2_sha3]] = {{.*}} "fmv-features"="sve2-sha3" 191*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[sve2_sm4]] = {{.*}} "fmv-features"="sve2-sm4" 192*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[wfxt]] = {{.*}} "fmv-features"="wfxt" 193*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[unordered_features_with_duplicates]] = {{.*}} "fmv-features"="aes,bf16,bti,crc" 194*b93ffa8eSAlexandros Lamprineas // CHECK: attributes #[[default]] = {{.*}} "fmv-features" 195