https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93582
--- Comment #36 from rguenther at suse dot de <rguenther at suse dot de> --- On Fri, 28 Feb 2020, jakub at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93582 > > --- Comment #35 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > Unfortunately, it breaks miserably, e.g. miscompiles libcpp/macro.c. > Reduced testcase from that: > > --- gcc/testsuite/gcc.c-torture/execute/pr93582.c.jj 2020-02-28 > 12:27:51.280925113 +0100 > +++ gcc/testsuite/gcc.c-torture/execute/pr93582.c 2020-02-28 > 12:26:17.272332573 +0100 > @@ -0,0 +1,22 @@ > +/* PR tree-optimization/93582 */ > + > +short a; > +int b, c; > + > +__attribute__((noipa)) void > +foo (void) > +{ > + b = c; > + a &= 7; > +} > + > +int > +main () > +{ > + c = 27; > + a = 14; > + foo (); > + if (b != 27 || a != 6) > + __builtin_abort (); > + return 0; > +} > > I believe the thing is that for the case with mask we need to completely avoid > the vn_reference_lookup_or_insert_for_pieces calls that finish method does, > and > vn_reference_insert > call visit_reference_op_load does. > Probably instead of that we should call vn_nary_op_insert_stmt. > Now, I wonder if e.g. finish couldn't for the masked case just return the tree > itself rather than anything else, and let visit_reference_op_load not call > visit_reference_op_load if mask is non-NULL. Yeah, just add a insert_p flag to the lookup function and the context struct, for lookups only valid under a mask we indeed may not record those into the hash tables.