Don't change the visibility when converting a definition to a declaration.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 13 Jul 2015 14:18:22 +0000 (14:18 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 13 Jul 2015 14:18:22 +0000 (14:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242030 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/LinkAllPasses.h
lib/Transforms/IPO/ElimAvailExtern.cpp
lib/Transforms/IPO/IPO.cpp
test/Transforms/EliminateAvailableExternally/visibility.ll [new file with mode: 0644]

index 8ac1b212ae5f0241c504612b6b71b6cb76060087..cea5530db3b893e2aff9d1292f5e979915f701a3 100644 (file)
@@ -176,6 +176,7 @@ namespace {
       (void) llvm::createStraightLineStrengthReducePass();
       (void) llvm::createMemDerefPrinter();
       (void) llvm::createFloat2IntPass();
+      (void) llvm::createEliminateAvailableExternallyPass();
 
       (void)new llvm::IntervalPartition();
       (void)new llvm::ScalarEvolution();
index 1566e85e99bca665a6ef7d5b78bcaac0f98cf599..e70ab871b88d91be0ea72808b95830cd531278e7 100644 (file)
@@ -67,7 +67,6 @@ bool EliminateAvailableExternally::runOnModule(Module &M) {
     }
     I->removeDeadConstantUsers();
     I->setLinkage(GlobalValue::ExternalLinkage);
-    I->setVisibility(GlobalValue::DefaultVisibility);
     NumVariables++;
   }
 
@@ -78,7 +77,6 @@ bool EliminateAvailableExternally::runOnModule(Module &M) {
     if (!I->isDeclaration())
       // This will set the linkage to external
       I->deleteBody();
-    I->setVisibility(GlobalValue::DefaultVisibility);
     I->removeDeadConstantUsers();
     NumFunctions++;
   }
@@ -91,7 +89,6 @@ bool EliminateAvailableExternally::runOnModule(Module &M) {
     I->setAliasee(nullptr);
     I->removeDeadConstantUsers();
     I->setLinkage(GlobalValue::ExternalLinkage);
-    I->setVisibility(GlobalValue::DefaultVisibility);
     NumAliases++;
   }
 
index fcacec3286fa64626f3f0f8b87ac4540804ee29f..50f56b0f2afedcef9e1e1f4ec51c4d8afb2519a5 100644 (file)
@@ -46,6 +46,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {
   initializeStripDeadDebugInfoPass(Registry);
   initializeStripNonDebugSymbolsPass(Registry);
   initializeBarrierNoopPass(Registry);
+  initializeEliminateAvailableExternallyPass(Registry);
 }
 
 void LLVMInitializeIPO(LLVMPassRegistryRef R) {
diff --git a/test/Transforms/EliminateAvailableExternally/visibility.ll b/test/Transforms/EliminateAvailableExternally/visibility.ll
new file mode 100644 (file)
index 0000000..9966fcf
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: opt -elim-avail-extern -S < %s | FileCheck %s
+
+; CHECK: declare hidden void @f()
+define available_externally hidden void @f() {
+  ret void
+}
+
+define void @g() {
+  call void @f()
+  ret void
+}