https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114734

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Robin Dapp from comment #6)
> This one is really a bit tricky.
> 
> We have the following situation:
> 
> loop:
> <bb 3>
> # vectp_g.178_1078 = PHI <vectp_g.178_1079(3), &gD.2750(2)> 
> _911 = &MEM... vectp_g.178_1078
> MASK_LEN_LOAD (_911, ...);
> vectp_g.178_1079 = vectp_g.178_1078 + 16;
> goto loop;
> 
> <bb 4>:
> MASK_LEN_LOAD (_911, ...);
> 
> During expand we basically convert back the _911 to vectp_g.178_1078
> (reverting what we did in ivopts before).  Because _911 camouflages
> vectp_g.178_1078 until expand we evaded the conflict checks of outof-ssa
> that would catch a similar, non-camouflaged situation like:
> 
> # vectp_g.178_1078 = PHI <vectp_g.178_1079(3), &gD.2750(2)> 
> MASK_LEN_LOAD (MEM... vectp_g.178_1078, ...);
> vectp_g.178_1079 = vectp_g.178_1078 + 16;
> goto loop;
> MASK_LEN_LOAD (MEM... vectp_g.178_1078, ...);
> 
> and would insert a copy of the definition right before the backedge.  The
> MASK_LEN_LOAD after the loop would then use that copy.  By using _911
> instead of the original pointer no conflict is detected and we wrongly use
> the incremented pointer.  Without the ivopt change for TARGET_MEM_REF

So you say we coalesce _1079 and _1078 but then apply TER to _911 which
makes that coalescing invalid because now their lifetimes overlap?

There must be some mechanisms to avoid this kind of situation so I do
wonder whether it's not TER but some invalid SSA def stmt lookup that
is happening upon expansion _not_ honoring the TER constaints here?

That is, how do we exactly put the definition of _911 into the uses?  Can
you attach the RTL expansion dump?

Reply via email to