diff mbox

Split print_rtx into subroutines

Message ID 1476200070-40881-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Oct. 11, 2016, 3:34 p.m. UTC
print_rtx is a ~550 line function, the bulk of which is a ~400-line
switch statement, with a fair amount to #if logic.

This patch simplifies things by moving the switch statement into its
own subroutine, and by moving the more complicated cases into their
own subroutines.

No functional changes (but preliminary work for various other dump
improvements I'd like to make).

Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu.

OK for trunk?

gcc/ChangeLog:
	* print-rtl.c (print_rtx): Rename "i" to "idx".  Split out the
	operand-printing "switch" statement into...
	(print_rtx_operand): ...this new function, ...
	(print_rtx_operand_code_0): ...this new function, ...
	(print_rtx_operand_code_e): ...this new function, ...
	(print_rtx_operand_codes_E_and_V): ...this new function, ...
	(print_rtx_operand_code_i): ...this new function, ...
	(print_rtx_operand_code_r): ...this new function, ...
	(print_rtx_operand_code_u): ...and this new function.
---
 gcc/print-rtl.c | 858 ++++++++++++++++++++++++++++++--------------------------
 1 file changed, 462 insertions(+), 396 deletions(-)

Comments

Bernd Schmidt Oct. 11, 2016, 3:11 p.m. UTC | #1
On 10/11/2016 05:34 PM, David Malcolm wrote:

> +static void print_rtx_operand (const_rtx in_rtx, int idx);
> +static void print_rtx_operand_code_0 (const_rtx in_rtx, int idx);
> +static void print_rtx_operand_code_e (const_rtx in_rtx, int idx);
> +static void print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx);
> +static void print_rtx_operand_code_i (const_rtx in_rtx, int idx);
> +static void print_rtx_operand_code_r (const_rtx in_rtx);
> +static void print_rtx_operand_code_u (const_rtx in_rtx, int idx);

Please order functions so as to avoid needing forward declarations as 
much as possible.

Ok with that change. Before committing, please verify that dumps 
produced before and after for one large input file are identical.


Bernd
diff mbox

Patch

diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index a905127..bb5817a 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -61,6 +61,13 @@  static int indent;
 static bool in_call_function_usage;
 
 static void print_rtx (const_rtx);
+static void print_rtx_operand (const_rtx in_rtx, int idx);
+static void print_rtx_operand_code_0 (const_rtx in_rtx, int idx);
+static void print_rtx_operand_code_e (const_rtx in_rtx, int idx);
+static void print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx);
+static void print_rtx_operand_code_i (const_rtx in_rtx, int idx);
+static void print_rtx_operand_code_r (const_rtx in_rtx);
+static void print_rtx_operand_code_u (const_rtx in_rtx, int idx);
 
 /* String printed at beginning of each RTL when it is dumped.
    This string is set to ASM_COMMENT_START when the RTL is dumped in
@@ -99,10 +106,7 @@  print_mem_expr (FILE *outfile, const_tree expr)
 static void
 print_rtx (const_rtx in_rtx)
 {
-  int i = 0;
-  int j;
-  const char *format_ptr;
-  int is_insn;
+  int idx = 0;
 
   if (sawclose)
     {
@@ -127,8 +131,6 @@  print_rtx (const_rtx in_rtx)
        return;
     }
 
-  is_insn = INSN_P (in_rtx);
-
   /* Print name of expression code.  */
   if (flag_simple && CONST_INT_P (in_rtx))
     fputc ('(', outfile);
@@ -184,14 +186,14 @@  print_rtx (const_rtx in_rtx)
 	      == VAR_INIT_STATUS_UNINITIALIZED)
 	    fprintf (outfile, " [uninit]");
 	  sawclose = 1;
-	  i = GET_RTX_LENGTH (VAR_LOCATION);
+	  idx = GET_RTX_LENGTH (VAR_LOCATION);
 	}
 #endif
     }
 
 #ifndef GENERATOR_FILE
   if (CONST_DOUBLE_AS_FLOAT_P (in_rtx))
-    i = 5;
+    idx = 5;
 #endif
 
   if (INSN_CHAIN_CODE_P (GET_CODE (in_rtx)))
@@ -204,394 +206,8 @@  print_rtx (const_rtx in_rtx)
 
   /* Get the format string and skip the first elements if we have handled
      them already.  */
