Remove limit_scops
authorAditya Kumar <hiraditya@msn.com>
Tue, 8 Sep 2015 22:18:11 +0000 (22:18 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Tue, 8 Sep 2015 22:18:11 +0000 (22:18 +0000)
This patch removes graphite-scop-detection.c:limit_scops function and fix
related issues arising because of that. The functionality limit_scop was added
as an intermediate step to discard the loops which graphite could not
handle. Removing limit_scop required handling of different cases of loops and
surrounding code.  The scop is now larger so most test cases required 'number of
scops detected' to be fixed. By increasing the size of scop we can now optimize
loops which are 'siblings' of each other. This could enable loop fusion on a
number of loops. Since in the graphite framework we mostly want to opimize
loop-nests/adjacent-loops, we now discard scops with less than 2 loops. We
also discard scops without any data references.

Essentially:
 - Remove limite_scops.
 - Only select scops when there are at least two loops (loop nest or, side by side).
 - Discard loops without data-refs.
 - Fix test cases.

Passes bootstrap and reg-test.

gcc/ChangeLog:

2015-09-02  Aditya Kumar  <hiraditya@msn.com>
            Sebastian Pop  <s.pop@samsung.com>

        * graphite-isl-ast-to-gimple.c (gcc_expression_from_isl_ast_expr_id):
        Return the parameter if it was saved in corresponding
        parameter_rename_map of the region.
        (copy_def): Copy def from sese region to the newly created region.
        (copy_internal_parameters): Copy all the internal parameters defined
        within a region to the newly created region.
        (graphite_regenerate_ast_isl): Copy parameters to the new region before
        translating isl to gimple.
        * graphite-scop-detection.c (graphite_can_represent_loop): Bail out if
          the loop-nest does not have any data-references.
        (build_graphite_scops): Create a scop only when there is at least one
        loop inside it.
        (contains_only_close_phi_nodes): Deleted.
        (print_graphite_scop_statistics): Deleted
        (print_graphite_statistics): Deleted
        (limit_scops): Deleted.
        (build_scops): Removed call to limit_scops.
        * sese.c (new_sese): Construct.
        (free_sese): Destruct.
        (sese_add_exit_phis_edge): update_stmt after exit phi edge has been
        added.
        (set_rename): Pass sese region so that parameters inside the region can
        be added to its parameter_rename_map.
        (rename_uses): Pass sese region.
        (graphite_copy_stmts_from_block): Do not copy parameters that have been
        generated in the header of the scop. For each SSA_NAME in the
        parameter_rename_map rename its usage.
        (invariant_in_sese_p_rec): Return false if tree t is defined outside
        sese region.
        (scalar_evolution_in_region): If the tree t is invariant just return t.
        * sese.h: Added a parameter renamne map (parameter_rename_map_t) to
          struct sese to keep track of all the parameters which need renaming.
        * tree-data-ref.c (loop_nest_has_data_refs): Check if a loop nest has
          any data-refs.
        * tree-data-ref.h: Declaration of loop_nest_has_data_refs.

gcc/testsuite/ChangeLog:

2015-09-02  Aditya Kumar  <hiraditya@msn.com>
            Sebastian Pop  <s.pop@samsung.com>

        * gcc.dg/graphite/block-0.c: Modifed test case to match current output.
        * gcc.dg/graphite/block-1.c: Same.
        * gcc.dg/graphite/block-5.c: Same.
        * gcc.dg/graphite/block-6.c: Same.
        * gcc.dg/graphite/interchange-1.c: Same.
        * gcc.dg/graphite/interchange-10.c: Same.
        * gcc.dg/graphite/interchange-11.c: Same.
        * gcc.dg/graphite/interchange-13.c: Same.
        * gcc.dg/graphite/interchange-14.c: Same.
        * gcc.dg/graphite/interchange-3.c: Same.
        * gcc.dg/graphite/interchange-4.c: Same.
        * gcc.dg/graphite/interchange-7.c: Same.
        * gcc.dg/graphite/interchange-8.c: Same.
        * gcc.dg/graphite/interchange-9.c: Same.
        * gcc.dg/graphite/isl-codegen-loop-dumping.c: Same.
        * gcc.dg/graphite/pr35356-1.c (foo): Same.
        * gcc.dg/graphite/pr37485.c: Same.
        * gcc.dg/graphite/scop-0.c (int toto): Same.
        * gcc.dg/graphite/scop-1.c: Same.
        * gcc.dg/graphite/scop-10.c: Same.
        * gcc.dg/graphite/scop-11.c: Same.
        * gcc.dg/graphite/scop-12.c: Same.
        * gcc.dg/graphite/scop-13.c: Same.
        * gcc.dg/graphite/scop-16.c: Same.
        * gcc.dg/graphite/scop-17.c: Same.
        * gcc.dg/graphite/scop-18.c: Same.
        * gcc.dg/graphite/scop-2.c: Same.
        * gcc.dg/graphite/scop-21.c (int test): Same.
        * gcc.dg/graphite/scop-22.c (void foo): Same.
        * gcc.dg/graphite/scop-4.c: Same.
        * gcc.dg/graphite/scop-5.c: Same.
        * gcc.dg/graphite/scop-6.c: Same.
        * gcc.dg/graphite/scop-7.c: Same.
        * gcc.dg/graphite/scop-8.c: Same.
        * gcc.dg/graphite/scop-9.c: Same.
        * gcc.dg/graphite/scop-mvt.c (void mvt): Introduced dependency so that
          data-refs remain inside the inner loop.
        * gcc.dg/graphite/uns-block-1.c: Modifed test case to match o/p.
        * gcc.dg/graphite/uns-interchange-14.c: Same.
        * gcc.dg/graphite/uns-interchange-9.c: Same.
        * gfortran.dg/graphite/interchange-3.f90

libgomp/ChangeLog:

2015-09-04  Aditya Kumar  <hiraditya@msn.com>
            Sebastian Pop  <s.pop@samsung.com>

        * testsuite/libgomp.graphite/bounds.c (int foo): Modifed test case to
          match o/p.
        * testsuite/libgomp.graphite/force-parallel-1.c (void parloop): Same.
        * testsuite/libgomp.graphite/force-parallel-4.c: Same.
        * testsuite/libgomp.graphite/force-parallel-5.c: Same.
        * testsuite/libgomp.graphite/force-parallel-7.c: Same.
        * testsuite/libgomp.graphite/force-parallel-8.c: Same.

Co-Authored-By: Sebastian Pop <s.pop@samsung.com>
From-SVN: r227567

55 files changed:
gcc/ChangeLog
gcc/graphite-isl-ast-to-gimple.c
gcc/graphite-scop-detection.c
gcc/sese.c
gcc/sese.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/block-0.c
gcc/testsuite/gcc.dg/graphite/block-1.c
gcc/testsuite/gcc.dg/graphite/block-5.c
gcc/testsuite/gcc.dg/graphite/block-6.c
gcc/testsuite/gcc.dg/graphite/interchange-1.c
gcc/testsuite/gcc.dg/graphite/interchange-10.c
gcc/testsuite/gcc.dg/graphite/interchange-11.c
gcc/testsuite/gcc.dg/graphite/interchange-13.c
gcc/testsuite/gcc.dg/graphite/interchange-14.c
gcc/testsuite/gcc.dg/graphite/interchange-3.c
gcc/testsuite/gcc.dg/graphite/interchange-4.c
gcc/testsuite/gcc.dg/graphite/interchange-7.c
gcc/testsuite/gcc.dg/graphite/interchange-8.c
gcc/testsuite/gcc.dg/graphite/interchange-9.c
gcc/testsuite/gcc.dg/graphite/isl-codegen-loop-dumping.c
gcc/testsuite/gcc.dg/graphite/pr35356-1.c
gcc/testsuite/gcc.dg/graphite/pr37485.c
gcc/testsuite/gcc.dg/graphite/scop-0.c
gcc/testsuite/gcc.dg/graphite/scop-1.c
gcc/testsuite/gcc.dg/graphite/scop-10.c
gcc/testsuite/gcc.dg/graphite/scop-11.c
gcc/testsuite/gcc.dg/graphite/scop-12.c
gcc/testsuite/gcc.dg/graphite/scop-13.c
gcc/testsuite/gcc.dg/graphite/scop-16.c
gcc/testsuite/gcc.dg/graphite/scop-17.c
gcc/testsuite/gcc.dg/graphite/scop-18.c
gcc/testsuite/gcc.dg/graphite/scop-2.c
gcc/testsuite/gcc.dg/graphite/scop-21.c
gcc/testsuite/gcc.dg/graphite/scop-22.c
gcc/testsuite/gcc.dg/graphite/scop-4.c
gcc/testsuite/gcc.dg/graphite/scop-5.c
gcc/testsuite/gcc.dg/graphite/scop-6.c
gcc/testsuite/gcc.dg/graphite/scop-7.c
gcc/testsuite/gcc.dg/graphite/scop-8.c
gcc/testsuite/gcc.dg/graphite/scop-9.c
gcc/testsuite/gcc.dg/graphite/scop-mvt.c
gcc/testsuite/gcc.dg/graphite/uns-block-1.c
gcc/testsuite/gcc.dg/graphite/uns-interchange-14.c
gcc/testsuite/gcc.dg/graphite/uns-interchange-9.c
gcc/testsuite/gfortran.dg/graphite/interchange-3.f90
gcc/tree-data-ref.c
gcc/tree-data-ref.h
libgomp/ChangeLog
libgomp/testsuite/libgomp.graphite/bounds.c
libgomp/testsuite/libgomp.graphite/force-parallel-1.c
libgomp/testsuite/libgomp.graphite/force-parallel-4.c
libgomp/testsuite/libgomp.graphite/force-parallel-5.c
libgomp/testsuite/libgomp.graphite/force-parallel-7.c
libgomp/testsuite/libgomp.graphite/force-parallel-8.c

index d8dd36a6de1d51ccb6d76f20f2d07a6d0dbb8dee..dbd0bd6ad25db4006548f6209059d4d3cb2b53a0 100644 (file)
@@ -1,3 +1,42 @@
+2015-09-08  Aditya Kumar  <hiraditya@msn.com>
+            Sebastian Pop  <s.pop@samsung.com>
+
+       * graphite-isl-ast-to-gimple.c (gcc_expression_from_isl_ast_expr_id):
+       Return the parameter if it was saved in corresponding
+       parameter_rename_map of the region.
+       (copy_def): Copy def from sese region to the newly created region.
+       (copy_internal_parameters): Copy all the internal parameters defined
+       within a region to the newly created region.
+       (graphite_regenerate_ast_isl): Copy parameters to the new region before
+       translating isl to gimple.
+       * graphite-scop-detection.c (graphite_can_represent_loop): Bail out if
+       the loop-nest does not have any data-references.
+       (build_graphite_scops): Create a scop only when there is at least one
+       loop inside it.
+       (contains_only_close_phi_nodes): Deleted.
+       (print_graphite_scop_statistics): Deleted
+       (print_graphite_statistics): Deleted
+       (limit_scops): Deleted.
+       (build_scops): Removed call to limit_scops.
+       * sese.c (new_sese): Construct.
+       (free_sese): Destruct.
+       (sese_add_exit_phis_edge): update_stmt after exit phi edge has been
+       added.
+       (set_rename): Pass sese region so that parameters inside the region can
+       be added to its parameter_rename_map.
+       (rename_uses): Pass sese region.
+       (graphite_copy_stmts_from_block): Do not copy parameters that have been
+       generated in the header of the scop. For each SSA_NAME in the
+       parameter_rename_map rename its usage.
+       (invariant_in_sese_p_rec): Return false if tree t is defined outside
+       sese region.
+       (scalar_evolution_in_region): If the tree t is invariant just return t.
+       * sese.h: Added a parameter renamne map (parameter_rename_map_t) to
+       struct sese to keep track of all the parameters which need renaming.
+       * tree-data-ref.c (loop_nest_has_data_refs): Check if a loop nest has
+       any data-refs.
+       * tree-data-ref.h: Declaration of loop_nest_has_data_refs.
+
 2015-09-08  Tom de Vries  <tom@codesourcery.com>
 
        * Makefile.in (generated_files): Add params.list.
index 5434bfdeb6fb7247e78bbc4eb4882c0cccd54999..a8c99c3faad99e7ef46fbd3f2a10c2dc5e19750e 100644 (file)
@@ -57,7 +57,9 @@ extern "C" {
 #include "tree-ssa-loop-manip.h"
 #include "tree-scalar-evolution.h"
 #include "gimple-ssa.h"
+#include "tree-phinodes.h"
 #include "tree-into-ssa.h"
+#include "ssa-iterators.h"
 #include <map>
 #include "graphite-isl-ast-to-gimple.h"
 
@@ -286,7 +288,12 @@ gcc_expression_from_isl_ast_expr_id (tree type,
   gcc_assert (res != ip.end () &&
              "Could not map isl_id to tree expression");
   isl_ast_expr_free (expr_id);
-  return fold_convert (type, res->second);
+  tree t = res->second;
+  tree *val = region->parameter_rename_map->get(t);
+
+  if (!val)
+   val = &t;
+  return fold_convert (type, *val);
 }
 
 /* Converts an isl_ast_expr_int expression E to a GCC expression tree of
@@ -1063,6 +1070,69 @@ scop_to_isl_ast (scop_p scop, ivs_params &ip)
   return ast_isl;
 }
 
+/* Copy def from sese REGION to the newly created TO_REGION. TR is defined by
+   DEF_STMT. GSI points to entry basic block of the TO_REGION.  */
+
+static void
+copy_def(tree tr, gimple def_stmt, sese region, sese to_region, gimple_stmt_iterator *gsi)
+{
+  if (!defined_in_sese_p (tr, region))
+    return;
+  ssa_op_iter iter;
+  use_operand_p use_p;
+
+  FOR_EACH_SSA_USE_OPERAND (use_p, def_stmt, iter, SSA_OP_USE)
+    {
+      tree use_tr = USE_FROM_PTR (use_p);
+
+      /* Do not copy parameters that have been generated in the header of the
+        scop.  */
+      if (region->parameter_rename_map->get(use_tr))
+       continue;
+
+      gimple def_of_use = SSA_NAME_DEF_STMT (use_tr);
+      if (!def_of_use)
+       continue;
+
+      copy_def (use_tr, def_of_use, region, to_region, gsi);
+    }
+
+  gimple copy = gimple_copy (def_stmt);
+  gsi_insert_after (gsi, copy, GSI_NEW_STMT);
+
+  /* Create new names for all the definitions created by COPY and
+     add replacement mappings for each new name.  */
+  def_operand_p def_p;
+  ssa_op_iter op_iter;
+  FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
+    {
+      tree old_name = DEF_FROM_PTR (def_p);
+      tree new_name = create_new_def_for (old_name, copy, def_p);
+      region->parameter_rename_map->put(old_name, new_name);
+    }
+
+  update_stmt (copy);
+}
+
+static void
+copy_internal_parameters(sese region, sese to_region)
+{
+  /* For all the parameters which definitino is in the if_region->false_region,
+     insert code on true_region (if_region->true_region->entry). */
+
+  int i;
+  tree tr;
+  gimple_stmt_iterator gsi = gsi_start_bb(to_region->entry->dest);
+
+  FOR_EACH_VEC_ELT (region->params, i, tr)
+    {
+      // If def is not in region.
+      gimple def_stmt = SSA_NAME_DEF_STMT (tr);
+      if (def_stmt)
+       copy_def (tr, def_stmt, region, to_region, &gsi);
+    }
+}
+
 /* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
    the given SCOP.  Return true if code generation succeeded.
 
@@ -1102,10 +1172,13 @@ graphite_regenerate_ast_isl (scop_p scop)
 
   context_loop = SESE_ENTRY (region)->src->loop_father;
 
-  translate_isl_ast_to_gimple t (region);
+  /* Copy all the parameters which are defined in the region.  */
+  copy_internal_parameters(if_region->false_region, if_region->true_region);
 
-  t.translate_isl_ast (context_loop, root_node, if_region->true_region->entry,
-                    ip);
+  translate_isl_ast_to_gimple t(region);
+  edge e = single_succ_edge (if_region->true_region->entry->dest);
+  split_edge (e);
+  t.translate_isl_ast (context_loop, root_node, e, ip);
 
   mark_virtual_operands_for_renaming (cfun);
   update_ssa (TODO_update_ssa);
index dbd98428265cbd5240a04d403b252453e859142f..3ac56dedd04f4bf4b98b7c0273d6c7907069de66 100644 (file)
@@ -472,6 +472,17 @@ graphite_can_represent_loop (basic_block scop_entry, loop_p loop)
   tree niter;
   struct tree_niter_desc niter_desc;
 
+  if (!loop_nest_has_data_refs (loop))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       {
+         fprintf (dump_file, "[scop-detection-fail] ");
+         fprintf (dump_file, "Loop %d does not have any data reference.\n",
+                  loop->num);
+       }
+      return false;
+    }
+
   /* FIXME: For the moment, graphite cannot be used on loops that
      iterate using induction variables that wrap.  */
 
@@ -1155,8 +1166,17 @@ build_graphite_scops (vec<sd_region> regions,
       if (!exit)
        continue;
 
-      scop = new_scop (new_sese (entry, exit));
-      scops->safe_push (scop);
+      sese sese_reg = new_sese (entry, exit);
+      scop = new_scop (sese_reg);
+
+      build_sese_loop_nests (sese_reg);
+
+      /* Scops with one or no loops are not interesting.  */
+      if (SESE_LOOP_NEST (sese_reg).length () > 1)
+       scops->safe_push (scop);
+      else if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, "Discarded scop: %d loops\n",
+                SESE_LOOP_NEST (sese_reg).length ());
 
       /* Are there overlapping SCoPs?  */
 #ifdef ENABLE_CHECKING
@@ -1172,151 +1192,6 @@ build_graphite_scops (vec<sd_region> regions,
     }
 }
 
