This adds verification and simplifies clear_unused_block_pointer
accordingly (as previously discussed).

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

Richard.

2013-03-20  Richard Biener  <rguent...@suse.de>

        * tree-cfg.c (verify_expr_no_block): New function.
        (verify_expr_location_1): Verify that neither DECL_DEBUG_EXPR
        nor DECL_VALUE_EXPR have locations with associated blocks.
        * tree-ssa-live.c (clear_unused_block_pointer_1): Remove.
        (clear_unused_block_pointer): Remove code dealing with
        blocks in DECL_DEBUG_EXPR locations.

Index: trunk/gcc/tree-cfg.c
===================================================================
*** trunk.orig/gcc/tree-cfg.c   2013-03-20 14:13:26.000000000 +0100
--- trunk/gcc/tree-cfg.c        2013-03-20 14:17:36.152250539 +0100
*************** verify_location (pointer_set_t *blocks,
*** 4536,4541 ****
--- 4536,4559 ----
    return false;
  }
  
+ /* Called via walk_tree.  Verify that expressions have no blocks.  */
+ 
+ static tree
+ verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
+ {
+   if (!EXPR_P (*tp))
+     {
+       *walk_subtrees = false;
+       return NULL;
+     }
+ 
+   location_t loc = EXPR_LOCATION (*tp);
+   if (LOCATION_BLOCK (loc) != NULL)
+     return *tp;
+ 
+   return NULL;
+ }
+ 
  /* Called via walk_tree.  Verify locations of expressions.  */
  
  static tree
*************** verify_expr_location_1 (tree *tp, int *w
*** 4547,4553 ****
        && DECL_HAS_DEBUG_EXPR_P (*tp))
      {
        tree t = DECL_DEBUG_EXPR (*tp);
!       tree addr = walk_tree (&t, verify_expr_location_1, blocks, NULL);
        if (addr)
        return addr;
      }
--- 4565,4581 ----
        && DECL_HAS_DEBUG_EXPR_P (*tp))
      {
        tree t = DECL_DEBUG_EXPR (*tp);
!       tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
!       if (addr)
!       return addr;
!     }
!   if ((TREE_CODE (*tp) == VAR_DECL
!        || TREE_CODE (*tp) == PARM_DECL
!        || TREE_CODE (*tp) == RESULT_DECL)
!       && DECL_HAS_VALUE_EXPR_P (*tp))
!     {
!       tree t = DECL_VALUE_EXPR (*tp);
!       tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
        if (addr)
        return addr;
      }
Index: trunk/gcc/tree-ssa-live.c
===================================================================
*** trunk.orig/gcc/tree-ssa-live.c      2013-03-20 14:13:26.000000000 +0100
--- trunk/gcc/tree-ssa-live.c   2013-03-20 14:15:21.630755347 +0100
*************** clear_unused_block_pointer_1 (tree *tp,
*** 620,630 ****
    if (EXPR_P (*tp) && TREE_BLOCK (*tp)
        && !TREE_USED (TREE_BLOCK (*tp)))
      TREE_SET_BLOCK (*tp, NULL);
-   if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (*tp))
-     {
-       tree debug_expr = DECL_DEBUG_EXPR (*tp);
-       walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL);
-     }
    return NULL_TREE;
  }
  
--- 620,625 ----
*************** clear_unused_block_pointer (void)
*** 636,650 ****
  {
    basic_block bb;
    gimple_stmt_iterator gsi;
-   tree t;
-   unsigned i;
- 
-   FOR_EACH_LOCAL_DECL (cfun, i, t)
-     if (TREE_CODE (t) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (t))
-       {
-       tree debug_expr = DECL_DEBUG_EXPR (t);
-       walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL);
-       }
  
    FOR_EACH_BB (bb)
      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
--- 631,636 ----

Reply via email to