sese.c (get_vdef_before_sese): Handle GIMPLE_ASSIGN and GIMPLE_CALL.
authorSebastian Pop <sebastian.pop@amd.com>
Wed, 25 Nov 2009 05:19:05 +0000 (05:19 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Wed, 25 Nov 2009 05:19:05 +0000 (05:19 +0000)
2009-10-20  Sebastian Pop  <sebastian.pop@amd.com>

* sese.c (get_vdef_before_sese): Handle GIMPLE_ASSIGN and GIMPLE_CALL.

From-SVN: r154613

gcc/ChangeLog.graphite
gcc/sese.c

index 05bd2f1..fe4b203 100644 (file)
@@ -1,5 +1,9 @@
 2009-10-20  Sebastian Pop  <sebastian.pop@amd.com>
 
+       * sese.c (get_vdef_before_sese): Handle GIMPLE_ASSIGN and GIMPLE_CALL.
+
+2009-10-20  Sebastian Pop  <sebastian.pop@amd.com>
+
        * graphite-sese-to-poly.c (pdr_add_data_dimensions): Do not infer
        loop upper bounds for 1-element arrays at end of structures.
        * tree-flow.h (array_at_struct_end_p): Declared.
index 2c38b24..917adbd 100644 (file)
@@ -407,8 +407,8 @@ static tree
 get_vdef_before_sese (sese region, tree name, sbitmap visited)
 {
   unsigned i;
-  gimple def_stmt = SSA_NAME_DEF_STMT (name);
-  basic_block def_bb = gimple_bb (def_stmt);
+  gimple stmt = SSA_NAME_DEF_STMT (name);
+  basic_block def_bb = gimple_bb (stmt);
 
   if (!def_bb || !bb_in_sese_p (def_bb, region))
     return name;
@@ -418,18 +418,36 @@ get_vdef_before_sese (sese region, tree name, sbitmap visited)
 
   SET_BIT (visited, def_bb->index);
 
-  switch (gimple_code (def_stmt))
+  switch (gimple_code (stmt))
     {
     case GIMPLE_PHI:
-      for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
+      for (i = 0; i < gimple_phi_num_args (stmt); i++)
        {
-         tree arg = gimple_phi_arg_def (def_stmt, i);
-         tree res = get_vdef_before_sese (region, arg, visited);
+         tree arg = gimple_phi_arg_def (stmt, i);
+         tree res;
+
+         if (gimple_bb (SSA_NAME_DEF_STMT (arg))
+             && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
+           continue;
+
+         res = get_vdef_before_sese (region, arg, visited);
          if (res)
            return res;
        }
       return NULL_TREE;
 
+    case GIMPLE_ASSIGN:
+    case GIMPLE_CALL:
+      {
+       use_operand_p use_p = gimple_vuse_op (stmt);
+       tree use = USE_FROM_PTR (use_p);
+
+       if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
+         RESET_BIT (visited, def_bb->index);
+
+       return get_vdef_before_sese (region, use, visited);
+      }
+
     default:
       return NULL_TREE;
     }