diff --git a/lib/Linker/IRMover.cpp b/lib/Linker/IRMover.cpp index 738dec8e1f2..48b746a22fc 100644 --- a/lib/Linker/IRMover.cpp +++ b/lib/Linker/IRMover.cpp @@ -978,11 +978,14 @@ Expected IRLinker::linkGlobalValueProto(GlobalValue *SGV, // containing a GV from the source module, in which case SGV will be // the same as DGV and NewGV, and TypeMap.get() will assert since it // assumes it is being invoked on a type in the source module. - if (DGV && NewGV != SGV) - C = ConstantExpr::getBitCast(NewGV, TypeMap.get(SGV->getType())); + if (DGV && NewGV != SGV) { + C = ConstantExpr::getPointerBitCastOrAddrSpaceCast( + NewGV, TypeMap.get(SGV->getType())); + } if (DGV && NewGV != DGV) { - DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewGV, DGV->getType())); + DGV->replaceAllUsesWith( + ConstantExpr::getPointerBitCastOrAddrSpaceCast(NewGV, DGV->getType())); DGV->eraseFromParent(); } diff --git a/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll b/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll new file mode 100644 index 00000000000..2097f74c3c2 --- /dev/null +++ b/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll @@ -0,0 +1,2 @@ +@is_really_as1_gv = addrspace(1) global i32 0, align 4 +@is_really_as1_gv_other_type = addrspace(1) global float 4.0, align 4 diff --git a/test/Linker/wrong-addrspace-gv-declaration.ll b/test/Linker/wrong-addrspace-gv-declaration.ll new file mode 100644 index 00000000000..f7037a71d00 --- /dev/null +++ b/test/Linker/wrong-addrspace-gv-declaration.ll @@ -0,0 +1,17 @@ +; RUN: llvm-link %s %p/Inputs/wrong-addrspace-gv-declaration.ll -S | FileCheck %s +; RUN: llvm-link %p/Inputs/wrong-addrspace-gv-declaration.ll %s -S | FileCheck %s + +; The address space is declared incorrectly here, so an addrspacecast +; is needed to link. + +@is_really_as1_gv = external global i32 +@is_really_as1_gv_other_type = external global i32 + +; CHECK-LABEL: @foo( +; CHECK: %load0 = load volatile i32, i32* addrspacecast (i32 addrspace(1)* @is_really_as1_gv to i32*), align 4 +; CHECK: %load1 = load volatile i32, i32* addrspacecast (i32 addrspace(1)* bitcast (float addrspace(1)* @is_really_as1_gv_other_type to i32 addrspace(1)*) to i32*), align 4 +define void @foo() { + %load0 = load volatile i32, i32* @is_really_as1_gv, align 4 + %load1 = load volatile i32, i32* @is_really_as1_gv_other_type, align 4 + ret void +}