The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be particularly slow for large APInts (MaskSizeInBits > 64) as they require the allocation of memory for the temporary variable.
This is another of the compile time issues identified in PR32037 (see also D30265).
This patch adds the APInt::extractBits() helper method which avoids the temporary memory allocation.
This is very nit-picky, but I find numBits > 0 much more natural than 0 < numBits.
And I'd suggest splitting up the second assert into two, to make it clearer what went wrong if it fires.