There appears to be a missed opportunity to optimize
away exponential operators.  I suspect that this 
falls under gfortrani's frontend-optimize option, but 
it may also be a middle-end issue.

Consider,

  subroutine foo(n)
    integer n
    integer i, j
    i = 2
    j = 4
    n = i**j   ! <-- This should evaluate to 16 without a function call.
  end subroutine foo

% gfortran -O -fdump-tree-original -fdump-tree-optimized foo.f90
% cat a.f90.003t.original
foo (integer(kind=4) & restrict n)
{
  integer(kind=4) i;
  integer(kind=4) j;

  i = 2;
  j = 4;
  {
    integer(kind=4) D.3382;

    D.3382 = i;
    *n = _gfortran_pow_i4_i4 (D.3382, j);
  }
}

%  cat a.f90.188t.optimized
;; Function foo (foo_, funcdef_no=0, decl_uid=3377, cgraph_uid=0, 
symbol_order=0)

foo (integer(kind=4) & restrict n)
{
  integer(kind=4) _1;

  <bb 2>:
  _1 = _gfortran_pow_i4_i4 (2, 4);
  *n_3(D) = _1;
  return;

}

I don't know if it is possible to get the optimizer to recognize
the _gfortran_pow_i4_i4 (2, 4) can be replaced by 16.

-- 
steve


Reply via email to