[PATCH] check_cfg assert fix
Tom de Vries
vries@codesourcery.com
Tue Sep 6 09:15:00 GMT 2011
Hi,
During testing the approved-for-commit middle-end patch for bug 43864 on ARM, I
ran into a gcc.dg/torture/pr46068.c ICE.
The following assert in haifa-sched.c:check_cfg triggered:
...
else if (any_condjump_p (head))
gcc_assert (/* Usual case. */
(EDGE_COUNT (bb->succs) > 1
&& !BARRIER_P (NEXT_INSN (head)))
/* Or jump to the next instruction. */
|| (EDGE_COUNT (bb->succs) == 1
&& (BB_HEAD (EDGE_I (bb->succs, 0)->dest)
== JUMP_LABEL (head))));
...
It triggered on this rtl, a conditional return followed by a barrier:
...
(jump_insn 44 43 93 7 (set (pc)
(if_then_else (ne (reg:CC 24 cc)
(const_int 0 [0]))
(return)
(pc))) gcc/testsuite/gcc.dg/builtin-unreachable-4.c:13 249
{*cond_return}
(expr_list:REG_DEAD (reg:CC 24 cc)
(expr_list:REG_BR_PROB (const_int 9996 [0x270c])
(nil)))
-> return)
(barrier 93 44 92)
...
Although this insn sequence is non-optimal (the conditional return can be
optimized to an unconditional one, given that it's followed by a barrier), it's
not incorrect. The patch fixes this ICE by removing the check for the
'EDGE_COUNT (bb->succs) == 1' case.
Bootstrapped and reg-tested on x86_64 and build and reg-tested on arm.
OK for trunk?
Thanks,
- Tom
2011-09-05 Tom de Vries <tom@codesourcery.com>
* haifa-sched.c (check_cfg): Remove restriction on conditional jump if
the containing block has only 1 outgoing edge.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: check_cfg-fix.patch
Type: text/x-patch
Size: 1074 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110906/e70dd1e4/attachment.bin>
More information about the Gcc-patches
mailing list