# HG changeset patch # User Gilles Duboscq # Date 1308669264 -7200 # Node ID 848dd57066add5b6f9392a3086b031044cff5d0b # Parent 00239c259a42a58275bd8c7d2bfa3a215120f4d6# Parent f08a810b84498cbc33c9e0500c290c257b3a1d7e Merge diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Tue Jun 21 17:14:24 2011 +0200 @@ -113,6 +113,8 @@ public static boolean GenLIR = true; public static boolean GenCode = true; public static boolean UseBranchPrediction = true; + public static boolean UseExceptionProbability = ____; + public static int MatureInvocationCount = 100; public static boolean UseConstDirectCall = ____; diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Tue Jun 21 17:14:24 2011 +0200 @@ -156,7 +156,7 @@ } for (Node node : graph.getNodes()) { - if (node == Node.Null || omittedClasses.contains(node.getClass())) { + if (omittedClasses.contains(node.getClass())) { continue; } @@ -250,9 +250,6 @@ if (nodeToBlock != null) { for (Node n : graph.getNodes()) { - if (n == null) { - continue; - } Block blk = nodeToBlock.get(n); if (blk == block) { nodes.add(n); diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java Tue Jun 21 17:14:24 2011 +0200 @@ -23,6 +23,7 @@ package com.oracle.max.graal.compiler.debug; import java.io.*; +import java.util.*; import com.oracle.max.graal.compiler.ir.*; import com.oracle.max.graal.compiler.util.*; @@ -444,7 +445,7 @@ */ public LogStream printf(String format, Object... args) { if (ps != null) { - print(String.format(format, args)); + print(String.format(Locale.ENGLISH, format, args)); } return this; } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Tue Jun 21 17:14:24 2011 +0200 @@ -99,6 +99,8 @@ new CanonicalizerPhase().apply(graph); new DeadCodeEliminationPhase().apply(graph); } +// +// new EscapeAnalysisPhase().apply(graph); if (GraalOptions.OptLoops) { new LoopPhase().apply(graph); diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -104,7 +104,7 @@ private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node)) { + if (!flood.isMarked(node)) { if (node instanceof EndNode) { EndNode end = (EndNode) node; Merge merge = end.merge(); @@ -131,7 +131,7 @@ private void deleteNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node)) { + if (!flood.isMarked(node)) { node.unsafeDelete(); } } @@ -142,7 +142,7 @@ if (node instanceof Local) { flood.add(node); } - if (node != Node.Null && flood.isMarked(node)) { + if (flood.isMarked(node)) { for (Node input : node.inputs()) { flood.add(input); } @@ -157,7 +157,7 @@ private void disconnectNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node)) { + if (!flood.isMarked(node)) { for (int i = 0; i < node.inputs().size(); i++) { Node input = node.inputs().get(i); if (input != Node.Null && flood.isMarked(input)) { diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DuplicationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DuplicationPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DuplicationPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ // Delete nodes in original graph. for (Node n : graph.getNodes()) { - if (n != null && n != graph.start()) { + if (n != graph.start()) { n.forceDelete(); } } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -387,6 +387,12 @@ private FixedNode handleException(Value exceptionObject, int bci) { assert bci == Instruction.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci"; + if (GraalOptions.UseExceptionProbability && method.invocationCount() > GraalOptions.MatureInvocationCount) { + if (exceptionObject == null && method.exceptionProbability(bci) == 0) { + return null; + } + } + RiExceptionHandler firstHandler = null; // join with all potential exception handlers if (exceptionHandlers != null) { diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -29,6 +29,7 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.compiler.ir.*; +import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction; import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; @@ -321,20 +322,18 @@ Unwind unwindNode = null; StartNode startNode = graph.start(); for (Node node : graph.getNodes()) { - if (node != null) { - if (node instanceof StartNode) { - assert startNode == node; - } else if (node instanceof Local) { - replacements.put(node, parameters[((Local) node).index()]); - } else { - nodes.add(node); - if (node instanceof Return) { - returnNode = (Return) node; - } else if (node instanceof Unwind) { - unwindNode = (Unwind) node; - } else if (node instanceof FrameState) { - frameStates.add(node); - } + if (node instanceof StartNode) { + assert startNode == node; + } else if (node instanceof Local) { + replacements.put(node, parameters[((Local) node).index()]); + } else { + nodes.add(node); + if (node instanceof Return) { + returnNode = (Return) node; + } else if (node instanceof Unwind) { + unwindNode = (Unwind) node; + } else if (node instanceof FrameState) { + frameStates.add(node); } } } @@ -410,6 +409,11 @@ obj.setNext(null); unwindDuplicate.replace(n); } + } else { + if (unwindNode != null) { + Unwind unwindDuplicate = (Unwind) duplicates.get(unwindNode); + unwindDuplicate.replace(new Deoptimize(DeoptAction.InvalidateRecompile, compilation.graph)); + } } // adjust all frame states that were copied diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -35,11 +35,8 @@ @Override protected void run(Graph graph) { - List nodes = new ArrayList(graph.getNodes()); - for (Node n : nodes) { - if (n instanceof LoopBegin) { - doLoop((LoopBegin) n); - } + for (LoopBegin n : graph.getNodes(LoopBegin.class)) { + doLoop(n); } } @@ -76,7 +73,7 @@ IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph); IntegerAdd addStride = new IntegerAdd(kind, sub, c1.stride(), graph); IntegerAdd add = new IntegerAdd(kind, c1, addStride, graph); - Phi phi = new Phi(kind, loopBegin, graph); // TODO (gd) assumes order on loopBegin preds + Phi phi = new Phi(kind, loopBegin, graph); // (gd) assumes order on loopBegin preds - works in collab with graph builder phi.addInput(c2.init()); phi.addInput(add); c2.replace(phi); diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Tue Jun 21 17:14:24 2011 +0200 @@ -112,22 +112,20 @@ // Identify blocks. for (Node n : graph.getNodes()) { - if (n != null) { - if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) { - Block block = null; - Node currentNode = n; - while (nodeToBlock.get(currentNode) == null) { - if (block != null && (currentNode instanceof ControlSplit || trueSuccessorCount(currentNode) > 1)) { - // We are at a split node => start a new block. - block = null; - } - block = assignBlockNew(currentNode, block); - if (currentNode.predecessors().size() == 0) { - // Either dead code or at a merge node => stop iteration. - break; - } - currentNode = currentNode.singlePredecessor(); + if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) { + Block block = null; + Node currentNode = n; + while (nodeToBlock.get(currentNode) == null) { + if (block != null && (currentNode instanceof ControlSplit || trueSuccessorCount(currentNode) > 1)) { + // We are at a split node => start a new block. + block = null; } + block = assignBlockNew(currentNode, block); + if (currentNode.predecessors().size() == 0) { + // Either dead code or at a merge node => stop iteration. + break; + } + currentNode = currentNode.singlePredecessor(); } } } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.graphviz/src/com/oracle/max/graal/graphviz/GraphvizPrinter.java --- a/graal/com.oracle.max.graal.graphviz/src/com/oracle/max/graal/graphviz/GraphvizPrinter.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.graphviz/src/com/oracle/max/graal/graphviz/GraphvizPrinter.java Tue Jun 21 17:14:24 2011 +0200 @@ -92,9 +92,7 @@ public void print(Graph graph, boolean shortNames) { // graph.getNodes() returns all the graph's nodes, not just "roots" for (Node n : graph.getNodes()) { - if (n != null) { - printNode(n, shortNames); - } + printNode(n, shortNames); } } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java Tue Jun 21 17:14:24 2011 +0200 @@ -43,7 +43,6 @@ private final int accessFlags; private final int maxLocals; private final int maxStackSize; - private final int invocationCount; private RiExceptionHandler[] exceptionHandlers; private RiSignature signature; private Boolean hasBalancedMonitors; @@ -54,7 +53,6 @@ accessFlags = -1; maxLocals = -1; maxStackSize = -1; - invocationCount = -1; } @Override @@ -173,7 +171,7 @@ public boolean hasCompiledCode() { // TODO: needs a VMEntries to go cache the result of that method. - // This isn't used by GRAAL for now, so this is enough. + // This isn't used by GRAAL for now, so this is enough.throwoutCount return false; } @@ -193,7 +191,11 @@ } public int invocationCount() { - return invocationCount; + return compiler.getVMEntries().RiMethod_invocationCount(this); + } + + public int exceptionProbability(int bci) { + return compiler.getVMEntries().RiMethod_exceptionProbability(this, bci); } public RiTypeProfile typeProfile(int bci) { @@ -209,6 +211,9 @@ TTY.println("canBeStaticallyBound: " + canBeStaticallyBound()); TTY.println("invocationCount: " + invocationCount()); for (int i = 0; i < codeSize(); i++) { + if (exceptionProbability(i) != -1) { + TTY.println("exceptionProbability@%d: %d", i, exceptionProbability(i)); + } if (branchProbability(i) != -1) { TTY.println("branchProbability@%d: %d", i, branchProbability(i)); } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java Tue Jun 21 17:14:24 2011 +0200 @@ -166,6 +166,10 @@ return -1; } + public int exceptionProbability(int bci) { + return -1; + } + public RiTypeProfile typeProfile(int bci) { return null; } diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java Tue Jun 21 17:14:24 2011 +0200 @@ -45,6 +45,8 @@ int RiMethod_invocationCount(HotSpotMethodResolved method); + int RiMethod_exceptionProbability(HotSpotMethodResolved method, int bci); + RiTypeProfile RiMethod_typeProfile(HotSpotMethodResolved method, int bci); int RiMethod_branchProbability(HotSpotMethodResolved method, int bci); diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java Tue Jun 21 16:58:34 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java Tue Jun 21 17:14:24 2011 +0200 @@ -54,6 +54,9 @@ public native int RiMethod_invocationCount(HotSpotMethodResolved method); @Override + public native int RiMethod_exceptionProbability(HotSpotMethodResolved method, int bci); + + @Override public native RiTypeProfile RiMethod_typeProfile(HotSpotMethodResolved method, int bci); @Override diff -r 00239c259a42 -r 848dd57066ad graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java diff -r 00239c259a42 -r 848dd57066ad src/cpu/x86/vm/c1_globals_x86.hpp --- a/src/cpu/x86/vm/c1_globals_x86.hpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/cpu/x86/vm/c1_globals_x86.hpp Tue Jun 21 17:14:24 2011 +0200 @@ -37,7 +37,7 @@ define_pd_global(bool, ResizeTLAB, true ); define_pd_global(bool, InlineIntrinsics, true ); define_pd_global(bool, PreferInterpreterNativeStubs, false); -define_pd_global(bool, ProfileTraps, false); +define_pd_global(bool, ProfileTraps, true ); define_pd_global(bool, UseOnStackReplacement, true ); define_pd_global(bool, TieredCompilation, false); define_pd_global(intx, CompileThreshold, 5000 ); // changed for GRAAL diff -r 00239c259a42 -r 848dd57066ad src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/share/vm/graal/graalCompiler.cpp Tue Jun 21 17:14:24 2011 +0200 @@ -222,7 +222,6 @@ HotSpotMethodResolved::set_accessFlags(obj, method->access_flags().as_int()); HotSpotMethodResolved::set_maxLocals(obj, method->max_locals()); HotSpotMethodResolved::set_maxStackSize(obj, method->max_stack()); - HotSpotMethodResolved::set_invocationCount(obj, method->invocation_count()); method->set_graal_mirror(obj()); return obj(); diff -r 00239c259a42 -r 848dd57066ad src/share/vm/graal/graalJavaAccess.hpp --- a/src/share/vm/graal/graalJavaAccess.hpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Tue Jun 21 17:14:24 2011 +0200 @@ -68,7 +68,6 @@ int_field(HotSpotMethodResolved, accessFlags) \ int_field(HotSpotMethodResolved, maxLocals) \ int_field(HotSpotMethodResolved, maxStackSize) \ - int_field(HotSpotMethodResolved, invocationCount) \ end_class \ start_class(HotSpotType) \ oop_field(HotSpotType, name, "Ljava/lang/String;") \ diff -r 00239c259a42 -r 848dd57066ad src/share/vm/graal/graalVMEntries.cpp --- a/src/share/vm/graal/graalVMEntries.cpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/share/vm/graal/graalVMEntries.cpp Tue Jun 21 17:14:24 2011 +0200 @@ -183,8 +183,35 @@ return method->invocation_count(); } +// public native int RiMethod_throwoutCount(long vmId); +JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2exceptionProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) { + TRACE_graal_3("VMEntries::RiMethod_exceptionProbability"); + ciMethod* cimethod; + { + VM_ENTRY_MARK; + methodOop method = getMethodFromHotSpotMethod(hotspot_method); + cimethod = (ciMethod*)CURRENT_ENV->get_object(method); + } + + ciMethodData* method_data = cimethod->method_data_or_null(); + if (method_data == NULL) { + return -1; + } else { + ciProfileData* profile = method_data->bci_to_data(bci); + if (profile == NULL) { + return 0; + } + uint trap = method_data->trap_recompiled_at(profile); + if (trap > 0) { + return 100; + } else { + return trap; + } + } +} + // public native RiTypeProfile RiMethod_typeProfile(long vmId, int bci); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile(JNIEnv *, jobject, jobject hotspot_method, jint bci) { +JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2typeProfile(JNIEnv *, jobject, jobject hotspot_method, jint bci) { TRACE_graal_3("VMEntries::RiMethod_typeProfile"); ciMethod* cimethod; { @@ -225,7 +252,7 @@ } // public native RiTypeProfile RiMethod_branchProfile(long vmId, int bci); -JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) { +JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2branchProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) { TRACE_graal_3("VMEntries::RiMethod_typeProfile"); ciMethodData* method_data; ciMethod* cimethod; @@ -803,9 +830,10 @@ {CC"RiMethod_exceptionHandlers", CC"("RESOLVED_METHOD")"EXCEPTION_HANDLERS, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1exceptionHandlers)}, {CC"RiMethod_hasBalancedMonitors", CC"("RESOLVED_METHOD")Z", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1hasBalancedMonitors)}, {CC"RiMethod_uniqueConcreteMethod", CC"("RESOLVED_METHOD")"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1uniqueConcreteMethod)}, - {CC"RiMethod_typeProfile", CC"("RESOLVED_METHOD"I)"TYPE_PROFILE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile)}, - {CC"RiMethod_branchProbability", CC"("RESOLVED_METHOD"I)I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability)}, + {CC"RiMethod_typeProfile", CC"("RESOLVED_METHOD"I)"TYPE_PROFILE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2typeProfile)}, + {CC"RiMethod_branchProbability", CC"("RESOLVED_METHOD"I)I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2branchProbability)}, {CC"RiMethod_invocationCount", CC"("RESOLVED_METHOD")I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount)}, + {CC"RiMethod_exceptionProbability", CC"("RESOLVED_METHOD"I)I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2exceptionProbability)}, {CC"RiSignature_lookupType", CC"("STRING RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType)}, {CC"RiConstantPool_lookupConstant", CC"("PROXY"I)"OBJECT, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupConstant)}, {CC"RiConstantPool_lookupMethod", CC"("PROXY"IB)"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupMethod)}, diff -r 00239c259a42 -r 848dd57066ad src/share/vm/interpreter/interpreterRuntime.cpp --- a/src/share/vm/interpreter/interpreterRuntime.cpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/share/vm/interpreter/interpreterRuntime.cpp Tue Jun 21 17:14:24 2011 +0200 @@ -458,6 +458,17 @@ } } while (should_repeat == true); + if (h_method->method_data() != NULL) { + ProfileData* pdata = h_method->method_data()->allocate_bci_to_data(current_bci); + if (pdata != NULL) { + int tstate0 = pdata->trap_state(); + int tstate1 = Deoptimization::trap_state_set_recompiled(tstate0, true); + if (tstate1 != tstate0) { + pdata->set_trap_state(tstate1); + } + } + } + // notify JVMTI of an exception throw; JVMTI will detect if this is a first // time throw or a stack unwinding throw and accordingly notify the debugger if (JvmtiExport::can_post_on_exceptions()) { diff -r 00239c259a42 -r 848dd57066ad src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp Tue Jun 21 16:58:34 2011 +0200 +++ b/src/share/vm/runtime/sharedRuntime.cpp Tue Jun 21 17:14:24 2011 +0200 @@ -636,8 +636,15 @@ #ifdef COMPILER1 if (t == NULL && nm->is_compiled_by_c1()) { - assert(nm->unwind_handler_begin() != NULL, ""); - return nm->unwind_handler_begin(); + if (UseGraal) { + nm->make_not_entrant(); + JavaThread::current()->set_exception_pc(ret_pc); + JavaThread::current()->set_exception_oop(exception()); + return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls(); + } else { + assert(nm->unwind_handler_begin() != NULL, ""); + return nm->unwind_handler_begin(); + } } #endif