0
0
mirror of https://github.com/llvm/llvm-project.git synced 2025-04-21 14:56:57 +00:00

[GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 ()

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 
This commit is contained in:
Tyler Lanphear 2023-09-09 10:12:42 -07:00 committed by GitHub
parent 98e6deb62c
commit 52f6f418c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 1 deletions
llvm
lib/Transforms/IPO
test/Transforms/GlobalOpt

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