Skip to content

Commit c5bd398

Browse files
committed
Supports option 1 of ARM-software/acle#403
1 parent 7a5af4f commit c5bd398

File tree

5 files changed

+39
-5
lines changed

5 files changed

+39
-5
lines changed

clang/lib/CodeGen/Targets/AArch64.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,10 +1336,13 @@ void AArch64ABIInfo::appendAttributeMangling(StringRef AttrStr,
13361336
});
13371337

13381338
llvm::SmallDenseSet<StringRef, 8> UniqueFeats;
1339-
for (auto &Feat : Features)
1339+
for (auto &Feat : Features) {
1340+
if (!getTarget().doesFeatureAffectCodeGen(Feat))
1341+
continue;
13401342
if (auto Ext = llvm::AArch64::parseFMVExtension(Feat))
13411343
if (UniqueFeats.insert(Ext->Name).second)
13421344
Out << 'M' << Ext->Name;
1345+
}
13431346
}
13441347

13451348
std::unique_ptr<TargetCodeGenInfo>

clang/test/CodeGen/AArch64/fmv-duplicate-mangled-name.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_IMPLICIT_DEFAULT
22
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_EXPLICIT_DEFAULT
3+
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_EXPLICIT_VERSION_PRIORITY
4+
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_EXPLICIT_CLONES_PRIORITY
35

46
#if defined(CHECK_IMPLICIT_DEFAULT)
57

@@ -21,4 +23,18 @@ __attribute__((target_version("default"))) int explicit_default_bad(void) { retu
2123
// expected-note@-2 {{previous definition is here}}
2224
__attribute__((target_clones("aes", "lse", "default"))) int explicit_default_bad(void) { return 1; }
2325

26+
#elif defined(CHECK_EXPLICIT_VERSION_PRIORITY)
27+
28+
__attribute__((target_version("aes"))) int explicit_version_priority(void) { return 0; }
29+
// expected-error@+2 {{definition with same mangled name 'explicit_version_priority._Maes' as another definition}}
30+
// expected-note@-2 {{previous definition is here}}
31+
__attribute__((target_version("priority1+aes"))) int explicit_version_priority(void) { return 1; }
32+
33+
#elif defined(CHECK_EXPLICIT_CLONES_PRIORITY)
34+
35+
__attribute__((target_version("aes+priority2"))) int explicit_clones_priority(void) { return 0; }
36+
// expected-error@+2 {{definition with same mangled name 'explicit_clones_priority._Maes' as another definition}}
37+
// expected-note@-2 {{previous definition is here}}
38+
__attribute__((target_clones("priority1+aes", "lse"))) int explicit_clones_priority(void) { return 1; }
39+
2440
#endif

llvm/include/llvm/TargetParser/AArch64FeatPriorities.inc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ enum FeatPriorities {
5959
PRIOR_SME_I64,
6060
PRIOR_SME2,
6161
PRIOR_MOPS,
62-
PRIOR_CSSC
62+
PRIOR_CSSC,
63+
PRIOR_5,
64+
PRIOR_4,
65+
PRIOR_3,
66+
PRIOR_2,
67+
PRIOR_1
6368
};
6469

6570
#endif

llvm/lib/Target/AArch64/AArch64FMV.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,8 @@ def : FMVExtension<"sve2-sha3", "SVE_SHA3">;
8383
def : FMVExtension<"sve2-sm4", "SVE_SM4">;
8484
def : FMVExtension<"wfxt", "WFXT">;
8585
def : FMVExtension<"cssc", "CSSC">;
86+
let FeatureBit = "FEAT_MAX" in def : FMVExtension<"priority1", "1">;
87+
let FeatureBit = "FEAT_MAX" in def : FMVExtension<"priority2", "2">;
88+
let FeatureBit = "FEAT_MAX" in def : FMVExtension<"priority3", "3">;
89+
let FeatureBit = "FEAT_MAX" in def : FMVExtension<"priority4", "4">;
90+
let FeatureBit = "FEAT_MAX" in def : FMVExtension<"priority5", "5">;

llvm/lib/TargetParser/AArch64TargetParser.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,23 @@ std::optional<AArch64::FMVInfo> lookupFMVByID(AArch64::ArchExtKind ExtID) {
5858
uint64_t AArch64::getFMVPriority(ArrayRef<StringRef> Features) {
5959
// Transitively enable the Arch Extensions which correspond to each feature.
6060
ExtensionSet FeatureBits;
61+
uint64_t PriorityMask = 0;
6162
for (const StringRef Feature : Features) {
6263
std::optional<FMVInfo> FMV = parseFMVExtension(Feature);
6364
if (!FMV && Feature.starts_with('+')) {
6465
if (std::optional<ExtensionInfo> Info = targetFeatureToExtension(Feature))
6566
FMV = lookupFMVByID(Info->ID);
6667
}
67-
if (FMV && FMV->ID)
68-
FeatureBits.enable(*FMV->ID);
68+
if (FMV) {
69+
// FMV feature without a corresponding Arch Extension may affect priority
70+
if (FMV->ID)
71+
FeatureBits.enable(*FMV->ID);
72+
else
73+
PriorityMask |= (1ULL << FMV->PriorityBit);
74+
}
6975
}
7076

7177
// Construct a bitmask for all the transitively enabled Arch Extensions.
72-
uint64_t PriorityMask = 0;
7378
for (const FMVInfo &Info : getFMVInfo())
7479
if (Info.ID && FeatureBits.Enabled.test(*Info.ID))
7580
PriorityMask |= (1ULL << Info.PriorityBit);

0 commit comments

Comments
 (0)