https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90450

--- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> Not exactly sure what happens, need to investigate.  The testcase looks
> innocous enough at least ...

It's about 'd[f]' and 'd[0]' references. The former one is hashed in else
branch and the later
in true branch. These are then equal in mem_ref_hasher::equal as
operand_equal_p can return true
for these 2 array references.

  1479        if (aor.max_size_known_p ()
  1480            && aor.offset.is_constant (&offset)
  1481            && aor.size.is_constant (&size)
  1482            && aor.max_size.is_constant (&max_size)
  1483            && size == max_size
  1484            && (size % BITS_PER_UNIT) == 0
  1485            /* We're canonicalizing to a MEM where TYPE_SIZE specifies
the
  1486               size.  Make sure this is consistent with the extraction. 
*/
  1487            && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (*mem)))
  1488            && known_eq (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE
(*mem))),
  1489                         aor.size)
  1490            && (mem_base = get_addr_base_and_unit_offset (aor.ref,
&mem_off)))
  1491          {
  1492            hash = iterative_hash_expr (ao_ref_base (&aor), 0);
  1493            hash = iterative_hash_host_wide_int (offset, hash);
  1494            hash = iterative_hash_host_wide_int (size, hash);
  1495          }
  1496        else
  1497          {
  1498            hash = iterative_hash_expr (aor.ref, 0);
  1499            aor.max_size = -1;
  1500          }

Reply via email to