lambda-code.c (remove_iv): New.
authorJan Sjodin <jan.sjodin@amd.com>
Sun, 10 Jun 2007 21:00:59 +0000 (21:00 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Sun, 10 Jun 2007 21:00:59 +0000 (21:00 +0000)
* lambda-code.c (remove_iv): New.
(lambda_loopnest_to_gcc_loopnest): Use remove_iv.

Co-Authored-By: Sebastian Pop <sebpop@gmail.com>
From-SVN: r125605

gcc/ChangeLog
gcc/lambda-code.c

index aaeeaac..c16ab20 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-10  Jan Sjodin  <jan.sjodin@amd.com>
+           Sebastian Pop  <sebpop@gmail.com>
+
+       * lambda-code.c (remove_iv): New.
+       (lambda_loopnest_to_gcc_loopnest): Use remove_iv.
+
 2007-06-10  Zdenek Dvorak  <dvorakz@suse.cz>
 
        * tree-data-ref.c (dr_analyze_alias): Handle case smt is NULL.
index 501079f..91d82f7 100644 (file)
@@ -1616,6 +1616,45 @@ lle_to_gcc_expression (lambda_linear_expression lle,
   return force_gimple_operand (fold (expr), stmts_to_insert, true, resvar);
 }
 
+/* Remove the induction variable defined at IV_STMT.  */
+
+static void
+remove_iv (tree iv_stmt)
+{
+  if (TREE_CODE (iv_stmt) == PHI_NODE)
+    {
+      int i;
+
+      for (i = 0; i < PHI_NUM_ARGS (iv_stmt); i++)
+       {
+         tree stmt;
+         imm_use_iterator imm_iter;
+         tree arg = PHI_ARG_DEF (iv_stmt, i);
+         bool used = false;
+
+         if (TREE_CODE (arg) != SSA_NAME)
+           continue;
+
+         FOR_EACH_IMM_USE_STMT (stmt, imm_iter, arg)
+           if (stmt != iv_stmt)
+             used = true;
+
+         if (!used)
+           remove_iv (SSA_NAME_DEF_STMT (arg));
+       }
+
+      remove_phi_node (iv_stmt, NULL_TREE, true);
+    }
+  else
+    {
+      block_stmt_iterator bsi = bsi_for_stmt (iv_stmt);
+
+      bsi_remove (&bsi, true);
+      release_defs (iv_stmt); 
+    }
+}
+
+
 /* Transform a lambda loopnest NEW_LOOPNEST, which had TRANSFORM applied to
    it, back into gcc code.  This changes the
    loops, their induction variables, and their bodies, so that they
@@ -1797,6 +1836,9 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
            propagate_value (use_p, newiv);
          update_stmt (stmt);
        }
+
+      /* Remove the now unused induction variable.  */
+      remove_iv (oldiv_stmt);
     }
   VEC_free (tree, heap, new_ivs);
 }