re PR rtl-optimization/34312 (spill failure with -O2 -fPIC -march=pentium-m on i386)

PR target/34312
        * config/i386/i386.c (ix86_function_regparm): Also check for fixed
        registers when checking that regparm registers are available.
        Lower regparm value due to fixed registers usage in addition to
        global regs usage.

testsuite/ChangeLog:

        PR target/34312
        * gcc.target/i386/pr34312.c: New test.

From-SVN: r130625
This commit is contained in:
Uros Bizjak 2007-12-05 17:01:22 +01:00
parent e8f34bc985
commit e37ab97325
4 changed files with 107 additions and 78 deletions

View file

@ -1,4 +1,12 @@
2007-11-27 Bernhard Fischer <aldot@gcc.gnu.org>
2007-12-05 Uros Bizjak <ubizjak@gmail.com>
PR target/34312
* config/i386/i386.c (ix86_function_regparm): Also check for fixed
registers when checking that regparm registers are available.
Lower regparm value due to fixed registers usage in addition to
global regs usage.
2007-12-05 Bernhard Fischer <aldot@gcc.gnu.org>
* sparseset.c: Include config.h and system.h before sparseset.h.
* sparseset.h: Remove inclusion of system.h.
@ -130,8 +138,7 @@
2007-11-30 Jan Hubicka <jh@suse.cz>
* ggc-common.c (dump_ggc_loc_statistics): Reset ggc_force_collect
flag.
* ggc-common.c (dump_ggc_loc_statistics): Reset ggc_force_collect flag.
2007-11-30 Seongbae Park <seongbae.park@gmail.com>
@ -318,7 +325,7 @@
2007-11-26 Andreas Krebbel <krebbel1@de.ibm.com>
PR 34081/C++
PR c++/34081
* c-decl.c (store_parm_decls): Pass 'false' for the new
allocate_struct_function parameter.
* cgraphunit.c (cgraph_build_static_cdtor): Likewise.
@ -350,9 +357,9 @@
* config/mn10300/mn10300.md: (call_internal): Remove mode on
operand 0 in order to match UNPSEC'ed calls generated in PIC mode.
(call_value_internal): Remove mode on operands 0 and 1 in order to
(call_value_internal): Remove mode on operands 0 and 1 in order to
match UNPSEC'ed calls generated in PIC mode.
(GOTaddr2picreg): Use copy_rtx to prevent sharing an rtx between
(GOTaddr2picreg): Use copy_rtx to prevent sharing an rtx between
two insns.
2007-11-26 Richard Guenther <rguenther@suse.de>
@ -442,8 +449,7 @@
2007-11-23 Hans-Peter Nilsson <hp@axis.com>
* reload.c (find_reloads_address_1) <autoincdec cases>:
Call REG_OK_FOR_CONTEXT with the autoincdec code, not
outer_code.
Call REG_OK_FOR_CONTEXT with the autoincdec code, not outer_code.
2007-11-23 Richard Guenther <rguenther@suse.de>
Michael Matz <matz@suse.de>
@ -771,8 +777,7 @@
2007-11-07 Tom Tromey <tromey@redhat.com>
* tree-ssa-structalias.c (ipa_pta_execute): Rename 'cfun' to
'func'.
* tree-ssa-structalias.c (ipa_pta_execute): Rename 'cfun' to 'func'.
* tree-parloops.c (create_loop_fn): Use set_cfun.
* gengtype.c (open_base_files): Emit #undef cfun.
* ipa-struct-reorg.c (do_reorg_1): Use set_cfun.
@ -820,8 +825,7 @@
* tree-ssa-alias.c (create_overlap_variables_for): Make sure
to only create SFTs if we also create variable infos for PTA.
* tree-ssa-structalias.c (set_uids_in_ptset): Add all overlapping
SFTs.
* tree-ssa-structalias.c (set_uids_in_ptset): Add all overlapping SFTs.
2007-11-15 Richard Guenther <rguenther@suse.de>
@ -880,8 +884,7 @@
2007-11-13 Michael Meissner <michael.meissner@amd.com>
* config/i386/i386.c (ix86_sse5_valid_op_p): Put type on separate
line.
* config/i386/i386.c (ix86_sse5_valid_op_p): Put type on separate line.
2007-11-13 Sterling Augustine <sterling@tensilica.com>
Bob Wilson <bob.wilson@acm.org>
@ -908,39 +911,34 @@
2007-11-13 Diego Novillo <dnovillo@google.com>
PR tree-optimization/33870
* tree.h (strcut tree_memory_tag): add field unpartitionable.
remove field in_nested_struct.
(struct tree_struct_field_tag): add field nesting_level.
(sft_in_nested_struct): remove.
(sft_nesting_level): define.
(sft_unpartitionable_p): define.
* tree-ssa-alias.c (mem_sym_score): if mp->var is not
* tree.h (strcut tree_memory_tag): Add field unpartitionable.
Remove field in_nested_struct.
(struct tree_struct_field_tag): Add field nesting_level.
(sft_in_nested_struct): Remove.
(sft_nesting_level): Define.
(sft_unpartitionable_p): Define.
* tree-ssa-alias.c (mem_sym_score): If mp->var is not
partitionable, return long_max.
(compute_memory_partitions): do not partition sfts marked
(compute_memory_partitions): Do not partition sfts marked
unpartitionable.
(create_sft): add argument nesting_level. set
sft_nesting_level with it. update all users.
(create_overlap_variables_for): show nesting level.
* tree-dfa.c (dump_subvars_for): likewise.
(dump_variable): likewise.
show whether the sft is partitionable or not.
* tree-flow.h (struct fieldoff): remove field
in_nested_struct.
add field nesting_level.
* tree-ssa-structalias.c (struct variable_info): remove
(create_sft): Add argument nesting_level. Set
sft_nesting_level with it. Update all users.
(create_overlap_variables_for): Show nesting level.
* tree-dfa.c (dump_subvars_for): Likewise.
(dump_variable): Likewise. Show whether the sft is
partitionable or not.
* tree-flow.h (struct fieldoff): Remove field in_nested_struct.
Add field nesting_level.
* tree-ssa-structalias.c (struct variable_info): Remove
field in_nested_struct.
(push_fields_onto_fieldstack): add argument
nesting_level. update all users.
update documentation.
update pair->nesting_level with nesting_level.
make recursive calls with nesting_level + 1.
(set_uids_in_ptset): if an sft is added to the points-to
set, mark it as unpartitionable.
* tree-ssa-operands.c (ref_nesting_level): new.
(add_vars_for_offset): call it.
add argument full_ref. update
callers.
if var is inside a nested structure and the nesting level
(push_fields_onto_fieldstack): Add argument nesting_level.
Update all users. Update documentation. Update pair->nesting_level
with nesting_level. Make recursive calls with nesting_level + 1.
(set_uids_in_ptset): If an sft is added to the points-to set,
mark it as unpartitionable.
* tree-ssa-operands.c (ref_nesting_level): New.
(add_vars_for_offset): Call it. Add argument full_ref. Update
callers. If var is inside a nested structure and the nesting level
of full_ref is lower than the nesting level of var,
adjust offset by the offset of var.
@ -1191,8 +1189,7 @@
PR 33870
* tree.h (struct tree_struct_field_tag): Add field in_nested_struct.
(SFT_IN_NESTED_STRUCT): Define.
* tree-dfa.c (dump_subvars_for): Show offset of each
sub-var.
* tree-dfa.c (dump_subvars_for): Show offset of each sub-var.
* tree-flow.h (struct fieldoff): Add field in_nested_struct.
* tree-ssa-structalias.c (struct variable_info): Likewise.
(push_fields_onto_fieldstack): If OFFSET is positive,
@ -1202,8 +1199,7 @@
(set_uids_in_ptset): Set SFT_IN_NESTED_STRUCT from the
variable info object.
* tree-ssa-operands.c (add_vars_for_offset): If VAR
belongs to a nested structure, adjust OFFSET by
SFT_OFFSET(VAR).
belongs to a nested structure, adjust OFFSET by SFT_OFFSET(VAR).
2007-11-07 Eric Botcazou <ebotcazou@libertysurf.fr>
@ -1257,8 +1253,7 @@
2007-11-06 Diego Novillo <dnovillo@google.com>
* tree-flow.h (struct fieldoff): Reformat comment.
Document fields.
* tree-flow.h (struct fieldoff): Reformat comment. Document fields.
* tree-ssa-operands.c: Tidy top-level comments.
(add_vop): Likewise.
(add_vars_for_offset): Tidy parameter formatting..
@ -1277,8 +1272,7 @@
PR target/30961
* reload1.c (find_reloads): Also check in_reg when handling a
simple move with an input reload and a destination of a hard
register.
simple move with an input reload and a destination of a hard register.
2007-11-06 Maxim Kuvyrkov <maxim@codesourcery.com>
@ -1355,8 +1349,7 @@
2007-11-05 Mark Mitchell <mark@codesourcery.com>
PR target/33579
* tree.h (DECL_INIT_PRIORITY): Do not require
DECL_HAS_INIT_PRIORITY_P.
* tree.h (DECL_INIT_PRIORITY): Do not require DECL_HAS_INIT_PRIORITY_P.
(DECL_FINI_PRIORITY): Likewise.
* tree.c (decl_init_priority_lookup): Remove assert.
(decl_fini_priority_insert): Likewise.
@ -1369,8 +1362,7 @@
(compare_dtor): Likewise.
(cgraph_build_cdtor_fns): Sort the functions by priority before
calling build_cdtor.
(cgraph_build_static_cdtor): Put the priority in the function's
name.
(cgraph_build_static_cdtor): Put the priority in the function's name.
2007-11-05 H.J. Lu <hongjiu.lu@intel.com>
@ -1505,8 +1497,7 @@
2007-11-02 Diego Novillo <dnovillo@google.com>
* langhooks.h (struct lang_hooks_for_callgraph): Remove third
argument from function pointer ANALYZE_EXPR. Update all
users.
argument from function pointer ANALYZE_EXPR. Update all users.
* cgraph.c (debug_cgraph_node): New.
(debug_cgraph): New.
@ -1626,8 +1617,7 @@
2007-10-31 Richard Sandiford <rsandifo@nildram.co.uk>
PR target/33948
* config/mips/mips.c (mips_fpr_return_fields): Fix SCALAR_TYPE_P
check.
* config/mips/mips.c (mips_fpr_return_fields): Fix SCALAR_TYPE_P check.
2007-10-31 Andreas Krebbel <krebbel1@de.ibm.com>

