[PATCH] Improve performance of calculateDbgValueHistory

Frédéric Riss friss at apple.com
Tue Aug 5 11:33:04 PDT 2014


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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: rdar.17884104.patch
Type: application/octet-stream
Size: 4355 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140805/75aacd8f/attachment.obj>


More information about the llvm-commits mailing list