[RFC] Replace VRP with EVRP passes

Jeff Law jeffreyalaw@gmail.com
Thu Oct 14 14:21:57 GMT 2021



On 10/13/2021 2:58 PM, Andrew MacLeod wrote:
> As work has progressed, we're pretty close to being able to 
> functionally replace VRP with another EVRP pass.  At least it seems 
> close enough that we should discuss if thats something we might want 
> to consider for this release.   Replacing just one of the 2 VRP passes 
> is another option.
>
> First, lets examine simplifications/folds.
>
> Running over my set of 380 GCC source files, we see the following 
> results for number of cases we currently get:
>
> Number of EVRP cases :       5789
> Number of VRP1 cases :       4913
> Number of VRP2 cases :       279
>              combined VRP1/2:   5192
>
> The 2 passes of VRP get a total of 5192 cases.
>
> If we run EVRP instead of each VRP pass, we get the following results:
>
> Number of EVRP1 cases :       5789
> Number of EVRP2 cases :       7521
> Number of EVRP3 cases :       2240
>          combined EVRP2/3:       9761
>
> so the EVRP passes find an additional 4569 opportunities,  or 88% 
> more. This initially surprised me until it occurred to me that this is 
> probably due to the pruning require for ASSERT_EXPRs, which means it 
> never had a chance to see some of those cases. Notice how the second 
> pass appears far more effective now.
Wow.  It'd be nice to know for sure if it's the pruning, but the data is 
pretty clear, EVRP does a considerably better job.

>
> Regarding what we would miss if we took VRP out, if we run  EVRP 
> passes first then a VRP pass immediately after, we see what VRP finds 
> that EVRP cannot:
>
> Number of EVRP2 cases :      7521
> Number of VRP1 cases :       11
> Number of EVRP3 cases :      2269
> Number of VRP2 cases :       54
>
> I have looked at some of these, and so far they all appear to be cases 
> which are solved via the iteration model VRP uses. regardless, missing 
> 65 cases and getting 4569 new ones would seem to be a win. I will 
> continue to investigate them.
Well, that would seem to support our long-held belief that the iteration 
step just isn't that important.  Good to finally get a confirmation.


>
> == Performance ==
>
> The threading work has been pulled out of VRP, so we get a better idea 
> of what VRPs time really is. we're showing about a 58% slowdown in VRP 
> over the 2 passes.  I've begun investigating because it shouldn't be 
> off by that much, Im seeing a lot of excess time being wasted with 
> callback queries from the substitute_and_fold engine when processing 
> PHIs.  It should be possible to bring this all back in line as that 
> isnt the model ranger should be using anyway.
>
> I figured while I'm looking into the performance side of it, maybe we 
> should start talking about whether we want to replace one or both of 
> the VRP passes with an EVRP instance.
>
>
> I see 3 primary options:
> 1 - replace both VRP passes with EVRP instances.
> 2 - replace VRP2 with EVRP2
> 3 - Replace neither, leave it as is.
>
> I figure since the second pass of VRP doesn't get a lot to start with, 
> it probably doesn't make sense to replace VRP1 and not VRP2.
>
> Option 1 is what I would expect the strategic move next release to be, 
> it seems ready now, its just a matter of whether we want to give it 
> more time.  It would also be trivial to turn VRP back on for one for 
> both later in the cycle if we determines there was something important 
> missing.
>
> option 2 is something we ought to really consider if we don't want to 
> do option 1.  There are a few PRs that are starting to open that have 
> VRP not getting something due to the whims of more precise 
> mutli-ranges being converted back to a value_range, and replacing VRP2 
> would allow us to catch those..  plus, we pick up a lot more than  
> VRP2 does.
>
> I would propose we add a param, similar to what EVRP has which will 
> allow us to choose which pass is called for VRP1 and VRP2 and set our 
> defaults appropriately.  I wouldn't work with a hybrid like we did 
> with EVRP... just choose which pass runs.     And we'll have to adjust 
> some testcases based one whatever our default is.
>
> Thoughts?
>
> Personally I think we give option 1 a go and if something shows up 
> over the next couple of months, or  we cant get performance in line 
> with where we want it, then we can switch back to VRP for one or both 
> passes.  I wouldn't  expect either, but one never knows :-)
>
> If that isn't palatable for everyone, then I'd suggest option 2
I'd be happy with #1 or #2.   The only one I don't like is #3.

Jeff


More information about the Gcc-patches mailing list