diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 0ee315776d33..415633536ad8 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3141,8 +3141,7 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction( (void)OpenMPRuntime->emitDeclareVariant(GD, /*IsForDefinition=*/true); if (FD->isMultiVersion()) { - const auto *TA = FD->getAttr(); - if (TA && TA->isDefaultVersion()) + if (FD->hasAttr()) UpdateMultiVersionNames(GD, FD); if (!IsForDefinition) return GetOrCreateMultiVersionResolver(GD, Ty, FD); diff --git a/clang/test/CodeGen/attr-target-mv.c b/clang/test/CodeGen/attr-target-mv.c index c0c3de5f991a..c089b06d238c 100644 --- a/clang/test/CodeGen/attr-target-mv.c +++ b/clang/test/CodeGen/attr-target-mv.c @@ -47,6 +47,9 @@ void bar5() { fwd_decl_avx(); } +int __attribute__((target("avx"))) changed_to_mv(void) { return 0;} +int __attribute__((target("fma4"))) changed_to_mv(void) { return 1;} + // LINUX: @foo.ifunc = weak_odr ifunc i32 (), i32 ()* ()* @foo.resolver // LINUX: @foo_inline.ifunc = weak_odr ifunc i32 (), i32 ()* ()* @foo_inline.resolver // LINUX: @foo_decls.ifunc = weak_odr ifunc void (), void ()* ()* @foo_decls.resolver @@ -194,6 +197,12 @@ void bar5() { // WINDOWS: call i32 @fwd_decl_avx.avx // WINDOWS: call i32 @fwd_decl_avx +// LINUX: define i32 @changed_to_mv.avx() +// LINUX: define i32 @changed_to_mv.fma4() + +// WINDOWS: define dso_local i32 @changed_to_mv.avx() +// WINDOWS: define dso_local i32 @changed_to_mv.fma4() + // LINUX: declare i32 @foo.arch_sandybridge() // WINDOWS: declare dso_local i32 @foo.arch_sandybridge()