This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: rtl_verify_flow_info fix
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Tom de Vries <vries at codesourcery dot com>
- Cc: Eric Botcazou <ebotcazou at adacore dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 5 Sep 2011 10:53:00 +0200
- Subject: Re: rtl_verify_flow_info fix
- References: <4E64885E.7040406@codesourcery.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Mon, Sep 05, 2011 at 10:29:18AM +0200, Tom de Vries wrote:
> Hi Eric,
>
> During testing the approved-for-commit middle-end patch for bug 43864 on ARM, I
> ran into a gcc.dg/torture/pr46068.c ICE.
>
> An asm jump is not recognized as an unconditional jump, so its followed by a
> fall-through block rather than a barrier.
> ...
> (jump_insn 10 9 19 4 (asm_operands/v ("") ("") 0 []
> []
> [
> (label_ref:SI 16)
> ] pr46068.c:16) pr46068.c:6 -1
> (nil)
> -> 16)
> ...
>
> ce3 then turns the asm jump into an asm return, still without a barrier after it:
> ...
> (jump_insn 10 9 19 4 (asm_operands/v ("") ("") 0 []
> []
> [
> (return)
> ] pr46068.c:16) pr46068.c:6 -1
> (nil)
> -> return)
> ...
I'd say the above transformation shouldn't be valid, asm goto is given some
possible labels it can jump to, but what will be emitted when the operand is
RETURN? I think final.c does:
else if (letter == 'l')
output_asm_label (operands[opnum]);
here and when operands[opnum] isn't a label or deleted label, that function
will
output_operand_lossage ("'%%l' operand isn't a label");
You don't get it only because this testcase uses empty inline asm string
and thus doesn't use any of the labels.
Jakub