diff options
author | Ben Elliston <bje@au.ibm.com> | 2004-10-27 21:02:16 +0000 |
---|---|---|
committer | Ben Elliston <bje@gcc.gnu.org> | 2004-10-28 07:02:16 +1000 |
commit | 61b5800161f855eb1028cd76ad200bd0d63b2b77 (patch) | |
tree | 13fd3cfcb73f6650e4dab5d9115c569183d1183a /gcc | |
parent | 72111a1f4bb7d88865ee53bdc2fc26db58c534ca (diff) | |
download | gcc-61b5800161f855eb1028cd76ad200bd0d63b2b77.zip gcc-61b5800161f855eb1028cd76ad200bd0d63b2b77.tar.gz gcc-61b5800161f855eb1028cd76ad200bd0d63b2b77.tar.bz2 |
params.def (PARAM_SRA_MAX_STRUCTURE_SIZE): New.
* params.def (PARAM_SRA_MAX_STRUCTURE_SIZE): New.
(PARAM_SRA_FIELD_STRUCTURE_RATIO): Likewise.
* params.h (SRA_MAX_STRUCTURE_SIZE): New.
(SRA_FIELD_STRUCTURE_RATIO): Likewise.
* tree-sra.c: Include "params.h".
(decide_block_copy): Use new parameters.
* doc/invoke.texi (Optimize Options): Document new SRA pass
parameters sra-max-structure-size and sra-field-structure-ratio.
[testsuite]
* gcc.dg/tree-ssa/sra-1.c: Pass --param sra-max-structure-size.
From-SVN: r89711
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 13 | ||||
-rw-r--r-- | gcc/params.def | 19 | ||||
-rw-r--r-- | gcc/params.h | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/sra-1.c | 2 | ||||
-rw-r--r-- | gcc/tree-sra.c | 13 |
7 files changed, 63 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 898e2e9..8d19733 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-10-28 Ben Elliston <bje@au.ibm.com> + + * params.def (PARAM_SRA_MAX_STRUCTURE_SIZE): New. + (PARAM_SRA_FIELD_STRUCTURE_RATIO): Likewise. + * params.h (SRA_MAX_STRUCTURE_SIZE): New. + (SRA_FIELD_STRUCTURE_RATIO): Likewise. + * tree-sra.c: Include "params.h". + (decide_block_copy): Use new parameters. + * doc/invoke.texi (Optimize Options): Document new SRA pass + parameters sra-max-structure-size and sra-field-structure-ratio. + 2004-10-27 Nicolas Pitre <nico@cam.org> * config/arm/ieee754-df.S (floatdidf): Fix regression with big values. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 990b83c..ceeae22 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -5313,6 +5313,19 @@ In each case, the @var{value} is an integer. The allowable choices for @var{name} are given in the following table: @table @gcctabopt +@item sra-max-structure-size +The maximum structure size, in bytes, at which the scalar replacement +of aggregates (SRA) optimization will perform block copies. The +default value, 0, implies that GCC will select the most appropriate +size itself. + +@item sra-field-structure-ratio +The treshold ratio (as a percentage) between instantiated fields and +the complete structure size. We say that if the ratio of the number +of bytes in instantiated fields to the number of bytes in the complete +structure exceeds this parameter, then block copies are not used. The +default is 75. + @item max-crossjump-edges The maximum number of incoming edges to consider for crossjumping. The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in diff --git a/gcc/params.def b/gcc/params.def index 79c55bc..5bde4a1 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -35,6 +35,25 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA Be sure to add an entry to invoke.texi summarizing the parameter. */ +/* The maximum structure size at which the scalar replacement of + aggregates (SRA) pass will perform block copies. The default + value, 0, implies that GCC will select the most appropriate size + itself. */ +DEFPARAM (PARAM_SRA_MAX_STRUCTURE_SIZE, + "sra-max-structure-size", + "The maximum structure size (in bytes) at which GCC will do block copies.", + 0) + +/* The ratio between instantiated fields and the complete structure + size. We say that if the ratio of the number of bytes in + instantiated fields to the number of bytes in the complete + structure exceeds this parameter, then block copies are not used. + The default is 75%. */ +DEFPARAM (PARAM_SRA_FIELD_STRUCTURE_RATIO, + "sra-field-structure-ratio", + "The threshold ratio between instantiated fields and the total structure size.", + 75) + /* The single function inlining limit. This is the maximum size of a function counted in internal gcc instructions (not in real machine instructions) that is eligible for inlining diff --git a/gcc/params.h b/gcc/params.h index b17625e..0ebb972 100644 --- a/gcc/params.h +++ b/gcc/params.h @@ -82,6 +82,10 @@ typedef enum compiler_param (compiler_params[(int) ENUM].value) /* Macros for the various parameters. */ +#define SRA_MAX_STRUCTURE_SIZE \ + PARAM_VALUE (PARAM_SRA_MAX_STRUCTURE_SIZE) +#define SRA_FIELD_STRUCTURE_RATIO \ + PARAM_VALUE (PARAM_SRA_FIELD_STRUCTURE_RATIO) #define MAX_INLINE_INSNS_SINGLE \ PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SINGLE) #define MAX_INLINE_INSNS \ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1329715..8d984cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-10-28 Ben Elliston <bje@au.ibm.com> + + * gcc.dg/tree-ssa/sra-1.c: Pass --param sra-max-structure-size. + 2004-10-27 Nathan Sidwell <nathan@codesourcery.com> * gcc.dg/cpp/direct2.c: Cope with different bison 'parse' or diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-1.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-1.c index 652f402..c018fbb 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/sra-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ +/* { dg-options "-O1 -fdump-tree-optimized --param sra-max-structure-size=32" } */ /* Tests for SRA. */ diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 7519c3c..9fd40f9 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -48,6 +48,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "target.h" /* expr.h is needed for MOVE_RATIO. */ #include "expr.h" +#include "params.h" /* This object of this pass is to replace a non-addressable aggregate with a @@ -1292,6 +1293,14 @@ decide_block_copy (struct sra_elt *elt) { unsigned HOST_WIDE_INT full_size, inst_size = 0; unsigned int inst_count; + unsigned int max_size; + + /* If the sra-max-structure-size parameter is 0, then the + user has not overridden the parameter and we can choose a + sensible default. */ + max_size = SRA_MAX_STRUCTURE_SIZE + ? SRA_MAX_STRUCTURE_SIZE + : MOVE_RATIO * UNITS_PER_WORD; full_size = tree_low_cst (size_tree, 1); @@ -1302,14 +1311,14 @@ decide_block_copy (struct sra_elt *elt) /* If the structure is small, and we've made copies, go ahead and instantiate, hoping that the copies will go away. */ - if (full_size <= (unsigned) MOVE_RATIO * UNITS_PER_WORD + if (full_size <= max_size && elt->n_copies > elt->n_uses) use_block_copy = false; else { inst_count = sum_instantiated_sizes (elt, &inst_size); - if (inst_size * 4 >= full_size * 3) + if (inst_size * 100 >= full_size * SRA_FIELD_STRUCTURE_RATIO) use_block_copy = false; } |