From 94162a044b32c61c8805956610327dec4b74d571 Mon Sep 17 00:00:00 2001
From: Rafael Espindola <rafael.espindola@gmail.com>
Date: Mon, 13 Jul 2015 14:18:22 +0000
Subject: [PATCH] Don't change the visibility when converting a definition to a
 declaration.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242030 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/llvm/LinkAllPasses.h                          |  1 +
 lib/Transforms/IPO/ElimAvailExtern.cpp                |  3 ---
 lib/Transforms/IPO/IPO.cpp                            |  1 +
 .../EliminateAvailableExternally/visibility.ll        | 11 +++++++++++
 4 files changed, 13 insertions(+), 3 deletions(-)
 create mode 100644 test/Transforms/EliminateAvailableExternally/visibility.ll

diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h
index 8ac1b212ae5..cea5530db3b 100644
--- a/include/llvm/LinkAllPasses.h
+++ b/include/llvm/LinkAllPasses.h
@@ -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();
diff --git a/lib/Transforms/IPO/ElimAvailExtern.cpp b/lib/Transforms/IPO/ElimAvailExtern.cpp
index 1566e85e99b..e70ab871b88 100644
--- a/lib/Transforms/IPO/ElimAvailExtern.cpp
+++ b/lib/Transforms/IPO/ElimAvailExtern.cpp
@@ -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++;
   }
 
diff --git a/lib/Transforms/IPO/IPO.cpp b/lib/Transforms/IPO/IPO.cpp
index fcacec3286f..50f56b0f2af 100644
--- a/lib/Transforms/IPO/IPO.cpp
+++ b/lib/Transforms/IPO/IPO.cpp
@@ -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
index 00000000000..9966fcf30e8
--- /dev/null
+++ b/test/Transforms/EliminateAvailableExternally/visibility.ll
@@ -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
+}
-- 
2.34.1