diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-12-12 15:51:49 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-12-12 15:51:49 +0000 |
commit | c9846a8c52dd4547b3635740abe04e6c09957e60 (patch) | |
tree | c3dd825634b70cc0d1ebc56a584ef6a4e54db980 | |
parent | 47a8c24690296baef0c5cdbea45e32de2a81028f (diff) | |
download | gcc-c9846a8c52dd4547b3635740abe04e6c09957e60.zip gcc-c9846a8c52dd4547b3635740abe04e6c09957e60.tar.gz gcc-c9846a8c52dd4547b3635740abe04e6c09957e60.tar.bz2 |
re PR middle-end/59470 (libstdc++ miscompilation after r205709)
2013-12-12 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/59470
* lra-coalesce.c (lra_coalesce): Invalidate inheritance pseudo
values if necessary.
From-SVN: r205930
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-coalesce.c | 31 |
2 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4eab42b..b98e0d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-12-12 Vladimir Makarov <vmakarov@redhat.com> + + PR middle-end/59470 + * lra-coalesce.c (lra_coalesce): Invalidate inheritance pseudo + values if necessary. + 2013-12-12 Jakub Jelinek <jakub@redhat.com> PR libgomp/59467 diff --git a/gcc/lra-coalesce.c b/gcc/lra-coalesce.c index 94a21f0..db8409f 100644 --- a/gcc/lra-coalesce.c +++ b/gcc/lra-coalesce.c @@ -221,9 +221,12 @@ lra_coalesce (void) basic_block bb; rtx mv, set, insn, next, *sorted_moves; int i, mv_num, sregno, dregno; + unsigned int regno; int coalesced_moves; int max_regno = max_reg_num (); bitmap_head involved_insns_bitmap; + bitmap_head result_pseudo_vals_bitmap; + bitmap_iterator bi; timevar_push (TV_LRA_COALESCE); @@ -318,6 +321,34 @@ lra_coalesce (void) } } } + /* If we have situation after inheritance pass: + + r1 <- ... insn originally setting p1 + i1 <- r1 setting inheritance i1 from reload r1 + ... + ... <- ... p2 ... dead p2 + .. + p1 <- i1 + r2 <- i1 + ...<- ... r2 ... + + And we are coalescing p1 and p2 using p1. In this case i1 and p1 + should have different values, otherwise they can get the same + hard reg and this is wrong for insn using p2 before coalescing. + So invalidate such inheritance pseudo values. */ + bitmap_initialize (&result_pseudo_vals_bitmap, ®_obstack); + EXECUTE_IF_SET_IN_BITMAP (&coalesced_pseudos_bitmap, 0, regno, bi) + bitmap_set_bit (&result_pseudo_vals_bitmap, + lra_reg_info[first_coalesced_pseudo[regno]].val); + EXECUTE_IF_SET_IN_BITMAP (&lra_inheritance_pseudos, 0, regno, bi) + if (bitmap_bit_p (&result_pseudo_vals_bitmap, lra_reg_info[regno].val)) + { + lra_set_regno_unique_value (regno); + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + " Make unique value for inheritance r%d\n", regno); + } + bitmap_clear (&result_pseudo_vals_bitmap); bitmap_clear (&used_pseudos_bitmap); bitmap_clear (&involved_insns_bitmap); bitmap_clear (&coalesced_pseudos_bitmap); |