https://gcc.gnu.org/bugzilla/show_bug.cgi?id=73550
--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> --- Another thing we have is that with After normalization [USE]: fp_5 (a.3_4, b.2_3); is conditional on: ((_27 & 20500) AND (NOT (_26 != 0)) AND (NOT (_20 > 14))) and After normalization [DEF]: fp_5 = PHI <fun1(6), fun3(24), fp_11(D)(21), fun2(3), fun3(26)> is conditional on: ((code_9(D) == 2)) OR ((code_9(D) <= 4) AND (code_9(D) >= 3)) OR ((code_9(D) == 1)) OR ((code_9(D) == 12)) OR ((code_9(D) <= 14) AND (code_9(D) >= 13)) OR ((code_9(D) == 11)) the negated _26 != 0 predicate is not "normalized", it's defined as _20 = (unsigned int) code_9(D); ... _27 = 1 << _20; _26 = _27 & 480; so ultimatively switch lowering lowers the second switch statement which confuses us greatly here. OTOH without switch lowering we'd fail to process the use predicate because it's reached by multiple case labels. Solving this case fully is going to be interesting, but I have some more incremental improvements here.