diff --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp --- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -305,12 +305,15 @@ // Using replaceUsesWithIf is probably the easiest way to do this without // duplicating code. + SmallVector ReplacedUsers; V->replaceUsesWithIf(Const, [&](auto &U) { if (auto *I = dyn_cast(U.getUser())) if (Solver.isBlockExecutable(I->getParent())) - Solver.visit(I); + ReplacedUsers.push_back(I); return true; }); + for (auto *I : ReplacedUsers) + Solver.visit(I); // Remove the instruction from Block and Solver. if (auto *I = dyn_cast(V)) {