JDK-8217909 untied %r12 (heap_base) register when CompressedOops are disabled. We can improve on that by also untying heap_base register when zero-based/32-bit compressed oops are enabled, like this:
diff -r 7a9a828195c7 src/hotspot/cpu/x86/x86_64.ad
--- a/src/hotspot/cpu/x86/x86_64.ad Mon Mar 11 18:44:40 2019 +0100
+++ b/src/hotspot/cpu/x86/x86_64.ad Thu Mar 21 12:44:49 2019 +0100
@@ -352,11 +352,12 @@
RegMask _STACK_OR_PTR_REG_mask;
RegMask _STACK_OR_LONG_REG_mask;
RegMask _STACK_OR_INT_REG_mask;
static bool need_r12_heapbase() {
- return UseCompressedOops || UseCompressedClassPointers;
+ return (UseCompressedOops && (Universe::narrow_oop_base() != NULL)) ||
+ (UseCompressedClassPointers && (Universe::narrow_klass_base() != NULL));
}
void reg_mask_init() {
// _ALL_REG_mask is generated by adlc from the all_reg register class below.
// We derive a number of subsets from it.