# HG changeset patch # User Doug Simon # Date 1365078547 -7200 # Node ID c50bfedfb70492c63398538e0c0acc7e30d2353d # Parent a5ad23f6f9ca6acdbfd9a47eb8bdfc6d6d0c40ea# Parent 33c8ff9c5cc12766768a38644d7d0114ef3d1b68 Merge. diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java Thu Apr 04 14:29:07 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.compiler.test; -import static org.junit.Assert.*; - import java.io.*; import java.lang.reflect.*; @@ -35,38 +33,39 @@ public class ProfilingInfoTest extends GraalCompilerTest { private static final int N = 100; + private static final double DELTA = 1d / Integer.MAX_VALUE; @Test public void testBranchTakenProbability() { ProfilingInfo info = profile("branchProbabilitySnippet", 0); - assertEquals(0.0, info.getBranchTakenProbability(1)); - assertEquals(N, info.getExecutionCount(1)); - assertEquals(-1.0, info.getBranchTakenProbability(8)); - assertEquals(0, info.getExecutionCount(8)); + Assert.assertEquals(0.0, info.getBranchTakenProbability(1), DELTA); + Assert.assertEquals(N, info.getExecutionCount(1)); + Assert.assertEquals(-1.0, info.getBranchTakenProbability(8), DELTA); + Assert.assertEquals(0, info.getExecutionCount(8)); info = profile("branchProbabilitySnippet", 1); - assertEquals(1.0, info.getBranchTakenProbability(1)); - assertEquals(N, info.getExecutionCount(1)); - assertEquals(0.0, info.getBranchTakenProbability(8)); - assertEquals(N, info.getExecutionCount(8)); + Assert.assertEquals(1.0, info.getBranchTakenProbability(1), DELTA); + Assert.assertEquals(N, info.getExecutionCount(1)); + Assert.assertEquals(0.0, info.getBranchTakenProbability(8), DELTA); + Assert.assertEquals(N, info.getExecutionCount(8)); info = profile("branchProbabilitySnippet", 2); - assertEquals(1.0, info.getBranchTakenProbability(1)); - assertEquals(N, info.getExecutionCount(1)); - assertEquals(1.0, info.getBranchTakenProbability(8)); - assertEquals(N, info.getExecutionCount(8)); + Assert.assertEquals(1.0, info.getBranchTakenProbability(1), DELTA); + Assert.assertEquals(N, info.getExecutionCount(1)); + Assert.assertEquals(1.0, info.getBranchTakenProbability(8), DELTA); + Assert.assertEquals(N, info.getExecutionCount(8)); continueProfiling(3 * N, "branchProbabilitySnippet", 0); - assertEquals(0.25, info.getBranchTakenProbability(1)); - assertEquals(4 * N, info.getExecutionCount(1)); - assertEquals(1.0, info.getBranchTakenProbability(8)); - assertEquals(N, info.getExecutionCount(8)); + Assert.assertEquals(0.25, info.getBranchTakenProbability(1), DELTA); + Assert.assertEquals(4 * N, info.getExecutionCount(1)); + Assert.assertEquals(1.0, info.getBranchTakenProbability(8), DELTA); + Assert.assertEquals(N, info.getExecutionCount(8)); resetProfile("branchProbabilitySnippet"); - assertEquals(-1.0, info.getBranchTakenProbability(1)); - assertEquals(0, info.getExecutionCount(1)); - assertEquals(-1.0, info.getBranchTakenProbability(8)); - assertEquals(0, info.getExecutionCount(8)); + Assert.assertEquals(-1.0, info.getBranchTakenProbability(1), DELTA); + Assert.assertEquals(0, info.getExecutionCount(1)); + Assert.assertEquals(-1.0, info.getBranchTakenProbability(8), DELTA); + Assert.assertEquals(0, info.getExecutionCount(8)); } public static int branchProbabilitySnippet(int value) { @@ -82,16 +81,16 @@ @Test public void testSwitchProbabilities() { ProfilingInfo info = profile("switchProbabilitySnippet", 0); - assertEquals(new double[]{1.0, 0.0, 0.0}, info.getSwitchProbabilities(1)); + Assert.assertArrayEquals(new double[]{1.0, 0.0, 0.0}, info.getSwitchProbabilities(1), DELTA); info = profile("switchProbabilitySnippet", 1); - assertEquals(new double[]{0.0, 1.0, 0.0}, info.getSwitchProbabilities(1)); + Assert.assertArrayEquals(new double[]{0.0, 1.0, 0.0}, info.getSwitchProbabilities(1), DELTA); info = profile("switchProbabilitySnippet", 2); - assertEquals(new double[]{0.0, 0.0, 1.0}, info.getSwitchProbabilities(1)); + Assert.assertArrayEquals(new double[]{0.0, 0.0, 1.0}, info.getSwitchProbabilities(1), DELTA); resetProfile("switchProbabilitySnippet"); - assertNull(info.getSwitchProbabilities(1)); + Assert.assertNull(info.getSwitchProbabilities(1)); } public static int switchProbabilitySnippet(int value) { @@ -147,66 +146,66 @@ ProfilingInfo info = profile(methodName, "ABC"); JavaTypeProfile typeProfile = info.getTypeProfile(bci); - assertEquals(0.0, typeProfile.getNotRecordedProbability()); - assertEquals(1, typeProfile.getTypes().length); - assertEquals(stringType, typeProfile.getTypes()[0].getType()); - assertEquals(1.0, typeProfile.getTypes()[0].getProbability()); + Assert.assertEquals(0.0, typeProfile.getNotRecordedProbability(), DELTA); + Assert.assertEquals(1, typeProfile.getTypes().length); + Assert.assertEquals(stringType, typeProfile.getTypes()[0].getType()); + Assert.assertEquals(1.0, typeProfile.getTypes()[0].getProbability(), DELTA); continueProfiling(methodName, new StringBuilder()); typeProfile = info.getTypeProfile(bci); - assertEquals(0.0, typeProfile.getNotRecordedProbability()); - assertEquals(2, typeProfile.getTypes().length); - assertEquals(stringType, typeProfile.getTypes()[0].getType()); - assertEquals(stringBuilderType, typeProfile.getTypes()[1].getType()); - assertEquals(0.5, typeProfile.getTypes()[0].getProbability()); - assertEquals(0.5, typeProfile.getTypes()[1].getProbability()); + Assert.assertEquals(0.0, typeProfile.getNotRecordedProbability(), DELTA); + Assert.assertEquals(2, typeProfile.getTypes().length); + Assert.assertEquals(stringType, typeProfile.getTypes()[0].getType()); + Assert.assertEquals(stringBuilderType, typeProfile.getTypes()[1].getType()); + Assert.assertEquals(0.5, typeProfile.getTypes()[0].getProbability(), DELTA); + Assert.assertEquals(0.5, typeProfile.getTypes()[1].getProbability(), DELTA); resetProfile(methodName); typeProfile = info.getTypeProfile(bci); - assertNull(typeProfile); + Assert.assertNull(typeProfile); } @Test public void testExceptionSeen() { // NullPointerException ProfilingInfo info = profile("nullPointerExceptionSnippet", 5); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); info = profile("nullPointerExceptionSnippet", (Object) null); - assertEquals(TriState.TRUE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.TRUE, info.getExceptionSeen(1)); resetProfile("nullPointerExceptionSnippet"); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); // ArrayOutOfBoundsException info = profile("arrayIndexOutOfBoundsExceptionSnippet", new int[1]); - assertEquals(TriState.FALSE, info.getExceptionSeen(2)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(2)); info = profile("arrayIndexOutOfBoundsExceptionSnippet", new int[0]); - assertEquals(TriState.TRUE, info.getExceptionSeen(2)); + Assert.assertEquals(TriState.TRUE, info.getExceptionSeen(2)); resetProfile("arrayIndexOutOfBoundsExceptionSnippet"); - assertEquals(TriState.FALSE, info.getExceptionSeen(2)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(2)); // CheckCastException info = profile("checkCastExceptionSnippet", "ABC"); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); info = profile("checkCastExceptionSnippet", 5); - assertEquals(TriState.TRUE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.TRUE, info.getExceptionSeen(1)); resetProfile("checkCastExceptionSnippet"); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); // Invoke with exception info = profile("invokeWithExceptionSnippet", false); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); info = profile("invokeWithExceptionSnippet", true); - assertEquals(TriState.TRUE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.TRUE, info.getExceptionSeen(1)); resetProfile("invokeWithExceptionSnippet"); - assertEquals(TriState.FALSE, info.getExceptionSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getExceptionSeen(1)); } public static int nullPointerExceptionSnippet(Object obj) { @@ -252,19 +251,19 @@ @Test public void testNullSeen() { ProfilingInfo info = profile("instanceOfSnippet", 1); - assertEquals(TriState.FALSE, info.getNullSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); continueProfiling("instanceOfSnippet", "ABC"); - assertEquals(TriState.FALSE, info.getNullSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); continueProfiling("instanceOfSnippet", (Object) null); - assertEquals(TriState.TRUE, info.getNullSeen(1)); + Assert.assertEquals(TriState.TRUE, info.getNullSeen(1)); continueProfiling("instanceOfSnippet", 0.0); - assertEquals(TriState.TRUE, info.getNullSeen(1)); + Assert.assertEquals(TriState.TRUE, info.getNullSeen(1)); resetProfile("instanceOfSnippet"); - assertEquals(TriState.FALSE, info.getNullSeen(1)); + Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); } private ProfilingInfo profile(String methodName, Object... args) { @@ -292,7 +291,7 @@ try { method.invoke(null, args); } catch (Throwable e) { - fail("method should not throw an exception: " + e.toString()); + Assert.fail("method should not throw an exception: " + e.toString()); } } diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java Thu Apr 04 14:29:07 2013 +0200 @@ -202,7 +202,7 @@ Assumptions assumptions = new Assumptions(false); new InliningPhase(runtime(), null, assumptions, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL).apply(graph); new DeadCodeEliminationPhase().apply(graph); - new PartialEscapeAnalysisPhase(runtime(), assumptions, iterativeEscapeAnalysis).apply(graph); + new PartialEscapeAnalysisPhase(runtime(), assumptions, iterativeEscapeAnalysis, false).apply(graph); Assert.assertEquals(1, graph.getNodes(ReturnNode.class).count()); ReturnNode returnNode = graph.getNodes(ReturnNode.class).first(); if (expectedConstantResult != null) { diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/IterativeInliningTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/IterativeInliningTest.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/IterativeInliningTest.java Thu Apr 04 14:29:07 2013 +0200 @@ -101,7 +101,7 @@ private void processMethod(final String snippet) { graph = parse(snippet); new ComputeProbabilityPhase().apply(graph); - GraalOptions.PEAReadCache = true; - new IterativeInliningPhase(runtime(), new Assumptions(false), null, getDefaultPhasePlan(), OptimisticOptimizations.ALL).apply(graph); + GraalOptions.OptEarlyReadElimination = true; + new IterativeInliningPhase(runtime(), new Assumptions(false), null, getDefaultPhasePlan(), OptimisticOptimizations.ALL, false).apply(graph); } } diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java Thu Apr 04 14:29:07 2013 +0200 @@ -204,7 +204,6 @@ new ComputeProbabilityPhase().apply(graph); Assumptions assumptions = new Assumptions(false); new InliningPhase(runtime(), null, assumptions, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL).apply(graph); - GraalOptions.PEAReadCache = true; - new PartialEscapeAnalysisPhase(runtime(), assumptions, false).apply(graph); + new PartialEscapeAnalysisPhase(runtime(), assumptions, false, true).apply(graph); } } diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java Thu Apr 04 14:29:07 2013 +0200 @@ -153,7 +153,7 @@ new InliningPhase(runtime(), null, assumptions, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL).apply(graph); new DeadCodeEliminationPhase().apply(graph); new CanonicalizerPhase(runtime(), assumptions).apply(graph); - new PartialEscapeAnalysisPhase(runtime(), assumptions, false).apply(graph); + new PartialEscapeAnalysisPhase(runtime(), assumptions, false, false).apply(graph); new CullFrameStatesPhase().apply(graph); new DeadCodeEliminationPhase().apply(graph); diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Apr 04 14:29:07 2013 +0200 @@ -122,7 +122,7 @@ if (GraalOptions.Inline && !plan.isPhaseDisabled(InliningPhase.class)) { if (GraalOptions.IterativeInlining) { - new IterativeInliningPhase(runtime, assumptions, cache, plan, optimisticOpts).apply(graph); + new IterativeInliningPhase(runtime, assumptions, cache, plan, optimisticOpts, GraalOptions.OptEarlyReadElimination).apply(graph); } else { new InliningPhase(runtime, null, assumptions, cache, plan, optimisticOpts).apply(graph); new DeadCodeEliminationPhase().apply(graph); @@ -153,7 +153,7 @@ } if (GraalOptions.PartialEscapeAnalysis && !plan.isPhaseDisabled(PartialEscapeAnalysisPhase.class)) { - new PartialEscapeAnalysisPhase(runtime, assumptions, true).apply(graph); + new PartialEscapeAnalysisPhase(runtime, assumptions, true, GraalOptions.OptEarlyReadElimination).apply(graph); } if (GraalOptions.OptConvertDeoptsToGuards) { diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Apr 04 14:29:07 2013 +0200 @@ -68,7 +68,6 @@ public static int EscapeAnalysisIterations = 2; public static String EscapeAnalyzeOnly = null; public static int MaximumEscapeAnalysisArrayLength = 32; - public static boolean PEAReadCache = ____; public static boolean PEAInliningHints = ____; public static double TailDuplicationProbability = 0.5; @@ -191,6 +190,7 @@ public static boolean OptAssumptions = true; public static boolean OptConvertDeoptsToGuards = true; public static boolean OptReadElimination = true; + public static boolean OptEarlyReadElimination = true; public static boolean OptCanonicalizer = true; public static boolean OptScheduleOutOfLoops = true; public static boolean OptEliminateGuards = true; diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Thu Apr 04 14:29:07 2013 +0200 @@ -40,13 +40,15 @@ private final Assumptions assumptions; private final GraphCache cache; private final OptimisticOptimizations optimisticOpts; + private final boolean readElimination; - public IterativeInliningPhase(GraalCodeCacheProvider runtime, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { + public IterativeInliningPhase(GraalCodeCacheProvider runtime, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts, boolean readElimination) { this.runtime = runtime; this.assumptions = assumptions; this.cache = cache; this.plan = plan; this.optimisticOpts = optimisticOpts; + this.readElimination = readElimination; } public static final void trace(String format, Object... obj) { @@ -69,7 +71,7 @@ @Override public Boolean call() { boolean progress = false; - PartialEscapeAnalysisPhase ea = new PartialEscapeAnalysisPhase(runtime, assumptions, false); + PartialEscapeAnalysisPhase ea = new PartialEscapeAnalysisPhase(runtime, assumptions, false, readElimination); ea.apply(graph); progress |= ea.hasChanged(); diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Thu Apr 04 14:29:07 2013 +0200 @@ -47,13 +47,15 @@ private final Assumptions assumptions; private CustomCanonicalizer customCanonicalizer; private final boolean iterative; + private final boolean readElimination; private boolean changed; - public PartialEscapeAnalysisPhase(MetaAccessProvider runtime, Assumptions assumptions, boolean iterative) { + public PartialEscapeAnalysisPhase(MetaAccessProvider runtime, Assumptions assumptions, boolean iterative, boolean readElimination) { this.runtime = runtime; this.assumptions = assumptions; this.iterative = iterative; + this.readElimination = readElimination; } public boolean hasChanged() { @@ -76,7 +78,7 @@ return; } - if (!GraalOptions.PEAReadCache) { + if (!readElimination) { boolean analyzableNodes = false; for (Node node : graph.getNodes()) { if (node instanceof VirtualizableAllocation) { @@ -127,9 +129,11 @@ }); } - for (Node node : graph.getNodes()) { - if (node instanceof LoadFieldNode) { - DynamicCounterNode.addCounterBefore("load non-elim", 1, false, (FixedNode) node); + if (DynamicCounterNode.enabled && readElimination) { + for (Node node : graph.getNodes()) { + if (node instanceof LoadFieldNode) { + DynamicCounterNode.addCounterBefore("load non-elim", 1, false, (FixedNode) node); + } } } } diff -r a5ad23f6f9ca -r c50bfedfb704 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu Apr 04 14:28:34 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Thu Apr 04 14:29:07 2013 +0200 @@ -110,7 +110,7 @@ trace("%s ", node); deleted = false; } - if (GraalOptions.PEAReadCache) { + if (GraalOptions.OptEarlyReadElimination) { if (!deleted) { if (node instanceof StoreFieldNode) { METRIC_STOREFIELD_RECORDED.increment(); diff -r a5ad23f6f9ca -r c50bfedfb704 mx/commands.py --- a/mx/commands.py Thu Apr 04 14:28:34 2013 +0200 +++ b/mx/commands.py Thu Apr 04 14:29:07 2013 +0200 @@ -534,6 +534,8 @@ buildSuffix = '' elif vm == 'client': buildSuffix = '1' + elif vm == 'server0': + return else: assert vm == 'graal', vm buildSuffix = 'graal'