From 152a1c0a111d58a56bf2c949571b1b1f1c9b3a92 Mon Sep 17 00:00:00 2001 From: bje Date: Wed, 27 Oct 2004 21:02:16 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89711 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++++++++ gcc/doc/invoke.texi | 13 +++++++++++++ gcc/params.def | 19 +++++++++++++++++++ gcc/params.h | 4 ++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/tree-ssa/sra-1.c | 2 +- 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 + + * 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 * 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 + + * gcc.dg/tree-ssa/sra-1.c: Pass --param sra-max-structure-size. + 2004-10-27 Nathan Sidwell * 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; } -- 2.7.4