mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-21 14:56:57 +00:00
[GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 (#65847)
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 #65155
This commit is contained in:
parent
98e6deb62c
commit
52f6f418c7
llvm
@ -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,
|
||||
|
@ -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 }
|
Loading…
x
Reference in New Issue
Block a user