diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-11 11:13:27 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-11 11:13:27 +0000 |
commit | c41143fb1d63596ff2a0f6da741b4bae73b8be16 (patch) | |
tree | d70c0763693cfef7bc877f21e079986944261a5f /gcc/tree-cfg.c | |
parent | eb0badc13724022c8828a55e516d0eecdc487cc3 (diff) | |
download | gcc-c41143fb1d63596ff2a0f6da741b4bae73b8be16.tar.gz |
2011-05-11 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 173647 using svnmerge
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@173652 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 519 |
1 files changed, 247 insertions, 272 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 1f533a33086..e1f8707e809 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1,6 +1,6 @@ /* Control flow functions for trees. Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010 Free Software Foundation, Inc. + 2010, 2011 Free Software Foundation, Inc. Contributed by Diego Novillo <dnovillo@redhat.com> This file is part of GCC. @@ -757,7 +757,7 @@ same_line_p (location_t locus1, location_t locus2) return true; return (from.file != NULL && to.file != NULL - && strcmp (from.file, to.file) == 0); + && filename_cmp (from.file, to.file) == 0); } /* Assign a unique discriminator value to block BB if it begins at the same @@ -838,8 +838,8 @@ edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value, for (t = (tree) *value; t; t = next) { - next = TREE_CHAIN (t); - TREE_CHAIN (t) = NULL; + next = CASE_CHAIN (t); + CASE_CHAIN (t) = NULL; } *value = NULL; @@ -922,7 +922,7 @@ get_cases_for_edge (edge e, gimple t) /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create a new chain. */ slot = pointer_map_insert (edge_to_cases, this_edge); - TREE_CHAIN (elt) = (tree) *slot; + CASE_CHAIN (elt) = (tree) *slot; *slot = elt; } @@ -1358,13 +1358,14 @@ group_case_labels_stmt (gimple stmt) { tree merge_case = gimple_switch_label (stmt, i); tree merge_label = CASE_LABEL (merge_case); - tree t = int_const_binop (PLUS_EXPR, base_high, - integer_one_node, 1); + double_int bhp1 = double_int_add (tree_to_double_int (base_high), + double_int_one); /* Merge the cases if they jump to the same place, and their ranges are consecutive. */ if (merge_label == base_label - && tree_int_cst_equal (CASE_LOW (merge_case), t)) + && double_int_equal_p (tree_to_double_int (CASE_LOW (merge_case)), + bhp1)) { base_high = CASE_HIGH (merge_case) ? CASE_HIGH (merge_case) : CASE_LOW (merge_case); @@ -2989,7 +2990,7 @@ verify_types_in_gimple_reference (tree expr, bool require_lvalue) if (!TMR_BASE (expr) || !is_gimple_mem_ref_addr (TMR_BASE (expr))) { - error ("invalid address operand in in TARGET_MEM_REF"); + error ("invalid address operand in TARGET_MEM_REF"); return true; } if (!TMR_OFFSET (expr) @@ -3043,25 +3044,54 @@ static bool verify_gimple_call (gimple stmt) { tree fn = gimple_call_fn (stmt); - tree fntype; + tree fntype, fndecl; unsigned i; - if (TREE_CODE (fn) != OBJ_TYPE_REF - && !is_gimple_val (fn)) + if (gimple_call_internal_p (stmt)) + { + if (fn) + { + error ("gimple call has two targets"); + debug_generic_stmt (fn); + return true; + } + } + else + { + if (!fn) + { + error ("gimple call has no target"); + return true; + } + } + + if (fn && !is_gimple_call_addr (fn)) { error ("invalid function in gimple call"); debug_generic_stmt (fn); return true; } - if (!POINTER_TYPE_P (TREE_TYPE (fn)) - || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE)) + if (fn + && (!POINTER_TYPE_P (TREE_TYPE (fn)) + || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))) { error ("non-function in gimple call"); 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))) @@ -3076,8 +3106,9 @@ verify_gimple_call (gimple stmt) return true; } - fntype = TREE_TYPE (TREE_TYPE (fn)); - if (gimple_call_lhs (stmt) + fntype = gimple_call_fntype (stmt); + if (fntype + && gimple_call_lhs (stmt) && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)), TREE_TYPE (fntype)) /* ??? At least C++ misses conversions at assignments from @@ -3193,9 +3224,7 @@ verify_gimple_assign_unary (gimple stmt) tree rhs1 = gimple_assign_rhs1 (stmt); tree rhs1_type = TREE_TYPE (rhs1); - if (!is_gimple_reg (lhs) - && !(optimize == 0 - && TREE_CODE (lhs_type) == COMPLEX_TYPE)) + if (!is_gimple_reg (lhs)) { error ("non-register as LHS of unary operation"); return true; @@ -3351,9 +3380,7 @@ verify_gimple_assign_binary (gimple stmt) tree rhs2 = gimple_assign_rhs2 (stmt); tree rhs2_type = TREE_TYPE (rhs2); - if (!is_gimple_reg (lhs) - && !(optimize == 0 - && TREE_CODE (lhs_type) == COMPLEX_TYPE)) + if (!is_gimple_reg (lhs)) { error ("non-register as LHS of binary operation"); return true; @@ -3618,9 +3645,7 @@ verify_gimple_assign_ternary (gimple stmt) tree rhs3 = gimple_assign_rhs3 (stmt); tree rhs3_type = TREE_TYPE (rhs3); - if (!is_gimple_reg (lhs) - && !(optimize == 0 - && TREE_CODE (lhs_type) == COMPLEX_TYPE)) + if (!is_gimple_reg (lhs)) { error ("non-register as LHS of ternary operation"); return true; @@ -3669,6 +3694,11 @@ verify_gimple_assign_ternary (gimple stmt) } break; + case DOT_PROD_EXPR: + case REALIGN_LOAD_EXPR: + /* FIXME. */ + return false; + default: gcc_unreachable (); } @@ -3799,10 +3829,7 @@ verify_gimple_assign_single (gimple stmt) case OBJ_TYPE_REF: case ASSERT_EXPR: case WITH_SIZE_EXPR: - case POLYNOMIAL_CHREC: - case DOT_PROD_EXPR: case VEC_COND_EXPR: - case REALIGN_LOAD_EXPR: /* FIXME. */ return res; @@ -3916,46 +3943,6 @@ verify_gimple_switch (gimple stmt) } -/* 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. */ @@ -3971,12 +3958,48 @@ verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED) 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_types_in_gimple_stmt (gimple stmt) +verify_gimple_stmt (gimple stmt) { switch (gimple_code (stmt)) { @@ -3984,7 +4007,7 @@ verify_types_in_gimple_stmt (gimple stmt) return verify_gimple_assign (stmt); case GIMPLE_LABEL: - return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL; + return verify_gimple_label (stmt); case GIMPLE_CALL: return verify_gimple_call (stmt); @@ -4020,9 +4043,6 @@ verify_types_in_gimple_stmt (gimple stmt) 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: @@ -4048,10 +4068,74 @@ verify_types_in_gimple_stmt (gimple stmt) } } +/* 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_types_in_gimple_seq_2 (gimple_seq stmts) +verify_gimple_in_seq_2 (gimple_seq stmts) { gimple_stmt_iterator ittr; bool err = false; @@ -4063,25 +4147,25 @@ verify_types_in_gimple_seq_2 (gimple_seq stmts) switch (gimple_code (stmt)) { case GIMPLE_BIND: - err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt)); + err |= verify_gimple_in_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)); + 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_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt)); + err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt)); break; case GIMPLE_CATCH: - err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt)); + err |= verify_gimple_in_seq_2 (gimple_catch_handler (stmt)); break; default: { - bool err2 = verify_types_in_gimple_stmt (stmt); + bool err2 = verify_gimple_stmt (stmt); if (err2) debug_gimple_stmt (stmt); err |= err2; @@ -4095,102 +4179,15 @@ verify_types_in_gimple_seq_2 (gimple_seq stmts) /* Verify the GIMPLE statements inside the statement list STMTS. */ -void -verify_types_in_gimple_seq (gimple_seq stmts) +DEBUG_FUNCTION void +verify_gimple_in_seq (gimple_seq stmts) { - if (verify_types_in_gimple_seq_2 (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); } - -/* 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 @@ -4219,7 +4216,6 @@ tree_node_can_be_shared (tree t) return false; } - /* Called via walk_gimple_stmt. Verify tree sharing. */ static tree @@ -4240,7 +4236,6 @@ verify_node_sharing (tree *tp, int *walk_subtrees, void *data) return NULL; } - static bool eh_error_found; static int verify_eh_throw_stmt_node (void **slot, void *data) @@ -4257,147 +4252,124 @@ verify_eh_throw_stmt_node (void **slot, void *data) return 1; } - -/* Verify the GIMPLE statements in every basic block. */ +/* Verify the GIMPLE statements in the CFG of FN. */ DEBUG_FUNCTION void -verify_stmts (void) +verify_gimple_in_cfg (struct function *fn) { 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) + FOR_EACH_BB_FN (bb, fn) { - gimple phi; - size_t i; + gimple_stmt_iterator gsi; for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - phi = gsi_stmt (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"); - err |= true; + err2 = true; } + err2 |= verify_gimple_phi (phi); + 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); + 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_gimple_stmt (phi); debug_generic_expr (addr); - err |= true; + err2 |= true; } } -#ifdef ENABLE_TYPES_CHECKING - if (verify_gimple_phi (phi)) - { - debug_gimple_stmt (phi); - err |= true; - } -#endif + if (err2) + debug_gimple_stmt (phi); + err |= err2; } - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); ) + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&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; - } + 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"); - debug_gimple_stmt (stmt); - err |= true; + err2 = true; } - if (gimple_code (stmt) == GIMPLE_LABEL) + 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) { - tree decl = gimple_label_label (stmt); - int uid = LABEL_DECL_UID (decl); + error ("incorrect sharing of tree nodes"); + debug_generic_expr (addr); + err2 |= true; + } - if (uid == -1 - || VEC_index (basic_block, label_to_block_map, uid) != bb) + /* ??? 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) { - error ("incorrect entry in label_to_block_map"); - err |= true; + debug_generic_expr (addr); + inform (gimple_location (stmt), "in statement"); + err2 |= true; } + } - uid = EH_LANDING_PAD_NR (decl); - if (uid) + /* 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)) { - 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; - } + 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; } } - 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); + if (err2) + debug_gimple_stmt (stmt); + err |= err2; } } @@ -4407,8 +4379,8 @@ verify_stmts (void) verify_eh_throw_stmt_node, visited_stmts); - if (err | eh_error_found) - internal_error ("verify_stmts failed"); + if (err || eh_error_found) + internal_error ("verify_gimple failed"); pointer_set_destroy (visited); pointer_set_destroy (visited_stmts); @@ -4900,7 +4872,7 @@ gimple_redirect_edge_and_branch (edge e, basic_block dest) { last = cases; CASE_LABEL (cases) = label; - cases = TREE_CHAIN (cases); + cases = CASE_CHAIN (cases); } /* If there was already an edge in the CFG, then we need @@ -4909,8 +4881,8 @@ gimple_redirect_edge_and_branch (edge e, basic_block dest) { tree cases2 = get_cases_for_edge (e2, stmt); - TREE_CHAIN (last) = TREE_CHAIN (cases2); - TREE_CHAIN (cases2) = first; + CASE_CHAIN (last) = CASE_CHAIN (cases2); + CASE_CHAIN (cases2) = first; } bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index); } @@ -5785,7 +5757,7 @@ move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p) old_nr = tree_low_cst (old_t_nr, 0); new_nr = move_stmt_eh_region_nr (old_nr, p); - return build_int_cst (NULL, new_nr); + return build_int_cst (integer_type_node, new_nr); } /* Like move_stmt_op, but for gimple statements. @@ -7184,6 +7156,7 @@ struct cfg_hooks gimple_cfg_hooks = { gimple_split_edge, /* split_edge */ gimple_make_forwarder_block, /* make_forward_block */ NULL, /* tidy_fallthru_edge */ + NULL, /* force_nonfallthru */ gimple_block_ends_with_call_p,/* block_ends_with_call_p */ gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */ gimple_flow_call_edges_add, /* flow_call_edges_add */ @@ -7484,12 +7457,14 @@ do_warn_unused_result (gimple_seq seq) case GIMPLE_CALL: if (gimple_call_lhs (g)) break; + if (gimple_call_internal_p (g)) + break; /* This is a naked call, as opposed to a GIMPLE_CALL with an LHS. All calls whose value is ignored should be represented like this. Look for the attribute. */ fdecl = gimple_call_fndecl (g); - ftype = TREE_TYPE (TREE_TYPE (gimple_call_fn (g))); + ftype = gimple_call_fntype (g); if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype))) { |