tree-optimization/93439 move clique bookkeeping to OMP expansion
authorRichard Biener <rguenther@suse.de>
Tue, 28 Jan 2020 13:09:12 +0000 (14:09 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 28 Jan 2020 13:10:16 +0000 (14:10 +0100)
Autopar was doing clique bookkeeping too early when creating destination
functions but then later introducing new cliques via versioning loops.
The following moves the bookkeeping to the actual outlining process.

2020-01-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/93439
* tree-parloops.c (create_loop_fn): Move clique bookkeeping...
* tree-cfg.c (move_sese_region_to_fn): ... here.
(verify_types_in_gimple_reference): Verify used cliques are
tracked.

* gfortran.dg/graphite/pr93439.f90: New testcase.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/graphite/pr93439.f90 [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-parloops.c

index 2a000e5f31fa7e062e72193cf674d5b6a695c982..ed3db3e003e5fd6302d3516ead51380ebc7ee5d3 100644 (file)
@@ -1,3 +1,11 @@
+2020-01-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/93439
+       * tree-parloops.c (create_loop_fn): Move clique bookkeeping...
+       * tree-cfg.c (move_sese_region_to_fn): ... here.
+       (verify_types_in_gimple_reference): Verify used cliques are
+       tracked.
+
 2020-01-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/91399
index c08bc22b5a00bd2960356754e5cbd80bb476d603..dfb7a0fb5b4e72a7b72b471237f59d76f9779a83 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/93439
+       * gfortran.dg/graphite/pr93439.f90: New testcase.
+
 2020-01-28  Sahahb Vahedi  <shahab@synopsys.com>
 
        * gcc.target/arc/code-density-flag.c: New test
diff --git a/gcc/testsuite/gfortran.dg/graphite/pr93439.f90 b/gcc/testsuite/gfortran.dg/graphite/pr93439.f90
new file mode 100644 (file)
index 0000000..e815ab9
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-additional-options "-O2 -floop-parallelize-all -floop-unroll-and-jam -ftree-parallelize-loops=2" }
+
+module ai
+  integer, parameter :: dp = 8
+contains
+  subroutine qu(ja, nq, en, p5)
+    real(kind = dp) :: nq(ja), en(ja), p5(ja)
+    call tl(ja, nq, en, p5)
+  end subroutine qu
+
+  subroutine tl(ja, nq, en, p5)
+    real(kind = dp) :: nq(9), en(9 * ja), p5(3 * ja)
+    do mc = 1, ja
+       do mb = 1, 9
+          do ma = 1, 3
+             p5((mc - 1) * 3 + ma) = p5((mc - 1) * 3 + ma) - 1
+          end do
+       end do
+    end do
+  end subroutine tl
+end module ai
index fd69b366bf4514927610371c2c50adade8d66644..f7b817d94e64dfcb943789db3f91ea96cb0b6574 100644 (file)
@@ -3226,6 +3226,13 @@ verify_types_in_gimple_reference (tree expr, bool require_lvalue)
          debug_generic_stmt (expr);
          return true;
        }
+      if (MR_DEPENDENCE_CLIQUE (expr) != 0
+         && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
+       {
+         error ("invalid clique in %qs", code_name);
+         debug_generic_stmt (expr);
+         return true;
+       }
     }
   else if (TREE_CODE (expr) == TARGET_MEM_REF)
     {
@@ -3245,6 +3252,13 @@ verify_types_in_gimple_reference (tree expr, bool require_lvalue)
          debug_generic_stmt (expr);
          return true;
        }
+      if (MR_DEPENDENCE_CLIQUE (expr) != 0
+         && MR_DEPENDENCE_CLIQUE (expr) > cfun->last_clique)
+       {
+         error ("invalid clique in %qs", code_name);
+         debug_generic_stmt (expr);
+         return true;
+       }
     }
   else if (TREE_CODE (expr) == INDIRECT_REF)
     {
@@ -7744,6 +7758,9 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
       after = bb;
     }
 
+  /* Adjust the maximum clique used.  */
+  dest_cfun->last_clique = saved_cfun->last_clique;
+
   loop->aux = NULL;
   loop0->aux = NULL;
   /* Loop sizes are no longer correct, fix them up.  */
index d315b797a66778e5d4b5e02d6086eb9a2c3d765d..d9250d36c72bdf42204b86277988debcdc7e2b8e 100644 (file)
@@ -2202,7 +2202,6 @@ create_loop_fn (location_t loc)
   DECL_ARGUMENTS (decl) = t;
 
   allocate_struct_function (decl, false);
-  DECL_STRUCT_FUNCTION (decl)->last_clique = act_cfun->last_clique;
 
   /* The call to allocate_struct_function clobbers CFUN, so we need to restore
      it.  */