From 0f379f762d2f3e7f84c038368b9e32c50c8deaab Mon Sep 17 00:00:00 2001 From: Easwaran Raman Date: Wed, 31 Oct 2012 23:28:45 +0000 Subject: [PATCH] re PR target/54938 (sh libgcc_unpack_df.o fails to build: ../../../srcw/libgcc/fp-bit.h:221:19: internal compiler error: in emit_cmp_and_jump_insn_1, at optabs.c:4273) 2012-10-31 Easwaran Raman PR target/54938 PR middle-end/54957 * optabs.c (emit_cmp_and_jump_insn_1): Add REG_BR_PROB note only if it doesn't already exist. * stmt.c (get_outgoing_edge_probs): Return 0 if BB is NULL. (emit_case_dispatch_table): Handle the case where STMT_BB is NULL. (expand_sjlj_dispatch_table): Pass BB containing before_case to emit_case_dispatch_table. From-SVN: r193052 --- gcc/ChangeLog | 12 ++++++++++++ gcc/optabs.c | 8 +++----- gcc/stmt.c | 12 ++++++++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ead3e1ae632..21fd7265c6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2012-10-31 Easwaran Raman + + PR target/54938 + PR middle-end/54957 + * optabs.c (emit_cmp_and_jump_insn_1): Add REG_BR_PROB note + only if it doesn't already exist. + * stmt.c (get_outgoing_edge_probs): Return 0 if BB is NULL. + (emit_case_dispatch_table): Handle the case where STMT_BB is + NULL. + (expand_sjlj_dispatch_table): Pass BB containing before_case + to emit_case_dispatch_table. + 2012-10-31 Lawrence Crowl * is-a.h: New. diff --git a/gcc/optabs.c b/gcc/optabs.c index e22031615fa..bba93c2d561 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -4268,11 +4268,9 @@ emit_cmp_and_jump_insn_1 (rtx test, enum machine_mode mode, rtx label, int prob) && profile_status != PROFILE_ABSENT && insn && JUMP_P (insn) - && any_condjump_p (insn)) - { - gcc_assert (!find_reg_note (insn, REG_BR_PROB, 0)); - add_reg_note (insn, REG_BR_PROB, GEN_INT (prob)); - } + && any_condjump_p (insn) + && !find_reg_note (insn, REG_BR_PROB, 0)) + add_reg_note (insn, REG_BR_PROB, GEN_INT (prob)); } /* Generate code to compare X with Y so that the condition codes are diff --git a/gcc/stmt.c b/gcc/stmt.c index 14a28abcc58..b84fa670e70 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -1867,6 +1867,8 @@ get_outgoing_edge_probs (basic_block bb) edge e; edge_iterator ei; int prob_sum = 0; + if (!bb) + return 0; FOR_EACH_EDGE(e, ei, bb->succs) prob_sum += e->probability; return prob_sum; @@ -1916,8 +1918,8 @@ emit_case_dispatch_table (tree index_expr, tree index_type, rtx fallback_label = label_rtx (case_list->code_label); rtx table_label = gen_label_rtx (); bool has_gaps = false; - edge default_edge = EDGE_SUCC(stmt_bb, 0); - int default_prob = default_edge->probability; + edge default_edge = stmt_bb ? EDGE_SUCC(stmt_bb, 0) : NULL; + int default_prob = default_edge ? default_edge->probability : 0; int base = get_outgoing_edge_probs (stmt_bb); bool try_with_tablejump = false; @@ -1997,7 +1999,8 @@ emit_case_dispatch_table (tree index_expr, tree index_type, default_prob = 0; } - default_edge->probability = default_prob; + if (default_edge) + default_edge->probability = default_prob; /* We have altered the probability of the default edge. So the probabilities of all other edges need to be adjusted so that it sums up to @@ -2289,7 +2292,8 @@ expand_sjlj_dispatch_table (rtx dispatch_index, emit_case_dispatch_table (index_expr, index_type, case_list, default_label, - minval, maxval, range, NULL); + minval, maxval, range, + BLOCK_FOR_INSN (before_case)); emit_label (default_label); free_alloc_pool (case_node_pool); } -- 2.30.2