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 = std::find(WorkList.erase(I), WorkList.end(), GV); 128 129 return true; 130 } 131 } else { 132 Function *F = cast<Function>(GV); 133 // FIXME: TODO 134 135 } 136 return false; 137 } 138 139 // DestroyInitializer - A global variable was just destroyed and C is its 140 // initializer. If we can, destroy C and all of the constants it refers to. 141 // 142 void GlobalDCE::DestroyInitializer(Constant *C) { 143 // Cannot destroy constants still being used, and cannot destroy primitive 144 // types. 145 if (!C->use_empty() || C->getType()->isPrimitiveType()) return; 146 147 // If this is a CPR, the global value referred to may be dead now! Add it to 148 // the worklist. 149 // 150 if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)) { 151 WorkList.push_back(CPR->getValue()); 152 C->destroyConstant(); 153 ++NumCPRs; 154 } else { 155 bool DestroyContents = true; 156 157 // As an optimization to the GlobalDCE algorithm, do attempt to destroy the 158 // contents of an array of primitive types, because we know that this will 159 // never succeed, and there could be a lot of them. 160 // 161 if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) 162 if (CA->getType()->getElementType()->isPrimitiveType()) 163 DestroyContents = false; // Nothing we can do with the subcontents 164 165 // All other constants refer to other constants. Destroy them if possible 166 // as well. 167 // 168 std::vector<Value*> SubConstants; 169 if (DestroyContents) SubConstants.insert(SubConstants.end(), 170 C->op_begin(), C->op_end()); 171 172 // Destroy the actual constant... 173 C->destroyConstant(); 174 ++NumConsts; 175 176 if (DestroyContents) { 177 // Remove duplicates from SubConstants, so that we do not call 178 // DestroyInitializer on the same constant twice (the first call might 179 // delete it, so this would be bad) 180 // 181 std::sort(SubConstants.begin(), SubConstants.end()); 182 SubConstants.erase(std::unique(SubConstants.begin(), SubConstants.end()), 183 SubConstants.end()); 184 185 // Loop over the subconstants, destroying them as well. 186 for (unsigned i = 0, e = SubConstants.size(); i != e; ++i) 187 DestroyInitializer(cast<Constant>(SubConstants[i])); 188 } 189 } 190 } 191 192 bool GlobalDCE::RemoveUnreachableGlobalVariables(Module &M) { 193 bool Changed = false; 194 WorkList.reserve(M.gsize()); 195 196 // Insert all of the globals into the WorkList, making sure to run 197 // RemoveUnusedConstantPointerRef at least once on all globals... 198 // 199 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 200 Changed |= RemoveUnusedConstantPointerRef(*I); 201 WorkList.push_back(I); 202 } 203 for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I) { 204 Changed |= RemoveUnusedConstantPointerRef(*I); 205 WorkList.push_back(I); 206 } 207 208 // Loop over the worklist, deleting global objects that we can. Whenever we 209 // delete something that might make something else dead, it gets added to the 210 // worklist. 211 // 212 while (!WorkList.empty()) { 213 GlobalValue *GV = WorkList.back(); 214 WorkList.pop_back(); 215 216 Changed |= RemoveIfDead(GV); 217 } 218 219 // Make sure that all memory is free'd from the worklist... 220 std::vector<GlobalValue*>().swap(WorkList); 221 return Changed; 222 } 223 224 225 // RemoveUnusedConstantPointerRef - Loop over all of the uses of the specified 226 // GlobalValue, looking for the constant pointer ref that may be pointing to it. 227 // If found, check to see if the constant pointer ref is safe to destroy, and if 228 // so, nuke it. This will reduce the reference count on the global value, which 229 // might make it deader. 230 // 231 bool GlobalDCE::RemoveUnusedConstantPointerRef(GlobalValue &GV) { 232 for (Value::use_iterator I = GV.use_begin(), E = GV.use_end(); I != E; ++I) 233 if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(*I)) 234 if (SafeToDestroyConstant(CPR)) { // Only if unreferenced... 235 CPR->destroyConstant(); 236 ++NumCPRs; 237 return true; 238 } 239 240 return false; 241 } 242 243 // SafeToDestroyConstant - It is safe to destroy a constant iff it is only used 244 // by constants itself. Note that constants cannot be cyclic, so this test is 245 // pretty easy to implement recursively. 246 // 247 bool GlobalDCE::SafeToDestroyConstant(Constant *C) { 248 for (Value::use_iterator I = C->use_begin(), E = C->use_end(); I != E; ++I) 249 if (Constant *User = dyn_cast<Constant>(*I)) { 250 if (!SafeToDestroyConstant(User)) return false; 251 } else { 252 return false; 253 } 254 255 return true; 256 } 257