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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2024-01-24
             Status|UNCONFIRMED                 |NEW

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  The reason is we're seeing

<bb 4> :
i.2_3 = i;
i = i.2_3 + 1;
_4 = i.2_3 <= 2;
D.2811 = .ANNOTATE (_4, 1, 16);
retval.1 = D.2811;
if (retval.1 != 0)
  goto <bb 3>; [INV]
else
  goto <bb 5>; [INV]

and the .ANNOTATE is not directly peceeding the condition but the assign
is in the way.

The FE generates

    if (<<cleanup_point ANNOTATE_EXPR <i++  <= 2, unroll 16>>>) goto <D.2807>;
else goto <D.2805>;

for some reason this forces an extra temporary via voidify_wrapper_expr ()
during gimplification.

Possibly the frontend simply lacks knowledge of ANNOTATE_EXPR when
checking whether it needs this cleanup_point at all (but I see
it's too simplistic, checking for side-effects only).

We could walk simple assigns like those of course, but the extra
temporary looks superfluous.

Reply via email to