http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58455

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Mine.  Adding a phiopt pass isn't enough to fix this as we still end up with

  <bb 4>:
  # _9 = PHI <0(2), 1(3)>
  # ref_offset_6 = PHI <ref_offset_5(D)(2), ref_offset_8(3)>
  _10 = ~_9;
  if (_10 != 0)
    goto <bb 6>;
  else
    goto <bb 5>;

  <bb 5>:

  <bb 6>:
  # _2 = PHI <ref_offset_6(5), 0(4)>

where -O1 needs DOM to thread the two jumps out of bb 4 and phicprop
to clean up the result.

But at -Og we definitely do not want to perform jump threading.  During
gimplification we are confused by the condition being wrapped inside
a CLEANUP_POINT and thus gimplify_cond_expr does not break apart && and ||.
So it looks like gimplification could only handle the || 0 specially,
but that looks like a hack.

While for code quality a simple phiopt pass might make sense for debugging
it would be better to generate improved initial code for the sequence.

Reply via email to