How to write a function call with Truffle

Thomas Wuerthinger thomas.wuerthinger at oracle.com
Thu Aug 15 13:39:01 PDT 2013


Great that it works :) ! A couple of further comments inline. - thomas

On Aug 15, 2013, at 9:34 PM, Remi Forax <forax at univ-mlv.fr> wrote:

> On 08/15/2013 05:34 PM, Thomas Wuerthinger wrote:
>> The error message is a little bit misleading; we will fix this. The problem is actually in the method FunctionNode.execute. The loop accesses the array "slots" and gives it to the method Frame.setObject [1]. This parameter must evaluate to a constant, otherwise we cannot do the escape analysis of the accessed frame object. The recommended solution for this is to have an @Children array with individual nodes on the FunctionNode where each child node sets the value of one argument to one local variable (and each node has a final field referring to the slot; you can actually use your VarStoreNode for this!).
> 
> Ok, it works :)
> Maybe, there is a need for an annotation like @Stable (see a recent mlvm patch) to indicate that the array will not changed after construction.
We current have @CompilerDirectives.CompilationFinal (for scalar field values). Maybe we should introduce @CompilerDirectives.CompilationFinalContent. Or maybe an intrinsic for a compilation final array access (then the compiler does not need to track the field value, so this solution seems more reliable).

>> This solution will also later allow you to specialise on the primitive type of the local (the best possible place to look at for local variable specialisation are the ReadLocalNode and WriteLocalNode classes in the com.oracle.truffle.sl.nodes package).
> 
> I will.
> I still have trouble to see how I can create an Arguments object which is specialized.
The Arguments object should just have an unspecialised Object[] array. This is fine. If a call site is hot, you need to inline it anyway. After inlining, you can directly assign the passed arguments to the locals and do not need to create the Arguments object at all. Even if you do, escape analysis and boxing elimination should capture this case. We currently have little information on inlining that can be managed via the InlinableCallSite interface, but plan on adding documentation on the wiki asap.

>> Otherwise, the way you are doing function calls looks fine. For performance the next steps would be to (a) create an inline cache for the call target via node rewriting (i.e., create a ResolvedFunCallNode and replace the FunCallNode with this node) and as a follow-up (b) perform function inlining via copying of the AST of the called function and directly executing it.
> 
> Because the association between a name and a function will not changed often, I think I will try to use an Assumption instead of an IC and I hope to avoid to have to rewrite the node for that.
This sounds like you will need one global Assumption per hash map entry that will be invalidated upon overwriting of the entry (in which case a new assumption will have to be created such that other nodes may specialise on the new entry value). You can use Assumption.check in your specialized FunCallNode.

