### Regarding (d.1) vs (d.2)
I suspect that (d.1) has not much value over (d.2), since both will split more stores than necessary and that can only be repaired with (c). The only thing is that (d.1) may generate less of them.
If we put (d.1) before or inside the `do ... while(progress)` (or as an extension of copy-prop, which makes sense), it may be splitting with more granularity than necessary, since, revealing that values come from the same instruction may take several of these iterations, and if we place it after, it won't help copy prop.
(d.2) can be put before the `do ... while(progress)` and executed once.