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 }
|