This fixes the observed memory leak in the correct way, asserting that
overwriting of a vinfo doesn't happen.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-12-09  Richard Biener  <rguent...@suse.de>

        * tree-vect-stmts.c (vectorizable_load): Set new vinfo only
        if it was not yet set.
        * tree-vectorizer.h (set_vinfo_for_stmt): Assert we don't
        overwrite an existing entry.

Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c       (revision 231355)
+++ gcc/tree-vect-stmts.c       (working copy)
@@ -7276,6 +7337,9 @@ vectorizable_load (gimple *stmt, gimple_
                                              unshare_expr
                                                (gimple_assign_rhs1 (stmt))));
                      new_temp = vect_init_vector (stmt, tem, vectype, NULL);
+                     new_stmt = SSA_NAME_DEF_STMT (new_temp);
+                     set_vinfo_for_stmt (new_stmt,
+                                         new_stmt_vec_info (new_stmt, vinfo));
                    }
                  else
                    {
@@ -7283,10 +7347,8 @@ vectorizable_load (gimple *stmt, gimple_
                      gsi_next (&gsi2);
                      new_temp = vect_init_vector (stmt, scalar_dest,
                                                   vectype, &gsi2);
+                     new_stmt = SSA_NAME_DEF_STMT (new_temp);
                    }
-                 new_stmt = SSA_NAME_DEF_STMT (new_temp);
-                 set_vinfo_for_stmt (new_stmt,
-                                     new_stmt_vec_info (new_stmt, vinfo));
                }
 
              if (negative)
Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h       (revision 231355)
+++ gcc/tree-vectorizer.h       (working copy)
@@ -715,7 +715,10 @@ set_vinfo_for_stmt (gimple *stmt, stmt_v
       stmt_vec_info_vec.safe_push (info);
     }
   else
-    stmt_vec_info_vec[uid - 1] = info;
+    {
+      gcc_checking_assert (info == NULL);
+      stmt_vec_info_vec[uid - 1] = info;
+    }
 }
 
 /* Return the earlier statement between STMT1 and STMT2.  */

Reply via email to