https://gcc.gnu.org/g:db3b4de65c0e0f05fa78723d978de35519efb482

commit db3b4de65c0e0f05fa78723d978de35519efb482
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Wed Jul 24 19:16:06 2024 -0400

    Separate architecture flags from ISA flags
    
    2024-07-24  Michael Meissner  <meiss...@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/rs6000-cpus.def (ARCH_MASK_POWER*): New macros.
            * config/rs6000/rs6000.cc (rs6000_print_isa_options): Print out the
            architure bits.
            (get_arch_flags): New function.
            (rs6000_debug_reg_global): Add support for separating architecture 
flags
            the ISA flags.
            (rs6000_option_override_internal): Likewise.
            (struct rs6000_arch_mask): Likewise.
            (rs6000_arch_masks): Likewise.
            (rs6000_function_specific_save): Likewise.
            (rs6000_function_specific_restore): Likewise.
            (rs6000_function_specific_print): Likewise.
            (rs6000_print_options_internal): Likewise.
            (rs6000_can_inline_p): Likewise.
            * config/rs6000/rs6000.opt (rs6000_arch_flags): New target variable.
            (x_rs6000_arch_flags): New save area for rs6000_arch_flags.

Diff:
---
 gcc/config/rs6000/rs6000-cpus.def |  15 ++++
 gcc/config/rs6000/rs6000.cc       | 153 +++++++++++++++++++++++++++++++++-----
 gcc/config/rs6000/rs6000.h        |   1 -
 gcc/config/rs6000/rs6000.opt      |   8 ++
 4 files changed, 159 insertions(+), 18 deletions(-)

diff --git a/gcc/config/rs6000/rs6000-cpus.def 
b/gcc/config/rs6000/rs6000-cpus.def
index 84fac8bdac1d..9c982df89dae 100644
--- a/gcc/config/rs6000/rs6000-cpus.def
+++ b/gcc/config/rs6000/rs6000-cpus.def
@@ -158,6 +158,21 @@
 
 #endif
 
