------- Additional Comments From paulthomas2 at wanadoo dot fr  2005-04-29 
09:51 -------
Tobi,

The reason that it works is that the value of *data that is passed to matmul 
points to the first element of the array or subarray.  matmul then calculates 
the number of elements from {stride, lbound, ubound} and C-indexing is used for 
athe aritmetic.  *base is therefore never needed.  This is illustrated by the 
following example:

Program pr18857a
  integer, parameter                                :: N = 5
  integer, parameter                                :: T = 4
  real(kind=T), dimension(:,:), allocatable, Target :: a, b, c
  real(kind=T), dimension(:,:), POINTER             :: d, e
  real(kind=T), dimension(N,N)                      :: x, y, z

  allocate (a(2*N, N), b(N, N), c(2*N, N))
  a = 1.0_T
  a(1:N,:) = 2.0_T
  b = 4.0_T
  x = 1.0_T
  y = 2.0_T

  z = 0.0_T
  z = matmul (x, y)
  if (sum (z) /= 250.0_T) call abort ()

  c = 0.0_T
  c = matmul (a(:,3:N), b(3:N,:))
  if (sum (c) /= 900.0_T) call abort ()

  deallocate (a, b, c)

end program pr18857a

I will not pollute Bugzilla with the entire tree dump but limit myself to 
reproducing the part just before and including the second call to matmul (lines 
384-386 of pr18857a.f90.t02.original)

    parm.21.data = (real4[0:] *) (real4[0:] *) &(*b.data)[(3 - b.dim[0].lbound) 
* D.595 + (D.588 - b.dim[1].lbound) * D.596];
    parm.21.offset = 0;
    _gfortran_matmul_r4 (&c, &parm.20, &parm.21);

The (3 - b.dim[0].lbound) provides the offset to the data being multiplied. 
Earlier on in the tree dump, D.588 = b.dim[1].lbound;, so the second part of 
the offset is zero.  By some miracle, the front end does this correctly for 
every case that I can find. 
 

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18857

Reply via email to