1 //===-- GlobalDCE.cpp - DCE unreachable internal functions ----------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This transform is designed to eliminate unreachable internal globals from the 11 // program. It uses an aggressive algorithm, searching out globals that are 12 // known to be alive. After it finds all of the globals which are needed, it 13 // deletes whatever is left over. This allows it to delete recursive chunks of 14 // the program which are unreachable. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #include "llvm/ADT/SmallPtrSet.h" 19 #include "llvm/ADT/Statistic.h" 20 #include "llvm/IR/Constants.h" 21 #include "llvm/IR/Instructions.h" 22 #include "llvm/IR/Module.h" 23 #include "llvm/Pass.h" 24 #include "llvm/Transforms/IPO.h" 25 #include "llvm/Transforms/Utils/CtorUtils.h" 26 #include "llvm/Transforms/Utils/GlobalStatus.h" 27 #include <unordered_map> 28 using namespace llvm; 29 30 #define DEBUG_TYPE "globaldce" 31 32 STATISTIC(NumAliases , "Number of global aliases removed"); 33 STATISTIC(NumFunctions, "Number of functions removed"); 34 STATISTIC(NumVariables, "Number of global variables removed"); 35 36 namespace { 37 struct GlobalDCE : public ModulePass { 38 static char ID; // Pass identification, replacement for typeid 39 GlobalDCE() : ModulePass(ID) { 40 initializeGlobalDCEPass(*PassRegistry::getPassRegistry()); 41 } 42 43 // run - Do the GlobalDCE pass on the specified module, optionally updating 44 // the specified callgraph to reflect the changes. 45 // 46 bool runOnModule(Module &M) override; 47 48 private: 49 SmallPtrSet<GlobalValue*, 32> AliveGlobals; 50 SmallPtrSet<Constant *, 8> SeenConstants; 51 std::unordered_multimap<Comdat *, GlobalValue *> ComdatMembers; 52 53 /// GlobalIsNeeded - mark the specific global value as needed, and 54 /// recursively mark anything that it uses as also needed. 55 void GlobalIsNeeded(GlobalValue *GV); 56 void MarkUsedGlobalsAsNeeded(Constant *C); 57 58 bool RemoveUnusedGlobalValue(GlobalValue &GV); 59 }; 60 } 61 62 /// Returns true if F contains only a single "ret" instruction. 63 static bool isEmptyFunction(Function *F) { 64 BasicBlock &Entry = F->getEntryBlock(); 65 if (Entry.size() != 1 || !isa<ReturnInst>(Entry.front())) 66 return false; 67 ReturnInst &RI = cast<ReturnInst>(Entry.front()); 68 return RI.getReturnValue() == nullptr; 69 } 70 71 char GlobalDCE::ID = 0; 72 INITIALIZE_PASS(GlobalDCE, "globaldce", 73 "Dead Global Elimination", false, false) 74 75 ModulePass *llvm::createGlobalDCEPass() { return new GlobalDCE(); } 76 77 bool GlobalDCE::runOnModule(Module &M) { 78 if (skipModule(M)) 79 return false; 80 81 bool Changed = false; 82 83 // Remove empty functions from the global ctors list. 84 Changed |= optimizeGlobalCtorsList(M, isEmptyFunction); 85 86 // Collect the set of members for each comdat. 87 for (Function &F : M) 88 if (Comdat *C = F.getComdat()) 89 ComdatMembers.insert(std::make_pair(C, &F)); 90 for (GlobalVariable &GV : M.globals()) 91 if (Comdat *C = GV.getComdat()) 92 ComdatMembers.insert(std::make_pair(C, &GV)); 93 for (GlobalAlias &GA : M.aliases()) 94 if (Comdat *C = GA.getComdat()) 95 ComdatMembers.insert(std::make_pair(C, &GA)); 96 97 // Loop over the module, adding globals which are obviously necessary. 98 for (Function &F : M) { 99 Changed |= RemoveUnusedGlobalValue(F); 100 // Functions with external linkage are needed if they have a body 101 if (!F.isDeclaration() && !F.hasAvailableExternallyLinkage()) 102 if (!F.isDiscardableIfUnused()) 103 GlobalIsNeeded(&F); 104 } 105 106 for (GlobalVariable &GV : M.globals()) { 107 Changed |= RemoveUnusedGlobalValue(GV); 108 // Externally visible & appending globals are needed, if they have an 109 // initializer. 110 if (!GV.isDeclaration() && !GV.hasAvailableExternallyLinkage()) 111 if (!GV.isDiscardableIfUnused()) 112 GlobalIsNeeded(&GV); 113 } 114 115 for (GlobalAlias &GA : M.aliases()) { 116 Changed |= RemoveUnusedGlobalValue(GA); 117 // Externally visible aliases are needed. 118 if (!GA.isDiscardableIfUnused()) 119 GlobalIsNeeded(&GA); 120 } 121 122 // Now that all globals which are needed are in the AliveGlobals set, we loop 123 // through the program, deleting those which are not alive. 124 // 125 126 // The first pass is to drop initializers of global variables which are dead. 127 std::vector<GlobalVariable *> DeadGlobalVars; // Keep track of dead globals 128 for (GlobalVariable &GV : M.globals()) 129 if (!AliveGlobals.count(&GV)) { 130 DeadGlobalVars.push_back(&GV); // Keep track of dead globals 131 if (GV.hasInitializer()) { 132 Constant *Init = GV.getInitializer(); 133 GV.setInitializer(nullptr); 134 if (isSafeToDestroyConstant(Init)) 135 Init->destroyConstant(); 136 } 137 } 138 139 // The second pass drops the bodies of functions which are dead... 140 std::vector<Function *> DeadFunctions; 141 for (Function &F : M) 142 if (!AliveGlobals.count(&F)) { 143 DeadFunctions.push_back(&F); // Keep track of dead globals 144 if (!F.isDeclaration()) 145 F.deleteBody(); 146 } 147 148 // The third pass drops targets of aliases which are dead... 149 std::vector<GlobalAlias*> DeadAliases; 150 for (GlobalAlias &GA : M.aliases()) 151 if (!AliveGlobals.count(&GA)) { 152 DeadAliases.push_back(&GA); 153 GA.setAliasee(nullptr); 154 } 155 156 if (!DeadFunctions.empty()) { 157 // Now that all interferences have been dropped, delete the actual objects 158 // themselves. 159 for (Function *F : DeadFunctions) { 160 RemoveUnusedGlobalValue(*F); 161 M.getFunctionList().erase(F); 162 } 163 NumFunctions += DeadFunctions.size(); 164 Changed = true; 165 } 166 167 if (!DeadGlobalVars.empty()) { 168 for (GlobalVariable *GV : DeadGlobalVars) { 169 RemoveUnusedGlobalValue(*GV); 170 M.getGlobalList().erase(GV); 171 } 172 NumVariables += DeadGlobalVars.size(); 173 Changed = true; 174 } 175 176 // Now delete any dead aliases. 177 if (!DeadAliases.empty()) { 178 for (GlobalAlias *GA : DeadAliases) { 179 RemoveUnusedGlobalValue(*GA); 180 M.getAliasList().erase(GA); 181 } 182 NumAliases += DeadAliases.size(); 183 Changed = true; 184 } 185 186 // Make sure that all memory is released 187 AliveGlobals.clear(); 188 SeenConstants.clear(); 189 ComdatMembers.clear(); 190 191 return Changed; 192 } 193 194 /// GlobalIsNeeded - the specific global value as needed, and 195 /// recursively mark anything that it uses as also needed. 196 void GlobalDCE::GlobalIsNeeded(GlobalValue *G) { 197 // If the global is already in the set, no need to reprocess it. 198 if (!AliveGlobals.insert(G).second) 199 return; 200 201 if (Comdat *C = G->getComdat()) { 202 for (auto &&CM : make_range(ComdatMembers.equal_range(C))) 203 GlobalIsNeeded(CM.second); 204 } 205 206 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(G)) { 207 // If this is a global variable, we must make sure to add any global values 208 // referenced by the initializer to the alive set. 209 if (GV->hasInitializer()) 210 MarkUsedGlobalsAsNeeded(GV->getInitializer()); 211 } else if (GlobalIndirectSymbol *GIS = dyn_cast<GlobalIndirectSymbol>(G)) { 212 // The target of a global alias or ifunc is needed. 213 MarkUsedGlobalsAsNeeded(GIS->getIndirectSymbol()); 214 } else { 215 // Otherwise this must be a function object. We have to scan the body of 216 // the function looking for constants and global values which are used as 217 // operands. Any operands of these types must be processed to ensure that 218 // any globals used will be marked as needed. 219 Function *F = cast<Function>(G); 220 221 for (Use &U : F->operands()) 222 MarkUsedGlobalsAsNeeded(cast<Constant>(U.get())); 223 224 for (BasicBlock &BB : *F) 225 for (Instruction &I : BB) 226 for (Use &U : I.operands()) 227 if (GlobalValue *GV = dyn_cast<GlobalValue>(U)) 228 GlobalIsNeeded(GV); 229 else if (Constant *C = dyn_cast<Constant>(U)) 230 MarkUsedGlobalsAsNeeded(C); 231 } 232 } 233 234 void GlobalDCE::MarkUsedGlobalsAsNeeded(Constant *C) { 235 if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) 236 return GlobalIsNeeded(GV); 237 238 // Loop over all of the operands of the constant, adding any globals they 239 // use to the list of needed globals. 240 for (Use &U : C->operands()) { 241 // If we've already processed this constant there's no need to do it again. 242 Constant *Op = dyn_cast<Constant>(U); 243 if (Op && SeenConstants.insert(Op).second) 244 MarkUsedGlobalsAsNeeded(Op); 245 } 246 } 247 248 // RemoveUnusedGlobalValue - Loop over all of the uses of the specified 249 // GlobalValue, looking for the constant pointer ref that may be pointing to it. 250 // If found, check to see if the constant pointer ref is safe to destroy, and if 251 // so, nuke it. This will reduce the reference count on the global value, which 252 // might make it deader. 253 // 254 bool GlobalDCE::RemoveUnusedGlobalValue(GlobalValue &GV) { 255 if (GV.use_empty()) 256 return false; 257 GV.removeDeadConstantUsers(); 258 return GV.use_empty(); 259 } 260