diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-09-18 18:24:49 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-09-18 18:24:49 +0000 |
commit | 080cbf9ecbdb635632aa8b5d9b0f7956020f5369 (patch) | |
tree | b95d2a3ceefd3cc45589134af186eae34f30dcc0 /gcc/lra-constraints.c | |
parent | 83ba23b7aa47ed35554dd5654f0e372d824f81e3 (diff) | |
download | gcc-080cbf9ecbdb635632aa8b5d9b0f7956020f5369.zip gcc-080cbf9ecbdb635632aa8b5d9b0f7956020f5369.tar.gz gcc-080cbf9ecbdb635632aa8b5d9b0f7956020f5369.tar.bz2 |
re PR rtl-optimization/58438 (ICE: in check_rtl, at lra.c:2036)
2013-09-18 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/58438
* lra.c (lra): Clear lra_optional_reload_pseudos in upper loop.
* lra-constraints.c (undo_optional_reloads): Keep optional reloads
from previous subpasses.
2013-09-18 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/58438
* g++.dg/pr58438.C: New test.
From-SVN: r202714
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index b949a6b..e87ba91 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -5456,10 +5456,12 @@ undo_optional_reloads (void) EXECUTE_IF_SET_IN_BITMAP (&lra_optional_reload_pseudos, 0, regno, bi) { keep_p = false; - if (reg_renumber[lra_reg_info[regno].restore_regno] >= 0) - /* If the original pseudo changed its allocation, just - removing the optional pseudo is dangerous as the original - pseudo will have longer live range. */ + /* Keep optional reloads from previous subpasses. */ + if (lra_reg_info[regno].restore_regno < 0 + /* If the original pseudo changed its allocation, just + removing the optional pseudo is dangerous as the original + pseudo will have longer live range. */ + || reg_renumber[lra_reg_info[regno].restore_regno] >= 0) keep_p = true; else if (reg_renumber[regno] >= 0) EXECUTE_IF_SET_IN_BITMAP (&lra_reg_info[regno].insn_bitmap, 0, uid, bi2) |