From 9a71e8064581ed8567c8bad52a27fd5ad410e6d8 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 24 Sep 2018 04:42:14 +0000 Subject: [PATCH] Fix asserts when linking wrong address space declarations llvm-svn: 342858 --- llvm/lib/Linker/IRMover.cpp | 9 ++++++--- .../Inputs/wrong-addrspace-gv-declaration.ll | 2 ++ .../Linker/wrong-addrspace-gv-declaration.ll | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll create mode 100644 llvm/test/Linker/wrong-addrspace-gv-declaration.ll diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 738dec8e1f29..48b746a22fcf 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/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/llvm/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll b/llvm/test/Linker/Inputs/wrong-addrspace-gv-declaration.ll new file mode 100644 index 000000000000..2097f74c3c23 --- /dev/null +++ b/llvm/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/llvm/test/Linker/wrong-addrspace-gv-declaration.ll b/llvm/test/Linker/wrong-addrspace-gv-declaration.ll new file mode 100644 index 000000000000..f7037a71d00c --- /dev/null +++ b/llvm/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 +}