[Bug middle-end/85598] [7/8/9 Regression] Incorrect warning only at -O2 and -O3

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Fri Nov 23 09:49:00 GMT 2018


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

--- Comment #13 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 23 Nov 2018, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85598
> 
> --- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to rguenther@suse.de from comment #11)
> > You need to union the PHI argument ranges.  The result you can intersect
> > with the existing range info of the PHI result of course.  You basically
> > want to do to the PHI what [E]VRP does ...
> 
> If I were to recompute the range from scratch, yes, I would.
> The way it is written, it is able to optimize just the common case, where it
> uses the existing computed range and removes a single constant from the range,
> either the minimum or maximum, if it can prove the minimum (resp. maximum) will
> never occur.  It does so by proving all PHI arguments but one are constants not
> equal to that value and one is from the edge where there is GIMPLE_COND
> comparison of the PHI arg SSA_NAME against that single constant.
> 
> Now, I guess we could somewhat generalize it e.g. by accepting SSA_NAMEs with
> ranges instead of constants and just prove (perhaps through vr-values.h APIs)
> that the chosen constant is not in those ranges.
> 
> > It's phiopt2 where this is important for the testcase?  Or phiopt3
> > after loop?  Because after loop there's forwprop before and ccp
> > after phiopt both of which would be a better fit.  Late CCP probably
> > doesn't need to be the SSA-propagator-iterating variant but could
> > do with a simpler DOM-style approach and thus could be replaced
> > by EVRP if it weren't for that lacking the alignment/nonzero bits
> > computation...
> 
> For this testcase it needs to be done I believe in between dce2 (vrp1 does the
> jump threading and dce2 does the cleanup in which the PHI <0> is propagated
> into the PHI argument) and printf-return-value2 which needs it.
> In its current form it doesn't work in between cselim and dom2 because in
> between those passes (which include phiopt2) there is a forwarder block added

Note that dom after vrp1 should be able to adjust the value-ranges given
it uses EVRP to track ranges...  why doesn't that work?

> and the code doesn't handle that (though, especially if it does the
> optimization from walking the PHIs rather than from the GIMPLE_COND) it could
> skip a single forwarder block too.
> SO, before cselim and in dom2 dump we have:
>   <bb 3> [local count: 1063004407]:
>   # RANGE [0, 256] NONZERO 511
>   # x_10 = PHI <0(2), x_5(3)>
>   __builtin_snprintf (&temp, 4, "%%%02X", x_10);
>   # RANGE [1, 256] NONZERO 511
>   x_5 = x_10 + 1;
>   if (x_5 != 256)
>     goto <bb 3>; [98.99%]
>   else
>     goto <bb 4>; [1.01%]
> which the patch can optimize, but in between those we have:
>   <bb 3> [local count: 1063004407]:
>   # RANGE [0, 256] NONZERO 511
>   # x_10 = PHI <0(2), x_5(5)>
>   __builtin_snprintf (&temp, 4, "%%%02X", x_10);
>   # RANGE [1, 256] NONZERO 511
>   x_5 = x_10 + 1;
>   if (x_5 != 256)
>     goto <bb 5>; [98.99%]
>   else
>     goto <bb 4>; [1.01%]
> 
>   <bb 5> [local count: 1052266994]:
>   goto <bb 3>; [100.00%]
> which has the extra forwarder.  So, on this testcase it is in the end optimized
> in phiopt3.  There is forwprop3 in between those passes.
> 
> > So I fear any "proper" solution isn't for stage3 but still I'd go
> > with factoring (enough of) vr_values::extract_range_from_phi_node
> > plus the register_edge_asserts thing if we need to look at
> > dominating conditions.
> 
> Yes, I'm afraid this is just GCC 9 hack and I hope somebody (Aldy, Martin) will
> do the right thing for GCC 10 and this hack can be removed.
> 
>


More information about the Gcc-bugs mailing list