Commit 1759c760 by Jakub Jelinek Committed by Jakub Jelinek

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
parent b74a6851
2004-01-11 Jakub Jelinek <jakub@redhat.com>
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.
2004-01-11 Jan Hubicka <jh@suse.cz> 2004-01-11 Jan Hubicka <jh@suse.cz>
* invoke.texi: Fix syntax error in previous patch. * invoke.texi: Fix syntax error in previous patch.
......
...@@ -4441,39 +4441,24 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -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 if (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
&& (integer_zerop (arg1) || integer_onep (arg1))) && (integer_zerop (arg1) || integer_onep (arg1)))
{ {
int num_jumps = 0; rtx insn, drop_through_label;
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;
}
/* Expand the jump insns. */ /* Expand the jump insns. */
start_sequence (); start_sequence ();
do_jump (arg0, if_false_label, if_true_label); do_jump (arg0, if_false_label, if_true_label);
ret = get_insns (); 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 (); end_sequence ();
/* For mildly unsafe builtin jump's, if unsave_expr_now if (! if_true_label)
creates a new tree instead of changing the old one if_true_label = drop_through_label;
TREE_VALUE (arglist) needs to be updated. */ if (! if_false_label)
if (arg0 != TREE_VALUE (arglist) if_false_label = drop_through_label;
&& TREE_CODE (arg0) == UNSAVE_EXPR
&& TREE_OPERAND (arg0, 0) != TREE_VALUE (arglist))
TREE_VALUE (arglist) = TREE_OPERAND (arg0, 0);
/* Now that the __builtin_expect has been validated, go through and add /* 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 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) ...@@ -4531,21 +4516,12 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label)
else if (label != if_true_label) else if (label != if_true_label)
goto do_next_insn; goto do_next_insn;
num_jumps++;
predict_insn_def (insn, PRED_BUILTIN_EXPECT, taken); predict_insn_def (insn, PRED_BUILTIN_EXPECT, taken);
} }
do_next_insn: do_next_insn:
insn = next; 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; return ret;
......
2004-01-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/13392
* g++.dg/opt/expect2.C: New test.
2004-01-10 Zack Weinberg <zack@codesourcery.com> 2004-01-10 Zack Weinberg <zack@codesourcery.com>
* gcc.dg/Wshadow-1.c, gcc.dg/attr-noinline.c, gcc.dg/decl3.c * gcc.dg/Wshadow-1.c, gcc.dg/attr-noinline.c, gcc.dg/decl3.c
......
// PR c++/13392
// { dg-do compile }
// { dg-options "-O0" }
extern "C" void abort (void);
struct X { ~X () throw() {} };
bool foo (X s = X ()) { return false; }
void bar ()
{
__builtin_expect (foo () && true, 1) ? 0 : (abort (), 0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment