[PATCH] Improve lim for pulling loads from global variable out of loops
Dorit Naishlos
DORIT@il.ibm.com
Sun Nov 14 21:25:00 GMT 2004
Thanks to this patch, vect-78.c now gets vectorized on targets that support
misalignment ('off.1_12 = off' was taken out of the loop). So we currently
get an XPASS on ppc-darwin. I'll go ahead and commit the following obvious
patch.
dorit
Changelog:
* gcc.dg/vect/vect-78.c: Now vectorized on powerpc*.
Index: vect-78.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.dg/vect/vect-78.c,v
retrieving revision 1.4
diff -c -3 -p -r1.4 vect-78.c
*** vect-78.c 13 Nov 2004 13:42:45 -0000 1.4
--- vect-78.c 14 Nov 2004 20:47:45 -0000
*************** int main (void)
*** 46,50 ****
}
! /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" {
xfail *-*-* } } } */
--- 46,50 ----
}
! /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" {
xfail i?86-*-* x86_64-*-* sparc*-*-* } } } */
|---------+---------------------------------->
| | Zdenek Dvorak |
| | <rakdver@atrey.karlin.m|
| | ff.cuni.cz> |
| | Sent by: |
| | gcc-patches-owner@gcc.g|
| | nu.org |
| | |
| | |
| | 13/11/2004 11:43 |
|---------+---------------------------------->
>------------------------------------------------------------------------------------------------------------------------|
| |
| To: Diego Novillo <dnovillo@redhat.com> |
| cc: Andrew Pinski <pinskia@physics.uc.edu>, "gcc-patches@gcc.gnu.org Patches" <gcc-patches@gcc.gnu.org> |
| Subject: 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.
More information about the Gcc-patches
mailing list