On 23/01/2026 08:32, Richard Biener wrote:
> On Thu, 22 Jan 2026, Alex Coplan wrote:
>
> > This patch makes the constructor of bbitmap explicit and deals with the
> > fallout throughout the codebase.
> >
> > The goal of this is to avoid the re-occurrence of bugs such as PR123206.
> > In particular, it prevents implicit conversions from other types
> > (integers, booleans, pointers (!), etc.) in bbitmap context; instead one
> > must directly construct a bbitmap to use it in such a context.
> >
> > Doing this revealed a bug in bbitmap: the destructive bitwise operators
> > (|=, &=, ^=) all returned this (a pointer) which was being implicitly
> > converted to a bbitmap. To verify this, I added some selftests for
> > these operators which indeed failed. Of course this latent bug becomes
> > a compile error when the ctor is marked explicit, which is much nicer.
> > This patch fixes that bug.
> >
> > To see another benefit of this change, consider PR123206 on AArch64. The
> > previous patch marks the aarch64_pragma_builtins table as constexpr,
> > which gives errors such as this in the presence of the bug:
> >
> > aarch64-builtins.cc:1736:1: error: the value of ‘global_options’ is not
> > usable in a constant expression
> >
> > but with this change, we get clearer error messages which give more of
> > the context:
> >
> > $GCC/gcc/config/aarch64/aarch64.h:242:39: error: cannot convert ‘bool’ to
> > ‘aarch64_feature_flags’ {aka ‘bbitmap<2>’}
> > 242 | #define TARGET_SIMD (TARGET_BASE_SIMD && TARGET_NON_STREAMING)
> > | ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
> > | |
> > | bool
> > $GCC/gcc/config/aarch64/aarch64-simd-pragma-builtins.def:200:48: note: in
> > expansion of macro ‘TARGET_SIMD’
> > 200 | #define REQUIRED_EXTENSIONS nonstreaming_only (TARGET_SIMD)
> > | ^~~~~~~~~~~
> > $GCC/gcc/config/aarch64/aarch64-builtins.cc:1720:33: note: in expansion of
> > macro ‘REQUIRED_EXTENSIONS’
> > 1720 | aarch64_required_extensions::REQUIRED_EXTENSIONS, FLAG_##F},
> > | ^~~~~~~~~~~~~~~~~~~
> > $GCC/gcc/config/aarch64/aarch64-simd-pragma-builtins.def:51:3: note: in
> > expansion of macro ‘ENTRY’
> > 51 | ENTRY (N, ternary, T0, T1, T2, T3, U, F)
> > | ^~~~~
> > $GCC/gcc/config/aarch64/aarch64-simd-pragma-builtins.def:201:1: note: in
> > expansion of macro ‘ENTRY_TERNARY’
> > 201 | ENTRY_TERNARY (vbsl_mf8, mf8, u8, mf8, mf8, UNSPEC_BSL, QUIET)
> > | ^~~~~~~~~~~~~
> >
> > The main downside of this patch is that it makes usage of
> > aarch64_feature_flags slightly less ergonomic; contexts that previously
> > passed an integer constant 0 now need an object of type
> > aarch64_feature_flags. I've defined a macro AARCH64_FL_NONE to slightly
> > reduce the amount of typing needed (compared to aarch64_feature_flags (0)),
> > but it does make some of the code a little more verbose.
> >
> > IMO the trade-off is worth it to avoid further mishaps such as the PR in
> > question (and the buggy bbitmap operators), but I would like to hear
> > others' thoughts on it, too.
> >
> > Bootstrapped/regtested on aarch64-linux-gnu, OK for trunk?
>
> The middle-end parts look OK. I supose it would be nice to split
> them out in case backporting is required separately from the aarch64
> changes (but I didn't know about bbitmap, so maybe it's only used
> by aarch64).
Thanks. It looks to be also used in emit-rtl.cc:rtx_expander, as of
r16-788-gd63c889d5cd3ef.
I think we can probably get away without backporting the middle-end
changes in this case, as I think nothing currently depends on the return
value of the destructive bbitmap operators, which is the only
correctness issue addressed by this patch.
Alex
>
> Richard.
>
> > I'm happy to split this up or defer completely until next stage 1, if
> > folks prefer.
> >
> > Thanks,
> > Alex
> >
> > gcc/ChangeLog:
> >
> > PR target/123206
> > * Makefile.in (OBJS): Add new bbitmap-selftest.o.
> > * bbitmap.h (bbitmap): Make ctor explict, fix destructive operators to
> > dereference 'this' on return.
> > * common/config/aarch64/aarch64-common.cc (all_extensions): Replace
> > uses of
> > literal 0 with AARCH64_FL_NONE.
> > (all_architectures): Likewise.
> > (all_cores): Likewise.
> > (aarch64_get_extension_string_for_isa_flags): Likewise, and also switch
> > from
> > using assignment to braced initialization for aarch64_feature_flags.
> > * config/aarch64/aarch64-builtins.cc
> > (aarch64_check_required_extensions):
> > Likewise.
> > (aarch64_general_required_extensions): Likewise, and avoid comparing
> > against literal 0.
> > * config/aarch64/aarch64-feature-deps.h (get_flags): Use AARCH64_FL_NONE
> > instead of literal 0.
> > (get_enable): Likewise.
> > (alias_prefer_over_flags_##IDENT): Likewise.
> > * config/aarch64/aarch64-protos.h (struct aarch64_target_switcher):
> > Likewise.
> > (struct aarch64_required_extensions): Likewise.
> > * config/aarch64/aarch64-simd-pragma-builtins.def: Likewise.
> > * config/aarch64/aarch64-sve-builtins-base.def: Likewise.
> > * config/aarch64/aarch64-sve-builtins-sme.def: Likewise.
> > * config/aarch64/aarch64-sve-builtins-sve2.def: Likewise.
> > * config/aarch64/aarch64-sve-builtins.cc (DEF_NEON_SVE_FUNCTION):
> > Likewise.
> > (function_builder::get_attributes): Don't compare aarch64_feature_flags
> > values
> > against literal 0.
> > * config/aarch64/aarch64-sve-builtins.h
> > (function_expander::get_contiguous_base): Replace 0 with
> > AARCH64_FL_NONE.
> > * config/aarch64/aarch64.cc (all_cores): Likewise.
> > (aarch64_override_options): Likewise, plus use of braced initialization
> > instead of assignment.
> > (aarch64_process_target_attr): Use braced initialization for
> > isa_temp.
> > (aarch64_valid_sysreg_name_p): Avoid comparison of
> > aarch64_feature_flags against literal 0.
> > (aarch64_retrieve_sysreg): Likewise.
> > * config/aarch64/aarch64.h (AARCH64_FL_NONE): New.
> > (TARGET_STREAMING_COMPATIBLE): Avoid comparison of
> > aarch64_feature_flags value against literal 0.
> > * config/aarch64/driver-aarch64.cc (aarch64_cpu_data): Replace
> > use of 0 with AARCH64_FL_NONE.
> > (aarch64_arches): Likewise.
> > (host_detect_local_cpu): Use braced initialization for
> > aarch64_feature_flags.
> > * selftest-run-tests.cc (selftest::run_tests): Add bbitmap_cc_tests.
> > * selftest.h (bbitmap_cc_tests): New.
> > * bbitmap-selftests.cc: New file.
> > ---
> > gcc/Makefile.in | 1 +
> > gcc/bbitmap-selftests.cc | 69 +++++++++++++++++++
> > gcc/bbitmap.h | 8 +--
> > gcc/common/config/aarch64/aarch64-common.cc | 16 +++--
> > gcc/config/aarch64/aarch64-builtins.cc | 12 ++--
> > gcc/config/aarch64/aarch64-feature-deps.h | 7 +-
> > gcc/config/aarch64/aarch64-protos.h | 10 +--
> > .../aarch64/aarch64-simd-pragma-builtins.def | 2 +-
> > .../aarch64/aarch64-sve-builtins-base.def | 4 +-
> > .../aarch64/aarch64-sve-builtins-sme.def | 4 +-
> > .../aarch64/aarch64-sve-builtins-sve2.def | 4 +-
> > gcc/config/aarch64/aarch64-sve-builtins.cc | 8 +--
> > gcc/config/aarch64/aarch64-sve-builtins.h | 2 +-
> > gcc/config/aarch64/aarch64.cc | 18 ++---
> > gcc/config/aarch64/aarch64.h | 4 +-
> > gcc/config/aarch64/driver-aarch64.cc | 10 +--
> > gcc/selftest-run-tests.cc | 1 +
> > gcc/selftest.h | 1 +
> > 18 files changed, 129 insertions(+), 52 deletions(-)
> > create mode 100644 gcc/bbitmap-selftests.cc
> >
> >
>
> --
> Richard Biener <[email protected]>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)