Fix asserts when linking wrong address space declarations

llvm-svn: 342858
This commit is contained in:
Matt Arsenault 2018-09-24 04:42:14 +00:00
parent ce5f203415
commit 9a71e80645
3 changed files with 25 additions and 3 deletions

View File

@ -978,11 +978,14 @@ Expected<Constant *> 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();
}

View File

@ -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

View File

@ -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
}