Hard Crash on OS X and Linux (but somewhat environment dependent)
Stefan Marr
java at stefan-marr.de
Wed Dec 10 14:58:57 UTC 2014
Hi Gilles:
Going through all unsafeCasts, which might or might not be in vain optimizations attempts of mine, it turns out, it is an old friend…
It is SBlock.getContext() again: https://github.com/smarr/TruffleSOM/blob/master/src/som/vmobjects/SBlock.java#L101
public final MaterializedFrame getContext() {
assert context != null;
// This cast is necessary to help Graal to see that we are
// really having a MaterializedFrame here.
return CompilerDirectives.unsafeCast(
// and while we are at it, just also tell Graal the field is not null
// (when getContext() is used, it is guaranteed to be set, by construction)
context, MaterializedFrame.class, true, true);
}
And, context is only ever accessed if there is actually a lexical context. That’s by construction. There is no code path that will ever call getContext() with context being null. For reasonable values of ‘always’, this method has always had the assertion `context != null`, so, there is reasonable evidence that the implementation is correct enough, I would say.
So, I think, there is still something fishy going on here.
Is there any way that this `is-not-null` property is floating somewhere earlier where it shouldn’t be?
But then again, I don’t see how that would matter, since there wouldn’t be a data dependency on the context field to begin with in cases where it is null.
Any deeper insights would be appreciate.
Thanks
Stefan
> On 10 Dec 2014, at 13:37, Stefan Marr <java at stefan-marr.de> wrote:
>
> Hi Gilles:
>
> To complete that experiment, I removed all unsafeCasts. As a result, the crash is gone.
>
> I am not entirely sure why that is however.
> During interpretation, asserts never trigger.
> I suppose, for compilation the asserts are just ignored?
>
> I put them in there mostly because of null-checks I wanted to get rid of when optimizing for some benchmarks, but I also had the impression that it helps with warmup time.
>
> Do you have by chance an idea what I do misunderstand here, or what could be going wrong?
>
> Thanks
> Stefan
>
>> On 10 Dec 2014, at 12:22, Stefan Marr <java at stefan-marr.de> wrote:
>>
>> Hi Gilles:
>>
>>> On 10 Dec 2014, at 11:53, Gilles Duboscq <duboscq at ssw.jku.at> wrote:
>>>
>>> I see a lot of unsafeCast calls where the last argument is true. That
>>> sounds dangerous.
>>> Are you sure your casts really *always* hold? Regardless of
>>> control-flow? This argument should be the condition under which that
>>> cast is safe, which is usually a condition that you have already
>>> checked in the control-flow that leads to the cast.
>>
>> I am not sure what you mean with ‘always’.
>> I use most of those casts to get rid of some of the null-checks I saw in IGV.
>>
>> Below is a patch that adds the assertions corresponding to the unsafeCasts.
>>
>> They do not trigger. Does that satisfy your definition of ‘always’?
>>
>> Best regards
>> Stefan
>>
>> diff --git a/src/som/interpreter/SArguments.java b/src/som/interpreter/SArguments.java
>> index 64d5cd7..4ccc53e 100644
>> --- a/src/som/interpreter/SArguments.java
>> +++ b/src/som/interpreter/SArguments.java
>> @@ -8,10 +8,12 @@ public final class SArguments {
>> private static final int RCVR_IDX = 0;
>>
>> private static Object[] args(final Frame frame) {
>> + assert frame.getArguments() != null;
>> return CompilerDirectives.unsafeCast(frame.getArguments(), Object[].class, true, true);
>> }
>>
>> public static Object arg(final Frame frame, final int index) {
>> + assert args(frame)[index] != null;
>> return CompilerDirectives.unsafeCast(args(frame)[index], Object.class, true, true);
>> }
>>
>> diff --git a/src/som/interpreter/nodes/ContextualNode.java b/src/som/interpreter/nodes/ContextualNode.java
>> index ec83e48..84535aa 100644
>> --- a/src/som/interpreter/nodes/ContextualNode.java
>> +++ b/src/som/interpreter/nodes/ContextualNode.java
>> @@ -62,14 +62,18 @@ public abstract class ContextualNode extends ExpressionNode {
>> int i = contextLevel - 1;
>>
>> while (i > 0) {
>> - self = CompilerDirectives.unsafeCast(self.getOuterSelf(), SBlock.class, true, true);
>> + Object b = self.getOuterSelf();
>> + assert b instanceof SBlock && b != null;
>> + self = CompilerDirectives.unsafeCast(b, SBlock.class, true, true);
>> i--;
>> }
>> return self.getContext();
>> }
>>
>> private SBlock getLocalSelf(final VirtualFrame frame) {
>> - return CompilerDirectives.unsafeCast(FrameUtil.getObjectSafe(frame, localSelf), SBlock.class, true, true);
>> + Object b = FrameUtil.getObjectSafe(frame, localSelf);
>> + assert b instanceof SBlock && b != null;
>> + return CompilerDirectives.unsafeCast(b, SBlock.class, true, true);
>> }
>>
>> @ExplodeLoop
>> @@ -77,6 +81,7 @@ public abstract class ContextualNode extends ExpressionNode {
>> Object self = getLocalSelf(frame);
>> int i = contextLevel;
>> while (i > 0) {
>> + assert self instanceof SBlock && self != null;
>> SBlock block = CompilerDirectives.unsafeCast(self, SBlock.class, true, true);
>> self = block.getOuterSelf();
>> i--;
>> diff --git a/src/som/interpreter/nodes/FieldNode.java b/src/som/interpreter/nodes/FieldNode.java
>> index 4077baa..98a4a4b 100644
>> --- a/src/som/interpreter/nodes/FieldNode.java
>> +++ b/src/som/interpreter/nodes/FieldNode.java
>> @@ -81,6 +81,7 @@ public abstract class FieldNode extends ExpressionNode {
>> @Override
>> public Object doPreEvaluated(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null && arguments[0] instanceof SObject;
>> return executeEvaluated(CompilerDirectives.unsafeCast(
>> arguments[0], SObject.class, true, true));
>> }
>> @@ -134,6 +135,8 @@ public abstract class FieldNode extends ExpressionNode {
>> @Override
>> public final Object doPreEvaluated(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null && arguments[0] instanceof SObject;
>> + assert arguments[1] != null;
>> return executeEvaluated(frame,
>> CompilerDirectives.unsafeCast(arguments[0], SObject.class, true, true),
>> CompilerDirectives.unsafeCast(arguments[1], Object.class, true, true));
>> diff --git a/src/som/interpreter/nodes/LocalVariableNode.java b/src/som/interpreter/nodes/LocalVariableNode.java
>> index 6102aa2..e49bea1 100644
>> --- a/src/som/interpreter/nodes/LocalVariableNode.java
>> +++ b/src/som/interpreter/nodes/LocalVariableNode.java
>> @@ -72,7 +72,9 @@ public abstract class LocalVariableNode extends ExpressionNode {
>>
>> @Specialization(guards = "isInitialized", rewriteOn = {FrameSlotTypeException.class})
>> public final Object doObject(final VirtualFrame frame) throws FrameSlotTypeException {
>> - return CompilerDirectives.unsafeCast(frame.getObject(slot),
>> + Object o = frame.getObject(slot);
>> + assert o != null;
>> + return CompilerDirectives.unsafeCast(o,
>> Object.class, true, true);
>> }
>>
>> diff --git a/src/som/interpreter/nodes/NonLocalVariableNode.java b/src/som/interpreter/nodes/NonLocalVariableNode.java
>> index a7cd432..76230fd 100644
>> --- a/src/som/interpreter/nodes/NonLocalVariableNode.java
>> +++ b/src/som/interpreter/nodes/NonLocalVariableNode.java
>> @@ -60,8 +60,10 @@ public abstract class NonLocalVariableNode extends ContextualNode {
>>
>> @Specialization(guards = "isInitialized", rewriteOn = {FrameSlotTypeException.class})
>> public final Object doObject(final VirtualFrame frame) throws FrameSlotTypeException {
>> + Object o = determineContext(frame).getObject(slot);
>> + assert o != null;
>> return CompilerDirectives.unsafeCast(
>> - determineContext(frame).getObject(slot), Object.class, true, true);
>> + o, Object.class, true, true);
>> }
>>
>> // @Generic
>> diff --git a/src/som/interpreter/nodes/dispatch/CachedBlockDispatchNode.java b/src/som/interpreter/nodes/dispatch/CachedBlockDispatchNode.java
>> index 381552a..a6ca011 100644
>> --- a/src/som/interpreter/nodes/dispatch/CachedBlockDispatchNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/CachedBlockDispatchNode.java
>> @@ -20,6 +20,7 @@ public final class CachedBlockDispatchNode extends AbstractCachedDispatchNode {
>>
>> @Override
>> public Object executeDispatch(final VirtualFrame frame, final Object[] arguments) {
>> + assert arguments[0] instanceof SBlock;
>> SBlock rcvr = CompilerDirectives.unsafeCast(arguments[0], SBlock.class, true, true);
>> if (rcvr.getMethod() == cachedSomMethod) {
>> return cachedMethod.call(frame, arguments);
>> diff --git a/src/som/interpreter/nodes/dispatch/CachedDispatchSObjectCheckNode.java b/src/som/interpreter/nodes/dispatch/CachedDispatchSObjectCheckNode.java
>> index 0eb9492..49b80f9 100644
>> --- a/src/som/interpreter/nodes/dispatch/CachedDispatchSObjectCheckNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/CachedDispatchSObjectCheckNode.java
>> @@ -22,6 +22,7 @@ public final class CachedDispatchSObjectCheckNode extends AbstractCachedDispatch
>> @Override
>> public Object executeDispatch(
>> final VirtualFrame frame, final Object[] arguments) {
>> + assert arguments[0] instanceof SObject;
>> SObject rcvr = CompilerDirectives.unsafeCast(arguments[0], SObject.class, true, true);
>> if (rcvr.getSOMClass() == expectedClass) {
>> return cachedMethod.call(frame, arguments);
>> diff --git a/src/som/interpreter/nodes/dispatch/CachedDispatchSimpleCheckNode.java b/src/som/interpreter/nodes/dispatch/CachedDispatchSimpleCheckNode.java
>> index f86e3f5..29f82a2 100644
>> --- a/src/som/interpreter/nodes/dispatch/CachedDispatchSimpleCheckNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/CachedDispatchSimpleCheckNode.java
>> @@ -20,6 +20,7 @@ public final class CachedDispatchSimpleCheckNode extends AbstractCachedDispatchN
>> @Override
>> public Object executeDispatch(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null;
>> Object rcvr = CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true);
>> if (rcvr.getClass() == expectedClass) {
>> return cachedMethod.call(frame, arguments);
>> diff --git a/src/som/interpreter/nodes/dispatch/CachedDnuSObjectCheckNode.java b/src/som/interpreter/nodes/dispatch/CachedDnuSObjectCheckNode.java
>> index b5a9836..27bbc4c 100644
>> --- a/src/som/interpreter/nodes/dispatch/CachedDnuSObjectCheckNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/CachedDnuSObjectCheckNode.java
>> @@ -27,6 +27,7 @@ public final class CachedDnuSObjectCheckNode extends AbstractCachedDispatchNode
>>
>> @Override
>> public Object executeDispatch(final VirtualFrame frame, final Object[] arguments) {
>> + assert arguments[0] instanceof SObject;
>> SObject rcvr = CompilerDirectives.unsafeCast(arguments[0], SObject.class, true, true);
>>
>> if (rcvr.getSOMClass() == expectedClass) {
>> diff --git a/src/som/interpreter/nodes/dispatch/GenericBlockDispatchNode.java b/src/som/interpreter/nodes/dispatch/GenericBlockDispatchNode.java
>> index 64b5e6c..4ba9693 100644
>> --- a/src/som/interpreter/nodes/dispatch/GenericBlockDispatchNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/GenericBlockDispatchNode.java
>> @@ -14,6 +14,7 @@ public final class GenericBlockDispatchNode extends AbstractDispatchNode {
>> @Override
>> public Object executeDispatch(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] instanceof SBlock;
>> SBlock rcvr = CompilerDirectives.unsafeCast(arguments[0], SBlock.class, true, true);
>> return call.call(frame, rcvr.getMethod().getCallTarget(), arguments);
>> }
>> diff --git a/src/som/interpreter/nodes/dispatch/GenericDispatchNode.java b/src/som/interpreter/nodes/dispatch/GenericDispatchNode.java
>> index b429795..331f946 100644
>> --- a/src/som/interpreter/nodes/dispatch/GenericDispatchNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/GenericDispatchNode.java
>> @@ -24,6 +24,7 @@ public final class GenericDispatchNode extends AbstractDispatchWithLookupNode {
>> @Override
>> public Object executeDispatch(
>> final VirtualFrame frame, final Object[] arguments) {
>> + assert arguments[0] != null;
>> Object rcvr = CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true);
>> SInvokable method = lookupMethod(rcvr);
>> if (method != null) {
>> diff --git a/src/som/interpreter/nodes/dispatch/SObjectCheckDispatchNode.java b/src/som/interpreter/nodes/dispatch/SObjectCheckDispatchNode.java
>> index 2d9106c..0ea1afc 100644
>> --- a/src/som/interpreter/nodes/dispatch/SObjectCheckDispatchNode.java
>> +++ b/src/som/interpreter/nodes/dispatch/SObjectCheckDispatchNode.java
>> @@ -24,6 +24,7 @@ public final class SObjectCheckDispatchNode extends AbstractDispatchNode {
>> @Override
>> public Object executeDispatch(
>> final VirtualFrame frame, final Object[] arguments) {
>> + assert arguments[0] != null;
>> Object rcvr = CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true);
>> if (rcvr instanceof SObject) {
>> return nextInCache.executeDispatch(frame, arguments);
>> diff --git a/src/som/interpreter/nodes/nary/BinaryExpressionNode.java b/src/som/interpreter/nodes/nary/BinaryExpressionNode.java
>> index a5a3f96..3b5eee7 100644
>> --- a/src/som/interpreter/nodes/nary/BinaryExpressionNode.java
>> +++ b/src/som/interpreter/nodes/nary/BinaryExpressionNode.java
>> @@ -29,6 +29,8 @@ public abstract class BinaryExpressionNode extends ExpressionNode
>> @Override
>> public final Object doPreEvaluated(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null;
>> + assert arguments[1] != null;
>> return executeEvaluated(frame,
>> CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true),
>> CompilerDirectives.unsafeCast(arguments[1], Object.class, true, true));
>> diff --git a/src/som/interpreter/nodes/nary/TernaryExpressionNode.java b/src/som/interpreter/nodes/nary/TernaryExpressionNode.java
>> index 9d4fb29..0d91e42 100644
>> --- a/src/som/interpreter/nodes/nary/TernaryExpressionNode.java
>> +++ b/src/som/interpreter/nodes/nary/TernaryExpressionNode.java
>> @@ -29,6 +29,9 @@ public abstract class TernaryExpressionNode extends ExpressionNode
>> @Override
>> public final Object doPreEvaluated(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null;
>> + assert arguments[1] != null;
>> + assert arguments[2] != null;
>> return executeEvaluated(frame,
>> CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true),
>> CompilerDirectives.unsafeCast(arguments[1], Object.class, true, true),
>> diff --git a/src/som/interpreter/nodes/nary/UnaryExpressionNode.java b/src/som/interpreter/nodes/nary/UnaryExpressionNode.java
>> index 7344d33..a7844a2 100644
>> --- a/src/som/interpreter/nodes/nary/UnaryExpressionNode.java
>> +++ b/src/som/interpreter/nodes/nary/UnaryExpressionNode.java
>> @@ -25,6 +25,7 @@ public abstract class UnaryExpressionNode extends ExpressionNode
>> @Override
>> public final Object doPreEvaluated(final VirtualFrame frame,
>> final Object[] arguments) {
>> + assert arguments[0] != null;
>> return executeEvaluated(frame,
>> CompilerDirectives.unsafeCast(arguments[0], Object.class, true, true));
>> }
>> diff --git a/src/som/primitives/reflection/AbstractSymbolDispatch.java b/src/som/primitives/reflection/AbstractSymbolDispatch.java
>> index df92632..f0e79a8 100644
>> --- a/src/som/primitives/reflection/AbstractSymbolDispatch.java
>> +++ b/src/som/primitives/reflection/AbstractSymbolDispatch.java
>> @@ -94,6 +94,7 @@ public abstract class AbstractSymbolDispatch extends Node implements DispatchCha
>> if (this.selector == selector) {
>> Object[] arguments = SArguments.createSArgumentsArrayFrom(receiver, argsArr);
>>
>> + assert cachedSend instanceof PreevaluatedExpression;
>> PreevaluatedExpression realCachedSend = CompilerDirectives.unsafeCast(cachedSend, PreevaluatedExpression.class, true);
>> return realCachedSend.doPreEvaluated(frame, arguments);
>> } else {
>> diff --git a/src/som/vmobjects/SArray.java b/src/som/vmobjects/SArray.java
>> index c3dee89..36ac1d7 100644
>> --- a/src/som/vmobjects/SArray.java
>> +++ b/src/som/vmobjects/SArray.java
>> @@ -21,6 +21,7 @@ public final class SArray {
>> public static Object get(final Object[] arr, final long idx) {
>> assert idx >= 0;
>> assert idx < arr.length;
>> + assert arr[(int) idx] != null;
>> return CompilerDirectives.unsafeCast(arr[(int) idx], Object.class, true, true);
>> }
>>
>> diff --git a/src/som/vmobjects/SObject.java b/src/som/vmobjects/SObject.java
>> index c95bc80..dd1e883 100644
>> --- a/src/som/vmobjects/SObject.java
>> +++ b/src/som/vmobjects/SObject.java
>> @@ -106,10 +106,12 @@ public class SObject extends SAbstractObject {
>> }
>>
>> public final long[] getExtendedPrimFields() {
>> + assert extensionPrimFields instanceof long[];
>> return CompilerDirectives.unsafeCast(extensionPrimFields, long[].class, true, true);
>> }
>>
>> public final Object[] getExtensionObjFields() {
>> + assert extensionObjFields instanceof Object[];
>> return CompilerDirectives.unsafeCast(extensionObjFields, Object[].class, true, true);
>> }
>>
>> @@ -207,6 +209,7 @@ public class SObject extends SAbstractObject {
>>
>> @Override
>> public final SClass getSOMClass() {
>> + assert clazz instanceof SClass;
>> return CompilerDirectives.unsafeCast(clazz, SClass.class, true, true);
>> }
>>
>>
>>
>>
>>>
>>> -Gilles
>>>
>>> On Wed, Dec 10, 2014 at 12:15 AM, Stefan Marr <java at stefan-marr.de> wrote:
>>>> Hi Gilles:
>>>>
>>>> Here the log file.
>>>>
>>>> Best regards
>>>> Stefan
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>> On 10 Dec 2014, at 00:04, Gilles Duboscq <duboscq at ssw.jku.at> wrote:
>>>>>
>>>>> Hello Stefan,
>>>>>
>>>>> Thanks for the report.
>>>>> Could you send us the hs_err file as well (hs_err_pid68949.log)?
>>>>>
>>>>> -Gilles
>>>>>
>>>>> On Tue, Dec 9, 2014 at 11:35 PM, Stefan Marr <java at stefan-marr.de> wrote:
>>>>>> Hi:
>>>>>>
>>>>>> In one of my experiments, I got a hard crash of the Graal VM.
>>>>>> Error below.
>>>>>>
>>>>>> The error is somewhat dependent on either environment or for instance whether -ea and/or -esa are passed to the VM.
>>>>>> Though, I haven’t managed to find a way to avoid crashes reliably.
>>>>>>
>>>>>> To reproduced, you’ll need with a little API change (see patch below) or my version of GraalVM.
>>>>>>
>>>>>> git clone https://github.com/smarr/GraalVM.git
>>>>>> cd GraalVM
>>>>>> ./mx.sh --vm server build -p
>>>>>> cd ../
>>>>>> git clone -b mt-vs-pe/without-control-specialization https://github.com/smarr/TruffleSOM.git
>>>>>> cd TruffleSOM
>>>>>> ant
>>>>>> ../GraalVM/mxtool/mx --vm server vm -Xbootclasspath/a:build/classes som.vm.Universe -cp Smalltalk:Examples/Benchmarks/DeltaBlue Examples/Benchmarks/BenchmarkHarness.som DeltaBlue 1500 0 6000
>>>>>>
>>>>>> Best regards
>>>>>> Stefan
>>>>>>
>>>>>>
>>>>>> #
>>>>>> # A fatal error has been detected by the Java Runtime Environment:
>>>>>> #
>>>>>> # SIGSEGV (0xb) at pc=0x000000010d601e5b, pid=68949, tid=4867
>>>>>> #
>>>>>> # JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26)
>>>>>> # Java VM: OpenJDK 64-Bit Server VM (25.25-b02-internal-graal-unknown-venus-2-2014-12-09_22-44-20_CET mixed mode bsd-amd64 compressed oops)
>>>>>> # Problematic frame:
>>>>>> # J 7192 Graal com.oracle.graal.truffle.OptimizedCallTarget.callRoot([Ljava/lang/Object;)Ljava/lang/Object; (191 bytes) @ 0x000000010d601e5b [0x000000010d601e20+0x3b]
>>>>>> #
>>>>>> # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
>>>>>> #
>>>>>> # An error report file with more information is saved as:
>>>>>> # /Users/smarr/Projects/PostDoc/Truffle/som/hs_err_pid68949.log
>>>>>> Loaded disassembler from /Users/smarr/Projects/PostDoc/Truffle/graal/jdk1.8.0_20/product/jre/lib/hsdis-amd64.dylib
>>>>>> Compiled method (Graal) 12445 7192 4 com.oracle.graal.truffle.OptimizedCallTarget::callRoot (191 bytes)
>>>>>> total in heap [0x000000010d601cd0,0x000000010d601f50] = 640
>>>>>> relocation [0x000000010d601e08,0x000000010d601e20] = 24
>>>>>> main code [0x000000010d601e20,0x000000010d601edd] = 189
>>>>>> stub code [0x000000010d601edd,0x000000010d601ee0] = 3
>>>>>> oops [0x000000010d601ee0,0x000000010d601ef8] = 24
>>>>>> metadata [0x000000010d601ef8,0x000000010d601f00] = 8
>>>>>> scopes data [0x000000010d601f00,0x000000010d601f18] = 24
>>>>>> scopes pcs [0x000000010d601f18,0x000000010d601f48] = 48
>>>>>> dependencies [0x000000010d601f48,0x000000010d601f50] = 8
>>>>>> Compiled method (c2) 12445 2114 4 com.oracle.graal.truffle.OptimizedCallTarget::doInvoke (6 bytes)
>>>>>> total in heap [0x000000010c77b910,0x000000010c77bb58] = 584
>>>>>> relocation [0x000000010c77ba48,0x000000010c77ba60] = 24
>>>>>> main code [0x000000010c77ba60,0x000000010c77bac0] = 96
>>>>>> stub code [0x000000010c77bac0,0x000000010c77bae8] = 40
>>>>>> oops [0x000000010c77bae8,0x000000010c77baf0] = 8
>>>>>> metadata [0x000000010c77baf0,0x000000010c77baf8] = 8
>>>>>> scopes data [0x000000010c77baf8,0x000000010c77bb08] = 16
>>>>>> scopes pcs [0x000000010c77bb08,0x000000010c77bb38] = 48
>>>>>> dependencies [0x000000010c77bb38,0x000000010c77bb40] = 8
>>>>>> handler table [0x000000010c77bb40,0x000000010c77bb58] = 24
>>>>>>
>>>>>>
>>>>>> diff --git a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java
>>>>>> index 8d00194..0670fad 100644
>>>>>> --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java
>>>>>> +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java
>>>>>> @@ -104,7 +104,7 @@ public class OptimizedCallTarget extends InstalledCode implements RootCallTarget
>>>>>> if (root == null || !root.isCloningAllowed()) {
>>>>>> return null;
>>>>>> }
>>>>>> - return NodeUtil.cloneNode(root);
>>>>>> + return root.cloneRootNode();
>>>>>> }
>>>>>>
>>>>>> public Assumption getNodeRewritingAssumption() {
>>>>>> diff --git a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java
>>>>>> index aebf748..2552eea 100644
>>>>>> --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java
>>>>>> +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java
>>>>>> @@ -79,6 +79,10 @@ public abstract class RootNode extends Node {
>>>>>> return false;
>>>>>> }
>>>>>>
>>>>>> + public RootNode cloneRootNode() {
>>>>>> + return NodeUtil.cloneNode(this);
>>>>>> + }
>>>>>> +
>>>>>> /**
>>>>>> * Reports the execution count of a loop that is a child of this node. The optimization
>>>>>> * heuristics can use the loop count to guide compilation and inlining.
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Stefan Marr
>>>>>> INRIA Lille - Nord Europe
>>>>>> http://stefan-marr.de/research/
>>>>>>
>>>>>>
>>>>>>
>>>>
>>>> --
>>>> Stefan Marr
>>>> INRIA Lille - Nord Europe
>>>> http://stefan-marr.de/research/
>>>>
>>>>
>>>>
>>>>
>>
>> --
>> Stefan Marr
>> INRIA Lille - Nord Europe
>> http://stefan-marr.de/research/
>
> --
> Stefan Marr
> INRIA Lille - Nord Europe
> http://stefan-marr.de/research/
>
>
>
--
Stefan Marr
INRIA Lille - Nord Europe
http://stefan-marr.de/research/
More information about the graal-dev
mailing list