diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-11-19 23:53:06 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-11-19 23:53:06 +0100 |
commit | 2d73cc4519cdf4a00eb7975e4429cf398456052e (patch) | |
tree | 77f125d9d6648d44ce0a3724256bad7615d241ac /gcc | |
parent | 8ce616e22271df064568eafaa0f08c4862221074 (diff) | |
download | gcc-2d73cc4519cdf4a00eb7975e4429cf398456052e.zip gcc-2d73cc4519cdf4a00eb7975e4429cf398456052e.tar.gz gcc-2d73cc4519cdf4a00eb7975e4429cf398456052e.tar.bz2 |
re PR rtl-optimization/59099 (Erroneous register allocation on 32-bit x86 using regparm)
2013-11-19 Martin Jambor <mjambor@suse.cz>
PR rtl-optimization/59099
* ira.c (find_moveable_pseudos): Put back various analyses from ira()
here.
(ira): Move init_reg_equiv and call to
split_live_ranges_for_shrink_wrap up, remove analyses around call
to find_moveable_pseudos.
testsuite/
* gcc.target/i386/pr59099.c: New test.
From-SVN: r205061
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ira.c | 41 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr59099.c | 76 |
4 files changed, 114 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b6b9e92..1ba54b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-11-19 Martin Jambor <mjambor@suse.cz> + + PR rtl-optimization/59099 + * ira.c (find_moveable_pseudos): Put back various analyses from ira() + here. + (ira): Move init_reg_equiv and call to + split_live_ranges_for_shrink_wrap up, remove analyses around call + to find_moveable_pseudos. + 2013-11-20 Alan Modra <amodra@gmail.com> * config/rs6000/sysv4.h (CC1_ENDIAN_LITTLE_SPEC): Define as empty. @@ -4522,6 +4522,9 @@ find_moveable_pseudos (void) pseudo_replaced_reg.release (); pseudo_replaced_reg.safe_grow_cleared (max_regs); + df_analyze (); + calculate_dominance_info (CDI_DOMINATORS); + i = 0; bitmap_initialize (&live, 0); bitmap_initialize (&used, 0); @@ -4834,6 +4837,14 @@ find_moveable_pseudos (void) free (bb_moveable_reg_sets); last_moveable_pseudo = max_reg_num (); + + fix_reg_equiv_init (); + expand_reg_info (); + regstat_free_n_sets_and_refs (); + regstat_free_ri (); + regstat_init_n_sets_and_refs (); + regstat_compute_ri (); + free_dominance_info (CDI_DOMINATORS); } @@ -5194,7 +5205,19 @@ ira (FILE *f) #endif df_analyze (); + init_reg_equiv (); + if (ira_conflicts_p) + { + calculate_dominance_info (CDI_DOMINATORS); + + if (split_live_ranges_for_shrink_wrap ()) + df_analyze (); + + free_dominance_info (CDI_DOMINATORS); + } + df_clear_flags (DF_NO_INSN_RESCAN); + regstat_init_n_sets_and_refs (); regstat_compute_ri (); @@ -5212,7 +5235,6 @@ ira (FILE *f) if (resize_reg_info () && flag_ira_loop_pressure) ira_set_pseudo_classes (true, ira_dump_file); - init_reg_equiv (); rebuild_p = update_equiv_regs (); setup_reg_equiv (); setup_reg_equiv_init (); @@ -5235,22 +5257,7 @@ ira (FILE *f) allocation because of -O0 usage or because the function is too big. */ if (ira_conflicts_p) - { - df_analyze (); - calculate_dominance_info (CDI_DOMINATORS); - - find_moveable_pseudos (); - if (split_live_ranges_for_shrink_wrap ()) - df_analyze (); - - fix_reg_equiv_init (); - expand_reg_info (); - regstat_free_n_sets_and_refs (); - regstat_free_ri (); - regstat_init_n_sets_and_refs (); - regstat_compute_ri (); - free_dominance_info (CDI_DOMINATORS); - } + find_moveable_pseudos (); max_regno_before_ira = max_reg_num (); ira_setup_eliminable_regset (true); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 190b2c4..178dd39 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-19 Martin Jambor <mjambor@suse.cz> + + PR rtl-optimization/59099 + * gcc.target/i386/pr59099.c: New test. + 2013-11-19 Sriraman Tallam <tmsriram@google.com> * gcc.dg/tree-prof/cold_partition_label.c: New testcase. diff --git a/gcc/testsuite/gcc.target/i386/pr59099.c b/gcc/testsuite/gcc.target/i386/pr59099.c new file mode 100644 index 0000000..7dc12ff --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr59099.c @@ -0,0 +1,76 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fPIC -m32" } */ + +void (*pfn)(void); + +struct s +{ + void** q; + int h; + int t; + int s; +}; + + +void* f (struct s *, struct s *) __attribute__ ((noinline, regparm(1))); + +void* +__attribute__ ((regparm(1))) +f (struct s *p, struct s *p2) +{ + void *gp, *gp1; + int t, h, s, t2, h2, c, i; + + if (p2->h == p2->t) + return 0; + + (*pfn) (); + + h = p->h; + t = p->t; + s = p->s; + + h2 = p2->h; + t2 = p2->t; + + gp = p2->q[h2++]; + + c = (t2 - h2) / 2; + for (i = 0; i != c; i++) + { + if (t == h || (h == 0 && t == s - 1)) + break; + gp1 = p2->q[h2++]; + p->q[t++] = gp1; + if (t == s) + t = 0; + } + + p2->h = h2; + return gp; +} + +static void gn () { } + +int +main() +{ + struct s s1, s2; + void *q[10]; + + pfn = gn; + + s1.q = q; + s1.h = 0; + s1.t = 2; + s1.s = 4; + + s2.q = q; + s2.h = 0; + s2.t = 4; + s2.s = 2; + + f (&s1, &s2); + + return 0; +} |