re PR rtl-optimization/53589 (ICE in maybe_record_trace_start with asm goto)

PR rtl-optimization/53589
	* cfgrtl.c (force_nonfallthru_and_redirect): Do asm_goto_edge
	discovery even when e->dest != target.  If any LABEL_REF points
	to e->dest label, redirect it to target's label.

	* gcc.dg/torture/pr53589.c: New test.

From-SVN: r188428
This commit is contained in:
Jakub Jelinek 2012-06-12 09:52:47 +02:00 committed by Jakub Jelinek
parent ed6a1ff987
commit 891ca07d49
4 changed files with 33 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2012-06-12 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/53589
* cfgrtl.c (force_nonfallthru_and_redirect): Do asm_goto_edge
discovery even when e->dest != target. If any LABEL_REF points
to e->dest label, redirect it to target's label.
2012-06-12 Chung-Lin Tang <cltang@codesourcery.com>
* config/sh/sh.c (output_stack_adjust): Remove !epilogue_p

View File

@ -1293,21 +1293,21 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
}
/* If e->src ends with asm goto, see if any of the ASM_OPERANDS_LABELs
don't point to target label. */
don't point to the target or fallthru label. */
if (JUMP_P (BB_END (e->src))
&& target != EXIT_BLOCK_PTR
&& e->dest == target
&& (e->flags & EDGE_FALLTHRU)
&& (note = extract_asm_operands (PATTERN (BB_END (e->src)))))
{
int i, n = ASM_OPERANDS_LABEL_LENGTH (note);
for (i = 0; i < n; ++i)
if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target))
{
{
if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (e->dest))
XEXP (ASM_OPERANDS_LABEL (note, i), 0) = block_label (target);
if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target))
asm_goto_edge = true;
break;
}
}
}
if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags || asm_goto_edge)

View File

@ -1,3 +1,8 @@
2012-06-12 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/53589
* gcc.dg/torture/pr53589.c: New test.
2012-06-12 Oleg Endo <olegendo@gcc.gnu.org>
PR target/50749

View File

@ -0,0 +1,15 @@
/* PR rtl-optimization/53589 */
/* { dg-do compile } */
extern void foo (void) __attribute__ ((__noreturn__));
void
bar (int x)
{
if (x < 0)
foo ();
if (x == 0)
return;
__asm goto ("# %l[lab]" : : : : lab);
lab:;
}