After a lot of thinking and some experiments, I did not find a better
solution to considerably (like on 0.2% - 0.3% on ARM SPEC2000) improve
code size than use of non-regional RA for -Os.
So the patch makes one region allocation is default for -Os. I don't
use function optimize_function_for_size_p because I'd like to keep
possibility still set up regions independedly of used -O option.
This final patch removes ARM code size regression reported on
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48455.
The patch was successfully bootstrapped on x86-64 and ppc64 (actually
the generated code is not changed for -O2).
Is it ok to commit?
2011-08-16 Vladimir Makarov <vmaka...@redhat.com>
PR rtl-optimization/48455
* doc/invoke.texi (-fira-region): Document default values.
* flags-types.h (enum ira_region): Add new value
IRA_REGION_AUTODETECT.
* common.opt (fira-region): Set up initial value to
IRA_REGION_AUTODETECT.
* toplev.c (process_options): Set up flag_ira_region depending on
-O options.
* ira.c (ira.c): Remove optimize guard for ira_build.
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 177573)
+++ doc/invoke.texi (working copy)
@@ -6661,13 +6661,16 @@ rule generates a better code.
Use specified regions for the integrated register allocator. The
@var{region} argument should be one of @code{all}, @code{mixed}, or
@code{one}. The first value means using all loops as register
-allocation regions, the second value which is the default means using
-all loops except for loops with small register pressure as the
-regions, and third one means using all function as a single region.
-The first value can give best result for machines with small size and
-irregular register set, the third one results in faster and generates
-decent code and the smallest size code, and the default value usually
-give the best results in most cases and for most architectures.
+allocation regions, the second value which is enabled by default when
+compiling with optimization for speed (@option{-O}, @option{-O2},
+@dots{}) means using all loops except for loops with small register
+pressure as the regions, and third one which is enabled by default for
+@option{-Os} or @option{-O0} means using all function as a single
+region. The first value can give best result for machines with small
+size and irregular register set, the third one results in faster and
+generates decent code and the smallest size code, and the second value
+usually give the best results in most cases and for most
+architectures.
@item -fira-loop-pressure
@opindex fira-loop-pressure
Index: toplev.c
===================================================================
--- toplev.c (revision 177573)
+++ toplev.c (working copy)
@@ -1289,6 +1289,11 @@ process_options (void)
"and -ftree-loop-linear)");
#endif
+ /* One region RA really helps to decrease the code size. */
+ if (flag_ira_region == IRA_REGION_AUTODETECT)
+ flag_ira_region
+ = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED;
+
/* Unrolling all loops implies that standard loop unrolling must also
be done. */
if (flag_unroll_all_loops)
Index: flag-types.h
===================================================================
--- flag-types.h (revision 177573)
+++ flag-types.h (working copy)
@@ -118,7 +118,11 @@ enum ira_region
{
IRA_REGION_ONE,
IRA_REGION_ALL,
- IRA_REGION_MIXED
+ IRA_REGION_MIXED,
+ /* This value means that there were no options -fira-region on the
+ command line and that we should choose a value depending on the
+ used -O option. */
+ IRA_REGION_AUTODETECT
};
/* The options for excess precision. */
Index: common.opt
===================================================================
--- common.opt (revision 177573)
+++ common.opt (working copy)
@@ -1313,7 +1313,7 @@ EnumValue
Enum(ira_algorithm) String(priority) Value(IRA_ALGORITHM_PRIORITY)
fira-region=
-Common Joined RejectNegative Enum(ira_region) Var(flag_ira_region)
Init(IRA_REGION_MIXED)
+Common Joined RejectNegative Enum(ira_region) Var(flag_ira_region)
Init(IRA_REGION_AUTODETECT)
-fira-region=[one|all|mixed] Set regions for IRA
Enum
Index: ira.c
===================================================================
--- ira.c (revision 177573)
+++ ira.c (working copy)
@@ -3617,9 +3617,8 @@ ira (FILE *f)
if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
fprintf (ira_dump_file, "Building IRA IR\n");
- loops_p = ira_build (optimize
- && (flag_ira_region == IRA_REGION_ALL
- || flag_ira_region == IRA_REGION_MIXED));
+ loops_p = ira_build (flag_ira_region == IRA_REGION_ALL
+ || flag_ira_region == IRA_REGION_MIXED);
ira_assert (ira_conflicts_p || !loops_p);