[PATCH] sched-ebb.c: avoid moving table jumps (PR rtl-optimization/88423)
Segher Boessenkool
segher@kernel.crashing.org
Thu Jan 24 21:13:00 GMT 2019
On Thu, Jan 24, 2019 at 06:43:38PM +0300, Alexander Monakov wrote:
> On Wed, 23 Jan 2019, Alexander Monakov wrote:
>
> > It appears that sched-deps tries to take notice of a barrier after a jump, but
> > similarly to sched-ebb doesn't anticipate that for a tablejump the barrier will
> > appear after two more insns (a code_label and a jump_table_data).
> >
> > If so, it needs a fixup just like the posted change for the assert. I'll fire up
> > a bootstrap/regtest.
>
> Updated patch below (now taking into account that NEXT_INSN may give NULL)
> passes bootstrap/regtest on x86_64, also with -fsched2-use-superblocks.
>
> I'm surprised to learn that a tablejump may be not the final insn in its
> containing basic block. It certainly seems like a ripe ground for logic
> bugs like this one. Is it really intentional?
md.texi says
The @samp{tablejump} insn is always the last insn before the jump
table it uses. Its assembler code normally has no need to use the
second operand, but you should incorporate it in the RTL pattern so
that the jump optimizer will not delete the table as unreachable code.
but rtl.texi says
A @code{jump_table_data} insn is a placeholder for the jump-table data
of a @code{casesi} or @code{tablejump} insn. They are placed after
a @code{tablejump_p} insn. A @code{jump_table_data} insn is not part o
a basic blockm but it is associated with the basic block that ends with
the @code{tablejump_p} insn. The @code{PATTERN} of a @code{jump_table_data}
is always either an @code{addr_vec} or an @code{addr_diff_vec}, and a
@code{jump_table_data} insn is always preceded by a @code{code_label}.
The @code{tablejump_p} insn refers to that @code{code_label} via its
@code{JUMP_LABEL}.
Which of these two is true?
Segher
More information about the Gcc-patches
mailing list