[Bug fortran/18857] MATMUL failing with ALLOCATED matrices, unless base indices given
tkoenig at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Apr 19 18:51:00 GMT 2005
------- Additional Comments From tkoenig at gcc dot gnu dot org 2005-04-19 18:51 -------
descriptor.offset (in the front end) aka descriptor->base
in the library is currently useless.
Look at this:
$ cat offset.f90
program main
real :: a(2,2)
real, allocatable :: b(:,:)
real, pointer :: c(:,:)
call foo(a)
allocate(b(2,2),c(2,2))
call foo(b)
call foo(c)
contains
subroutine foo(a)
real, dimension(:,:) :: a
a(1,1) = 1.0
end subroutine foo
end program main
$ gfortran -fdump-tree-original offset.f90
>From the .original file:
foo (a)
{
int4 ubound.0;
int4 stride.1;
int4 ubound.2;
int4 stride.3;
int4 offset.4;
real4[0:] * a.0;
{
int4 D.484;
D.484 = a->dim[0].stride;
stride.1 = D.484 == 0 ? 1 : D.484;
a.0 = (real4[0:] *) a->data;
ubound.0 = a->dim[0].ubound - a->dim[0].lbound + 1;
stride.3 = a->dim[1].stride;
ubound.2 = a->dim[1].ubound - a->dim[1].lbound + 1;
offset.4 = -stride.1 - NON_LVALUE_EXPR <stride.3>;
}
(*a.0)[NON_LVALUE_EXPR <stride.1> + NON_LVALUE_EXPR <stride.3> + offset.4] =
1.0e+0;
}
You can see that offset.4 is calculated without a reference to a->offset.
This is a good thing, because the offset is only calculated correctly
for static arrays:
MAIN__ ()
{
struct array2_real4 c;
real4 a[4];
struct array2_real4 b;
static void foo (struct array2_real4 &);
c.data = 0B;
b.data = 0B;
{
struct array2_real4 parm.5;
parm.5.dtype = 282;
parm.5.dim[0].lbound = 1;
parm.5.dim[0].ubound = 2;
parm.5.dim[0].stride = 1;
parm.5.dim[1].lbound = 1;
parm.5.dim[1].ubound = 2;
parm.5.dim[1].stride = 2;
parm.5.data = (real4[0:] *) (real4[0:] *) &a[0];
parm.5.offset = 0;
^^^^^^^^^^
This is wrong.
foo (&parm.5);
}
For allocated and pointer arrays, this is done correctly:
{
real4[0:] * * D.504;
b.dtype = 282;
b.dim[0].lbound = 1;
b.dim[0].ubound = 2;
b.dim[0].stride = 1;
b.dim[1].lbound = 1;
b.dim[1].ubound = 2;
b.dim[1].stride = 2;
D.504 = &b.data;
_gfortran_allocate (D.504, 16, 0);
b.offset = -3;
^^^^^^^
correct
}
{
real4[0:] * * D.505;
c.dtype = 282;
c.dim[0].lbound = 1;
c.dim[0].ubound = 2;
c.dim[0].stride = 1;
c.dim[1].lbound = 1;
c.dim[1].ubound = 2;
c.dim[1].stride = 2;
D.505 = &c.data;
_gfortran_allocate (D.505, 16, 0);
c.offset = -3;
^^^^^^
correct
}
foo (&b);
foo (&c);
The assert is therefore false and should be removed.
The question remains: What to do with the offset field?
Fix it in the front end for static arrays, or remove it
altogether?
--
What |Removed |Added
----------------------------------------------------------------------------
CC| |Thomas dot Koenig at online
| |dot de
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18857
More information about the Gcc-bugs
mailing list