On Fri, 2016-10-21 at 12:04 +0200, Bernd Schmidt wrote: > On 10/21/2016 02:36 AM, David Malcolm wrote: > > + ASSERT_RTL_DUMP_EQ ("(cjump_insn (set (pc)\n" > > + " (label_ref 0))\n" > > + " (nil))\n", > > + jump_insn); > > } > > I do wonder about the (nil)s and whether we can eliminate them.
The following patch does so, by adding a flag param to rtx_writer::print_rtx allowing omitting the (nil) when in compact mode. Successfully bootstrapped®rtested on x86_64-pc-linux-gnu. OK for trunk? gcc/ChangeLog: * print-rtl.c (rtx_writer::print_rtx_operand_code_0): Don't print trailing "(nil)" for NOTE_VAR_LOCATION and for ENTRY_VALUE_EXP. (rtx_writer::print_rtx_operand_code_e): Likewise for CALL_INSN_FUNCTION_USAGE and for REG_NOTES. (rtx_writer::print_rtx_operand_codes_E_and_V): Always print nils within a vec. (rtx_writer::print_rtx): Add param "print_nil" to support not printing some trailing "(nil)" values when in compact mode. Don't print them for PAT_VAR_LOCATION_LOC. (print_inline_rtx): Update for new param. (debug_rtx): Likewise. (rtx_writer::print_rtl): Likewise. (rtx_writer::print_rtl_single_with_indent): Likewise. * print-rtl.h (rtx_writer::print_rtx): Add "print_nil" param. * rtl-tests.c (selftests::test_uncond_jump): Remove trailing "(nil)" from expected output. --- gcc/print-rtl.c | 44 +++++++++++++++++++++++++++++--------------- gcc/print-rtl.h | 2 +- gcc/rtl-tests.c | 2 +- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index 341ecdf..643eb57 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -158,7 +158,7 @@ rtx_writer::print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED, case NOTE_INSN_VAR_LOCATION: case NOTE_INSN_CALL_ARG_LOCATION: fputc (' ', m_outfile); - print_rtx (NOTE_VAR_LOCATION (in_rtx)); + print_rtx (NOTE_VAR_LOCATION (in_rtx), false); break; case NOTE_INSN_CFI: @@ -201,7 +201,7 @@ rtx_writer::print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED, m_indent += 2; if (!m_sawclose) fprintf (m_outfile, " "); - print_rtx (ENTRY_VALUE_EXP (in_rtx)); + print_rtx (ENTRY_VALUE_EXP (in_rtx), false); m_indent -= 2; } #endif @@ -224,11 +224,17 @@ rtx_writer::print_rtx_operand_code_e (const_rtx in_rtx, int idx) if (idx == 7 && CALL_P (in_rtx)) { m_in_call_function_usage = true; - print_rtx (XEXP (in_rtx, idx)); + print_rtx (XEXP (in_rtx, idx), false); m_in_call_function_usage = false; } else - print_rtx (XEXP (in_rtx, idx)); + { + bool print_nil = true; + /* Avoid printing trailing "(nil)" for REG_NOTES. */ + if (INSN_CHAIN_CODE_P (GET_CODE (in_rtx)) && idx == 6) + print_nil = false; + print_rtx (XEXP (in_rtx, idx), print_nil); + } m_indent -= 2; } @@ -252,7 +258,7 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx) m_sawclose = 1; for (int j = 0; j < XVECLEN (in_rtx, idx); j++) - print_rtx (XVECEXP (in_rtx, idx, j)); + print_rtx (XVECEXP (in_rtx, idx, j), true); m_indent -= 2; } @@ -564,10 +570,15 @@ rtx_writer::print_rtx_operand (const_rtx in_rtx, int idx) } } -/* Print IN_RTX onto m_outfile. This is the recursive part of printing. */ +/* Print IN_RTX onto m_outfile. This is the recursive part of printing. + PRINT_NIL controls the printing of "(nil)" in compact mode. + In compact mode, if IN_RTX is NULL, then "(nil)" is printed if PRINT_NIL + is true, and nothing is printed if PRINT_NIL is false. + In non-compact mode, "(nil)" is always printed for NULL, and PRINT_NIL + is ignored. */ void -rtx_writer::print_rtx (const_rtx in_rtx) +rtx_writer::print_rtx (const_rtx in_rtx, bool print_nil) { int idx = 0; @@ -582,8 +593,11 @@ rtx_writer::print_rtx (const_rtx in_rtx) if (in_rtx == 0) { - fputs ("(nil)", m_outfile); - m_sawclose = 1; + if (print_nil || !m_compact) + { + fputs ("(nil)", m_outfile); + m_sawclose = 1; + } return; } else if (GET_CODE (in_rtx) > NUM_RTX_CODE) @@ -657,7 +671,7 @@ rtx_writer::print_rtx (const_rtx in_rtx) else print_mem_expr (m_outfile, PAT_VAR_LOCATION_DECL (in_rtx)); fputc (' ', m_outfile); - print_rtx (PAT_VAR_LOCATION_LOC (in_rtx)); + print_rtx (PAT_VAR_LOCATION_LOC (in_rtx), false); if (PAT_VAR_LOCATION_STATUS (in_rtx) == VAR_INIT_STATUS_UNINITIALIZED) fprintf (m_outfile, " [uninit]"); @@ -765,7 +779,7 @@ void print_inline_rtx (FILE *outf, const_rtx x, int ind) { rtx_writer w (outf, ind, false, false); - w.print_rtx (x); + w.print_rtx (x, true); } /* Call this function from the debugger to see what X looks like. */ @@ -774,7 +788,7 @@ DEBUG_FUNCTION void debug_rtx (const_rtx x) { rtx_writer w (stderr, 0, false, false); - w.print_rtx (x); + w.print_rtx (x, true); fprintf (stderr, "\n"); } @@ -900,14 +914,14 @@ rtx_writer::print_rtl (const_rtx rtx_first) tmp_rtx = NEXT_INSN (tmp_rtx)) { fputs (print_rtx_head, m_outfile); - print_rtx (tmp_rtx); + print_rtx (tmp_rtx, true); fprintf (m_outfile, "\n"); } break; default: fputs (print_rtx_head, m_outfile); - print_rtx (rtx_first); + print_rtx (rtx_first, true); } } @@ -948,7 +962,7 @@ rtx_writer::print_rtl_single_with_indent (const_rtx x, int ind) int old_indent = m_indent; m_indent = ind; m_sawclose = 0; - print_rtx (x); + print_rtx (x, true); putc ('\n', m_outfile); m_indent = old_indent; return 1; diff --git a/gcc/print-rtl.h b/gcc/print-rtl.h index 8496ffa..64043dd 100644 --- a/gcc/print-rtl.h +++ b/gcc/print-rtl.h @@ -27,7 +27,7 @@ class rtx_writer public: rtx_writer (FILE *outfile, int ind, bool simple, bool compact); - void print_rtx (const_rtx in_rtx); + void print_rtx (const_rtx in_rtx, bool print_nil); void print_rtl (const_rtx rtx_first); int print_rtl_single_with_indent (const_rtx x, int ind); diff --git a/gcc/rtl-tests.c b/gcc/rtl-tests.c index cf5239f..006ef92 100644 --- a/gcc/rtl-tests.c +++ b/gcc/rtl-tests.c @@ -177,7 +177,7 @@ test_uncond_jump () ASSERT_RTL_DUMP_EQ ("(cjump_insn 1 (set (pc)\n" " (label_ref 0))\n" - " (nil))\n", + " )\n", jump_insn); } -- 1.8.5.3