https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110228
--- Comment #26 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Sergei Trofimovich from comment #24) > Trying to understand the failure mode here: > > In bug.c.033t.early_objsz I still see the explicit stores to LocalFlags: > > <bb 4> : > LookupFlags_15 = 0; > goto <bb 7>; [INV] > > <bb 5> : > if (v_13 == 1) > goto <bb 6>; [INV] > else > goto <bb 7>; [INV] > > <bb 6> : > LookupFlags_14 = 1; > > <bb 7> : > # LookupFlags_4 = PHI <LookupFlags_15(4), LookupFlags_5(5), > LookupFlags_14(6)> > *p_16(D) = LookupFlags_4; > > But in bug.c.034t.ccp1 I see no stores at all: > > if (v_13 == 0) > goto <bb 6>; [INV] > else > goto <bb 4>; [INV] > > <bb 4> : > if (v_13 == 1) > goto <bb 5>; [INV] > else > goto <bb 6>; [INV] > > <bb 5> : > > <bb 6> : > # LookupFlags_4 = PHI <0(3), LookupFlags_5(4), 1(5)> > > Specifically '# LookupFlags_4 = PHI <0(3), LookupFlags_5(4), 1(5)>' claims > that somehow gets values '0' and '1' into a PHI node. > > AFAIU PHI is an equivalent of a mutable variable in an otherwise immutable > SSA form. It has to be a write it needed value is not there yet. Why the > store of '1' was removed? Is it because variable 'v_13' already happens to > have 0 or 1 value? > > I wonder why PHI does not look like something below: > > # LookupFlags_4 = PHI <v_13(3), LookupFlags_5(4), v_13(5)> LookupFlags is in SSA form thus we are dealing with registers and no "stores". What happens is just constant propagation, LookupFlags_1{4,5} can be replaced with their assigned constant.