gimple-low.c (lower_gimple_bind): Clear DECL_CHAIN of vars in gimple_bind_vars but...
authorRichard Biener <rguenther@suse.de>
Fri, 7 Oct 2016 07:47:38 +0000 (07:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 7 Oct 2016 07:47:38 +0000 (07:47 +0000)
2016-10-07  Richard Biener  <rguenther@suse.de>

* gimple-low.c (lower_gimple_bind): Clear DECL_CHAIN of
vars in gimple_bind_vars but not in BLOCK_VARS.

From-SVN: r240855

gcc/ChangeLog
gcc/gimple-low.c

index 9125650a5453559c98f13aa177d27a66f583bf5a..e1eb08d28bc285c94dcf6b818ff56808d8be5aaf 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-07  Richard Biener  <rguenther@suse.de>
+
+       * gimple-low.c (lower_gimple_bind): Clear DECL_CHAIN of
+       vars in gimple_bind_vars but not in BLOCK_VARS.
+
 2016-10-07  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/77879
index 5f3361acba8dd294627dc3c4dd47242e08236182..1bccf44e5d76003509e7c3928b2a4047820dae7f 100644 (file)
@@ -416,6 +416,23 @@ lower_gimple_bind (gimple_stmt_iterator *gsi, struct lower_data *data)
     }
 
   record_vars (gimple_bind_vars (stmt));
+
+  /* Scrap DECL_CHAIN up to BLOCK_VARS to ease GC after we no longer
+     need gimple_bind_vars.  */
+  tree next;
+  tree end = NULL_TREE;
+  if (gimple_bind_block (stmt))
+    end = BLOCK_VARS (gimple_bind_block (stmt));
+  for (tree var = gimple_bind_vars (stmt); var != end; var = next)
+    {
+      /* Ugh, something is violating the constraint that BLOCK_VARS
+         is a sub-chain of gimple_bind_vars.  */
+      if (! var)
+       break;
+      next = DECL_CHAIN (var);
+      DECL_CHAIN (var) = NULL_TREE;
+    }
+
   lower_sequence (gimple_bind_body_ptr (stmt), data);
 
   if (new_block)