-/* Returns true when BB contains only close phi nodes.  */
-
-static bool
-contains_only_close_phi_nodes (basic_block bb)
-{
-  gimple_stmt_iterator gsi;
-
-  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-    if (gimple_code (gsi_stmt (gsi)) != GIMPLE_LABEL)
-      return false;
-
-  return true;
-}
-
-/* Print statistics for SCOP to FILE.  */
-
-static void
-print_graphite_scop_statistics (FILE* file, scop_p scop)
-{
-  long n_bbs = 0;
-  long n_loops = 0;
-  long n_stmts = 0;
-  long n_conditions = 0;
-  long n_p_bbs = 0;
-  long n_p_loops = 0;
-  long n_p_stmts = 0;
-  long n_p_conditions = 0;
-
-  basic_block bb;
-
-  FOR_ALL_BB_FN (bb, cfun)
-    {
-      gimple_stmt_iterator psi;
-      loop_p loop = bb->loop_father;
-
-      if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
-       continue;
-
-      n_bbs++;
-      n_p_bbs += bb->count;
-
-      if (EDGE_COUNT (bb->succs) > 1)
-       {
-         n_conditions++;
-         n_p_conditions += bb->count;
-       }
-
-      for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
-       {
-         n_stmts++;
-         n_p_stmts += bb->count;
-       }
-
-      if (loop->header == bb && loop_in_sese_p (loop, SCOP_REGION (scop)))
-       {
-         n_loops++;
-         n_p_loops += bb->count;
-       }
-
-    }
-
-  fprintf (file, "\nBefore limit_scops SCoP statistics (");
-  fprintf (file, "BBS:%ld, ", n_bbs);
-  fprintf (file, "LOOPS:%ld, ", n_loops);
-  fprintf (file, "CONDITIONS:%ld, ", n_conditions);
-  fprintf (file, "STMTS:%ld)\n", n_stmts);
-  fprintf (file, "\nBefore limit_scops SCoP profiling statistics (");
-  fprintf (file, "BBS:%ld, ", n_p_bbs);
-  fprintf (file, "LOOPS:%ld, ", n_p_loops);
-  fprintf (file, "CONDITIONS:%ld, ", n_p_conditions);
-  fprintf (file, "STMTS:%ld)\n", n_p_stmts);
-}
-
-/* Print statistics for SCOPS to FILE.  */
-
-static void
-print_graphite_statistics (FILE* file, vec<scop_p> scops)
-{
-  int i;
-  scop_p scop;
-
-  FOR_EACH_VEC_ELT (scops, i, scop)
-    print_graphite_scop_statistics (file, scop);
-}
-
-/* We limit all SCoPs to SCoPs, that are completely surrounded by a loop.
-
-   Example:
-
-   for (i      |
-     {         |
-       for (j  |  SCoP 1
-       for (k  |
-     }         |
-
-   * SCoP frontier, as this line is not surrounded by any loop. *
-
-   for (l      |  SCoP 2
-
-   This is necessary as scalar evolution and parameter detection need a
-   outermost loop to initialize parameters correctly.
-
-   TODO: FIX scalar evolution and parameter detection to allow more flexible
-         SCoP frontiers.  */
-
-static void
-limit_scops (vec<scop_p> *scops)
-{
-  auto_vec<sd_region, 3> regions;
-
-  int i;
-  scop_p scop;
-
-  FOR_EACH_VEC_ELT (*scops, i, scop)
-    {
-      int j;
-      loop_p loop;
-      sese region = SCOP_REGION (scop);
-      build_sese_loop_nests (region);
-
-      FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), j, loop)
-        if (!loop_in_sese_p (loop_outer (loop), region)
-           && single_exit (loop))
-          {
-           sd_region open_scop;
-           open_scop.entry = loop->header;
-           open_scop.exit = single_exit (loop)->dest;
-
-           /* This is a hack on top of the limit_scops hack.  The
-              limit_scops hack should disappear all together.  */
-           if (single_succ_p (open_scop.exit)
-               && contains_only_close_phi_nodes (open_scop.exit))
-             open_scop.exit = single_succ_edge (open_scop.exit)->dest;
-
-           regions.safe_push (open_scop);
-         }
-    }
-
-  free_scops (*scops);
-  scops->create (3);
-
-  create_sese_edges (regions);
-  build_graphite_scops (regions, scops);
-}
-
 /* Returns true when P1 and P2 are close phis with the same
    argument.  */
 
