Looking at PR99929 showed that we weren't dumping enough information
about variable-length CONST_VECTORs.  Something like:

  (const_vector:VNx4SI [(const_int 1) (const_int 0)])

could be either:

(a) 1, 0, 1, 0, repeating
(b) 1 followed by all zeros

This patch adds more information to the dumps.  There are four cases:

(a) above:

    (const_vector:VNx4SI repeat [
      (const_int 1)
      (const_int 0)
    ])

(b) above:

    (const_vector:VNx4SI [
      (const_int 1)
      repeat [
        (const_int 0)
      ]
    ])

a single stepped sequence:

    (const_vector:VNx4SI [
      (const_int 0)
      stepped [
        (const_int 1)
        (const_int 2)
      ]
    ])

interleaved stepped sequences:

    (const_vector:VNx4SI [
      (const_int 0)
      (const_int 40)
      stepped (interleave 2) [
        (const_int 1)
        (const_int 41)
        (const_int 2)
        (const_int 42)
      ]
    ])

There are probably better syntaxes, but hopefully this is at least
an improvement on the status quo.

Tested on aarch64-linux-gnu, arm-linux-gnueabihf, armeb-eabi
and x86_64-linux-gnu.  OK to install now, or should it wait
until GCC 12?  (It only affects SVE in practice.)

Richard


gcc/
        * print-rtl.c (rtx_writer::print_rtx_operand_codes_E_and_V): Print
        more information about variable-length CONST_VECTORs.
---
 gcc/print-rtl.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index c7982bce507..081fc50fab8 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -370,6 +370,10 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx 
in_rtx, int idx)
       print_rtx_head, m_indent * 2, "");
       m_sawclose = 0;
     }
+  if (GET_CODE (in_rtx) == CONST_VECTOR
+      && !GET_MODE_NUNITS (GET_MODE (in_rtx)).is_constant ()
+      && CONST_VECTOR_DUPLICATE_P (in_rtx))
+    fprintf (m_outfile, " repeat");
   fputs (" [", m_outfile);
   if (XVEC (in_rtx, idx) != NULL)
     {
@@ -377,12 +381,32 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx 
in_rtx, int idx)
       if (XVECLEN (in_rtx, idx))
        m_sawclose = 1;
 
+      int barrier = XVECLEN (in_rtx, idx);
+      if (GET_CODE (in_rtx) == CONST_VECTOR
+         && !GET_MODE_NUNITS (GET_MODE (in_rtx)).is_constant ())
+       barrier = CONST_VECTOR_NPATTERNS (in_rtx);
+
       for (int j = 0; j < XVECLEN (in_rtx, idx); j++)
        {
          int j1;
 
+         if (j == barrier)
+           {
+             fprintf (m_outfile, "\n%s%*s",
+                      print_rtx_head, m_indent * 2, "");
+             if (!CONST_VECTOR_STEPPED_P (in_rtx))
+               fprintf (m_outfile, "repeat [");
+             else if (CONST_VECTOR_NPATTERNS (in_rtx) == 1)
+               fprintf (m_outfile, "stepped [");
+             else
+               fprintf (m_outfile, "stepped (interleave %d) [",
+                        CONST_VECTOR_NPATTERNS (in_rtx));
+             m_indent += 2;
+           }
+
          print_rtx (XVECEXP (in_rtx, idx, j));
-         for (j1 = j + 1; j1 < XVECLEN (in_rtx, idx); j1++)
+         int limit = MIN (barrier, XVECLEN (in_rtx, idx));
+         for (j1 = j + 1; j1 < limit; j1++)
            if (XVECEXP (in_rtx, idx, j) != XVECEXP (in_rtx, idx, j1))
              break;
 
@@ -393,6 +417,12 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx 
in_rtx, int idx)
            }
        }
 
+      if (barrier < XVECLEN (in_rtx, idx))
+       {
+         m_indent -= 2;
+         fprintf (m_outfile, "\n%s%*s]", print_rtx_head, m_indent * 2, "");
+       }
+
       m_indent -= 2;
     }
   if (m_sawclose)
-- 
2.17.1

Reply via email to