> 
>> 
>> - thomas
>> 
>> [1] http://lafo.ssw.uni-linz.ac.at/javadoc/graalvm/com.oracle.truffle.api/javadoc/com/oracle/truffle/api/frame/Frame.html#setObject(com.oracle.truffle.api.frame.FrameSlot, java.lang.Object) <http://lafo.ssw.uni-linz.ac.at/javadoc/graalvm/com.oracle.truffle.api/javadoc/com/oracle/truffle/api/frame/Frame.html#setObject%28com.oracle.truffle.api.frame.FrameSlot,%20java.lang.Object%29>
> 
> Rémi
> 
>> 
>> On Aug 15, 2013, at 5:05 PM, Remi Forax <forax at univ-mlv.fr <mailto:forax at univ-mlv.fr>> wrote:
>> 
>>> On 08/15/2013 04:51 PM, Chris Seaton wrote:
>>>> This looks like the virtual frame escaping problem. See
>>>> https://wiki.openjdk.java.net/display/Graal/Truffle+FAQ+and+Guidelines#TruffleFAQandGuidelines-WhyamIgettingerrorsaboutescapingframes
>>>> ?.
>>> 
>>> yes,
>>> in fact it's more like th entry just below, "Why am I getting errors about materializing frames?"
>>> The issue is that I don't think I use too much abstraction here, hence my question,
>>> how to do a method call ?
>>> 
>>> The code that does a method call is here:
>>> https://github.com/forax/ninal/blob/master/fr.umlv.ninal/src/fr/umlv/ninal/interpreter/Interpreter.java#L129
>>> and the code that transfer the values from the arguments to the local variables is here:
>>> https://github.com/forax/ninal/blob/master/fr.umlv.ninal/src/fr/umlv/ninal/interpreter/Interpreter.java#L94
>>> 
>>> Rémi
>>> 
>>>> 
>>>> 
>>>> On 15 August 2013 15:38, Remi Forax <forax at univ-mlv.fr> wrote:
>>>> 
>>>>> I've written a small 'not a lisp' language using Truffle
>>>>> (using only the API part, not the DSL part)
>>>>>  https://github.com/forax/ninal
>>>>> 
>>>>> but I've some trouble to understand how writing a function call,
>>>>> so Graal/Truffle chokes when it tries to JIT the code for a simple fib
>>>>> function like this:
>>>>> 
>>>>> (def fib (n)
>>>>>  (if (< n 1)
>>>>>    1
>>>>>    (+ (fib (- n 1)) (fib (- n 2)))
>>>>>  )
>>>>> )
>>>>> 
>>>>> (print (fib 17))
>>>>> 
>>>>> [forax at localhost ninal]$ mx.sh --java-home=/usr/jdk/jdk1.8.0 vm
>>>>> -G:+DumpOnError -XX:-BootstrapGraal -XX:+PrintCompilation -cp classes
>>>>> fr.umlv.ninal.Main fib.ninal
>>>>>     59    1     n com.oracle.graal.hotspot.**bridge.CompilerToVMImpl::**executeCompiledMethodIntrinsic
>>>>> (native)   (static)
>>>>>    193    2     n       java.lang.System::arraycopy (native) (static)
>>>>>    239    3     n       sun.misc.Unsafe::getInt (native)
>>>>>      0    2             sun.nio.cs.UTF_8$Encoder::**encode(char[], int,
>>>>> int, byte[]) (359 bytes)
>>>>>      0    1             java.lang.String::charAt(int) (29 bytes)
>>>>>      0    3             java.lang.String::indexOf(int, int) (70 bytes)
>>>>>      0    4             java.lang.String::hashCode() (55 bytes)
>>>>> using Graal Truffle Runtime
>>>>> IfNode(sourceSection = null) {
>>>>>    condition = TestOpNode(sourceSection = null, binOp = LT) {
>>>>>        leftNode = VarLoadNode(sourceSection = null, slot = [0,:n,Object])
>>>>>        rightNode = ConstNode(sourceSection = null, constant = 1)
>>>>>    }
>>>>>    trueNode = ConstNode(sourceSection = null, constant = 1)
>>>>>    falseNode = NumberOpNode(sourceSection = null, binOp = ADD) {
>>>>>        leftNode = FunCallNode(sourceSection = null, name = :fib) {
>>>>>            argumentNodes = [NumberOpNode(sourceSection = null, binOp =
>>>>> SUB) {
>>>>>                leftNode = VarLoadNode(sourceSection = null, slot =
>>>>> [0,:n,Object])
>>>>>                rightNode = ConstNode(sourceSection = null, constant = 1)
>>>>>            }]
>>>>>        }
>>>>>        rightNode = FunCallNode(sourceSection = null, name = :fib) {
>>>>>            argumentNodes = [NumberOpNode(sourceSection = null, binOp =
>>>>> SUB) {
>>>>>                leftNode = VarLoadNode(sourceSection = null, slot =
>>>>> [0,:n,Object])
>>>>>                rightNode = ConstNode(sourceSection = null, constant = 2)
>>>>>            }]
>>>>>        }
>>>>>    }
>>>>> }
>>>>>    648    4     n       sun.misc.Unsafe::getObject (native)
>>>>>    651    5     n       java.lang.Thread::**currentThread (native)
>>>>> (static)
>>>>>    736    6     n       java.lang.Object::getClass (native)
>>>>>    742    7     n       java.lang.Class::isInstance (native)
>>>>>    795    8     n       java.lang.Object::hashCode (native)
>>>>>    874    9     n       sun.misc.Unsafe::**getObjectVolatile (native)
>>>>>    878   10     n       java.lang.System::**identityHashCode (native)
>>>>> (static)
>>>>>   1012   11     n       java.lang.Object::clone (native)
>>>>>   1228   12     n       sun.misc.Unsafe::putObject (native)
>>>>>      0    5             java.io.DataOutputStream::**writeUTF(String,
>>>>> DataOutput) (435 bytes)
>>>>>      0    7             java.util.HashMap::indexFor(**int, int) (6 bytes)
>>>>>      0    8 java.lang.CharacterDataLatin1:**:isWhitespace(int) (23 bytes)
>>>>>      0    6             java.lang.String::indexOf(**char[], int, int,
>>>>> char[], int, int, int) (166 bytes)
>>>>>      0    9 sun.reflect.generics.parser.**SignatureParser::**parseIdentifier()
>>>>> (115 bytes)
>>>>>   1404   13     n       java.lang.Class::isPrimitive (native)
>>>>>      0   10             java.util.HashMap::transfer(**Object[]) (155
>>>>> bytes)
>>>>>   1746   14     n       java.lang.Class::**getComponentType (native)
>>>>>   1762   15     n       java.lang.reflect.Array::**newArray (native)
>>>>> (static)
>>>>>      0   11             java.lang.String::replace(**char, char) (127
>>>>> bytes)
>>>>>   2709   16     n       java.lang.Class::**isAssignableFrom (native)
>>>>>   3756   17     n       sun.reflect.Reflection::**getCallerClass
>>>>> (native)   (static)
>>>>>   3760   18     n       java.lang.Class::getModifiers (native)
>>>>>   3761   19     n       java.lang.Class::**getClassLoader0 (native)
>>>>>      0   12 sun.reflect.generics.parser.**SignatureParser::current() (40
>>>>> bytes)
>>>>>      0   13             java.lang.Object::<init>() (1 bytes)
>>>>>      0   14             java.lang.Character::**isWhitespace(char) (5
>>>>> bytes)
>>>>>      0   15             java.lang.Character::**isWhitespace(int) (9
>>>>> bytes)
>>>>>      0   16             java.lang.StringBuilder::<**init>() (7 bytes)
>>>>>   4809   20     n       sun.reflect.ConstantPool::**getUTF8At0 (native)
>>>>>   5389   21     n       sun.misc.Unsafe::getLong (native)
>>>>>   6554   22     n       sun.misc.Unsafe::getShort (native)
>>>>>      0   17             java.lang.CharacterData::of(**int) (120 bytes)
>>>>>      0   18 java.lang.CharacterDataLatin1:**:getProperties(int) (11
>>>>> bytes)
>>>>>      0   19 java.lang.**AbstractStringBuilder::**ensureCapacityInternal(int)
>>>>> (16 bytes)
>>>>>      0   20             java.lang.String::lastIndexOf(**int, int) (52
>>>>> bytes)
>>>>>      0   21             java.lang.Math::min(int, int) (11 bytes)
>>>>>      0   22             java.lang.String::equals(**Object) (81 bytes)
>>>>>      0   23             java.util.ArrayList::access$**100(ArrayList) (5
>>>>> bytes)
>>>>>      0   24             java.lang.ref.Reference::get() (5 bytes)
>>>>>      0   25             java.util.HashMap::hash(**Object) (33 bytes)
>>>>>   7227   23     n       java.lang.Class::**getConstantPool (native)
>>>>>      0   26             java.lang.reflect.Method::**getName() (5 bytes)
>>>>>      0   27             java.lang.String::startsWith(**String, int) (72
>>>>> bytes)
>>>>>      0   28 com.oracle.graal.hotspot.meta.**HotSpotSignature::**parseSignature(String,
>>>>> int) (199 bytes)
>>>>>      0   29             java.util.ArrayList::size() (5 bytes)
>>>>>      0   30 java.lang.**AbstractStringBuilder::append(**char) (29 bytes)
>>>>>      0   31             java.lang.StringBuilder::**append(char) (8 bytes)
>>>>>      0   32             java.util.HashMap$Entry::<**init>(int, Object,
>>>>> Object, Object) (26 bytes)
>>>>>      0   33             java.util.Arrays::copyOfRange(**char[], int,
>>>>> int) (63 bytes)
>>>>>      0   34             java.lang.String::<init>(char[**], int, int) (62
>>>>> bytes)
>>>>>      0   35 com.oracle.graal.graph.Graph::**access$000(Graph) (5 bytes)
>>>>>      0   36             java.lang.String::length() (6 bytes)
>>>>>   8064   24     n       sun.misc.Unsafe::getBoolean (native)
>>>>>      0   37             java.util.HashMap::get(Object) (20 bytes)
>>>>>      0   38             java.util.ArrayList::**rangeCheck(int) (22 bytes)
>>>>>      0   39             java.util.ArrayList::**elementData(int) (7 bytes)
>>>>>      0   40 sun.reflect.generics.parser.**SignatureParser::advance() (37
>>>>> bytes)
>>>>>      0   41             java.util.ArrayList::get(int) (11 bytes)
>>>>>      0   42             java.util.HashMap$Entry::**getValue() (5 bytes)
>>>>>      0   43             com.oracle.graal.graph.Node::**id() (5 bytes)
>>>>>      0   44 java.lang.ThreadLocal::access$**400(ThreadLocal) (5 bytes)
>>>>>      0   45             java.lang.ThreadLocal::getMap(**Thread) (5 bytes)
>>>>>      0   46             java.lang.ThreadLocal::get() (38 bytes)
>>>>>      0   47 java.lang.ThreadLocal$**ThreadLocalMap::getEntry(**ThreadLocal)
>>>>> (42 bytes)
>>>>>      0   48 java.lang.ThreadLocal$**ThreadLocalMap::access$000(**ThreadLocal$ThreadLocalMap,
>>>>> ThreadLocal) (6 bytes)
>>>>>      0   49 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**forward()
>>>>> (161 bytes)
>>>>>      0   50             java.util.BitSet::wordIndex(**int) (5 bytes)
>>>>>      0   51             com.oracle.graal.graph.Node::**getNodeClass() (5
>>>>> bytes)
>>>>>      0   52 java.util.ArrayList::**ensureExplicitCapacity(int) (26 bytes)
>>>>>   8600   25     n       java.lang.String::intern (native)
>>>>>      0   53 java.util.ArrayList::**ensureCapacityInternal(int) (23 bytes)
>>>>>      0   54             java.util.BitSet::**checkInvariants() (111 bytes)
>>>>>      0   55 com.oracle.graal.graph.**NodeClass::getNode(Node, long) (12
>>>>> bytes)
>>>>>      0   56             java.util.ArrayList$Itr::**hasNext() (20 bytes)
>>>>>      0   57 com.oracle.graal.debug.**internal.DebugScope::**getInstance()
>>>>> (53 bytes)
>>>>>      0   58             java.util.ArrayList::add(**Object) (29 bytes)
>>>>>      0   59 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**hasNext()
>>>>> (83 bytes)
>>>>>      0   60 com.oracle.graal.graph.Graph$**NodeIterator::forward() (62
>>>>> bytes)
>>>>>      0   61 com.oracle.graal.graph.**NodeClass::access$300(Node, long)
>>>>> (6 bytes)
>>>>>      0   62 com.oracle.graal.graph.**iterators.**AbstractNodeIterable::<init>()
>>>>> (5 bytes)
>>>>>      0   63             com.oracle.graal.graph.Node::**isAlive() (13
>>>>> bytes)
>>>>>      0   64 java.util.ArrayList$Itr::**checkForComodification() (23
>>>>> bytes)
>>>>>      0   65             java.util.BitSet::get(int) (69 bytes)
>>>>>      0   66             java.util.ArrayList$Itr::next(**) (66 bytes)
>>>>>      0   67 com.oracle.graal.graph.**NodeBitMap::isMarked(Node) (12
>>>>> bytes)
>>>>>      0   68 com.oracle.graal.graph.**NodeUsagesList::access$100(**NodeUsagesList)
>>>>> (5 bytes)
>>>>>      0   69 com.oracle.graal.graph.**NodeUsagesList$1::hasNext() (48
>>>>> bytes)
>>>>>      0   70 com.oracle.graal.debug.**internal.DebugScope::**getQualifiedName()
>>>>> (5 bytes)
>>>>>      0   71 com.oracle.graal.compiler.**GraalDebugConfig::**checkDebugFilter(String,
>>>>> DebugFilter) (18 bytes)
>>>>>      0   72 com.oracle.graal.debug.Debug::**currentScope() (16 bytes)
>>>>>      0   73 com.oracle.graal.compiler.**GraalDebugConfig::isEnabled(**DebugFilter)
>>>>> (23 bytes)
>>>>>      0   74 com.oracle.graal.graph.Graph$**NodeIterator::**checkForDeletedNode()
>>>>> (65 bytes)
>>>>>      0   75 com.oracle.graal.graph.Graph$**NodeIterator::hasNext() (27
>>>>> bytes)
>>>>>      0   76             com.oracle.graal.graph.**NodeMap::check(Node)
>>>>> (88 bytes)
>>>>>      0   77 java.util.AbstractCollection::**<init>() (5 bytes)
>>>>>      0   78 com.oracle.graal.graph.**iterators.**
>>>>> PredicatedProxyNodeIterator::**forward() (113 bytes)
>>>>>      0   79             com.oracle.graal.graph.**NodeMap::size() (6
>>>>> bytes)
>>>>>      0   80             com.oracle.graal.graph.**NodeMap::isNew(Node)
>>>>> (17 bytes)
>>>>>  10220   26     n       java.lang.Class::forName0 (native) (static)
>>>>>      0   81             com.oracle.graal.graph.**NodeMap::get(Node) (15
>>>>> bytes)
>>>>>      0   82 com.oracle.graal.graph.Graph$**NodeIterator::next() (31
>>>>> bytes)
>>>>>  10292   27     n       sun.misc.Unsafe::getByte (native)
>>>>>      0   83 com.oracle.graal.graph.Graph$**NodeIterator::next() (5 bytes)
>>>>>      0   84 com.oracle.graal.graph.**NodeClassIterable::<init>() (5
>>>>> bytes)
>>>>>      0   85             com.oracle.graal.graph.Node::**modCount() (5
>>>>> bytes)
>>>>>      0   86 com.oracle.graal.graph.**NodeClass$NodeClassIterator::<**init>(Node,
>>>>> long[], int, NodeClass$1) (8 bytes)
>>>>>  10541   28     n       sun.misc.Unsafe::getLong (native)
>>>>>      0   87 com.oracle.graal.graph.**NodeClass$NodeClassIterator::<**init>(Node,
>>>>> long[], int) (42 bytes)
>>>>>      0   88 java.util.HashMap$**HashIterator::findNextBin() (66 bytes)
>>>>>      0   89             java.util.Arrays::copyOf(char[**], int) (19
>>>>> bytes)
>>>>>      0   90 com.oracle.graal.graph.**NodeUsagesList$1::next() (48 bytes)
>>>>>      0   91 com.oracle.graal.graph.**NodeUsagesList$1::next() (5 bytes)
>>>>>      0   92 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**next()
>>>>> (74 bytes)
>>>>>      0   93 com.oracle.graal.graph.**NodeClass$NodeClassIterator::**nextElement()
>>>>> (74 bytes)
>>>>>      0   94 java.lang.**AbstractStringBuilder::**expandCapacity(int) (50
>>>>> bytes)
>>>>>      0   95             com.oracle.graal.nodes.cfg.**Block::getId() (5
>>>>> bytes)
>>>>>      0   96 com.oracle.graal.graph.**iterators.NodePredicates$**
>>>>> PositiveTypePredicate::apply(**Node) (35 bytes)
>>>>>      0   97             java.util.HashMap::put(Object, Object) (300 bytes)
>>>>>      0   98 sun.reflect.**ClassFileAssembler::**emitConstantPoolUTF8(String)
>>>>> (50 bytes)
>>>>>      0   99             sun.reflect.UTF8::encode(**String) (191 bytes)
>>>>>      0  100             sun.reflect.UTF8::utf8Length(**String) (81 bytes)
>>>>>      0  101 com.oracle.graal.nodes.cfg.**ControlFlowGraph::**getNodeToBlock()
>>>>> (5 bytes)
>>>>>      0  102             java.lang.Enum::ordinal() (5 bytes)
>>>>>      0  103 java.io.ByteArrayOutputStream:**:ensureCapacity(int) (16
>>>>> bytes)
>>>>>      0  104             java.util.Arrays::fill(Object[**], Object) (21
>>>>> bytes)
>>>>>      0  105 sun.reflect.generics.parser.**SignatureParser::**
>>>>> parsePackageNameAndSimpleClass**TypeSignature() (139 bytes)
>>>>>      0  106             java.util.HashMap::**createEntry(int, Object,
>>>>> Object, int, boolean) (131 bytes)
>>>>>  12621   -1             java.lang.String::indexOf (166 bytes) made not
>>>>> entrant
>>>>> scope: Truffle.createGraph.**PartialEscape.iteration 0.InterceptException
>>>>> Exception occurred in scope: Truffle.createGraph.**PartialEscape.iteration
>>>>> 0.InterceptException
>>>>> Context obj com.oracle.graal.nodes.util.**GraphUtil$2: Must not let
>>>>> virtual frame object escape at node 100|FrameSetByte. Insert a call to
>>>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>>>> object (source position of following stack trace is approximate)
>>>>> Context obj com.oracle.graal.virtual.**phases.ea.PartialEscapePhase@**
>>>>> 38089dae
>>>>> Context obj StructuredGraph:6{**HotSpotMethod<**OptimizedCallTarget.**executeHelper(PackedFrame,
>>>>> Arguments)>}
>>>>> Could not connect to the IGV on 127.0.0.1:4445 :
>>>>> java.net.ConnectException: Connection refused
>>>>> Context obj DebugDumpScope[Truffle: FunctionNode at 4dcbadb4]
>>>>> [truffle] opt failed FunctionNode at 4dcbadb4 com.oracle.graal.nodes.util.**GraphUtil$2:
>>>>> Must not let virtual frame object escape at node 100|FrameSetByte. Insert a
>>>>> call to VirtualFrame.materialize() to convert the instance to a
>>>>> materialized frame object (source position of following stack trace is
>>>>> approximate)
>>>>> com.oracle.graal.nodes.util.**GraphUtil$2: Must not let virtual frame
>>>>> object escape at node 100|FrameSetByte. Insert a call to
>>>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>>>> object (source position of following stack trace is approximate)
>>>>> Caused by: com.oracle.graal.graph.**GraalInternalError: Must not let
>>>>> virtual frame object escape at node 100|FrameSetByte. Insert a call to
>>>>> VirtualFrame.materialize() to convert the instance to a materialized frame
>>>>> object (source position of following stack trace is approximate)
>>>>>    at com.oracle.graal.truffle.**nodes.NewFrameNode.**
>>>>> getMaterializedRepresentationH**elper(NewFrameNode.java:130)
>>>>>    at com.oracle.graal.truffle.**nodes.NewFrameNode$**
>>>>> VirtualOnlyInstanceNode.**getMaterializedRepresentation(**
>>>>> NewFrameNode.java:107)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeBlockState.**
>>>>> materializeWithCommit(**PartialEscapeBlockState.java:**93)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeBlockState.**
>>>>> materializeBefore(**PartialEscapeBlockState.java:**83)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>>>> ensureMaterialized(**PartialEscapeClosure.java:207)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>>>> replaceWithMaterialized(**PartialEscapeClosure.java:215)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>>>> processNode(**PartialEscapeClosure.java:196)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PartialEscapeClosure.**
>>>>> processNode(**PartialEscapeClosure.java:98)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PEReadEliminationClosure.**
>>>>> processNode(**PEReadEliminationClosure.java:**54)
>>>>>    at com.oracle.graal.virtual.**phases.ea.**PEReadEliminationClosure.**
>>>>> processNode(**PEReadEliminationClosure.java:**41)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>>>> processBlock(EffectsClosure.**java:121)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>>>> processBlock(EffectsClosure.**java:39)
>>>>>    at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>>>> ReentrantBlockIterator.java:**91)
>>>>>    at com.oracle.graal.phases.graph.**ReentrantBlockIterator.**
>>>>> processLoop(**ReentrantBlockIterator.java:**56)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>>>> processLoop(EffectsClosure.**java:149)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsClosure.**
>>>>> processLoop(EffectsClosure.**java:39)
>>>>>    at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>>>> ReentrantBlockIterator.java:**108)
>>>>>    at com.oracle.graal.phases.graph.**ReentrantBlockIterator.apply(**
>>>>> ReentrantBlockIterator.java:**76)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsPhase$1.call(**
>>>>> EffectsPhase.java:69)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsPhase$1.call(**
>>>>> EffectsPhase.java:62)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.call(**
>>>>> DebugScope.java:311)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.**
>>>>> executeScope(DebugScope.java:**192)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>>>> DebugScope.java:177)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:155)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:126)
>>>>>    at com.oracle.graal.virtual.**phases.ea.EffectsPhase.**
>>>>> runAnalysis(EffectsPhase.java:**62)
>>>>>    at com.oracle.graal.virtual.**phases.ea.PartialEscapePhase.**
>>>>> run(PartialEscapePhase.java:**63)
>>>>>    at com.oracle.graal.virtual.**phases.ea.PartialEscapePhase.**
>>>>> run(PartialEscapePhase.java:**41)
>>>>>    at com.oracle.graal.phases.**BasePhase$1.run(BasePhase.**java:62)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.**
>>>>> executeScope(DebugScope.java:**189)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>>>> DebugScope.java:177)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:135)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:130)
>>>>>    at com.oracle.graal.phases.**BasePhase.apply(BasePhase.**java:59)
>>>>>    at com.oracle.graal.phases.**BasePhase.apply(BasePhase.**java:55)
>>>>>    at com.oracle.graal.truffle.**PartialEvaluator$1.run(**
>>>>> PartialEvaluator.java:180)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.**
>>>>> executeScope(DebugScope.java:**189)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>>>> DebugScope.java:177)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:135)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:130)
>>>>>    at com.oracle.graal.truffle.**PartialEvaluator.createGraph(**
>>>>> PartialEvaluator.java:112)
>>>>>    at com.oracle.graal.truffle.**TruffleCompilerImpl.**compileMethodImpl(
>>>>> **TruffleCompilerImpl.java:118)
>>>>>    at com.oracle.graal.truffle.**TruffleCompilerImpl.access$**
>>>>> 000(TruffleCompilerImpl.java:**54)
>>>>>    at com.oracle.graal.truffle.**TruffleCompilerImpl$1.call(**
>>>>> TruffleCompilerImpl.java:105)
>>>>>    at com.oracle.graal.truffle.**TruffleCompilerImpl$1.call(**
>>>>> TruffleCompilerImpl.java:101)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.call(**
>>>>> DebugScope.java:311)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.**
>>>>> executeScope(DebugScope.java:**192)
>>>>>    at com.oracle.graal.debug.**internal.DebugScope.scope(**
>>>>> DebugScope.java:177)
>>>>>    at com.oracle.graal.debug.Debug.**scope(Debug.java:155)
>>>>>    at com.oracle.graal.truffle.**TruffleCompilerImpl.compile(**
>>>>> TruffleCompilerImpl.java:101)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.compile(**
>>>>> OptimizedCallTarget.java:140)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**compileOrInline(**
>>>>> OptimizedCallTarget.java:128)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:116)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:217)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:217)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:217)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:217)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$NumberOpNode.eval(**
>>>>> Interpreter.java:216)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$IfNode.eval(**
>>>>> Interpreter.java:383)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunctionNode.**
>>>>> execute(Interpreter.java:107)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$FunCallNode.eval(**
>>>>> Interpreter.java:156)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$PrintNode.eval(**
>>>>> Interpreter.java:355)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter$EvalNode.execute(**
>>>>> Interpreter.java:77)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**executeHelper(**
>>>>> OptimizedCallTarget.java:174)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.**interpreterCall(**
>>>>> OptimizedCallTarget.java:114)
>>>>>    at com.oracle.graal.truffle.**OptimizedCallTarget.call(**
>>>>> OptimizedCallTarget.java:89)
>>>>>    at com.oracle.truffle.api.**CallTarget.call(CallTarget.**java:42)
>>>>>    at fr.umlv.ninal.interpreter.**Interpreter.interpret(**
>>>>> Interpreter.java:605)
>>>>>    at fr.umlv.ninal.Main.main(Main.**java:22)
>>>>> 
>>>>> 
>>>>> Rémi
>>>>> 
>>>>> 
>>> 
>> 
> 



More information about the graal-dev mailing list