Hi all.

While looking at PR fortran/22572, I wondered where the difference between the 
following two programs might be:

$> cat matmul.f90
  REAL, DIMENSION(1,1), PARAMETER :: a = 1.0, b = 2.0
  REAL, DIMENSION(1,1) :: c
  c = MATMUL(a, b)
  c = MATMUL(a, b)
end

$> cat sin.f90
  REAL, DIMENSION(1, 1), PARAMETER :: a = 1.0
  REAL, DIMENSION(1, 1) :: b, c
  b = SIN(a)
  c = SIN(a)
end

Compiling both with "-Wall -O3 -S -fdump-tree-original -fdump-tree-optimized", 
one finds that the calls to SIN in sin.f90 have been optimized into 
nothingness, while MATMUL in matmul.f90 is spelled out twice in the optimized 
tree dump.

The main difference that springs to mind: SIN is built-in, MATMUL is a library 
function. In gcc/builtin.defs, one finds 

        DEF_LIB_BUILTIN (BUILT_IN_SIN, "sin", BT_FN_DOUBLE_DOUBLE,
                         ATTR_MATHFN_FPROUNDING)

with

        #define ATTR_MATHFN_FPROUNDING (flag_rounding_math ? \
                ATTR_PURE_NOTHROW_NOVOPS_LIST : ATTR_CONST_NOTHROW_LIST)

Grep'ing the fortran sources, hardly any ATTR_* are used. Would the 
application of ATTR_MATHFN_FPROUNDING or any other ATTR_* (e.g. ATTR_PURE?) 
make any difference for the optimizer? If yes, where and how should these 
attributes be applied to the function symbol?

Are these the right questions to ask or am I barking up the wrong tree?

Thanks

        Daniel

Reply via email to