------- 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