+/* List of architecture masks (to set the _ARCH_PWR<x> flag that don't have a
+   separate -m option.  It the past, we would have -mpower11, -mpower10,
+   -mpower9, etc. but bad things would happen if the user did -mpower10 instead
+   of -mcpu=power10.  Over time, older options will be removed as -m<option>
+   and moved into this list.  */
+
+#define ARCH_MASK_POWER4       (HOST_WIDE_INT_1 << 1)
+#define ARCH_MASK_POWER5       (HOST_WIDE_INT_1 << 2)
+#define ARCH_MASK_POWER6       (HOST_WIDE_INT_1 << 3)
+#define ARCH_MASK_POWER7       (HOST_WIDE_INT_1 << 4)
+#define ARCH_MASK_POWER8       (HOST_WIDE_INT_1 << 5)
+#define ARCH_MASK_POWER9       (HOST_WIDE_INT_1 << 6)
+#define ARCH_MASK_POWER10      (HOST_WIDE_INT_1 << 7)
+#define ARCH_MASK_POWER11      (HOST_WIDE_INT_1 << 8)
+
 /* This table occasionally claims that a processor does not support a
    particular feature even though it does, but the feature is slower than the
    alternative.  Thus, it shouldn't be relied on as a complete description of
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index eddd2adbab59..6ceea856c0e4 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -1170,7 +1170,7 @@ enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx, 
enum reg_class)
 const int INSN_NOT_AVAILABLE = -1;
 
 static void rs6000_print_isa_options (FILE *, int, const char *,
-                                     HOST_WIDE_INT);
+                                     HOST_WIDE_INT, HOST_WIDE_INT);
 static HOST_WIDE_INT rs6000_disable_incompatible_switches (void);
 
 static enum rs6000_reg_type register_to_reg_type (rtx, bool *);
@@ -1817,6 +1817,57 @@ rs6000_cpu_name_lookup (const char *name)
   return -1;
 }
 
+
+/* Map the processor into the arch bits that are set off of -mcpu=<xxx> instead
+   of having an internal -m<foo> option.  */
+
+static HOST_WIDE_INT
+get_arch_flags (int cpu_index)
+{
+  HOST_WIDE_INT ret = 0;
+
+  if (cpu_index >= 0)
+    switch (processor_target_table[cpu_index].processor)
+      {
+      case PROCESSOR_POWER11:
+       ret |= ARCH_MASK_POWER11;
+       /* fall through.  */
+
+      case PROCESSOR_POWER10:
+       ret |= ARCH_MASK_POWER10;
+       /* fall through.  */
+
+      case PROCESSOR_POWER9:
+       ret |= ARCH_MASK_POWER9;
+       /* fall through.  */
+
+      case PROCESSOR_POWER8:
+       ret |= ARCH_MASK_POWER8;
+       /* fall through.  */
+
+      case PROCESSOR_POWER7:
+       ret |= ARCH_MASK_POWER7;
+       /* fall through.  */
+
+      case PROCESSOR_POWER6:
+       ret |= ARCH_MASK_POWER6;
+       /* fall through.  */
+
+      case PROCESSOR_POWER5:
+       ret |= ARCH_MASK_POWER5;
+       /* fall through.  */
+
+      case PROCESSOR_POWER4:
+       ret |= ARCH_MASK_POWER4;
+       break;
+
+      default:
+       break;
+      }
+
+  return ret;
+}
+
 
 /* Return number of consecutive hard regs needed starting at reg REGNO
    to hold something of mode MODE.
@@ -2398,9 +2449,10 @@ rs6000_debug_reg_global (void)
       const char *name = processor_target_table[rs6000_cpu_index].name;
       HOST_WIDE_INT flags
        = processor_target_table[rs6000_cpu_index].target_enable;
+      HOST_WIDE_INT arch_flags = get_arch_flags (rs6000_cpu_index);
 
       sprintf (flags_buffer, "-mcpu=%s flags", name);
-      rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
+      rs6000_print_isa_options (stderr, 0, flags_buffer, flags, arch_flags);
     }
   else
     fprintf (stderr, DEBUG_FMT_S, "cpu", "<none>");
@@ -2410,21 +2462,26 @@ rs6000_debug_reg_global (void)
       const char *name = processor_target_table[rs6000_tune_index].name;
       HOST_WIDE_INT flags
        = processor_target_table[rs6000_tune_index].target_enable;
+      HOST_WIDE_INT arch_flags = get_arch_flags (rs6000_tune_index);
 
       sprintf (flags_buffer, "-mtune=%s flags", name);
-      rs6000_print_isa_options (stderr, 0, flags_buffer, flags);
+      rs6000_print_isa_options (stderr, 0, flags_buffer, flags, arch_flags);
     }
   else
     fprintf (stderr, DEBUG_FMT_S, "tune", "<none>");
 
   cl_target_option_save (&cl_opts, &global_options, &global_options_set);
   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags",
-                           rs6000_isa_flags);
+                           rs6000_isa_flags, 0);
 
   rs6000_print_isa_options (stderr, 0, "rs6000_isa_flags_explicit",
-                           rs6000_isa_flags_explicit);
+                           rs6000_isa_flags_explicit, 0);
 
-  rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
+  if (rs6000_arch_flags)
+    rs6000_print_isa_options (stderr, 0, "rs6000_arch_flags", 0,
+                             rs6000_arch_flags);
+
+  rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT, 0);
 
   fprintf (stderr, DEBUG_FMT_S, "--with-cpu default",
           OPTION_TARGET_CPU_DEFAULT ? OPTION_TARGET_CPU_DEFAULT : "<none>");
@@ -3625,7 +3682,7 @@ rs6000_option_override_internal (bool global_init_p)
 
   /* Print defaults.  */
   if ((TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) && global_init_p)
-    rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT);
+    rs6000_print_isa_options (stderr, 0, "TARGET_DEFAULT", TARGET_DEFAULT, 0);
 
   /* Remember the explicit arguments.  */
   if (global_init_p)
@@ -3756,6 +3813,8 @@ rs6000_option_override_internal (bool global_init_p)
       rs6000_isa_flags |= (flags & ~rs6000_isa_flags_explicit);
     }
 
+  rs6000_arch_flags = get_arch_flags (cpu_index);
+
   /* Don't expect powerpc64 enabled on those OSes with OS_MISSING_POWERPC64,
      since they do not save and restore the high half of the GPRs correctly
      in all cases.  If the user explicitly specifies it, we won't interfere
@@ -3870,7 +3929,8 @@ rs6000_option_override_internal (bool global_init_p)
                         & ~rs6000_isa_flags_explicit);
 
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
-    rs6000_print_isa_options (stderr, 0, "before defaults", rs6000_isa_flags);
+    rs6000_print_isa_options (stderr, 0, "before defaults", rs6000_isa_flags,
+                             rs6000_arch_flags);
 
 #ifdef XCOFF_DEBUGGING_INFO
   /* For AIX default to 64-bit DWARF.  */
