This merges the machinery for verify_stmts and verify_types_in_gimple_*.
A step in the direction to merge the various verifications we do
on gimple.  A further step would move the calls to verify_expr to
appropriate places when verifying stmts instead of walking all ops.

The goal is still that the core verifiers work on all forms of gimple,
properly guarding/extending parts with IL properties is also on the
list of things to do.  So is dropping conditionalizing/separating
type checking.

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

Richard.

2011-03-25  Richard Guenther  <rguent...@suse.de>

        * tree-flow.h (verify_stmts): Rename to verify_gimple_in_cfg.
        (verify_types_in_gimple_seq): Rename to verify_gimple_in_seq.
        (verify_gimple): Remove.
        * tree-cfg.c (verify_gimple_call): Merge verification
        from verify_stmts.
        (verify_gimple_phi): Merge verification from verify_stmts.
        (verify_gimple_label): New function.
        (verify_types_in_gimple_seq_2): Rename to verify_gimple_in_seq_2.
        (verify_types_in_gimple_seq): Rename to verify_gimple_in_seq.
        (verify_stmt): Merge into verify_gimple_in_cfg and callees.
        (verify_stmts): Rename to verify_gimple_in_cfg.
        (verify_gimple_in_cfg): New function.
        * passes.c (execute_function_todo): Call verify_gimple_in_cfg.
        * tree-ssa.c (verify_ssa): Likewise.
        * gimplify.c (gimplify_body): Call verify_gimple_in_seq.

