As a reminder, a "widenable branch" is the pattern "br i1 (and i1 X, WC()), label %taken, label %untaken" where "WC" is the widenable condition intrinsics. The semantics of such a branch (derived from the semantics of WC) is that a new condition can be added into the condition arbitrarily without violating legality.
Broaden the definition in two ways:
- Allow swapped operands to the br (and X, WC()) form
- Allow widenable branch w/trivial condition (i.e. true) which takes form of br i1 WC()
The former is just general robustness. The later is specifically important as partial unswitching of a widenable range check produces exactly this form above the loop.
Looks not finished...