https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103101
Bug ID: 103101
Summary: testsuite/gfortran.dg/vector_subscript_1.f90 fails
with -fipa-pta (apparently due to dom bug)
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: hubicka at gcc dot gnu.org
Target Milestone: ---
Building testcase with:
/aux/hubicka/trunk/build5/gcc/testsuite/gfortran2/../../gfortran
-B/aux/hubicka/trunk/build2/gcc/testsuite/gfortran2/../../
-B/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libgfortran/
/aux/hubicka/trunk/gcc/testsuite/gfortran.dg/vector_subscript_1.f90
-fdiagnostics-plain-output -fdiagnostics-plain-output -O1 -pedantic-errors
-B/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libgfortran/.libs
-L/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libgfortran/.libs
-L/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libgfortran/.libs
-L/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libatomic/.libs
-B/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libquadmath/.libs
-L/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libquadmath/.libs
-L/aux/hubicka/trunk/build5/x86_64-pc-linux-gnu/./libquadmath/.-tree-all-details
-fipa-pta
leads to abort STOP 12
I have reduced the testcase somewhat as:
program main
implicit none
integer, parameter :: n = 10
integer :: i, j, calls
integer, dimension (n) :: a, b, idx, id
idx = (/ 3, 1, 5, 2, 4, 10, 8, 7, 6, 9 /)
id = (/ (i, i = 1, n) /)
b = (/ (i * 100, i = 1, n) /)
!------------------------------------------------------------------
! Tests for a simple variable subscript
!------------------------------------------------------------------
a (idx) = b
a = b (idx)
call test (id, idx)
!------------------------------------------------------------------
! Tests for constant ranges with non-default stride
!------------------------------------------------------------------
a (idx (1:7:3)) = b (idx (10:6:-2))
call test (idx (1:7:3), idx (10:6:-2))
a (idx (10:6:-2)) = b (idx (10:6:-2))
call test (idx (10:6:-2), idx (10:6:-2))
contains
subroutine test (lhs, rhs)
integer, dimension (:) :: lhs, rhs
integer :: i
if (size (lhs, 1) .ne. size (rhs, 1)) STOP 11
do i = 1, size (lhs, 1)
if (a (lhs (i)) .ne. b (rhs (i))) STOP 12
end do
a = 0
end subroutine test
end program main
This fails when built with -O1 -fipa-pta and works with -O1 or -O1 -fipa-pta
-fno-tree-dominator-opts
In dom2 we replace:
<bb 6> [local count: 292809384]:
# S.22_125 = PHI <S.22_63(6), 0(5)>
_7 = S.22_125 * 3;
_60 = MEM <integer(kind=4)[0:]> [(integer(kind=4)[0:] *)&idx][_7];
_8 = S.22_125 * -2;
_61 = MEM <integer(kind=4)[0:]> [(integer(kind=4)[0:] *)&idx + 36B][_8];
_9 = (integer(kind=8)) _61;
_10 = _9 + -1;
_11 = (integer(kind=8)) _60;
_12 = _11 + -1;
_13 = FRAME.37.b[_10];
FRAME.37.a[_12] = _13;
S.22_63 = S.22_125 + 1;
if (S.22_63 > 2)
goto <bb 7>; [25.00%]
else
goto <bb 6>; [75.00%]
<bb 7> [local count: 97603128]:
parm.23.span = 4;
MEM <c_char[8]> [(struct dtype_type *)&parm.23 + 24B] = {};
parm.23.dtype.elem_len = 4;
parm.23.dtype.rank = 1;
parm.23.dtype.type = 1;
parm.23.dim[0].lbound = 1;
parm.23.dim[0].ubound = 3;
parm.23.dim[0].stride = 3;
parm.23.data = &idx[0];
parm.23.offset = -3;
parm.24.span = 4;
MEM <c_char[8]> [(struct dtype_type *)&parm.24 + 24B] = {};
parm.24.dtype.elem_len = 4;
parm.24.dtype.rank = 1;
parm.24.dtype.type = 1;
parm.24.dim[0].lbound = 1;
parm.24.dim[0].ubound = 3;
parm.24.dim[0].stride = -2;
parm.24.data = &idx[9];
parm.24.offset = 2;
test (&parm.23, &parm.24); [static-chain: &FRAME.37]
parm.23 ={v} {CLOBBER};
parm.24 ={v} {CLOBBER};
<bb 8> [local count: 292809384]:
# S.27_126 = PHI <S.27_89(8), 0(7)>
_14 = S.27_126 * -2;
_87 = MEM <integer(kind=4)[0:]> [(integer(kind=4)[0:] *)&idx + 36B][_14];
^^^^ this by:
_87 = _61;
_61 is initialized in loop and does not seem to be loop invariant, so I do not
see why dom thinks it is equivalent to _87 and the details dump does not seem
helping.