This would allow reducers that initially analyze the bytecode and preemptively provide targets for the reduction operation (e.g. gather all methods that may be removed). This requires the main loop to first get the initial state from the reducer and then pass it on in each iteration. The main loop would then repeat this whole process until the initial state is "empty" or "final" (i.e. no more options are available).
This should be compatible with the current model (i.e. transformation determines whether current state is final).
Additionally this state model allows for further optimizations such as remembering which targets are "expensive" (e.g. cause infinite loops during execution) and should be placed last wherever possible.