@@ -1501,10 +1376,6 @@ build_scops (vec<scop_p> *scops)
   create_sese_edges (regions);
   build_graphite_scops (regions, scops);
 
-  if (dump_file && (dump_flags & TDF_DETAILS))
-    print_graphite_statistics (dump_file, *scops);
-
-  limit_scops (scops);
   regions.release ();
 
   if (dump_file && (dump_flags & TDF_DETAILS))
index 2dedd9516b679cc559b7609133b831809726f506..3b716f54e1a9a2e0f63f4475ee7027f16f26b2c3 100644 (file)
@@ -267,6 +267,7 @@ new_sese (edge entry, edge exit)
   SESE_LOOP_NEST (region).create (3);
   SESE_ADD_PARAMS (region) = true;
   SESE_PARAMS (region).create (3);
+  region->parameter_rename_map = new parameter_rename_map_t;
 
   return region;
 }
@@ -281,6 +282,8 @@ free_sese (sese region)
 
   SESE_PARAMS (region).release ();
   SESE_LOOP_NEST (region).release ();
+  delete region->parameter_rename_map;
+  region->parameter_rename_map = NULL;
 
   XDELETE (region);
 }
@@ -294,6 +297,7 @@ sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
   create_new_def_for (use, phi, gimple_phi_result_ptr (phi));
   add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
   add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
