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.

Reply via email to