Skip to content

Commit 9c74082

Browse files
committed
wasm profile select: contributed by Andreas Woess,Florian Huemer and
David Leopoldseder
1 parent dbdbfa8 commit 9c74082

File tree

5 files changed

+21
-7
lines changed

5 files changed

+21
-7
lines changed

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ private CodeEntry readFunction(int functionIndex, byte[] locals, byte[] resultTy
785785
assertTrue(WasmType.isNumberType(t1) && WasmType.isNumberType(t2), Failure.TYPE_MISMATCH);
786786
assertTrue(t1 == t2 || t1 == WasmType.UNKNOWN_TYPE || t2 == WasmType.UNKNOWN_TYPE, Failure.TYPE_MISMATCH);
787787
state.push(t1 == WasmType.UNKNOWN_TYPE ? t2 : t1);
788-
state.addInstruction(Bytecode.SELECT);
788+
state.addSelectInstruction(Bytecode.SELECT);
789789
break;
790790
}
791791
case Instructions.SELECT_T: {
@@ -798,9 +798,9 @@ private CodeEntry readFunction(int functionIndex, byte[] locals, byte[] resultTy
798798
state.popChecked(t);
799799
state.push(t);
800800
if (WasmType.isNumberType(t)) {
801-
state.addInstruction(Bytecode.SELECT);
801+
state.addSelectInstruction(Bytecode.SELECT);
802802
} else {
803-
state.addInstruction(Bytecode.SELECT_OBJ);
803+
state.addSelectInstruction(Bytecode.SELECT_OBJ);
804804
}
805805
break;
806806
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,22 +626,24 @@ public Object executeBodyFromOffset(WasmInstance instance, VirtualFrame frame, i
626626
break;
627627
}
628628
case Bytecode.SELECT: {
629-
if (popBoolean(frame, stackPointer - 1)) {
629+
if (profileCondition(bytecode, offset, popBoolean(frame, stackPointer - 1))) {
630630
drop(frame, stackPointer - 2);
631631
} else {
632632
WasmFrame.copyPrimitive(frame, stackPointer - 2, stackPointer - 3);
633633
dropPrimitive(frame, stackPointer - 2);
634634
}
635+
offset += 2;
635636
stackPointer -= 2;
636637
break;
637638
}
638639
case Bytecode.SELECT_OBJ: {
639-
if (popBoolean(frame, stackPointer - 1)) {
640+
if (profileCondition(bytecode, offset, popBoolean(frame, stackPointer - 1))) {
640641
dropObject(frame, stackPointer - 2);
641642
} else {
642643
WasmFrame.copyObject(frame, stackPointer - 2, stackPointer - 3);
643644
dropObject(frame, stackPointer - 2);
644645
}
646+
offset += 2;
645647
stackPointer -= 2;
646648
break;
647649
}

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/parser/bytecode/BytecodeParser.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,14 +441,17 @@ private static List<CallNode> readCallNodes(byte[] bytecode, int startOffset, in
441441
offset += 12;
442442
break;
443443
}
444+
case Bytecode.SELECT:
445+
case Bytecode.SELECT_OBJ: {
446+
offset += 2;
447+
break;
448+
}
444449
case Bytecode.UNREACHABLE:
445450
case Bytecode.NOP:
446451
case Bytecode.RETURN:
447452
case Bytecode.LOOP:
448453
case Bytecode.DROP:
449454
case Bytecode.DROP_OBJ:
450-
case Bytecode.SELECT:
451-
case Bytecode.SELECT_OBJ:
452455
case Bytecode.I32_EQZ:
453456
case Bytecode.I32_EQ:
454457
case Bytecode.I32_NE:

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/parser/bytecode/RuntimeBytecodeGen.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,11 @@ public void addIndirectCall(int nodeIndex, int typeIndex, int tableIndex) {
537537
}
538538
}
539539

540+
public void addSelect(int instruction) {
541+
add1(instruction);
542+
addProfile();
543+
}
544+
540545
private void addDataHeader(int mode, int length, byte[] offsetBytecode, long offsetAddress, int memoryIndex) {
541546
assert offsetBytecode == null || offsetAddress == -1 : "data header does not allow offset bytecode and offset address";
542547
assert mode == SegmentMode.ACTIVE || mode == SegmentMode.PASSIVE : "invalid segment mode in data header";

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/parser/validation/ParserState.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ public void addInstruction(int instruction) {
318318
bytecode.add(instruction);
319319
}
320320

321+
public void addSelectInstruction(int instruction) {
322+
bytecode.addSelect(instruction);
323+
}
324+
321325
/**
322326
* Performs the necessary branch checks and adds the conditional branch information in the extra
323327
* data array.

0 commit comments

Comments
 (0)