+  update_stmt (phi);
 }
 
 /* Insert in the block BB phi nodes for variables defined in REGION
@@ -373,12 +377,19 @@ get_rename (rename_map_type *rename_map, tree old_name)
 /* Register in RENAME_MAP the rename tuple (OLD_NAME, EXPR).  */
 
 static void
-set_rename (rename_map_type *rename_map, tree old_name, tree expr)
+set_rename (rename_map_type *rename_map, tree old_name, tree expr, sese region)
 {
   if (old_name == expr)
     return;
 
   rename_map->put (old_name, expr);
+
+  tree t;
+  int i;
+  /* For a parameter of a scop we dont want to rename it.  */
+  FOR_EACH_VEC_ELT (SESE_PARAMS (region), i, t)
+    if (old_name == t)
+      region->parameter_rename_map->put(old_name, expr);
 }
 
 /* Renames the scalar uses of the statement COPY, using the
@@ -484,7 +495,7 @@ rename_uses (gimple copy, rename_map_type *rename_map,
            recompute_tree_invariant_for_addr_expr (rhs);
        }
 
-      set_rename (rename_map, old_name, new_expr);
+      set_rename (rename_map, old_name, new_expr, region);
     }
 
   return changed;
@@ -525,6 +536,14 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
          && scev_analyzable_p (lhs, region))
        continue;
 
+      /* Do not copy parameters that have been generated in the header of the
+        scop.  */
+      if (is_gimple_assign (stmt)
+         && (lhs = gimple_assign_lhs (stmt))
+         && TREE_CODE (lhs) == SSA_NAME
+         && region->parameter_rename_map->get(lhs))
+       continue;
+
       /* Create a new copy of STMT and duplicate STMT's virtual
         operands.  */
       copy = gimple_copy (stmt);
