This corresponds to: [PATCH 62/89] Concretize gimple_label_label https://gcc.gnu.org/ml/gcc-patches/2014-04/msg01210.html from the original 89-patch kit
That earlier patch was approved by Jeff: > OK once prereqs go in. in https://gcc.gnu.org/ml/gcc-patches/2014-05/msg00878.html gcc/ * gimple.h (gimple_label_label): Require a const_gimple_label rather than just a const_gimple. * cfgexpand.c (label_rtx_for_bb): Convert local from gimple to gimple_label, replacing a check against GIMPLE_LABEL with a dyn_cast<gimple_label>. * predict.c (tree_estimate_probability_bb): Likewise. * tree-cfg.c (make_edges): Likewise. (cleanup_dead_labels): Likewise (twice). (gimple_can_merge_blocks_p): Likewise. (gimple_block_label): Likewise. * tree-eh.c (unsplit_eh): Likewise. (cleanup_empty_eh_unsplit): Likewise. * tree-inline.c (mark_local_labels_stmt): Likewise. * tree-nested.c (convert_nl_goto_receiver): Likewise. * cfgexpand.c (expand_gimple_stmt_1): Add a checked cast to gimple_label when invoking gimple_label_label in a region where we've checked the code is GIMPLE_LABEL. * gimple-pretty-print.c (pp_cfg_jump): Likewise. * gimple.c (gimple_set_bb): Likewise. * ipa-pure-const.c (check_stmt): Likewise. * omp-low.c (diagnose_sb_1): Likewise. * tree-cfg.c (gimple_verify_flow_info): Likewise. * tree-cfgcleanup.c (tree_forwarder_block_p): Likewise. (remove_forwarder_block): Likewise. * tree-eh.c (collect_finally_tree): Likewise. * ipa-split.c (verify_non_ssa_vars): Replace a check against GIMPLE_LABEL with a dyn_cast<gimple_label>, introducing a gimple_label local. * tree-cfg.c (gimple_can_merge_blocks_p): Likewise. (gimple_merge_blocks): Likewise. (remove_bb): Likewise. (stmt_starts_bb_p): Likewise. (gimple_verify_flow_info): Likewise. (move_block_to_fn): Likewise. * tree-cfgcleanup.c (remove_forwarder_block): Likewise. (remove_forwarder_block_with_phi): Likewise. * tree-ssa-ccp.c (optimize_unreachable): Likewise. --- gcc/ChangeLog.gimple-classes | 45 +++++++++++++++++++++++++++ gcc/cfgexpand.c | 9 +++--- gcc/gimple-pretty-print.c | 4 ++- gcc/gimple.c | 2 +- gcc/gimple.h | 3 +- gcc/ipa-pure-const.c | 2 +- gcc/ipa-split.c | 31 ++++++++++--------- gcc/omp-low.c | 4 ++- gcc/predict.c | 7 +++-- gcc/tree-cfg.c | 73 +++++++++++++++++++++++--------------------- gcc/tree-cfgcleanup.c | 22 ++++++------- gcc/tree-eh.c | 12 ++++---- gcc/tree-inline.c | 4 +-- gcc/tree-nested.c | 4 +-- gcc/tree-ssa-ccp.c | 4 +-- 15 files changed, 141 insertions(+), 85 deletions(-) diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes index 5cf1049..20deecf 100644 --- a/gcc/ChangeLog.gimple-classes +++ b/gcc/ChangeLog.gimple-classes @@ -1,5 +1,50 @@ 2014-10-24 David Malcolm <dmalc...@redhat.com> + Concretize gimple_label_label + + * gimple.h (gimple_label_label): Require a const_gimple_label + rather than just a const_gimple. + + * cfgexpand.c (label_rtx_for_bb): Convert local from gimple to + gimple_label, replacing a check against GIMPLE_LABEL with a + dyn_cast<gimple_label>. + * predict.c (tree_estimate_probability_bb): Likewise. + * tree-cfg.c (make_edges): Likewise. + (cleanup_dead_labels): Likewise (twice). + (gimple_can_merge_blocks_p): Likewise. + (gimple_block_label): Likewise. + * tree-eh.c (unsplit_eh): Likewise. + (cleanup_empty_eh_unsplit): Likewise. + * tree-inline.c (mark_local_labels_stmt): Likewise. + * tree-nested.c (convert_nl_goto_receiver): Likewise. + + * cfgexpand.c (expand_gimple_stmt_1): Add a checked cast to + gimple_label when invoking gimple_label_label in a region where + we've checked the code is GIMPLE_LABEL. + * gimple-pretty-print.c (pp_cfg_jump): Likewise. + * gimple.c (gimple_set_bb): Likewise. + * ipa-pure-const.c (check_stmt): Likewise. + * omp-low.c (diagnose_sb_1): Likewise. + * tree-cfg.c (gimple_verify_flow_info): Likewise. + * tree-cfgcleanup.c (tree_forwarder_block_p): Likewise. + (remove_forwarder_block): Likewise. + * tree-eh.c (collect_finally_tree): Likewise. + + * ipa-split.c (verify_non_ssa_vars): Replace a check against + GIMPLE_LABEL with a dyn_cast<gimple_label>, introducing a + gimple_label local. + * tree-cfg.c (gimple_can_merge_blocks_p): Likewise. + (gimple_merge_blocks): Likewise. + (remove_bb): Likewise. + (stmt_starts_bb_p): Likewise. + (gimple_verify_flow_info): Likewise. + (move_block_to_fn): Likewise. + * tree-cfgcleanup.c (remove_forwarder_block): Likewise. + (remove_forwarder_block_with_phi): Likewise. + * tree-ssa-ccp.c (optimize_unreachable): Likewise. + +2014-10-24 David Malcolm <dmalc...@redhat.com> + Concretize gimple_call_use_set and gimple_call_clobber_set * gimple.h (gimple_call_use_set): Require a gimple_call. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index d93c888..4287232 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1983,7 +1983,6 @@ label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED) { gimple_stmt_iterator gsi; tree lab; - gimple lab_stmt; if (bb->flags & BB_RTL) return block_label (bb); @@ -1996,8 +1995,10 @@ label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - lab_stmt = gsi_stmt (gsi); - if (gimple_code (lab_stmt) != GIMPLE_LABEL) + gimple_label lab_stmt; + + lab_stmt = dyn_cast <gimple_label> (gsi_stmt (gsi)); + if (!lab_stmt) break; lab = gimple_label_label (lab_stmt); @@ -3203,7 +3204,7 @@ expand_gimple_stmt_1 (gimple stmt) expand_computed_goto (op0); break; case GIMPLE_LABEL: - expand_label (gimple_label_label (stmt)); + expand_label (gimple_label_label (as_a <gimple_label> (stmt))); break; case GIMPLE_NOP: case GIMPLE_PREDICT: diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index a90d2ef..40e79b1 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -2348,7 +2348,9 @@ pp_cfg_jump (pretty_printer *buffer, basic_block bb) if (stmt && gimple_code (stmt) == GIMPLE_LABEL) { pp_string (buffer, " ("); - dump_generic_node (buffer, gimple_label_label (stmt), 0, 0, false); + dump_generic_node (buffer, + gimple_label_label (as_a <gimple_label> (stmt)), + 0, 0, false); pp_right_paren (buffer); pp_semicolon (buffer); } diff --git a/gcc/gimple.c b/gcc/gimple.c index f99ee0f..8721316 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -1514,7 +1514,7 @@ gimple_set_bb (gimple stmt, basic_block bb) tree t; int uid; - t = gimple_label_label (stmt); + t = gimple_label_label (as_a <gimple_label> (stmt)); uid = LABEL_DECL_UID (t); if (uid == -1) { diff --git a/gcc/gimple.h b/gcc/gimple.h index 6055e33..1a017ca 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -3205,9 +3205,8 @@ gimple_cond_set_condition (gimple_cond stmt, enum tree_code code, tree lhs, /* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS. */ static inline tree -gimple_label_label (const_gimple gs) +gimple_label_label (const_gimple_label gs) { - GIMPLE_CHECK (gs, GIMPLE_LABEL); return gimple_op (gs, 0); } diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 8375381..ebf53dd 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -689,7 +689,7 @@ check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa) check_call (local, as_a <gimple_call> (stmt), ipa); break; case GIMPLE_LABEL: - if (DECL_NONLOCAL (gimple_label_label (stmt))) + if (DECL_NONLOCAL (gimple_label_label (as_a <gimple_label> (stmt)))) /* Target of long jump. */ { if (dump_file) diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 5678251..59901dc 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -252,13 +252,13 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, ok = false; goto done; } - if (gimple_code (stmt) == GIMPLE_LABEL - && test_nonssa_use (stmt, gimple_label_label (stmt), - NULL_TREE, non_ssa_vars)) - { - ok = false; - goto done; - } + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) + if (test_nonssa_use (stmt, gimple_label_label (label_stmt), + NULL_TREE, non_ssa_vars)) + { + ok = false; + goto done; + } } for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) { @@ -300,15 +300,18 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, { gimple_stmt_iterator bsi; for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) - if (gimple_code (gsi_stmt (bsi)) == GIMPLE_LABEL - && test_nonssa_use (gsi_stmt (bsi), - gimple_label_label (gsi_stmt (bsi)), - NULL_TREE, non_ssa_vars)) + if (gimple_label label_stmt = + dyn_cast <gimple_label> (gsi_stmt (bsi))) { - ok = false; - goto done; + if (test_nonssa_use (label_stmt, + gimple_label_label (label_stmt), + NULL_TREE, non_ssa_vars)) + { + ok = false; + goto done; + } } - else if (gimple_code (gsi_stmt (bsi)) != GIMPLE_LABEL) + else break; } diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 7b4e325..6174c3f 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -10860,7 +10860,9 @@ diagnose_sb_1 (gimple_stmt_iterator *gsi_p, bool *handled_ops_p, break; case GIMPLE_LABEL: - splay_tree_insert (all_labels, (splay_tree_key) gimple_label_label (stmt), + splay_tree_insert (all_labels, + (splay_tree_key) gimple_label_label ( + as_a <gimple_label> (stmt)), (splay_tree_value) context); break; diff --git a/gcc/predict.c b/gcc/predict.c index bd3f138..5e8a0e9 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2275,12 +2275,13 @@ tree_estimate_probability_bb (basic_block bb) gimple_stmt_iterator gi; for (gi = gsi_start_bb (e->dest); !gsi_end_p (gi); gsi_next (&gi)) { - gimple stmt = gsi_stmt (gi); + gimple_label label_stmt = + dyn_cast <gimple_label> (gsi_stmt (gi)); tree decl; - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!label_stmt) break; - decl = gimple_label_label (stmt); + decl = gimple_label_label (label_stmt); if (DECL_ARTIFICIAL (decl)) continue; diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index be4c00e..b0d94ee 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -909,10 +909,11 @@ make_edges (void) { for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple label_stmt = gsi_stmt (gsi); + gimple_label label_stmt = + dyn_cast <gimple_label> (gsi_stmt (gsi)); tree target; - if (gimple_code (label_stmt) != GIMPLE_LABEL) + if (!label_stmt) break; target = gimple_label_label (label_stmt); @@ -1373,12 +1374,12 @@ cleanup_dead_labels (void) for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i)) { tree label; - gimple stmt = gsi_stmt (i); + gimple_label label_stmt = dyn_cast <gimple_label> (gsi_stmt (i)); - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!label_stmt) break; - label = gimple_label_label (stmt); + label = gimple_label_label (label_stmt); /* If we have not yet seen a label for the current block, remember this one and see if there are more labels. */ @@ -1513,12 +1514,12 @@ cleanup_dead_labels (void) for (i = gsi_start_bb (bb); !gsi_end_p (i); ) { tree label; - gimple stmt = gsi_stmt (i); + gimple_label label_stmt = dyn_cast <gimple_label> (gsi_stmt (i)); - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!label_stmt) break; - label = gimple_label_label (stmt); + label = gimple_label_label (label_stmt); if (label == label_for_this_bb || !DECL_ARTIFICIAL (label) @@ -1660,19 +1661,19 @@ gimple_can_merge_blocks_p (basic_block a, basic_block b) return false; /* Do not allow a block with only a non-local label to be merged. */ - if (stmt - && gimple_code (stmt) == GIMPLE_LABEL - && DECL_NONLOCAL (gimple_label_label (stmt))) - return false; + if (stmt) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) + if (DECL_NONLOCAL (gimple_label_label (label_stmt))) + return false; /* Examine the labels at the beginning of B. */ for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi)) { tree lab; - stmt = gsi_stmt (gsi); - if (gimple_code (stmt) != GIMPLE_LABEL) + gimple_label label_stmt = dyn_cast <gimple_label> (gsi_stmt (gsi)); + if (!label_stmt) break; - lab = gimple_label_label (stmt); + lab = gimple_label_label (label_stmt); /* Do not remove user forced labels or for -O0 any user labels. */ if (!DECL_ARTIFICIAL (lab) && (!optimize || FORCED_LABEL (lab))) @@ -1872,9 +1873,9 @@ gimple_merge_blocks (basic_block a, basic_block b) for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);) { gimple stmt = gsi_stmt (gsi); - if (gimple_code (stmt) == GIMPLE_LABEL) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) { - tree label = gimple_label_label (stmt); + tree label = gimple_label_label (label_stmt); int lp_nr; gsi_remove (&gsi, false); @@ -2032,9 +2033,10 @@ remove_bb (basic_block bb) for (i = gsi_last_bb (bb); !gsi_end_p (i);) { gimple stmt = gsi_stmt (i); - if (gimple_code (stmt) == GIMPLE_LABEL - && (FORCED_LABEL (gimple_label_label (stmt)) - || DECL_NONLOCAL (gimple_label_label (stmt)))) + gimple_label label_stmt = dyn_cast <gimple_label> (stmt); + if (label_stmt + && (FORCED_LABEL (gimple_label_label (label_stmt)) + || DECL_NONLOCAL (gimple_label_label (label_stmt)))) { basic_block new_bb; gimple_stmt_iterator new_gsi; @@ -2042,10 +2044,10 @@ remove_bb (basic_block bb) /* A non-reachable non-local label may still be referenced. But it no longer needs to carry the extra semantics of non-locality. */ - if (DECL_NONLOCAL (gimple_label_label (stmt))) + if (DECL_NONLOCAL (gimple_label_label (label_stmt))) { - DECL_NONLOCAL (gimple_label_label (stmt)) = 0; - FORCED_LABEL (gimple_label_label (stmt)) = 1; + DECL_NONLOCAL (gimple_label_label (label_stmt)) = 0; + FORCED_LABEL (gimple_label_label (label_stmt)) = 1; } new_bb = bb->prev_bb; @@ -2467,16 +2469,17 @@ stmt_starts_bb_p (gimple stmt, gimple prev_stmt) /* Labels start a new basic block only if the preceding statement wasn't a label of the same type. This prevents the creation of consecutive blocks that have nothing but a single label. */ - if (gimple_code (stmt) == GIMPLE_LABEL) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) { /* Nonlocal and computed GOTO targets always start a new block. */ - if (DECL_NONLOCAL (gimple_label_label (stmt)) - || FORCED_LABEL (gimple_label_label (stmt))) + if (DECL_NONLOCAL (gimple_label_label (label_stmt)) + || FORCED_LABEL (gimple_label_label (label_stmt))) return true; if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL) { - if (DECL_NONLOCAL (gimple_label_label (prev_stmt))) + if (DECL_NONLOCAL (gimple_label_label ( + as_a <gimple_label> (prev_stmt)))) return true; cfg_stats.num_merged_labels++; @@ -5081,7 +5084,7 @@ gimple_verify_flow_info (void) if (gimple_code (stmt) != GIMPLE_LABEL) break; - label = gimple_label_label (stmt); + label = gimple_label_label (as_a <gimple_label> (stmt)); if (prev_stmt && DECL_NONLOCAL (label)) { error ("nonlocal label "); @@ -5134,10 +5137,10 @@ gimple_verify_flow_info (void) if (stmt_ends_bb_p (stmt)) found_ctrl_stmt = true; - if (gimple_code (stmt) == GIMPLE_LABEL) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) { error ("label "); - print_generic_expr (stderr, gimple_label_label (stmt), 0); + print_generic_expr (stderr, gimple_label_label (label_stmt), 0); fprintf (stderr, " in the middle of basic block %d", bb->index); err = 1; } @@ -5396,12 +5399,12 @@ gimple_block_label (basic_block bb) gimple_stmt_iterator i, s = gsi_start_bb (bb); bool first = true; tree label; - gimple stmt; + gimple_label stmt; for (i = s; !gsi_end_p (i); first = false, gsi_next (&i)) { - stmt = gsi_stmt (i); - if (gimple_code (stmt) != GIMPLE_LABEL) + stmt = dyn_cast <gimple_label> (gsi_stmt (i)); + if (!stmt) break; label = gimple_label_label (stmt); if (!DECL_NONLOCAL (label)) @@ -6692,9 +6695,9 @@ move_block_to_fn (struct function *dest_cfun, basic_block bb, wi.info = d; walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi); - if (gimple_code (stmt) == GIMPLE_LABEL) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) { - tree label = gimple_label_label (stmt); + tree label = gimple_label_label (label_stmt); int uid = LABEL_DECL_UID (label); gcc_assert (uid > -1); diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index f4abe53..7ec9145 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -309,7 +309,7 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted) switch (gimple_code (stmt)) { case GIMPLE_LABEL: - if (DECL_NONLOCAL (gimple_label_label (stmt))) + if (DECL_NONLOCAL (gimple_label_label (as_a <gimple_label> (stmt)))) return false; if (optimize == 0 && gimple_location (stmt) != locus) return false; @@ -406,11 +406,11 @@ remove_forwarder_block (basic_block bb) /* If the destination block consists of a nonlocal label or is a EH landing pad, do not merge it. */ label = first_stmt (dest); - if (label - && gimple_code (label) == GIMPLE_LABEL - && (DECL_NONLOCAL (gimple_label_label (label)) - || EH_LANDING_PAD_NR (gimple_label_label (label)) != 0)) - return false; + if (label) + if (gimple_label label_stmt = dyn_cast <gimple_label> (label)) + if (DECL_NONLOCAL (gimple_label_label (label_stmt)) + || EH_LANDING_PAD_NR (gimple_label_label (label_stmt)) != 0) + return false; /* If there is an abnormal edge to basic block BB, but not into dest, problems might occur during removal of the phi node at out @@ -492,7 +492,7 @@ remove_forwarder_block (basic_block bb) label = gsi_stmt (gsi); if (is_gimple_debug (label)) break; - decl = gimple_label_label (label); + decl = gimple_label_label (as_a <gimple_label> (label)); if (EH_LANDING_PAD_NR (decl) != 0 || DECL_NONLOCAL (decl) || FORCED_LABEL (decl) @@ -840,10 +840,10 @@ remove_forwarder_block_with_phi (basic_block bb) /* If the destination block consists of a nonlocal label, do not merge it. */ label = first_stmt (dest); - if (label - && gimple_code (label) == GIMPLE_LABEL - && DECL_NONLOCAL (gimple_label_label (label))) - return false; + if (label) + if (gimple_label label_stmt = dyn_cast <gimple_label> (label)) + if (DECL_NONLOCAL (gimple_label_label (label_stmt))) + return false; /* Record BB's single pred in case we need to update the father loop's latch information later. */ diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 1138696..b496c08 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -243,7 +243,7 @@ collect_finally_tree (gimple stmt, gimple_try region) switch (gimple_code (stmt)) { case GIMPLE_LABEL: - temp.t = gimple_label_label (stmt); + temp.t = gimple_label_label (as_a <gimple_label> (stmt)); record_in_finally_tree (temp, region); break; @@ -4004,13 +4004,13 @@ unsplit_eh (eh_landing_pad lp) for a different region. */ for (gsi = gsi_start_bb (e_out->dest); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple stmt = gsi_stmt (gsi); + gimple_label label_stmt = dyn_cast <gimple_label> (gsi_stmt (gsi)); tree lab; int lp_nr; - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!label_stmt) break; - lab = gimple_label_label (stmt); + lab = gimple_label_label (label_stmt); lp_nr = EH_LANDING_PAD_NR (lab); if (lp_nr && get_eh_region_from_lp_number (lp_nr) != lp->region) return false; @@ -4275,10 +4275,10 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp) lab = NULL; for (gsi = gsi_start_bb (e_out->dest); !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple stmt = gsi_stmt (gsi); + gimple_label stmt = dyn_cast <gimple_label> (gsi_stmt (gsi)); int lp_nr; - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!stmt) break; lab = gimple_label_label (stmt); lp_nr = EH_LANDING_PAD_NR (lab); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index a95aa09..945614a 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4839,9 +4839,9 @@ mark_local_labels_stmt (gimple_stmt_iterator *gsip, struct walk_stmt_info *wi) { copy_body_data *id = (copy_body_data *) wi->info; - gimple stmt = gsi_stmt (*gsip); + gimple_label stmt = dyn_cast <gimple_label> (gsi_stmt (*gsip)); - if (gimple_code (stmt) == GIMPLE_LABEL) + if (stmt) { tree decl = gimple_label_label (stmt); diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index e6f5c1a..3957e11 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -2136,9 +2136,9 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p, struct nesting_info *const info = (struct nesting_info *) wi->info; tree label, new_label; gimple_stmt_iterator tmp_gsi; - gimple stmt = gsi_stmt (*gsi); + gimple_label stmt = dyn_cast <gimple_label> (gsi_stmt (*gsi)); - if (gimple_code (stmt) != GIMPLE_LABEL) + if (!stmt) { *handled_ops_p = false; return NULL_TREE; diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 6650d3c..3a5632f 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -2564,10 +2564,10 @@ optimize_unreachable (gimple_stmt_iterator i) if (is_gimple_debug (stmt)) continue; - if (gimple_code (stmt) == GIMPLE_LABEL) + if (gimple_label label_stmt = dyn_cast <gimple_label> (stmt)) { /* Verify we do not need to preserve the label. */ - if (FORCED_LABEL (gimple_label_label (stmt))) + if (FORCED_LABEL (gimple_label_label (label_stmt))) return false; continue; -- 1.8.5.3