Hi!

As discussed in the PR, sometimes we call lra_create_live_ranges multiple
times without intervening lra_clear_live_ranges, which results in memory
leaks.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk?

2013-02-27  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/56461
        * lra.c (lra): Call lra_clear_live_ranges if live_p,
        right before calling lra_create_live_ranges, also call it
        when clearing live_p.  Only call lra_clear_live_ranges
        at the end if live_p.

--- gcc/lra.c.jj        2013-02-09 10:29:36.000000000 +0100
+++ gcc/lra.c   2013-02-27 08:51:34.971860214 +0100
@@ -2291,6 +2291,8 @@ lra (FILE *f)
          /* Do inheritance only for regular algorithms.  */
          if (! lra_simple_p)
            lra_inheritance ();
+         if (live_p)
+           lra_clear_live_ranges ();
          /* We need live ranges for lra_assign -- so build them.  */
          lra_create_live_ranges (true);
          live_p = true;
@@ -2308,6 +2310,8 @@ lra (FILE *f)
                live_p = false;
              if (lra_undo_inheritance ())
                live_p = false;
+             if (! live_p)
+               lra_clear_live_ranges ();
            }
        }
       bitmap_clear (&lra_optional_reload_pseudos);
@@ -2334,7 +2338,8 @@ lra (FILE *f)
   lra_eliminate (true);
   lra_final_code_change ();
   lra_in_progress = 0;
-  lra_clear_live_ranges ();
+  if (live_p)
+    lra_clear_live_ranges ();
   lra_live_ranges_finish ();
   lra_constraints_finish ();
   finish_reg_info ();

        Jakub

Reply via email to