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

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we're value-numbering a char load

Value numbering stmt = _177 = *sc_175;

with sc_175 == _7 and

  _7 = &cx_41(D)->i2c_adap[i_24].name;

which get's us a valueized ref (of type 'char') that looks like
cx_41(D)->i2c_adap[i_24].name and ao_ref_init_from_vn_reference turning
that into

$1 = {ref = <tree 0x0>, base = <mem_ref 0x7ffff521cf28>, 
  offset = {<poly_int_pod<1, long>> = {coeffs = {388000}}, <No data fields>}, 
  size = {<poly_int_pod<1, long>> = {coeffs = {384}}, <No data fields>}, 
  max_size = {<poly_int_pod<1, long>> = {coeffs = {384}}, <No data fields>}, 
  ref_alias_set = 0, base_alias_set = 0, volatile_p = false}

because it looks at COMPONENT_REF/BIT_FIELD_REF sizes but those really only
represent offsets (well, not really really, but ...).

We then arrive at

# .MEM_170 = VDEF <.MEM_169>
cx_41(D)->i2c_adap[i_24].name = "cx18 i2c driver";

So this looks like a latent thing waiting to happen.  The GIMPLE FE is
currently not happy to produce a testcase.  Trunk is somewhat more
resilent to produce the situation since vn_reference_maybe_forwprop_address
uses the SSA lattice for the address offset calculation (in this case
i_24 has value zero).

With the proposed assert at least the LTRANS unit reproduces an ICE
with a debug build for me.

Reply via email to