+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
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);
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))
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.