Hi all,
6: NOTE_INSN_BASIC_BLOCK 2
....
12: r135:CC=cmp(r122:DI,0)
13: pc={(r135:CC!=0)?L52:pc}
REG_DEAD r135:CC
REG_BR_PROB 1041558836
31: L31:
17: NOTE_INSN_BASIC_BLOCK 3
The above RTL sequence is from pass doloop dumping with -fdump-rtl-all-slim, I
misunderstood that: the fall through BB of BB 2 is BB 3, since BB 3 is placed
just next to BB 2. Then I found the contradiction that BB 3 will have some
uninitialized regs if it's true.
I can get the exact information with "-blocks" dumping and even detailed one
with "-details". But I'm thinking whether it's worth to giving some
information on "-slim" dump (or more exactly without "-blocks") to avoid some
confusion especially for new comers like me.
This patch is to add one line to hint what's the fallthrough BB if it's the
one closely sitting, for example:
6: NOTE_INSN_BASIC_BLOCK 2
....
12: r135:CC=cmp(r122:DI,0)
13: pc={(r135:CC!=0)?L52:pc}
REG_DEAD r135:CC
REG_BR_PROB 1041558836
;; pc falls through to BB 10
31: L31:
17: NOTE_INSN_BASIC_BLOCK 3
Bootstrapped and regression test passed on powerpc64le-unknown-linux-gnu.
Is it a reasonable patch? If yes, is it ok for trunk?
Thanks,
Kewen
---------
gcc/ChangeLog
2019-07-08 Kewen Lin <[email protected]>
* gcc/cfgrtl.c (print_rtl_with_bb): Check and call
hint_if_pc_fall_through_not_next for jump insn with two successors.
(hint_if_pc_fall_through_not_next): New function.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index a1ca5992c41..928b9b0f691 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2164,7 +2164,26 @@ rtl_dump_bb (FILE *outf, basic_block bb, int indent,
dump_flags_t flags)
}
}
-
+
+/* For dumping without specifying basic blocks option, when we see PC is one of
+ jump targets, it's easy to misunderstand the next basic block is the
+ fallthrough one, but it's not so true sometimes. This function is to dump
+ hints for the case where basic block of next insn isn't the fall through
+ target. */
+
+static void
+hint_if_pc_fall_through_not_next (FILE *outf, basic_block bb)
+{
+ gcc_assert (outf);
+ gcc_assert (EDGE_COUNT (bb->succs) >= 2);
+ const rtx_insn *einsn = BB_END (bb);
+ const rtx_insn *ninsn = NEXT_INSN (einsn);
+ edge e = FALLTHRU_EDGE (bb);
+ basic_block dest = e->dest;
+ if (BB_HEAD (dest) != ninsn)
+ fprintf (outf, ";; pc falls through to BB %d\n", dest->index);
+}
+
/* Like dump_function_to_file, but for RTL. Print out dataflow information
for the start of each basic block. FLAGS are the TDF_* masks documented
in dumpfile.h. */
@@ -2255,6 +2274,14 @@ print_rtl_with_bb (FILE *outf, const rtx_insn
*rtx_first, dump_flags_t flags)
putc ('\n', outf);
}
}
+ else if (GET_CODE (tmp_rtx) == JUMP_INSN
+ && GET_CODE (PATTERN (tmp_rtx)) == SET)
+ {
+ bb = BLOCK_FOR_INSN (tmp_rtx);
+ const_rtx src = SET_SRC (PATTERN (tmp_rtx));
+ if (bb != NULL && GET_CODE (src) == IF_THEN_ELSE)
+ hint_if_pc_fall_through_not_next (outf, bb);
+ }
}
free (start);