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

--- Comment #3 from yuta tomino <demoonlit at panathenaia dot halfmoon.jp> ---
I understood by trial and error that pragma Pure_Function is equivalent to
__attribute__((const)).
I'm sorry. The first case (in my first description) is not compiler's bug but
my mistake. The parameters Left and Right were erased by optimization because
compiler assumed that Pure_Function does not dereference, in my current
understanding.

Also, the case2 (in comment 2) is not reproduced by gcc-5.
However, the reason is that System.Fat_Flt.Unaligned_Valid is removed on gcc-5.


...By the way, I found an another point that I'm concerned.

In the document of pragma Pure_Function, a function having Address parameter is
not considered as Pure_Function.

https://gcc.gnu.org/onlinedocs/gnat_rm/Pragma-Pure_005fFunction.html

> One exception is any function that has at least one formal of type 
> System.Address or a type derived from it. Such functions are not considered 
> pure by default,

But,

with System;
package case3_p is
   pragma Pure;
   function F (X : System.Address) return System.Address;
end case3_p;

package body case3_p is
   function F (X : System.Address) return System.Address is
   begin
      return X;
   end F;
end case3_p;

with case3_p;
with System.Storage_Elements; use System.Storage_Elements;
with GNAT.IO;
procedure case3_m is
begin
   GNAT.IO.Put (Integer (To_Integer (case3_p.F (System'To_Address (10)))));
   GNAT.IO.Put (Integer (To_Integer (case3_p.F (System'To_Address (10)))));
   GNAT.IO.Put (Integer (To_Integer (case3_p.F (System'To_Address (10)))));
end case3_m;

Compile this case3_m.adb with optimization.

% gcc -S -O -gnatp case3_m.adb

    .text
    .globl __ada_case3_m
__ada_case3_m:
LFB1:
    pushq    %rbx
LCFI0:
    movl    $10, %edi
    call    _case3_p__f
    movq    %rax, %rbx
    movl    %eax, %edi
    call    _gnat__io__put__2
    movl    %ebx, %edi
    call    _gnat__io__put__2
    movl    %ebx, %edi
    call    _gnat__io__put__2
    popq    %rbx
LCFI1:
    ret

_case3_p__f is called once on the machine code against that case3_p.F is called
three times from case3_m.
Perhaps, case3_p.F is treated as Pure_Function.

Which of those is correct, the document or the behaviour of compiler?

Reply via email to