The function extendSegmentsToUses (used by shrinkToUses) in LiveIntervalAnalysis.cpp duplicates the functionality that is already available in LiveRangeCalc. Moreover, it does not handle cases where a use (of a subregister) is jointly dominated only by the corresponding undefs. This may lead to assertions while compiling valid code.
Switch shrinkToUses to utilize LiveRangeCalc and provide a mapping function that will ensure preservation of value numbers.
Shouldn't you rather stay with the old code that reuses the existing VNInfo objects instead of creating new ones? It's also not clear to me whether the old ones ever get invalidated in this version.