@@ -4232,7 +4292,8 @@ rs6000_option_override_internal (bool global_init_p)
 
   /* Print the options after updating the defaults.  */
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
-    rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags);
+    rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags,
+                             rs6000_arch_flags);
 
   /* E500mc does "better" if we inline more aggressively.  Respect the
      user's opinion, though.  */
@@ -4339,7 +4400,8 @@ rs6000_option_override_internal (bool global_init_p)
     TARGET_NO_FP_IN_TOC = 1;
 
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
-    rs6000_print_isa_options (stderr, 0, "before subtarget", rs6000_isa_flags);
+    rs6000_print_isa_options (stderr, 0, "before subtarget", rs6000_isa_flags,
+                             rs6000_arch_flags);
 
 #ifdef SUBTARGET_OVERRIDE_OPTIONS
   SUBTARGET_OVERRIDE_OPTIONS;
@@ -4406,7 +4468,8 @@ rs6000_option_override_internal (bool global_init_p)
     rs6000_isa_flags &= ~OPTION_MASK_PCREL_OPT;
 
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
-    rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
+    rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags,
+                             rs6000_arch_flags);
 
   rs6000_always_hint = (rs6000_tune != PROCESSOR_POWER4
                        && rs6000_tune != PROCESSOR_POWER5
@@ -24542,6 +24605,25 @@ static struct rs6000_opt_mask const rs6000_opt_masks[] 
=
   { "string",                  0,                              false, false },
 };
 
+/* Similar structure for the arch bits that are set via -mcpu=<xxx> and not via
+   a separate -m<yyy> option.  */
+struct rs6000_arch_mask {
+  const char *name;                    /* option name */
+  const HOST_WIDE_INT mask;            /* mask to set */
+};
+
+static struct rs6000_arch_mask const rs6000_arch_masks[] =
+{
+  { "power4",  ARCH_MASK_POWER4  },
+  { "power5",  ARCH_MASK_POWER5  },
+  { "power6",  ARCH_MASK_POWER6  },
+  { "power7",  ARCH_MASK_POWER7  },
+  { "power8",  ARCH_MASK_POWER8  },
+  { "power9",  ARCH_MASK_POWER9  },
+  { "power10", ARCH_MASK_POWER10 },
+  { "power11", ARCH_MASK_POWER11 },
+};
+
 /* Option variables that we want to support inside attribute((target)) and
    #pragma GCC target operations.  */
 
@@ -25076,6 +25158,7 @@ rs6000_function_specific_save (struct cl_target_option 
*ptr,
 {
   ptr->x_rs6000_isa_flags = opts->x_rs6000_isa_flags;
   ptr->x_rs6000_isa_flags_explicit = opts->x_rs6000_isa_flags_explicit;
+  ptr->x_rs6000_arch_flags = opts->x_rs6000_arch_flags;
 }
 
 /* Restore the current options */
@@ -25088,6 +25171,7 @@ rs6000_function_specific_restore (struct gcc_options 
*opts,
 {
   opts->x_rs6000_isa_flags = ptr->x_rs6000_isa_flags;
   opts->x_rs6000_isa_flags_explicit = ptr->x_rs6000_isa_flags_explicit;
+  opts->x_rs6000_arch_flags = ptr->x_rs6000_arch_flags;
   (void) rs6000_option_override_internal (false);
 }
 
@@ -25098,10 +25182,12 @@ rs6000_function_specific_print (FILE *file, int 
indent,
                                struct cl_target_option *ptr)
 {
   rs6000_print_isa_options (file, indent, "Isa options set",
-                           ptr->x_rs6000_isa_flags);
+                           ptr->x_rs6000_isa_flags,
+                           ptr->x_rs6000_arch_flags);
 
   rs6000_print_isa_options (file, indent, "Isa options explicit",
-                           ptr->x_rs6000_isa_flags_explicit);
+                           ptr->x_rs6000_isa_flags_explicit,
+                           ptr->x_rs6000_arch_flags);
 }
 
 /* Helper function to print the current isa or misc options on a line.  */
