On Sun, Jun 21, 2026 at 11:57 PM Richard Biener <[email protected]> wrote: > > On Fri, 19 Jun 2026, Andrea Pinski wrote: > > > On Fri, Jun 19, 2026 at 4:12 AM Richard Biener <[email protected]> wrote: > > > > > > The following avoids diagnosing bit sets/clears that involve RMW > > > cycles to uninitialized memory. This is for example exposed by > > > __builtin_clear_padding lowering which suppresses diagnostics but > > > those can re-surface with vectorization. > > > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu. > > > > > > OK? > > > > > > Thanks, > > > Richard. > > > > > > PR tree-optimization/110743 > > > * tree-ssa-uninit.cc (maybe_warn_operand): Suppress diagnostics > > > on RMW cycles setting/clearing bits. > > > > > > * gcc.dg/uninit-pr110743.c: New testcase. > > > --- > > > gcc/testsuite/gcc.dg/uninit-pr110743.c | 22 ++++++++++++++++++++++ > > > gcc/tree-ssa-uninit.cc | 24 ++++++++++++++++++++++++ > > > 2 files changed, 46 insertions(+) > > > create mode 100644 gcc/testsuite/gcc.dg/uninit-pr110743.c > > > > > > diff --git a/gcc/testsuite/gcc.dg/uninit-pr110743.c > > > b/gcc/testsuite/gcc.dg/uninit-pr110743.c > > > new file mode 100644 > > > index 00000000000..5a95f60cf9b > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.dg/uninit-pr110743.c > > > @@ -0,0 +1,22 @@ > > > +/* { dg-do compile } */ > > > +/* { dg-options "-O2 -Wall" } */ > > > + > > > +void foo (int *); > > > + > > > +void bar() > > > +{ > > > + int x, tem; > > > + tem = x; /* { dg-bogus "used uninitialized" } */ > > > + tem = tem | 5; > > > + x = tem; > > > + foo (&x); > > > +} > > > + > > > +void baz() > > > +{ > > > + int x, tem; > > > + tem = x; /* { dg-bogus "used uninitialized" } */ > > > + tem = tem & 5; > > > + x = tem; > > > + foo (&x); > > > +} > > > diff --git a/gcc/tree-ssa-uninit.cc b/gcc/tree-ssa-uninit.cc > > > index dbd187e21d7..107ed21e10b 100644 > > > --- a/gcc/tree-ssa-uninit.cc > > > +++ b/gcc/tree-ssa-uninit.cc > > > @@ -758,6 +758,30 @@ maybe_warn_operand (ao_ref &ref, gimple *stmt, tree > > > lhs, tree rhs, > > > if (is_empty_type (rhstype)) > > > return NULL_TREE; > > > > > > + /* Avoid diagnosing read-modify-write cycles that in the end only > > > + sets a subset of bits to zero or one. > > > + ??? Note that further reads will then appear (partly) initialized > > > + and will not be diagnosed. */ > > > + gimple *use_stmt; > > > + if (gimple_assign_load_p (stmt) > > > + && TREE_CODE (lhs) == SSA_NAME > > > + && single_imm_use (lhs, &luse_p, &use_stmt)) > > > + { > > > + gassign *use_ass = dyn_cast <gassign *> (use_stmt); > > > + for (int i = 0; i < 2; ++i) > > > + if (use_ass > > > + && (gimple_assign_rhs_code (use_ass) == BIT_AND_EXPR > > > + || gimple_assign_rhs_code (use_ass) == BIT_IOR_EXPR) > > > + && single_imm_use (gimple_assign_lhs (use_ass), &luse_p, > > > + &use_stmt)) > > > + use_ass = dyn_cast <gassign *> (use_stmt); > > > + if (use_ass > > > + && gimple_vdef (use_ass) > > > + && operand_equal_p (gimple_assign_rhs1 (stmt), > > > + gimple_assign_lhs (use_ass))) > > > + return NULL_TREE; > > > + } > > > > Hmm, is there a way to combine this with the BIT_INSERT_EXPR loop > > since both are basically trying to prevent the same thing? It is > > handled closer to the top of the function. > > I considered that but while it is conceptually similar > (RMW) it's structured differently enough to make the result > less readable.
Yes, that makes sense. Patch approved. > > Richard. > > > Thanks, > > Andrea > > > > > + > > > bool warned = false; > > > /* We didn't find any may-defs so on all paths either > > > reached function entry or a killing clobber. */ > > > -- > > > 2.51.0 > > > > -- > 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)
