diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 3be19f46ee847..658db532835a5 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1453,7 +1453,7 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS, if (!GS.HasMultipleAccessingFunctions && GS.AccessingFunction && GV->getValueType()->isSingleValueType() && - GV->getType()->getAddressSpace() == 0 && + GV->getType()->getAddressSpace() == DL.getAllocaAddrSpace() && !GV->isExternallyInitialized() && GS.AccessingFunction->doesNotRecurse() && isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV, diff --git a/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll new file mode 100644 index 0000000000000..f3e0a3e78bee4 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 +; RUN: opt -S -passes=globalopt < %s | FileCheck %s +target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8" + +; Check that we don't convert the global into an alloca if their respective address +; spaces differ, and the alloca addrspace is non-zero. + +@x = internal global i32 poison + +; Function Attrs: norecurse +define void @test(i32 %0) #0 { +; CHECK-LABEL: define void @test( +; CHECK-SAME: i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: entry: +; CHECK-NEXT: ret void +; +entry: + store i32 %0, ptr @x, align 4 + ret void +} + +attributes #0 = { norecurse }