Hard Crash on OS X and Linux (but somewhat environment dependent)

Stefan Marr java at stefan-marr.de
Wed Dec 10 12:37:12 UTC 2014


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/





More information about the graal-dev mailing list