re PR tree-optimization/18431 (Code for arrays and pointers are not the same)
authorZdenek Dvorak <dvorakz@suse.cz>
Sun, 14 Nov 2004 18:04:25 +0000 (19:04 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sun, 14 Nov 2004 18:04:25 +0000 (18:04 +0000)
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

gcc/ChangeLog
gcc/tree-flow.h
gcc/tree-ssa-loop-im.c
gcc/tree-ssa.c

index ae73d88..285c1be 100644 (file)
@@ -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
index cdadcc9..08a73e4 100644 (file)
@@ -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);
index d04d095..3c75553 100644 (file)
@@ -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))
index d0419b7..4cb8cc2 100644 (file)
@@ -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.