# HG changeset patch # User Lukas Stadler # Date 1327681704 -3600 # Node ID 15ec30809d0f3cfcd5b3ca985f114db96c9deb24 # Parent 04ebcabcba4f1c46db4f96fb9695785f424a73e4 enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge diff -r 04ebcabcba4f -r 15ec30809d0f 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 Fri Jan 27 17:07:03 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Fri Jan 27 17:28:24 2012 +0100 @@ -129,7 +129,7 @@ public static boolean GenLIR = true; public static boolean GenCode = true; public static boolean UseBranchPrediction = true; - public static boolean UseExceptionProbability = ____; + public static boolean UseExceptionProbability = true; public static boolean AllowExplicitExceptionChecks = true; public static boolean OmitHotExceptionStacktrace = ____; public static int MatureInvocationCount = 100; diff -r 04ebcabcba4f -r 15ec30809d0f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java Fri Jan 27 17:07:03 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java Fri Jan 27 17:28:24 2012 +0100 @@ -409,7 +409,18 @@ } else { if (unwindNode != null) { UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode); - unwindDuplicate.replaceAndDelete(graph.add(new DeoptimizeNode(DeoptAction.InvalidateRecompile))); + DeoptimizeNode deoptimizeNode = new DeoptimizeNode(DeoptAction.InvalidateRecompile); + unwindDuplicate.replaceAndDelete(graph.add(deoptimizeNode)); + // move the deopt upwards if there is a monitor exit that tries to use the "after exception" frame state + // (because there is no "after exception" frame state!) + if (deoptimizeNode.predecessor() instanceof MonitorExitNode) { + MonitorExitNode monitorExit = (MonitorExitNode) deoptimizeNode.predecessor(); + if (monitorExit.stateAfter() != null && monitorExit.stateAfter().bci == FrameState.AFTER_EXCEPTION_BCI) { + FrameState monitorFrameState = monitorExit.stateAfter(); + graph.removeFixed(monitorExit); + monitorFrameState.safeDelete(); + } + } } } @@ -432,8 +443,12 @@ } else if (frameState.bci == FrameState.AFTER_BCI) { frameState.replaceAndDelete(stateAfter); } else if (frameState.bci == FrameState.AFTER_EXCEPTION_BCI) { - assert stateAtExceptionEdge != null; - frameState.replaceAndDelete(stateAtExceptionEdge); + if (frameState.isAlive()) { + assert stateAtExceptionEdge != null; + frameState.replaceAndDelete(stateAtExceptionEdge); + } else { + assert stateAtExceptionEdge == null; + } } } } @@ -456,7 +471,15 @@ returnDuplicate.clearInputs(); Node n = invoke.next(); invoke.setNext(null); - returnDuplicate.replaceAndDelete(n); + if (n instanceof BeginNode) { + BeginNode begin = (BeginNode) n; + FixedNode next = begin.next(); + begin.setNext(null); + returnDuplicate.replaceAndDelete(next); + begin.safeDelete(); + } else { + returnDuplicate.replaceAndDelete(n); + } } invoke.node().clearInputs(); diff -r 04ebcabcba4f -r 15ec30809d0f graal/com.oracle.max.graal.tests/src/com/oracle/max/graal/compiler/tests/InvokeExceptionTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.tests/src/com/oracle/max/graal/compiler/tests/InvokeExceptionTest.java Fri Jan 27 17:28:24 2012 +0100 @@ -0,0 +1,69 @@ +/* + * 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.max.graal.compiler.tests; + +import java.util.*; + +import org.junit.*; + +import com.oracle.max.graal.compiler.phases.*; +import com.oracle.max.graal.nodes.*; + +public class InvokeExceptionTest extends GraphTest { + + public static synchronized void throwException(int i) { + if (i == 1) { + throw new RuntimeException(); + } + } + + @Test + public void test1() { + // fill the profiling data... + for (int i = 0; i < 10000; i++) { + try { + throwException(i & 1); + test1Snippet(0); + } catch (Throwable t) { + // nothing to do... + } + } + test("test1Snippet"); + } + + @SuppressWarnings("all") + public static void test1Snippet(int a) { + throwException(a); + } + + private void test(String snippet) { + StructuredGraph graph = parseProfiled(snippet); + Collection hints = new ArrayList<>(); + for (Invoke invoke : graph.getInvokes()) { + hints.add(invoke); + } + new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan()).apply(graph); + new CanonicalizerPhase(null, runtime(), null).apply(graph); + new DeadCodeEliminationPhase().apply(graph); + } +}