Also add unnamed_addr to functions.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 22 Dec 2015 20:43:30 +0000 (20:43 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 22 Dec 2015 20:43:30 +0000 (20:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256281 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 2873ee7..fd77369 100644 (file)
@@ -83,7 +83,7 @@ namespace {
     bool OptimizeGlobalVars(Module &M);
     bool OptimizeGlobalAliases(Module &M);
     bool deleteIfDead(GlobalValue &GV);
-    bool processGlobal(GlobalVariable *GV);
+    bool processGlobal(GlobalValue &GV);
     bool processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS);
     bool OptimizeEmptyGlobalCXXDtors(Function *CXAAtExitFn);
 
@@ -1705,28 +1705,31 @@ bool GlobalOpt::deleteIfDead(GlobalValue &GV) {
 
 /// Analyze the specified global variable and optimize it if possible.  If we
 /// make a change, return true.
-bool GlobalOpt::processGlobal(GlobalVariable *GV) {
-  if (deleteIfDead(*GV))
-    return true;
-
+bool GlobalOpt::processGlobal(GlobalValue &GV) {
   // Do more involved optimizations if the global is internal.
-  if (!GV->hasLocalLinkage())
+  if (!GV.hasLocalLinkage())
     return false;
 
   GlobalStatus GS;
 
-  if (GlobalStatus::analyzeGlobal(GV, GS))
+  if (GlobalStatus::analyzeGlobal(&GV, GS))
     return false;
 
-  if (!GS.IsCompared && !GV->hasUnnamedAddr()) {
-    GV->setUnnamedAddr(true);
+  bool Changed = false;
+  if (!GS.IsCompared && !GV.hasUnnamedAddr()) {
+    GV.setUnnamedAddr(true);
     NumUnnamed++;
+    Changed = true;
   }
 
-  if (GV->isConstant() || !GV->hasInitializer())
-    return false;
+  auto *GVar = dyn_cast<GlobalVariable>(&GV);
+  if (!GVar)
+    return Changed;
+
+  if (GVar->isConstant() || !GVar->hasInitializer())
+    return Changed;
 
-  return processInternalGlobal(GV, GS);
+  return processInternalGlobal(GVar, GS) || Changed;
 }
 
 bool GlobalOpt::isPointerValueDeadOnEntryToFunction(const Function *F, GlobalValue *GV) {
@@ -2044,6 +2047,9 @@ bool GlobalOpt::OptimizeFunctions(Module &M) {
       Changed = true;
       continue;
     }
+
+    Changed |= processGlobal(*F);
+
     if (!F->hasLocalLinkage())
       continue;
     if (isProfitableToMakeFastCC(F) && !F->isVarArg() &&
@@ -2087,7 +2093,12 @@ bool GlobalOpt::OptimizeGlobalVars(Module &M) {
           GV->setInitializer(New);
       }
 
-    Changed |= processGlobal(GV);
+    if (deleteIfDead(*GV)) {
+      Changed = true;
+      continue;
+    }
+
+    Changed |= processGlobal(*GV);
   }
   return Changed;
 }
index 85ed829..de436c6 100644 (file)
 ; CHECK: @d = internal unnamed_addr constant [4 x i8] c"foo\00", align 1
 ; CHECK: @e = linkonce_odr global i32 0
 
+; CHECK: define internal fastcc void @used_internal() unnamed_addr {
+define internal void @used_internal() {
+  ret void
+}
+
 define i32 @get_e() {
+       call void @used_internal()
        %t = load i32, i32* @e
        ret i32 %t
 }