diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -117,10 +117,17 @@ // for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) { + GlobalVariable *GV = cast(VMap[&*I]); + + SmallVector, 1> MDs; + I->getAllMetadata(MDs); + for (auto MD : MDs) + GV->addMetadata(MD.first, + *MapMetadata(MD.second, VMap, RF_MoveDistinctMDs)); + if (I->isDeclaration()) continue; - GlobalVariable *GV = cast(VMap[&*I]); if (!ShouldCloneDefinition(&*I)) { // Skip after setting the correct linkage for an external reference. GV->setLinkage(GlobalValue::ExternalLinkage); @@ -129,12 +136,6 @@ if (I->hasInitializer()) GV->setInitializer(MapValue(I->getInitializer(), VMap)); - SmallVector, 1> MDs; - I->getAllMetadata(MDs); - for (auto MD : MDs) - GV->addMetadata(MD.first, - *MapMetadata(MD.second, VMap, RF_MoveDistinctMDs)); - copyComdat(GV, &*I); } diff --git a/llvm/test/Other/copy-metadata-of-declaration.ll b/llvm/test/Other/copy-metadata-of-declaration.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Other/copy-metadata-of-declaration.ll @@ -0,0 +1,10 @@ +; RUN: opt -run-twice -verify -S -o - %s | FileCheck %s + +; This test is used to check metadata attached to global variable declarations +; are copied when CloneModule(). This is required by out-of-tree passes. + +; CHECK: @g = external addrspace(64) global i32, !spirv.InOut !0 + +@g = external addrspace(64) global i32, !spirv.InOut !0 + +!0 = !{i32 1}