Thanks to @bjope for pointing out this problem!
Here's my proposed solution:
If the register itself can only be described by combining multiple subregisters, we cannot use DW_OP_piece, since it doesn't safely compose with another complex expression, Since it is not possible to apply any DWARF operation to the combined DW_OP_pieces. By manualy shifting the subregisters into place, this can be worked around at the expense of a slightly larger encoding.
I think you can use llvm::scope_exit for this kind of thing?