Commit 61b58001 by Ben Elliston Committed by Ben Elliston

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
parent 72111a1f
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> 2004-10-27 Nicolas Pitre <nico@cam.org>
* config/arm/ieee754-df.S (floatdidf): Fix regression with big values. * config/arm/ieee754-df.S (floatdidf): Fix regression with big values.
......
...@@ -5313,6 +5313,19 @@ In each case, the @var{value} is an integer. The allowable choices for ...@@ -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: @var{name} are given in the following table:
@table @gcctabopt @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 @item max-crossjump-edges
The maximum number of incoming edges to consider for crossjumping. The maximum number of incoming edges to consider for crossjumping.
The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in
......
...@@ -35,6 +35,25 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -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. */ 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 /* The single function inlining limit. This is the maximum size
of a function counted in internal gcc instructions (not in of a function counted in internal gcc instructions (not in
real machine instructions) that is eligible for inlining real machine instructions) that is eligible for inlining
......
...@@ -82,6 +82,10 @@ typedef enum compiler_param ...@@ -82,6 +82,10 @@ typedef enum compiler_param
(compiler_params[(int) ENUM].value) (compiler_params[(int) ENUM].value)
/* Macros for the various parameters. */ /* 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 \ #define MAX_INLINE_INSNS_SINGLE \
PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SINGLE) PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SINGLE)
#define MAX_INLINE_INSNS \ #define MAX_INLINE_INSNS \
......
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> 2004-10-27 Nathan Sidwell <nathan@codesourcery.com>
* gcc.dg/cpp/direct2.c: Cope with different bison 'parse' or * gcc.dg/cpp/direct2.c: Cope with different bison 'parse' or
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-optimized" } */ /* { dg-options "-O1 -fdump-tree-optimized --param sra-max-structure-size=32" } */
/* Tests for SRA. */ /* Tests for SRA. */
......
...@@ -48,6 +48,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -48,6 +48,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "target.h" #include "target.h"
/* expr.h is needed for MOVE_RATIO. */ /* expr.h is needed for MOVE_RATIO. */
#include "expr.h" #include "expr.h"
#include "params.h"
/* This object of this pass is to replace a non-addressable aggregate with a /* 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) ...@@ -1292,6 +1293,14 @@ decide_block_copy (struct sra_elt *elt)
{ {
unsigned HOST_WIDE_INT full_size, inst_size = 0; unsigned HOST_WIDE_INT full_size, inst_size = 0;
unsigned int inst_count; 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); full_size = tree_low_cst (size_tree, 1);
...@@ -1302,14 +1311,14 @@ decide_block_copy (struct sra_elt *elt) ...@@ -1302,14 +1311,14 @@ decide_block_copy (struct sra_elt *elt)
/* If the structure is small, and we've made copies, go ahead /* If the structure is small, and we've made copies, go ahead
and instantiate, hoping that the copies will go away. */ 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) && elt->n_copies > elt->n_uses)
use_block_copy = false; use_block_copy = false;
else else
{ {
inst_count = sum_instantiated_sizes (elt, &inst_size); 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; use_block_copy = false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment