8341581: Optimize BytecodeHelpers validate slot

Reviewed-by: liach
This commit is contained in:
Shaojin Wen 2024-10-07 23:30:06 +00:00
parent 4d50cbb5a7
commit d996ca863d

View file

@ -88,9 +88,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.ALOAD_2; case 2 -> Opcode.ALOAD_2;
case 3 -> Opcode.ALOAD_3; case 3 -> Opcode.ALOAD_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.ALOAD; yield Opcode.ALOAD;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.ALOAD_W; yield Opcode.ALOAD_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -104,9 +104,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.FLOAD_2; case 2 -> Opcode.FLOAD_2;
case 3 -> Opcode.FLOAD_3; case 3 -> Opcode.FLOAD_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.FLOAD; yield Opcode.FLOAD;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.FLOAD_W; yield Opcode.FLOAD_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -120,9 +120,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.DLOAD_2; case 2 -> Opcode.DLOAD_2;
case 3 -> Opcode.DLOAD_3; case 3 -> Opcode.DLOAD_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.DLOAD; yield Opcode.DLOAD;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.DLOAD_W; yield Opcode.DLOAD_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -136,9 +136,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.LLOAD_2; case 2 -> Opcode.LLOAD_2;
case 3 -> Opcode.LLOAD_3; case 3 -> Opcode.LLOAD_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.LLOAD; yield Opcode.LLOAD;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.LLOAD_W; yield Opcode.LLOAD_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -152,9 +152,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.ILOAD_2; case 2 -> Opcode.ILOAD_2;
case 3 -> Opcode.ILOAD_3; case 3 -> Opcode.ILOAD_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.ILOAD; yield Opcode.ILOAD;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.ILOAD_W; yield Opcode.ILOAD_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -180,9 +180,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.ASTORE_2; case 2 -> Opcode.ASTORE_2;
case 3 -> Opcode.ASTORE_3; case 3 -> Opcode.ASTORE_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.ASTORE; yield Opcode.ASTORE;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.ASTORE_W; yield Opcode.ASTORE_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -196,9 +196,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.FSTORE_2; case 2 -> Opcode.FSTORE_2;
case 3 -> Opcode.FSTORE_3; case 3 -> Opcode.FSTORE_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.FSTORE; yield Opcode.FSTORE;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.FSTORE_W; yield Opcode.FSTORE_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -212,9 +212,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.DSTORE_2; case 2 -> Opcode.DSTORE_2;
case 3 -> Opcode.DSTORE_3; case 3 -> Opcode.DSTORE_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.DSTORE; yield Opcode.DSTORE;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.DSTORE_W; yield Opcode.DSTORE_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -228,9 +228,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.LSTORE_2; case 2 -> Opcode.LSTORE_2;
case 3 -> Opcode.LSTORE_3; case 3 -> Opcode.LSTORE_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.LSTORE; yield Opcode.LSTORE;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.LSTORE_W; yield Opcode.LSTORE_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -244,9 +244,9 @@ public class BytecodeHelpers {
case 2 -> Opcode.ISTORE_2; case 2 -> Opcode.ISTORE_2;
case 3 -> Opcode.ISTORE_3; case 3 -> Opcode.ISTORE_3;
default -> { default -> {
if ((slot & 0xFF) == slot) if ((slot & ~0xFF) == 0)
yield Opcode.ISTORE; yield Opcode.ISTORE;
if ((slot & 0xFFFF) == slot) if ((slot & ~0xFFFF) == 0)
yield Opcode.ISTORE_W; yield Opcode.ISTORE_W;
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
@ -377,20 +377,20 @@ public class BytecodeHelpers {
public static void validateSlot(Opcode opcode, int slot, boolean load) { public static void validateSlot(Opcode opcode, int slot, boolean load) {
int size = opcode.sizeIfFixed(); int size = opcode.sizeIfFixed();
if (size == 1 && slot == (load ? intrinsicLoadSlot(opcode) : intrinsicStoreSlot(opcode)) || if (size == 1 && slot == (load ? intrinsicLoadSlot(opcode) : intrinsicStoreSlot(opcode)) ||
size == 2 && slot == (slot & 0xFF) || size == 2 && (slot & ~0xFF) == 0 ||
size == 4 && slot == (slot & 0xFFFF)) size == 4 && (slot & ~0xFFFF) == 0)
return; return;
throw slotOutOfBounds(opcode, slot); throw slotOutOfBounds(opcode, slot);
} }
public static void validateSlot(int slot) { public static void validateSlot(int slot) {
if ((slot & 0xFFFF) != slot) if ((slot & ~0xFFFF) != 0)
throw slotOutOfBounds(slot); throw slotOutOfBounds(slot);
} }
public static boolean validateAndIsWideIinc(int slot, int val) { public static boolean validateAndIsWideIinc(int slot, int val) {
var ret = false; var ret = false;
if ((slot & 0xFF) != slot) { if ((slot & ~0xFF) != 0) {
validateSlot(slot); validateSlot(slot);
ret = true; ret = true;
} }
@ -404,8 +404,8 @@ public class BytecodeHelpers {
} }
public static void validateRet(Opcode opcode, int slot) { public static void validateRet(Opcode opcode, int slot) {
if (opcode == Opcode.RET && slot == (slot & 0xFF) || if (opcode == Opcode.RET && (slot & ~0xFF) == 0 ||
opcode == Opcode.RET_W && slot == (slot & 0xFFFF)) opcode == Opcode.RET_W && (slot & ~0xFFFF) == 0)
return; return;
Objects.requireNonNull(opcode); Objects.requireNonNull(opcode);
throw slotOutOfBounds(opcode, slot); throw slotOutOfBounds(opcode, slot);