@@ -539,7 +558,7 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
        {
          tree old_name = DEF_FROM_PTR (def_p);
          tree new_name = create_new_def_for (old_name, copy, def_p);
-         set_rename (rename_map, old_name, new_name);
+         set_rename (rename_map, old_name, new_name, region);
        }
 
       if (rename_uses (copy, rename_map, &gsi_tgt, region, loop, iv_map,
@@ -549,6 +568,25 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
          fold_stmt_inplace (&gsi_tgt);
        }
 
+      /* For each SSA_NAME in the parameter_rename_map rename their usage.  */
+      ssa_op_iter iter;
+      use_operand_p use_p;
+      if (!is_gimple_debug (copy))
+       FOR_EACH_SSA_USE_OPERAND (use_p, copy, iter, SSA_OP_USE)
+         {
+           tree old_name = USE_FROM_PTR (use_p);
+
+           if (TREE_CODE (old_name) != SSA_NAME
+               || SSA_NAME_IS_DEFAULT_DEF (old_name))
+             continue;
+
+           tree *new_expr = region->parameter_rename_map->get (old_name);
+           if (!new_expr)
+             continue;
+
+           replace_exp (use_p, *new_expr);
+         }
+
       update_stmt (copy);
     }
 }
@@ -722,6 +760,35 @@ set_ifsese_condition (ifsese if_region, tree condition)
   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
 }
 
+/* Return false if T is completely defined outside REGION.  */
+
+static bool
+invariant_in_sese_p_rec (tree t, sese region)
+{
+  ssa_op_iter iter;
+  use_operand_p use_p;
+  if (!defined_in_sese_p (t, region))
+    return true;
+
+  gimple stmt = SSA_NAME_DEF_STMT (t);
+
+  if (gimple_code (stmt) == GIMPLE_PHI
+      || gimple_code (stmt) == GIMPLE_CALL)
+    return false;
+
+  FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
+    {
+      tree use = USE_FROM_PTR (use_p);
+      if (!defined_in_sese_p (use, region))
+       continue;
+
+      if (!invariant_in_sese_p_rec (use, region))
+       return false;
+    }
+
+  return true;
+}
+
 /* Returns the scalar evolution of T in REGION.  Every variable that
    is not defined in the REGION is considered a parameter.  */
 
@@ -752,6 +819,9 @@ scalar_evolution_in_region (sese region, loop_p loop, tree t)
       t = compute_overall_effect_of_inner_loop (def_loop, t);
       return t;
     }
-  else
-    return instantiate_scev (before, loop, t);
+
+  if (invariant_in_sese_p_rec (t, region))
+    return t;
+
+  return instantiate_scev (before, loop, t);
 }
index 52aa8688cbffaef17ad7a085d43c47e050264caf..b025a4dd821c16c47cca43a7c6aa1530fa7210e7 100644 (file)
@@ -22,6 +22,8 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_SESE_H
 #define GCC_SESE_H
 
+typedef hash_map<tree, tree> parameter_rename_map_t;
+
 /* A Single Entry, Single Exit region is a part of the CFG delimited
    by two edges.  */
 typedef struct sese_s
@@ -32,6 +34,9 @@ typedef struct sese_s
   /* Parameters used within the SCOP.  */
   vec<tree> params;
 
+  /* Parameters to be renamed.  */
+  parameter_rename_map_t *parameter_rename_map;
+
   /* Loops completely contained in the SCOP.  */
   bitmap loops;
   vec<loop_p> loop_nest;
index 74652c315fb4dcb90b00cdadf87a939c461f539d..7ba0c06ea440c636b8a042914c04dacc0bdb0a44 100644 (file)
@@ -1,3 +1,48 @@
+2015-09-08  Aditya Kumar  <hiraditya@msn.com>
+            Sebastian Pop  <s.pop@samsung.com>
+
+       * gcc.dg/graphite/block-0.c: Modifed test case to match current output.
+       * gcc.dg/graphite/block-1.c: Same.
+       * gcc.dg/graphite/block-5.c: Same.
+       * gcc.dg/graphite/block-6.c: Same.
+       * gcc.dg/graphite/interchange-1.c: Same.
+       * gcc.dg/graphite/interchange-10.c: Same.
+       * gcc.dg/graphite/interchange-11.c: Same.
+       * gcc.dg/graphite/interchange-13.c: Same.
+       * gcc.dg/graphite/interchange-14.c: Same.
+       * gcc.dg/graphite/interchange-3.c: Same.
+       * gcc.dg/graphite/interchange-4.c: Same.
+       * gcc.dg/graphite/interchange-7.c: Same.
+       * gcc.dg/graphite/interchange-8.c: Same.
+       * gcc.dg/graphite/interchange-9.c: Same.
+       * gcc.dg/graphite/isl-codegen-loop-dumping.c: Same.
+       * gcc.dg/graphite/pr35356-1.c (foo): Same.
+       * gcc.dg/graphite/pr37485.c: Same.
+       * gcc.dg/graphite/scop-0.c (int toto): Same.
+       * gcc.dg/graphite/scop-1.c: Same.
+       * gcc.dg/graphite/scop-10.c: Same.
+       * gcc.dg/graphite/scop-11.c: Same.
+       * gcc.dg/graphite/scop-12.c: Same.
+       * gcc.dg/graphite/scop-13.c: Same.
+       * gcc.dg/graphite/scop-16.c: Same.
+       * gcc.dg/graphite/scop-17.c: Same.
+       * gcc.dg/graphite/scop-18.c: Same.
+       * gcc.dg/graphite/scop-2.c: Same.
+       * gcc.dg/graphite/scop-21.c (int test): Same.
+       * gcc.dg/graphite/scop-22.c (void foo): Same.
+       * gcc.dg/graphite/scop-4.c: Same.
+       * gcc.dg/graphite/scop-5.c: Same.
+       * gcc.dg/graphite/scop-6.c: Same.
+       * gcc.dg/graphite/scop-7.c: Same.
+       * gcc.dg/graphite/scop-8.c: Same.
+       * gcc.dg/graphite/scop-9.c: Same.
+       * gcc.dg/graphite/scop-mvt.c (void mvt): Introduced dependency so that
+       data-refs remain inside the inner loop.
+       * gcc.dg/graphite/uns-block-1.c: Modifed test case to match o/p.
+       * gcc.dg/graphite/uns-interchange-14.c: Same.
+       * gcc.dg/graphite/uns-interchange-9.c: Same.
+       * gfortran.dg/graphite/interchange-3.f90
+
 2015-09-08  Alan Lawrence  <alan.lawrence@arm.com>
 
        PR target/63870
