Skip to content

Commit 3bea818

Browse files
committed
[GR-66430] Fix performance regression by splitting the bytecode loop
PullRequest: graalpython/3872
2 parents 0974df1 + fc4f03e commit 3bea818

File tree

1 file changed

+51
-34
lines changed

1 file changed

+51
-34
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,26 +1575,6 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod
15751575
stackTop = bytecodeClosureFromStack(virtualFrame, stackTop, oparg);
15761576
break;
15771577
}
1578-
case OpCodesConstants.LOAD_LOCALS: {
1579-
if (locals == null) {
1580-
CompilerDirectives.transferToInterpreterAndInvalidate();
1581-
throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.NO_LOCALS_FOUND);
1582-
}
1583-
virtualFrame.setObject(++stackTop, locals);
1584-
break;
1585-
}
1586-
case OpCodesConstants.LOAD_FROM_DICT_OR_DEREF: {
1587-
setCurrentBci(virtualFrame, bciSlot, bci);
1588-
oparg |= Byte.toUnsignedInt(localBC[++bci]);
1589-
stackTop = bytecodeLoadFromDictOrDeref(virtualFrame, localFrame, stackTop, beginBci, localNodes, oparg, localCelloffset, useCachedNodes);
1590-
break;
1591-
}
1592-
case OpCodesConstants.LOAD_FROM_DICT_OR_GLOBALS: {
1593-
setCurrentBci(virtualFrame, bciSlot, bci);
1594-
oparg |= Byte.toUnsignedInt(localBC[++bci]);
1595-
stackTop = bytecodeLoadFromDictOrGlobals(virtualFrame, globals, stackTop, beginBci, localNames[oparg], localNodes, useCachedNodes);
1596-
break;
1597-
}
15981578
case OpCodesConstants.LOAD_DEREF: {
15991579
oparg |= Byte.toUnsignedInt(localBC[++bci]);
16001580
stackTop = bytecodeLoadDeref(virtualFrame, localFrame, stackTop, beginBci, localNodes, oparg, localCelloffset, useCachedNodes);
@@ -2325,21 +2305,12 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod
23252305
bci++;
23262306
continue;
23272307
}
2328-
case OpCodesConstants.MAKE_TYPE_PARAM: {
2329-
oparg |= Byte.toUnsignedInt(localBC[++bci]);
2330-
stackTop = bytecodeMakeTypeParam(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci, oparg);
2331-
break;
2308+
default: {
2309+
long r = infrequentBytecodes(virtualFrame, localFrame, bc, bci, stackTop, beginBci, oparg, localBC, globals, locals, localNames, localNodes, bciSlot, localCelloffset,
2310+
useCachedNodes);
2311+
stackTop = (int) (r >> 32);
2312+
bci = (int) r;
23322313
}
2333-
case OpCodesConstants.MAKE_TYPE_ALIAS: {
2334-
stackTop = bytecodeMakeTypeAlias(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci);
2335-
break;
2336-
}
2337-
case OpCodesConstants.MAKE_GENERIC: {
2338-
stackTop = bytecodeMakeGeneric(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci);
2339-
break;
2340-
}
2341-
default:
2342-
throw raiseUnknownBytecodeError(bc);
23432314
}
23442315
// prepare next loop
23452316
oparg = 0;
@@ -2429,6 +2400,52 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod
24292400
}
24302401
}
24312402

2403+
private long infrequentBytecodes(VirtualFrame virtualFrame, Frame localFrame, byte bc, int bci, int stackTop, int beginBci, int oparg, byte[] localBC, Object globals, Object locals,
2404+
TruffleString[] localNames, Node[] localNodes, int bciSlot, int localCelloffset, boolean useCachedNodes) {
2405+
switch (bc) {
2406+
case OpCodesConstants.LOAD_LOCALS: {
2407+
if (locals == null) {
2408+
CompilerDirectives.transferToInterpreterAndInvalidate();
2409+
throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.NO_LOCALS_FOUND);
2410+
}
2411+
virtualFrame.setObject(++stackTop, locals);
2412+
break;
2413+
}
2414+
case OpCodesConstants.LOAD_FROM_DICT_OR_DEREF: {
2415+
setCurrentBci(virtualFrame, bciSlot, bci);
2416+
oparg |= Byte.toUnsignedInt(localBC[++bci]);
2417+
stackTop = bytecodeLoadFromDictOrDeref(virtualFrame, localFrame, stackTop, beginBci, localNodes,
2418+
oparg, localCelloffset, useCachedNodes);
2419+
break;
2420+
}
2421+
case OpCodesConstants.LOAD_FROM_DICT_OR_GLOBALS: {
2422+
setCurrentBci(virtualFrame, bciSlot, bci);
2423+
oparg |= Byte.toUnsignedInt(localBC[++bci]);
2424+
stackTop = bytecodeLoadFromDictOrGlobals(virtualFrame, globals, stackTop, beginBci,
2425+
localNames[oparg], localNodes, useCachedNodes);
2426+
break;
2427+
}
2428+
case OpCodesConstants.MAKE_TYPE_PARAM: {
2429+
oparg |= Byte.toUnsignedInt(localBC[++bci]);
2430+
stackTop = bytecodeMakeTypeParam(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci,
2431+
oparg);
2432+
break;
2433+
}
2434+
case OpCodesConstants.MAKE_TYPE_ALIAS: {
2435+
stackTop = bytecodeMakeTypeAlias(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci);
2436+
break;
2437+
}
2438+
case OpCodesConstants.MAKE_GENERIC: {
2439+
stackTop = bytecodeMakeGeneric(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci);
2440+
break;
2441+
}
2442+
default:
2443+
throw raiseUnknownBytecodeError(bc);
2444+
2445+
}
2446+
return (long) stackTop << 32 | bci;
2447+
}
2448+
24322449
@BytecodeInterpreterSwitch
24332450
private int bytecodeGetAIter(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, Node[] localNodes, int bci) {
24342451
GetAIterNode node = insertChildNode(localNodes, bci, UNCACHED_GET_AITER, GetAIterNodeGen.class, NODE_GET_AITER, useCachedNodes);

0 commit comments

Comments
 (0)