Some optimizations done by globalopt are safe only for internal linkage, not
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 15 Jun 2012 18:00:24 +0000 (18:00 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 15 Jun 2012 18:00:24 +0000 (18:00 +0000)
linkonce linkage. For example, it is not valid to add unnamed_addr.

This also fixes a crash in g++.dg/opt/static5.C.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158528 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalOpt.cpp
test/Transforms/GlobalOpt/unnamed-addr.ll

index 9e3b8c28269f86cd9131dbc87d68f93cb15caa94..cca959b2476e10fadb1c7f2a45c00e90e3724659 100644 (file)
@@ -1729,6 +1729,9 @@ bool GlobalOpt::ProcessGlobal(GlobalVariable *GV,
     return true;
   }
 
+  if (!GV->hasLocalLinkage())
+    return false;
+
   SmallPtrSet<const PHINode*, 16> PHIUsers;
   GlobalStatus GS;
 
index be0282122775f5071a0992be3f14b7e168b602c2..babadc62103507b9ffc8cfbd68803d7dd3aede1d 100644 (file)
@@ -4,11 +4,23 @@
 @b = internal global i32 0, align 4
 @c = internal global i32 0, align 4
 @d = internal constant [4 x i8] c"foo\00", align 1
+@e = linkonce_odr global i32 0
 
 ; CHECK: @a = internal global i32 0, align 4
 ; CHECK: @b = internal global i32 0, align 4
 ; CHECK: @c = internal unnamed_addr global i32 0, align 4
 ; CHECK: @d = internal unnamed_addr constant [4 x i8] c"foo\00", align 1
+; CHECK: @e = linkonce_odr global i32 0
+
+define i32 @get_e() {
+       %t = load i32* @e
+       ret i32 %t
+}
+
+define void @set_e(i32 %x) {
+       store i32 %x, i32* @e
+       ret void
+}
 
 define i1 @bah(i64 %i) nounwind readonly optsize ssp {
 entry: