[PATCH] D109337: [GlobalOpt][FIX] Do not embed initializers into AS!=0 globals

Johannes Doerfert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 6 14:05:15 PDT 2021


jdoerfert created this revision.
jdoerfert added reviewers: arsenm, tra, jhuber6.
Herald added subscribers: ormris, bollu, hiraditya.
jdoerfert requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.

Not all address spaces support initializers for globals and we can
therefore not set them without checking if they are allowed. As far
as I know there is no hook to check so we disable it for all but
address space 0 for now to avoid miscompilations.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D109337

Files:
  llvm/lib/Transforms/IPO/GlobalOpt.cpp
  llvm/test/Transforms/GlobalOpt/address_space_initializer.ll


Index: llvm/test/Transforms/GlobalOpt/address_space_initializer.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/GlobalOpt/address_space_initializer.ll
@@ -0,0 +1,29 @@
+; RUN: opt -passes=globalopt < %s -S | FileCheck %s
+
+; Check that we don't try to set a global initializer for non AS(0) globals.
+
+ at g0 = internal global i16 undef
+ at g1 = internal addrspace(3) global i16 undef
+; CHECK: internal unnamed_addr constant i16 3
+; CHECK: internal unnamed_addr addrspace(3) global i16 undef
+
+define void @a() {
+  store i16 3, i16* @g0, align 8
+  store i16 5, i16* addrspacecast (i16 addrspace(3)* @g1 to i16*), align 8
+  ret void
+}
+
+define i8 @get0() optnone noinline {
+  %bc = bitcast i16* @g0 to i8*
+  %gep = getelementptr i8, i8* %bc, i64 1
+  %r = load i8, i8* %gep
+  ret i8 %r
+}
+define i8 @get1() {
+  %ac = addrspacecast i16 addrspace(3)* @g1 to i16*
+  %bc = bitcast i16* %ac to i8*
+  %gep = getelementptr i8, i8* %bc, i64 1
+  %r = load i8, i8* %gep
+  ret i8 %r
+}
+
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
===================================================================
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1615,8 +1615,10 @@
     // one other value was stored into it, we can just change the
     // initializer to be the stored value, then delete all stores to the
     // global.  This allows us to mark it constant.
+    // This is restricted to address space 0 globals. NVPTX, for example,
+    // does not support initializers for shared memory (AS 3).
     if (SOVConstant && SOVConstant->getType() == GV->getValueType() &&
-        isa<UndefValue>(GV->getInitializer())) {
+        isa<UndefValue>(GV->getInitializer()) && GV->getType()->getAddressSpace() == 0) {
       // Change the initial value here.
       GV->setInitializer(SOVConstant);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109337.370967.patch
Type: text/x-patch
Size: 1901 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210906/ffdc80b9/attachment.bin>


More information about the llvm-commits mailing list