aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBen Elliston <bje@au.ibm.com>2004-10-27 21:02:16 +0000
committerBen Elliston <bje@gcc.gnu.org>2004-10-28 07:02:16 +1000
commit61b5800161f855eb1028cd76ad200bd0d63b2b77 (patch)
tree13fd3cfcb73f6650e4dab5d9115c569183d1183a /gcc
parent72111a1f4bb7d88865ee53bdc2fc26db58c534ca (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/doc/invoke.texi13
-rw-r--r--gcc/params.def19
-rw-r--r--gcc/params.h4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/sra-1.c2
-rw-r--r--gcc/tree-sra.c13
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;
}