[llvm] GlobalOpt: Use the correct address space when creating a "*.init" global. (PR #118562)
Owen Anderson via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 3 16:11:40 PST 2024
https://github.com/resistor updated https://github.com/llvm/llvm-project/pull/118562
>From e22d260655a71af79c1cff76a824bac9f03f7c77 Mon Sep 17 00:00:00 2001
From: Owen Anderson <resistor at mac.com>
Date: Wed, 4 Dec 2024 13:00:42 +1300
Subject: [PATCH 1/2] GlobalOpt: Use the correct address space when creating a
"*.init" global.
---
llvm/lib/Transforms/IPO/GlobalOpt.cpp | 3 +-
.../GlobalOpt/malloc-promote-addrspace.ll | 69 +++++++++++++++++++
2 files changed, 71 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/Transforms/GlobalOpt/malloc-promote-addrspace.ll
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index 3381b5f77683b5..c7664ab6d314fb 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -950,7 +950,8 @@ OptimizeGlobalAddressOfAllocation(GlobalVariable *GV, CallInst *CI,
new GlobalVariable(Type::getInt1Ty(GV->getContext()), false,
GlobalValue::InternalLinkage,
ConstantInt::getFalse(GV->getContext()),
- GV->getName()+".init", GV->getThreadLocalMode());
+ GV->getName()+".init", GV->getThreadLocalMode(),
+ GV->getAddressSpace());
bool InitBoolUsed = false;
// Loop over all instruction uses of GV, processing them in turn.
diff --git a/llvm/test/Transforms/GlobalOpt/malloc-promote-addrspace.ll b/llvm/test/Transforms/GlobalOpt/malloc-promote-addrspace.ll
new file mode 100644
index 00000000000000..bd0957150748f9
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/malloc-promote-addrspace.ll
@@ -0,0 +1,69 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
+; RUN: opt -S -passes=globalopt -o - < %s | FileCheck %s
+
+ at g = internal addrspace(200) global ptr null, align 8
+
+;.
+; CHECK: @g.init = internal unnamed_addr addrspace(200) global i1 false
+;.
+define internal i32 @f1() {
+; CHECK-LABEL: define {{[^@]+}}@f1() unnamed_addr {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[G_INIT_VAL:%.*]] = load i1, ptr addrspace(200) @g.init, align 1
+; CHECK-NEXT: call fastcc void @f2()
+; CHECK-NEXT: [[NOTINIT:%.*]] = xor i1 [[G_INIT_VAL]], true
+; CHECK-NEXT: br i1 [[NOTINIT]], label [[BB2:%.*]], label [[BB3:%.*]]
+; CHECK: bb2:
+; CHECK-NEXT: br label [[BB4:%.*]]
+; CHECK: bb3:
+; CHECK-NEXT: br label [[BB4]]
+; CHECK: bb4:
+; CHECK-NEXT: [[I5:%.*]] = phi i32 [ -1, [[BB2]] ], [ 1, [[BB3]] ]
+; CHECK-NEXT: ret i32 [[I5]]
+;
+bb:
+ %i = load ptr addrspace(200), ptr addrspace(200) @g, align 8
+ call void @f2()
+ %i1 = icmp eq ptr addrspace(200) %i, null
+ br i1 %i1, label %bb2, label %bb3
+
+bb2: ; preds = %bb
+ br label %bb4
+
+bb3: ; preds = %bb
+ br label %bb4
+
+bb4: ; preds = %bb3, %bb2
+ %i5 = phi i32 [ -1, %bb2 ], [ 1, %bb3 ]
+ ret i32 %i5
+}
+
+define internal void @f2() {
+; CHECK-LABEL: define {{[^@]+}}@f2() unnamed_addr {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: store i1 true, ptr addrspace(200) @g.init, align 1
+; CHECK-NEXT: ret void
+;
+bb:
+ %i = call noalias ptr @malloc(i64 4)
+ store ptr %i, ptr addrspace(200) @g, align 8
+ ret void
+}
+
+define dso_local i32 @main() {
+; CHECK-LABEL: define {{[^@]+}}@main() local_unnamed_addr {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: store i1 false, ptr addrspace(200) @g.init, align 1
+; CHECK-NEXT: [[I:%.*]] = call fastcc i32 @f1()
+; CHECK-NEXT: ret i32 [[I]]
+;
+bb:
+ store ptr null, ptr addrspace(200) @g, align 8
+ %i = call i32 @f1()
+ ret i32 %i
+}
+
+; Function Attrs: allockind("alloc,uninitialized") allocsize(0)
+declare dso_local noalias ptr @malloc(i64) #0
+
+attributes #0 = { allockind("alloc,uninitialized") allocsize(0) }
>From cece88a3383c55a8b1734c24534f8a0bd55abd6f Mon Sep 17 00:00:00 2001
From: Owen Anderson <resistor at mac.com>
Date: Wed, 4 Dec 2024 13:11:24 +1300
Subject: [PATCH 2/2] Format
---
llvm/lib/Transforms/IPO/GlobalOpt.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index c7664ab6d314fb..16a80e9ebbeaab 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -946,12 +946,10 @@ OptimizeGlobalAddressOfAllocation(GlobalVariable *GV, CallInst *CI,
// If there is a comparison against null, we will insert a global bool to
// keep track of whether the global was initialized yet or not.
- GlobalVariable *InitBool =
- new GlobalVariable(Type::getInt1Ty(GV->getContext()), false,
- GlobalValue::InternalLinkage,
- ConstantInt::getFalse(GV->getContext()),
- GV->getName()+".init", GV->getThreadLocalMode(),
- GV->getAddressSpace());
+ GlobalVariable *InitBool = new GlobalVariable(
+ Type::getInt1Ty(GV->getContext()), false, GlobalValue::InternalLinkage,
+ ConstantInt::getFalse(GV->getContext()), GV->getName() + ".init",
+ GV->getThreadLocalMode(), GV->getAddressSpace());
bool InitBoolUsed = false;
// Loop over all instruction uses of GV, processing them in turn.
More information about the llvm-commits
mailing list