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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
          Component|middle-end                  |tree-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2025-01-12
           Keywords|                            |missed-optimization,
                   |                            |rejects-valid
           Severity|normal                      |enhancement
            Summary|musttail false positive on  |tail call vs IPA-VRP return
                   |how locals are used         |value range with constant
                   |                            |value

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #4)
> Oh for -O2, this is IPA VRP coming into play.
> 
> It is turning:
>     [[gnu::musttail]]
>     return tail_call2(opcode);
> 
> into
> 
> tail_call2(opcode);
> return 2;

s/2/1/ .

The error message is definitely wrong.

```
  /* We may proceed if there either is no return value, or the return value
     is identical to the call's return or if the return decl is an empty type
     variable and the call's return was not assigned. */
  if (ret_var
      && (ret_var != ass_var
          && !(is_empty_type (TREE_TYPE (ret_var)) && !ass_var)))
    {
      maybe_error_musttail (call, _("call uses return slot"));
      return;
    }
```

>From EVRP:
Using return value range of tail_call2: [irange] int [1, 1]

tail call should be able to check the call's return value range to see if it
same as the value here.

The -O0 case is due to -O0 does do any optimizations and I highly doubt it can
handle musttail at all.

Reply via email to