Use function to replace manual machine_mode parsing.

gcc/ChangeLog:

        * machmode.h (parse_machine_mode): New function.
        * read-rtl.cc (find_mode): Use parse_machine_mode.
        * config/riscv/riscv-v.cc (autovectorize_vector_modes): Likewise.

gcc/c-family/ChangeLog:

        * c-attribs.cc (handle_mode_attribute): Use parse_machine_mode.

-- >8 --

This abstracts out the parsing of a machine mode from its name as I needed
that for my next patch and was surprised not to be able to find it
.
I found some manual parsings so switched those to use this new function.

Regression tested and boostrapped on aarch64-linux-gnu,x86-linux-gnu,
and armhf-linux-gnu.
Built on riscv, trying to do a bootstrap and will report back if it fails.

Okay for master?
Alfie

---
 gcc/c-family/c-attribs.cc   |  8 +-------
 gcc/config/riscv/riscv-v.cc | 10 ++++------
 gcc/machmode.h              | 12 ++++++++++++
 gcc/read-rtl.cc             | 10 ++++------
 4 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index ae5c2743ce6..3c0e780669b 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -2429,7 +2429,6 @@ handle_mode_attribute (tree *node, tree name, tree args,
     warning (OPT_Wattributes, "%qE attribute ignored", name);
   else
     {
-      int j;
       const char *p = IDENTIFIER_POINTER (ident);
       int len = strlen (p);
       machine_mode mode = VOIDmode;
@@ -2461,12 +2460,7 @@ handle_mode_attribute (tree *node, tree name, tree args,
       else if (!strcmp (p, "unwind_word"))
        mode = targetm.unwind_word_mode ();
       else
-       for (j = 0; j < NUM_MACHINE_MODES; j++)
-         if (!strcmp (p, GET_MODE_NAME (j)))
-           {
-             mode = (machine_mode) j;
-             break;
-           }
+       parse_machine_mode (p, &mode);
 
       if (mode == VOIDmode)
        {
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index e50ebdee163..7329ce2c71b 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -3068,13 +3068,11 @@ autovectorize_vector_modes (vector_modes *modes, bool)
       ms.safe_splice (*modes);
       modes->truncate (0);
 
-      for (machine_mode mode : ms)
+      machine_mode mode;
+      if (parse_machine_mode (riscv_autovec_mode, &mode))
        {
-         if (!strcmp (GET_MODE_NAME (mode), riscv_autovec_mode))
-           {
-             modes->safe_push (mode);
-             return 0;
-           }
+         modes->safe_push (mode);
+         return 0;
        }
 
       /* Nothing found, fall back to regular handling.  */
diff --git a/gcc/machmode.h b/gcc/machmode.h
index b92b1572d8d..17d6428f9a5 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -926,6 +926,18 @@ smallest_int_mode_for_size (poly_uint64 size)
   return dyn_cast <scalar_int_mode> (smallest_mode_for_size (size, MODE_INT));
 }
 
+inline bool
+parse_machine_mode (const char *name, machine_mode *result)
+{
+  for (unsigned i = 0; i < NUM_MACHINE_MODES; i++)
+    if (strcmp (GET_MODE_NAME (i), name) == 0)
+      {
+       *result = (machine_mode) i;
+       return true;
+      }
+  return false;
+}
+
 extern opt_scalar_int_mode int_mode_for_mode (machine_mode);
 extern opt_machine_mode bitwise_mode_for_mode (machine_mode);
 extern opt_machine_mode mode_for_vector (scalar_mode, poly_uint64);
diff --git a/gcc/read-rtl.cc b/gcc/read-rtl.cc
index be9f2da37e1..de95d859f78 100644
--- a/gcc/read-rtl.cc
+++ b/gcc/read-rtl.cc
@@ -197,13 +197,11 @@ atoll (const char *p)
 static HOST_WIDE_INT
 find_mode (const char *name)
 {
-  int i;
-
-  for (i = 0; i < NUM_MACHINE_MODES; i++)
-    if (strcmp (GET_MODE_NAME (i), name) == 0)
-      return i;
+  machine_mode mode;
+  if (!parse_machine_mode (name, &mode))
+    fatal_with_file_and_line ("unknown mode `%s'", name);
 
-  fatal_with_file_and_line ("unknown mode `%s'", name);
+  return (HOST_WIDE_INT) mode;
 }
 
 static void
-- 
2.43.0

Reply via email to