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

--- Comment #6 from Jeffrey A. Law <law at redhat dot com> ---
So we have these statements during SRA:

 _4 = e[d.1_3];
  _5 = (int) _4;


We delete the first statement, presumably because we're going to apply SRA to
the RHS of that statement.  That releases _4 back to the manager, leaving this
IL:

;;   basic block 2, loop depth 0
;;    pred:       ENTRY
  b.0_11 = b;
  _12 = (unsigned char) b.0_11;
  MEM[(unsigned char *)&e + 16B] = _12;
  _13 = a;
  d.1_3 = d;
  _5 = (int) _4;
  d = _5;
  MEM[(char * {ref-all})&c] = MEM[(char * {ref-all})&e];
  e ={v} {CLOBBER};
  return;
;;    succ:       EXIT

And we call sra_modify_assign on the _5 = (int) _4 statement.

But that statement does not satisfy gimple_assign_single_p so sra_modify_assign
does nothing.  That leaves the dangling reference to _4 in the IL and we
ultimately blow up in the gimple verification routines.

I've never looked at tree-sra in detail before.  But ISTM given the structure
of sra_modify_assign that we assume that if we delete a statement like we've
done here that all references are going to get fixed by subsequent calls to
sra_modify_assign.  sra_modify_assign punts anything that is not
gimple_assign_single_p, so perhaps we're missing a similar test elsewhere in
tree-sra.c.

Reply via email to