GlobalDCE.cpp revision e3acf159d968b5a9db350203d8160a4d3c2d1a43
144d362409d5469aed47d19e7908d19bd194493aThomas Graf//===-- GlobalDCE.cpp - DCE unreachable internal functions ----------------===//
2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart//
344d362409d5469aed47d19e7908d19bd194493aThomas Graf//                     The LLVM Compiler Infrastructure
444d362409d5469aed47d19e7908d19bd194493aThomas Graf//
544d362409d5469aed47d19e7908d19bd194493aThomas Graf// This file is distributed under the University of Illinois Open Source
644d362409d5469aed47d19e7908d19bd194493aThomas Graf// License. See LICENSE.TXT for details.
744d362409d5469aed47d19e7908d19bd194493aThomas Graf//
844d362409d5469aed47d19e7908d19bd194493aThomas Graf//===----------------------------------------------------------------------===//
9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart//
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf// This transform is designed to eliminate unreachable internal globals from the
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf// program.  It uses an aggressive algorithm, searching out globals that are
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf// known to be alive.  After it finds all of the globals which are needed, it
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf// deletes whatever is left over.  This allows it to delete recursive chunks of
14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart// the program which are unreachable.
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf//
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf//===----------------------------------------------------------------------===//
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf
18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#define DEBUG_TYPE "globaldce"
19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include "llvm/Transforms/IPO.h"
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "llvm/Constants.h"
21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include "llvm/Module.h"
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "llvm/Pass.h"
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "llvm/ADT/Statistic.h"
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "llvm/Support/Compiler.h"
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <set>
2644d362409d5469aed47d19e7908d19bd194493aThomas Grafusing namespace llvm;
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf
28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTATISTIC(NumAliases  , "Number of global aliases removed");
29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTATISTIC(NumFunctions, "Number of functions removed");
30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTATISTIC(NumVariables, "Number of global variables removed");
31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartnamespace {
33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  struct VISIBILITY_HIDDEN GlobalDCE : public ModulePass {
34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    static char ID; // Pass identification, replacement for typeid
35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    GlobalDCE() : ModulePass(&ID) {}
36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // run - Do the GlobalDCE pass on the specified module, optionally updating
38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // the specified callgraph to reflect the changes.
39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    //
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf    bool runOnModule(Module &M);
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf
42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  private:
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf    std::set<GlobalValue*> AliveGlobals;
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf
45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    /// GlobalIsNeeded - mark the specific global value as needed, and
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf    /// recursively mark anything that it uses as also needed.
47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    void GlobalIsNeeded(GlobalValue *GV);
48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    void MarkUsedGlobalsAsNeeded(Constant *C);
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf
50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    bool RemoveUnusedGlobalValue(GlobalValue &GV);
51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  };
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
5444d362409d5469aed47d19e7908d19bd194493aThomas Grafchar GlobalDCE::ID = 0;
55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic RegisterPass<GlobalDCE> X("globaldce", "Dead Global Elimination");
56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
5744d362409d5469aed47d19e7908d19bd194493aThomas GrafModulePass *llvm::createGlobalDCEPass() { return new GlobalDCE(); }
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf
5944d362409d5469aed47d19e7908d19bd194493aThomas Grafbool GlobalDCE::runOnModule(Module &M) {
601155370f520cb64657e25153255cf7dc1424317fThomas Graf  bool Changed = false;
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf  // Loop over the module, adding globals which are obviously necessary.
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf    Changed |= RemoveUnusedGlobalValue(*I);
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf    // Functions with external linkage are needed if they have a body
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf    if (!I->hasLocalLinkage() && !I->hasLinkOnceLinkage() &&
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf        !I->isDeclaration() && !I->hasAvailableExternallyLinkage())
671155370f520cb64657e25153255cf7dc1424317fThomas Graf      GlobalIsNeeded(I);
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf  }
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf  for (Module::global_iterator I = M.global_begin(), E = M.global_end();
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf       I != E; ++I) {
72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    Changed |= RemoveUnusedGlobalValue(*I);
73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // Externally visible & appending globals are needed, if they have an
74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // initializer.
75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    if (!I->hasLocalLinkage() && !I->hasLinkOnceLinkage() &&
76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        !I->isDeclaration() && !I->hasAvailableExternallyLinkage())
77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      GlobalIsNeeded(I);
78054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
79054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
81054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart       I != E; ++I) {
82054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    Changed |= RemoveUnusedGlobalValue(*I);
83054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // Externally visible aliases are needed.
84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    if (!I->hasLocalLinkage() && !I->hasLinkOnceLinkage())
85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      GlobalIsNeeded(I);
86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
88054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // Now that all globals which are needed are in the AliveGlobals set, we loop
89054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // through the program, deleting those which are not alive.
90054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  //
91054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
92054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // The first pass is to drop initializers of global variables which are dead.
93054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  std::vector<GlobalVariable*> DeadGlobalVars;   // Keep track of dead globals
94054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)
95054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    if (!AliveGlobals.count(I)) {
96054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      DeadGlobalVars.push_back(I);         // Keep track of dead globals
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf      I->setInitializer(0);
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf
1008a3efffa5b3fde252675239914118664d36a2c24Thomas Graf  // The second pass drops the bodies of functions which are dead...
1018a3efffa5b3fde252675239914118664d36a2c24Thomas Graf  std::vector<Function*> DeadFunctions;
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
103054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    if (!AliveGlobals.count(I)) {
10444d362409d5469aed47d19e7908d19bd194493aThomas Graf      DeadFunctions.push_back(I);         // Keep track of dead globals
105054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      if (!I->isDeclaration())
106054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        I->deleteBody();
107054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    }
108054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
109054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // The third pass drops targets of aliases which are dead...
11044d362409d5469aed47d19e7908d19bd194493aThomas Graf  std::vector<GlobalAlias*> DeadAliases;
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E;
112054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart       ++I)
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf    if (!AliveGlobals.count(I)) {
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf      DeadAliases.push_back(I);
11544d362409d5469aed47d19e7908d19bd194493aThomas Graf      I->setAliasee(0);
116054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    }
117054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
118054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  if (!DeadFunctions.empty()) {
119054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // Now that all interferences have been dropped, delete the actual objects
12044d362409d5469aed47d19e7908d19bd194493aThomas Graf    // themselves.
121054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    for (unsigned i = 0, e = DeadFunctions.size(); i != e; ++i) {
122054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      RemoveUnusedGlobalValue(*DeadFunctions[i]);
123054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      M.getFunctionList().erase(DeadFunctions[i]);
12444d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
125054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    NumFunctions += DeadFunctions.size();
12644d362409d5469aed47d19e7908d19bd194493aThomas Graf    Changed = true;
1278a3efffa5b3fde252675239914118664d36a2c24Thomas Graf  }
12844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1298a3efffa5b3fde252675239914118664d36a2c24Thomas Graf  if (!DeadGlobalVars.empty()) {
1308a3efffa5b3fde252675239914118664d36a2c24Thomas Graf    for (unsigned i = 0, e = DeadGlobalVars.size(); i != e; ++i) {
13144d362409d5469aed47d19e7908d19bd194493aThomas Graf      RemoveUnusedGlobalValue(*DeadGlobalVars[i]);
132054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      M.getGlobalList().erase(DeadGlobalVars[i]);
13344d362409d5469aed47d19e7908d19bd194493aThomas Graf    }
13444d362409d5469aed47d19e7908d19bd194493aThomas Graf    NumVariables += DeadGlobalVars.size();
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf    Changed = true;
136054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
137054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
138054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // Now delete any dead aliases.
139054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  if (!DeadAliases.empty()) {
140054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    for (unsigned i = 0, e = DeadAliases.size(); i != e; ++i) {
141054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      RemoveUnusedGlobalValue(*DeadAliases[i]);
142054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart      M.getAliasList().erase(DeadAliases[i]);
143054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    }
144054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    NumAliases += DeadAliases.size();
145054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    Changed = true;
146054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
147054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
148054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // Make sure that all memory is released
149054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  AliveGlobals.clear();
150054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  return Changed;
151054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
152054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
153054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/// GlobalIsNeeded - the specific global value as needed, and
154054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/// recursively mark anything that it uses as also needed.
155054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartvoid GlobalDCE::GlobalIsNeeded(GlobalValue *G) {
156054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  std::set<GlobalValue*>::iterator I = AliveGlobals.find(G);
157054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
158054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // If the global is already in the set, no need to reprocess it.
15944d362409d5469aed47d19e7908d19bd194493aThomas Graf  if (I != AliveGlobals.end()) return;
160054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
161054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  // Otherwise insert it now, so we do not infinitely recurse
162054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  AliveGlobals.insert(I, G);
16344d362409d5469aed47d19e7908d19bd194493aThomas Graf
164054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(G)) {
165054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // If this is a global variable, we must make sure to add any global values
166054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // referenced by the initializer to the alive set.
167054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    if (GV->hasInitializer())
16844d362409d5469aed47d19e7908d19bd194493aThomas Graf      MarkUsedGlobalsAsNeeded(GV->getInitializer());
169054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(G)) {
17044d362409d5469aed47d19e7908d19bd194493aThomas Graf    // The target of a global alias is needed.
1711155370f520cb64657e25153255cf7dc1424317fThomas Graf    MarkUsedGlobalsAsNeeded(GA->getAliasee());
17244d362409d5469aed47d19e7908d19bd194493aThomas Graf  } else {
17344d362409d5469aed47d19e7908d19bd194493aThomas Graf    // Otherwise this must be a function object.  We have to scan the body of
17444d362409d5469aed47d19e7908d19bd194493aThomas Graf    // the function looking for constants and global values which are used as
17544d362409d5469aed47d19e7908d19bd194493aThomas Graf    // operands.  Any operands of these types must be processed to ensure that
1768a3efffa5b3fde252675239914118664d36a2c24Thomas Graf    // any globals used will be marked as needed.
1778a3efffa5b3fde252675239914118664d36a2c24Thomas Graf    Function *F = cast<Function>(G);
17844d362409d5469aed47d19e7908d19bd194493aThomas Graf    // For all basic blocks...
179054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
18044d362409d5469aed47d19e7908d19bd194493aThomas Graf      // For all instructions...
18144d362409d5469aed47d19e7908d19bd194493aThomas Graf      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
182054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        // For all operands...
183054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        for (User::op_iterator U = I->op_begin(), E = I->op_end(); U != E; ++U)
184054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart          if (GlobalValue *GV = dyn_cast<GlobalValue>(*U))
185054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart            GlobalIsNeeded(GV);
186054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart          else if (Constant *C = dyn_cast<Constant>(*U))
187054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart            MarkUsedGlobalsAsNeeded(C);
188054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
189054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
190054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
191054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartvoid GlobalDCE::MarkUsedGlobalsAsNeeded(Constant *C) {
192054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  if (GlobalValue *GV = dyn_cast<GlobalValue>(C))
193054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    GlobalIsNeeded(GV);
194054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  else {
195054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart    // Loop over all of the operands of the constant, adding any globals they
1962ead49f0d5873628156e50dfed7da14619a4172dolc    // use to the list of needed globals.
1972ead49f0d5873628156e50dfed7da14619a4172dolc    for (User::op_iterator I = C->op_begin(), E = C->op_end(); I != E; ++I)
1982ead49f0d5873628156e50dfed7da14619a4172dolc      MarkUsedGlobalsAsNeeded(cast<Constant>(*I));
199054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  }
2002ead49f0d5873628156e50dfed7da14619a4172dolc}
201054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
202054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart// RemoveUnusedGlobalValue - Loop over all of the uses of the specified
203054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart// GlobalValue, looking for the constant pointer ref that may be pointing to it.
204054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart// If found, check to see if the constant pointer ref is safe to destroy, and if
2052ead49f0d5873628156e50dfed7da14619a4172dolc// so, nuke it.  This will reduce the reference count on the global value, which
206054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart// might make it deader.
2072ead49f0d5873628156e50dfed7da14619a4172dolc//
2082ead49f0d5873628156e50dfed7da14619a4172dolcbool GlobalDCE::RemoveUnusedGlobalValue(GlobalValue &GV) {
209054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart  if (GV.use_empty()) return false;
2102ead49f0d5873628156e50dfed7da14619a4172dolc  GV.removeDeadConstantUsers();
2112ead49f0d5873628156e50dfed7da14619a4172dolc  return GV.use_empty();
212054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
213054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart