[Local] replaceAllDbgUsesWith: Update debug values before RAUW

Authored by vsk on Jul 6 2018, 10:32 AM.


[Local] replaceAllDbgUsesWith: Update debug values before RAUW

The replaceAllDbgUsesWith utility helps passes preserve debug info when
replacing one value with another.

This improves upon the existing insertReplacementDbgValues API by:

  • Updating debug intrinsics in-place, while preventing use-before-def of the replacement value.
  • Falling back to salvageDebugInfo when a replacement can't be made.
  • Moving the responsibiliy for rewriting llvm.dbg.* DIExpressions into common utility code.

Along with the API change, this teaches replaceAllDbgUsesWith how to
create DIExpressions for three basic integer and pointer conversions:

  • The no-op conversion. Applies when the values have the same width, or have bit-for-bit compatible pointer representations.
  • Truncation. Applies when the new value is wider than the old one.
  • Zero/sign extension. Applies when the new value is narrower than the old one.


  • check-llvm, check-clang, a stage2 -g -O3 build of clang, regression/unit testing.
  • This resolves a number of mis-sized dbg.value diagnostics from Debugify.

Differential Revision: https://reviews.llvm.org/D48676

llvm-svn: 336451