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
This commit is contained in:
Ben Elliston 2004-10-27 21:02:16 +00:00 committed by Ben Elliston
parent 72111a1f4b
commit 61b5800161
7 changed files with 63 additions and 3 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -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. */

View File

@ -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;
}