Andrew Carlotti <andrew.carlo...@arm.com> writes: > On Wed, Feb 19, 2025 at 12:17:55PM +0000, Richard Sandiford wrote: >> Andrew Carlotti <andrew.carlo...@arm.com> writes: >> > /* Print a list of CANDIDATES for an argument, and try to suggest a >> > specific >> > close match. */ >> > diff --git a/gcc/config/aarch64/aarch64-builtins.cc >> > b/gcc/config/aarch64/aarch64-builtins.cc >> > index >> > 128cc365d3d585e01cb69668f285318ee56a36fc..5174fb1daefee2d73a5098e0de1cca73dc103416 >> > 100644 >> > --- a/gcc/config/aarch64/aarch64-builtins.cc >> > +++ b/gcc/config/aarch64/aarch64-builtins.cc >> > @@ -1877,23 +1877,31 @@ aarch64_scalar_builtin_type_p (aarch64_simd_type t) >> > return (t == Poly8_t || t == Poly16_t || t == Poly64_t || t == >> > Poly128_t); >> > } >> > >> > -/* Enable AARCH64_FL_* flags EXTRA_FLAGS on top of the base Advanced SIMD >> > - set. */ >> > -aarch64_simd_switcher::aarch64_simd_switcher (aarch64_feature_flags >> > extra_flags) >> > +/* Temporarily set FLAGS as the enabled target features. */ >> > +aarch64_target_switcher::aarch64_target_switcher (aarch64_feature_flags >> > flags) >> > : m_old_asm_isa_flags (aarch64_asm_isa_flags), >> > - m_old_general_regs_only (TARGET_GENERAL_REGS_ONLY) >> > + m_old_general_regs_only (TARGET_GENERAL_REGS_ONLY), >> > + m_old_target_pragma (current_target_pragma) >> > { >> > + /* Include all dependencies. */ >> > + flags = aarch64_get_required_features (flags); >> > + >> > /* Changing the ISA flags should be enough here. We shouldn't need to >> > pay the compile-time cost of a full target switch. */ >> > - global_options.x_target_flags &= ~MASK_GENERAL_REGS_ONLY; >> > - aarch64_set_asm_isa_flags (AARCH64_FL_FP | AARCH64_FL_SIMD | >> > extra_flags); >> > + if (flags & AARCH64_FL_FP) >> > + global_options.x_target_flags &= ~MASK_GENERAL_REGS_ONLY; >> > + aarch64_set_asm_isa_flags (flags); >> >> In the earlier review I'd suggested keeping aarch64_simd_(target_)switcher >> as a separate class, with aarch64_target_switcher being a new base class >> that handles the pragma. >> >> This patch seems to be more in the direction of treating >> aarch64_target_switcher as a one-stop shop that works out what to do >> based on the flags. I can see the attraction of that, but I think >> we should then fold sve_(target_)switcher into it too, for consistency. > > > I think I want to take a step back and look at what all the switcher effects > are and (to some extent) why they're needed. > > 1. Setting the value of aarch64_isa_flags - this requires unsetting > MASK_GENERAL_REGS_ONLY (for fp/simd targets), calling > aarc64_set_asm_isa_flags, > and (for functions) unsetting current_target_pragma. I'm not sure what breaks > if this isn't done. > > 2. Setting maximum_field_alignment = 0 (to disable the effect of > -fpack-struct) > - I think this is only relevant for ensuring the correct layout of the SVE > tuple types.
Yeah. IMO it's a misfeature that, when compiled with -fpack-struct=2: #include <arm_neon.h> int x1 = _Alignof (int32x4_t); int x2 = _Alignof (int32x4x2_t); sets x1 to 16 and x2 to 2. But that's been GCC's long-standing behaviour and is also what Clang does, so I suppose we have to live with it. > 3. Enabling have_regs_for_mode[] for the SVE modes - I'm not sure specifically > why this is needed either, but I'm guessing this normally gets enabled as part > of a full target switch (though I couldn't immediately see how). Yeah, that's right. It happens via target_reinit -> init_regs when the target is used for the first time. The result is then reused for subsequent switches to the same target. > I think it makes sense to me for 1. and 3. to be based on flags (although I > think we need to base 3. upon either of SVE or SME being specified, to support > decoupling that dependency in the future). I'm not sure the same applies > for 2., however - perhaps it makes more sense for that to be a separate > standalone switcher class that is only used when defining the SVE tuple types? > > How does that sound? Yeah, a separate RAII class for the field alignment sounds good to me, with the have_regs_for_mode stuff moving to aarch64_target_switcher. Thanks, Richard