[PATCH] Improve performance of calculateDbgValueHistory

Frédéric Riss friss at apple.com
Tue Aug 5 12:19:13 PDT 2014


Oh, you’re right, this hunk isn’t explained. It’s just a general cleanup that I did while reading the code. If I’m not mistaken, the IsInEpilogue removal is functionally equivalent to the old version. I just used an early exit instead of continuing iterating the loop with a true IsInEpilogue variable. I also added !MI.isDebugValue() as this function checks for MIs that clobber registers, which can’t be the case of DebugValues I think. I also changed the comment to reflect what the function really does. 

This can be split out in a separate cleanup patch if needed, or dropped entirely if I missed something…

Fred

On 05 Aug 2014, at 21:03, David Blaikie <dblaikie at gmail.com> wrote:

> (+Alexey who made the recent changes)
> 
> Frédéric - This looks like general goodness except I'm a bit confused
> about the other changes you made to collectChangingRegs (removing
> IsEpilogue and associated changes). What was the purpose of those
> changes? Could they be separated from this commit to keep the change
> simpler and so it has a clear, singular purpose?
> 
> - David
> 
> On Tue, Aug 5, 2014 at 11:33 AM, Frédéric Riss <friss at apple.com> wrote:
>> Hi,
>> 
>> In r210492 the logic of calculateDbgValueHistory was improved to end register variable live ranges at the end of MBB conditionally on the fact that the register was or not clobbered by the function body. This requires 2 passes over all the operands of the function. The first pass computes the std::set of all clobbered registers of the function and in the second one we intersect the global set with the one recomputed for the current Instruction.
>> 
>> The logic introduced in r210492 is necessarily a bit slower than before as it involves walking twice the full list of MachineOperands for the function. The new information is necessary, but the performance of debug info emission is degraded by more than 10% on some benchmarks.
>> 
>> The biggest performance hit is due to the construction/iteration/destruction of std::set for each real MachineInstruction in the second pass. We can avoid the temporary sets by using a lambda that captures the global set and operates directly on that. I tried various other approaches and this one gets the best performance while still being quite readable.
>> 
>> Here are some performance numbers (5 runs each time):
>> 
>> Current mainstream
>>  ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
>>  0.0508 ( 71.0%)   0.0262 ( 50.3%)   0.0770 ( 62.3%)   0.0772 ( 62.3%)  Debug Info Emission
>>  0.0515 ( 71.1%)   0.0267 ( 50.7%)   0.0782 ( 62.5%)   0.0780 ( 62.2%)  Debug Info Emission
>>  0.0506 ( 71.3%)   0.0262 ( 50.5%)   0.0768 ( 62.5%)   0.0768 ( 62.5%)  Debug Info Emission
>>  0.0511 ( 70.6%)   0.0266 ( 50.5%)   0.0778 ( 62.1%)   0.0779 ( 62.4%)  Debug Info Emission
>>  0.0507 ( 71.1%)   0.0261 ( 50.7%)   0.0769 ( 62.5%)   0.0768 ( 62.5%)  Debug Info Emission
>> 
>> With Patch
>>  ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
>>  0.0380 ( 64.2%)   0.0259 ( 50.4%)   0.0639 ( 57.8%)   0.0635 ( 57.7%)  Debug Info Emission
>>  0.0377 ( 63.7%)   0.0266 ( 50.5%)   0.0643 ( 57.5%)   0.0645 ( 57.8%)  Debug Info Emission
>>  0.0383 ( 64.2%)   0.0264 ( 50.4%)   0.0647 ( 57.7%)   0.0651 ( 58.1%)  Debug Info Emission
>>  0.0383 ( 63.7%)   0.0272 ( 50.8%)   0.0656 ( 57.6%)   0.0664 ( 58.0%)  Debug Info Emission
>>  0.0376 ( 64.3%)   0.0261 ( 50.3%)   0.0637 ( 57.7%)   0.0638 ( 57.7%)  Debug Info Emission
>> 
>> Before r210492
>>  ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
>>  0.0341 ( 62.6%)   0.0261 ( 50.6%)   0.0602 ( 56.8%)   0.0600 ( 56.7%)  Debug Info Emission
>>  0.0350 ( 62.7%)   0.0262 ( 50.4%)   0.0612 ( 56.7%)   0.0612 ( 56.7%)  Debug Info Emission
>>  0.0347 ( 62.7%)   0.0259 ( 50.4%)   0.0607 ( 56.8%)   0.0610 ( 56.9%)  Debug Info Emission
>>  0.0361 ( 62.3%)   0.0267 ( 50.6%)   0.0628 ( 56.7%)   0.0630 ( 56.7%)  Debug Info Emission
>>  0.0354 ( 62.5%)   0.0271 ( 50.4%)   0.0624 ( 56.6%)   0.0625 ( 56.6%)  Debug Info Emission
>> 
>> The patch passes check-all. It doesn’t contain any test case as it’s just a functionally equivalent refactoring of the same algorithm.
>> 
>> Ok to check-in ?
>> 
>> Thanks,
>> Fred
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 





More information about the llvm-commits mailing list