index cb08a5fe56f2519224992f4d41e83475b8f40df9..24b3bd060a992d62b7e98235695c4ffa8c06f322 100644 (file)
@@ -42,4 +42,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "not tiled" 3 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "not tiled" 2 "graphite" } } */
index 19f9f20c3bc0be9f120a37b7236db56ce1905c4b..bb81a95d4212947b36e25aab0de213c284916423 100644 (file)
@@ -45,4 +45,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */
index d30abf80fda41a9917a4ff9c515e4dcc5355d78f..2f4b2f503b0bd674f0faab95a703117cb410fd1f 100644 (file)
@@ -53,4 +53,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
index 9f03448b957e14a14ab59c9fe31db1af451e3f89..36e9783d1510322b14c1717308c731c46674cc6f 100644 (file)
@@ -48,4 +48,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
index b9f12c7d20d635cf65102c4828851aa5cf896dbc..2c58ac21e982fc9190b4e4ae2cc7659185d34677 100644 (file)
@@ -49,4 +49,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index 29e11c722577e9572ebf94b925dbd94579d81177..9d486448d08004517dae464c02cf6f920db120fd 100644 (file)
@@ -46,4 +46,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */
index afd71230a63ab592693c3782c80c2aebda40938e..4f6918dc691c34687ad292196b35f48ee7b25af7 100644 (file)
@@ -46,4 +46,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index 0e722e2632eb6b347c0f04a2c5d780170b898cc9..c9ea048e482d8878f80d21dade14e0699c69a600 100644 (file)
@@ -50,4 +50,4 @@ main (void)
 }
 
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index 55c600247c0f7be9499c72a4d6df5ff0c03428e7..151bfe71f1f0334122b5b510f5f7080996edea12 100644 (file)
@@ -54,4 +54,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 7 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */
index cdc02020197f2d8d2e5d6421f50eddf6a160a169..ebdeef7ea8ea006fa194953c9df224ab5912b4da 100644 (file)
@@ -47,4 +47,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index 6712565828642a0d10aac7604329f0989c14fd3d..9a50e7a0833ee285f59db335818f10d3e4929dfb 100644 (file)
@@ -46,4 +46,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index d99a16a291ab09894517299578a16acf26063712..e53d30e8cfe12be749c5c0e9f20ac1ba14aa494b 100644 (file)
@@ -46,4 +46,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index 123106bb4759edf98a5632045d7e191917b896fb..c5e714175a0556939778b784489d5e9c8241cd07 100644 (file)
@@ -82,4 +82,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */
index e4c54ae181d2ac054e13ce1acd32a1b297a60701..44a5452213e0a39e04a07c6015d13dd8e61b3d80 100644 (file)
@@ -44,4 +44,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
index cb5d802db8e4f18ba027fc7eb14f4bfb0ed5a0e8..70ac24c46d73b3a171170006b8bacea53ed61883 100644 (file)
@@ -12,4 +12,6 @@ main (int n, int *a)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "ISL AST generated by ISL: \nfor \\(int c1 = 0; c1 < n - 1; c1 \\+= 1\\)\n  for \\(int c3 = 0; c3 < n; c3 \\+= 1\\)\n    S_4\\(c1, c3\\);" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "ISL AST generated by ISL: \n\\{\n  S_2\\();\n  if \\(P_19 >= 1\\)\n
+    for \\(int c1 = 0; c1 < n - 1; c1 \\+= 1\\) \\{ \n      for \\(int c3 = 0; c3 < n; c3 \\+= 1\\)\n
+        S_4\\(c1, c3\\); \n      S_6\\(c1\\);\n    \\}    \n\\}" 1 "graphite"} } */
index 10aa49337b7e71f53d36688a863644958e965921..7f0e8246e0301a67732f23a4f1fb2c5939904ed5 100644 (file)
@@ -7,6 +7,10 @@ foo (int bar, int n, int k)
 {
   int i;
 
+  for (i = 0; i < n; i++)
+    if (i == k)
+      a[i] = bar;
+
   for (i = 0; i < n; i++)
     if (i == k)
       a[i] = bar;
index 0a6dfbceefc94dc1224c9449c30f4b965f7abd05..47138d303afffbb5422b586c8cfec0b9b8d6bb29 100644 (file)
@@ -31,4 +31,4 @@ void fallbackSort ( UInt32* fmap,
    AssertH ( j < 256, 1005 );
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 1 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
index 9cfd5dd14dc7d38f2b8bc44407d237579b730c92..abeabce98a8f07a650a8a8b4569c3423de1d8242 100644 (file)
@@ -9,7 +9,7 @@ int toto()
   int b[100];
   int N = foo ();
 
-  for (i = 0; i < 2*N+ 100; i++)
+  for (i = 0; i < N+ 100; i++)
     for (j = 0; j < 200; j++)
       a[j][i] = a[j+1][10] + 2;
 
index 16070d425b8ecfcead0344c45eb8a05f4488c377..a569065d0956dd8b4c552bdcc2f72f352f77e908 100644 (file)
@@ -27,4 +27,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index f14aabce4c3d7d26995a04b1bae5154c15869aaa..39ed5d7ea7b19c4ce9b2124b0f4271da25cc4aea 100644 (file)
@@ -12,8 +12,6 @@ int toto()
         b[i+j] = b[i+j-1] + 2;
 
       if (i * 2 == i + 8)
-        bar ();
-      else 
         {
          for (j = 1; j < 100; j++)
            b[i+j] = b[i+j-1] + 2;
@@ -27,4 +25,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 4a7286993c505aa8583a999ab9a931afb673f26b..97fe5393b37254132813a25094e90da5ac46be1e 100644 (file)
@@ -10,7 +10,6 @@ int toto()
       for (j = 0; j <= 20; j++)
         a[j] = b + i;
       b = 3;
-      bar();
     }
   else 
     {
@@ -28,4 +27,4 @@ int toto()
   return a[b];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 221d987bfbac693e140ea15eb51fcb6b1f4e864d..68e120504889f35406fb4385bcf129f5766f0fc2 100644 (file)
@@ -32,4 +32,4 @@ int toto()
   return a[b];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 5" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite"} } */
index 195b756938940b7a062fefbf2d446dfc93244100..53a17196d3ed0ed4ebbd49462c474233c6613227 100644 (file)
@@ -37,4 +37,4 @@ int toto()
   return a[b];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite"} } */
index cacd564e9e591794b64643561a4cc07eba668179..676817014b2a074e666b4de8399a5a873a92ef5e 100644 (file)
@@ -21,4 +21,4 @@ int test ()
       foo (a[i][j]); 
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 2252766b7966fb9573383aa84bfb4f511d52610e..3c0d8804549eb03597846d07c00591029b7f1904 100644 (file)
@@ -20,4 +20,4 @@ int test ()
       foo (a[i][j]); 
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 6e1080bc701e3d22f4013896f1f38c3b3c5bb00e..3416304075d3b13d7b931192b518508f90df2174 100644 (file)
@@ -22,4 +22,4 @@ void test (void)
         A[i][j] = B[i][k] * C[k][j];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index a16717c600aafcb48d2a5283d7a06576ca752c34..fb1a4e7b692b139d243ad31e99d5c9e5d8b7f7a9 100644 (file)
@@ -35,4 +35,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 4" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
index 48a6d2ff5a8cb43a7b6c60861fef734fd4a0df92..bd3f811d9d11d58a341993b5eab15eb1f103afb6 100644 (file)
@@ -5,6 +5,9 @@ int test ()
   int a[N+6];
   int i;
 
+  for (i = 0; i < N; i++)
+    a[i] += 32;
+
   for (i = 0; i < N; i++)
     {
       a[i] = i + 12;
index c936428b7bbe158da3707861cdf6479c25e86530..6ff5ccd5b56956c651be2b3aafe5ee69582282d5 100644 (file)
@@ -6,6 +6,9 @@ void foo(int N, int *res)
   double a, b;
   double sum = 0.0;
 
+  for (i = 0; i < N; i++)
+    sum += u[i];
+
   for (i = 0; i < N; i++)
     {
       a = u[i];
index c6d719e2dd0f4fe1cf2afab1231364a74eb959c7..4fb0e5ea47183cc02f71a8ff26fb8a63a319ab84 100644 (file)
@@ -25,4 +25,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index fa1c64a0ca859f38a69db5b8e7857fca0ccc595c..8309257554cea439faffd21a3211e53cf084aba7 100644 (file)
@@ -9,6 +9,8 @@ int toto()
     {
       for (j = 0; j <= 20; j++)
         a[j] = b + i;
+      for (j = 2; j <= 23; j++)
+        a[j] = b + i;
       b = 3;
       bar();
     }
@@ -31,4 +33,4 @@ int toto()
   return a[b];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
index 2a45d6ee559ac94be43e4c16cf00b47156f7c9fa..1da486a2ddfbd041e0cf6cc5fed36a2bf8be5a5e 100644 (file)
@@ -17,7 +17,6 @@ int toto()
         {
         for (k = 1; k < 100; k++)
           b[i+k] = b[i+k-1] + 2;
-        bar ();
         }
       
       for (k = 1; k < 100; k++)
@@ -27,4 +26,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */ 
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 5866ca736f614147f2b844f0399c25ef33461ff0..3e337d0c6036058ea2c9525cf705afcedd09bc70 100644 (file)
@@ -13,7 +13,6 @@ int toto()
 
       if (i * 2 == i + 8)
        {
-         bar ();
          for (j = 1; j < 100; j++)
            b[i+j] = b[i+j-1] + 2;
        }
@@ -27,4 +26,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 3" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 9cdc69f670d6b365cb7f9094bb5c75ed1736dff4..71d5c531fb833d6e08db7bfd53bd1aecd76492e2 100644 (file)
@@ -14,8 +14,7 @@ int toto()
       if (i * 2 == i + 8)
        {
          for (j = 1; j < 100; j++)
-           if (bar ())
-             b[i+j] = b[i+j-1] + 2;
+           b[i+j] = b[i+j-1] + 2;
        }
       else 
        a[i][i] = 2;
@@ -27,4 +26,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index d879d9afda3bd6e9efe3ddac5b0733ea8782b808..93888728b0ddeceae78e65a036ee4f5b1912fbd0 100644 (file)
@@ -12,8 +12,6 @@ int toto()
         b[i+j] = b[i+j-1] + 2;
 
       if (i * 2 == i + 8)
-        bar ();
-      else 
        a[i][i] = 2;
 
       for (k = 1; k < 100; k++)
@@ -23,4 +21,4 @@ int toto()
   return a[3][5] + b[1];
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite"} } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
index 5d3d19f7413e9ef286c9f4d5bdc1bfaae892aa97..442a3a0bafa07189d40fd6a216bc5c8f1118d206 100644 (file)
@@ -8,16 +8,16 @@ void mvt(long N) {
 
     for (i=0; i<N; i++) {
         for (j=0; j<N; j++) {
-            x1[i] = x1[i] + a[i][j] * y_1[j];
+            x1[j] = x1[j] + a[i][j] * y_1[j];
         }
     }
     
     for (i=0; i<N; i++) {
         for (j=0; j<N; j++) {
-            x2[i] = x2[i] + a[j][i] * y_2[j];
+            x2[j] = x2[j] + a[j][i] * y_2[j];
         }
     }
 }
 
-/* { dg-final { scan-tree-dump-times "number of SCoPs: 2" 1 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite" } } */
 
index 12a62919b5fad554dfbcc8e2cbdba302800995db..64ca761c40c2477f4f18bcc62ded9f202665ca67 100644 (file)
@@ -45,4 +45,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 4 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */
index 7ef575b667d18d0ef9f3622f99c2502da74cc7f2..1679cc39997fc3f26caee00792cd37b254dab862 100644 (file)
@@ -55,4 +55,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 6 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } } */
index 31b132253c6c714db1cc0db446e4ae8187ee52db..601169ec39e8e5f77e6b6ea5a80756cd1a3f4687 100644 (file)
@@ -45,4 +45,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "tiled by" 3 "graphite" } } */
index a99cf153d9e3f396d01d414b9e31752ae15b0712..d401638ccc801ae8cacbca6467786499e19d828f 100644 (file)
@@ -24,4 +24,4 @@ Program FOO
 
 end Program FOO
 
