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)
llvm-svn: 242030

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

index 8ac1b21..cea5530 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 1566e85..e70ab87 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 fcacec3..50f56b0 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/llvm/test/Transforms/EliminateAvailableExternally/visibility.ll b/llvm/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
+}