]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-pre.c (phi_translate_1): Fix memory leak.
authorRichard Guenther <rguenther@suse.de>
Wed, 10 Sep 2008 16:14:30 +0000 (16:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 10 Sep 2008 16:14:30 +0000 (16:14 +0000)
2008-09-10  Richard Guenther  <rguenther@suse.de>

* tree-ssa-pre.c (phi_translate_1): Fix memory leak.

From-SVN: r140236

gcc/ChangeLog
gcc/tree-ssa-pre.c

index c1922b1ce5a0061c5826ade35cb5e5987117cef9..c24b2e8bd2e35a701c284b326bd8f2b4205f3c15 100644 (file)
@@ -1,3 +1,7 @@
+2008-09-10  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-pre.c (phi_translate_1): Fix memory leak.
+
 2008-09-10  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/37432
index 8324f09aaa2ae59de382c17ff10350db9d866a44..a54999b56ff6af153e3aaa5a706c6ac6e2fcfbd8 100644 (file)
@@ -1504,11 +1504,11 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
                  {
                    tree name = get_representative_for (opresult);
                    if (!name)
-                     return NULL;
+                     break;
                    op0 = name;
                  }
                else if (!opresult)
-                 return NULL;
+                 break;
              }
            changed |= op0 != oldop0;
 
@@ -1522,11 +1522,11 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
                  {
                    tree name = get_representative_for (opresult);
                    if (!name)
-                     return NULL;
+                     break;
                    op1 = name;
                  }
                else if (!opresult)
-                 return NULL;
+                 break;
              }
            changed |= op1 != oldop1;
            if (op2 && TREE_CODE (op2) == SSA_NAME)
@@ -1539,11 +1539,11 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
                  {
                    tree name = get_representative_for (opresult);
                    if (!name)
-                     return NULL;
+                     break;
                    op2 = name;
                  }
                else if (!opresult)
-                 return NULL;
+                 break;
              }
            changed |= op2 != oldop2;
 
@@ -1558,6 +1558,12 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
            newop.op2 = op2;
            VEC_replace (vn_reference_op_s, newoperands, i, &newop);
          }
+       if (i != VEC_length (vn_reference_op_s, operands))
+         {
+           if (newoperands)
+             VEC_free (vn_reference_op_s, heap, newoperands);
+           return NULL;
+         }
 
        newvuses = translate_vuses_through_block (vuses, phiblock, pred);
        changed |= newvuses != vuses;