# HG changeset patch # User Thomas Wuerthinger # Date 1421957693 -3600 # Node ID b4633ae1b31b0f2e21e57a10d1401dec14d7a059 # Parent 14599c77560ac49b9f17db3a15e65da254ffcb1e Make allocation of virtual object mapping lazy. diff -r 14599c77560a -r b4633ae1b31b graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Thu Jan 22 21:01:46 2015 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java Thu Jan 22 21:14:53 2015 +0100 @@ -57,10 +57,12 @@ // collect all VirtualObjectField instances: FrameState current = topState; do { - for (EscapeObjectState state : current.virtualObjectMappings()) { - if (!objectStates.containsKey(state.object())) { - if (!(state instanceof MaterializedObjectState) || ((MaterializedObjectState) state).materializedValue() != state.object()) { - objectStates.put(state.object(), state); + if (current.virtualObjectMappingCount() > 0) { + for (EscapeObjectState state : current.virtualObjectMappings()) { + if (!objectStates.containsKey(state.object())) { + if (!(state instanceof MaterializedObjectState) || ((MaterializedObjectState) state).materializedValue() != state.object()) { + objectStates.put(state.object(), state); + } } } } diff -r 14599c77560a -r b4633ae1b31b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Thu Jan 22 21:01:46 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Thu Jan 22 21:14:53 2015 +0100 @@ -65,7 +65,7 @@ @OptionalInput(InputType.Association) NodeInputList monitorIds; - @Input(InputType.State) NodeInputList virtualObjectMappings; + @OptionalInput(InputType.State) NodeInputList virtualObjectMappings; /** * The bytecode index to which this frame state applies. @@ -86,7 +86,9 @@ if (monitorIds != null && monitorIds.length > 0) { this.monitorIds = new NodeInputList<>(this, monitorIds); } - this.virtualObjectMappings = new NodeInputList<>(this, virtualObjectMappings); + if (virtualObjectMappings != null && virtualObjectMappings.size() > 0) { + this.virtualObjectMappings = new NodeInputList<>(this, virtualObjectMappings); + } this.rethrowException = rethrowException; this.duringCall = duringCall; assert !this.rethrowException || this.stackSize == 1 : "must have exception on top of the stack"; @@ -151,10 +153,16 @@ } public void addVirtualObjectMapping(EscapeObjectState virtualObject) { + if (virtualObjectMappings == null) { + virtualObjectMappings = new NodeInputList<>(this); + } virtualObjectMappings.add(virtualObject); } public int virtualObjectMappingCount() { + if (virtualObjectMappings == null) { + return 0; + } return virtualObjectMappings.size(); } @@ -190,9 +198,12 @@ if (newOuterFrameState != null) { newOuterFrameState = newOuterFrameState.duplicateWithVirtualState(); } - ArrayList newVirtualMappings = new ArrayList<>(virtualObjectMappings.size()); - for (EscapeObjectState state : virtualObjectMappings) { - newVirtualMappings.add(state.duplicateWithVirtualState()); + ArrayList newVirtualMappings = null; + if (virtualObjectMappings != null) { + newVirtualMappings = new ArrayList<>(virtualObjectMappings.size()); + for (EscapeObjectState state : virtualObjectMappings) { + newVirtualMappings.add(state.duplicateWithVirtualState()); + } } return graph().add(new FrameState(newOuterFrameState, method, bci, values, localsSize, stackSize, rethrowException, duringCall, duplicateMonitorIds(), newVirtualMappings)); } @@ -434,6 +445,7 @@ for (ValueNode value : values.nonNull()) { closure.apply(this, value); } + if (monitorIds != null) { for (MonitorIdNode monitorId : monitorIds) { if (monitorId != null) { @@ -441,9 +453,13 @@ } } } - for (EscapeObjectState state : virtualObjectMappings) { - state.applyToNonVirtual(closure); + + if (virtualObjectMappings != null) { + for (EscapeObjectState state : virtualObjectMappings) { + state.applyToNonVirtual(closure); + } } + if (outerFrameState() != null) { outerFrameState().applyToNonVirtual(closure); } @@ -452,8 +468,10 @@ @Override public void applyToVirtual(VirtualClosure closure) { closure.apply(this); - for (EscapeObjectState state : virtualObjectMappings) { - state.applyToVirtual(closure); + if (virtualObjectMappings != null) { + for (EscapeObjectState state : virtualObjectMappings) { + state.applyToVirtual(closure); + } } if (outerFrameState() != null) { outerFrameState().applyToVirtual(closure); @@ -468,9 +486,11 @@ if (outerFrameState() != null && outerFrameState().isPartOfThisState(state)) { return true; } - for (EscapeObjectState objectState : virtualObjectMappings) { - if (objectState.isPartOfThisState(state)) { - return true; + if (virtualObjectMappings != null) { + for (EscapeObjectState objectState : virtualObjectMappings) { + if (objectState.isPartOfThisState(state)) { + return true; + } } } return false;