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

--- Comment #46 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> I meant something like:
> with System.Unsigned_Types; use System.Unsigned_Types;
> 
> function F (X, Y : Unsigned) return Unsigned is
>   Z : Unsigned;
> begin
>   if X >=2 then
>     return 0;
>   end if;
>   Z := Y;
>   if X = 1 then
>     Z := Y + 4;
>   end if;
>   return Z / X;
> end;
> and there evrp does with -O2 -gnatp optimize away the division.

My bad.  I forgot that -gnatp now disables -fnon-call-exceptions too (in order
to make the mode mimic C++) so the testcase must be written:

with System.Unsigned_Types; use System.Unsigned_Types;

function Opt97 (X, Y : Unsigned) return Unsigned is

  pragma Suppress (All_Checks);

  Z : Unsigned;

begin
  if X >= 2 then
    return 0;
  end if;

  Z := Y;
  if X = 1 then
    Z := Y + 4;
  end if;

  return Z / X;
end;

and there is still the divide at -O2 and above on mainline.

Reply via email to