-! { dg-final { scan-tree-dump-times "tiled by" 2 "graphite" } }
+! { dg-final { scan-tree-dump-times "tiled by" 5 "graphite" } }
index ebf9dd23f778062e3382a4cb60b7cf0f9c9a3d85..c0eab40b139e0a4ba345b89b37ebf2d454a62712 100644 (file)
@@ -3927,6 +3927,49 @@ get_references_in_stmt (gimple stmt, vec<data_ref_loc, va_heap> *references)
   return clobbers_memory;
 }
 
+
+/* Returns true if the loop-nest has any data reference.  */
+
+bool
+loop_nest_has_data_refs (loop_p loop)
+{
+  basic_block *bbs = get_loop_body (loop);
+  vec<data_ref_loc> references;
+  references.create (3);
+
+  for (unsigned i = 0; i < loop->num_nodes; i++)
+    {
+      basic_block bb = bbs[i];
+      gimple_stmt_iterator bsi;
+
+      for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
+       {
+         gimple stmt = gsi_stmt (bsi);
+         get_references_in_stmt (stmt, &references);
+         if (references.length ())
+           {
+             free (bbs);
+             references.release ();
+             return true;
+           }
+       }
+    }
+  free (bbs);
+  references.release ();
+
+  if (loop->inner)
+    {
+      loop = loop->inner;
+      while (loop)
+       {
+         if (loop_nest_has_data_refs (loop))
+           return true;
+         loop = loop->next;
+       }
+    }
+  return false;
+}
+
 /* Stores the data references in STMT to DATAREFS.  If there is an unanalyzable
    reference, returns false, otherwise returns true.  NEST is the outermost
    loop of the loop nest in which the references should be analyzed.  */