-  format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
-  for (; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
-    switch (*format_ptr++)
-      {
-	const char *str;
-
-      case 'T':
-	str = XTMPL (in_rtx, i);
-	goto string;
-
-      case 'S':
-      case 's':
-	str = XSTR (in_rtx, i);
-      string:
-
-	if (str == 0)
-	  fputs (" \"\"", outfile);
-	else
-	  fprintf (outfile, " (\"%s\")", str);
-	sawclose = 1;
-	break;
-
-	/* 0 indicates a field for internal use that should not be printed.
-	   An exception is the third field of a NOTE, where it indicates
-	   that the field has several different valid contents.  */
-      case '0':
-#ifndef GENERATOR_FILE
-	if (i == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
-	  {
-	    int flags = SYMBOL_REF_FLAGS (in_rtx);
-	    if (flags)
-	      fprintf (outfile, " [flags %#x]", flags);
-	    tree decl = SYMBOL_REF_DECL (in_rtx);
-	    if (decl)
-	      print_node_brief (outfile, "", decl, dump_flags);
-	  }
-	else if (i == 3 && NOTE_P (in_rtx))
-	  {
-	    switch (NOTE_KIND (in_rtx))
-	      {
-	      case NOTE_INSN_EH_REGION_BEG:
-	      case NOTE_INSN_EH_REGION_END:
-		if (flag_dump_unnumbered)
-		  fprintf (outfile, " #");
-		else
-		  fprintf (outfile, " %d", NOTE_EH_HANDLER (in_rtx));
-		sawclose = 1;
-		break;
-
-	      case NOTE_INSN_BLOCK_BEG:
-	      case NOTE_INSN_BLOCK_END:
-		dump_addr (outfile, " ", NOTE_BLOCK (in_rtx));
-		sawclose = 1;
-		break;
-
-	      case NOTE_INSN_BASIC_BLOCK:
-		{
-		  basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
-		  if (bb != 0)
-		    fprintf (outfile, " [bb %d]", bb->index);
-		  break;
-	        }
-
-	      case NOTE_INSN_DELETED_LABEL:
-	      case NOTE_INSN_DELETED_DEBUG_LABEL:
-		{
-		  const char *label = NOTE_DELETED_LABEL_NAME (in_rtx);
-		  if (label)
-		    fprintf (outfile, " (\"%s\")", label);
-		  else
-		    fprintf (outfile, " \"\"");
-		}
-		break;
-
-	      case NOTE_INSN_SWITCH_TEXT_SECTIONS:
-		{
-		  basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
-		  if (bb != 0)
-		    fprintf (outfile, " [bb %d]", bb->index);
-		  break;
-		}
-
-	      case NOTE_INSN_VAR_LOCATION:
-	      case NOTE_INSN_CALL_ARG_LOCATION:
-		fputc (' ', outfile);
-		print_rtx (NOTE_VAR_LOCATION (in_rtx));
-		break;
-
-	      case NOTE_INSN_CFI:
-		fputc ('\n', outfile);
-		output_cfi_directive (outfile, NOTE_CFI (in_rtx));
-		fputc ('\t', outfile);
-		break;
-
-	      default:
-		break;
-	      }
-	  }
-	else if (i == 7 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL)
-	  {
-	    /* Output the JUMP_LABEL reference.  */
-	    fprintf (outfile, "\n%s%*s -> ", print_rtx_head, indent * 2, "");
-	    if (GET_CODE (JUMP_LABEL (in_rtx)) == RETURN)
-	      fprintf (outfile, "return");
-	    else if (GET_CODE (JUMP_LABEL (in_rtx)) == SIMPLE_RETURN)
-	      fprintf (outfile, "simple_return");
-	    else
-	      fprintf (outfile, "%d", INSN_UID (JUMP_LABEL (in_rtx)));
-	  }
-	else if (i == 0 && GET_CODE (in_rtx) == VALUE)
-	  {
-	    cselib_val *val = CSELIB_VAL_PTR (in_rtx);
-
-	    fprintf (outfile, " %u:%u", val->uid, val->hash);
-	    dump_addr (outfile, " @", in_rtx);
-	    dump_addr (outfile, "/", (void*)val);
-	  }
-	else if (i == 0 && GET_CODE (in_rtx) == DEBUG_EXPR)
-	  {
-	    fprintf (outfile, " D#%i",
-		     DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
-	  }
-	else if (i == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
-	  {
-	    indent += 2;
-	    if (!sawclose)
-	      fprintf (outfile, " ");
-	    print_rtx (ENTRY_VALUE_EXP (in_rtx));
-	    indent -= 2;
-	  }
-#endif
-	break;
-
-      case 'e':
-      do_e:
-	indent += 2;
-	if (i == 6 && INSN_P (in_rtx))
-	  /* Put REG_NOTES on their own line.  */
-	  fprintf (outfile, "\n%s%*s",
-		   print_rtx_head, indent * 2, "");
-	if (!sawclose)
-	  fprintf (outfile, " ");
-	if (i == 7 && CALL_P (in_rtx))
-	  {
-	    in_call_function_usage = true;
-	    print_rtx (XEXP (in_rtx, i));
-	    in_call_function_usage = false;
-	  }
-	else
-	  print_rtx (XEXP (in_rtx, i));
-	indent -= 2;
-	break;
-
-      case 'E':
-      case 'V':
-	indent += 2;
-	if (sawclose)
-	  {
-	    fprintf (outfile, "\n%s%*s",
-		     print_rtx_head, indent * 2, "");
-	    sawclose = 0;
-	  }
-	fputs (" [", outfile);
-	if (NULL != XVEC (in_rtx, i))
-	  {
-	    indent += 2;
-	    if (XVECLEN (in_rtx, i))
-	      sawclose = 1;
-
-	    for (j = 0; j < XVECLEN (in_rtx, i); j++)
-	      print_rtx (XVECEXP (in_rtx, i, j));
-
-	    indent -= 2;
-	  }
-	if (sawclose)
-	  fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
-
-	fputs ("]", outfile);
-	sawclose = 1;
-	indent -= 2;
-	break;
-
-      case 'w':
-	if (! flag_simple)
-	  fprintf (outfile, " ");
-	fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, i));
-	if (! flag_simple)
-	  fprintf (outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
-		   (unsigned HOST_WIDE_INT) XWINT (in_rtx, i));
-	break;
-
-      case 'i':
-	if (i == 4 && INSN_P (in_rtx))
-	  {
-#ifndef GENERATOR_FILE
-	    const rtx_insn *in_insn = as_a <const rtx_insn *> (in_rtx);
-
-	    /*  Pretty-print insn locations.  Ignore scoping as it is mostly
-		redundant with line number information and do not print anything
-		when there is no location information available.  */
-	    if (INSN_HAS_LOCATION (in_insn))
-	      {
-		expanded_location xloc = insn_location (in_insn);
-		fprintf (outfile, " %s:%i", xloc.file, xloc.line);
-	      }
-#endif
-	  }
-	else if (i == 6 && GET_CODE (in_rtx) == ASM_OPERANDS)
-	  {
-#ifndef GENERATOR_FILE
-	    if (ASM_OPERANDS_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
-	      fprintf (outfile, " %s:%i",
-		       LOCATION_FILE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)),
-		       LOCATION_LINE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)));
-#endif
-	  }
-	else if (i == 1 && GET_CODE (in_rtx) == ASM_INPUT)
-	  {
-#ifndef GENERATOR_FILE
-	    if (ASM_INPUT_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
-	      fprintf (outfile, " %s:%i",
-		       LOCATION_FILE (ASM_INPUT_SOURCE_LOCATION (in_rtx)),
-		       LOCATION_LINE (ASM_INPUT_SOURCE_LOCATION (in_rtx)));
-#endif
-	  }
-	else if (i == 5 && NOTE_P (in_rtx))
-	  {
-	    /* This field is only used for NOTE_INSN_DELETED_LABEL, and
-	       other times often contains garbage from INSN->NOTE death.  */
-	    if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL
-		|| NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_DEBUG_LABEL)
-	      fprintf (outfile, " %d",  XINT (in_rtx, i));
-	  }
-#if !defined(GENERATOR_FILE) && NUM_UNSPECV_VALUES > 0
-	else if (i == 1
-		 && GET_CODE (in_rtx) == UNSPEC_VOLATILE
-		 && XINT (in_rtx, 1) >= 0
-		 && XINT (in_rtx, 1) < NUM_UNSPECV_VALUES)
-	  fprintf (outfile, " %s", unspecv_strings[XINT (in_rtx, 1)]);
-#endif
-#if !defined(GENERATOR_FILE) && NUM_UNSPEC_VALUES > 0
-	else if (i == 1
-		 && (GET_CODE (in_rtx) == UNSPEC
-		     || GET_CODE (in_rtx) == UNSPEC_VOLATILE)
-		 && XINT (in_rtx, 1) >= 0
-		 && XINT (in_rtx, 1) < NUM_UNSPEC_VALUES)
-	  fprintf (outfile, " %s", unspec_strings[XINT (in_rtx, 1)]);
-#endif
-	else
-	  {
-	    int value = XINT (in_rtx, i);
-	    const char *name;
-
-	    if (flag_dump_unnumbered
-		&& (is_insn || NOTE_P (in_rtx)))
-	      fputc ('#', outfile);
-	    else
-	      fprintf (outfile, " %d", value);
-
-	    if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
-		&& XINT (in_rtx, i) >= 0
-		&& (name = get_insn_name (XINT (in_rtx, i))) != NULL)
-	      fprintf (outfile, " {%s}", name);
-	    sawclose = 0;
-	  }
-	break;
-
-      case 'r':
-	{
-	  unsigned int regno = REGNO (in_rtx);
-#ifndef GENERATOR_FILE
-	  if (regno < FIRST_PSEUDO_REGISTER)
-	    fprintf (outfile, " %d %s", regno, reg_names[regno]);
-	  else if (regno <= LAST_VIRTUAL_REGISTER)
-	    {
-	      if (regno == VIRTUAL_INCOMING_ARGS_REGNUM)
-		fprintf (outfile, " %d virtual-incoming-args", regno);
-	      else if (regno == VIRTUAL_STACK_VARS_REGNUM)
-		fprintf (outfile, " %d virtual-stack-vars", regno);
-	      else if (regno == VIRTUAL_STACK_DYNAMIC_REGNUM)
-		fprintf (outfile, " %d virtual-stack-dynamic", regno);
-	      else if (regno == VIRTUAL_OUTGOING_ARGS_REGNUM)
-		fprintf (outfile, " %d virtual-outgoing-args", regno);
-	      else if (regno == VIRTUAL_CFA_REGNUM)
-		fprintf (outfile, " %d virtual-cfa", regno);
-	      else if (regno == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
-		fprintf (outfile, " %d virtual-preferred-stack-boundary",
-			 regno);
-	      else
-		fprintf (outfile, " %d virtual-reg-%d", regno,
-			 regno-FIRST_VIRTUAL_REGISTER);
-	    }
-	  else
-#endif
-	    if (flag_dump_unnumbered && is_insn)
-	      fputc ('#', outfile);
-	    else
-	      fprintf (outfile, " %d", regno);
-
-#ifndef GENERATOR_FILE
-	  if (REG_ATTRS (in_rtx))
-	    {
-	      fputs (" [", outfile);
-	      if (regno != ORIGINAL_REGNO (in_rtx))
-		fprintf (outfile, "orig:%i", ORIGINAL_REGNO (in_rtx));
-	      if (REG_EXPR (in_rtx))
-		print_mem_expr (outfile, REG_EXPR (in_rtx));
-
-	      if (REG_OFFSET (in_rtx))
-		fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
-			 REG_OFFSET (in_rtx));
-	      fputs (" ]", outfile);
-	    }
-	  if (regno != ORIGINAL_REGNO (in_rtx))
-	    fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
-#endif
-	  break;
-	}
-
-      /* Print NOTE_INSN names rather than integer codes.  */
-
-      case 'n':
-	fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
-	sawclose = 0;
-	break;
-
-      case 'u':
-	if (XEXP (in_rtx, i) != NULL)
-	  {
-	    rtx sub = XEXP (in_rtx, i);
-	    enum rtx_code subc = GET_CODE (sub);
-
-	    if (GET_CODE (in_rtx) == LABEL_REF)
-	      {
-		if (subc == NOTE
-		    && NOTE_KIND (sub) == NOTE_INSN_DELETED_LABEL)
-		  {
-		    if (flag_dump_unnumbered)
-		      fprintf (outfile, " [# deleted]");
-		    else
-		      fprintf (outfile, " [%d deleted]", INSN_UID (sub));
-		    sawclose = 0;
-		    break;
-		  }
-
-		if (subc != CODE_LABEL)
-		  goto do_e;
-	      }
-
-	    if (flag_dump_unnumbered
-		|| (flag_dump_unnumbered_links && i <= 1
-		    && (INSN_P (in_rtx) || NOTE_P (in_rtx)
-			|| LABEL_P (in_rtx) || BARRIER_P (in_rtx))))
-	      fputs (" #", outfile);
-	    else
-	      fprintf (outfile, " %d", INSN_UID (sub));
-	  }
-	else
-	  fputs (" 0", outfile);
-	sawclose = 0;
-	break;
-
-      case 't':
-#ifndef GENERATOR_FILE
-	if (i == 0 && GET_CODE (in_rtx) == DEBUG_IMPLICIT_PTR)
-	  print_mem_expr (outfile, DEBUG_IMPLICIT_PTR_DECL (in_rtx));
-	else if (i == 0 && GET_CODE (in_rtx) == DEBUG_PARAMETER_REF)
-	  print_mem_expr (outfile, DEBUG_PARAMETER_REF_DECL (in_rtx));
-	else
-	  dump_addr (outfile, " ", XTREE (in_rtx, i));
-#endif
-	break;
-
-      case '*':
-	fputs (" Unknown", outfile);
-	sawclose = 0;
-	break;
-
-      case 'B':
-#ifndef GENERATOR_FILE
-	if (XBBDEF (in_rtx, i))
-	  fprintf (outfile, " %i", XBBDEF (in_rtx, i)->index);
-#endif
-	break;
-
-      default:
-	gcc_unreachable ();
-      }
+  for (; idx < GET_RTX_LENGTH (GET_CODE (in_rtx)); idx++)
+    print_rtx_operand (in_rtx, idx);
 
   switch (GET_CODE (in_rtx))
     {
@@ -664,6 +280,456 @@  print_rtx (const_rtx in_rtx)
   sawclose = 1;
 }
 
