This is nfc, but just complicated I wanted a separate set of eyes. The motivation is a) cleaner code, and b) reducing some spurious test changes in D98315.
Previously we created a new node, then filled in the pieces. Now, we clone the existing node, then change the respective fields. The only change in handling is with phis since we have to handle multiple incoming edges from the same block a bit differently.