Andrew Carlotti <andrew.carlo...@arm.com> writes: > For native cpu feature detection, certain features have no entry in > /proc/cpuinfo, so have to be assumed to be present whenever the detected > cpu is supposed to support that feature. > > However, the logic for this was mistakenly implemented by excluding > these features from part of aarch64_get_extension_string_for_isa_flags. > This function is also used elsewhere when canonicalising explicit > feature sets, which may require removing features that are normally > implied by the specified architecture version. > > This change reenables generation of +nopredres, +nols64 and +nomops > during canonicalisation, by relocating the misplaced native cpu > detection logic. > > gcc/ChangeLog: > > * common/config/aarch64/aarch64-common.cc > (aarch64_get_extension_string_for_isa_flags): Remove filtering > of features without native detection. > * config/aarch64/driver-aarch64.cc (host_detect_local_cpu): > Explicitly add expected features that lack cpuinfo detection. > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/options_set_29.c: New test. > > > diff --git a/gcc/common/config/aarch64/aarch64-common.cc > b/gcc/common/config/aarch64/aarch64-common.cc > index > ee2ea7eae105d19ec906ef8d25d3a237fbeac4b4..37e60d6083e290b18b1f4c6274123b0a58de5476 > 100644 > --- a/gcc/common/config/aarch64/aarch64-common.cc > +++ b/gcc/common/config/aarch64/aarch64-common.cc > @@ -357,8 +357,7 @@ aarch64_get_extension_string_for_isa_flags > } > > for (auto &opt : all_extensions) > - if (opt.native_detect_p > - && (opt.flag_canonical != AARCH64_FL_CRYPTO) > + if ((opt.flag_canonical != AARCH64_FL_CRYPTO) > && (opt.flag_canonical & current_flags & ~isa_flags)) > { > current_flags &= ~opt.flags_off;
This is the only use of native_detect_p, so it'd be good to remove the field itself. > diff --git a/gcc/config/aarch64/driver-aarch64.cc > b/gcc/config/aarch64/driver-aarch64.cc > index > 8e318892b10aa2288421fad418844744a2f5a3b4..470c19b650f1ae953918eaeddbf0f768c12a99d9 > 100644 > --- a/gcc/config/aarch64/driver-aarch64.cc > +++ b/gcc/config/aarch64/driver-aarch64.cc > @@ -262,6 +262,7 @@ host_detect_local_cpu (int argc, const char **argv) > unsigned int n_variants = 0; > bool processed_exts = false; > aarch64_feature_flags extension_flags = 0; > + aarch64_feature_flags unchecked_extension_flags = 0; > aarch64_feature_flags default_flags = 0; > std::string buf; > size_t sep_pos = -1; > @@ -348,7 +349,10 @@ host_detect_local_cpu (int argc, const char **argv) > /* If the feature contains no HWCAPS string then ignore it for the > auto detection. */ > if (val.empty ()) > - continue; > + { > + unchecked_extension_flags |= aarch64_extensions[i].flag; > + continue; > + } > > bool enabled = true; > > @@ -447,6 +451,13 @@ host_detect_local_cpu (int argc, const char **argv) > if (tune) > return res; > > + if (!processed_exts) > + goto not_found; Could you explain this part? It seems like more of a parsing change (i.e. being more strict about what we accept). If that's the intention, it probably belongs in: if (n_cores == 0 || n_cores > 2 || (n_cores == 1 && n_variants != 1) || imp == INVALID_IMP) goto not_found; But maybe it should be a separate patch. Looks good otherwise, thanks. Richard > + > + /* Add any features that should be be present, but can't be verified using > + the /proc/cpuinfo "Features" list. */ > + extension_flags |= unchecked_extension_flags & default_flags; > + > { > std::string extension > = aarch64_get_extension_string_for_isa_flags (extension_flags, > diff --git a/gcc/testsuite/gcc.target/aarch64/options_set_29.c > b/gcc/testsuite/gcc.target/aarch64/options_set_29.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..01bb73c02e232bdfeca5f16dad3fa2a6484843d5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/options_set_29.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv9.3-a+nopredres+nols64+nomops" } */ > + > +int main () > +{ > + return 0; > +} > + > +/* { dg-final { scan-assembler-times {\.arch > armv9\.3\-a\+crc\+nopredres\+nols64\+nomops\n} 1 } } */ > + > +/* Checking if enabling default features drops the superfluous bits. */