src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SymbolicSnippetEncoder.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58299 6df94ce3ab2f
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     1
/*
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     4
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     8
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    13
 * accompanied this code).
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    14
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    18
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    21
 * questions.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    22
 */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    23
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    24
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    25
package org.graalvm.compiler.hotspot;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    26
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    27
import static jdk.vm.ci.runtime.JVMCI.getRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    28
import static jdk.vm.ci.services.Services.IS_BUILDING_NATIVE_IMAGE;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    29
import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    30
import static org.graalvm.compiler.core.common.GraalOptions.UseEncodedGraphs;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    31
import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    32
import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    33
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    34
import java.util.ArrayList;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    35
import java.util.Arrays;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    36
import java.util.Collections;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    37
import java.util.HashMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    38
import java.util.HashSet;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    39
import java.util.List;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    40
import java.util.Map;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    41
import java.util.Objects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    42
import java.util.Set;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    43
import java.util.concurrent.ConcurrentHashMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    44
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    45
import org.graalvm.compiler.api.replacements.Fold;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    46
import org.graalvm.compiler.api.replacements.MethodSubstitution;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    47
import org.graalvm.compiler.api.replacements.Snippet;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    48
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    49
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    50
import org.graalvm.compiler.api.runtime.GraalRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    51
import org.graalvm.compiler.bytecode.BytecodeProvider;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    52
import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    53
import org.graalvm.compiler.core.common.type.AbstractObjectStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    54
import org.graalvm.compiler.core.common.type.Stamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    55
import org.graalvm.compiler.core.common.type.StampPair;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    56
import org.graalvm.compiler.core.common.type.SymbolicJVMCIReference;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    57
import org.graalvm.compiler.debug.DebugContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    58
import org.graalvm.compiler.debug.GraalError;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    59
import org.graalvm.compiler.graph.Node;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    60
import org.graalvm.compiler.graph.NodeClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    61
import org.graalvm.compiler.graph.NodeMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    62
import org.graalvm.compiler.graph.NodeSourcePosition;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    63
import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    64
import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    65
import org.graalvm.compiler.java.BytecodeParser;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    66
import org.graalvm.compiler.java.GraphBuilderPhase;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    67
import org.graalvm.compiler.nodeinfo.Verbosity;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    68
import org.graalvm.compiler.nodes.CallTargetNode;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
    69
import org.graalvm.compiler.nodes.Cancellable;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    70
import org.graalvm.compiler.nodes.ConstantNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    71
import org.graalvm.compiler.nodes.EncodedGraph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    72
import org.graalvm.compiler.nodes.FrameState;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    73
import org.graalvm.compiler.nodes.FullInfopointNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    74
import org.graalvm.compiler.nodes.GraphEncoder;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    75
import org.graalvm.compiler.nodes.ParameterNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    76
import org.graalvm.compiler.nodes.ProxyNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    77
import org.graalvm.compiler.nodes.StructuredGraph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    78
import org.graalvm.compiler.nodes.ValueNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    79
import org.graalvm.compiler.nodes.cfg.Block;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    80
import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    81
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    82
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    83
import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    84
import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    85
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    86
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    87
import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    88
import org.graalvm.compiler.nodes.graphbuilderconf.NodePlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    89
import org.graalvm.compiler.nodes.graphbuilderconf.ParameterPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    90
import org.graalvm.compiler.nodes.java.AccessFieldNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    91
import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    92
import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    93
import org.graalvm.compiler.options.OptionValues;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    94
import org.graalvm.compiler.phases.OptimisticOptimizations;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    95
import org.graalvm.compiler.phases.schedule.SchedulePhase;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    96
import org.graalvm.compiler.phases.util.Providers;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    97
import org.graalvm.compiler.replacements.ConstantBindingParameterPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    98
import org.graalvm.compiler.replacements.PEGraphDecoder;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    99
import org.graalvm.compiler.replacements.ReplacementsImpl;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   100
import org.graalvm.compiler.replacements.SnippetCounter;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   101
import org.graalvm.compiler.replacements.SnippetIntegerHistogram;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   102
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   103
import jdk.vm.ci.code.TargetDescription;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   104
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   105
import jdk.vm.ci.hotspot.HotSpotResolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   106
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   107
import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   108
import jdk.vm.ci.hotspot.HotSpotSignature;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   109
import jdk.vm.ci.meta.Constant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   110
import jdk.vm.ci.meta.ConstantReflectionProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   111
import jdk.vm.ci.meta.JavaConstant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   112
import jdk.vm.ci.meta.JavaKind;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   113
import jdk.vm.ci.meta.MemoryAccessProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   114
import jdk.vm.ci.meta.MethodHandleAccessProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   115
import jdk.vm.ci.meta.ResolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   116
import jdk.vm.ci.meta.ResolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   117
import jdk.vm.ci.meta.ResolvedJavaType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   118
import jdk.vm.ci.meta.UnresolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   119
import jdk.vm.ci.meta.UnresolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   120
import jdk.vm.ci.meta.UnresolvedJavaType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   121
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   122
/**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   123
 * This class performs graph encoding using {@link GraphEncoder} but also converts JVMCI type and
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   124
 * method references into a symbolic form that can be resolved at graph decode time using
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   125
 * {@link SymbolicJVMCIReference}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   126
 */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   127
