void AMDGPUAlwaysInline::recursivelyVisitUsers( GlobalValue &GV, SmallPtrSetImpl<Function *> &FuncsToAlwaysInline) { SmallVector<User *, 16> Stack; SmallPtrSet<const Value *, 8> Visited; for (User *U : GV.users()) Stack.push_back(U); while (!Stack.empty()) { User *U = Stack.pop_back_val(); if (!Visited.insert(U).second) continue; if (Instruction *I = dyn_cast<Instruction>(U)) { Function *F = I->getParent()->getParent(); if (!AMDGPU::isEntryFunctionCC(F->getCallingConv())) { FuncsToAlwaysInline.insert(F); Stack.push_back(F); } // No need to look at further users, but we do need to inline any callers. continue; } for (User *UU : U->users()) Stack.push_back(UU); } }
void GlobalDCEPass::UpdateGVDependencies(GlobalValue &GV) { SmallPtrSet<GlobalValue *, 8> Deps; for (User *User : GV.users()) ComputeDependencies(User, Deps); Deps.erase(&GV); // Remove self-reference. for (GlobalValue *GVU : Deps) { GVDependencies.insert(std::make_pair(GVU, &GV)); } }