On Fri, Nov 22, 2024 at 09:56:17AM +0100, Jakub Jelinek wrote: > Hi! > > Sorry, the last patch only partially fixed the __sync_* ICEs with > _BitInt(128) on ia32. > Even for !fetch we need to error out and return 0. I was afraid of > APIs like __atomic_exchange/__atomic_compare_exchange, those obviously > need to be supported even on _BitInt(128) on ia32, but they actually never > sync_resolve_size, they are handled by adding the size argument and using > the library version much earlier. > For fetch && !orig_format (i.e. __atomic_fetch_* etc.) we need to return -1 > so that we handle it with a manualy __atomic_load + > __atomic_compare_exchange loop in the caller, all other cases should > be rejected. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok, thanks. > 2024-11-22 Jakub Jelinek <ja...@redhat.com> > > PR c/117641 > * c-common.cc (sync_resolve_size): For size 16 with _BitInt > on targets where TImode isn't supported, use goto incompatible if > !fetch. > > * gcc.dg/bitint-117.c: New test. > > --- gcc/c-family/c-common.cc.jj 2024-11-19 20:35:53.222455518 +0100 > +++ gcc/c-family/c-common.cc 2024-11-21 11:23:07.897995741 +0100 > @@ -7457,11 +7457,10 @@ sync_resolve_size (tree function, vec<tr > > size = tree_to_uhwi (TYPE_SIZE_UNIT (type)); > if (size == 16 > - && fetch > && TREE_CODE (type) == BITINT_TYPE > && !targetm.scalar_mode_supported_p (TImode)) > { > - if (!orig_format) > + if (fetch && !orig_format) > return -1; > goto incompatible; > } > --- gcc/testsuite/gcc.dg/bitint-117.c.jj 2024-11-21 11:23:59.720260255 > +0100 > +++ gcc/testsuite/gcc.dg/bitint-117.c 2024-11-21 11:24:59.141416996 +0100 > @@ -0,0 +1,13 @@ > +/* PR c/117641 */ > +/* { dg-do compile { target bitint575 } } */ > +/* { dg-options "-std=c23" } */ > + > +void > +foo (_BitInt(128) *b) > +{ > + __sync_add_and_fetch (b, 1); /* { dg-error > "incompatible" "" { target { ! int128 } } } */ > + __sync_val_compare_and_swap (b, 0, 1); /* { dg-error "incompatible" "" > { target { ! int128 } } } */ > + __sync_bool_compare_and_swap (b, 0, 1); /* { dg-error "incompatible" "" > { target { ! int128 } } } */ > + __sync_lock_test_and_set (b, 1); /* { dg-error "incompatible" "" > { target { ! int128 } } } */ > + __sync_lock_release (b); /* { dg-error "incompatible" "" > { target { ! int128 } } } */ > +} > > Jakub > Marek