On 5/27/24 11:52 AM, Hans-Peter Nilsson wrote:
Regtested cris-elf.  Ok to commit?

-- >8 --
...and call compute_bb_for_insn in init_resource_info and
free_bb_for_insn in free_resource_info.

I put a gcc_unreachable in that else-clause for a failing
find_basic_block in mark_target_live_regs after the comment that says:

     /* We didn't find the start of a basic block.  Assume everything
        in use.  This should happen only extremely rarely.  */
     SET_HARD_REG_SET (res->regs);

and found that it fails not extremely rarely but extremely early in
the build (compiling libgcc).

That kind of pessimization leads to suboptimal delay-slot-filling.
Instead, do like many machine_dependent_reorg passes and call
compute_bb_for_insn as part of resource.cc initialization.

After this patch, there's a whole "if (b != -1)" conditional that's
dominated by a gcc_assert (b != -1).  I separated that, as it's a NFC
whitespace patch that hampers patch readability.

Altogether this improved coremark performance for CRIS at -O2
-march=v10 by 0.36%.

        * resource.cc: Include cfgrtl.h.  Use BLOCK_FOR_INSN (insn)->index
        instead of calling find_basic_block (insn).  Assert for not -1.
        (find_basic_block): Remove function.
        (init_resource_info): Call compute_bb_for_insn.
        (free_resource_info): Call free_bb_for_insn.
I'm pretty sure that code as part of the overall problem -- namely that we didn't have good basic block info so we resorted to insn scanning.

Presumably we set BLOCK_FOR_INSN when we generate a wrapper SEQUENCE insns for a filled delay slot? Assuming we do create the right mapping for those new insns, then this is OK.

jeff



Reply via email to