[GlobalOpt] Dead Eliminate declarations

GlobalOpt is already dead-code-eliminating global definitions. With
this change it also takes care of declarations.
Hopefully this should make it now a strict superset of GlobalDCE.
This is important for LTO/ThinLTO as we don't want the linker to see
"undefined reference" when it processes the input files: it could
prevent proper internalization (or even load an extra file from a
static archive, changing the behavior of the program!).

llvm-svn: 281653
This commit is contained in:
Mehdi Amini 2016-09-15 20:26:27 +00:00
parent 3045d703f6
commit d880309835
2 changed files with 9 additions and 2 deletions

View File

@ -1653,7 +1653,7 @@ static bool deleteIfDead(GlobalValue &GV,
SmallSet<const Comdat *, 8> &NotDiscardableComdats) {
GV.removeDeadConstantUsers();
if (!GV.isDiscardableIfUnused())
if (!GV.isDiscardableIfUnused() && !GV.isDeclaration())
return false;
if (const Comdat *C = GV.getComdat())
@ -1662,7 +1662,7 @@ static bool deleteIfDead(GlobalValue &GV,
bool Dead;
if (auto *F = dyn_cast<Function>(&GV))
Dead = F->isDefTriviallyDead();
Dead = (F->isDeclaration() && F->use_empty()) || F->isDefTriviallyDead();
else
Dead = GV.use_empty();
if (!Dead)

View File

@ -0,0 +1,7 @@
; RUN: opt < %s -globalopt -S | FileCheck %s
; CHECK-NOT: aa
; CHECK-NOT: bb
declare void @aa()
@bb = external global i8