David discovered that there was a thinko in the logic of the powerpc setting
for the default tuning option.  In theory, the compiler was supposed to use
PROCESSOR_DEFAULT for 32-bit targets and PROCESSOR_DEFAULT64 for 64-bit targets
if no cpu or tuning option was used in configuring the compiler.  The current
linux64.h and aix61.h files set this to be power7.  However, the code actually
set the tuning to the default cpu used for code generation (powerpc and
powerpc64).

This patch for both 4.7 and 4.8 fixes the code so that the tm.h can set the
default as intended.  The person configuring the compiler can still use
--with-cpu=<xxx>, --with-tune=<xxx>, --with-cpu-32=<xxx>, --with-tune-32=<xxx>,
--with-cpu-64=<xxx> and --with-tune-64=<xxxx> to adjust the defaults to meet
local conditions.

I have bootstraped and ran make check with and without hte patches.  There are
no regressions with the patch, and one test now succeeds if power7 tuning is
used (64-bit gcc.dg/tree-prof/bb-reorg.c).  Is this ok to install?  David and I
think this is important to get into 4.7 rather than 4.7.1.

2012-03-07  Michael Meissner  <meiss...@the-meissners.org>

        * config/rs6000/linux64.h (OPTION_TARGET_CPU_DEFAULT): Do not
        redefine to be NULL if the current bit-size is different from the
        configured bit-size.

        * config/rs6000/rs6000.c (rs6000_option_override_internal): If the
        cpu is defaulted, use PROCESSOR_DEFAULT and PROCESSOR_DEFAULT64 to
        set the default tuning.  Add asserts to make sure the cpu and tune
        indexes are defined.
        (rs6000_file_start): Do not reset the default cpu if the current
        bit-size is different from the configured bit-size.

-- 
Michael Meissner, IBM
5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA
meiss...@linux.vnet.ibm.com     fax +1 (978) 399-6899
Index: gcc/config/rs6000/linux64.h
===================================================================
--- gcc/config/rs6000/linux64.h (revision 185071)
+++ gcc/config/rs6000/linux64.h (working copy)
@@ -159,15 +159,6 @@ extern int dot_symbols;
     }                                                          \
   while (0)
 
-#ifdef RS6000_BI_ARCH
-
-#undef OPTION_TARGET_CPU_DEFAULT
-#define        OPTION_TARGET_CPU_DEFAULT \
-  (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
-   ? (char *) 0 : TARGET_CPU_DEFAULT)
-
-#endif
-
 #undef ASM_DEFAULT_SPEC
 #undef ASM_SPEC
 #undef LINK_OS_LINUX_SPEC
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  (revision 185071)
+++ gcc/config/rs6000/rs6000.c  (working copy)
@@ -2596,6 +2596,7 @@ static bool
 rs6000_option_override_internal (bool global_init_p)
 {
   bool ret = true;
+  bool have_cpu = false;
   const char *default_cpu = OPTION_TARGET_CPU_DEFAULT;
   int set_masks;
   int cpu_index;
@@ -2665,30 +2666,51 @@ rs6000_option_override_internal (bool gl
      the cpu in a target attribute or pragma, but did not specify a tuning
      option, use the cpu for the tuning option rather than the option specified
      with -mtune on the command line.  */
-  if (rs6000_cpu_index > 0)
-    cpu_index = rs6000_cpu_index;
-  else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index > 0)
-    rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
+  if (rs6000_cpu_index >= 0)
+    {
+      cpu_index = rs6000_cpu_index;
+      have_cpu = true;
+    }
+  else if (main_target_opt != NULL && main_target_opt->x_rs6000_cpu_index >= 0)
+    {
+      rs6000_cpu_index = cpu_index = main_target_opt->x_rs6000_cpu_index;
+      have_cpu = true;
+    }
   else
-    rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
+    {
+      if (!default_cpu)
+       default_cpu = (TARGET_POWERPC64 ? "powerpc64" : "powerpc");
+
+      rs6000_cpu_index = cpu_index = rs6000_cpu_name_lookup (default_cpu);
+    }
+
+  gcc_assert (cpu_index >= 0);
+
+  target_flags &= ~set_masks;
+  target_flags |= (processor_target_table[cpu_index].target_enable
+                  & set_masks);
 
-  if (rs6000_tune_index > 0)
+  if (rs6000_tune_index >= 0)
     tune_index = rs6000_tune_index;
-  else
+  else if (have_cpu)
     rs6000_tune_index = tune_index = cpu_index;
-
-  if (cpu_index >= 0)
+  else
     {
-      target_flags &= ~set_masks;
-      target_flags |= (processor_target_table[cpu_index].target_enable
-                      & set_masks);
+      size_t i;
+      enum processor_type tune_proc
+       = (TARGET_POWERPC64 ? PROCESSOR_DEFAULT64 : PROCESSOR_DEFAULT);
+
+      tune_index = -1;
+      for (i = 0; i < ARRAY_SIZE (processor_target_table); i++)
+       if (processor_target_table[i].processor == tune_proc)
+         {
+           rs6000_tune_index = tune_index = i;
+           break;
+         }
     }
 
-  rs6000_cpu = ((tune_index >= 0)
-               ? processor_target_table[tune_index].processor
-               : (TARGET_POWERPC64
-                  ? PROCESSOR_DEFAULT64
-                  : PROCESSOR_DEFAULT));
+  gcc_assert (tune_index >= 0);
+  rs6000_cpu = processor_target_table[tune_index].processor;
 
   if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3
       || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == 
PROCESSOR_PPCE500MC64)
@@ -4023,11 +4045,6 @@ rs6000_file_start (void)
 
   default_file_start ();
 
-#ifdef TARGET_BI_ARCH
-  if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)
-    rs6000_default_cpu = 0;
-#endif
-
   if (flag_verbose_asm)
     {
       sprintf (buffer, "\n%s rs6000/powerpc options:", ASM_COMMENT_START);

Reply via email to