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