summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-29 17:49:31 +0000
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-29 17:49:31 +0000
commit99e960944a00f104053a8ecb48ba08d0dae03632 (patch)
tree32f2056def3ebae854613358efddda354de54560 /gcc/tree-ssa-loop-im.c
parente7f5d6c3181a63892e6efaef2a9d248f7c862265 (diff)
downloadgcc-99e960944a00f104053a8ecb48ba08d0dae03632.tar.gz
* tree-ssa-loop-im.c (force_move_till_expr, force_move_till):
Take orig_loop argument and pass it to set_level. (schedule_sm): Pass the correct orig_loop to force_move_till. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@85308 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r--gcc/tree-ssa-loop-im.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index d8c70a9489f..589f42de65c 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -710,10 +710,10 @@ may_move_till (tree ref, tree *index, void *data)
}
/* Forces statements definining (invariant) SSA names in expression EXPR to be
- moved out of the LOOP. */
+ moved out of the LOOP. ORIG_LOOP is the loop in that EXPR is used. */
static void
-force_move_till_expr (tree expr, struct loop *loop)
+force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
{
char class = TREE_CODE_CLASS (TREE_CODE (expr));
unsigned i, nops;
@@ -724,7 +724,7 @@ force_move_till_expr (tree expr, struct loop *loop)
if (IS_EMPTY_STMT (stmt))
return;
- set_level (stmt, bb_for_stmt (stmt)->loop_father, loop);
+ set_level (stmt, orig_loop, loop);
return;
}
@@ -736,24 +736,32 @@ force_move_till_expr (tree expr, struct loop *loop)
nops = first_rtl_op (TREE_CODE (expr));
for (i = 0; i < nops; i++)
- force_move_till_expr (TREE_OPERAND (expr, i), loop);
+ force_move_till_expr (TREE_OPERAND (expr, i), orig_loop, loop);
}
/* Forces statement defining invariants in REF (and *INDEX) to be moved out of
- the loop passed in DATA. Callback for for_each_index. */
+ the LOOP. The reference REF is used in the loop ORIG_LOOP. Callback for
+ for_each_index. */
+
+struct fmt_data
+{
+ struct loop *loop;
+ struct loop *orig_loop;
+};
static bool
force_move_till (tree ref, tree *index, void *data)
{
tree stmt;
+ struct fmt_data *fmt_data = data;
if (TREE_CODE (ref) == ARRAY_REF)
{
tree step = array_ref_element_size (ref);
tree lbound = array_ref_low_bound (ref);
- force_move_till_expr (step, data);
- force_move_till_expr (lbound, data);
+ force_move_till_expr (step, fmt_data->orig_loop, fmt_data->loop);
+ force_move_till_expr (lbound, fmt_data->orig_loop, fmt_data->loop);
}
if (TREE_CODE (*index) != SSA_NAME)
@@ -763,7 +771,7 @@ force_move_till (tree ref, tree *index, void *data)
if (IS_EMPTY_STMT (stmt))
return true;
- set_level (stmt, bb_for_stmt (stmt)->loop_father, data);
+ set_level (stmt, fmt_data->orig_loop, fmt_data->loop);
return true;
}
@@ -977,10 +985,13 @@ schedule_sm (struct loop *loop, edge *exits, unsigned n_exits, tree ref,
tree tmp_var;
unsigned i;
tree load, store;
+ struct fmt_data fmt_data;
tmp_var = make_rename_temp (TREE_TYPE (ref), "lsm_tmp");
- for_each_index (&ref, force_move_till, loop);
+ fmt_data.loop = loop;
+ fmt_data.orig_loop = loop;
+ for_each_index (&ref, force_move_till, &fmt_data);
rewrite_mem_refs (tmp_var, mem_refs);
for (aref = mem_refs; aref; aref = aref->next)