Skip to content

Commit 52f6f41

Browse files
authoredSep 9, 2023
[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
1 parent 98e6deb commit 52f6f41

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed
 

‎llvm/lib/Transforms/IPO/GlobalOpt.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1453,7 +1453,7 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS,
14531453
if (!GS.HasMultipleAccessingFunctions &&
14541454
GS.AccessingFunction &&
14551455
GV->getValueType()->isSingleValueType() &&
1456-
GV->getType()->getAddressSpace() == 0 &&
1456+
GV->getType()->getAddressSpace() == DL.getAllocaAddrSpace() &&
14571457
!GV->isExternallyInitialized() &&
14581458
GS.AccessingFunction->doesNotRecurse() &&
14591459
isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2+
; RUN: opt -S -passes=globalopt < %s | FileCheck %s
3+
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"
4+
5+
; Check that we don't convert the global into an alloca if their respective address
6+
; spaces differ, and the alloca addrspace is non-zero.
7+
8+
@x = internal global i32 poison
9+
10+
; Function Attrs: norecurse
11+
define void @test(i32 %0) #0 {
12+
; CHECK-LABEL: define void @test(
13+
; CHECK-SAME: i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
14+
; CHECK-NEXT: entry:
15+
; CHECK-NEXT: ret void
16+
;
17+
entry:
18+
store i32 %0, ptr @x, align 4
19+
ret void
20+
}
21+
22+
attributes #0 = { norecurse }

0 commit comments

Comments
 (0)
Please sign in to comment.