# HG changeset patch # User Doug Simon # Date 1377809636 -7200 # Node ID a03452edfc4d00d1cc190da1619b26a507253ac2 # Parent 78d96d41196554af337215f88b4d5ccc2619da98 made enabling/disabling of intrinsifications extensible (GRAAL-111) diff -r 78d96d411965 -r a03452edfc4d 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 Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Aug 29 22:53:56 2013 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.compiler; +import static com.oracle.graal.compiler.MethodFilter.*; import static com.oracle.graal.phases.GraalOptions.*; import java.util.*; @@ -56,6 +57,39 @@ private static final DebugTimer FrontEnd = Debug.timer("FrontEnd"); private static final DebugTimer BackEnd = Debug.timer("BackEnd"); + private static final MethodFilter[] positiveIntrinsificationFilter; + private static final MethodFilter[] negativeIntrinsificationFilter; + static { + if (GraalDebugConfig.IntrinsificationsDisabled.getValue() != null) { + negativeIntrinsificationFilter = parse(GraalDebugConfig.IntrinsificationsDisabled.getValue()); + } else { + negativeIntrinsificationFilter = null; + } + + if (GraalDebugConfig.IntrinsificationsEnabled.getValue() != null) { + positiveIntrinsificationFilter = parse(GraalDebugConfig.IntrinsificationsEnabled.getValue()); + } else if (negativeIntrinsificationFilter != null) { + positiveIntrinsificationFilter = new MethodFilter[0]; + } else { + positiveIntrinsificationFilter = null; + } + } + + /** + * Determines if a given method should be intrinsified based on the values of + * {@link GraalDebugConfig#IntrinsificationsEnabled} and + * {@link GraalDebugConfig#IntrinsificationsDisabled}. + */ + public static boolean shouldIntrinsify(JavaMethod method) { + if (positiveIntrinsificationFilter == null) { + return true; + } + if (positiveIntrinsificationFilter.length == 0 || matches(positiveIntrinsificationFilter, method)) { + return negativeIntrinsificationFilter == null || !matches(negativeIntrinsificationFilter, method); + } + return false; + } + /** * Requests compilation of a given graph. * diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalDebugConfig.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalDebugConfig.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalDebugConfig.java Thu Aug 29 22:53:56 2013 +0200 @@ -66,6 +66,19 @@ return enabled; } }; + /** + * @see MethodFilter + */ + @Option(help = "Pattern for method(s) to which intrinsification (if available) will be applied. " + + "By default, all available intrinsifications are applied except for methods matched " + + "by IntrinsificationsDisabled. See MethodFilter class for pattern syntax.") + public static final OptionValue IntrinsificationsEnabled = new OptionValue<>(null); + /** + * @see MethodFilter + */ + @Option(help = "Pattern for method(s) to which intrinsification will not be applied. " + + "See MethodFilter class for pattern syntax.") + public static final OptionValue IntrinsificationsDisabled = new OptionValue<>("Object.clone"); // @formatter:on private final DebugFilter logFilter; @@ -85,11 +98,7 @@ if (methodFilter == null || methodFilter.isEmpty()) { this.methodFilter = null; } else { - String[] filters = methodFilter.split(","); - this.methodFilter = new MethodFilter[filters.length]; - for (int i = 0; i < filters.length; i++) { - this.methodFilter[i] = new MethodFilter(filters[i]); - } + this.methodFilter = com.oracle.graal.compiler.MethodFilter.parse(methodFilter); } // Report the filters that have been configured so the user can verify it's what they expect @@ -156,10 +165,8 @@ } else if (methodFilter != null) { JavaMethod method = asJavaMethod(o); if (method != null) { - for (MethodFilter filter : methodFilter) { - if (filter.matches(method)) { - return true; - } + if (com.oracle.graal.compiler.MethodFilter.matches(methodFilter, method)) { + return true; } } } diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/MethodFilter.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/MethodFilter.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/MethodFilter.java Thu Aug 29 22:53:56 2013 +0200 @@ -88,6 +88,31 @@ private final Pattern methodName; private final Pattern[] signature; + /** + * Parses a string containing list of comma separated filter patterns into an array of + * {@link MethodFilter}s. + */ + public static MethodFilter[] parse(String commaSeparatedPatterns) { + String[] filters = commaSeparatedPatterns.split(","); + MethodFilter[] methodFilters = new MethodFilter[filters.length]; + for (int i = 0; i < filters.length; i++) { + methodFilters[i] = new MethodFilter(filters[i]); + } + return methodFilters; + } + + /** + * Determines if a given method is matched by a given array of filters. + */ + public static boolean matches(MethodFilter[] filters, JavaMethod method) { + for (MethodFilter filter : filters) { + if (filter.matches(method)) { + return true; + } + } + return false; + } + public MethodFilter(String sourcePattern) { String pattern = sourcePattern.trim(); diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Aug 29 22:53:56 2013 +0200 @@ -313,31 +313,15 @@ linkForeignCall(r, G1WBPOSTCALL, c.writeBarrierPostAddress, PREPEND_THREAD, LEAF, REEXECUTABLE, NO_LOCATIONS); linkForeignCall(r, VALIDATE_OBJECT, c.validateObject, PREPEND_THREAD, LEAF, REEXECUTABLE, NO_LOCATIONS); - if (IntrinsifyObjectMethods.getValue()) { - r.registerSubstitutions(ObjectSubstitutions.class); - } - if (IntrinsifySystemMethods.getValue()) { - r.registerSubstitutions(SystemSubstitutions.class); - } - if (IntrinsifyThreadMethods.getValue()) { - r.registerSubstitutions(ThreadSubstitutions.class); - } - if (IntrinsifyUnsafeMethods.getValue()) { - r.registerSubstitutions(UnsafeSubstitutions.class); - } - if (IntrinsifyClassMethods.getValue()) { - r.registerSubstitutions(ClassSubstitutions.class); - } - if (IntrinsifyAESMethods.getValue()) { - r.registerSubstitutions(AESCryptSubstitutions.class); - r.registerSubstitutions(CipherBlockChainingSubstitutions.class); - } - if (IntrinsifyCRC32Methods.getValue()) { - r.registerSubstitutions(CRC32Substitutions.class); - } - if (IntrinsifyReflectionMethods.getValue()) { - r.registerSubstitutions(ReflectionSubstitutions.class); - } + r.registerSubstitutions(ObjectSubstitutions.class); + r.registerSubstitutions(SystemSubstitutions.class); + r.registerSubstitutions(ThreadSubstitutions.class); + r.registerSubstitutions(UnsafeSubstitutions.class); + r.registerSubstitutions(ClassSubstitutions.class); + r.registerSubstitutions(AESCryptSubstitutions.class); + r.registerSubstitutions(CipherBlockChainingSubstitutions.class); + r.registerSubstitutions(CRC32Substitutions.class); + r.registerSubstitutions(ReflectionSubstitutions.class); checkcastDynamicSnippets = new CheckCastDynamicSnippets.Templates(this, r, graalRuntime.getTarget()); instanceofSnippets = new InstanceOfSnippets.Templates(this, r, graalRuntime.getTarget()); diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Thu Aug 29 22:53:56 2013 +0200 @@ -22,7 +22,7 @@ */ package com.oracle.graal.hotspot.replacements; -import static com.oracle.graal.phases.GraalOptions.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; @@ -93,7 +93,7 @@ @Override protected StructuredGraph getSnippetGraph(LoweringTool tool) { - if (!IntrinsifyArrayCopy.getValue()) { + if (!shouldIntrinsify(getTargetMethod())) { return null; } diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CallSiteSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CallSiteSubstitutions.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CallSiteSubstitutions.java Thu Aug 29 22:53:56 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.replacements; -import static com.oracle.graal.phases.GraalOptions.*; - import java.lang.invoke.*; import com.oracle.graal.api.code.*; @@ -37,11 +35,9 @@ @Override public void registerReplacements(MetaAccessProvider runtime, Replacements replacements, TargetDescription target) { - if (IntrinsifyCallSiteTarget.getValue()) { - replacements.registerSubstitutions(ConstantCallSiteSubstitutions.class); - replacements.registerSubstitutions(MutableCallSiteSubstitutions.class); - replacements.registerSubstitutions(VolatileCallSiteSubstitutions.class); - } + replacements.registerSubstitutions(ConstantCallSiteSubstitutions.class); + replacements.registerSubstitutions(MutableCallSiteSubstitutions.class); + replacements.registerSubstitutions(VolatileCallSiteSubstitutions.class); } @ClassSubstitution(ConstantCallSite.class) diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneNode.java Thu Aug 29 22:53:56 2013 +0200 @@ -22,7 +22,7 @@ */ package com.oracle.graal.hotspot.replacements; -import static com.oracle.graal.phases.GraalOptions.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import java.lang.reflect.*; @@ -52,7 +52,7 @@ @Override protected StructuredGraph getSnippetGraph(LoweringTool tool) { - if (!IntrinsifyObjectClone.getValue()) { + if (!shouldIntrinsify(getTargetMethod())) { return null; } diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionGetCallerClassNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionGetCallerClassNode.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionGetCallerClassNode.java Thu Aug 29 22:53:56 2013 +0200 @@ -22,7 +22,7 @@ */ package com.oracle.graal.hotspot.replacements; -import static com.oracle.graal.phases.GraalOptions.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; @@ -65,7 +65,7 @@ * @return ConstantNode of the caller class, or null */ private ConstantNode getCallerClassNode(MetaAccessProvider runtime) { - if (!IntrinsifyReflectionMethods.getValue()) { + if (!shouldIntrinsify(getTargetMethod())) { return null; } diff -r 78d96d411965 -r a03452edfc4d 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 Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Aug 29 22:53:56 2013 +0200 @@ -290,33 +290,6 @@ @Option(help = "") public static final OptionValue OptPushThroughPi = new OptionValue<>(true); - // Intrinsification settings - @Option(help = "") - public static final OptionValue IntrinsifyObjectClone = new OptionValue<>(false); - @Option(help = "") - public static final OptionValue IntrinsifyArrayCopy = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyObjectMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifySystemMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyClassMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyThreadMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyUnsafeMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyMathMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyAESMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyCRC32Methods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyReflectionMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyInstalledCodeMethods = new OptionValue<>(true); - @Option(help = "") - public static final OptionValue IntrinsifyCallSiteTarget = new OptionValue<>(true); /** * Counts the various paths taken through snippets. diff -r 78d96d411965 -r a03452edfc4d graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Aug 29 21:32:54 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Aug 29 22:53:56 2013 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.replacements; import static com.oracle.graal.api.meta.MetaUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.phases.GraalOptions.*; import java.lang.reflect.*; @@ -138,7 +139,7 @@ Member originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { ResolvedJavaMethod original = registerMethodSubstitution(originalMethod, substituteMethod); - if (original != null && methodSubstitution.forced()) { + if (original != null && methodSubstitution.forced() && shouldIntrinsify(original)) { forcedSubstitutions.add(original); } } @@ -149,7 +150,7 @@ Member originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { ResolvedJavaMethod original = registerMacroSubstitution(originalMethod, macroSubstitution.macro()); - if (original != null && macroSubstitution.forced()) { + if (original != null && macroSubstitution.forced() && shouldIntrinsify(original)) { forcedSubstitutions.add(original); } }