On Tue, Oct 23, 2012 at 3:03 AM, Jan Hubicka <hubi...@ucw.cz> wrote: >> Ping. >> >> >> On Wed, Oct 17, 2012 at 1:48 PM, Easwaran Raman <era...@google.com> wrote: >> > Hi, >> > This patch fixes bugs introduced by my previous patch to propagate >> > profiles during switch expansion. Bootstrap and profiledbootstrap >> > successful on x86_64. Confirmed that it fixes the crashes reported in >> > PR middle-end/54957. OK for trunk? >> > >> > - Easwaran >> > >> > 2012-10-17 Easwaran Raman <era...@google.com> >> > >> > 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. >> > * except.c (sjlj_emit_function_enter): Remove unused variable. >> > * stmt.c (get_outgoing_edge_probs): Return 0 if BB is NULL. > > Seems fine, but under what conditions you get NULL here?
When expand_sjlj_dispatch_table calls emit_case_dispatch_table, stmt_bb is NULL. - Easwaran > Honza >> > (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. >> > >> > Index: gcc/optabs.c >> > =================================================================== >> > --- gcc/optabs.c (revision 192488) >> > +++ gcc/optabs.c (working copy) >> > @@ -4268,11 +4268,9 @@ emit_cmp_and_jump_insn_1 (rtx test, enum machine_m >> > && 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 >> > Index: gcc/except.c >> > =================================================================== >> > --- gcc/except.c (revision 192488) >> > +++ gcc/except.c (working copy) >> > @@ -1153,7 +1153,7 @@ sjlj_emit_function_enter (rtx dispatch_label) >> > if (dispatch_label) >> > { >> > #ifdef DONT_USE_BUILTIN_SETJMP >> > - rtx x, last; >> > + rtx x; >> > x = emit_library_call_value (setjmp_libfunc, NULL_RTX, >> > LCT_RETURNS_TWICE, >> > TYPE_MODE (integer_type_node), 1, >> > plus_constant (Pmode, XEXP (fc, 0), >> > Index: gcc/stmt.c >> > =================================================================== >> > --- gcc/stmt.c (revision 192488) >> > +++ gcc/stmt.c (working copy) >> > @@ -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 in >> > 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 in >> > 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); >> > }