// Given a list of loads that could be constant-folded (LoadBaseAddresses), // estimate number of optimized instructions after substituting the concrete // values for the given Iteration. // Fill in SimplifiedInsns map for future use in DCE-estimation. unsigned EstimateNumberOfSimplifiedInsns(unsigned Iteration) { SmallVector<Instruction *, 8> Worklist; SimplifiedValues.clear(); CountedInsns.clear(); NumberOfOptimizedInstructions = 0; // We start by adding all loads to the worklist. for (auto LoadDescr : LoadBaseAddresses) { LoadInst *LI = LoadDescr.first; SimplifiedValues[LI] = computeLoadValue(LI, Iteration); if (CountedInsns.insert(LI).second) NumberOfOptimizedInstructions += TTI.getUserCost(LI); for (auto U : LI->users()) { Instruction *UI = dyn_cast<Instruction>(U); if (!UI) continue; if (!L->contains(UI)) continue; Worklist.push_back(UI); } } // And then we try to simplify every user of every instruction from the // worklist. If we do simplify a user, add it to the worklist to process // its users as well. while (!Worklist.empty()) { Instruction *I = Worklist.pop_back_val(); if (!visit(I)) continue; for (auto U : I->users()) { Instruction *UI = dyn_cast<Instruction>(U); if (!UI) continue; if (!L->contains(UI)) continue; Worklist.push_back(UI); } } return NumberOfOptimizedInstructions; }