How to write a function call with Truffle

Remi Forax forax at univ-mlv.fr
Thu Aug 15 12:34:40 PDT 2013


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.

>
> 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.

>
> 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.

>
> - 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