index 18bcc5c89bb8e436c5becc6a6cada77672991233..064843933f3da31f6e34228c661c8ddb15d52844 100644 (file)
@@ -322,6 +322,7 @@ extern bool find_data_references_in_stmt (struct loop *, gimple,
 extern bool graphite_find_data_references_in_stmt (loop_p, loop_p, gimple,
                                                   vec<data_reference_p> *);
 tree find_data_references_in_loop (struct loop *, vec<data_reference_p> *);
+bool loop_nest_has_data_refs (loop_p loop);
 struct data_reference *create_data_ref (loop_p, loop_p, tree, gimple, bool);
 extern bool find_loop_nest (struct loop *, vec<loop_p> *);
 extern struct data_dependence_relation *initialize_data_dependence_relation
index a6bd73677a34697ce58bf54f228397cd5113df69..29665c226e140574deeead2bc920fb6b841aaefa 100644 (file)
@@ -1,3 +1,14 @@
+2015-09-08  Aditya Kumar  <hiraditya@msn.com>
+            Sebastian Pop  <s.pop@samsung.com>
+
+       * testsuite/libgomp.graphite/bounds.c (int foo): Modifed test case to
+       match o/p.
+       * testsuite/libgomp.graphite/force-parallel-1.c (void parloop): Same.
+       * testsuite/libgomp.graphite/force-parallel-4.c: Same.
+       * testsuite/libgomp.graphite/force-parallel-5.c: Same.
+       * testsuite/libgomp.graphite/force-parallel-7.c: Same.
+       * testsuite/libgomp.graphite/force-parallel-8.c: Same.
+
 2015-09-03  Jakub Jelinek  <jakub@redhat.com>
 
        * configure.tgt: Add missing ;; in between nvptx and rtems
index 822eb6a6f952c1f54df63be50372291fc6117508..3d2fd7aaec889512526370fbc1739ebed03e2f3e 100644 (file)
@@ -3,6 +3,8 @@ int foo(int *a, int n)
   int i;
   for (i = 2; i < n; i++)
     a[i] += a[i+1];
+  for (i = 2; i < n; i++)
+    a[i] += a[i+1];
 }
 
 /* Check that Graphite dependency checking notes the dependency.  */
index 245e64c627172ad3e16f062b4286ed7880fab018..0393356f9f2a38e852d7a639a8664065cf575236 100644 (file)
@@ -6,6 +6,9 @@ void parloop (int N)
 {
   int i;
 
+  for (i = 0; i < N; i++)
+    x[i] = i + 1;
+
   for (i = 0; i < N; i++)
     x[i] = i + 3;
 
@@ -24,5 +27,5 @@ int main(void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
-/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "loopfn" 8 "optimized" } } */
index 513d58d7391f72dc06a21303536fd91e005bd999..b58883c377ae792a86e160e0fc994dadea9accb1 100644 (file)
@@ -47,7 +47,6 @@ int main(void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.0" 4 "optimized" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.1" 4 "optimized" } } */
index d599467725320e3f02fa713f00fd72af923012be..de31d6436f5d2959e61413fdb42c2f78eee92713 100644 (file)
@@ -31,6 +31,6 @@ int main(void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "2 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.0" 4 "optimized" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.1" 4 "optimized" } } */
index 5a54d474771525e28a793dc28df16e1d485be165..9d2b37cbd4beb935f4db35b33a1cac8ea9b5cc3c 100644 (file)
@@ -31,5 +31,5 @@ int main (void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "3 loops carried no dependency" 1 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "5 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.0" 4 "optimized" } } */
index dc60f2f32b409095c90fb351eabe79dff5c2da81..32ba5ab84efe4691c66f8bfe251efec561f1c023 100644 (file)
@@ -43,8 +43,6 @@ int main(void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
-/* { dg-final { scan-tree-dump-times "3 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "5 loops carried no dependency" 1 "graphite" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.0" 4 "optimized" } } */
 /* { dg-final { scan-tree-dump-times "loopfn.1" 4 "optimized" } } */