This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Improve lim for pulling loads from global variable out of loops
Hello,
> > > > if (!is_gimple_reg (rhs))
> > > > cost += 20;
> > >
> > > This would cause us to count any operation except for simple reg = reg
> > > copy as expensive, which definitely is not what is wanted.
> > >
> > Huh? Absolutely not. Read the predicate again. If the RHS is a
> > register, we don't increase the cost.
> >
> Never mind. I mis-read your paragraph, sorry.
>
> Yes, this would make reg = CST, expensive. So, if you only want to make
> memory stores and loads expensive, you can ask it directly with:
>
> if (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))
> cost += 20;
>
> (this whole expression should probably be implemented into a predicate).
here is the patch, bootstrapped & regtested on ppc and i686.
Zdenek
PR tree-optimization/18431
* tree-flow.h (stmt_reads_memory_p): Declare.
* tree-ssa-loop-im.c (stmt_cost): Use stmt_reads_memory_p.
* tree-ssa.c (stmt_reads_memory_p): New function.
Index: tree-flow.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-flow.h,v
retrieving revision 2.61
diff -c -3 -p -r2.61 tree-flow.h
*** tree-flow.h 9 Nov 2004 14:59:49 -0000 2.61
--- tree-flow.h 12 Nov 2004 19:43:57 -0000
*************** extern void delete_tree_ssa (void);
*** 583,588 ****
--- 583,589 ----
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_reads_memory_p (tree);
/* In tree-into-ssa.c */
extern void rewrite_into_ssa (bool);
Index: tree-ssa-loop-im.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop-im.c,v
retrieving revision 2.21
diff -c -3 -p -r2.21 tree-ssa-loop-im.c
*** tree-ssa-loop-im.c 8 Nov 2004 13:54:39 -0000 2.21
--- tree-ssa-loop-im.c 12 Nov 2004 19:43:57 -0000
*************** stmt_cost (tree stmt)
*** 365,373 ****
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))
cost += 20;
switch (TREE_CODE (rhs))
--- 365,371 ----
rhs = TREE_OPERAND (stmt, 1);
/* Hoisting memory references out should almost surely be a win. */
! if (stmt_reads_memory_p (stmt))
cost += 20;
switch (TREE_CODE (rhs))
Index: tree-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa.c,v
retrieving revision 2.57
diff -c -3 -p -r2.57 tree-ssa.c
*** tree-ssa.c 12 Nov 2004 00:08:40 -0000 2.57
--- tree-ssa.c 12 Nov 2004 19:43:57 -0000
*************** tree_ssa_useless_type_conversion (tree e
*** 902,907 ****
--- 902,921 ----
return false;
}
+ /* Returns true if statement STMT may read memory. */
+
+ bool
+ stmt_reads_memory_p (tree stmt)
+ {
+ stmt_ann_t ann;
+
+ get_stmt_operands (stmt);
+ ann = stmt_ann (stmt);
+
+ 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.