Commit 28f9f145 by Sebastian Pop Committed by Sebastian Pop

re PR tree-optimization/42637 ([graphite] wrong code for -floop-interchange…

re PR tree-optimization/42637 ([graphite] wrong code for -floop-interchange -ftree-loop-distribution)

Fix PR42637.

2010-02-05  Sebastian Pop  <sebastian.pop@amd.com>
	    Konrad Trifunovic  <konrad.trifunovic@inria.fr>

	PR middle-end/42637
	* graphite-dependences.c (build_lexicographical_constraint): Return
	a union of dependence polyhedra.
	(dependence_polyhedron_1): Adapt for build_lexicographical_constraint.

	* testsuite/gcc.dg/graphite/block-0.c: Enable runtime check.  XFAILed.
	* testsuite/gcc.dg/graphite/block-4.c: Same.
	* testsuite/gcc.dg/graphite/block-7.c: Same.
	* testsuite/gcc.dg/graphite/interchange-12.c: Same.
	* testsuite/gcc.dg/graphite/interchange-mvt.c: Same.
	* testsuite/gfortran.dg/graphite/interchange-1.f: XFAILed.
	* testsuite/gfortran.dg/graphite/interchange-3.f90: XFAILed.
	* testsuite/gfortran.dg/graphite/run-id-1.f: New testcase for PR42637.

Co-Authored-By: Konrad Trifunovic <konrad.trifunovic@inria.fr>

From-SVN: r156552
parent 4d0bf08b
2010-02-05 Sebastian Pop <sebastian.pop@amd.com>
Konrad Trifunovic <konrad.trifunovic@inria.fr>
PR middle-end/42637
* graphite-dependences.c (build_lexicographical_constraint): Return
a union of dependence polyhedra.
(dependence_polyhedron_1): Adapt for build_lexicographical_constraint.
* testsuite/gcc.dg/graphite/block-0.c: Enable runtime check. XFAILed.
* testsuite/gcc.dg/graphite/block-4.c: Same.
* testsuite/gcc.dg/graphite/block-7.c: Same.
* testsuite/gcc.dg/graphite/interchange-12.c: Same.
* testsuite/gcc.dg/graphite/interchange-mvt.c: Same.
* testsuite/gfortran.dg/graphite/interchange-1.f: XFAILed.
* testsuite/gfortran.dg/graphite/interchange-3.f90: XFAILed.
* testsuite/gfortran.dg/graphite/run-id-1.f: New testcase for PR42637.
2010-02-03 Sebastian Pop <sebastian.pop@amd.com> 2010-02-03 Sebastian Pop <sebastian.pop@amd.com>
* testsuite/gcc.dg/graphite/interchange-12.c: Return 0 to avoid * testsuite/gcc.dg/graphite/interchange-12.c: Return 0 to avoid
......
...@@ -412,58 +412,56 @@ build_pairwise_scheduling (graphite_dim_t dim, ...@@ -412,58 +412,56 @@ build_pairwise_scheduling (graphite_dim_t dim,
return res; return res;
} }
/* Add to a non empty polyhedron RES the precedence constraints for /* Add to a non empty polyhedron BAG the precedence constraints for
the lexicographical comparison of time vectors in RES following the the lexicographical comparison of time vectors in BAG following the
lexicographical order. DIM is the dimension of the polyhedron RES. lexicographical order. DIM is the dimension of the polyhedron BAG.
TDIM is the number of loops common to the two statements that are TDIM is the number of loops common to the two statements that are
compared lexicographically, i.e. the number of loops containing compared lexicographically, i.e. the number of loops containing
both statements. OFFSET is the number of dimensions needed to both statements. OFFSET is the number of dimensions needed to
represent the first statement, i.e. dimT1 + dimI1 in the layout of represent the first statement, i.e. dimT1 + dimI1 in the layout of
the RES polyhedron: T1|I1|T2|I2|S1|S2|G. When DIRECTION is set to the BAG polyhedron: T1|I1|T2|I2|S1|S2|G. When DIRECTION is set to
1, compute the direct dependence from PDR1 to PDR2, and when 1, compute the direct dependence from PDR1 to PDR2, and when
DIRECTION is -1, compute the reversed dependence relation, from DIRECTION is -1, compute the reversed dependence relation, from
PDR2 to PDR1. */ PDR2 to PDR1. */
static void static ppl_Pointset_Powerset_C_Polyhedron_t
build_lexicographical_constraint (ppl_Pointset_Powerset_C_Polyhedron_t *res, build_lexicographical_constraint (ppl_Pointset_Powerset_C_Polyhedron_t bag,
graphite_dim_t dim, graphite_dim_t dim,
graphite_dim_t tdim, graphite_dim_t tdim,
graphite_dim_t offset, graphite_dim_t offset,
int direction) int direction)
{ {
graphite_dim_t i; graphite_dim_t i;
ppl_Pointset_Powerset_C_Polyhedron_t res, lex;
for (i = 0; i < tdim - 1; i+=2) ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (&res, dim, 1);
{
ppl_Pointset_Powerset_C_Polyhedron_t ineq;
bool empty_p;
/* Identify the static schedule dimensions. */ lex = build_pairwise_scheduling (dim, 0, offset, direction);
ineq = build_pairwise_scheduling (dim, i, offset, 0); ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (lex, bag);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (ineq, *res);
empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (ineq);
if (empty_p) if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (lex))
{ ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
/* Add the lexicographical dynamic schedule dimension. */
if (i > 0)
ineq = build_pairwise_scheduling (dim, i - 1, offset, direction);
return; ppl_delete_Pointset_Powerset_C_Polyhedron (lex);
}
for (i = 0; i < tdim - 1; i++)
{
ppl_Pointset_Powerset_C_Polyhedron_t sceq;
sceq = build_pairwise_scheduling (dim, i, offset, 0);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (bag, sceq);
ppl_delete_Pointset_Powerset_C_Polyhedron (sceq);
lex = build_pairwise_scheduling (dim, i + 1, offset, direction);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (lex, bag);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*res, ineq); if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (lex))
ppl_delete_Pointset_Powerset_C_Polyhedron (ineq); ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
/* Identify the dynamic schedule dimensions. */ ppl_delete_Pointset_Powerset_C_Polyhedron (lex);
ineq = build_pairwise_scheduling (dim, i + 1, offset, 0);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*res, ineq);
ppl_delete_Pointset_Powerset_C_Polyhedron (ineq);
} }
/* There is no dependence. */ return res;
ppl_delete_Pointset_Powerset_C_Polyhedron (*res);
ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (res, dim, 1);
} }
/* Build the dependence polyhedron for data references PDR1 and PDR2. /* Build the dependence polyhedron for data references PDR1 and PDR2.
...@@ -553,8 +551,13 @@ dependence_polyhedron_1 (poly_dr_p pdr1, poly_dr_p pdr2, ...@@ -553,8 +551,13 @@ dependence_polyhedron_1 (poly_dr_p pdr1, poly_dr_p pdr2,
ppl_delete_Pointset_Powerset_C_Polyhedron (dreq); ppl_delete_Pointset_Powerset_C_Polyhedron (dreq);
if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (res)) if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (res))
build_lexicographical_constraint (&res, dim, MIN (tdim1, tdim2), {
tdim1 + ddim1, direction); ppl_Pointset_Powerset_C_Polyhedron_t lex =
build_lexicographical_constraint (res, dim, MIN (tdim1, tdim2),
tdim1 + ddim1, direction);
ppl_delete_Pointset_Powerset_C_Polyhedron (res);
res = lex;
}
return res; return res;
} }
......
...@@ -32,11 +32,8 @@ main() ...@@ -32,11 +32,8 @@ main()
fprintf (stderr, "res = %d \n", res); fprintf (stderr, "res = %d \n", res);
#endif #endif
/* Avoid runtime check for this testcase, as it is miscompiled by
Graphite for the moment. */
return 0;
return res != 1999; return res != 1999;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -46,11 +46,8 @@ main (void) ...@@ -46,11 +46,8 @@ main (void)
fprintf (stderr, "res = %d \n", res); fprintf (stderr, "res = %d \n", res);
#endif #endif
/* Avoid runtime check for this testcase, as it is miscompiled by
Graphite for the moment. */
return 0;
return res != 998001; return res != 998001;
} }
/* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -44,11 +44,8 @@ main (void) ...@@ -44,11 +44,8 @@ main (void)
fprintf (stderr, "res = %d \n", res); fprintf (stderr, "res = %d \n", res);
#endif #endif
/* Avoid runtime check for this testcase, as it is miscompiled by
Graphite for the moment. */
return 0;
return res != 529340000; return res != 529340000;
} }
/* { dg-final { scan-tree-dump-times "SCoP will be loop blocked" 1 "graphite" } } */ /* { dg-final { scan-tree-dump-times "will be loop blocked" 1 "graphite" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -44,11 +44,8 @@ main (void) ...@@ -44,11 +44,8 @@ main (void)
fprintf (stderr, "res = %d \n", res); fprintf (stderr, "res = %d \n", res);
#endif #endif
/* Avoid runtime check for this testcase, as it is miscompiled by
Graphite for the moment. */
return 0;
return res != 2626800; return res != 2626800;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -49,12 +49,9 @@ main (void) ...@@ -49,12 +49,9 @@ main (void)
fprintf (stderr, "res = %d \n", res); fprintf (stderr, "res = %d \n", res);
#endif #endif
/* Avoid runtime check for this testcase, as it is miscompiled by
Graphite for the moment. */
return 0;
return res != 199900000; return res != 199900000;
} }
/* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } */ /* { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "graphite" } } */ /* { dg-final { cleanup-tree-dump "graphite" } } */
...@@ -41,5 +41,5 @@ ...@@ -41,5 +41,5 @@
! known to be 4 in the inner two loops. See interchange-2.f for the ! known to be 4 in the inner two loops. See interchange-2.f for the
! kernel from bwaves. ! kernel from bwaves.
! { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } ! { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } }
! { dg-final { cleanup-tree-dump "graphite" } } ! { dg-final { cleanup-tree-dump "graphite" } }
...@@ -24,5 +24,5 @@ Program FOO ...@@ -24,5 +24,5 @@ Program FOO
end Program FOO end Program FOO
! { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" } } ! { dg-final { scan-tree-dump-times "will be interchanged" 1 "graphite" { xfail *-*-* } } }
! { dg-final { cleanup-tree-dump "graphite" } } ! { dg-final { cleanup-tree-dump "graphite" } }
subroutine mul66(rt,rtt,r)
real*8 rt(6,6),r(6,6),rtt(6,6)
do i=1,6
do j=1,6
do ia=1,6
rtt(i,ia)=rt(i,j)*r(j,ia)+rtt(i,ia)
end do
end do
end do
end
program test
real*8 xj(6,6),w(6,6),w1(6,6)
parameter(idump=0)
integer i,j
do i=1,6
do j=1,6
xj(i,j) = 0.0d0
w1(i,j) = 0.0d0
w(i,j) = i * 10.0d0 + j;
end do
end do
xj(1,2) = 1.0d0
xj(2,1) = -1.0d0
xj(3,4) = 1.0d0
xj(4,3) = -1.0d0
xj(5,6) = 1.0d0
xj(6,5) = -1.0d0
call mul66(xj,w1,w)
if (idump.ne.0) then
write(6,*) 'w1 after call to mul66'
do i = 1,6
do j = 1,6
write(6,'(D15.7)') w1(i,j)
end do
end do
end if
if (w1(1,1).ne.21.0d0) then
call abort()
end if
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment