From 080cbf9ecbdb635632aa8b5d9b0f7956020f5369 Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Wed, 18 Sep 2013 18:24:49 +0000 Subject: [PATCH] re PR rtl-optimization/58438 (ICE: in check_rtl, at lra.c:2036) 2013-09-18 Vladimir Makarov 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 PR rtl-optimization/58438 * g++.dg/pr58438.C: New test. From-SVN: r202714 --- gcc/ChangeLog | 7 +++++++ gcc/lra-constraints.c | 10 ++++++---- gcc/lra.c | 4 +++- gcc/testsuite/ChangeLog | 5 +++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d38778..d222ee0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-09-18 Vladimir Makarov + + 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 Richard Earnshaw * arm.c (arm_get_frame_offsets): Validate architecture supports 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) diff --git a/gcc/lra.c b/gcc/lra.c index df457f5..f5aab17 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -2315,7 +2315,6 @@ lra (FILE *f) { for (;;) { - bitmap_clear (&lra_optional_reload_pseudos); /* We should try to assign hard registers to scratches even if there were no RTL transformations in lra_constraints. */ @@ -2367,6 +2366,9 @@ lra (FILE *f) lra_clear_live_ranges (); } } + /* Don't clear optional reloads bitmap until all constraints are + satisfied as we need to differ them from regular reloads. */ + bitmap_clear (&lra_optional_reload_pseudos); bitmap_clear (&lra_subreg_reload_pseudos); bitmap_clear (&lra_inheritance_pseudos); bitmap_clear (&lra_split_regs); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e388eb4..4ed1d8b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-18 Vladimir Makarov + + PR rtl-optimization/58438 + * g++.dg/pr58438.C: New test. + 2013-09-18 Tobias Burnus PR fortran/43366 -- 2.7.4