@@ -25113,13 +25199,18 @@ rs6000_print_options_internal (FILE *file,
                               HOST_WIDE_INT flags,
                               const char *prefix,
                               const struct rs6000_opt_mask *opts,
-                              size_t num_elements)
+                              size_t num_elements,
+                              HOST_WIDE_INT arch_flags,
+                              const char *arch_prefix,
+                              const struct rs6000_arch_mask *arch_masks,
+                              size_t num_arch)
 {
   size_t i;
   size_t start_column = 0;
   size_t cur_column;
   size_t max_column = 120;
   size_t prefix_len = strlen (prefix);
+  size_t arch_prefix_len = strlen (arch_prefix);
   size_t comma_len = 0;
   const char *comma = "";
 
@@ -25179,6 +25270,29 @@ rs6000_print_options_internal (FILE *file,
       comma_len = strlen (", ");
     }
 
+  /* Put out the architecture flag bits that are set via -mcpu=<xxx> and that
+     don't have a -m option.  */
+  for (i = 0; i < num_arch; i++)
+    {
+      if ((arch_flags & arch_masks[i].mask) != 0)
+       {
+         const char *name = arch_masks[i].name;
+         size_t len = comma_len + arch_prefix_len + strlen (name);
+
+         cur_column += len;
+         if (cur_column > max_column)
+           {
+             fprintf (stderr, ", \\\n%*s", (int)start_column, "");
+             cur_column = start_column + len;
+             comma = "";
+           }
+
+         fprintf (file, "%s%s%s", comma, arch_prefix, name);
+         comma = ", ";
+         comma_len = strlen (", ");
+       }
+    }
+
   fputs ("\n", file);
 }
 
@@ -25186,11 +25300,13 @@ rs6000_print_options_internal (FILE *file,
 
 static void
 rs6000_print_isa_options (FILE *file, int indent, const char *string,
-                         HOST_WIDE_INT flags)
+                         HOST_WIDE_INT flags, HOST_WIDE_INT arch_flags)
 {
   rs6000_print_options_internal (file, indent, string, flags, "-m",
                                 &rs6000_opt_masks[0],
-                                ARRAY_SIZE (rs6000_opt_masks));
+                                ARRAY_SIZE (rs6000_opt_masks),
+                                arch_flags, "arch=", &rs6000_arch_masks[0],
+                                ARRAY_SIZE (rs6000_arch_masks));
 }
 
 /* If the user used -mno-vsx, we need turn off all of the implicit ISA 2.06,
@@ -25781,6 +25897,8 @@ rs6000_can_inline_p (tree caller, tree callee)
   HOST_WIDE_INT callee_isa = callee_opts->x_rs6000_isa_flags;
   HOST_WIDE_INT caller_isa = caller_opts->x_rs6000_isa_flags;
   HOST_WIDE_INT explicit_isa = callee_opts->x_rs6000_isa_flags_explicit;
+  HOST_WIDE_INT callee_arch = callee_opts->x_rs6000_arch_flags;
+  HOST_WIDE_INT caller_arch = caller_opts->x_rs6000_arch_flags;
 
   cgraph_node *callee_node = cgraph_node::get (callee);
   if (ipa_fn_summaries && ipa_fn_summaries->get (callee_node) != NULL)
@@ -25804,7 +25922,8 @@ rs6000_can_inline_p (tree caller, tree callee)
      callee has explicitly enabled or disabled, then we must enforce that
      the callee's and caller's options match exactly; see PR70010.  */
   if (((caller_isa & callee_isa) == callee_isa)
-      && (caller_isa & explicit_isa) == (callee_isa & explicit_isa))
+      && (caller_isa & explicit_isa) == (callee_isa & explicit_isa)
+      && (caller_arch & callee_arch) == callee_arch)
     ret = true;
 
   if (TARGET_DEBUG_TARGET)
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 703be908d944..3b559ea1c637 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -2480,4 +2480,3 @@ while (0)
    with certain input values.  This can be removed in the future when the
    issues have been resolved.  */
 #define RS6000_DISABLE_SCALAR_MODULO 1
-
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 94323bd1db26..73dfb63a81ce 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -36,6 +36,14 @@ HOST_WIDE_INT rs6000_isa_flags_explicit
 TargetSave
 HOST_WIDE_INT x_rs6000_isa_flags_explicit
 
+;; Arch bits that are set via -mcpu=<xxx> but don't have a user -m<processor>
+;; option
+Variable
+HOST_WIDE_INT rs6000_arch_flags = 0
+
+TargetSave
+HOST_WIDE_INT x_rs6000_arch_flags
+
 ;; Current processor
 TargetVariable
 enum processor_type rs6000_cpu = PROCESSOR_PPC603

Reply via email to