diff options
author | Jakub Jelinek <jakub@redhat.com> | 2004-01-11 20:05:34 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2004-01-11 20:05:34 +0100 |
commit | 1759c760db915101087a28efb4329fa6490eaef8 (patch) | |
tree | f8df1ff5a1cf6f5e7d38cc52a45a081d1bab8229 /gcc/builtins.c | |
parent | b74a685105cac1e0f92628a8f8db16dbc84619b2 (diff) | |
download | gcc-1759c760db915101087a28efb4329fa6490eaef8.zip gcc-1759c760db915101087a28efb4329fa6490eaef8.tar.gz gcc-1759c760db915101087a28efb4329fa6490eaef8.tar.bz2 |
re PR middle-end/13392 (ICE in convert_from_eh_region_ranges_1, at except.c:1133)
PR middle-end/13392
* builtins.c (expand_builtin_expect_jump): Handle conditional jumps
to drop through label. Don't fall back to SCC even when conditional
jump has not been found.
* g++.dg/opt/expect2.C: New test.
From-SVN: r75684
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 2660396..10c753b 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4441,39 +4441,24 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label) if (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE && (integer_zerop (arg1) || integer_onep (arg1))) { - int num_jumps = 0; - int save_pending_stack_adjust = pending_stack_adjust; - rtx insn; - - /* If we fail to locate an appropriate conditional jump, we'll - fall back to normal evaluation. Ensure that the expression - can be re-evaluated. */ - switch (unsafe_for_reeval (arg0)) - { - case 0: /* Safe. */ - break; - - case 1: /* Mildly unsafe. */ - arg0 = unsave_expr (arg0); - break; - - case 2: /* Wildly unsafe. */ - return NULL_RTX; - } + rtx insn, drop_through_label; /* Expand the jump insns. */ start_sequence (); do_jump (arg0, if_false_label, if_true_label); ret = get_insns (); + + drop_through_label = get_last_insn (); + if (drop_through_label && GET_CODE (drop_through_label) == NOTE) + drop_through_label = prev_nonnote_insn (drop_through_label); + if (drop_through_label && GET_CODE (drop_through_label) != CODE_LABEL) + drop_through_label = NULL_RTX; end_sequence (); - /* For mildly unsafe builtin jump's, if unsave_expr_now - creates a new tree instead of changing the old one - TREE_VALUE (arglist) needs to be updated. */ - if (arg0 != TREE_VALUE (arglist) - && TREE_CODE (arg0) == UNSAVE_EXPR - && TREE_OPERAND (arg0, 0) != TREE_VALUE (arglist)) - TREE_VALUE (arglist) = TREE_OPERAND (arg0, 0); + if (! if_true_label) + if_true_label = drop_through_label; + if (! if_false_label) + if_false_label = drop_through_label; /* Now that the __builtin_expect has been validated, go through and add the expect's to each of the conditional jumps. If we run into an @@ -4531,21 +4516,12 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label) else if (label != if_true_label) goto do_next_insn; - num_jumps++; predict_insn_def (insn, PRED_BUILTIN_EXPECT, taken); } do_next_insn: insn = next; } - - /* If no jumps were modified, fail and do __builtin_expect the normal - way. */ - if (num_jumps == 0) - { - ret = NULL_RTX; - pending_stack_adjust = save_pending_stack_adjust; - } } return ret; |