* 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
+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.
@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
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
(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 \
+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
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-optimized" } */
+/* { dg-options "-O1 -fdump-tree-optimized --param sra-max-structure-size=32" } */
/* Tests for SRA. */
#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
{
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);
/* 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;
}