aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2004-11-14 19:04:25 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2004-11-14 18:04:25 +0000
commit9beeb4ee4c1bf42a2d3a66d75d250cf20c9c1f9f (patch)
tree4342616d30f20c349279f331a6f1ad5af6c0e53b /gcc
parent3021a627c59f88450a6c785d5b0d61f390762445 (diff)
downloadgcc-9beeb4ee4c1bf42a2d3a66d75d250cf20c9c1f9f.zip
gcc-9beeb4ee4c1bf42a2d3a66d75d250cf20c9c1f9f.tar.gz
gcc-9beeb4ee4c1bf42a2d3a66d75d250cf20c9c1f9f.tar.bz2
re PR tree-optimization/18431 (Code for arrays and pointers are not the same)
PR tree-optimization/18431 * tree-flow.h (stmt_references_memory_p): Declare. * tree-ssa-loop-im.c (stmt_cost): Use stmt_references_memory_p. * tree-ssa.c (stmt_references_memory_p): New function. From-SVN: r90624
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-flow.h1
-rw-r--r--gcc/tree-ssa-loop-im.c4
-rw-r--r--gcc/tree-ssa.c17
4 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ae73d88..285c1be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-14 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/18431
+ * tree-flow.h (stmt_references_memory_p): Declare.
+ * tree-ssa-loop-im.c (stmt_cost): Use stmt_references_memory_p.
+ * tree-ssa.c (stmt_references_memory_p): New function.
+
2004-11-14 Andreas Schwab <schwab@suse.de>
* Makefile.in (lambda-code.o, tree-loop-linear.o): Depend on
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index cdadcc9..08a73e4 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -583,6 +583,7 @@ extern void delete_tree_ssa (void);
extern void register_new_def (tree, varray_type *);
extern void walk_use_def_chains (tree, walk_use_def_chains_fn, void *, bool);
extern void kill_redundant_phi_nodes (void);
+extern bool stmt_references_memory_p (tree);
/* In tree-into-ssa.c */
extern void rewrite_into_ssa (bool);
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index d04d095..3c75553 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -365,9 +365,7 @@ stmt_cost (tree stmt)
rhs = TREE_OPERAND (stmt, 1);
/* Hoisting memory references out should almost surely be a win. */
- if (!is_gimple_variable (lhs))
- cost += 20;
- if (is_gimple_addressable (rhs) && !is_gimple_variable (rhs))
+ if (stmt_references_memory_p (stmt))
cost += 20;
switch (TREE_CODE (rhs))
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index d0419b7..4cb8cc2 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -902,6 +902,23 @@ tree_ssa_useless_type_conversion (tree expr)
return false;
}
+/* Returns true if statement STMT may read memory. */
+
+bool
+stmt_references_memory_p (tree stmt)
+{
+ stmt_ann_t ann;
+
+ get_stmt_operands (stmt);
+ ann = stmt_ann (stmt);
+
+ if (ann->has_volatile_ops)
+ return true;
+
+ return (NUM_VUSES (VUSE_OPS (ann)) > 0
+ || NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) > 0
+ || NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) > 0);
+}
/* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
described in walk_use_def_chains.