+/* Subroutine of print_rtx.   Print operand IDX of IN_RTX.  */
+
+static void
+print_rtx_operand (const_rtx in_rtx, int idx)
+{
+  const char *format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
+
+  switch (format_ptr[idx])
+    {
+      const char *str;
+
+    case 'T':
+      str = XTMPL (in_rtx, idx);
+      goto string;
+
+    case 'S':
+    case 's':
+      str = XSTR (in_rtx, idx);
+    string:
+
+      if (str == 0)
+	fputs (" \"\"", outfile);
+      else
+	fprintf (outfile, " (\"%s\")", str);
+      sawclose = 1;
+      break;
+
+    case '0':
+      print_rtx_operand_code_0 (in_rtx, idx);
+      break;
+
+    case 'e':
+      print_rtx_operand_code_e (in_rtx, idx);
+      break;
+
+    case 'E':
+    case 'V':
+      print_rtx_operand_codes_E_and_V (in_rtx, idx);
+      break;
+
+    case 'w':
+      if (! flag_simple)
+	fprintf (outfile, " ");
+      fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, idx));
+      if (! flag_simple)
+	fprintf (outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
+		 (unsigned HOST_WIDE_INT) XWINT (in_rtx, idx));
+      break;
+
+    case 'i':
+      print_rtx_operand_code_i (in_rtx, idx);
+      break;
+
+    case 'r':
+      print_rtx_operand_code_r (in_rtx);
+      break;
+
+    /* Print NOTE_INSN names rather than integer codes.  */
+
+    case 'n':
+      fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, idx)));
+      sawclose = 0;
+      break;
+
+    case 'u':
+      print_rtx_operand_code_u (in_rtx, idx);
+      break;
+
+    case 't':
+#ifndef GENERATOR_FILE
+      if (idx == 0 && GET_CODE (in_rtx) == DEBUG_IMPLICIT_PTR)
+	print_mem_expr (outfile, DEBUG_IMPLICIT_PTR_DECL (in_rtx));
+      else if (idx == 0 && GET_CODE (in_rtx) == DEBUG_PARAMETER_REF)
+	print_mem_expr (outfile, DEBUG_PARAMETER_REF_DECL (in_rtx));
+      else
+	dump_addr (outfile, " ", XTREE (in_rtx, idx));
+#endif
+      break;
+
+    case '*':
+      fputs (" Unknown", outfile);
+      sawclose = 0;
+      break;
+
+    case 'B':
+#ifndef GENERATOR_FILE
+      if (XBBDEF (in_rtx, idx))
+	fprintf (outfile, " %i", XBBDEF (in_rtx, idx)->index);
+#endif
+      break;
+
+    default:
+      gcc_unreachable ();
+    }
+}
+
+/* Subroutine of print_rtx_operand for handling code '0'.
+   0 indicates a field for internal use that should not be printed.
+   However there are various special cases, such as the third field
+   of a NOTE, where it indicates that the field has several different
+   valid contents.  */
+
+static void
+print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED,
+			  int idx ATTRIBUTE_UNUSED)
+{
+#ifndef GENERATOR_FILE
+  if (idx == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
+    {
+      int flags = SYMBOL_REF_FLAGS (in_rtx);
+      if (flags)
+	fprintf (outfile, " [flags %#x]", flags);
+      tree decl = SYMBOL_REF_DECL (in_rtx);
+      if (decl)
+	print_node_brief (outfile, "", decl, dump_flags);
+    }
+  else if (idx == 3 && NOTE_P (in_rtx))
+    {
+      switch (NOTE_KIND (in_rtx))
+	{
+	case NOTE_INSN_EH_REGION_BEG:
+	case NOTE_INSN_EH_REGION_END:
+	  if (flag_dump_unnumbered)
+	    fprintf (outfile, " #");
+	  else
+	    fprintf (outfile, " %d", NOTE_EH_HANDLER (in_rtx));
+	  sawclose = 1;
+	  break;
+
+	case NOTE_INSN_BLOCK_BEG:
+	case NOTE_INSN_BLOCK_END:
+	  dump_addr (outfile, " ", NOTE_BLOCK (in_rtx));
+	  sawclose = 1;
+	  break;
+
+	case NOTE_INSN_BASIC_BLOCK:
+	  {
+	    basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
+	    if (bb != 0)
+	      fprintf (outfile, " [bb %d]", bb->index);
+	    break;
+	  }
+
+	case NOTE_INSN_DELETED_LABEL:
+	case NOTE_INSN_DELETED_DEBUG_LABEL:
+	  {
+	    const char *label = NOTE_DELETED_LABEL_NAME (in_rtx);
+	    if (label)
+	      fprintf (outfile, " (\"%s\")", label);
+	    else
+	      fprintf (outfile, " \"\"");
+	  }
+	  break;
+
+	case NOTE_INSN_SWITCH_TEXT_SECTIONS:
+	  {
+	    basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
+	    if (bb != 0)
+	      fprintf (outfile, " [bb %d]", bb->index);
+	    break;
+	  }
+
+	case NOTE_INSN_VAR_LOCATION:
+	case NOTE_INSN_CALL_ARG_LOCATION:
+	  fputc (' ', outfile);
+	  print_rtx (NOTE_VAR_LOCATION (in_rtx));
+	  break;
+
+	case NOTE_INSN_CFI:
+	  fputc ('\n', outfile);
+	  output_cfi_directive (outfile, NOTE_CFI (in_rtx));
+	  fputc ('\t', outfile);
+	  break;
+
+	default:
+	  break;
+	}
+    }
+  else if (idx == 7 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL)
+    {
+      /* Output the JUMP_LABEL reference.  */
+      fprintf (outfile, "\n%s%*s -> ", print_rtx_head, indent * 2, "");
+      if (GET_CODE (JUMP_LABEL (in_rtx)) == RETURN)
+	fprintf (outfile, "return");
+      else if (GET_CODE (JUMP_LABEL (in_rtx)) == SIMPLE_RETURN)
+	fprintf (outfile, "simple_return");
+      else
+	fprintf (outfile, "%d", INSN_UID (JUMP_LABEL (in_rtx)));
+    }
+  else if (idx == 0 && GET_CODE (in_rtx) == VALUE)
+    {
+      cselib_val *val = CSELIB_VAL_PTR (in_rtx);
+
+      fprintf (outfile, " %u:%u", val->uid, val->hash);
+      dump_addr (outfile, " @", in_rtx);
+      dump_addr (outfile, "/", (void*)val);
+    }
+  else if (idx == 0 && GET_CODE (in_rtx) == DEBUG_EXPR)
+    {
+      fprintf (outfile, " D#%i",
+	       DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
+    }
+  else if (idx == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
+    {
+      indent += 2;
+      if (!sawclose)
+	fprintf (outfile, " ");
+      print_rtx (ENTRY_VALUE_EXP (in_rtx));
+      indent -= 2;
+    }
+#endif
+}
+
+/* Subroutine of print_rtx_operand for handling code 'e'.
+   Also called by print_rtx_operand_code_u for handling code 'u'
+   for LABEL_REFs when they don't reference a CODE_LABEL.  */
+
+static void
+print_rtx_operand_code_e (const_rtx in_rtx, int idx)
+{
+  indent += 2;
+  if (idx == 6 && INSN_P (in_rtx))
+    /* Put REG_NOTES on their own line.  */
+    fprintf (outfile, "\n%s%*s",
+	     print_rtx_head, indent * 2, "");
+  if (!sawclose)
+    fprintf (outfile, " ");
+  if (idx == 7 && CALL_P (in_rtx))
+    {
+      in_call_function_usage = true;
+      print_rtx (XEXP (in_rtx, idx));
+      in_call_function_usage = false;
+    }
+  else
+    print_rtx (XEXP (in_rtx, idx));
+  indent -= 2;
+}
+
+/* Subroutine of print_rtx_operand for handling codes 'E' and 'V'.  */
+
+static void
+print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx)
+{
+  indent += 2;
+  if (sawclose)
+    {
+      fprintf (outfile, "\n%s%*s",
+      print_rtx_head, indent * 2, "");
+      sawclose = 0;
+    }
+  fputs (" [", outfile);
+  if (NULL != XVEC (in_rtx, idx))
+    {
+      indent += 2;
+      if (XVECLEN (in_rtx, idx))
+	sawclose = 1;
+
+      for (int j = 0; j < XVECLEN (in_rtx, idx); j++)
+	print_rtx (XVECEXP (in_rtx, idx, j));
+
+      indent -= 2;
+    }
+  if (sawclose)
+    fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
+
+  fputs ("]", outfile);
+  sawclose = 1;
+  indent -= 2;
+}
+
+/* Subroutine of print_rtx_operand for handling code 'i'.  */
+
+static void
+print_rtx_operand_code_i (const_rtx in_rtx, int idx)
+{
+  if (idx == 4 && INSN_P (in_rtx))
+    {
+#ifndef GENERATOR_FILE
+      const rtx_insn *in_insn = as_a <const rtx_insn *> (in_rtx);
+
+      /*  Pretty-print insn locations.  Ignore scoping as it is mostly
+	  redundant with line number information and do not print anything
+	  when there is no location information available.  */
+      if (INSN_HAS_LOCATION (in_insn))
+	{
+	  expanded_location xloc = insn_location (in_insn);
+	  fprintf (outfile, " %s:%i", xloc.file, xloc.line);
+	}
+#endif
+    }
+  else if (idx == 6 && GET_CODE (in_rtx) == ASM_OPERANDS)
+    {
+#ifndef GENERATOR_FILE
+      if (ASM_OPERANDS_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
+	fprintf (outfile, " %s:%i",
+		 LOCATION_FILE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)),
+		 LOCATION_LINE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)));
+#endif
+    }
+  else if (idx == 1 && GET_CODE (in_rtx) == ASM_INPUT)
+    {
+#ifndef GENERATOR_FILE
+      if (ASM_INPUT_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
+	fprintf (outfile, " %s:%i",
+		 LOCATION_FILE (ASM_INPUT_SOURCE_LOCATION (in_rtx)),
+		 LOCATION_LINE (ASM_INPUT_SOURCE_LOCATION (in_rtx)));
+#endif
+    }
+  else if (idx == 5 && NOTE_P (in_rtx))
+    {
+      /* This field is only used for NOTE_INSN_DELETED_LABEL, and
+	 other times often contains garbage from INSN->NOTE death.  */
+      if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL
+	  || NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_DEBUG_LABEL)
+	fprintf (outfile, " %d",  XINT (in_rtx, idx));
+    }
+#if !defined(GENERATOR_FILE) && NUM_UNSPECV_VALUES > 0
+  else if (idx == 1
+	   && GET_CODE (in_rtx) == UNSPEC_VOLATILE
+	   && XINT (in_rtx, 1) >= 0
+	   && XINT (in_rtx, 1) < NUM_UNSPECV_VALUES)
+    fprintf (outfile, " %s", unspecv_strings[XINT (in_rtx, 1)]);
+#endif
+#if !defined(GENERATOR_FILE) && NUM_UNSPEC_VALUES > 0
+  else if (idx == 1
+	   && (GET_CODE (in_rtx) == UNSPEC
+	       || GET_CODE (in_rtx) == UNSPEC_VOLATILE)
+	   && XINT (in_rtx, 1) >= 0
+	   && XINT (in_rtx, 1) < NUM_UNSPEC_VALUES)
+    fprintf (outfile, " %s", unspec_strings[XINT (in_rtx, 1)]);
+#endif
+  else
+    {
+      int value = XINT (in_rtx, idx);
+      const char *name;
+      int is_insn = INSN_P (in_rtx);
+
+      if (flag_dump_unnumbered
+	  && (is_insn || NOTE_P (in_rtx)))
+	fputc ('#', outfile);
+      else
+	fprintf (outfile, " %d", value);
+
+      if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, idx)
+	  && XINT (in_rtx, idx) >= 0
+	  && (name = get_insn_name (XINT (in_rtx, idx))) != NULL)
+	fprintf (outfile, " {%s}", name);
+      sawclose = 0;
+    }
+}
+
+/* Subroutine of print_rtx_operand for handling code 'r'.  */
+
+static void
+print_rtx_operand_code_r (const_rtx in_rtx)
+{
+  int is_insn = INSN_P (in_rtx);
+  unsigned int regno = REGNO (in_rtx);
+
+#ifndef GENERATOR_FILE
+  if (regno < FIRST_PSEUDO_REGISTER)
+    fprintf (outfile, " %d %s", regno, reg_names[regno]);
+  else if (regno <= LAST_VIRTUAL_REGISTER)
+    {
+      if (regno == VIRTUAL_INCOMING_ARGS_REGNUM)
+	fprintf (outfile, " %d virtual-incoming-args", regno);
+      else if (regno == VIRTUAL_STACK_VARS_REGNUM)
+	fprintf (outfile, " %d virtual-stack-vars", regno);
+      else if (regno == VIRTUAL_STACK_DYNAMIC_REGNUM)
+	fprintf (outfile, " %d virtual-stack-dynamic", regno);
+      else if (regno == VIRTUAL_OUTGOING_ARGS_REGNUM)
+	fprintf (outfile, " %d virtual-outgoing-args", regno);
+      else if (regno == VIRTUAL_CFA_REGNUM)
+	fprintf (outfile, " %d virtual-cfa", regno);
+      else if (regno == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
+	fprintf (outfile, " %d virtual-preferred-stack-boundary",
+		 regno);
+      else
+	fprintf (outfile, " %d virtual-reg-%d", regno,
+		 regno-FIRST_VIRTUAL_REGISTER);
+    }
+  else
+#endif
+    if (flag_dump_unnumbered && is_insn)
+      fputc ('#', outfile);
+    else
+      fprintf (outfile, " %d", regno);
+
+#ifndef GENERATOR_FILE
+  if (REG_ATTRS (in_rtx))
+    {
+      fputs (" [", outfile);
+      if (regno != ORIGINAL_REGNO (in_rtx))
+	fprintf (outfile, "orig:%i", ORIGINAL_REGNO (in_rtx));
+      if (REG_EXPR (in_rtx))
+	print_mem_expr (outfile, REG_EXPR (in_rtx));
+
+      if (REG_OFFSET (in_rtx))
+	fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
+		 REG_OFFSET (in_rtx));
+      fputs (" ]", outfile);
+    }
+  if (regno != ORIGINAL_REGNO (in_rtx))
+    fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
+#endif
+}
+
+/* Subroutine of print_rtx_operand for handling code 'u'.  */
+
+static void
+print_rtx_operand_code_u (const_rtx in_rtx, int idx)
+{
+  if (XEXP (in_rtx, idx) != NULL)
+    {
+      rtx sub = XEXP (in_rtx, idx);
+      enum rtx_code subc = GET_CODE (sub);
+
+      if (GET_CODE (in_rtx) == LABEL_REF)
+	{
+	  if (subc == NOTE
+	      && NOTE_KIND (sub) == NOTE_INSN_DELETED_LABEL)
+	    {
+	      if (flag_dump_unnumbered)
+		fprintf (outfile, " [# deleted]");
+	      else
+		fprintf (outfile, " [%d deleted]", INSN_UID (sub));
+	      sawclose = 0;
+	      return;
+	    }
+
+	  if (subc != CODE_LABEL)
+	    {
+	      print_rtx_operand_code_e (in_rtx, idx);
+	      return;
+	    }
+	}
+
+      if (flag_dump_unnumbered
+	  || (flag_dump_unnumbered_links && idx <= 1
+	      && (INSN_P (in_rtx) || NOTE_P (in_rtx)
+		  || LABEL_P (in_rtx) || BARRIER_P (in_rtx))))
+	fputs (" #", outfile);
+      else
+	fprintf (outfile, " %d", INSN_UID (sub));
+    }
+  else
+    fputs (" 0", outfile);
+  sawclose = 0;
+}
+
 /* Print an rtx on the current line of FILE.  Initially indent IND
    characters.  */