re PR tree-optimization/42637 ([graphite] wrong code for -floop-interchange -ftree...
authorSebastian Pop <sebastian.pop@amd.com>
Sat, 6 Feb 2010 17:41:54 +0000 (17:41 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Sat, 6 Feb 2010 17:41:54 +0000 (17:41 +0000)
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

gcc/ChangeLog.graphite
gcc/graphite-dependences.c
gcc/testsuite/gcc.dg/graphite/block-0.c
gcc/testsuite/gcc.dg/graphite/block-4.c
gcc/testsuite/gcc.dg/graphite/block-7.c
gcc/testsuite/gcc.dg/graphite/interchange-12.c
gcc/testsuite/gcc.dg/graphite/interchange-mvt.c
gcc/testsuite/gfortran.dg/graphite/interchange-1.f
gcc/testsuite/gfortran.dg/graphite/interchange-3.f90
gcc/testsuite/gfortran.dg/graphite/run-id-1.f [new file with mode: 0644]

index 55a0b7a003a14700bd6b82590edaeda028805472..5a6a919d3458780c81666d8ba0e48cb955ad3ca4 100644 (file)
@@ -1,3 +1,20 @@
+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>
 
        * testsuite/gcc.dg/graphite/interchange-12.c: Return 0 to avoid
index a6a7e57596da5e6f43f59890467ee7927abd740c..4dc5854b3f92103d118582492f81df55b134c6fc 100644 (file)
@@ -412,58 +412,56 @@ build_pairwise_scheduling (graphite_dim_t dim,
   return res;
 }
 
-/* Add to a non empty polyhedron RES the precedence constraints for
-   the lexicographical comparison of time vectors in RES following the
-   lexicographical order.  DIM is the dimension of the polyhedron RES.
+/* Add to a non empty polyhedron BAG the precedence constraints for
+   the lexicographical comparison of time vectors in BAG following the
+   lexicographical order.  DIM is the dimension of the polyhedron BAG.
    TDIM is the number of loops common to the two statements that are
    compared lexicographically, i.e. the number of loops containing
    both statements.  OFFSET is the number of dimensions needed to
    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
    DIRECTION is -1, compute the reversed dependence relation, from
    PDR2 to PDR1.  */
 
-static void
-build_lexicographical_constraint (ppl_Pointset_Powerset_C_Polyhedron_t *res,
+static ppl_Pointset_Powerset_C_Polyhedron_t
+build_lexicographical_constraint (ppl_Pointset_Powerset_C_Polyhedron_t bag,
                                  graphite_dim_t dim,
                                  graphite_dim_t tdim,
                                  graphite_dim_t offset,
                                  int direction)
 {
   graphite_dim_t i;
+  ppl_Pointset_Powerset_C_Polyhedron_t res, lex;
 
-  for (i = 0; i < tdim - 1; i+=2)
-    {
-      ppl_Pointset_Powerset_C_Polyhedron_t ineq;
-      bool empty_p;
+  ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (&res, dim, 1);
 
-      /* Identify the static schedule dimensions.  */
-      ineq = build_pairwise_scheduling (dim, i, offset, 0);
-      ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (ineq, *res);
-      empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (ineq);
+  lex = build_pairwise_scheduling (dim, 0, offset, direction);
+  ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (lex, bag);
 
-      if (empty_p)
-       {
-         /* Add the lexicographical dynamic schedule dimension.  */
-         if (i > 0)
-           ineq = build_pairwise_scheduling (dim, i - 1, offset, direction);
+  if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (lex))
+    ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
 
-         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);
-      ppl_delete_Pointset_Powerset_C_Polyhedron (ineq);
+      if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (lex))
+       ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
 
-      /* Identify the dynamic schedule dimensions.  */
-      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);
+      ppl_delete_Pointset_Powerset_C_Polyhedron (lex);
     }
 
-  /* There is no dependence.  */
-  ppl_delete_Pointset_Powerset_C_Polyhedron (*res);
-  ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (res, dim, 1);
+  return res;
 }
 
 /* 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,
   ppl_delete_Pointset_Powerset_C_Polyhedron (dreq);
 
   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;
 }
index e9650174435cae1aa1a084c16dad3f8f266b1aef..320ee7913675bd6c31b176c17446dd158d0265c1 100644 (file)
@@ -32,11 +32,8 @@ main()
   fprintf (stderr, "res = %d \n", res);
 #endif
 
-  /* Avoid runtime check for this testcase, as it is miscompiled by
-     Graphite for the moment.  */
-  return 0;
   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" } } */
index e24def09a04a32724e89eba3ca8e1d24e331f300..50927573782ec2806818c6ff659748972dec1dd1 100644 (file)
@@ -46,11 +46,8 @@ main (void)
   fprintf (stderr, "res = %d \n", res);
 #endif
 
-  /* Avoid runtime check for this testcase, as it is miscompiled by
-     Graphite for the moment.  */
-  return 0;
   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" } } */
index 9f057ca9c6f8264e9979f745db4761ee8b03cd59..a07ef11738df1adcc1e76e3e58c70316c81f6a4f 100644 (file)
@@ -44,11 +44,8 @@ main (void)
   fprintf (stderr, "res = %d \n", res);
 #endif
 
-  /* Avoid runtime check for this testcase, as it is miscompiled by
-     Graphite for the moment.  */
-  return 0;
   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" } } */
index 0a6ed6085a2f28f2730c0eb8917d8f278d6d7767..c0e331bb68735dae9f025d5d7499268d514fcd4b 100644 (file)
@@ -44,11 +44,8 @@ main (void)
   fprintf (stderr, "res = %d \n", res);
 #endif
 
-  /* Avoid runtime check for this testcase, as it is miscompiled by
-     Graphite for the moment.  */
-  return 0;
   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" } } */
index 7caaeed3759ba71eccd8361d0f06b414500f91d0..a1310dd67257cc0c012f7180affd018d9475b57a 100644 (file)
@@ -49,12 +49,9 @@ main (void)
   fprintf (stderr, "res = %d \n", res);
 #endif
 
-  /* Avoid runtime check for this testcase, as it is miscompiled by
-     Graphite for the moment.  */
-  return 0;
   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" } } */
 
index fad61e28d4ea8f6fa308f50e00f3a184cca53e8b..334fbd8246a75802a9bf37e3f47c1b4a302d1d2d 100644 (file)
@@ -41,5 +41,5 @@
 ! known to be 4 in the inner two loops.  See interchange-2.f for the
 ! 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" } }
index 06da2b3aa5313e790a61f7af55950764bae9d697..04f4a13936121e7a290368d059c78e687eb2c55e 100644 (file)
@@ -24,5 +24,5 @@ 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" } }
diff --git a/gcc/testsuite/gfortran.dg/graphite/run-id-1.f b/gcc/testsuite/gfortran.dg/graphite/run-id-1.f
new file mode 100644 (file)
index 0000000..521d268
--- /dev/null
@@ -0,0 +1,47 @@
+      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