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);