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 seq 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.
Or is it unnecessary? since we have "-blocks" options for that and want to keep
it "slim"?
Any comments on that?
Thanks in advance!
-------------------------------
The below patch is to append the hint on pc target when we find jump insn with
if-then-else
and the target BB with known code label.
The dumping will look like:
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 (fall through) -> L67
31: L31:
17: NOTE_INSN_BASIC_BLOCK 3
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index a1ca5992c41..608bcd130c5 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2164,7 +2164,27 @@ rtl_dump_bb (FILE *outf, basic_block bb, int indent,
dump_flags_t flags)
}
}
-^L
+
+/* 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. This function is to dump some hints
+ for that. */
+
+static void
+dump_hints_for_jump_target_pc (FILE *outf, basic_block bb)
+{
+ gcc_assert (outf);
+ edge e = FALLTHRU_EDGE (bb);
+ basic_block dest = e->dest;
+ rtx_insn *label = BB_HEAD (dest);
+ if (!LABEL_P (label))
+ return;
+
+ fputs (";; ", outf);
+ fprintf (outf, " pc (fall through) -> L%d", INSN_UID (label));
+ fputc ('\n', outf);
+}
+
/* 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 +2275,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)
+ dump_hints_for_jump_target_pc (outf, bb);
+ }
}
free (start);