View file

@ -3198,9 +3198,9 @@ ix86_function_regparm (const_tree type, const_tree decl)
struct function *f;
/* Make sure no regparm register is taken by a
global register variable. */
fixed register or global register variable. */
for (local_regparm = 0; local_regparm < 3; local_regparm++)
if (global_regs[local_regparm])
if (global_regs[local_regparm] || fixed_regs[local_regparm])
break;
/* We can't use regparm(3) for nested functions as these use
@ -3222,11 +3222,12 @@ ix86_function_regparm (const_tree type, const_tree decl)
TYPE_ATTRIBUTES (TREE_TYPE (decl)))))
local_regparm = 2;
/* Each global register variable increases register preassure,
so the more global reg vars there are, the smaller regparm
optimization use, unless requested by the user explicitly. */
/* Each global register variable or fixed register usage
increases register pressure, so less registers should be
used for argument passing. This functionality can be
overriden by explicit regparm value. */
for (regno = 0; regno < 6; regno++)
if (global_regs[regno])
if (global_regs[regno] || fixed_regs[regno])
globals++;
local_regparm
= globals < local_regparm ? local_regparm - globals : 0;

View file

@ -1,3 +1,8 @@
2007-12-05 Uros Bizjak <ubizjak@gmail.com>
PR target/34312
* gcc.target/i386/pr34312.c: New test.
2007-12-05 Tobias Burnus <bU gcc/stmt.c
PR fortran/34333
@ -104,30 +109,29 @@
* gcc.c-torture/compile/20071203-1.c: New test.
2007-12-03 Robert Dewar <dewar@adacore.com>
Samuel Tardieu <sam@rfc1149.net>
Samuel Tardieu <sam@rfc1149.net>
PR ada/34287
* check_elaboration_code.adb: New test.
* bug_elaboration_code.ads, bug_elaboration_code.adb: New support
files.
PR ada/34287
* gnat.dg/check_elaboration_code.adb: New test.
* gnat.dg/bug_elaboration_code.ads, bug_elaboration_code.adb:
New support files.
2007-12-02 Paolo Carlini <pcarlini@suse.de>
PR c++/34061
* g++.dg/cpp0x/pr34061.C: New.
PR c++/34061
* g++.dg/cpp0x/pr34061.C: New.
2007-12-02 Paolo Carlini <pcarlini@suse.de>
PR c++/34273
* g++.dg/other/error21.C: New.
PR c++/34273
* g++.dg/other/error21.C: New.
2007-12-02 Revital Eres <eres@il.ibm.com>
* gcc.dg/sms-4.c: New testcase.
2007-12-02 Vladimir Yanovsky <yanov@il.ibm.com>
Revital Eres <eres@il.ibm.com>
Revital Eres <eres@il.ibm.com>
* gcc.dg/sms-3.c: New testcase.
@ -1304,7 +1308,7 @@
* gcc.dg/vect/vect-78.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-31.c: New test, like the original
testcase (without no-section-anchors prefix) but with global arrays.
testcase (without no-section-anchors prefix) but with global arrays.
* gcc.dg/vect/no-section-anchors-vect-34.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-36.c: Likewsie.
* gcc.dg/vect/no-section-anchors-vect-64.c: Likewise.

View file

@ -0,0 +1,34 @@
/* { dg-do compile } */
/* { dg-require-effective-target ilp32 } */
/* { dg-require-effective-target fpic } */
/* { dg-options "-O2 -march=pentium-m -fpic" } */
typedef struct
{
unsigned char seq[3];
} JamoNormMap;
static const JamoNormMap *
JamoClusterSearch (JamoNormMap aKey, const JamoNormMap * aClusters,
short aClustersSize)
{
unsigned short l = 0, u = aClustersSize - 1;
unsigned short h = (l + u) / 2;
if ((aKey.seq[1] - aClusters[h].seq[1]) < 0)
return JamoClusterSearch (aKey, &(aClusters[l]), h - l);
}
short
JamoSrchReplace (const JamoNormMap * aClusters, unsigned short aClustersSize,
unsigned short * aIn, unsigned int * aLength,
unsigned short aOffset)
{
JamoNormMap key;
key.seq[0] = 0;
key.seq[1] = 1;
key.seq[2] = 2;
JamoClusterSearch (key, aClusters, aClustersSize);
}