[Clang][FMV] Stop emitting implicit default version using target_clones. (#141808)
With the current behavior the following example yields a linker error: "multiple definition of `foo.default'" // Translation Unit 1 __attribute__((target_clones("dotprod, sve"))) int foo(void) { return 1; } // Translation Unit 2 int foo(void) { return 0; } __attribute__((target_version("dotprod"))) int foo(void); __attribute__((target_version("sve"))) int foo(void); int bar(void) { return foo(); } That is because foo.default is generated twice. As a user I don't find this particularly intuitive. If I wanted the default to be generated in TU1 I'd rather write target_clones("dotprod, sve", "default") explicitly. When changing the code I noticed that the RISC-V target defers the resolver emission when encountering a target_version definition. This seems accidental since it only makes sense for AArch64, where we only emit a resolver once we've processed the entire TU, and only if the default version is present. I've changed this so that RISC-V immediately emmits the resolver. I adjusted the codegen tests since the functions now appear in a different order. Implements https://github.com/ARM-software/acle/pull/377
This commit is contained in:
parent
68fd6f4eb8
commit
b3fd2ea888
@ -4237,19 +4237,19 @@ void CodeGenModule::EmitMultiVersionFunctionDefinition(GlobalDecl GD,
|
||||
EmitGlobalFunctionDefinition(GD.getWithMultiVersionIndex(I), nullptr);
|
||||
} else if (auto *TC = FD->getAttr<TargetClonesAttr>()) {
|
||||
for (unsigned I = 0; I < TC->featuresStrs_size(); ++I)
|
||||
// AArch64 favors the default target version over the clone if any.
|
||||
if ((!TC->isDefaultVersion(I) || !getTarget().getTriple().isAArch64()) &&
|
||||
TC->isFirstOfVersion(I))
|
||||
if (TC->isFirstOfVersion(I))
|
||||
EmitGlobalFunctionDefinition(GD.getWithMultiVersionIndex(I), nullptr);
|
||||
// Ensure that the resolver function is also emitted.
|
||||
GetOrCreateMultiVersionResolver(GD);
|
||||
} else
|
||||
EmitGlobalFunctionDefinition(GD, GV);
|
||||
|
||||
// Defer the resolver emission until we can reason whether the TU
|
||||
// contains a default target version implementation.
|
||||
if (FD->isTargetVersionMultiVersion())
|
||||
AddDeferredMultiVersionResolverToEmit(GD);
|
||||
// Ensure that the resolver function is also emitted.
|
||||
if (FD->isTargetVersionMultiVersion() || FD->isTargetClonesMultiVersion()) {
|
||||
// On AArch64 defer the resolver emission until the entire TU is processed.
|
||||
if (getTarget().getTriple().isAArch64())
|
||||
AddDeferredMultiVersionResolverToEmit(GD);
|
||||
else
|
||||
GetOrCreateMultiVersionResolver(GD);
|
||||
}
|
||||
}
|
||||
|
||||
void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD, llvm::GlobalValue *GV) {
|
||||
@ -4351,7 +4351,7 @@ void CodeGenModule::emitMultiVersionFunctions() {
|
||||
};
|
||||
|
||||
// For AArch64, a resolver is only emitted if a function marked with
|
||||
// target_version("default")) or target_clones() is present and defined
|
||||
// target_version("default")) or target_clones("default") is defined
|
||||
// in this TU. For other architectures it is always emitted.
|
||||
bool ShouldEmitResolver = !getTarget().getTriple().isAArch64();
|
||||
SmallVector<CodeGenFunction::FMVResolverOption, 10> Options;
|
||||
@ -4374,12 +4374,11 @@ void CodeGenModule::emitMultiVersionFunctions() {
|
||||
TVA->getFeatures(Feats, Delim);
|
||||
Options.emplace_back(Func, Feats);
|
||||
} else if (const auto *TC = CurFD->getAttr<TargetClonesAttr>()) {
|
||||
if (IsDefined)
|
||||
ShouldEmitResolver = true;
|
||||
for (unsigned I = 0; I < TC->featuresStrs_size(); ++I) {
|
||||
if (!TC->isFirstOfVersion(I))
|
||||
continue;
|
||||
|
||||
if (TC->isDefaultVersion(I) && IsDefined)
|
||||
ShouldEmitResolver = true;
|
||||
llvm::Function *Func = createFunction(CurFD, I);
|
||||
Feats.clear();
|
||||
if (getTarget().getTriple().isX86()) {
|
||||
|
@ -3495,13 +3495,7 @@ static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
|
||||
if (HasCommas && AL.getNumArgs() > 1)
|
||||
S.Diag(AL.getLoc(), diag::warn_target_clone_mixed_values);
|
||||
|
||||
if (S.Context.getTargetInfo().getTriple().isAArch64() && !HasDefault) {
|
||||
// Add default attribute if there is no one
|
||||
HasDefault = true;
|
||||
Strings.push_back("default");
|
||||
}
|
||||
|
||||
if (!HasDefault) {
|
||||
if (!HasDefault && !S.Context.getTargetInfo().getTriple().isAArch64()) {
|
||||
S.Diag(AL.getLoc(), diag::err_target_clone_must_have_default);
|
||||
return;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -ast-dump %s | FileCheck %s
|
||||
|
||||
int __attribute__((target_version("sve2-bitperm + sha2"))) foov(void) { return 1; }
|
||||
int __attribute__((target_clones(" lse + fp + sha3 "))) fooc(void) { return 2; }
|
||||
int __attribute__((target_clones(" lse + fp + sha3 ", "default"))) fooc(void) { return 2; }
|
||||
// CHECK: TargetVersionAttr
|
||||
// CHECK: sve2-bitperm + sha2
|
||||
// CHECK: TargetClonesAttr
|
||||
|
@ -97,7 +97,7 @@ __attribute__((target_version("wfxt"))) int fmv(void) { return 0; }
|
||||
|
||||
__attribute__((target_version("cssc+fp"))) int fmv(void);
|
||||
|
||||
__attribute__((target_version("default"))) int fmv(void);
|
||||
__attribute__((target_version("default"))) int fmv(void) { return 0; }
|
||||
|
||||
int caller() {
|
||||
return fmv();
|
||||
@ -121,6 +121,322 @@ int caller() {
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mbti
|
||||
// CHECK-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mcrc
|
||||
// CHECK-SAME: () #[[ATTR3:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mcssc
|
||||
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdit
|
||||
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdotprod
|
||||
// CHECK-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdpb
|
||||
// CHECK-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdpb2
|
||||
// CHECK-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mf32mm
|
||||
// CHECK-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mf64mm
|
||||
// CHECK-SAME: () #[[ATTR10:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfcma
|
||||
// CHECK-SAME: () #[[ATTR11:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mflagm
|
||||
// CHECK-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mflagm2
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp
|
||||
// CHECK-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp16
|
||||
// CHECK-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp16fml
|
||||
// CHECK-SAME: () #[[ATTR16:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfrintts
|
||||
// CHECK-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mi8mm
|
||||
// CHECK-SAME: () #[[ATTR18:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR19:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mlse
|
||||
// CHECK-SAME: () #[[ATTR20:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mmemtag
|
||||
// CHECK-SAME: () #[[ATTR21:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mmops
|
||||
// CHECK-SAME: () #[[ATTR22:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc
|
||||
// CHECK-SAME: () #[[ATTR23:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc2
|
||||
// CHECK-SAME: () #[[ATTR24:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc3
|
||||
// CHECK-SAME: () #[[ATTR25:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR26:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrng
|
||||
// CHECK-SAME: () #[[ATTR27:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msb
|
||||
// CHECK-SAME: () #[[ATTR28:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msha2
|
||||
// CHECK-SAME: () #[[ATTR29:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msha3
|
||||
// CHECK-SAME: () #[[ATTR30:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msimd
|
||||
// CHECK-SAME: () #[[ATTR31:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msm4
|
||||
// CHECK-SAME: () #[[ATTR32:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme
|
||||
// CHECK-SAME: () #[[ATTR33:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme-f64f64
|
||||
// CHECK-SAME: () #[[ATTR34:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme-i16i64
|
||||
// CHECK-SAME: () #[[ATTR35:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme2
|
||||
// CHECK-SAME: () #[[ATTR36:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mssbs
|
||||
// CHECK-SAME: () #[[ATTR37:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve
|
||||
// CHECK-SAME: () #[[ATTR38:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2
|
||||
// CHECK-SAME: () #[[ATTR39:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-aes
|
||||
// CHECK-SAME: () #[[ATTR40:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-bitperm
|
||||
// CHECK-SAME: () #[[ATTR41:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-sha3
|
||||
// CHECK-SAME: () #[[ATTR42:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone vscale_range(1,16)
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-sm4
|
||||
// CHECK-SAME: () #[[ATTR43:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mwfxt
|
||||
// CHECK-SAME: () #[[ATTR44:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv.default
|
||||
// CHECK-SAME: () #[[ATTR45:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@caller
|
||||
// CHECK-SAME: () #[[ATTR46:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @fmv()
|
||||
// CHECK-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -494,322 +810,6 @@ int caller() {
|
||||
// CHECK: resolver_else90:
|
||||
// CHECK-NEXT: ret ptr @fmv.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mbti
|
||||
// CHECK-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mcrc
|
||||
// CHECK-SAME: () #[[ATTR3:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mcssc
|
||||
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdit
|
||||
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdotprod
|
||||
// CHECK-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdpb
|
||||
// CHECK-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mdpb2
|
||||
// CHECK-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mf32mm
|
||||
// CHECK-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mf64mm
|
||||
// CHECK-SAME: () #[[ATTR10:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfcma
|
||||
// CHECK-SAME: () #[[ATTR11:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mflagm
|
||||
// CHECK-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mflagm2
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp
|
||||
// CHECK-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp16
|
||||
// CHECK-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfp16fml
|
||||
// CHECK-SAME: () #[[ATTR16:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mfrintts
|
||||
// CHECK-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mi8mm
|
||||
// CHECK-SAME: () #[[ATTR18:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR19:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mlse
|
||||
// CHECK-SAME: () #[[ATTR20:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mmemtag
|
||||
// CHECK-SAME: () #[[ATTR21:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mmops
|
||||
// CHECK-SAME: () #[[ATTR22:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc
|
||||
// CHECK-SAME: () #[[ATTR23:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc2
|
||||
// CHECK-SAME: () #[[ATTR24:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrcpc3
|
||||
// CHECK-SAME: () #[[ATTR25:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR26:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mrng
|
||||
// CHECK-SAME: () #[[ATTR27:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msb
|
||||
// CHECK-SAME: () #[[ATTR28:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msha2
|
||||
// CHECK-SAME: () #[[ATTR29:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msha3
|
||||
// CHECK-SAME: () #[[ATTR30:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msimd
|
||||
// CHECK-SAME: () #[[ATTR31:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msm4
|
||||
// CHECK-SAME: () #[[ATTR32:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme
|
||||
// CHECK-SAME: () #[[ATTR33:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme-f64f64
|
||||
// CHECK-SAME: () #[[ATTR34:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme-i16i64
|
||||
// CHECK-SAME: () #[[ATTR35:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msme2
|
||||
// CHECK-SAME: () #[[ATTR36:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mssbs
|
||||
// CHECK-SAME: () #[[ATTR37:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve
|
||||
// CHECK-SAME: () #[[ATTR38:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2
|
||||
// CHECK-SAME: () #[[ATTR39:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-aes
|
||||
// CHECK-SAME: () #[[ATTR40:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-bitperm
|
||||
// CHECK-SAME: () #[[ATTR41:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-sha3
|
||||
// CHECK-SAME: () #[[ATTR42:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Msve2-sm4
|
||||
// CHECK-SAME: () #[[ATTR43:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv._Mwfxt
|
||||
// CHECK-SAME: () #[[ATTR44:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@caller
|
||||
// CHECK-SAME: () #[[ATTR45:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @fmv()
|
||||
// CHECK-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv.default
|
||||
// CHECK-SAME: () #[[ATTR46:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//.
|
||||
// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
|
||||
// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
|
||||
|
24
clang/test/CodeGen/AArch64/fmv-duplicate-mangled-name.c
Normal file
24
clang/test/CodeGen/AArch64/fmv-duplicate-mangled-name.c
Normal file
@ -0,0 +1,24 @@
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_IMPLICIT_DEFAULT
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -verify -emit-llvm-only %s -DCHECK_EXPLICIT_DEFAULT
|
||||
|
||||
#if defined(CHECK_IMPLICIT_DEFAULT)
|
||||
|
||||
int implicit_default_ok(void) { return 0; }
|
||||
__attribute__((target_clones("aes", "lse"))) int implicit_default_ok(void) { return 1; }
|
||||
|
||||
int implicit_default_bad(void) { return 0; }
|
||||
// expected-error@+2 {{definition with same mangled name 'implicit_default_bad.default' as another definition}}
|
||||
// expected-note@-2 {{previous definition is here}}
|
||||
__attribute__((target_clones("aes", "lse", "default"))) int implicit_default_bad(void) { return 1; }
|
||||
|
||||
#elif defined(CHECK_EXPLICIT_DEFAULT)
|
||||
|
||||
__attribute__((target_version("default"))) int explicit_default_ok(void) { return 0; }
|
||||
__attribute__((target_clones("aes", "lse"))) int explicit_default_ok(void) { return 1; }
|
||||
|
||||
__attribute__((target_version("default"))) int explicit_default_bad(void) { return 0; }
|
||||
// expected-error@+2 {{definition with same mangled name 'explicit_default_bad.default' as another definition}}
|
||||
// expected-note@-2 {{previous definition is here}}
|
||||
__attribute__((target_clones("aes", "lse", "default"))) int explicit_default_bad(void) { return 1; }
|
||||
|
||||
#endif
|
@ -140,7 +140,7 @@ __attribute__((target_version("crc+bti+bti+bti+aes+aes+bf16"))) int fmv(void) {
|
||||
__attribute__((target_version("non_existent_extension"))) int fmv(void);
|
||||
|
||||
// CHECK: define dso_local i32 @fmv.default() #[[default:[0-9]+]] {
|
||||
__attribute__((target_version("default"))) int fmv(void);
|
||||
__attribute__((target_version("default"))) int fmv(void) { return 0; }
|
||||
|
||||
int caller() {
|
||||
return fmv();
|
||||
|
@ -68,6 +68,14 @@ inline __attribute__((target_version("default"))) void linkonce_func(void) {}
|
||||
void call_linkonce(void) { linkonce_func(); }
|
||||
|
||||
|
||||
// Test that an ifunc is generated when the clones attribute has a default version.
|
||||
__attribute__((target_clones("default", "aes"))) void clones_with_default(void) {}
|
||||
|
||||
|
||||
// Test that an ifunc is NOT generated when the clones attribute does not have a default version.
|
||||
__attribute__((target_clones("aes"))) void clones_without_default(void) {}
|
||||
|
||||
|
||||
//.
|
||||
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
|
||||
// CHECK: @used_before_default_def = weak_odr ifunc void (), ptr @used_before_default_def.resolver
|
||||
@ -76,6 +84,7 @@ void call_linkonce(void) { linkonce_func(); }
|
||||
// CHECK: @indirect_use = weak_odr ifunc void (), ptr @indirect_use.resolver
|
||||
// CHECK: @internal_func = internal ifunc void (), ptr @internal_func.resolver
|
||||
// CHECK: @linkonce_func = weak_odr ifunc void (), ptr @linkonce_func.resolver
|
||||
// CHECK: @clones_with_default = weak_odr ifunc void (), ptr @clones_with_default.resolver
|
||||
//.
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@used_before_default_def._Maes
|
||||
@ -228,6 +237,27 @@ void call_linkonce(void) { linkonce_func(); }
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@clones_with_default.default
|
||||
// CHECK-SAME: () #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@clones_with_default._Maes
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@clones_without_default._Maes
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@used_before_default_def.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -339,6 +369,20 @@ void call_linkonce(void) { linkonce_func(); }
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @linkonce_func.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@clones_with_default.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 33536
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 33536
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @clones_with_default._Maes
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @clones_with_default.default
|
||||
//
|
||||
//.
|
||||
// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
|
||||
// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
|
||||
|
@ -4,19 +4,19 @@
|
||||
|
||||
// The following is guarded because in NOFMV we get an error for redefining the default.
|
||||
#ifdef __HAVE_FUNCTION_MULTI_VERSIONING
|
||||
int explicit_default(void) { return 0; }
|
||||
__attribute__((target_version("jscvt"))) int explicit_default(void) { return 1; }
|
||||
__attribute__((target_clones("dotprod", "lse"))) int explicit_default(void) { return 2; }
|
||||
__attribute__((target_version("rdma"))) int explicit_default(void) { return 3; }
|
||||
|
||||
int foo(void) { return explicit_default(); }
|
||||
#endif
|
||||
|
||||
int implicit_default(void) { return 0; }
|
||||
__attribute__((target_version("jscvt"))) int implicit_default(void) { return 1; }
|
||||
__attribute__((target_clones("dotprod", "lse"))) int implicit_default(void) { return 2; }
|
||||
__attribute__((target_version("rdma"))) int implicit_default(void) { return 3; }
|
||||
|
||||
int bar(void) { return implicit_default(); }
|
||||
int foo(void) { return implicit_default(); }
|
||||
#endif
|
||||
|
||||
__attribute__((target_version("jscvt"))) int explicit_default(void) { return 1; }
|
||||
__attribute__((target_clones("dotprod", "lse", "default"))) int explicit_default(void) { return 2; }
|
||||
__attribute__((target_version("rdma"))) int explicit_default(void) { return 3; }
|
||||
|
||||
int bar(void) { return explicit_default(); }
|
||||
|
||||
// These shouldn't generate anything.
|
||||
int unused_version_declarations(void);
|
||||
@ -30,78 +30,40 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
|
||||
|
||||
//.
|
||||
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
|
||||
// CHECK: @explicit_default = weak_odr ifunc i32 (), ptr @explicit_default.resolver
|
||||
// CHECK: @implicit_default = weak_odr ifunc i32 (), ptr @implicit_default.resolver
|
||||
// CHECK: @explicit_default = weak_odr ifunc i32 (), ptr @explicit_default.resolver
|
||||
// CHECK: @default_def_with_version_decls = weak_odr ifunc i32 (), ptr @default_def_with_version_decls.resolver
|
||||
//.
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default.default
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default.default
|
||||
// CHECK-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mjscvt
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mdotprod
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mdotprod
|
||||
// CHECK-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mlse
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mlse
|
||||
// CHECK-SAME: () #[[ATTR3:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1048832
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1048832
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mjscvt
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 832
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 832
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mrdm
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 784
|
||||
// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 784
|
||||
// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]
|
||||
// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mdotprod
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 128
|
||||
// CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP13]], 128
|
||||
// CHECK-NEXT: [[TMP15:%.*]] = and i1 true, [[TMP14]]
|
||||
// CHECK-NEXT: br i1 [[TMP15]], label [[RESOLVER_RETURN5:%.*]], label [[RESOLVER_ELSE6:%.*]]
|
||||
// CHECK: resolver_return5:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mlse
|
||||
// CHECK: resolver_else6:
|
||||
// CHECK-NEXT: ret ptr @explicit_default.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mrdm
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
@ -111,31 +73,60 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
|
||||
// CHECK-LABEL: define {{[^@]+}}@foo
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @explicit_default()
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @implicit_default()
|
||||
// CHECK-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mjscvt
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR1]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mdotprod
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mdotprod
|
||||
// CHECK-SAME: () #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mlse
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mlse
|
||||
// CHECK-SAME: () #[[ATTR3]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default.default
|
||||
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@bar
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @explicit_default()
|
||||
// CHECK-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.default
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -174,33 +165,42 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
|
||||
// CHECK-NEXT: ret ptr @implicit_default.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@bar
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @implicit_default()
|
||||
// CHECK-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.default
|
||||
// CHECK-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@implicit_default.default
|
||||
// CHECK-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
// CHECK-LABEL: define {{[^@]+}}@explicit_default.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 1048832
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1048832
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mjscvt
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 832
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 832
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mrdm
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 784
|
||||
// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 784
|
||||
// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]
|
||||
// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mdotprod
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 128
|
||||
// CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP13]], 128
|
||||
// CHECK-NEXT: [[TMP15:%.*]] = and i1 true, [[TMP14]]
|
||||
// CHECK-NEXT: br i1 [[TMP15]], label [[RESOLVER_RETURN5:%.*]], label [[RESOLVER_ELSE6:%.*]]
|
||||
// CHECK: resolver_return5:
|
||||
// CHECK-NEXT: ret ptr @explicit_default._Mlse
|
||||
// CHECK: resolver_else6:
|
||||
// CHECK-NEXT: ret ptr @explicit_default.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@default_def_with_version_decls.resolver() comdat {
|
||||
@ -234,7 +234,7 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
|
||||
//
|
||||
//
|
||||
// CHECK-NOFMV: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-NOFMV-LABEL: define {{[^@]+}}@implicit_default
|
||||
// CHECK-NOFMV-LABEL: define {{[^@]+}}@explicit_default
|
||||
// CHECK-NOFMV-SAME: () #[[ATTR0:[0-9]+]] {
|
||||
// CHECK-NOFMV-NEXT: entry:
|
||||
// CHECK-NOFMV-NEXT: ret i32 2
|
||||
@ -244,7 +244,7 @@ __attribute__((target_version("jscvt"))) int default_def_with_version_decls(void
|
||||
// CHECK-NOFMV-LABEL: define {{[^@]+}}@bar
|
||||
// CHECK-NOFMV-SAME: () #[[ATTR0]] {
|
||||
// CHECK-NOFMV-NEXT: entry:
|
||||
// CHECK-NOFMV-NEXT: [[CALL:%.*]] = call i32 @implicit_default()
|
||||
// CHECK-NOFMV-NEXT: [[CALL:%.*]] = call i32 @explicit_default()
|
||||
// CHECK-NOFMV-NEXT: ret i32 [[CALL]]
|
||||
//
|
||||
//
|
||||
|
@ -6,15 +6,15 @@
|
||||
int __attribute__((target_clones("lse+aes", "sve2"))) ftc(void) { return 0; }
|
||||
int __attribute__((target_clones("sha2", "sha2+memtag", " default "))) ftc_def(void) { return 1; }
|
||||
int __attribute__((target_clones("sha2", "default"))) ftc_dup1(void) { return 2; }
|
||||
int __attribute__((target_clones("fp", "crc+dotprod"))) ftc_dup2(void) { return 3; }
|
||||
int __attribute__((target_clones("memtag", "bti"))) ftc_dup3(void) { return 4; }
|
||||
int __attribute__((target_clones("fp", "crc+dotprod", "default"))) ftc_dup2(void) { return 3; }
|
||||
int __attribute__((target_clones("memtag", "bti", "default"))) ftc_dup3(void) { return 4; }
|
||||
int foo() {
|
||||
return ftc() + ftc_def() + ftc_dup1() + ftc_dup2() + ftc_dup3();
|
||||
}
|
||||
|
||||
inline int __attribute__((target_clones("rng+simd", "rcpc", "sve2-aes+wfxt"))) ftc_inline1(void) { return 1; }
|
||||
inline int __attribute__((target_clones("fp16", "fcma+sve2-bitperm", "default"))) ftc_inline2(void);
|
||||
inline int __attribute__((target_clones("bti", "sve+sb"))) ftc_inline3(void) { return 3; }
|
||||
inline int __attribute__((target_clones("bti", "sve+sb", "default"))) ftc_inline3(void) { return 3; }
|
||||
|
||||
int __attribute__((target_clones("default"))) ftc_direct(void) { return 4; }
|
||||
|
||||
@ -27,23 +27,19 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
|
||||
//.
|
||||
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
|
||||
// CHECK: @ftc = weak_odr ifunc i32 (), ptr @ftc.resolver
|
||||
// CHECK: @ftc_def = weak_odr ifunc i32 (), ptr @ftc_def.resolver
|
||||
// CHECK: @ftc_dup1 = weak_odr ifunc i32 (), ptr @ftc_dup1.resolver
|
||||
// CHECK: @ftc_dup2 = weak_odr ifunc i32 (), ptr @ftc_dup2.resolver
|
||||
// CHECK: @ftc_dup3 = weak_odr ifunc i32 (), ptr @ftc_dup3.resolver
|
||||
// CHECK: @ftc_inline2 = weak_odr ifunc i32 (), ptr @ftc_inline2.resolver
|
||||
// CHECK: @ftc_inline1 = weak_odr ifunc i32 (), ptr @ftc_inline1.resolver
|
||||
// CHECK: @ftc_inline3 = weak_odr ifunc i32 (), ptr @ftc_inline3.resolver
|
||||
//.
|
||||
// CHECK-MTE-BTI: @__aarch64_cpu_features = external dso_local global { i64 }
|
||||
// CHECK-MTE-BTI: @ftc = weak_odr ifunc i32 (), ptr @ftc.resolver
|
||||
// CHECK-MTE-BTI: @ftc_def = weak_odr ifunc i32 (), ptr @ftc_def.resolver
|
||||
// CHECK-MTE-BTI: @ftc_dup1 = weak_odr ifunc i32 (), ptr @ftc_dup1.resolver
|
||||
// CHECK-MTE-BTI: @ftc_dup2 = weak_odr ifunc i32 (), ptr @ftc_dup2.resolver
|
||||
// CHECK-MTE-BTI: @ftc_dup3 = weak_odr ifunc i32 (), ptr @ftc_dup3.resolver
|
||||
// CHECK-MTE-BTI: @ftc_inline2 = weak_odr ifunc i32 (), ptr @ftc_inline2.resolver
|
||||
// CHECK-MTE-BTI: @ftc_inline1 = weak_odr ifunc i32 (), ptr @ftc_inline1.resolver
|
||||
// CHECK-MTE-BTI: @ftc_inline3 = weak_odr ifunc i32 (), ptr @ftc_inline3.resolver
|
||||
//.
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
@ -60,28 +56,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 69793284352
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 69793284352
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @ftc._Msve2
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 33664
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 33664
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @ftc._MaesMlse
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @ftc.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_def._Msha2
|
||||
// CHECK-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
@ -96,6 +70,108 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_def.default
|
||||
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup1._Msha2
|
||||
// CHECK-SAME: () #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup1.default
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2._Mfp
|
||||
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2._McrcMdotprod
|
||||
// CHECK-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2.default
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3._Mmemtag
|
||||
// CHECK-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3._Mbti
|
||||
// CHECK-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3.default
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@foo
|
||||
// CHECK-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @ftc()
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call i32 @ftc_def()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call i32 @ftc_dup1()
|
||||
// CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-NEXT: [[CALL4:%.*]] = call i32 @ftc_dup2()
|
||||
// CHECK-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-NEXT: [[CALL6:%.*]] = call i32 @ftc_dup3()
|
||||
// CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[ADD5]], [[CALL6]]
|
||||
// CHECK-NEXT: ret i32 [[ADD7]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_direct
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@main
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 4
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @ftc_inline1()
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call i32 @ftc_inline2()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call i32 @ftc_inline3()
|
||||
// CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-NEXT: [[CALL4:%.*]] = call i32 @ftc_direct()
|
||||
// CHECK-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-NEXT: ret i32 [[ADD5]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_def.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -118,13 +194,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-NEXT: ret ptr @ftc_def.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup1._Msha2
|
||||
// CHECK-SAME: () #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup1.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -139,20 +208,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-NEXT: ret ptr @ftc_dup1.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2._Mfp
|
||||
// CHECK-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2._McrcMdotprod
|
||||
// CHECK-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -175,20 +230,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-NEXT: ret ptr @ftc_dup2.default
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3._Mmemtag
|
||||
// CHECK-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3._Mbti
|
||||
// CHECK-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -212,96 +253,22 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@foo
|
||||
// CHECK-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @ftc()
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call i32 @ftc_def()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call i32 @ftc_dup1()
|
||||
// CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-NEXT: [[CALL4:%.*]] = call i32 @ftc_dup2()
|
||||
// CHECK-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-NEXT: [[CALL6:%.*]] = call i32 @ftc_dup3()
|
||||
// CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[ADD5]], [[CALL6]]
|
||||
// CHECK-NEXT: ret i32 [[ADD7]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_direct
|
||||
// CHECK-SAME: () #[[ATTR8]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@main
|
||||
// CHECK-SAME: () #[[ATTR8]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 4
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i32 @ftc_inline1()
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call i32 @ftc_inline2()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call i32 @ftc_inline3()
|
||||
// CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-NEXT: [[CALL4:%.*]] = call i32 @ftc_direct()
|
||||
// CHECK-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-NEXT: ret i32 [[ADD5]]
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc.default
|
||||
// CHECK-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_def.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup1.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup2.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_dup3.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline2._Mfp16
|
||||
// CHECK-SAME: () #[[ATTR10:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline2._MfcmaMsve2-bitperm
|
||||
// CHECK-SAME: () #[[ATTR11:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline2.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
@ -330,79 +297,42 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1._MrngMsimd
|
||||
// CHECK-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1._Mrcpc
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1._Mrcpc
|
||||
// CHECK-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 18014743180706560
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 18014743180706560
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 4194304
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 4194304
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @ftc_inline1._Mrcpc
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 769
|
||||
// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 769
|
||||
// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]
|
||||
// CHECK-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @ftc_inline1._MrngMsimd
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @ftc_inline1.default
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK-SAME: () #[[ATTR16:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline3._Mbti
|
||||
// CHECK-SAME: () #[[ATTR7]] {
|
||||
// CHECK-SAME: () #[[ATTR8]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline3._MsbMsve
|
||||
// CHECK-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@ftc_inline3.default
|
||||
// CHECK-SAME: () #[[ATTR9]] {
|
||||
// CHECK-SAME: () #[[ATTR4]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
@ -517,28 +447,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 69793284352
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 69793284352
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-MTE-BTI-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK-MTE-BTI: resolver_return:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc._Msve2
|
||||
// CHECK-MTE-BTI: resolver_else:
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 33664
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 33664
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-MTE-BTI-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK-MTE-BTI: resolver_return1:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc._MaesMlse
|
||||
// CHECK-MTE-BTI: resolver_else2:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc.default
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_def._Msha2
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR2:[0-9]+]] {
|
||||
@ -553,6 +461,108 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_def.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup1._Msha2
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR2]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup1.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2._Mfp
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2._McrcMdotprod
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3._Mmemtag
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3._Mbti
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@foo
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL:%.*]] = call i32 @ftc()
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL1:%.*]] = call i32 @ftc_def()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL2:%.*]] = call i32 @ftc_dup1()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL4:%.*]] = call i32 @ftc_dup2()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL6:%.*]] = call i32 @ftc_dup3()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD7:%.*]] = add nsw i32 [[ADD5]], [[CALL6]]
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 [[ADD7]]
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_direct
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@main
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK-MTE-BTI-NEXT: store i32 0, ptr [[RETVAL]], align 4
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL:%.*]] = call i32 @ftc_inline1()
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL1:%.*]] = call i32 @ftc_inline2()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL2:%.*]] = call i32 @ftc_inline3()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL4:%.*]] = call i32 @ftc_direct()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 [[ADD5]]
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_def.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -575,13 +585,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_def.default
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup1._Msha2
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR2]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup1.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -596,20 +599,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_dup1.default
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2._Mfp
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2._McrcMdotprod
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR5:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -632,20 +621,6 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_dup2.default
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3._Mmemtag
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR6:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3._Mbti
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR7:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -669,96 +644,22 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@foo
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR8:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL:%.*]] = call i32 @ftc()
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL1:%.*]] = call i32 @ftc_def()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL2:%.*]] = call i32 @ftc_dup1()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL4:%.*]] = call i32 @ftc_dup2()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL6:%.*]] = call i32 @ftc_dup3()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD7:%.*]] = add nsw i32 [[ADD5]], [[CALL6]]
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 [[ADD7]]
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_direct
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR8]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@main
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR8]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
||||
// CHECK-MTE-BTI-NEXT: store i32 0, ptr [[RETVAL]], align 4
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL:%.*]] = call i32 @ftc_inline1()
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL1:%.*]] = call i32 @ftc_inline2()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL2:%.*]] = call i32 @ftc_inline3()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-MTE-BTI-NEXT: [[CALL4:%.*]] = call i32 @ftc_direct()
|
||||
// CHECK-MTE-BTI-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]]
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 [[ADD5]]
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_def.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup1.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup2.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_dup3.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline2._Mfp16
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR10:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline2._MfcmaMsve2-bitperm
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR11:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline2.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 2
|
||||
//
|
||||
@ -787,79 +688,42 @@ inline int __attribute__((target_clones("fp16", "sve2-bitperm+fcma", "default"))
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1._MrngMsimd
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR12:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1._Mrcpc
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1._Mrcpc
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1.resolver() comdat {
|
||||
// CHECK-MTE-BTI-NEXT: resolver_entry:
|
||||
// CHECK-MTE-BTI-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 18014743180706560
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 18014743180706560
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-MTE-BTI-NEXT: br i1 [[TMP3]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK-MTE-BTI: resolver_return:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK-MTE-BTI: resolver_else:
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 4194304
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 4194304
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-MTE-BTI-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK-MTE-BTI: resolver_return1:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_inline1._Mrcpc
|
||||
// CHECK-MTE-BTI: resolver_else2:
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 769
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 769
|
||||
// CHECK-MTE-BTI-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]]
|
||||
// CHECK-MTE-BTI-NEXT: br i1 [[TMP11]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK-MTE-BTI: resolver_return3:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_inline1._MrngMsimd
|
||||
// CHECK-MTE-BTI: resolver_else4:
|
||||
// CHECK-MTE-BTI-NEXT: ret ptr @ftc_inline1.default
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline1._Msve2-aesMwfxt
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR16:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline3._Mbti
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR7]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR8]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline3._MsbMsve
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-MTE-BTI: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-MTE-BTI-LABEL: define {{[^@]+}}@ftc_inline3.default
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR9]] {
|
||||
// CHECK-MTE-BTI-SAME: () #[[ATTR4]] {
|
||||
// CHECK-MTE-BTI-NEXT: entry:
|
||||
// CHECK-MTE-BTI-NEXT: ret i32 3
|
||||
//
|
||||
|
@ -49,6 +49,19 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo1.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 2097152
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo1._v
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @foo1.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo1.default(
|
||||
// CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -61,6 +74,26 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo2.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435456
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo2._zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo2._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @foo2.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo2._m(
|
||||
// CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -79,6 +112,26 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo3.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435460
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo3._c_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo3._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @foo3.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo3._m(
|
||||
// CHECK-SAME: ) #[[ATTR3]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -97,6 +150,33 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo4.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo4._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo4._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 402653184
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo4._zba_zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo4.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo4._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -121,6 +201,33 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo5.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo5._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 402653184
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo5._zba_zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo5._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo5.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo5._zba_zbb(
|
||||
// CHECK-SAME: ) #[[ATTR6]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -145,6 +252,33 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo6.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo6._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 134217728
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo6._zba
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo6._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo6.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo6._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -169,6 +303,33 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo7.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo7._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo7._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 134217728
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo7._zba
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo7.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local signext i32 @foo7._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -205,167 +366,6 @@ int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7();
|
||||
// CHECK-NEXT: [[ADD11:%.*]] = add nsw i32 [[ADD9]], [[CALL10]]
|
||||
// CHECK-NEXT: ret i32 [[ADD11]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo1.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 2097152
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo1._v
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @foo1.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo2.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435456
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo2._zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo2._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @foo2.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo3.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435460
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo3._c_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo3._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @foo3.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo4.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo4._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo4._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 402653184
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo4._zba_zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo4.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo5.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo5._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 402653184
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo5._zba_zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo5._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo5.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo6.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo6._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 134217728
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo6._zba
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo6._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo6.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @foo7.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @foo7._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @foo7._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 134217728
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @foo7._zba
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @foo7.default
|
||||
//
|
||||
//.
|
||||
// CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+d,+f,+i,+v,+zicsr,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b" }
|
||||
// CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i" }
|
||||
|
@ -9,7 +9,7 @@ int bar() {
|
||||
}
|
||||
|
||||
template <typename T1, typename T2> struct MyClass {
|
||||
int __attribute__((target_clones("frintts", "ssbs+sme-f64f64"))) foo_tml() { return 1; }
|
||||
int __attribute__((target_clones("frintts", "ssbs+sme-f64f64", "default"))) foo_tml() { return 1; }
|
||||
};
|
||||
|
||||
template <typename T> struct MyClass<int, T> {
|
||||
@ -41,9 +41,7 @@ void run_foo_tml() {
|
||||
//.
|
||||
// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }
|
||||
// CHECK: @_Z7foo_ovli = weak_odr ifunc i32 (i32), ptr @_Z7foo_ovli.resolver
|
||||
// CHECK: @_Z7foo_ovlv = weak_odr ifunc i32 (), ptr @_Z7foo_ovlv.resolver
|
||||
// CHECK: @_ZN7MyClassIssE7foo_tmlEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClassIssE7foo_tmlEv.resolver
|
||||
// CHECK: @_ZN7MyClassIisE7foo_tmlEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClassIisE7foo_tmlEv.resolver
|
||||
//.
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovli._Mfp16(
|
||||
// CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
|
||||
@ -53,6 +51,61 @@ void run_foo_tml() {
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovli.default(
|
||||
// CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK-NEXT: store i32 [[TMP0]], ptr [[DOTADDR]], align 4
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovlv._Mfp16(
|
||||
// CHECK-SAME: ) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z3barv(
|
||||
// CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z7foo_ovli(i32 noundef 1)
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_Z7foo_ovlv()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: ret i32 [[ADD]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local void @_Z11run_foo_tmlv(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[MC1:%.*]] = alloca [[STRUCT_MYCLASS:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC2:%.*]] = alloca [[STRUCT_MYCLASS_0:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC3:%.*]] = alloca [[STRUCT_MYCLASS_1:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC4:%.*]] = alloca [[STRUCT_MYCLASS_2:%.*]], align 1
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN7MyClassIssE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC1]])
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_ZN7MyClassIisE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC2]])
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC3]])
|
||||
// CHECK-NEXT: [[CALL3:%.*]] = call noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC4]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z7foo_ovli.resolver() comdat {
|
||||
// CHECK-NEXT: [[RESOLVER_ENTRY:.*:]]
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
@ -67,83 +120,8 @@ void run_foo_tml() {
|
||||
// CHECK-NEXT: ret ptr @_Z7foo_ovli.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovlv._Mfp16(
|
||||
// CHECK-SAME: ) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z7foo_ovlv.resolver() comdat {
|
||||
// CHECK-NEXT: [[RESOLVER_ENTRY:.*:]]
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 65792
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 65792
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
|
||||
// CHECK: [[RESOLVER_RETURN]]:
|
||||
// CHECK-NEXT: ret ptr @_Z7foo_ovlv._Mfp16
|
||||
// CHECK: [[RESOLVER_ELSE]]:
|
||||
// CHECK-NEXT: ret ptr @_Z7foo_ovlv.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z3barv(
|
||||
// CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_Z7foo_ovli(i32 noundef 1)
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_Z7foo_ovlv()
|
||||
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]
|
||||
// CHECK-NEXT: ret i32 [[ADD]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local void @_Z11run_foo_tmlv(
|
||||
// CHECK-SAME: ) #[[ATTR1]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[MC1:%.*]] = alloca [[STRUCT_MYCLASS:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC2:%.*]] = alloca [[STRUCT_MYCLASS_0:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC3:%.*]] = alloca [[STRUCT_MYCLASS_1:%.*]], align 1
|
||||
// CHECK-NEXT: [[MC4:%.*]] = alloca [[STRUCT_MYCLASS_2:%.*]], align 1
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN7MyClassIssE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC1]])
|
||||
// CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_ZN7MyClassIisE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC2]])
|
||||
// CHECK-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC3]])
|
||||
// CHECK-NEXT: [[CALL3:%.*]] = call noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC4]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovli.default(
|
||||
// CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR2:[0-9]+]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
|
||||
// CHECK-NEXT: store i32 [[TMP0]], ptr [[DOTADDR]], align 4
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovlv.default(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv._Mfrintts(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR3:[0-9]+]] comdat {
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR5:[0-9]+]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
@ -152,7 +130,7 @@ void run_foo_tml() {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv._Msme-f64f64Mssbs(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR4:[0-9]+]] comdat {
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR6:[0-9]+]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
@ -161,7 +139,7 @@ void run_foo_tml() {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv.default(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
@ -192,7 +170,7 @@ void run_foo_tml() {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIisE7foo_tmlEv._Mfrintts(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR3]] comdat {
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR5]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
@ -201,44 +179,13 @@ void run_foo_tml() {
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIisE7foo_tmlEv._Msme-f64f64Mssbs(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR4]] comdat {
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR6]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIisE7foo_tmlEv.default(
|
||||
// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
||||
// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_ZN7MyClassIisE7foo_tmlEv.resolver() comdat {
|
||||
// CHECK-NEXT: [[RESOLVER_ENTRY:.*:]]
|
||||
// CHECK-NEXT: call void @__init_cpu_features_resolver()
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 36596145153180416
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 36596145153180416
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = and i1 true, [[TMP2]]
|
||||
// CHECK-NEXT: br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]
|
||||
// CHECK: [[RESOLVER_RETURN]]:
|
||||
// CHECK-NEXT: ret ptr @_ZN7MyClassIisE7foo_tmlEv._Msme-f64f64Mssbs
|
||||
// CHECK: [[RESOLVER_ELSE]]:
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 16777472
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 16777472
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]]
|
||||
// CHECK-NEXT: br i1 [[TMP7]], label %[[RESOLVER_RETURN1:.*]], label %[[RESOLVER_ELSE2:.*]]
|
||||
// CHECK: [[RESOLVER_RETURN1]]:
|
||||
// CHECK-NEXT: ret ptr @_ZN7MyClassIisE7foo_tmlEv._Mfrintts
|
||||
// CHECK: [[RESOLVER_ELSE2]]:
|
||||
// CHECK-NEXT: ret ptr @_ZN7MyClassIisE7foo_tmlEv.default
|
||||
//
|
||||
//.
|
||||
// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
|
||||
// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
|
||||
|
@ -49,6 +49,19 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo1v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 2097152
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo1v._v
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo1v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo1v.default(
|
||||
// CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -61,6 +74,26 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo2v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435456
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v._zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo2v._m(
|
||||
// CHECK-SAME: ) #[[ATTR1]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -79,6 +112,26 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo3v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435460
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v._c_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo3v._m(
|
||||
// CHECK-SAME: ) #[[ATTR1]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -97,6 +150,33 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo4v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 402653184
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zba_zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo4v._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -121,6 +201,33 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo5v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 402653184
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zba_zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo5v._zba_zbb(
|
||||
// CHECK-SAME: ) #[[ATTR5]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -145,6 +252,33 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo6v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 134217728
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zba
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo6v._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -169,6 +303,33 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo7v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 134217728
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zba
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define dso_local noundef signext i32 @_Z4foo7v._zbb(
|
||||
// CHECK-SAME: ) #[[ATTR2]] {
|
||||
// CHECK-NEXT: entry:
|
||||
@ -197,167 +358,6 @@ int bar() { return foo1() + foo2() + foo3(); }
|
||||
// CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]]
|
||||
// CHECK-NEXT: ret i32 [[ADD3]]
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo1v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 2097152
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo1v._v
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo1v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo2v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435456
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v._zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo2v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo3v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435460
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v._c_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v._m
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo3v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo4v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 402653184
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v._zba_zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo4v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo5v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zba
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 402653184
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zba_zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo5v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo6v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 134217728
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zba
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v._zbb
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo6v.default
|
||||
//
|
||||
//
|
||||
// CHECK-LABEL: define weak_odr ptr @_Z4foo7v.resolver() comdat {
|
||||
// CHECK-NEXT: resolver_entry:
|
||||
// CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null)
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184
|
||||
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184
|
||||
// CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]]
|
||||
// CHECK: resolver_return:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zba_zbb
|
||||
// CHECK: resolver_else:
|
||||
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456
|
||||
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456
|
||||
// CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]]
|
||||
// CHECK: resolver_return1:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zbb
|
||||
// CHECK: resolver_else2:
|
||||
// CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8
|
||||
// CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 134217728
|
||||
// CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728
|
||||
// CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]]
|
||||
// CHECK: resolver_return3:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v._zba
|
||||
// CHECK: resolver_else4:
|
||||
// CHECK-NEXT: ret ptr @_Z4foo7v.default
|
||||
//
|
||||
//.
|
||||
// CHECK: attributes #[[ATTR0]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+d,+f,+i,+m,+v,+zicsr,+zmmul,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b" }
|
||||
// CHECK: attributes #[[ATTR1]] = { mustprogress noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zmmul" }
|
||||
|
@ -13,6 +13,8 @@ int redecl(void);
|
||||
int __attribute__((target_clones("frintts", "simd+fp", "default"))) redecl(void) { return 1; }
|
||||
|
||||
int __attribute__((target_clones("jscvt+fcma", "rcpc", "default"))) redecl2(void);
|
||||
// expected-error@+2 {{'target_clones' attribute does not match previous declaration}}
|
||||
// expected-note@-2 {{previous declaration is here}}
|
||||
int __attribute__((target_clones("jscvt+fcma", "rcpc"))) redecl2(void) { return 1; }
|
||||
|
||||
int __attribute__((target_clones("sve+dotprod"))) redecl3(void);
|
||||
|
Loading…
x
Reference in New Issue
Block a user