aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-09-18 18:24:49 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-09-18 18:24:49 +0000
commit080cbf9ecbdb635632aa8b5d9b0f7956020f5369 (patch)
treeb95d2a3ceefd3cc45589134af186eae34f30dcc0 /gcc
parent83ba23b7aa47ed35554dd5654f0e372d824f81e3 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lra-constraints.c10
-rw-r--r--gcc/lra.c4
-rw-r--r--gcc/testsuite/ChangeLog5
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 <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 Richard Earnshaw <rearnsha@arm.com>
* 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 <vmakarov@redhat.com>
+
+ PR rtl-optimization/58438
+ * g++.dg/pr58438.C: New test.
+
2013-09-18 Tobias Burnus <burnus@net-b.de>
PR fortran/43366