# HG changeset patch # User Christian Haeubl # Date 1354260622 -3600 # Node ID e0fcf7802786bb158852f167a0e810fd82f31c60 # Parent 9bd688f91d3ff568e9bac0af75b8da1583e3bf84# Parent 4983da9d3fc7f60ffda46310128d8ae3b5f10bef Merge. diff -r 4983da9d3fc7 -r e0fcf7802786 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java Thu Nov 29 17:43:48 2012 -0800 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java Fri Nov 30 08:30:22 2012 +0100 @@ -64,6 +64,7 @@ public ConcreteSubtype(ResolvedJavaType context, ResolvedJavaType subtype) { this.context = context; this.subtype = subtype; + assert !subtype.isInterface(); } @Override diff -r 4983da9d3fc7 -r e0fcf7802786 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Thu Nov 29 17:43:48 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Fri Nov 30 08:30:22 2012 +0100 @@ -380,11 +380,16 @@ return compileMethod(method, entryBCI, blocking, priority); } + /** + * Compiles a method to machine code. + * @return true if the method is in the queue (either added to the queue or already in the queue) + */ public boolean compileMethod(final HotSpotResolvedJavaMethod method, final int entryBCI, boolean blocking, int priority) throws Throwable { + CompilationTask current = method.currentTask(); boolean osrCompilation = entryBCI != StructuredGraph.INVOCATION_ENTRY_BCI; if (osrCompilation && bootstrapRunning) { // no OSR compilations during bootstrap - the compiler is just too slow at this point, and we know that there are no endless loops - return true; + return current != null; } if (CompilationTask.withinEnqueue.get()) { @@ -392,12 +397,11 @@ // java.util.concurrent.BlockingQueue is used to implement the compilation worker // queues. If a compiler thread triggers a compilation, then it may be blocked trying // to add something to its own queue. - return false; + return current != null; } CompilationTask.withinEnqueue.set(Boolean.TRUE); try { - CompilationTask current = method.currentTask(); if (!blocking && current != null) { if (current.isInProgress()) { if (current.getEntryBCI() == entryBCI) { @@ -422,6 +426,7 @@ CompilationTask task = CompilationTask.create(graalRuntime, createPhasePlan(optimisticOpts, osrCompilation), optimisticOpts, method, entryBCI, id, queuePriority); if (blocking) { task.runCompilation(); + return false; } else { try { method.setCurrentTask(task); @@ -430,12 +435,12 @@ } else { compileQueue.execute(task); } + return true; } catch (RejectedExecutionException e) { // The compile queue was already shut down. return false; } } - return true; } finally { CompilationTask.withinEnqueue.set(Boolean.FALSE); } diff -r 4983da9d3fc7 -r e0fcf7802786 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 Nov 29 17:43:48 2012 -0800 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Fri Nov 30 08:30:22 2012 +0100 @@ -82,7 +82,6 @@ // profiling information public static int DeoptsToDisableOptimisticOptimization = 40; - public static boolean PrintDisabledOptimisticOptimizations = true; public static int MatureExecutionsBranch = 1; public static int MatureExecutionsPerSwitchCase = 1; public static int MatureExecutionsTypeProfile = 1; diff -r 4983da9d3fc7 -r e0fcf7802786 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java Thu Nov 29 17:43:48 2012 -0800 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java Fri Nov 30 08:30:22 2012 +0100 @@ -46,40 +46,26 @@ public OptimisticOptimizations(ResolvedJavaMethod method) { this.enabledOpts = EnumSet.noneOf(Optimization.class); - ProfilingInfo profilingInfo = method.getProfilingInfo(); - if (checkDeoptimizations(profilingInfo, DeoptimizationReason.UnreachedCode)) { - enabledOpts.add(Optimization.RemoveNeverExecutedCode); - } - if (checkDeoptimizations(profilingInfo, DeoptimizationReason.TypeCheckedInliningViolated)) { - enabledOpts.add(Optimization.UseTypeCheckedInlining); + addOptimization(method, DeoptimizationReason.UnreachedCode, Optimization.RemoveNeverExecutedCode); + addOptimization(method, DeoptimizationReason.TypeCheckedInliningViolated, Optimization.UseTypeCheckedInlining); + addOptimization(method, DeoptimizationReason.OptimizedTypeCheckViolated, Optimization.UseTypeCheckHints); + addOptimization(method, DeoptimizationReason.NotCompiledExceptionHandler, Optimization.UseExceptionProbability); + } + + private void addOptimization(ResolvedJavaMethod method, DeoptimizationReason deoptReason, Optimization optimization) { + if (checkDeoptimizations(method.getProfilingInfo(), deoptReason)) { + enabledOpts.add(optimization); + } else { + // TODO (chaeubl): change to Debug.log when we are sure that optimistic optimizations are not disabled unnecessarily + TTY.println("WARN: deactivated optimistic optimization %s for %s", optimization.name(), MetaUtil.format("%H.%n(%p)", method)); + disabledOptimisticOptsMetric.increment(); } - if (checkDeoptimizations(profilingInfo, DeoptimizationReason.OptimizedTypeCheckViolated)) { - enabledOpts.add(Optimization.UseTypeCheckHints); - } - if (checkDeoptimizations(profilingInfo, DeoptimizationReason.NotCompiledExceptionHandler)) { - enabledOpts.add(Optimization.UseExceptionProbability); - } - - log(method); } private OptimisticOptimizations(Set enabledOpts) { this.enabledOpts = enabledOpts; } - private void log(ResolvedJavaMethod method) { - if (Debug.isLogEnabled()) { - for (Optimization opt: Optimization.values()) { - if (!enabledOpts.contains(opt)) { - if (GraalOptions.PrintDisabledOptimisticOptimizations) { - Debug.log("WARN: deactivated optimistic optimization %s for %s", opt.name(), MetaUtil.format("%H.%n(%p)", method)); - } - disabledOptimisticOptsMetric.increment(); - } - } - } - } - public boolean removeNeverExecutedCode() { return GraalOptions.RemoveNeverExecutedCode && enabledOpts.contains(Optimization.RemoveNeverExecutedCode); }