public class SymbolicSnippetEncoder {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   128
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   129
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   130
     * This is a customized HotSpotReplacementsImpl intended only for parsing snippets and method
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   131
     * substitutions for graph encoding.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   132
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   133
    private final HotSpotSnippetReplacementsImpl snippetReplacements;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   134
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   135
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   136
     * The set of all snippet methods that have been encoded.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   137
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   138
    private final Set<ResolvedJavaMethod> snippetMethods = Collections.synchronizedSet(new HashSet<>());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   139
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   140
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   141
     * A mapping from the method substitution method to the original method name. The string key and
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   142
     * values are produced using {@link #methodKey(ResolvedJavaMethod)}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   143
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   144
    private final Map<String, String> originalMethods = new ConcurrentHashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   145
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   146
    private final HotSpotReplacementsImpl originalReplacements;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   147
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   148
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   149
     * The current count of graphs encoded. Used to detect when new graphs have been enqueued for
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   150
     * encoding.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   151
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   152
    private int encodedGraphs = 0;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   153
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   154
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   155
     * All the graphs parsed so far.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   156
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   157
    private Map<String, StructuredGraph> preparedSnippetGraphs = new HashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   158
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   159
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   160
     * The invocation plugins which were delayed during graph preparation.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   161
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   162
    private Set<ResolvedJavaMethod> delayedInvocationPluginMethods = new HashSet<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   163
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   164
    void addDelayedInvocationPluginMethod(ResolvedJavaMethod method) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   165
        delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   166
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   167
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   168
    Set<ResolvedJavaMethod> getSnippetMethods() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   169
        return snippetMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   170
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   171
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   172
    protected class SnippetInlineInvokePlugin implements InlineInvokePlugin {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   173
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   174
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   175
        public InlineInfo shouldInlineInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   176
            if (method.getAnnotation(Fold.class) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   177
                delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   178
                return InlineInfo.DO_NOT_INLINE_NO_EXCEPTION;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   179
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   180
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   181
            if (snippetReplacements.getIntrinsifyingPlugin(method) != null) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   182
                delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   183
                return InlineInfo.DO_NOT_INLINE_NO_EXCEPTION;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   184
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   185
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   186
            // Force inlining when parsing replacements
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   187
            return createIntrinsicInlineInfo(method, snippetReplacements.getDefaultReplacementBytecodeProvider());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   188
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   189
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   190
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   191
        public void notifyAfterInline(ResolvedJavaMethod methodToInline) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   192
            assert methodToInline.getAnnotation(Fold.class) == null : methodToInline;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   193
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   194
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   195
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   196
    public static class SnippetInvocationPlugins extends InvocationPlugins {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   197
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   198
        SnippetInvocationPlugins(InvocationPlugins invocationPlugins) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   199
            super(invocationPlugins);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   200
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   201
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   202
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   203
        public InvocationPlugin lookupInvocation(ResolvedJavaMethod method) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   204
            if (method.getAnnotation(Fold.class) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   205
                return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   206
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   207
            return super.lookupInvocation(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   208
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   209
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   210
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   211
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   212
     * This plugin disables the snippet counter machinery.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   213
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   214
    private class SnippetCounterPlugin implements NodePlugin {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   215
        String snippetCounterName = 'L' + SnippetCounter.class.getName().replace('.', '/') + ';';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   216
        String snippetIntegerHistogramName = 'L' + SnippetIntegerHistogram.class.getName().replace('.', '/') + ';';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   217
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   218
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   219
        public boolean handleLoadField(GraphBuilderContext b, ValueNode object, ResolvedJavaField field) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   220
            if (field.getName().equals("group") && field.getDeclaringClass().getName().equals(snippetCounterName)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   221
                b.addPush(JavaKind.Object, ConstantNode.forConstant(JavaConstant.NULL_POINTER, b.getMetaAccess()));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   222
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   223
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   224
            if (field.getType().getName().equals(snippetCounterName)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   225
                b.addPush(JavaKind.Object, ConstantNode.forConstant(snippetReplacements.snippetReflection.forObject(SnippetCounter.DISABLED_COUNTER), b.getMetaAccess()));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   226
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   227
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   228
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   229
            if (field.getType().getName().equals(snippetIntegerHistogramName)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   230
                b.addPush(JavaKind.Object, ConstantNode.forConstant(snippetReplacements.snippetReflection.forObject(SnippetIntegerHistogram.DISABLED_COUNTER), b.getMetaAccess()));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   231
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   232
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   233
            return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   234
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   235
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   236
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   237
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   238
     * Generate a String name for a method including all type information. Used as a symbolic key
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   239
     * for lookup.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   240
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   241
    private static String methodKey(ResolvedJavaMethod method) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   242
        return method.format("%f %H.%n(%P)");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   243
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   244
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   245
    SymbolicSnippetEncoder(HotSpotReplacementsImpl replacements) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   246
        this.originalReplacements = replacements;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   247
        GraphBuilderConfiguration.Plugins plugins = replacements.getGraphBuilderPlugins();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   248
        SnippetInvocationPlugins invocationPlugins = new SnippetInvocationPlugins(plugins.getInvocationPlugins());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   249
        GraphBuilderConfiguration.Plugins copy = new GraphBuilderConfiguration.Plugins(plugins, invocationPlugins);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   250
        copy.clearInlineInvokePlugins();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   251
        copy.appendInlineInvokePlugin(new SnippetInlineInvokePlugin());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   252
        copy.appendNodePlugin(new SnippetCounterPlugin());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   253
        HotSpotProviders providers = (HotSpotProviders) replacements.getProviders().copyWith(new HotSpotSubstrateConstantReflectionProvider(replacements.getProviders().getConstantReflection()));
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   254
        this.snippetReplacements = new HotSpotSnippetReplacementsImpl(replacements, providers.copyWith(copy));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   255
        this.snippetReplacements.setGraphBuilderPlugins(copy);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   256
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   257
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   258
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   259
     * Compiles the snippet and stores the graph.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   260
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   261
    synchronized void registerMethodSubstitution(MethodSubstitutionPlugin plugin, ResolvedJavaMethod original, IntrinsicContext.CompilationContext context, OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   262
        ResolvedJavaMethod method = plugin.getSubstitute(snippetReplacements.getProviders().getMetaAccess());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   263
        assert method.getAnnotation(MethodSubstitution.class) != null : "MethodSubstitution must be annotated with @" + MethodSubstitution.class.getSimpleName();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   264
        StructuredGraph subst = buildGraph(method, original, null, true, false, context, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   265
        snippetMethods.add(method);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   266
        originalMethods.put(methodKey(method), methodKey(original));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   267
        preparedSnippetGraphs.put(plugin.toString() + context, subst);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   268
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   269
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   270
    static class EncodedSnippets {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   271
        private byte[] snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   272
        private Object[] snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   273
        private NodeClass<?>[] snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   274
        private Map<String, Integer> snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   275
        private Map<String, String> originalMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   276
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   277
        EncodedSnippets(byte[] snippetEncoding, Object[] snippetObjects, NodeClass<?>[] snippetNodeClasses, Map<String, Integer> snippetStartOffsets, Map<String, String> originalMethods) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   278
            this.snippetEncoding = snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   279
            this.snippetObjects = snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   280
            this.snippetNodeClasses = snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   281
            this.snippetStartOffsets = snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   282
            this.originalMethods = originalMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   283
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   284
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   285
        StructuredGraph getMethodSubstitutionGraph(MethodSubstitutionPlugin plugin, ResolvedJavaMethod original, ReplacementsImpl replacements, IntrinsicContext.CompilationContext context,
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   286
                        StructuredGraph.AllowAssumptions allowAssumptions, Cancellable cancellable, OptionValues options) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   287
            Integer startOffset = snippetStartOffsets.get(plugin.toString() + context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   288
            if (startOffset == null) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   289
                throw GraalError.shouldNotReachHere("plugin graph not found: " + plugin + " with " + context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   290
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   291
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   292
            ResolvedJavaType accessingClass = replacements.getProviders().getMetaAccess().lookupJavaType(plugin.getDeclaringClass());
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   293
            return decodeGraph(original, accessingClass, startOffset, replacements, context, allowAssumptions, cancellable, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   294
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   295
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   296
        @SuppressWarnings("try")
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   297
        private StructuredGraph decodeGraph(ResolvedJavaMethod method,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   298
                        ResolvedJavaType accessingClass,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   299
                        int startOffset,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   300
                        ReplacementsImpl replacements,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   301
                        IntrinsicContext.CompilationContext context,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   302
                        StructuredGraph.AllowAssumptions allowAssumptions,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   303
                        Cancellable cancellable,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   304
                        OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   305
            Providers providers = replacements.getProviders();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   306
            EncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   307
                            methodKey(method), accessingClass, method.getDeclaringClass());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   308
            try (DebugContext debug = replacements.openDebugContext("SVMSnippet_", method, options)) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   309
                StructuredGraph result = new StructuredGraph.Builder(options, debug, allowAssumptions).cancellable(cancellable).method(method).setIsSubstitution(true).build();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   310
                PEGraphDecoder graphDecoder = new SubstitutionGraphDecoder(providers, result, replacements, null, method, context, encodedGraph);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   311
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   312
                graphDecoder.decode(method, result.isSubstitution(), encodedGraph.trackNodeSourcePosition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   313
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   314
                assert result.verify();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   315
                return result;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   316
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   317
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   318
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   319
        StructuredGraph getEncodedSnippet(ResolvedJavaMethod method, ReplacementsImpl replacements, Object[] args, StructuredGraph.AllowAssumptions allowAssumptions, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   320
            Integer startOffset = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   321
            if (snippetStartOffsets != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   322
                startOffset = snippetStartOffsets.get(methodKey(method));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   323
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   324
            if (startOffset == null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   325
                if (IS_IN_NATIVE_IMAGE) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   326
                    throw GraalError.shouldNotReachHere("snippet not found: " + method.format("%H.%n(%p)"));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   327
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   328
                    return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   329
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   330
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   331
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   332
            SymbolicEncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   333
                            originalMethods.get(methodKey(method)), method.getDeclaringClass());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   334
            return decodeSnippetGraph(encodedGraph, method, replacements, args, allowAssumptions, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   335
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   336
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   337
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   338
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   339
    private static class SubstitutionGraphDecoder extends PEGraphDecoder {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   340
        private final ResolvedJavaMethod method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   341
        private final EncodedGraph encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   342
        private IntrinsicContext intrinsic;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   343
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   344
        SubstitutionGraphDecoder(Providers providers, StructuredGraph result, ReplacementsImpl replacements, ParameterPlugin parameterPlugin, ResolvedJavaMethod method,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   345
                        IntrinsicContext.CompilationContext context, EncodedGraph encodedGraph) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   346
            super(providers.getCodeCache().getTarget().arch, result, providers, null,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   347
                            replacements.getGraphBuilderPlugins().getInvocationPlugins(), new InlineInvokePlugin[0], parameterPlugin,
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   348
                            null, null, null, null);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   349
            this.method = method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   350
            this.encodedGraph = encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   351
            intrinsic = new IntrinsicContext(method, null, replacements.getDefaultReplacementBytecodeProvider(), context, false);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   352
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   353
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   354
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   355
        protected EncodedGraph lookupEncodedGraph(ResolvedJavaMethod lookupMethod,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   356
                        MethodSubstitutionPlugin plugin,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   357
                        BytecodeProvider intrinsicBytecodeProvider,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   358
                        boolean isSubstitution,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   359
                        boolean trackNodeSourcePosition) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   360
            if (lookupMethod.equals(method)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   361
                return encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   362
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   363
                throw GraalError.shouldNotReachHere(method.format("%H.%n(%p)"));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   364
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   365
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   366
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   367
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   368
        protected IntrinsicContext getIntrinsic() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   369
            return intrinsic;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   370
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   371
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   372
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   373
    private StructuredGraph buildGraph(ResolvedJavaMethod method, ResolvedJavaMethod original, Object receiver, boolean requireInlining, boolean trackNodeSourcePosition,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   374
                    IntrinsicContext.CompilationContext context, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   375
        assert method.hasBytecodes() : "Snippet must not be abstract or native";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   376
        Object[] args = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   377
        if (receiver != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   378
            args = new Object[method.getSignature().getParameterCount(true)];
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   379
            args[0] = receiver;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   380
        }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   381
        try (DebugContext debug = openDebugContext("Snippet_", method, options)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   382
            StructuredGraph graph = snippetReplacements.makeGraph(debug, snippetReplacements.getDefaultReplacementBytecodeProvider(), method, args, original, trackNodeSourcePosition, null, context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   383
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   384
            // Check if all methods which should be inlined are really inlined.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   385
            for (MethodCallTargetNode callTarget : graph.getNodes(MethodCallTargetNode.TYPE)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   386
                ResolvedJavaMethod callee = callTarget.targetMethod();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   387
                if (requireInlining && !delayedInvocationPluginMethods.contains(callee) && !Objects.equals(callee, original)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   388
                    throw GraalError.shouldNotReachHere("method " + callee.format("%H.%n") + " not inlined in snippet " + method.getName() + " (maybe not final?)");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   389
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   390
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   391
            assert verifySnippetEncodeDecode(method, original, trackNodeSourcePosition, graph);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   392
            debug.dump(DebugContext.VERBOSE_LEVEL, graph, "After buildGraph");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   393
            return graph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   394
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   395
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   396
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   397
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   398
    private static StructuredGraph decodeSnippetGraph(SymbolicEncodedGraph encodedGraph, ResolvedJavaMethod method, ReplacementsImpl replacements, Object[] args,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   399
                    StructuredGraph.AllowAssumptions allowAssumptions, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   400
        Providers providers = replacements.getProviders();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   401
        ParameterPlugin parameterPlugin = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   402
        if (args != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   403
            parameterPlugin = new ConstantBindingParameterPlugin(args, providers.getMetaAccess(), replacements.snippetReflection);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   404
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   405
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   406
        try (DebugContext debug = replacements.openDebugContext("SVMSnippet_", method, options)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   407
            // @formatter:off
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   408
            StructuredGraph result = new StructuredGraph.Builder(options, debug, allowAssumptions)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   409
                    .method(method)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   410
                    .trackNodeSourcePosition(encodedGraph.trackNodeSourcePosition())
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   411
                    .setIsSubstitution(true)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   412
                    .build();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   413
            // @formatter:on
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   414
            try (DebugContext.Scope scope = debug.scope("DecodeSnippetGraph", result)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   415
                PEGraphDecoder graphDecoder = new SubstitutionGraphDecoder(providers, result, replacements, parameterPlugin, method, INLINE_AFTER_PARSING, encodedGraph);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   416
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   417
                graphDecoder.decode(method, result.isSubstitution(), encodedGraph.trackNodeSourcePosition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   418
                debug.dump(DebugContext.VERBOSE_LEVEL, result, "After decoding");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   419
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   420
                assert result.verify();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   421
                return result;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   422
            } catch (Throwable t) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   423
                throw debug.handle(t);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   424
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   425
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   426
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   427
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   428
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   429
    private boolean verifySnippetEncodeDecode(ResolvedJavaMethod method, ResolvedJavaMethod original, boolean trackNodeSourcePosition, StructuredGraph graph) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   430
        // Verify the encoding and decoding process
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   431
        EncodedGraph encodedGraph = GraphEncoder.encodeSingleGraph(graph, HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   432
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   433
        try (DebugContext debug = snippetReplacements.openDebugContext("VerifySnippetEncodeDecode_", method, graph.getOptions())) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   434
            HotSpotProviders originalProvider = (HotSpotProviders) snippetReplacements.getProviders();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   435
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   436
            SnippetReflectionProvider snippetReflection = originalProvider.getSnippetReflection();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   437
            SymbolicSnippetEncoder.HotSpotSubstrateConstantReflectionProvider constantReflection = new SymbolicSnippetEncoder.HotSpotSubstrateConstantReflectionProvider(
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   438
                            originalProvider.getConstantReflection());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   439
            HotSpotProviders newProviders = new HotSpotProviders(originalProvider.getMetaAccess(), originalProvider.getCodeCache(), constantReflection,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   440
                            originalProvider.getConstantFieldProvider(), originalProvider.getForeignCalls(), originalProvider.getLowerer(), null, originalProvider.getSuites(),
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   441
                            originalProvider.getRegisters(), snippetReflection, originalProvider.getWordTypes(), originalProvider.getGraphBuilderPlugins(), originalProvider.getGC());
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   442
            HotSpotSnippetReplacementsImpl filteringReplacements = new HotSpotSnippetReplacementsImpl(newProviders, snippetReflection,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   443
                            originalProvider.getReplacements().getDefaultReplacementBytecodeProvider(), originalProvider.getCodeCache().getTarget());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   444
            filteringReplacements.setGraphBuilderPlugins(originalProvider.getReplacements().getGraphBuilderPlugins());
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   445
            try (DebugContext.Scope scaope = debug.scope("VerifySnippetEncodeDecode", graph)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   446
                for (int i = 0; i < encodedGraph.getNumObjects(); i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   447
                    filterSnippetObject(encodedGraph.getObject(i));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   448
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   449
                StructuredGraph snippet = filteringReplacements.makeGraph(debug, filteringReplacements.getDefaultReplacementBytecodeProvider(), method, null, original,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   450
                                trackNodeSourcePosition, null);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   451
                SymbolicEncodedGraph symbolicGraph = new SymbolicEncodedGraph(encodedGraph, method.getDeclaringClass(), original != null ? methodKey(original) : null);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   452
                StructuredGraph decodedSnippet = decodeSnippetGraph(symbolicGraph, original != null ? original : method, originalReplacements, null,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   453
                                StructuredGraph.AllowAssumptions.ifNonNull(graph.getAssumptions()), graph.getOptions());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   454
                String snippetString = getCanonicalGraphString(snippet, true, false);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   455
                String decodedSnippetString = getCanonicalGraphString(decodedSnippet, true, false);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   456
                if (snippetString.equals(decodedSnippetString)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   457
                    debug.log("Snippet decode for %s produces exactly same graph", method);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   458
                    debug.dump(DebugContext.VERBOSE_LEVEL, decodedSnippet, "Decoded snippet graph for %s", method);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   459
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   460
                    debug.log("Snippet decode for %s produces different graph", method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   461
                    debug.log("%s", compareGraphStrings(snippet, snippetString, decodedSnippet, decodedSnippetString));
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   462
                    debug.dump(DebugContext.VERBOSE_LEVEL, snippet, "Snippet graph for %s", method);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   463
                    debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Encoded snippet graph for %s", method);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   464
                    debug.dump(DebugContext.VERBOSE_LEVEL, decodedSnippet, "Decoded snippet graph for %s", method);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   465
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   466
            } catch (Throwable t) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   467
                throw debug.handle(t);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   468
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   469
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   470
        return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   471
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   472
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   473
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   474
     * If there are new graphs waiting to be encoded, reencode all the graphs and return the result.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   475
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   476
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   477
    private synchronized EncodedSnippets maybeEncodeSnippets(OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   478
        Map<String, StructuredGraph> graphs = this.preparedSnippetGraphs;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   479
        if (encodedGraphs != graphs.size()) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   480
            DebugContext debug = openDebugContext("SnippetEncoder", null, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   481
            try (DebugContext.Scope scope = debug.scope("SnippetSupportEncode")) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   482
                encodedGraphs = graphs.size();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   483
                for (StructuredGraph graph : graphs.values()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   484
                    for (Node node : graph.getNodes()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   485
                        node.setNodeSourcePosition(null);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   486
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   487
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   488
                return encodeSnippets(debug);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   489
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   490
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   491
        return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   492
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   493
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   494
    synchronized void registerSnippet(ResolvedJavaMethod method, ResolvedJavaMethod original, Object receiver, boolean trackNodeSourcePosition, OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   495
        if (IS_BUILDING_NATIVE_IMAGE || UseEncodedGraphs.getValue(options)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   496
            assert method.getAnnotation(Snippet.class) != null : "Snippet must be annotated with @" + Snippet.class.getSimpleName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   497
            String key = methodKey(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   498
            if (!preparedSnippetGraphs.containsKey(key)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   499
                if (original != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   500
                    originalMethods.put(key, methodKey(original));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   501
                }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   502
                StructuredGraph snippet = buildGraph(method, original, receiver, true, trackNodeSourcePosition, INLINE_AFTER_PARSING, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   503
                snippetMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   504
                preparedSnippetGraphs.put(key, snippet);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   505
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   506
        }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   507
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   508
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   509
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   510
    private synchronized EncodedSnippets encodeSnippets(DebugContext debug) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   511
        GraphEncoder encoder = new GraphEncoder(HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch, debug);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   512
        for (StructuredGraph graph : preparedSnippetGraphs.values()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   513
            encoder.prepare(graph);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   514
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   515
        encoder.finishPrepare();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   516
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   517
        byte[] snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   518
        Object[] snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   519
        NodeClass<?>[] snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   520
        Map<String, Integer> snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   521
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   522
        snippetStartOffsets = new HashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   523
        for (Map.Entry<String, StructuredGraph> entry : preparedSnippetGraphs.entrySet()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   524
            snippetStartOffsets.put(entry.getKey(), encoder.encode(entry.getValue()));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   525
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   526
        snippetEncoding = encoder.getEncoding();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   527
        snippetObjects = encoder.getObjects();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   528
        snippetNodeClasses = encoder.getNodeClasses();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   529
        for (int i = 0; i < snippetObjects.length; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   530
            Object o = filterSnippetObject(snippetObjects[i]);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   531
            debug.log("snippetObjects[%d] = %s -> %s", i, o != null ? o.getClass().getSimpleName() : null, o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   532
            snippetObjects[i] = o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   533
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   534
        debug.log("Encoded %d snippet preparedSnippetGraphs using %d bytes with %d objects", snippetStartOffsets.size(), snippetEncoding.length, snippetObjects.length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   535
        return new EncodedSnippets(snippetEncoding, snippetObjects, snippetNodeClasses, snippetStartOffsets, originalMethods);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   536
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   537
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   538
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   539
     * Encode any outstanding graphs and return true if any work was done.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   540
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   541
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   542
    public boolean encode(OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   543
        EncodedSnippets encodedSnippets = maybeEncodeSnippets(options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   544
        if (encodedSnippets != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   545
            HotSpotReplacementsImpl.setEncodedSnippets(encodedSnippets);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   546
            return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   547
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   548
        return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   549
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   550
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   551
    private DebugContext openDebugContext(String idPrefix, ResolvedJavaMethod method, OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   552
        return snippetReplacements.openDebugContext(idPrefix, method, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   553
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   554
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   555
    static class SymbolicEncodedGraph extends EncodedGraph {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   556
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   557
        private final ResolvedJavaType[] accessingClasses;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   558
        private final String originalMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   559
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   560
        SymbolicEncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClass<?>[] types, String originalMethod, ResolvedJavaType... accessingClasses) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   561
            super(encoding, startOffset, objects, types, null, null, null, false, false);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   562
            this.accessingClasses = accessingClasses;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   563
            this.originalMethod = originalMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   564
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   565
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   566
        SymbolicEncodedGraph(EncodedGraph encodedGraph, ResolvedJavaType declaringClass, String originalMethod) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   567
            this(encodedGraph.getEncoding(), encodedGraph.getStartOffset(), encodedGraph.getObjects(), encodedGraph.getNodeClasses(),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   568
                            originalMethod, declaringClass);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   569
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   570
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   571
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   572
        public Object getObject(int i) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   573
            Object o = objects[i];
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   574
            Object replacement = null;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   575
            if (o instanceof SymbolicJVMCIReference) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   576
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   577
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   578
                        replacement = ((SymbolicJVMCIReference<?>) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   579
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   580
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   581
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   582
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   583
            } else if (o instanceof UnresolvedJavaType) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   584
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   585
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   586
                        replacement = ((UnresolvedJavaType) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   587
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   588
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   589
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   590
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   591
            } else if (o instanceof UnresolvedJavaMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   592
                throw new InternalError(o.toString());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   593
            } else if (o instanceof UnresolvedJavaField) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   594
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   595
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   596
                        replacement = ((UnresolvedJavaField) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   597
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   598
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   599
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   600
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   601
            } else if (o instanceof GraalCapability) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   602
                replacement = ((GraalCapability) o).resolve(((GraalJVMCICompiler) getRuntime().getCompiler()).getGraalRuntime());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   603
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   604
                return o;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   605
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   606
            if (replacement != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   607
                objects[i] = o = replacement;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   608
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   609
                throw new GraalError("Can't resolve " + o);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   610
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   611
            return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   612
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   613
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   614
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   615
        public boolean isCallToOriginal(ResolvedJavaMethod callTarget) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   616
            if (originalMethod != null && originalMethod.equals(methodKey(callTarget))) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   617
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   618
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   619
            return super.isCallToOriginal(callTarget);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   620
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   621
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   622
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   623
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   624
     * Symbolic reference to an object which can be retrieved from
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   625
     * {@link GraalRuntime#getCapability(Class)}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   626
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   627
    static class GraalCapability {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   628
        final Class<?> capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   629
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   630
        GraalCapability(Class<?> capabilityClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   631
            this.capabilityClass = capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   632
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   633
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   634
        public Object resolve(GraalRuntime runtime) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   635
            Object capability = runtime.getCapability(this.capabilityClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   636
            if (capability != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   637
                assert capability.getClass() == capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   638
                return capability;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   639
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   640
            throw new InternalError(this.capabilityClass.getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   641
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   642
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   643
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   644
    static class SymbolicResolvedJavaMethod implements SymbolicJVMCIReference<ResolvedJavaMethod> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   645
        final UnresolvedJavaType type;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   646
        final String methodName;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   647
        final String signature;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   648
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   649
        SymbolicResolvedJavaMethod(ResolvedJavaMethod method) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   650
            this.type = UnresolvedJavaType.create(method.getDeclaringClass().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   651
            this.methodName = method.getName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   652
            this.signature = method.getSignature().toMethodDescriptor();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   653
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   654
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   655
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   656
        public String toString() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   657
            return "SymbolicResolvedJavaMethod{" +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   658
                            "declaringType='" + type.getName() + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   659
                            ", methodName='" + methodName + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   660
                            ", signature='" + signature + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   661
                            '}';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   662
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   663
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   664
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   665
        public ResolvedJavaMethod resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   666
            ResolvedJavaType resolvedType = type.resolve(accessingClass);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   667
            if (resolvedType == null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   668
                throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   669
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   670
            for (ResolvedJavaMethod method : methodName.equals("<init>") ? resolvedType.getDeclaredConstructors() : resolvedType.getDeclaredMethods()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   671
                if (method.getName().equals(methodName) && method.getSignature().toMethodDescriptor().equals(signature)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   672
                    return method;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   673
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   674
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   675
            throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   676
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   677
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   678
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   679
    static class SymbolicResolvedJavaField implements SymbolicJVMCIReference<ResolvedJavaField> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   680
        final UnresolvedJavaType declaringType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   681
        final String name;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   682
        final UnresolvedJavaType signature;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   683
        private final boolean isStatic;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   684
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   685
        SymbolicResolvedJavaField(ResolvedJavaField field) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   686
            this.declaringType = UnresolvedJavaType.create(field.getDeclaringClass().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   687
            this.name = field.getName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   688
            this.signature = UnresolvedJavaType.create(field.getType().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   689
            this.isStatic = field.isStatic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   690
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   691
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   692
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   693
        public ResolvedJavaField resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   694
            ResolvedJavaType resolvedType = declaringType.resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   695
            ResolvedJavaType resolvedFieldType = signature.resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   696
            ResolvedJavaField[] fields = isStatic ? resolvedType.getStaticFields() : resolvedType.getInstanceFields(true);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   697
            for (ResolvedJavaField field : fields) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   698
                if (field.getName().equals(name)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   699
                    if (field.getType().equals(resolvedFieldType)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   700
                        return field;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   701
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   702
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   703
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   704
            throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   705
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   706
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   707
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   708
        public String toString() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   709
            return "SymbolicResolvedJavaField{" +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   710
                            signature.getName() + ' ' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   711
                            declaringType.getName() + '.' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   712
                            name +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   713
                            '}';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   714
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   715
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   716
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   717
    static class SymbolicResolvedJavaMethodBytecode implements SymbolicJVMCIReference<ResolvedJavaMethodBytecode> {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   718
        SymbolicResolvedJavaMethod method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   719
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   720
        SymbolicResolvedJavaMethodBytecode(ResolvedJavaMethodBytecode bytecode) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   721
            method = new SymbolicResolvedJavaMethod(bytecode.getMethod());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   722
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   723
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   724
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   725
        public ResolvedJavaMethodBytecode resolve(ResolvedJavaType accessingClass) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   726
            return new ResolvedJavaMethodBytecode(method.resolve(accessingClass));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   727
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   728
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   729
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   730
    static class SymbolicStampPair implements SymbolicJVMCIReference<StampPair> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   731
        Object trustedStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   732
        Object uncheckdStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   733
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   734
        SymbolicStampPair(StampPair stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   735
            this.trustedStamp = maybeMakeSymbolic(stamp.getTrustedStamp());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   736
            this.uncheckdStamp = maybeMakeSymbolic(stamp.getUncheckedStamp());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   737
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   738
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   739
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   740
        public StampPair resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   741
            return StampPair.create(resolveStamp(accessingClass, trustedStamp), resolveStamp(accessingClass, uncheckdStamp));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   742
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   743
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   744
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   745
    private static Object maybeMakeSymbolic(Stamp trustedStamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   746
        if (trustedStamp != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   747
            SymbolicJVMCIReference<?> symbolicJVMCIReference = trustedStamp.makeSymbolic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   748
            if (symbolicJVMCIReference != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   749
                return symbolicJVMCIReference;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   750
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   751
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   752
        return trustedStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   753
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   754
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   755
    private static Stamp resolveStamp(ResolvedJavaType accessingClass, Object stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   756
        if (stamp == null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   757
            return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   758
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   759
        if (stamp instanceof Stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   760
            return (Stamp) stamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   761
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   762
        return (Stamp) ((SymbolicJVMCIReference<?>) stamp).resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   763
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   764
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   765
    public static class HotSpotSubstrateConstantReflectionProvider implements ConstantReflectionProvider {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   766
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   767
        private final ConstantReflectionProvider constantReflection;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   768
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   769
        HotSpotSubstrateConstantReflectionProvider(ConstantReflectionProvider constantReflection) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   770
            this.constantReflection = constantReflection;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   771
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   772
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   773
        HashSet<JavaConstant> safeConstants = new HashSet<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   774
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   775
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   776
        public Boolean constantEquals(Constant x, Constant y) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   777
            return constantReflection.constantEquals(x, y);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   778
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   779
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   780
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   781
        public Integer readArrayLength(JavaConstant array) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   782
            return constantReflection.readArrayLength(array);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   783
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   784
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   785
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   786
        public JavaConstant readArrayElement(JavaConstant array, int index) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   787
            return constantReflection.readArrayElement(array, index);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   788
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   789
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   790
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   791
        public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   792
            JavaConstant javaConstant = constantReflection.readFieldValue(field, receiver);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   793
            if (!safeConstants.contains(receiver) &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   794
                            !field.getDeclaringClass().getName().contains("graalvm") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   795
                            !field.getDeclaringClass().getName().contains("jdk/vm/ci/") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   796
                            !field.getDeclaringClass().getName().contains("jdk/internal/vm/compiler") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   797
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   798
                            !field.getName().equals("TYPE")) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   799
                // Only permit constant reflection on compiler classes. This is necessary primarily
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   800
                // because of the boxing snippets which are compiled as snippets but are really just
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   801
                // regular JDK java sources that are being compiled like a snippet. These shouldn't
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   802
                // permit constant folding during graph preparation as that embeds constants from
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   803
                // the runtime into a compiler graph.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   804
                return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   805
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   806
            if (javaConstant.getJavaKind() == JavaKind.Object) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   807
                safeConstants.add(javaConstant);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   808
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   809
            return javaConstant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   810
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   811
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   812
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   813
        public JavaConstant boxPrimitive(JavaConstant source) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   814
            return constantReflection.boxPrimitive(source);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   815
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   816
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   817
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   818
        public JavaConstant unboxPrimitive(JavaConstant source) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   819
            return constantReflection.unboxPrimitive(source);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   820
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   821
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   822
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   823
        public JavaConstant forString(String value) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   824
            return constantReflection.forString(value);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   825
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   826
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   827
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   828
        public ResolvedJavaType asJavaType(Constant constant) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   829
            return constantReflection.asJavaType(constant);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   830
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   831
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   832
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   833
        public MethodHandleAccessProvider getMethodHandleAccess() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   834
            return constantReflection.getMethodHandleAccess();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   835
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   836
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   837
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   838
        public MemoryAccessProvider getMemoryAccessProvider() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   839
            return constantReflection.getMemoryAccessProvider();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   840
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   841
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   842
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   843
        public JavaConstant asJavaClass(ResolvedJavaType type) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   844
            return constantReflection.asJavaClass(type);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   845
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   846
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   847
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   848
        public Constant asObjectHub(ResolvedJavaType type) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   849
            return constantReflection.asObjectHub(type);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   850
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   851
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   852
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   853
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   854
     * Objects embedded in encoded graphs might need to converted into a symbolic form so convert
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   855
     * the object or pass it through.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   856
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   857
    private static Object filterSnippetObject(Object o) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   858
        if (o instanceof HotSpotResolvedJavaMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   859
            return new SymbolicResolvedJavaMethod((HotSpotResolvedJavaMethod) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   860
        } else if (o instanceof HotSpotResolvedJavaField) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   861
            return new SymbolicResolvedJavaField((HotSpotResolvedJavaField) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   862
        } else if (o instanceof HotSpotResolvedJavaType) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   863
            return UnresolvedJavaType.create(((ResolvedJavaType) o).getName());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   864
        } else if (o instanceof NodeSourcePosition) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   865
            // Filter these out for now. These can't easily be handled because these positions
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   866
            // description snippet methods which might not be available in the runtime.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   867
            return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   868
        } else if (o instanceof HotSpotForeignCallsProvider || o instanceof GraalHotSpotVMConfig) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   869
            return new GraalCapability(o.getClass());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   870
        } else if (o instanceof Stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   871
            SymbolicJVMCIReference<?> ref = ((Stamp) o).makeSymbolic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   872
            if (ref != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   873
                return ref;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   874
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   875
            return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   876
        } else if (o instanceof StampPair) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   877
            if (((StampPair) o).getTrustedStamp() instanceof AbstractObjectStamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   878
                return new SymbolicStampPair((StampPair) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   879
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   880
        } else if (o instanceof ResolvedJavaMethodBytecode) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   881
            return new SymbolicResolvedJavaMethodBytecode((ResolvedJavaMethodBytecode) o);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   882
        } else if (o instanceof HotSpotSignature) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   883
            throw new GraalError(o.toString());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   884
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   885
        return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   886
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   887
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   888
    private static String compareGraphStrings(StructuredGraph expectedGraph, String expectedString, StructuredGraph actualGraph, String actualString) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   889
        if (!expectedString.equals(actualString)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   890
            String[] expectedLines = expectedString.split("\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   891
            String[] actualLines = actualString.split("\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   892
            int diffIndex = -1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   893
            int limit = Math.min(actualLines.length, expectedLines.length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   894
            String marker = " <<<";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   895
            for (int i = 0; i < limit; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   896
                if (!expectedLines[i].equals(actualLines[i])) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   897
                    diffIndex = i;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   898
                    break;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   899
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   900
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   901
            if (diffIndex == -1) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   902
                // Prefix is the same so add some space after the prefix
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   903
                diffIndex = limit;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   904
                if (actualLines.length == limit) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   905
                    actualLines = Arrays.copyOf(actualLines, limit + 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   906
                    actualLines[diffIndex] = "";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   907
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   908
                    assert expectedLines.length == limit;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   909
                    expectedLines = Arrays.copyOf(expectedLines, limit + 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   910
                    expectedLines[diffIndex] = "";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   911
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   912
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   913
            // Place a marker next to the first line that differs
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   914
            expectedLines[diffIndex] = expectedLines[diffIndex] + marker;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   915
            actualLines[diffIndex] = actualLines[diffIndex] + marker;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   916
            String ediff = String.join("\n", expectedLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   917
            String adiff = String.join("\n", actualLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   918
            return "mismatch in preparedSnippetGraphs:\n========= expected (" + expectedGraph + ") =========\n" + ediff + "\n\n========= actual (" + actualGraph + ") =========\n" + adiff;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   919
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   920
            return "mismatch in preparedSnippetGraphs";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   921
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   922
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   923
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   924
    private static String getCanonicalGraphString(StructuredGraph graph, boolean excludeVirtual, boolean checkConstants) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   925
        SchedulePhase schedule = new SchedulePhase(SchedulePhase.SchedulingStrategy.EARLIEST);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   926
        schedule.apply(graph);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   927
        StructuredGraph.ScheduleResult scheduleResult = graph.getLastSchedule();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   928
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   929
        NodeMap<Integer> canonicalId = graph.createNodeMap();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   930
        int nextId = 0;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   931
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   932
        List<String> constantsLines = new ArrayList<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   933
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   934
        StringBuilder result = new StringBuilder();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   935
        for (Block block : scheduleResult.getCFG().getBlocks()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   936
            result.append("Block ").append(block).append(' ');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   937
            if (block == scheduleResult.getCFG().getStartBlock()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   938
                result.append("* ");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   939
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   940
            result.append("-> ");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   941
            for (Block succ : block.getSuccessors()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   942
                result.append(succ).append(' ');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   943
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   944
            result.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   945
            for (Node node : scheduleResult.getBlockToNodesMap().get(block)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   946
                if (node instanceof ValueNode && node.isAlive()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   947
                    if (!excludeVirtual || !(node instanceof VirtualObjectNode || node instanceof ProxyNode || node instanceof FullInfopointNode || node instanceof ParameterNode)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   948
                        if (node instanceof ConstantNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   949
                            if (checkConstants) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   950
                                String name = node.toString(Verbosity.Name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   951
                                if (excludeVirtual) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   952
                                    constantsLines.add(name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   953
                                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   954
                                    constantsLines.add(name + "    (" + filteredUsageCount(node) + ")");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   955
                                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   956
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   957
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   958
                            int id;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   959
                            if (canonicalId.get(node) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   960
                                id = canonicalId.get(node);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   961
                            } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   962
                                id = nextId++;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   963
                                canonicalId.set(node, id);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   964
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   965
                            String name = node.getClass().getSimpleName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   966
                            result.append("  ").append(id).append('|').append(name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   967
                            if (node instanceof AccessFieldNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   968
                                result.append('#');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   969
                                result.append(((AccessFieldNode) node).field());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   970
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   971
                            if (!excludeVirtual) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   972
                                result.append("    (");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   973
                                result.append(filteredUsageCount(node));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   974
                                result.append(')');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   975
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   976
                            result.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   977
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   978
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   979
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   980
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   981
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   982
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   983
        StringBuilder constantsLinesResult = new StringBuilder();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   984
        if (checkConstants) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   985
            constantsLinesResult.append(constantsLines.size()).append(" constants:\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   986
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   987
        Collections.sort(constantsLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   988
        for (String s : constantsLines) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   989
            constantsLinesResult.append(s);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   990
            constantsLinesResult.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   991
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   992
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   993
        return constantsLinesResult.toString() + result.toString();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   994
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   995
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   996
    private static int filteredUsageCount(Node node) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   997
        return node.usages().filter(n -> !(n instanceof FrameState)).count();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   998
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   999
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1000
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1001
     * This horror show of classes exists solely get {@link HotSpotSnippetBytecodeParser} to be used
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1002
     * as the parser for these snippets.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1003
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1004
    static class HotSpotSnippetReplacementsImpl extends HotSpotReplacementsImpl {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1005
        HotSpotSnippetReplacementsImpl(HotSpotReplacementsImpl replacements, Providers providers) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1006
            super(replacements, providers);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1007
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1008
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1009
        HotSpotSnippetReplacementsImpl(Providers providers, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider, TargetDescription target) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1010
            super(providers, snippetReflection, bytecodeProvider, target);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1011
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1012
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1013
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1014
        protected GraphMaker createGraphMaker(ResolvedJavaMethod substitute, ResolvedJavaMethod original) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1015
            return new SnippetGraphMaker(this, substitute, original);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1016
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1017
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1018
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1019
    static class SnippetGraphMaker extends ReplacementsImpl.GraphMaker {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1020
        SnippetGraphMaker(ReplacementsImpl replacements, ResolvedJavaMethod substitute, ResolvedJavaMethod substitutedMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1021
            super(replacements, substitute, substitutedMethod);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1022
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1023
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1024
        @Override
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1025
        protected GraphBuilderPhase.Instance createGraphBuilder(Providers providers, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1026
                        IntrinsicContext initialIntrinsicContext) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1027
            return new HotSpotSnippetGraphBuilderPhase(providers, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1028
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1029
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1030
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1031
    static class HotSpotSnippetGraphBuilderPhase extends GraphBuilderPhase.Instance {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1032
        HotSpotSnippetGraphBuilderPhase(Providers theProviders, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, IntrinsicContext initialIntrinsicContext) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1033
            super(theProviders, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1034
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1035
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1036
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1037
        protected BytecodeParser createBytecodeParser(StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI, IntrinsicContext intrinsicContext) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1038
            return new HotSpotSnippetBytecodeParser(this, graph, parent, method, entryBCI, intrinsicContext);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1039
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1040
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1041
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1042
    static class HotSpotSnippetBytecodeParser extends BytecodeParser {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1043
        HotSpotSnippetBytecodeParser(GraphBuilderPhase.Instance graphBuilderInstance, StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1044
                        IntrinsicContext intrinsicContext) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1045
            super(graphBuilderInstance, graph, parent, method, entryBCI, intrinsicContext);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1046
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1047
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1048
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1049
        public boolean canDeferPlugin(GeneratedInvocationPlugin plugin) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1050
            // Fold is always deferred but NodeIntrinsics may have to wait if all their arguments
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1051
            // aren't constant yet.
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1052
            return plugin.isGeneratedFromFoldOrNodeIntrinsic();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1053
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1054
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1055
        @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1056
        protected boolean canInlinePartialIntrinsicExit() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1057
            return false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1058
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1059
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1060
        @Override
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
  1061
        protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, ValueNode[] args, ResolvedJavaMethod targetMethod, JavaKind resultType) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1062
            if (intrinsicContext != null && intrinsicContext.isCallToOriginal(targetMethod)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1063
                return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1064
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1065
            if (targetMethod.getAnnotation(Fold.class) != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1066
                // Always defer Fold until decode time but NodeIntrinsics may fold if they are able.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1067
                return false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1068
            }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
  1069
            return super.tryInvocationPlugin(invokeKind, args, targetMethod, resultType);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1070
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1071
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1072
}