# HG changeset patch # User Gilles Duboscq # Date 1425313419 -3600 # Node ID 19d3db31bcea6a2447d3190eb7aceb12fc45edb4 # Parent 19a4fbe393d0fa041c9443b0f65735bce1396d71 Only use deoptimizing instanceof snippet if the profile covers 100% of the cases diff -r 19a4fbe393d0 -r 19d3db31bcea graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Mar 09 17:41:20 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Mar 02 17:23:39 2015 +0100 @@ -739,7 +739,6 @@ @HotSpotVMFlag(name = "VerifyOops") @Stable public boolean verifyOops; @HotSpotVMFlag(name = "CITime") @Stable public boolean ciTime; @HotSpotVMFlag(name = "CITimeEach") @Stable public boolean ciTimeEach; - @HotSpotVMFlag(name = "CompileThreshold") @Stable public long compileThreshold; @HotSpotVMFlag(name = "CompileTheWorldStartAt", optional = true) @Stable public int compileTheWorldStartAt; @HotSpotVMFlag(name = "CompileTheWorldStopAt", optional = true) @Stable public int compileTheWorldStopAt; @HotSpotVMFlag(name = "DontCompileHugeMethods") @Stable public boolean dontCompileHugeMethods; diff -r 19a4fbe393d0 -r 19d3db31bcea graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Mon Mar 09 17:41:20 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Mon Mar 02 17:23:39 2015 +0100 @@ -83,7 +83,7 @@ assert target == providers.getCodeCache().getTarget(); checkcastDynamicSnippets = new CheckCastDynamicSnippets.Templates(providers, target); - instanceofSnippets = new InstanceOfSnippets.Templates(providers, target, config.compileThreshold); + instanceofSnippets = new InstanceOfSnippets.Templates(providers, target); newObjectSnippets = new NewObjectSnippets.Templates(providers, target); monitorSnippets = new MonitorSnippets.Templates(providers, target, config.useFastLocking); writeBarrierSnippets = new WriteBarrierSnippets.Templates(providers, target, config.useCompressedOops ? config.getOopEncoding() : null); diff -r 19a4fbe393d0 -r 19d3db31bcea graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Mon Mar 09 17:41:20 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Mon Mar 02 17:23:39 2015 +0100 @@ -60,33 +60,9 @@ */ public class InstanceOfSnippets implements Snippets { - private static final double COMPILED_VS_INTERPRETER_SPEEDUP = 50; - private static final double INSTANCEOF_DEOPT_SPEEDUP = 1.01; // generous 1% speedup - - private static final int DEOPT_THRESHOLD_FACTOR = (int) (COMPILED_VS_INTERPRETER_SPEEDUP / (INSTANCEOF_DEOPT_SPEEDUP - 1.0)); - /** - * Gets the minimum required probability of a profiled instanceof hitting one the profiled types - * for use of the {@linkplain #instanceofWithProfile deoptimizing} snippet. The value is - * computed to be an order of greater than the configured compilation threshold by a - * {@linkplain #DEOPT_THRESHOLD_FACTOR factor}. - * - *

- * This factor is such that the additional executions we get from using the deoptimizing snippet - * (({@linkplain #INSTANCEOF_DEOPT_SPEEDUP speedup} - 1) / probability threshold) is greater - * than the time lost during re-interpretation ({@linkplain #COMPILED_VS_INTERPRETER_SPEEDUP - * compiled code speedup} × compilation threshold). - *

- */ - public static double hintHitProbabilityThresholdForDeoptimizingSnippet(long compilationThreshold) { - return 1.0D - (1.0D / (compilationThreshold * DEOPT_THRESHOLD_FACTOR)); - } - - /** - * A test against a set of hints derived from a profile with very close to 100% precise coverage - * of seen types. This snippet deoptimizes on hint miss paths. - * - * @see #hintHitProbabilityThresholdForDeoptimizingSnippet(long) + * A test against a set of hints derived from a profile with 100% precise coverage of seen + * types. This snippet deoptimizes on hint miss paths. */ @Snippet public static Object instanceofWithProfile(Object object, @VarargsParameter KlassPointer[] hints, @VarargsParameter boolean[] hintIsPositive, Object trueValue, Object falseValue, @@ -243,11 +219,9 @@ private final SnippetInfo instanceofSecondary = snippet(InstanceOfSnippets.class, "instanceofSecondary"); private final SnippetInfo instanceofDynamic = snippet(InstanceOfSnippets.class, "instanceofDynamic"); private final SnippetInfo isAssignableFrom = snippet(InstanceOfSnippets.class, "isAssignableFrom"); - private final long compilationThreshold; - public Templates(HotSpotProviders providers, TargetDescription target, long compilationThreshold) { + public Templates(HotSpotProviders providers, TargetDescription target) { super(providers, providers.getSnippetReflection(), target); - this.compilationThreshold = compilationThreshold; } @Override @@ -263,7 +237,7 @@ Arguments args; StructuredGraph graph = instanceOf.graph(); - if (hintInfo.hintHitProbability >= hintHitProbabilityThresholdForDeoptimizingSnippet(compilationThreshold) && hintInfo.exact == null) { + if (hintInfo.hintHitProbability >= 1.0 && hintInfo.exact == null) { Hints hints = createHints(hintInfo, providers.getMetaAccess(), false, graph); args = new Arguments(instanceofWithProfile, graph.getGuardsStage(), tool.getLoweringStage()); args.add("object", object); @@ -288,7 +262,7 @@ } args.add("trueValue", replacer.trueValue); args.add("falseValue", replacer.falseValue); - if (hintInfo.hintHitProbability >= hintHitProbabilityThresholdForDeoptimizingSnippet(compilationThreshold) && hintInfo.exact == null) { + if (hintInfo.hintHitProbability >= 1.0 && hintInfo.exact == null) { args.addConst("nullSeen", hintInfo.profile.getNullSeen() != TriState.FALSE); } return args;