1 //===-- GlobalDCE.cpp - DCE unreachable internal functions ----------------===// 2 // 3 // This transform is designed to eliminate unreachable internal globals 4 // FIXME: GlobalDCE should update the callgraph, not destroy it! 5 // 6 //===----------------------------------------------------------------------===// 7 8 #include "llvm/Transforms/IPO.h" 9 #include "llvm/Module.h" 10 #include "llvm/Constants.h" 11 #include "llvm/DerivedTypes.h" 12 #include "llvm/Analysis/CallGraph.h" 13 #include "Support/DepthFirstIterator.h" 14 #include "Support/Statistic.h" 15 #include <algorithm> 16 17 namespace { 18 Statistic<> NumFunctions("globaldce","Number of functions removed"); 19 Statistic<> NumVariables("globaldce","Number of global variables removed"); 20 Statistic<> NumCPRs("globaldce", "Number of const pointer refs removed"); 21 Statistic<> NumConsts("globaldce", "Number of init constants removed"); 22 23 bool RemoveUnreachableFunctions(Module &M, CallGraph &CallGraph) { 24 // Calculate which functions are reachable from the external functions in 25 // the call graph. 26 // 27 std::set<CallGraphNode*> ReachableNodes(df_begin(&CallGraph), 28 df_end(&CallGraph)); 29 30 // Loop over the functions in the module twice. The first time is used to 31 // drop references that functions have to each other before they are 32 // deleted. The second pass removes the functions that need to be removed. 33 // 34 std::vector<CallGraphNode*> FunctionsToDelete; // Track unused functions 35 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 36 CallGraphNode *N = CallGraph[I]; 37 38 if (!ReachableNodes.count(N)) { // Not reachable?? 39 I->dropAllReferences(); 40 N->removeAllCalledFunctions(); 41 FunctionsToDelete.push_back(N); 42 ++NumFunctions; 43 } 44 } 45 46 // Nothing to do if no unreachable functions have been found... 47 if (FunctionsToDelete.empty()) return false; 48 49 // Unreachable functions have been found and should have no references to 50 // them, delete them now. 51 // 52 for (std::vector<CallGraphNode*>::iterator I = FunctionsToDelete.begin(), 53 E = FunctionsToDelete.end(); I != E; ++I) 54 delete CallGraph.removeFunctionFromModule(*I); 55 56 // Walk the function list, removing prototypes for functions which are not 57 // used. 58 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 59 if (I->use_size() == 0 && I->isExternal()) 60 delete CallGraph.removeFunctionFromModule(I); 61 62 return true; 63 } 64 65 struct GlobalDCE : public Pass { 66 // run - Do the GlobalDCE pass on the specified module, optionally updating 67 // the specified callgraph to reflect the changes. 68 // 69 bool run(Module &M) { 70 return RemoveUnreachableFunctions(M, getAnalysis<CallGraph>()) | 71 RemoveUnreachableGlobalVariables(M); 72 } 73 74 // getAnalysisUsage - This function works on the call graph of a module. 75 // It is capable of updating the call graph to reflect the new state of the 76 // module. 77 // 78 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 79 AU.addRequired<CallGraph>(); 80 } 81 82 private: 83 std::vector<GlobalValue*> WorkList; 84 85 inline bool RemoveIfDead(GlobalValue *GV); 86 void DestroyInitializer(Constant *C); 87 88 bool RemoveUnreachableGlobalVariables(Module &M); 89 bool RemoveUnusedConstantPointerRef(GlobalValue &GV); 90 bool SafeToDestroyConstant(Constant *C); 91 }; 92 RegisterOpt<GlobalDCE> X("globaldce", "Dead Global Elimination"); 93 } 94 95 Pass *createGlobalDCEPass() { return new GlobalDCE(); } 96 97 98 // RemoveIfDead - If this global value is dead, remove it from the current 99 // module and return true. 100 // 101 bool GlobalDCE::RemoveIfDead(GlobalValue *GV) { 102 // If there is only one use of the global value, it might be a 103 // ConstantPointerRef... which means that this global might actually be 104 // dead. 105 if (GV->use_size() == 1) 106 RemoveUnusedConstantPointerRef(*GV); 107 108 if (!GV->use_empty()) return false; 109 110 if (GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) { 111 // Eliminate all global variables that are unused, and that are internal, or 112 // do not have an initializer. 113 // 114 if (GVar->hasInternalLinkage() || GVar->isExternal()) { 115 Constant *Init = GVar->hasInitializer() ? GVar->getInitializer() : 0; 116 GV->getParent()->getGlobalList().erase(GVar); 117 ++NumVariables; 118 119 // If there was an initializer for the global variable, try to destroy it 120 // now. 121 if (Init) DestroyInitializer(Init); 122 123 // If the global variable is still on the worklist, remove it now. 124 std::vector<GlobalValue*>::iterator I = std::find(WorkList.begin(), 125 WorkList.end(), GV); 126 while (I != WorkList.end()) { 127 I = WorkList.erase(I); 128 I = std::find(I, WorkList.end(), GV); 129 } 130 131 return true; 132 } 133 } else { 134 Function *F = cast<Function>(GV); 135 // FIXME: TODO 136 137 } 138 return false; 139 } 140 141 // DestroyInitializer - A global variable was just destroyed and C is its 142 // initializer. If we can, destroy C and all of the constants it refers to. 143 // 144 void GlobalDCE::DestroyInitializer(Constant *C) { 145 // Cannot destroy constants still being used, and cannot destroy primitive 146 // types. 147 if (!C->use_empty() || C->getType()->isPrimitiveType()) return; 148 149 // If this is a CPR, the global value referred to may be dead now! Add it to 150 // the worklist. 151 // 152 if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)) { 153 WorkList.push_back(CPR->getValue()); 154 C->destroyConstant(); 155 ++NumCPRs; 156 } else { 157 bool DestroyContents = true; 158 159 // As an optimization to the GlobalDCE algorithm, do attempt to destroy the 160 // contents of an array of primitive types, because we know that this will 161 // never succeed, and there could be a lot of them. 162 // 163 if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) 164 if (CA->getType()->getElementType()->isPrimitiveType()) 165 DestroyContents = false; // Nothing we can do with the subcontents 166 167 // All other constants refer to other constants. Destroy them if possible 168 // as well. 169 // 170 std::vector<Value*> SubConstants; 171 if (DestroyContents) SubConstants.insert(SubConstants.end(), 172 C->op_begin(), C->op_end()); 173 174 // Destroy the actual constant... 175 C->destroyConstant(); 176 ++NumConsts; 177 178 if (DestroyContents) { 179 // Remove duplicates from SubConstants, so that we do not call 180 // DestroyInitializer on the same constant twice (the first call might 181 // delete it, so this would be bad) 182 // 183 std::sort(SubConstants.begin(), SubConstants.end()); 184 SubConstants.erase(std::unique(SubConstants.begin(), SubConstants.end()), 185 SubConstants.end()); 186 187 // Loop over the subconstants, destroying them as well. 188 for (unsigned i = 0, e = SubConstants.size(); i != e; ++i) 189 DestroyInitializer(cast<Constant>(SubConstants[i])); 190 } 191 } 192 } 193 194 bool GlobalDCE::RemoveUnreachableGlobalVariables(Module &M) { 195 bool Changed = false; 196 WorkList.reserve(M.gsize()); 197 198 // Insert all of the globals into the WorkList, making sure to run 199 // RemoveUnusedConstantPointerRef at least once on all globals... 200 // 201 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 202 Changed |= RemoveUnusedConstantPointerRef(*I); 203 WorkList.push_back(I); 204 } 205 for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I) { 206 Changed |= RemoveUnusedConstantPointerRef(*I); 207 WorkList.push_back(I); 208 } 209 210 // Loop over the worklist, deleting global objects that we can. Whenever we 211 // delete something that might make something else dead, it gets added to the 212 // worklist. 213 // 214 while (!WorkList.empty()) { 215 GlobalValue *GV = WorkList.back(); 216 WorkList.pop_back(); 217 218 Changed |= RemoveIfDead(GV); 219 } 220 221 // Make sure that all memory is free'd from the worklist... 222 std::vector<GlobalValue*>().swap(WorkList); 223 return Changed; 224 } 225 226 227 // RemoveUnusedConstantPointerRef - Loop over all of the uses of the specified 228 // GlobalValue, looking for the constant pointer ref that may be pointing to it. 229 // If found, check to see if the constant pointer ref is safe to destroy, and if 230 // so, nuke it. This will reduce the reference count on the global value, which 231 // might make it deader. 232 // 233 bool GlobalDCE::RemoveUnusedConstantPointerRef(GlobalValue &GV) { 234 for (Value::use_iterator I = GV.use_begin(), E = GV.use_end(); I != E; ++I) 235 if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) 236 if (SafeToDestroyConstant(CPR)) { // Only if unreferenced... 237 CPR->destroyConstant(); 238 ++NumCPRs; 239 return true; 240 } 241 242 return false; 243 } 244 245 // SafeToDestroyConstant - It is safe to destroy a constant iff it is only used 246 // by constants itself. Note that constants cannot be cyclic, so this test is 247 // pretty easy to implement recursively. 248 // 249 bool GlobalDCE::SafeToDestroyConstant(Constant *C) { 250 for (Value::use_iterator I = C->use_begin(), E = C->use_end(); I != E; ++I) 251 if (Constant *User = dyn_cast<Constant>(*I)) { 252 if (!SafeToDestroyConstant(User)) return false; 253 } else { 254 return false; 255 } 256 257 return true; 258 } 259