From 51c0074eed92e71feb016b7e1165bafc89b92839 Mon Sep 17 00:00:00 2001 From: Jan Sjodin Date: Sun, 10 Jun 2007 21:00:59 +0000 Subject: [PATCH] lambda-code.c (remove_iv): New. * lambda-code.c (remove_iv): New. (lambda_loopnest_to_gcc_loopnest): Use remove_iv. Co-Authored-By: Sebastian Pop From-SVN: r125605 --- gcc/ChangeLog | 6 ++++++ gcc/lambda-code.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aaeeaac4ca2..c16ab208d34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-10 Jan Sjodin + Sebastian Pop + + * lambda-code.c (remove_iv): New. + (lambda_loopnest_to_gcc_loopnest): Use remove_iv. + 2007-06-10 Zdenek Dvorak * tree-data-ref.c (dr_analyze_alias): Handle case smt is NULL. diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c index 501079f6cad..91d82f7913c 100644 --- a/gcc/lambda-code.c +++ b/gcc/lambda-code.c @@ -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); }