< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SymbolicSnippetEncoder.java

Print this page
rev 56282 : [mq]: graal


 328                     return null;
 329                 }
 330             }
 331 
 332             SymbolicEncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
 333                             originalMethods.get(methodKey(method)), method.getDeclaringClass());
 334             return decodeSnippetGraph(encodedGraph, method, replacements, args, allowAssumptions, options);
 335         }
 336 
 337     }
 338 
 339     private static class SubstitutionGraphDecoder extends PEGraphDecoder {
 340         private final ResolvedJavaMethod method;
 341         private final EncodedGraph encodedGraph;
 342         private IntrinsicContext intrinsic;
 343 
 344         SubstitutionGraphDecoder(Providers providers, StructuredGraph result, ReplacementsImpl replacements, ParameterPlugin parameterPlugin, ResolvedJavaMethod method,
 345                         IntrinsicContext.CompilationContext context, EncodedGraph encodedGraph) {
 346             super(providers.getCodeCache().getTarget().arch, result, providers, null,
 347                             replacements.getGraphBuilderPlugins().getInvocationPlugins(), new InlineInvokePlugin[0], parameterPlugin,
 348                             null, null, null);
 349             this.method = method;
 350             this.encodedGraph = encodedGraph;
 351             intrinsic = new IntrinsicContext(method, null, replacements.getDefaultReplacementBytecodeProvider(), context, false);
 352         }
 353 
 354         @Override
 355         protected EncodedGraph lookupEncodedGraph(ResolvedJavaMethod lookupMethod,
 356                         MethodSubstitutionPlugin plugin,
 357                         BytecodeProvider intrinsicBytecodeProvider,
 358                         boolean isSubstitution,
 359                         boolean trackNodeSourcePosition) {
 360             if (lookupMethod.equals(method)) {
 361                 return encodedGraph;
 362             } else {
 363                 throw GraalError.shouldNotReachHere(method.format("%H.%n(%p)"));
 364             }
 365         }
 366 
 367         @Override
 368         protected IntrinsicContext getIntrinsic() {


 773         HashSet<JavaConstant> safeConstants = new HashSet<>();
 774 
 775         @Override
 776         public Boolean constantEquals(Constant x, Constant y) {
 777             return constantReflection.constantEquals(x, y);
 778         }
 779 
 780         @Override
 781         public Integer readArrayLength(JavaConstant array) {
 782             return constantReflection.readArrayLength(array);
 783         }
 784 
 785         @Override
 786         public JavaConstant readArrayElement(JavaConstant array, int index) {
 787             return constantReflection.readArrayElement(array, index);
 788         }
 789 
 790         @Override
 791         public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
 792             JavaConstant javaConstant = constantReflection.readFieldValue(field, receiver);
 793             if (!safeConstants.contains(receiver) && !field.getDeclaringClass().getName().contains("graalvm") && !field.getDeclaringClass().getName().contains("jdk/vm/ci/") &&




 794                             !field.getName().equals("TYPE")) {
 795                 // Only permit constant reflection on compiler classes. This is necessary primarily
 796                 // because of the boxing snippets which are compiled as snippets but are really just
 797                 // regular JDK java sources that are being compiled like a snippet. These shouldn't
 798                 // permit constant folding during graph preparation as that embeds constants from
 799                 // the runtime into a compiler graph.
 800                 return null;
 801             }
 802             if (javaConstant.getJavaKind() == JavaKind.Object) {
 803                 safeConstants.add(javaConstant);
 804             }
 805             return javaConstant;
 806         }
 807 
 808         @Override
 809         public JavaConstant boxPrimitive(JavaConstant source) {
 810             return constantReflection.boxPrimitive(source);
 811         }
 812 
 813         @Override


1028         HotSpotSnippetGraphBuilderPhase(Providers theProviders, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, IntrinsicContext initialIntrinsicContext) {
1029             super(theProviders, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
1030         }
1031 
1032         @Override
1033         protected BytecodeParser createBytecodeParser(StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI, IntrinsicContext intrinsicContext) {
1034             return new HotSpotSnippetBytecodeParser(this, graph, parent, method, entryBCI, intrinsicContext);
1035         }
1036     }
1037 
1038     static class HotSpotSnippetBytecodeParser extends BytecodeParser {
1039         HotSpotSnippetBytecodeParser(GraphBuilderPhase.Instance graphBuilderInstance, StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI,
1040                         IntrinsicContext intrinsicContext) {
1041             super(graphBuilderInstance, graph, parent, method, entryBCI, intrinsicContext);
1042         }
1043 
1044         @Override
1045         public boolean canDeferPlugin(GeneratedInvocationPlugin plugin) {
1046             // Fold is always deferred but NodeIntrinsics may have to wait if all their arguments
1047             // aren't constant yet.
1048             return plugin.getSource().equals(Fold.class) || plugin.getSource().equals(Node.NodeIntrinsic.class);
1049         }
1050 
1051         @Override
1052         protected boolean canInlinePartialIntrinsicExit() {
1053             return false;
1054         }
1055 
1056         @Override
1057         protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, ValueNode[] args, ResolvedJavaMethod targetMethod, JavaKind resultType) {
1058             if (intrinsicContext != null && intrinsicContext.isCallToOriginal(targetMethod)) {
1059                 return false;
1060             }
1061             if (targetMethod.getAnnotation(Fold.class) != null) {
1062                 // Always defer Fold until decode time but NodeIntrinsics may fold if they are able.
1063                 return false;
1064             }
1065             return super.tryInvocationPlugin(invokeKind, args, targetMethod, resultType);
1066         }
1067     }
1068 }


 328                     return null;
 329                 }
 330             }
 331 
 332             SymbolicEncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
 333                             originalMethods.get(methodKey(method)), method.getDeclaringClass());
 334             return decodeSnippetGraph(encodedGraph, method, replacements, args, allowAssumptions, options);
 335         }
 336 
 337     }
 338 
 339     private static class SubstitutionGraphDecoder extends PEGraphDecoder {
 340         private final ResolvedJavaMethod method;
 341         private final EncodedGraph encodedGraph;
 342         private IntrinsicContext intrinsic;
 343 
 344         SubstitutionGraphDecoder(Providers providers, StructuredGraph result, ReplacementsImpl replacements, ParameterPlugin parameterPlugin, ResolvedJavaMethod method,
 345                         IntrinsicContext.CompilationContext context, EncodedGraph encodedGraph) {
 346             super(providers.getCodeCache().getTarget().arch, result, providers, null,
 347                             replacements.getGraphBuilderPlugins().getInvocationPlugins(), new InlineInvokePlugin[0], parameterPlugin,
 348                             null, null, null, null);
 349             this.method = method;
 350             this.encodedGraph = encodedGraph;
 351             intrinsic = new IntrinsicContext(method, null, replacements.getDefaultReplacementBytecodeProvider(), context, false);
 352         }
 353 
 354         @Override
 355         protected EncodedGraph lookupEncodedGraph(ResolvedJavaMethod lookupMethod,
 356                         MethodSubstitutionPlugin plugin,
 357                         BytecodeProvider intrinsicBytecodeProvider,
 358                         boolean isSubstitution,
 359                         boolean trackNodeSourcePosition) {
 360             if (lookupMethod.equals(method)) {
 361                 return encodedGraph;
 362             } else {
 363                 throw GraalError.shouldNotReachHere(method.format("%H.%n(%p)"));
 364             }
 365         }
 366 
 367         @Override
 368         protected IntrinsicContext getIntrinsic() {


 773         HashSet<JavaConstant> safeConstants = new HashSet<>();
 774 
 775         @Override
 776         public Boolean constantEquals(Constant x, Constant y) {
 777             return constantReflection.constantEquals(x, y);
 778         }
 779 
 780         @Override
 781         public Integer readArrayLength(JavaConstant array) {
 782             return constantReflection.readArrayLength(array);
 783         }
 784 
 785         @Override
 786         public JavaConstant readArrayElement(JavaConstant array, int index) {
 787             return constantReflection.readArrayElement(array, index);
 788         }
 789 
 790         @Override
 791         public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
 792             JavaConstant javaConstant = constantReflection.readFieldValue(field, receiver);
 793             if (!safeConstants.contains(receiver) &&
 794                             !field.getDeclaringClass().getName().contains("graalvm") &&
 795                             !field.getDeclaringClass().getName().contains("jdk/vm/ci/") &&
 796                             !field.getDeclaringClass().getName().contains("jdk/internal/vm/compiler") &&
 797 
 798                             !field.getName().equals("TYPE")) {
 799                 // Only permit constant reflection on compiler classes. This is necessary primarily
 800                 // because of the boxing snippets which are compiled as snippets but are really just
 801                 // regular JDK java sources that are being compiled like a snippet. These shouldn't
 802                 // permit constant folding during graph preparation as that embeds constants from
 803                 // the runtime into a compiler graph.
 804                 return null;
 805             }
 806             if (javaConstant.getJavaKind() == JavaKind.Object) {
 807                 safeConstants.add(javaConstant);
 808             }
 809             return javaConstant;
 810         }
 811 
 812         @Override
 813         public JavaConstant boxPrimitive(JavaConstant source) {
 814             return constantReflection.boxPrimitive(source);
 815         }
 816 
 817         @Override


1032         HotSpotSnippetGraphBuilderPhase(Providers theProviders, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, IntrinsicContext initialIntrinsicContext) {
1033             super(theProviders, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
1034         }
1035 
1036         @Override
1037         protected BytecodeParser createBytecodeParser(StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI, IntrinsicContext intrinsicContext) {
1038             return new HotSpotSnippetBytecodeParser(this, graph, parent, method, entryBCI, intrinsicContext);
1039         }
1040     }
1041 
1042     static class HotSpotSnippetBytecodeParser extends BytecodeParser {
1043         HotSpotSnippetBytecodeParser(GraphBuilderPhase.Instance graphBuilderInstance, StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI,
1044                         IntrinsicContext intrinsicContext) {
1045             super(graphBuilderInstance, graph, parent, method, entryBCI, intrinsicContext);
1046         }
1047 
1048         @Override
1049         public boolean canDeferPlugin(GeneratedInvocationPlugin plugin) {
1050             // Fold is always deferred but NodeIntrinsics may have to wait if all their arguments
1051             // aren't constant yet.
1052             return plugin.isGeneratedFromFoldOrNodeIntrinsic();
1053         }
1054 
1055         @Override
1056         protected boolean canInlinePartialIntrinsicExit() {
1057             return false;
1058         }
1059 
1060         @Override
1061         protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, ValueNode[] args, ResolvedJavaMethod targetMethod, JavaKind resultType) {
1062             if (intrinsicContext != null && intrinsicContext.isCallToOriginal(targetMethod)) {
1063                 return false;
1064             }
1065             if (targetMethod.getAnnotation(Fold.class) != null) {
1066                 // Always defer Fold until decode time but NodeIntrinsics may fold if they are able.
1067                 return false;
1068             }
1069             return super.tryInvocationPlugin(invokeKind, args, targetMethod, resultType);
1070         }
1071     }
1072 }
< prev index next >