The LangRef clearly states that branching on a poison value is immediate undefined behavior, but historically, we have not been consistent about implementing that interpretation in the optimizer. Historically, we used (in some cases) a more relaxed model which essentially downgraded the poison to undef, and then looked for provable UB along the paths. However, we've never been 100% consistent here.
At the moment, the last big blocker for this change is D106041. Loop unswitching (in it's classic form) is incorrect with this change as it creates many "branch on poisons" when unswitching conditions originally unreachable within the loop.
This is posted mostly to show the benefit of this change optimization quality wise. If reviewers are comfortable with this, I'd like to introduce the actual code change under an off by default flag (e.g. minimal test diffs) so that we can run performance tests in combination with the unswitch changes.