< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java
Print this page
@@ -116,21 +116,22 @@
*
* @param method the method whose frame is simulated
* @param graph the target graph of Graal nodes created by the builder
*/
public FrameStateBuilder(GraphBuilderTool tool, ResolvedJavaMethod method, StructuredGraph graph) {
- this(tool, new ResolvedJavaMethodBytecode(method), graph);
+ this(tool, new ResolvedJavaMethodBytecode(method), graph, false);
}
/**
* Creates a new frame state builder for the given code attribute, method and the given target
- * graph.
+ * graph. Additionally specifies if nonLiveLocals should be retained.
*
* @param code the bytecode in which the frame exists
* @param graph the target graph of Graal nodes created by the builder
+ * @param shouldRetainLocalVariables specifies if nonLiveLocals should be retained in state.
*/
- public FrameStateBuilder(GraphBuilderTool tool, Bytecode code, StructuredGraph graph) {
+ public FrameStateBuilder(GraphBuilderTool tool, Bytecode code, StructuredGraph graph, boolean shouldRetainLocalVariables) {
this.tool = tool;
if (tool instanceof BytecodeParser) {
this.parser = (BytecodeParser) tool;
} else {
this.parser = null;
@@ -142,11 +143,11 @@
assert graph != null;
this.monitorIds = EMPTY_MONITOR_ARRAY;
this.graph = graph;
- this.clearNonLiveLocals = GraalOptions.OptClearNonLiveLocals.getValue(graph.getOptions());
+ this.clearNonLiveLocals = GraalOptions.OptClearNonLiveLocals.getValue(graph.getOptions()) && !shouldRetainLocalVariables;
this.canVerifyKind = true;
}
public void disableKindVerification() {
canVerifyKind = false;
@@ -628,16 +629,16 @@
return false;
}
public void clearNonLiveLocals(BciBlock block, LocalLiveness liveness, boolean liveIn) {
/*
- * (lstadler) if somebody is tempted to remove/disable this clearing code: it's possible to
- * remove it for normal compilations, but not for OSR compilations - otherwise dead object
- * slots at the OSR entry aren't cleared. it is also not enough to rely on PiNodes with
- * Kind.Illegal, because the conflicting branch might not have been parsed.
+ * Non-live local clearing is mandatory for the entry block of an OSR compilation so that
+ * dead object slots at the OSR entry are cleared. It's not sufficient to rely on PiNodes
+ * with Kind.Illegal, because the conflicting branch might not have been parsed.
*/
- if (!clearNonLiveLocals) {
+ boolean isOSREntryBlock = graph.isOSR() && getMethod().equals(graph.method()) && graph.getEntryBCI() == block.startBci;
+ if (!clearNonLiveLocals && !isOSREntryBlock) {
return;
}
if (liveIn) {
for (int i = 0; i < locals.length; i++) {
if (!liveness.localIsLiveIn(block, i)) {
< prev index next >