On 1/24/19 2:10 PM, Segher Boessenkool wrote: > 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? I suspect the latter. The former is likely very old. Pause... Yup. You can find it verbatim in 1.42.
Jeff