Skip to content

Commit 231c7a9

Browse files
committed
Profile out subtyping check in call_indirect
1 parent 538847e commit 231c7a9

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmCodeEntry.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public final class WasmCodeEntry {
5151
@CompilationFinal(dimensions = 1) private final int[] resultTypes;
5252
private final BranchProfile errorBranch = BranchProfile.create();
5353
private final BranchProfile exceptionBranch = BranchProfile.create();
54+
private final BranchProfile subtypingBranch = BranchProfile.create();
5455
private final int numLocals;
5556
private final int resultCount;
5657
private final boolean usesMemoryZero;
@@ -101,6 +102,10 @@ public void exceptionBranch() {
101102
exceptionBranch.enter();
102103
}
103104

105+
public void subtypingBranch() {
106+
subtypingBranch.enter();
107+
}
108+
104109
public boolean usesMemoryZero() {
105110
return usesMemoryZero;
106111
}

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/nodes/WasmFunctionNode.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -618,12 +618,15 @@ public Object executeBodyFromOffset(WasmInstance instance, VirtualFrame frame, i
618618
if (opcode == Bytecode.CALL_INDIRECT_U8 || opcode == Bytecode.CALL_INDIRECT_I32) {
619619
// Validate that the target function type matches the expected type of
620620
// the indirect call. We first try if the types are equivalent using the
621-
// equivalence classes. If they are not equivalent, we run the full
622-
// subtype matching procedure.
623-
if (symtab.equivalenceClass(expectedFunctionTypeIndex) != function.typeEquivalenceClass() &&
624-
!symtab.closedTypeAt(expectedFunctionTypeIndex).isSupertypeOf(function.closedType())) {
625-
enterErrorBranch();
626-
failFunctionTypeCheck(function, expectedFunctionTypeIndex);
621+
// equivalence classes...
622+
if (symtab.equivalenceClass(expectedFunctionTypeIndex) != function.typeEquivalenceClass()) {
623+
codeEntry.subtypingBranch();
624+
// If they are not equivalent, we run the full subtype matching
625+
// procedure.
626+
if (!symtab.closedTypeAt(expectedFunctionTypeIndex).isSupertypeOf(function.closedType())) {
627+
enterErrorBranch();
628+
failFunctionTypeCheck(function, expectedFunctionTypeIndex);
629+
}
627630
}
628631
}
629632

0 commit comments

Comments
 (0)