As branch on undef is immediate undefined behavior, there is no need to mark one of the edges as feasible. We can leave all the edges non-feasible. In IPSCCP, we can replace the branch with an unreachable terminator.
Unfortunately, while this does make undef resolution much simpler, we do still need the other part of it (which marks instructions as overdefined). I think what we currently do there is somewhat non-optimal, but having some kind of undef resolution phase is probably not avoidable.
I don't think the example given in the comment is accurate. The lattice distinguishes between unknown and undef, so PHI nodes should propagate correctly.
The problem is other operations: for example, visitCastInst doesn't propagate undef values. (This is an optimization: if the operand of a cast transitions from undef to a non-undef constant, we don't want to force the result of the cast to overdefined. We might want to consider revisiting this once we're using poison more consistently.)