Teach the internalize pass to also internalize
authorDuncan Sands <baldrick@free.fr>
Mon, 5 Jan 2009 21:24:45 +0000 (21:24 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 5 Jan 2009 21:24:45 +0000 (21:24 +0000)
global aliases.

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

lib/Transforms/IPO/Internalize.cpp
test/Transforms/Internalize/2009-01-05-InternalizeAliases.ll [new file with mode: 0644]

index 5e325ec82d8999b6f238b86157f2e97da8b2a0f0..b6d89aafd0f0a37b433fcaddf874200c212c06ea 100644 (file)
@@ -26,6 +26,7 @@
 #include <set>
 using namespace llvm;
 
+STATISTIC(NumAliases  , "Number of aliases internalized");
 STATISTIC(NumFunctions, "Number of functions internalized");
 STATISTIC(NumGlobals  , "Number of global vars internalized");
 
@@ -158,6 +159,17 @@ bool InternalizePass::runOnModule(Module &M) {
       DOUT << "Internalized gvar " << I->getName() << "\n";
     }
 
+  // Mark all aliases that are not in the api as internal as well.
+  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
+       I != E; ++I)
+    if (!I->isDeclaration() && !I->hasInternalLinkage() &&
+        !ExternalNames.count(I->getName())) {
+      I->setLinkage(GlobalValue::InternalLinkage);
+      Changed = true;
+      ++NumAliases;
+      DOUT << "Internalized alias " << I->getName() << "\n";
+    }
+
   return Changed;
 }
 
diff --git a/test/Transforms/Internalize/2009-01-05-InternalizeAliases.ll b/test/Transforms/Internalize/2009-01-05-InternalizeAliases.ll
new file mode 100644 (file)
index 0000000..c0041ac
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | opt -internalize | llvm-dis | grep internal | count 3
+
+@A = global i32 0
+@B = alias i32* @A
+@C = alias i32* @B
+
+define i32 @main() {
+       %tmp = load i32* @C
+       ret i32 %tmp
+}