On Tue, Nov 17, 2015 at 2:10 PM, Andrew Pinski <apin...@cavium.com> wrote: > > The way the current code was written assumes all cores have an unique part > num which is not true. What they have is an unique pair of implementer and > part num. This changes the code to look up that pair after the parsing > of the two is done. > > Someone should test this on a big.little target too just to make sure > the parsing is done correctly as I don't have access to one off hand. > > OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions.
Here is an updated version of this patch after the other patches have now gone in. OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions and -mcpu=native still works. Thanks, Andrew Pinski > > Thanks, > Andrew Pinski > > > * config/aarch64/driver-aarch64.c (host_detect_local_cpu): > Rewrite handling of part num to handle the case where > multiple implementers share the same part num. > --- > gcc/config/aarch64/driver-aarch64.c | 46 > ++++++++++++++++++++++--------------- > 1 file changed, 28 insertions(+), 18 deletions(-) > > diff --git a/gcc/config/aarch64/driver-aarch64.c > b/gcc/config/aarch64/driver-aarch64.c > index 92388a9..ea1e856 100644 > --- a/gcc/config/aarch64/driver-aarch64.c > +++ b/gcc/config/aarch64/driver-aarch64.c > @@ -158,7 +158,7 @@ host_detect_local_cpu (int argc, const char **argv) > bool tune = false; > bool cpu = false; > unsigned int i = 0; > - unsigned int core_idx = 0; > + int core_idx = -1; > unsigned char imp = INVALID_IMP; > unsigned int cores[2] = { INVALID_CORE, INVALID_CORE }; > unsigned int n_cores = 0; > @@ -206,18 +206,13 @@ host_detect_local_cpu (int argc, const char **argv) > if (strstr (buf, "part") != NULL) > { > unsigned ccore = parse_field (buf); > - for (i = 0; cpu_data[i].name != NULL; i++) > - if (ccore == cpu_data[i].part_no > - && !contains_core_p (cores, ccore)) > - { > - if (n_cores == 2) > - goto not_found; > - > - cores[n_cores++] = ccore; > - core_idx = i; > - arch_id = cpu_data[i].arch; > - break; > - } > + if (!contains_core_p (cores, ccore)) > + { > + if (n_cores == 2) > + goto not_found; > + > + cores[n_cores++] = ccore; > + } > continue; > } > if (!tune && !processed_exts && strstr (buf, "Features") != NULL) > @@ -253,11 +248,19 @@ host_detect_local_cpu (int argc, const char **argv) > if (n_cores == 0 || n_cores > 2 || imp == INVALID_IMP) > goto not_found; > > - if (arch && !arch_id) > - goto not_found; > - > if (arch) > { > + /* Search for one of the cores in the list. */ > + for (i = 0; cpu_data[i].name != NULL; i++) > + if (cpu_data[i].implementer_id == imp > + && contains_core_p (cores, cpu_data[i].part_no)) > + { > + arch_id = cpu_data[i].arch; > + break; > + } > + if (!arch_id) > + goto not_found; > + > const char* arch_name = get_arch_name_from_id (arch_id); > > /* We got some arch indentifier that's not in aarch64-arches.def? */ > @@ -284,8 +287,15 @@ host_detect_local_cpu (int argc, const char **argv) > /* The simple, non-big.LITTLE case. */ > else > { > - if (cpu_data[core_idx].implementer_id != imp) > - goto not_found; > + for (i = 0; cpu_data[i].name != NULL; i++) > + if (cores[0] == cpu_data[i].part_no > + && cpu_data[i].implementer_id == imp) > + { > + core_idx = i; > + break; > + } > + if (core_idx == -1) > + goto not_found; > > res = concat ("-m", cpu ? "cpu" : "tune", "=", > cpu_data[core_idx].name, NULL); > -- > 1.9.1 >
Index: config/aarch64/driver-aarch64.c =================================================================== --- config/aarch64/driver-aarch64.c (revision 241437) +++ config/aarch64/driver-aarch64.c (working copy) @@ -169,7 +169,6 @@ host_detect_local_cpu (int argc, const c bool tune = false; bool cpu = false; unsigned int i = 0; - unsigned int core_idx = 0; unsigned char imp = INVALID_IMP; unsigned int cores[2] = { INVALID_CORE, INVALID_CORE }; unsigned int n_cores = 0; @@ -219,18 +218,13 @@ host_detect_local_cpu (int argc, const c if (strstr (buf, "part") != NULL) { unsigned ccore = parse_field (buf); - for (i = 0; aarch64_cpu_data[i].name != NULL; i++) - if (ccore == aarch64_cpu_data[i].part_no - && !contains_core_p (cores, ccore)) - { - if (n_cores == 2) - goto not_found; - - cores[n_cores++] = ccore; - core_idx = i; - arch_id = aarch64_cpu_data[i].arch; - break; - } + if (!contains_core_p (cores, ccore)) + { + if (n_cores == 2) + goto not_found; + + cores[n_cores++] = ccore; + } continue; } if (!tune && !processed_exts && strstr (buf, "Features") != NULL) @@ -276,11 +270,19 @@ host_detect_local_cpu (int argc, const c if (n_cores == 0 || n_cores > 2 || imp == INVALID_IMP) goto not_found; - if (arch && !arch_id) - goto not_found; - if (arch) { + /* Search for one of the cores in the list. */ + for (i = 0; aarch64_cpu_data[i].name != NULL; i++) + if (aarch64_cpu_data[i].implementer_id == imp + && contains_core_p (cores, aarch64_cpu_data[i].part_no)) + { + arch_id = aarch64_cpu_data[i].arch; + break; + } + if (!arch_id) + goto not_found; + struct aarch64_arch_driver_info* arch_info = get_arch_from_id (arch_id); /* We got some arch indentifier that's not in aarch64-arches.def? */ @@ -312,7 +314,15 @@ host_detect_local_cpu (int argc, const c /* The simple, non-big.LITTLE case. */ else { - if (aarch64_cpu_data[core_idx].implementer_id != imp) + int core_idx = -1; + for (i = 0; aarch64_cpu_data[i].name != NULL; i++) + if (cores[0] == aarch64_cpu_data[i].part_no + && aarch64_cpu_data[i].implementer_id == imp) + { + core_idx = i; + break; + } + if (core_idx == -1) goto not_found; res = concat ("-m", cpu ? "cpu" : "tune", "=",