Index: gcc/tree-flow.h
===================================================================
*** gcc/tree-flow.h.orig        2011-03-25 13:02:20.000000000 +0100
--- gcc/tree-flow.h     2011-03-25 13:07:55.000000000 +0100
*************** extern basic_block label_to_block_fn (st
*** 426,434 ****
  #define label_to_block(t) (label_to_block_fn (cfun, t))
  extern void notice_special_calls (gimple);
  extern void clear_special_calls (void);
! extern void verify_stmts (void);
! extern void verify_gimple (void);
! extern void verify_types_in_gimple_seq (gimple_seq);
  extern tree gimple_block_label (basic_block);
  extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
  extern bool gimple_duplicate_sese_region (edge, edge, basic_block *, unsigned,
--- 426,433 ----
  #define label_to_block(t) (label_to_block_fn (cfun, t))
  extern void notice_special_calls (gimple);
  extern void clear_special_calls (void);
! extern void verify_gimple_in_seq (gimple_seq);
! extern void verify_gimple_in_cfg (struct function *);
  extern tree gimple_block_label (basic_block);
  extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
  extern bool gimple_duplicate_sese_region (edge, edge, basic_block *, unsigned,
Index: gcc/tree-cfg.c
===================================================================
*** gcc/tree-cfg.c.orig 2011-03-25 13:02:20.000000000 +0100
--- gcc/tree-cfg.c      2011-03-25 14:39:27.000000000 +0100
*************** static bool
*** 3116,3126 ****
  verify_gimple_call (gimple stmt)
  {
    tree fn = gimple_call_fn (stmt);
!   tree fntype;
    unsigned i;
  
!   if (TREE_CODE (fn) != OBJ_TYPE_REF
!       && !is_gimple_val (fn))
      {
        error ("invalid function in gimple call");
        debug_generic_stmt (fn);
--- 3116,3125 ----
  verify_gimple_call (gimple stmt)
  {
    tree fn = gimple_call_fn (stmt);
!   tree fntype, fndecl;
    unsigned i;
  
!   if (!is_gimple_call_addr (fn))
      {
        error ("invalid function in gimple call");
        debug_generic_stmt (fn);
*************** verify_gimple_call (gimple stmt)
*** 3135,3140 ****
--- 3134,3150 ----
        return true;
      }
  
+    fndecl = gimple_call_fndecl (stmt);
+    if (fndecl
+        && TREE_CODE (fndecl) == FUNCTION_DECL
+        && DECL_LOOPING_CONST_OR_PURE_P (fndecl)
+        && !DECL_PURE_P (fndecl)
+        && !TREE_READONLY (fndecl))
+      {
+        error ("invalid pure const state for function");
+        return true;
+      }
+ 
    if (gimple_call_lhs (stmt)
        && (!is_gimple_lvalue (gimple_call_lhs (stmt))
          || verify_types_in_gimple_reference (gimple_call_lhs (stmt), true)))
*************** verify_gimple_switch (gimple stmt)
*** 3985,4030 ****
  }
  
  
- /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
-    and false otherwise.  */
- 
- static bool
- verify_gimple_phi (gimple stmt)
- {
-   tree type = TREE_TYPE (gimple_phi_result (stmt));
-   unsigned i;
- 
-   if (TREE_CODE (gimple_phi_result (stmt)) != SSA_NAME)
-     {
-       error ("invalid PHI result");
-       return true;
-     }
- 
-   for (i = 0; i < gimple_phi_num_args (stmt); i++)
-     {
-       tree arg = gimple_phi_arg_def (stmt, i);
-       if ((is_gimple_reg (gimple_phi_result (stmt))
-          && !is_gimple_val (arg))
-         || (!is_gimple_reg (gimple_phi_result (stmt))
-             && !is_gimple_addressable (arg)))
-       {
-         error ("invalid PHI argument");
-         debug_generic_stmt (arg);
-         return true;
-       }
-       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
-       {
-         error ("incompatible types in PHI argument %u", i);
-         debug_generic_stmt (type);
-         debug_generic_stmt (TREE_TYPE (arg));
-         return true;
-       }
-     }
- 
-   return false;
- }
- 
- 
  /* Verify a gimple debug statement STMT.
     Returns true if anything is wrong.  */
  
--- 3995,4000 ----
*************** verify_gimple_debug (gimple stmt ATTRIBU
*** 4040,4051 ****
    return false;
  }
  
  
  /* Verify the GIMPLE statement STMT.  Returns true if there is an
     error, otherwise false.  */
  
  static bool
! verify_types_in_gimple_stmt (gimple stmt)
  {
    switch (gimple_code (stmt))
      {
--- 4010,4057 ----
    return false;
  }
  
+ /* Verify a gimple label statement STMT.
+    Returns true if anything is wrong.  */
+ 
+ static bool
+ verify_gimple_label (gimple stmt)
+ {
+   tree decl = gimple_label_label (stmt);
+   int uid;
+   bool err = false;
+ 
+   if (TREE_CODE (decl) != LABEL_DECL)
+     return true;
+ 
+   uid = LABEL_DECL_UID (decl);
+   if (cfun->cfg
+       && (uid == -1
+         || VEC_index (basic_block,
+                       label_to_block_map, uid) != gimple_bb (stmt)))
+     {
+       error ("incorrect entry in label_to_block_map");
+       err |= true;
+     }
+ 
+   uid = EH_LANDING_PAD_NR (decl);
+   if (uid)
+     {
+       eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
+       if (decl != lp->post_landing_pad)
+       {
+         error ("incorrect setting of landing pad number");
+         err |= true;
+       }
+     }
+ 
+   return err;
+ }
  
  /* Verify the GIMPLE statement STMT.  Returns true if there is an
     error, otherwise false.  */
  
  static bool
! verify_gimple_stmt (gimple stmt)
  {
    switch (gimple_code (stmt))
      {
*************** verify_types_in_gimple_stmt (gimple stmt
*** 4053,4059 ****
        return verify_gimple_assign (stmt);
  
      case GIMPLE_LABEL:
!       return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL;
  
      case GIMPLE_CALL:
        return verify_gimple_call (stmt);
--- 4059,4065 ----
        return verify_gimple_assign (stmt);
  
      case GIMPLE_LABEL:
!       return verify_gimple_label (stmt);
  
      case GIMPLE_CALL:
        return verify_gimple_call (stmt);
*************** verify_types_in_gimple_stmt (gimple stmt
*** 4089,4097 ****
      case GIMPLE_ASM:
        return false;
  
-     case GIMPLE_PHI:
-       return verify_gimple_phi (stmt);
- 
      /* Tuples that do not have tree operands.  */
      case GIMPLE_NOP:
      case GIMPLE_PREDICT:
--- 4095,4100 ----
*************** verify_types_in_gimple_stmt (gimple stmt
*** 4117,4126 ****
      }
  }
  
  /* Verify the GIMPLE statements inside the sequence STMTS.  */
  
  static bool
! verify_types_in_gimple_seq_2 (gimple_seq stmts)
  {
    gimple_stmt_iterator ittr;
    bool err = false;
--- 4120,4193 ----
      }
  }
  
+ /* Verify the contents of a GIMPLE_PHI.  Returns true if there is a problem,
+    and false otherwise.  */
+ 
+ static bool
+ verify_gimple_phi (gimple phi)
+ {
+   bool err = false;
+   unsigned i;
+   tree phi_result = gimple_phi_result (phi);
+   bool virtual_p;
+ 
+   if (!phi_result)
+     {
+       error ("invalid PHI result");
+       return true;
+     }
+ 
+   virtual_p = !is_gimple_reg (phi_result);
+   if (TREE_CODE (phi_result) != SSA_NAME
+       || (virtual_p
+         && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
+     {
+       error ("invalid PHI result");
+       err = true;
+     }
+ 
+   for (i = 0; i < gimple_phi_num_args (phi); i++)
+     {
+       tree t = gimple_phi_arg_def (phi, i);
+ 
+       if (!t)
+       {
+         error ("missing PHI def");
+         err |= true;
+         continue;
+       }
+       /* Addressable variables do have SSA_NAMEs but they
+        are not considered gimple values.  */
+       else if ((TREE_CODE (t) == SSA_NAME
+               && virtual_p != !is_gimple_reg (t))
+              || (virtual_p
+                  && (TREE_CODE (t) != SSA_NAME
+                      || SSA_NAME_VAR (t) != gimple_vop (cfun)))
+              || (!virtual_p
+                  && !is_gimple_val (t)))
+       {
+         error ("invalid PHI argument");
+         debug_generic_expr (t);
+         err |= true;
+       }
+ #ifdef ENABLE_TYPES_CHECKING
+       if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
+       {
+         error ("incompatible types in PHI argument %u", i);
+         debug_generic_stmt (TREE_TYPE (phi_result));
+         debug_generic_stmt (TREE_TYPE (t));
+         err |= true;
+       }
+ #endif
+     }
+ 
+   return err;
+ }
+ 
  /* Verify the GIMPLE statements inside the sequence STMTS.  */
  
  static bool
! verify_gimple_in_seq_2 (gimple_seq stmts)
  {
    gimple_stmt_iterator ittr;
    bool err = false;
*************** verify_types_in_gimple_seq_2 (gimple_seq
*** 4132,4156 ****
        switch (gimple_code (stmt))
          {
        case GIMPLE_BIND:
!         err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt));
          break;
  
        case GIMPLE_TRY:
!         err |= verify_types_in_gimple_seq_2 (gimple_try_eval (stmt));
!         err |= verify_types_in_gimple_seq_2 (gimple_try_cleanup (stmt));
          break;
  
        case GIMPLE_EH_FILTER:
!         err |= verify_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt));
          break;
  
        case GIMPLE_CATCH:
!         err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt));
          break;
  
        default:
          {
!           bool err2 = verify_types_in_gimple_stmt (stmt);
            if (err2)
              debug_gimple_stmt (stmt);
            err |= err2;
--- 4199,4223 ----
        switch (gimple_code (stmt))
          {
        case GIMPLE_BIND:
!         err |= verify_gimple_in_seq_2 (gimple_bind_body (stmt));
          break;
  
        case GIMPLE_TRY:
!         err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
!         err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
          break;
  
        case GIMPLE_EH_FILTER:
!         err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
          break;
  
        case GIMPLE_CATCH:
!         err |= verify_gimple_in_seq_2 (gimple_catch_handler (stmt));
          break;
  
        default:
          {
!           bool err2 = verify_gimple_stmt (stmt);
            if (err2)
              debug_gimple_stmt (stmt);
            err |= err2;
*************** verify_types_in_gimple_seq_2 (gimple_seq
*** 4164,4265 ****
  
  /* Verify the GIMPLE statements inside the statement list STMTS.  */
  
! void
! verify_types_in_gimple_seq (gimple_seq stmts)
  {
!   if (verify_types_in_gimple_seq_2 (stmts))
      internal_error ("verify_gimple failed");
  }
  
- 
- /* Verify STMT, return true if STMT is not in GIMPLE form.
-    TODO: Implement type checking.  */
- 
- static bool
- verify_stmt (gimple_stmt_iterator *gsi)
- {
-   tree addr;
-   struct walk_stmt_info wi;
-   bool last_in_block = gsi_one_before_end_p (*gsi);
-   gimple stmt = gsi_stmt (*gsi);
-   int lp_nr;
- 
-   if (is_gimple_omp (stmt))
-     {
-       /* OpenMP directives are validated by the FE and never operated
-        on by the optimizers.  Furthermore, GIMPLE_OMP_FOR may contain
-        non-gimple expressions when the main index variable has had
-        its address taken.  This does not affect the loop itself
-        because the header of an GIMPLE_OMP_FOR is merely used to determine
-        how to setup the parallel iteration.  */
-       return false;
-     }
- 
-   /* FIXME.  The C frontend passes unpromoted arguments in case it
-      didn't see a function declaration before the call.  */
-   if (is_gimple_call (stmt))
-     {
-       tree decl;
- 
-       if (!is_gimple_call_addr (gimple_call_fn (stmt)))
-       {
-         error ("invalid function in call statement");
-         return true;
-       }
- 
-       decl = gimple_call_fndecl (stmt);
-       if (decl
-         && TREE_CODE (decl) == FUNCTION_DECL
-         && DECL_LOOPING_CONST_OR_PURE_P (decl)
-         && (!DECL_PURE_P (decl))
-         && (!TREE_READONLY (decl)))
-       {
-         error ("invalid pure const state for function");
-         return true;
-       }
-     }
- 
-   if (is_gimple_debug (stmt))
-     return false;
- 
-   memset (&wi, 0, sizeof (wi));
-   addr = walk_gimple_op (gsi_stmt (*gsi), verify_expr, &wi);
-   if (addr)
-     {
-       debug_generic_expr (addr);
-       inform (gimple_location (gsi_stmt (*gsi)), "in statement");
-       debug_gimple_stmt (stmt);
-       return true;
-     }
- 
-   /* If the statement is marked as part of an EH region, then it is
-      expected that the statement could throw.  Verify that when we
-      have optimizations that simplify statements such that we prove
-      that they cannot throw, that we update other data structures
-      to match.  */
-   lp_nr = lookup_stmt_eh_lp (stmt);
-   if (lp_nr != 0)
-     {
-       if (!stmt_could_throw_p (stmt))
-       {
-         error ("statement marked for throw, but doesn%'t");
-         goto fail;
-       }
-       else if (lp_nr > 0 && !last_in_block && stmt_can_throw_internal (stmt))
-       {
-         error ("statement marked for throw in middle of block");
-         goto fail;
-       }
-     }
- 
-   return false;
- 
-  fail:
-   debug_gimple_stmt (stmt);
-   return true;
- }
- 
- 
  /* Return true when the T can be shared.  */
  
  bool
--- 4231,4245 ----
  
  /* Verify the GIMPLE statements inside the statement list STMTS.  */
  
! DEBUG_FUNCTION void
! verify_gimple_in_seq (gimple_seq stmts)
  {
!   timevar_push (TV_TREE_STMT_VERIFY);
!   if (verify_gimple_in_seq_2 (stmts))
      internal_error ("verify_gimple failed");
+   timevar_pop (TV_TREE_STMT_VERIFY);
  }
  
  /* Return true when the T can be shared.  */
  
  bool
*************** tree_node_can_be_shared (tree t)
*** 4288,4294 ****
    return false;
  }
  
- 
  /* Called via walk_gimple_stmt.  Verify tree sharing.  */
  
  static tree
--- 4268,4273 ----
*************** verify_node_sharing (tree *tp, int *walk
*** 4309,4315 ****
    return NULL;
  }
  
- 
  static bool eh_error_found;
  static int
  verify_eh_throw_stmt_node (void **slot, void *data)
--- 4288,4293 ----
*************** verify_eh_throw_stmt_node (void **slot,
*** 4326,4472 ****
    return 1;
  }
  
! 
! /* Verify the GIMPLE statements in every basic block.  */
  
  DEBUG_FUNCTION void
! verify_stmts (void)
  {
    basic_block bb;
-   gimple_stmt_iterator gsi;
    bool err = false;
    struct pointer_set_t *visited, *visited_stmts;
-   tree addr;
-   struct walk_stmt_info wi;
  
    timevar_push (TV_TREE_STMT_VERIFY);
    visited = pointer_set_create ();
    visited_stmts = pointer_set_create ();
  
!   memset (&wi, 0, sizeof (wi));
!   wi.info = (void *) visited;
! 
!   FOR_EACH_BB (bb)
      {
!       gimple phi;
!       size_t i;
  
        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
!         phi = gsi_stmt (gsi);
          pointer_set_insert (visited_stmts, phi);
          if (gimple_bb (phi) != bb)
            {
              error ("gimple_bb (phi) is set to a wrong basic block");
!             err |= true;
            }
  
          for (i = 0; i < gimple_phi_num_args (phi); i++)
            {
!             tree t = gimple_phi_arg_def (phi, i);
!             tree addr;
! 
!             if (!t)
!               {
!                 error ("missing PHI def");
!                 debug_gimple_stmt (phi);
!                 err |= true;
!                 continue;
!               }
!             /* Addressable variables do have SSA_NAMEs but they
!                are not considered gimple values.  */
!             else if (TREE_CODE (t) != SSA_NAME
!                      && TREE_CODE (t) != FUNCTION_DECL
!                      && !is_gimple_min_invariant (t))
!               {
!                 error ("PHI argument is not a GIMPLE value");
!                 debug_gimple_stmt (phi);
!                 debug_generic_expr (t);
!                 err |= true;
!               }
! 
!             addr = walk_tree (&t, verify_node_sharing, visited, NULL);
              if (addr)
                {
                  error ("incorrect sharing of tree nodes");
-                 debug_gimple_stmt (phi);
                  debug_generic_expr (addr);
!                 err |= true;
                }
            }
  
! #ifdef ENABLE_TYPES_CHECKING
!         if (verify_gimple_phi (phi))
!           {
!             debug_gimple_stmt (phi);
!             err |= true;
!           }
! #endif
        }
  
!       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
        {
          gimple stmt = gsi_stmt (gsi);
! 
!         if (gimple_code (stmt) == GIMPLE_WITH_CLEANUP_EXPR
!             || gimple_code (stmt) == GIMPLE_BIND)
!           {
!             error ("invalid GIMPLE statement");
!             debug_gimple_stmt (stmt);
!             err |= true;
!           }
  
          pointer_set_insert (visited_stmts, stmt);
  
          if (gimple_bb (stmt) != bb)
            {
              error ("gimple_bb (stmt) is set to a wrong basic block");
!             debug_gimple_stmt (stmt);
!             err |= true;
            }
  
!         if (gimple_code (stmt) == GIMPLE_LABEL)
            {
!             tree decl = gimple_label_label (stmt);
!             int uid = LABEL_DECL_UID (decl);
  
!             if (uid == -1
!                 || VEC_index (basic_block, label_to_block_map, uid) != bb)
                {
!                 error ("incorrect entry in label_to_block_map");
!                 err |= true;
                }
  
!             uid = EH_LANDING_PAD_NR (decl);
!             if (uid)
                {
!                 eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
!                 if (decl != lp->post_landing_pad)
!                   {
!                     error ("incorrect setting of landing pad number");
!                     err |= true;
!                   }
                }
            }
  
!         err |= verify_stmt (&gsi);
! 
! #ifdef ENABLE_TYPES_CHECKING
!         if (verify_types_in_gimple_stmt (gsi_stmt (gsi)))
!           {
!             debug_gimple_stmt (stmt);
!             err |= true;
!           }
! #endif
!         addr = walk_gimple_op (gsi_stmt (gsi), verify_node_sharing, &wi);
!         if (addr)
!           {
!             error ("incorrect sharing of tree nodes");
!             debug_gimple_stmt (stmt);
!             debug_generic_expr (addr);
!             err |= true;
!           }
!         gsi_next (&gsi);
        }
      }
  
--- 4304,4427 ----
    return 1;
  }
  
! /* Verify the GIMPLE statements in the CFG of FN.  */
  
  DEBUG_FUNCTION void
! verify_gimple_in_cfg (struct function *fn)
  {
    basic_block bb;
    bool err = false;
    struct pointer_set_t *visited, *visited_stmts;
  
    timevar_push (TV_TREE_STMT_VERIFY);
    visited = pointer_set_create ();
    visited_stmts = pointer_set_create ();
  
!   FOR_EACH_BB_FN (bb, fn)
      {
!       gimple_stmt_iterator gsi;
  
        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
!         gimple phi = gsi_stmt (gsi);
!         bool err2 = false;
!         unsigned i;
! 
          pointer_set_insert (visited_stmts, phi);
+ 
          if (gimple_bb (phi) != bb)
            {
              error ("gimple_bb (phi) is set to a wrong basic block");
!             err2 = true;
            }
  
+         err2 |= verify_gimple_phi (phi);
+ 
          for (i = 0; i < gimple_phi_num_args (phi); i++)
            {
!             tree arg = gimple_phi_arg_def (phi, i);
!             tree addr = walk_tree (&arg, verify_node_sharing, visited, NULL);
              if (addr)
                {
                  error ("incorrect sharing of tree nodes");
                  debug_generic_expr (addr);
!                 err2 |= true;
                }
            }
  
!         if (err2)
!           debug_gimple_stmt (phi);
!         err |= err2;
        }
  
!       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
          gimple stmt = gsi_stmt (gsi);
!         bool err2 = false;
!         struct walk_stmt_info wi;
!         tree addr;
!         int lp_nr;
  
          pointer_set_insert (visited_stmts, stmt);
  
          if (gimple_bb (stmt) != bb)
            {
              error ("gimple_bb (stmt) is set to a wrong basic block");
!             err2 = true;
            }
  
!         err2 |= verify_gimple_stmt (stmt);
! 
!         memset (&wi, 0, sizeof (wi));
!         wi.info = (void *) visited;
!         addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
!         if (addr)
            {
!             error ("incorrect sharing of tree nodes");
!             debug_generic_expr (addr);
!             err2 |= true;
!           }
  
!         /* ???  Instead of not checking these stmts at all the walker
!            should know its context via wi.  */
!         if (!is_gimple_debug (stmt)
!             && !is_gimple_omp (stmt))
!           {
!             memset (&wi, 0, sizeof (wi));
!             addr = walk_gimple_op (stmt, verify_expr, &wi);
!             if (addr)
                {
!                 debug_generic_expr (addr);
!                 inform (gimple_location (stmt), "in statement");
!                 err2 |= true;
                }
+           }
  
!         /* If the statement is marked as part of an EH region, then it is
!            expected that the statement could throw.  Verify that when we
!            have optimizations that simplify statements such that we prove
!            that they cannot throw, that we update other data structures
!            to match.  */
!         lp_nr = lookup_stmt_eh_lp (stmt);
!         if (lp_nr != 0)
!           {
!             if (!stmt_could_throw_p (stmt))
                {
!                 error ("statement marked for throw, but doesn%'t");
!                 err2 |= true;
!               }
!             else if (lp_nr > 0
!                      && !gsi_one_before_end_p (gsi)
!                      && stmt_can_throw_internal (stmt))
!               {
!                 error ("statement marked for throw in middle of block");
!                 err2 |= true;
                }
            }
  
!         if (err2)
!           debug_gimple_stmt (stmt);
!         err |= err2;
        }
      }
  
*************** verify_stmts (void)
*** 4476,4483 ****
                   verify_eh_throw_stmt_node,
                   visited_stmts);
  
!   if (err | eh_error_found)
!     internal_error ("verify_stmts failed");
  
    pointer_set_destroy (visited);
    pointer_set_destroy (visited_stmts);
--- 4431,4438 ----
                   verify_eh_throw_stmt_node,
                   visited_stmts);
  
!   if (err || eh_error_found)
!     internal_error ("verify_gimple failed");
  
    pointer_set_destroy (visited);
    pointer_set_destroy (visited_stmts);
*************** verify_stmts (void)
*** 4486,4491 ****
--- 4441,4447 ----
  }
  
  
+ 
  /* Verifies that the flow information is OK.  */
  
  static int
Index: gcc/passes.c
===================================================================
*** gcc/passes.c.orig   2011-03-25 13:02:36.000000000 +0100
--- gcc/passes.c        2011-03-25 13:07:55.000000000 +0100
*************** execute_function_todo (void *data)
*** 1240,1246 ****
    if (flags & TODO_verify_flow)
      verify_flow_info ();
    if (flags & TODO_verify_stmts)
!     verify_stmts ();
    if (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA))
      verify_loop_closed_ssa (false);
    if (flags & TODO_verify_rtl_sharing)
--- 1240,1246 ----
    if (flags & TODO_verify_flow)
      verify_flow_info ();
    if (flags & TODO_verify_stmts)
!     verify_gimple_in_cfg (cfun);
    if (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA))
      verify_loop_closed_ssa (false);
    if (flags & TODO_verify_rtl_sharing)
Index: gcc/tree-ssa.c
===================================================================
*** gcc/tree-ssa.c.orig 2011-03-25 13:02:20.000000000 +0100
--- gcc/tree-ssa.c      2011-03-25 13:07:55.000000000 +0100
*************** verify_ssa (bool check_modified_stmt)
*** 881,887 ****
  
    gcc_assert (!need_ssa_update_p (cfun));
  
!   verify_stmts ();
  
    timevar_push (TV_TREE_SSA_VERIFY);
  
--- 881,887 ----
  
    gcc_assert (!need_ssa_update_p (cfun));
  
!   verify_gimple_in_cfg (cfun);
  
    timevar_push (TV_TREE_SSA_VERIFY);
  
Index: gcc/gimplify.c
===================================================================
*** gcc/gimplify.c.orig 2011-03-25 13:02:20.000000000 +0100
--- gcc/gimplify.c      2011-03-25 13:07:55.000000000 +0100
*************** gimplify_body (tree *body_p, tree fndecl
*** 7769,7778 ****
    pop_gimplify_context (outer_bind);
    gcc_assert (gimplify_ctxp == NULL);
  
- #ifdef ENABLE_TYPES_CHECKING
    if (!seen_error ())
!     verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
! #endif
  
    timevar_pop (TV_TREE_GIMPLIFY);
    input_location = saved_location;
--- 7769,7776 ----
    pop_gimplify_context (outer_bind);
    gcc_assert (gimplify_ctxp == NULL);
  
    if (!seen_error ())
!     verify_gimple_in_seq (gimple_bind_body (outer_bind));
  
    timevar_pop (TV_TREE_GIMPLIFY);
    input_location = saved_location;

Reply via email to