[patch][rfc] Clean up CFG dumping
Steven Bosscher
stevenb.gcc@gmail.com
Mon Jul 16 19:56:00 GMT 2012
On Mon, Jul 16, 2012 at 5:57 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> Hello,
>
> There are comments in basic-block.h that advise to update certain
> parts of the compiler if a new edge flag or basic block flag is added:
>
> -/* Always update the table in cfg.c dump_edge_info. */
>
> and
>
> - Always update the table in cfg.c dump_bb_info. */
>
> Apparently this is not enough, because there are more places where the
> BB flags are dumped. For instance, cfg.c:dump_cfg_bb_info does not
> handle BB_MODIFIED, BB_VISITED, and BB_IN_TRANSACTION, and
> dump_bb_info doesn't even exist in cfg.c (it's in cfgrtl.c). The flags
> also aren't documented very well in the code.
>
> Furthermore, there are multiple places where "common" (i.e. IR
> agnostic) basic block information is dumped, with some functions
> taking TDF_* flags and others not, some functions taking a FILE as the
> first argument and others as the second argument, etc. In short:
> Unnecessarily messy.
>
> The attached patch cleans up the worst of it:
>
> * A new file cfg-flags.def is used to define the BB_* and EDGE_*
> flags. The names are the full string of the name of the flag in
> uppercase, that's a change from before. I can add a separate name
> field to DEF_EDGE_FLAG and DEF_BB_FLAG if necessary.
>
> * Now that there is dumpfile.h for the TDF_* masks, it's easier to use
> them everywhere. I have added one new flag to dump with the ";;"
> prefix (I think it should be used in more places, but that's something
> for later, perhaps).
>
> * All basic block header/footer and edge dumping is consolidated in
> dump_edge_info and dump_bb_info. This affects GIMPLE dump the most,
> because it uses a different form of dumping for basic block
> predecessors and successors. I expect some fall-out in the test suite
> (patterns that no longer match) that I'll have to address before the
> patch is ready for mainline.
>
> * Slim RTL printing is better integrated: print_rtl_with_bb takes
> flags and uses dump_rtl_slim if TDF_SLIM is passed. The same happens
> in rtl_dump_bb, which always dumps non-slim RTL without this patch.
>
> Bootstrapped on powerpc64-unknown-linux-gnu. Testing will probably
> reveal some test suite pattern mismatches, and I also still want to
> bootstrap&test this on x86_64.
> I'd like to hear what people think of the cfg-flags.def change.
As it turns out, the test suite passes without new regressions on
powerpc64-unknown-linux-gnu and on x86_64-unknown-linux-gnu.
Apparently there aren't any patterns checking edge or bb info. Good
for me :-)
OK for trunk?
Ciao!
Steven
> * dumpfile.h (TDF_COMMENT): New define.
> * basic-block.h (EDGE_FALLTHRU, EDGE_ABNORMAL, EDGE_ABNORMAL_CALL,
> EDGE_EH, EDGE_FAKE, EDGE_DFS_BACK, EDGE_CAN_FALLTHRU,
> EDGE_IRREDUCIBLE_LOOP, EDGE_SIBCALL, EDGE_LOOP_EXIT, EDGE_TRUE_VALUE,
> EDGE_FALSE_VALUE, EDGE_EXECUTABLE, EDGE_CROSSING, EDGE_PRESERVE):
> Move to new file cfg-flags.h.
> (enum cfg_edge_flags): New enum, using cfg-flags.h.
> (EDGE_ALL_FLAGS): Compute value automatically.
> (BB_NEW, BB_REACHABLE, BB_IRREDUCIBLE_LOOP, BB_SUPERBLOCK,
> BB_DISABLE_SCHEDULE, BB_HOT_PARTITION, BB_COLD_PARTITION,
> BB_DUPLICATED, BB_NON_LOCAL_GOTO_TARGET, BB_RTL,
> BB_FORWARDER_BLOCK, BB_NONTHREADABLE_BLOCK, BB_MODIFIED, BB_VISITED,
> BB_IN_TRANSACTION): Move to new file cfg-flags.h.
> (enum bb_flags): Rename to cfg_bb_flags. Use cfg-flags.h.
> (BB_ALL_FLAGS): New, compute value automatically.
> (dump_bb_info): Update prototype.
> (dump_edge_info): Update prototype.
> * cfg-flags.h: New file.
> * cfg.c (dump_edge_info): Take flags argument. Be verbose only if
> TDF_DETAILS and not TDF_SLIM. Include cfg-flags.h for bitnames.
> Check that the edge flags are within the range of EDGE_ALL_FLAGS.
> (debug_bb): Update dump_bb call.
> (dump_cfg_bb_info): Remove.
> (dump_bb_info): New function. Use cfg-flags.h for bitnames.
> Adjust verbosity using TDF_* flags. Check that the basic block flags
> are within the range of BB_ALL_FLAGS.
> (brief_dump_cfg): Use dump_bb_info instead of dump_cfg_bb_info.
> * cfghooks.h (struct cfghooks): Update dump_bb hook, take a FILE
> first for consistency with other dump functions.
> (dump_bb): Update prototype accordingly.
> * cfghooks.c: Include dumpfile.h.
> (verify_flow_info): Update dump_edge_info calls.
> (dump_bb): Take a flags argument and pass it around.
> Use dump_bb_info to dump common information about a basic block.
> (dump_flow_info): Moved here from cfgrtl.c. Make IL agnostic.
> (debug_flow_info): Moved here from cfgrtl.c.
> * profile.c (is_edge_inconsistent): Update dump_bb calls.
> * loop-invariant.c (find_defs): Update print_rtl_with_bb call.
> * rtl.h (debug_bb_n_slim, debug_bb_slim, print_rtl_slim,
> print_rtl_slim_with_bb): Remove prototypes.
> (dump_insn_slim): Adjust prototype to take a const_rtx.
> (print_rtl_with_bb): Adjust prototype.
> * sched-rgn.c (debug_region): Use dump_bb instead of debug_bb_n_slim.
> * sched-vis.c (dump_insn_slim): Take a const_rtx.
> (debug_insn_slim): Prototype here near DEBUG_FUNCTION marker.
> (print_rtl_slim_with_bb): Remove.
> (print_rtl_slim): Rename to debug_rtl_slim. Print only insn info,
> not basic block info (print_rtl_with_bb with TDF_SLIM should be used
> for that. Prototype here near DEBUG_FUNCTION marker.
> (debug_bb_slim): Prototype here near DEBUG_FUNCTION marker.
> Use dump_bb.
> (debug_bb_n_slim): Prototype here near DEBUG_FUNCTION marker.
> * tree-cfg.c (gimple_can_merge_blocks_p): Use EDGE_COMPLEX.
> (remove_bb): Update dump_bb call.
> (gimple_debug_bb): Use dump_bb.
> (dump_function_to_file): Update gimple_dump_bb call.
> (print_loops_bb): Likewise.
> * tree-flow.h (gimple_dump_bb): Update prototype.
> * gimple-pretty-print.c (dump_bb_header): Rename to
> dump_gimple_bb_header. Write to a stream instead of a pretty
> printer. Use dump_bb_info to dump basic block info.
> (dump_bb_end): Rename to dump_gimple_bb_footer. Write to a
> stream instead of a pretty printer. Use dump_bb_info.
> (gimple_dump_bb_buff): Do not call dump_bb_header and dump_bb_end.
> (gimple_dump_bb): Do it here with dump_gimple_bb_header and
> dump_gimple_bb_footer.
> * cfgrtl.c (rtl_dump_bb): Update prototype. Only dump DF if the
> dump flags have TDF_DETAILS. Use dump_insn_slim if TDF_SLIM.
> (print_rtl_with_bb): Take a flags argument and pass it around.
> Use dump_insn_slim if TDF_SLIM.
> (dump_bb_info): Removed and re-incarnated in cfg.c.
> (dump_flow_info): Moved to cfghooks.c.
> (debug_flow_info): Moved to cfghooks.c.
> * passes.c (execute_function_dump): Unconditionally use
> print_rtl_with_bb for RTL dumps, now that it understands TDF_SLIM.
> * final.c (dump_basic_block_info): Update dump_edge_info calls.
> * tree-vrp.c (dump_asserts_for): Likewise.
> * ifcvt.c (if_convert): Unconditionally use print_rtl_with_bb.
> * tree-if-conv.c (if_convertible_bb_p): Don't look at
> EDGE_ABNORMAL_CALL, it has no meaning in the GIMPLE world.
> * trans-mem.c (make_tm_edge): Don't set EDGE_ABNORMAL_CALL,
> for the same reason.
> * config/rl78/rl78.c (rl78_reorg): Update print_rtl_with_bb calls.
More information about the Gcc-patches
mailing list