ipa-fnsummary: Fix ICE with switch predicates [PR96130]
authorJakub Jelinek <jakub@redhat.com>
Mon, 13 Jul 2020 16:25:53 +0000 (18:25 +0200)
committerJakub Jelinek <jakub@redhat.com>
Mon, 13 Jul 2020 16:25:53 +0000 (18:25 +0200)
commit776e48e0931db69f158f40e5cb8e15463d879a42
tree3d604bcfb67376e9ddd38d9746a80d993d0a7e1d
parentbae66e0f04323ba9d5daf60fcb997de925100e3e
ipa-fnsummary: Fix ICE with switch predicates [PR96130]

The following testcase ICEs since r10-3199.
There is a switch with default label, where the controlling expression has
range just 0..7 and there are case labels for all those 8 values, but
nothing has yet optimized away the default.
Since r10-3199, set_switch_stmt_execution_predicate sets the switch to
default label's edge's predicate to a false predicate and then
compute_bb_predicates propagates the predicates through the cfg, but false
predicates aren't really added.  The caller of compute_bb_predicates
in one place handles NULL bb->aux as false predicate:
      if (fbi.info)
{
  if (bb->aux)
    bb_predicate = *(predicate *) bb->aux;
  else
    bb_predicate = false;
}
      else
bb_predicate = true;
but then in two further spots that the patch below is changing
it assumes bb->aux must be non-NULL.  Those two spots are guarded by a
condition that is only true if fbi.info is non-NULL, so I think the right
fix is to treat NULL aux as false predicate in those spots too.

2020-07-13  Jakub Jelinek  <jakub@redhat.com>

PR ipa/96130
* ipa-fnsummary.c (analyze_function_body): Treat NULL bb->aux
as false predicate.

* gcc.dg/torture/pr96130.c: New test.
gcc/ipa-fnsummary.c
gcc/testsuite/gcc.dg/torture/pr96130.c [new file with mode: 0644]