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 @@ -303,10 +303,14 @@ isConstant(IV) ? Solver.getConstant(IV) : UndefValue::get(V->getType()); V->replaceAllUsesWith(Const); - for (auto *U : Const->users()) - if (auto *I = dyn_cast(U)) + // Using replaceUsesWithIf is probably the easiest way to do this without + // duplicating code. + V->replaceUsesWithIf(Const, [&](auto &U) { + if (auto *I = dyn_cast(U.getUser())) if (Solver.isBlockExecutable(I->getParent())) Solver.visit(I); + return true; + }); // Remove the instruction from Block and Solver. if (auto *I = dyn_cast(V)) {