Skip to content

Commit

Permalink
[GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 (llvm#65847)
Browse files Browse the repository at this point in the history
Fix crash on RAUW due to locals and globals having different address
spaces. This is the intent of the original code, but it assumes the
alloca address space is 0. This patch fixes the code to check that the
global's address space matches `DL.getAllocaAddrSpace()` instead.

Fixes llvm#65155
  • Loading branch information
tylanphear authored Sep 9, 2023
1 parent 98e6deb commit 52f6f41
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/GlobalOpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
22 changes: 22 additions & 0 deletions llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll
Original file line number Diff line number Diff line change
@@ -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 }

0 comments on commit 52f6f41

Please sign in to comment.