c: Call c_fully_fold on __atomic_* operands in atomic_bitint_fetch_using_cas_loop [PR113518]
As the following testcase shows, I forgot to call c_fully_fold on the __atomic_*/__sync_* operands called on _BitInt address, the expressions are then used inside of TARGET_EXPR initializers etc. and are never fully folded later, which means we can ICE e.g. on C_MAYBE_CONST_EXPR trees inside of those. The following patch fixes it, while the function currently is only called in the C FE because C++ doesn't support BITINT_TYPE, I think guarding the calls on !c_dialect_cxx () is safer. 2024-01-23 Jakub Jelinek <jakub@redhat.com> PR c/113518 * c-common.cc (atomic_bitint_fetch_using_cas_loop): Call c_fully_fold on lhs_addr, val and model for C. * gcc.dg/bitint-77.c: New test.
This commit is contained in:
parent
06ee648e9b
commit
dbc5f1f523
2 changed files with 31 additions and 0 deletions
|
@ -8082,6 +8082,12 @@ atomic_bitint_fetch_using_cas_loop (location_t loc,
|
|||
tree lhs_addr = (*orig_params)[0];
|
||||
tree val = convert (nonatomic_lhs_type, (*orig_params)[1]);
|
||||
tree model = convert (integer_type_node, (*orig_params)[2]);
|
||||
if (!c_dialect_cxx ())
|
||||
{
|
||||
lhs_addr = c_fully_fold (lhs_addr, false, NULL);
|
||||
val = c_fully_fold (val, false, NULL);
|
||||
model = c_fully_fold (model, false, NULL);
|
||||
}
|
||||
if (TREE_SIDE_EFFECTS (lhs_addr))
|
||||
{
|
||||
tree var = create_tmp_var_raw (TREE_TYPE (lhs_addr));
|
||||
|
|
25
gcc/testsuite/gcc.dg/bitint-77.c
Normal file
25
gcc/testsuite/gcc.dg/bitint-77.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/* PR c/113518 */
|
||||
/* { dg-do compile { target bitint } } */
|
||||
/* { dg-options "-O2 -std=c23" } */
|
||||
|
||||
#if __BITINT_MAXWIDTH__ >= 607
|
||||
_BitInt(607) v;
|
||||
#else
|
||||
_BitInt(63) v;
|
||||
#endif
|
||||
|
||||
void
|
||||
foo (void)
|
||||
{
|
||||
__atomic_fetch_or (&v, 1 << 31, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
#if __BITINT_MAXWIDTH__ >= 16321
|
||||
_BitInt(16321) w;
|
||||
|
||||
void
|
||||
bar (void)
|
||||
{
|
||||
__atomic_fetch_add (&w, 1 << 31, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
#endif
|
Loading…
Add table
Reference in a new issue