src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.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:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.replacements;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    27
import static java.util.FormattableFlags.ALTERNATE;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52956
diff changeset
    28
import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    29
import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    30
import static org.graalvm.compiler.debug.DebugContext.applyFormattingFlagsAndWidth;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    31
import static org.graalvm.compiler.debug.DebugOptions.DebugStubsAndSnippets;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import static org.graalvm.compiler.graph.iterators.NodePredicates.isNotA;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_IGNORED;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_IGNORED;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    36
import static jdk.internal.vm.compiler.word.LocationIdentity.any;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import java.lang.reflect.Array;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import java.lang.reflect.Method;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import java.util.ArrayList;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import java.util.Arrays;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import java.util.Collection;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import java.util.Collections;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import java.util.Formattable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import java.util.Formatter;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import java.util.LinkedHashMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import java.util.List;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import java.util.Map;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    49
import java.util.concurrent.atomic.AtomicInteger;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import java.util.concurrent.atomic.AtomicReference;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import java.util.function.Predicate;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    53
import jdk.internal.vm.compiler.collections.EconomicMap;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    54
import jdk.internal.vm.compiler.collections.EconomicSet;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    55
import jdk.internal.vm.compiler.collections.Equivalence;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    56
import jdk.internal.vm.compiler.collections.UnmodifiableEconomicMap;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    57
import org.graalvm.compiler.api.replacements.Fold;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import org.graalvm.compiler.api.replacements.Snippet;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    60
import org.graalvm.compiler.api.replacements.Snippet.NonNullParameter;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
import org.graalvm.compiler.api.replacements.Snippet.VarargsParameter;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
    62
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
import org.graalvm.compiler.core.common.GraalOptions;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import org.graalvm.compiler.core.common.type.Stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
import org.graalvm.compiler.core.common.type.StampFactory;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import org.graalvm.compiler.core.common.type.StampPair;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
import org.graalvm.compiler.core.common.type.TypeReference;
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
    68
import org.graalvm.compiler.debug.Assertions;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    69
import org.graalvm.compiler.debug.CounterKey;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
import org.graalvm.compiler.debug.DebugCloseable;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48190
diff changeset
    71
import org.graalvm.compiler.debug.DebugContext;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
    72
import org.graalvm.compiler.debug.DebugContext.Description;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    73
import org.graalvm.compiler.debug.DebugHandlersFactory;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
import org.graalvm.compiler.debug.GraalError;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    75
import org.graalvm.compiler.debug.TimerKey;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
    76
import org.graalvm.compiler.graph.Graph.Mark;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    77
import org.graalvm.compiler.graph.Node;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    78
import org.graalvm.compiler.graph.Node.NodeIntrinsic;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
import org.graalvm.compiler.graph.NodeClass;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
    80
import org.graalvm.compiler.graph.NodeSourcePosition;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
import org.graalvm.compiler.graph.Position;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
import org.graalvm.compiler.loop.LoopEx;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
import org.graalvm.compiler.loop.LoopsData;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
import org.graalvm.compiler.loop.phases.LoopTransformations;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
import org.graalvm.compiler.nodeinfo.InputType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
import org.graalvm.compiler.nodeinfo.NodeInfo;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
import org.graalvm.compiler.nodes.AbstractBeginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
import org.graalvm.compiler.nodes.AbstractMergeNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
import org.graalvm.compiler.nodes.ConstantNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
import org.graalvm.compiler.nodes.ControlSinkNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
import org.graalvm.compiler.nodes.DeoptimizingNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
import org.graalvm.compiler.nodes.FixedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
import org.graalvm.compiler.nodes.FixedWithNextNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
import org.graalvm.compiler.nodes.FrameState;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
    95
import org.graalvm.compiler.nodes.InliningLog;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
import org.graalvm.compiler.nodes.LoopBeginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
import org.graalvm.compiler.nodes.MergeNode;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
    98
import org.graalvm.compiler.nodes.NodeView;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
import org.graalvm.compiler.nodes.ParameterNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
import org.graalvm.compiler.nodes.PhiNode;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   101
import org.graalvm.compiler.nodes.PiNode.Placeholder;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   102
import org.graalvm.compiler.nodes.PiNode.PlaceholderStamp;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
import org.graalvm.compiler.nodes.ReturnNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
import org.graalvm.compiler.nodes.StartNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
import org.graalvm.compiler.nodes.StateSplit;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
import org.graalvm.compiler.nodes.StructuredGraph;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   107
import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
import org.graalvm.compiler.nodes.ValueNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
import org.graalvm.compiler.nodes.ValueNodeUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
import org.graalvm.compiler.nodes.calc.FloatingNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
import org.graalvm.compiler.nodes.java.LoadIndexedNode;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   112
import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
import org.graalvm.compiler.nodes.java.StoreIndexedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
import org.graalvm.compiler.nodes.memory.MemoryAccess;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
import org.graalvm.compiler.nodes.memory.MemoryAnchorNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
import org.graalvm.compiler.nodes.memory.MemoryMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
import org.graalvm.compiler.nodes.memory.MemoryMapNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
import org.graalvm.compiler.nodes.memory.MemoryNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
import org.graalvm.compiler.nodes.memory.MemoryPhiNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
import org.graalvm.compiler.nodes.spi.ArrayLengthProvider;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   122
import org.graalvm.compiler.nodes.spi.CoreProviders;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
import org.graalvm.compiler.nodes.spi.LoweringTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
import org.graalvm.compiler.nodes.spi.MemoryProxy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
import org.graalvm.compiler.nodes.util.GraphUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
import org.graalvm.compiler.options.Option;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   127
import org.graalvm.compiler.options.OptionKey;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   128
import org.graalvm.compiler.options.OptionValues;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
import org.graalvm.compiler.phases.common.CanonicalizerPhase;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
import org.graalvm.compiler.phases.common.FloatingReadPhase;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   132
import org.graalvm.compiler.phases.common.FloatingReadPhase.MemoryMapImpl;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
import org.graalvm.compiler.phases.common.GuardLoweringPhase;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
import org.graalvm.compiler.phases.common.LoweringPhase;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   135
import org.graalvm.compiler.phases.common.RemoveValueProxyPhase;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
import org.graalvm.compiler.phases.common.inlining.InliningUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
import org.graalvm.compiler.phases.util.Providers;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
import org.graalvm.compiler.replacements.nodes.ExplodeLoopNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
import org.graalvm.compiler.replacements.nodes.LoadSnippetVarargParameterNode;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   140
import org.graalvm.util.CollectionsUtil;
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   141
import jdk.internal.vm.compiler.word.LocationIdentity;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   142
import jdk.internal.vm.compiler.word.WordBase;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   144
import jdk.vm.ci.code.TargetDescription;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   145
import jdk.vm.ci.meta.Constant;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   146
import jdk.vm.ci.meta.ConstantReflectionProvider;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   147
import jdk.vm.ci.meta.JavaConstant;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   148
import jdk.vm.ci.meta.JavaKind;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   149
import jdk.vm.ci.meta.Local;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   150
import jdk.vm.ci.meta.LocalVariableTable;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   151
import jdk.vm.ci.meta.MetaAccessProvider;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   152
import jdk.vm.ci.meta.ResolvedJavaMethod;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   153
import jdk.vm.ci.meta.ResolvedJavaMethod.Parameter;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   154
import jdk.vm.ci.meta.ResolvedJavaType;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   155
import jdk.vm.ci.meta.Signature;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   156
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
 * A snippet template is a graph created by parsing a snippet method and then specialized by binding
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
 * constants to the snippet's {@link ConstantParameter} parameters.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
 * Snippet templates can be managed in a cache maintained by {@link AbstractTemplates}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   162
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   163
public class SnippetTemplate {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   164
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
    private boolean mayRemoveLocation = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
     * Holds the {@link ResolvedJavaMethod} of the snippet, together with some information about the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
     * method that needs to be computed only once. The {@link SnippetInfo} should be created once
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
     * per snippet and then cached.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
    public abstract static class SnippetInfo {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
        protected final ResolvedJavaMethod method;
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   175
        protected final ResolvedJavaMethod original;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
        protected final LocationIdentity[] privateLocations;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   177
        protected final Object receiver;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   178
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   179
        public Object getReceiver() {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   180
            return receiver;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   181
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   182
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   183
        boolean hasReceiver() {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   184
            assert hasReceiver(method) == (receiver != null) : "Snippet with the receiver must have it set as constant. Snippet: " + this;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   185
            return hasReceiver(method);
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   186
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   187
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   188
        static boolean hasReceiver(ResolvedJavaMethod method) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   189
            return method.hasReceiver();
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   190
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
         * Lazily constructed parts of {@link SnippetInfo}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   195
        static class Lazy {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
            Lazy(ResolvedJavaMethod method) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   197
                int count = method.getSignature().getParameterCount(hasReceiver(method));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
                constantParameters = new boolean[count];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
                varargsParameters = new boolean[count];
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   200
                nonNullParameters = new boolean[count];
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   201
                int offset = hasReceiver(method) ? 1 : 0;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   202
                for (int i = offset; i < count; i++) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   203
                    constantParameters[i] = method.getParameterAnnotation(ConstantParameter.class, i - offset) != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   204
                    varargsParameters[i] = method.getParameterAnnotation(VarargsParameter.class, i - offset) != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   205
                    nonNullParameters[i] = method.getParameterAnnotation(NonNullParameter.class, i - offset) != null;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   207
                    assert !constantParameters[i - offset] || !varargsParameters[i - offset] : "Parameter cannot be annotated with both @" + ConstantParameter.class.getSimpleName() + " and @" +
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   208
                                    VarargsParameter.class.getSimpleName();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   209
                }
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   210
                if (method.hasReceiver()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   211
                    // Receiver must be constant.
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   212
                    assert !constantParameters[0];
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   213
                    constantParameters[0] = true;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   214
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   215
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52956
diff changeset
   216
                // Retrieve the names only when assertions are turned on. Parameter annotations are
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52956
diff changeset
   217
                // unsupported in the native image.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52956
diff changeset
   218
                assert IS_IN_NATIVE_IMAGE || initNames(method, count);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   219
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   220
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   221
            final boolean[] constantParameters;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   222
            final boolean[] varargsParameters;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   223
            final boolean[] nonNullParameters;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   224
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   225
            /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   226
             * The parameter names, taken from the local variables table. Only used for assertion
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   227
             * checking, so use only within an assert statement.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
             */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
            String[] names;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   230
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
            private boolean initNames(ResolvedJavaMethod method, int parameterCount) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
                names = new String[parameterCount];
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   233
                int offset = 0;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   234
                if (method.hasReceiver()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   235
                    names[0] = "this";
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   236
                    offset = 1;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   237
                }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   238
                Parameter[] params = method.getParameters();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   239
                if (params != null) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   240
                    for (int i = offset; i < names.length; i++) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   241
                        if (params[i - offset].isNamePresent()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   242
                            names[i] = params[i - offset].getName();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
                        }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   244
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   245
                } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   246
                    int slotIdx = 0;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   247
                    LocalVariableTable localVariableTable = method.getLocalVariableTable();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   248
                    if (localVariableTable != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   249
                        for (int i = 0; i < names.length; i++) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   250
                            Local local = localVariableTable.getLocal(slotIdx, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   251
                            if (local != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   252
                                names[i] = local.getName();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   253
                            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   254
                            JavaKind kind = method.getSignature().getParameterKind(i);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   255
                            slotIdx += kind.getSlotCount();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   256
                        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
        /**
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   264
         * Times instantiations of all templates derived from this snippet.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
         */
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   266
        private final TimerKey instantiationTimer;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
         * Counts instantiations of all templates derived from this snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
         */
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   271
        private final CounterKey instantiationCounter;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   272
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
        protected abstract Lazy lazy();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   275
        protected SnippetInfo(ResolvedJavaMethod method, ResolvedJavaMethod original, LocationIdentity[] privateLocations, Object receiver) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
            this.method = method;
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   277
            this.original = original;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   278
            this.privateLocations = privateLocations;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   279
            instantiationCounter = DebugContext.counter("SnippetInstantiationCount[%s]", method.getName());
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   280
            instantiationTimer = DebugContext.timer("SnippetInstantiationTime[%s]", method.getName());
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   281
            this.receiver = receiver;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
        public ResolvedJavaMethod getMethod() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
            return method;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
        public int getParameterCount() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
            return lazy().constantParameters.length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
        public boolean isConstantParameter(int paramIdx) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
            return lazy().constantParameters[paramIdx];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
        public boolean isVarargsParameter(int paramIdx) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
            return lazy().varargsParameters[paramIdx];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   300
        public boolean isNonNullParameter(int paramIdx) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   301
            return lazy().nonNullParameters[paramIdx];
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   302
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   303
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   304
        public String getParameterName(int paramIdx) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
            String[] names = lazy().names;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
            if (names != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   307
                return names[paramIdx];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   308
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   309
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   310
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   311
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   312
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   313
        public String toString() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
            return getClass().getSimpleName() + ":" + method.format("%h.%n");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   315
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   317
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   318
    protected static class LazySnippetInfo extends SnippetInfo {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   319
        protected final AtomicReference<Lazy> lazy = new AtomicReference<>(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   320
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   321
        protected LazySnippetInfo(ResolvedJavaMethod method, ResolvedJavaMethod original, LocationIdentity[] privateLocations, Object receiver) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   322
            super(method, original, privateLocations, receiver);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   324
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   325
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   326
        protected Lazy lazy() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
            if (lazy.get() == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
                lazy.compareAndSet(null, new Lazy(method));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
            return lazy.get();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
    protected static class EagerSnippetInfo extends SnippetInfo {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   335
        protected final Lazy lazy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   336
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   337
        protected EagerSnippetInfo(ResolvedJavaMethod method, ResolvedJavaMethod original, LocationIdentity[] privateLocations, Object receiver) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   338
            super(method, original, privateLocations, receiver);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
            lazy = new Lazy(method);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   340
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   341
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   343
        protected Lazy lazy() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   344
            return lazy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   345
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   346
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   347
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   348
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   349
     * Values that are bound to the snippet method parameters. The methods {@link #add},
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   350
     * {@link #addConst}, and {@link #addVarargs} must be called in the same order as in the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   351
     * signature of the snippet method. The parameter name is passed to the add methods for
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   352
     * assertion checking, i.e., to enforce that the order matches. Which method needs to be called
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   353
     * depends on the annotation of the snippet method parameter:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
     * <ul>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   355
     * <li>Use {@link #add} for a parameter without an annotation. The value is bound when the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   356
     * {@link SnippetTemplate} is {@link SnippetTemplate#instantiate instantiated}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   357
     * <li>Use {@link #addConst} for a parameter annotated with {@link ConstantParameter}. The value
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   358
     * is bound when the {@link SnippetTemplate} is {@link SnippetTemplate#SnippetTemplate created}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   359
     * <li>Use {@link #addVarargs} for an array parameter annotated with {@link VarargsParameter}. A
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   360
     * separate {@link SnippetTemplate} is {@link SnippetTemplate#SnippetTemplate created} for every
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   361
     * distinct array length. The actual values are bound when the {@link SnippetTemplate} is
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   362
     * {@link SnippetTemplate#instantiate instantiated}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   363
     * </ul>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   364
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   365
    public static class Arguments implements Formattable {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   366
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   367
        protected final SnippetInfo info;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   368
        protected final CacheKey cacheKey;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   369
        protected final Object[] values;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   370
        protected final Stamp[] constStamps;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   371
        protected boolean cacheable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   372
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   373
        protected int nextParamIdx;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   374
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   375
        public Arguments(SnippetInfo info, GuardsStage guardsStage, LoweringTool.LoweringStage loweringStage) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   376
            this.info = info;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   377
            this.cacheKey = new CacheKey(info, guardsStage, loweringStage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   378
            this.values = new Object[info.getParameterCount()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   379
            this.constStamps = new Stamp[info.getParameterCount()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   380
            this.cacheable = true;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   381
            if (info.hasReceiver()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   382
                addConst("this", info.getReceiver());
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   383
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   384
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   385
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   386
        public Arguments add(String name, Object value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   387
            assert check(name, false, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   388
            values[nextParamIdx] = value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   389
            nextParamIdx++;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   390
            return this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   391
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   392
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   393
        public Arguments addConst(String name, Object value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   394
            assert value != null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   395
            return addConst(name, value, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   396
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   397
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   398
        public Arguments addConst(String name, Object value, Stamp stamp) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   399
            assert check(name, true, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   400
            values[nextParamIdx] = value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   401
            constStamps[nextParamIdx] = stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   402
            cacheKey.setParam(nextParamIdx, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   403
            nextParamIdx++;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   404
            return this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   405
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   406
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   407
        public Arguments addVarargs(String name, Class<?> componentType, Stamp argStamp, Object value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   408
            assert check(name, false, true);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   409
            Varargs varargs = new Varargs(componentType, argStamp, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   410
            values[nextParamIdx] = varargs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   411
            // A separate template is necessary for every distinct array length
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   412
            cacheKey.setParam(nextParamIdx, varargs.length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   413
            nextParamIdx++;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   414
            return this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   415
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   416
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   417
        public void setCacheable(boolean cacheable) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   418
            this.cacheable = cacheable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   419
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   420
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   421
        private boolean check(String name, boolean constParam, boolean varargsParam) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   422
            assert nextParamIdx < info.getParameterCount() : "too many parameters: " + name + "  " + this;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   423
            assert info.getParameterName(nextParamIdx) == null || info.getParameterName(nextParamIdx).equals(name) : "wrong parameter name at " + nextParamIdx + " : " + name + "  " + this;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   424
            assert constParam == info.isConstantParameter(nextParamIdx) : "Parameter " + (constParam ? "not " : "") + "annotated with @" + ConstantParameter.class.getSimpleName() + ": " + name +
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   425
                            "  " + this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   426
            assert varargsParam == info.isVarargsParameter(nextParamIdx) : "Parameter " + (varargsParam ? "not " : "") + "annotated with @" + VarargsParameter.class.getSimpleName() + ": " + name +
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   427
                            "  " + this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   428
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   429
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   430
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   431
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   432
        public String toString() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   433
            StringBuilder result = new StringBuilder();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   434
            result.append("Parameters<").append(info.method.format("%h.%n")).append(" [");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   435
            String sep = "";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   436
            for (int i = 0; i < info.getParameterCount(); i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   437
                result.append(sep);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   438
                if (info.isConstantParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   439
                    result.append("const ");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   440
                } else if (info.isVarargsParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   441
                    result.append("varargs ");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   442
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   443
                result.append(info.getParameterName(i)).append(" = ").append(values[i]);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   444
                sep = ", ";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   445
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   446
            result.append(">");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   447
            return result.toString();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   448
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   449
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   450
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   451
        public void formatTo(Formatter formatter, int flags, int width, int precision) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   452
            if ((flags & ALTERNATE) == 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   453
                formatter.format(applyFormattingFlagsAndWidth(toString(), flags, width));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   454
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   455
                StringBuilder sb = new StringBuilder();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   456
                sb.append(info.method.getName()).append('(');
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
                String sep = "";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   458
                for (int i = 0; i < info.getParameterCount(); i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   459
                    if (info.isConstantParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   460
                        sb.append(sep);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   461
                        if (info.getParameterName(i) != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   462
                            sb.append(info.getParameterName(i));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   463
                        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   464
                            sb.append(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   465
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   466
                        sb.append('=').append(values[i]);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   467
                        sep = ", ";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   468
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   469
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   470
                sb.append(")");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   471
                String string = sb.toString();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   472
                if (string.indexOf('%') != -1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   473
                    // Quote any % signs
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   474
                    string = string.replace("%", "%%");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   475
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   476
                formatter.format(applyFormattingFlagsAndWidth(string, flags & ~ALTERNATE, width));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   477
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   478
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   479
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   480
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   481
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   482
     * Wrapper for the prototype value of a {@linkplain VarargsParameter varargs} parameter.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   483
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   484
    static class Varargs {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   485
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   486
        protected final Class<?> componentType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   487
        protected final Stamp stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   488
        protected final Object value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   489
        protected final int length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   490
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   491
        protected Varargs(Class<?> componentType, Stamp stamp, Object value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   492
            this.componentType = componentType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   493
            this.stamp = stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   494
            this.value = value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   495
            if (value instanceof List) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   496
                this.length = ((List<?>) value).size();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   497
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   498
                this.length = Array.getLength(value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   499
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   500
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   501
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   502
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   503
        public String toString() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   504
            if (value instanceof boolean[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   505
                return Arrays.toString((boolean[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   506
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   507
            if (value instanceof byte[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   508
                return Arrays.toString((byte[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   509
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   510
            if (value instanceof char[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   511
                return Arrays.toString((char[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   512
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   513
            if (value instanceof short[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   514
                return Arrays.toString((short[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   515
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   516
            if (value instanceof int[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   517
                return Arrays.toString((int[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   518
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   519
            if (value instanceof long[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   520
                return Arrays.toString((long[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   521
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   522
            if (value instanceof float[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   523
                return Arrays.toString((float[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   524
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   525
            if (value instanceof double[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   526
                return Arrays.toString((double[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   527
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   528
            if (value instanceof Object[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   529
                return Arrays.toString((Object[]) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   530
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   531
            return String.valueOf(value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   532
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   533
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   534
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   535
    @NodeInfo(cycles = CYCLES_IGNORED, size = SIZE_IGNORED)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   536
    static final class VarargsPlaceholderNode extends FloatingNode implements ArrayLengthProvider {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   537
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   538
        public static final NodeClass<VarargsPlaceholderNode> TYPE = NodeClass.create(VarargsPlaceholderNode.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   539
        protected final Varargs varargs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   540
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
        protected VarargsPlaceholderNode(Varargs varargs, MetaAccessProvider metaAccess) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   542
            super(TYPE, StampFactory.objectNonNull(TypeReference.createExactTrusted(metaAccess.lookupJavaType(varargs.componentType).getArrayClass())));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   543
            this.varargs = varargs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   544
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   545
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   546
        @Override
51436
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   547
        public ValueNode findLength(FindLengthMode mode, ConstantReflectionProvider constantReflection) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   548
            return ConstantNode.forInt(varargs.length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   549
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   550
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   551
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   552
    static class CacheKey {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   553
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   554
        private final ResolvedJavaMethod method;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   555
        private final Object[] values;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   556
        private final GuardsStage guardsStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   557
        private final LoweringTool.LoweringStage loweringStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   558
        private int hash;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   559
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   560
        protected CacheKey(SnippetInfo info, GuardsStage guardsStage, LoweringTool.LoweringStage loweringStage) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   561
            this.method = info.method;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   562
            this.guardsStage = guardsStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   563
            this.loweringStage = loweringStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   564
            this.values = new Object[info.getParameterCount()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   565
            this.hash = info.method.hashCode() + 31 * guardsStage.ordinal();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   566
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   567
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   568
        protected void setParam(int paramIdx, Object value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   569
            values[paramIdx] = value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   570
            hash = (hash * 31) ^ (value == null ? 0 : value.hashCode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   571
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   574
        public boolean equals(Object obj) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   575
            if (!(obj instanceof CacheKey)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   576
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   577
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   578
            CacheKey other = (CacheKey) obj;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   579
            if (!method.equals(other.method)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   580
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   581
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   582
            if (guardsStage != other.guardsStage || loweringStage != other.loweringStage) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   583
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   584
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   585
            for (int i = 0; i < values.length; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   586
                if (values[i] != null && !values[i].equals(other.values[i])) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   587
                    return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   588
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   589
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   590
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   591
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   592
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   593
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   594
        public int hashCode() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   595
            return hash;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   596
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   597
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   598
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   599
    private static final TimerKey SnippetTemplateCreationTime = DebugContext.timer("SnippetTemplateCreationTime");
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   600
    private static final CounterKey SnippetTemplates = DebugContext.counter("SnippetTemplateCount");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   601
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   602
    static class Options {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   603
        @Option(help = "Use a LRU cache for snippet templates.")//
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   604
        public static final OptionKey<Boolean> UseSnippetTemplateCache = new OptionKey<>(true);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   605
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   606
        @Option(help = "")//
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   607
        static final OptionKey<Integer> MaxTemplatesPerSnippet = new OptionKey<>(50);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   608
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   609
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   610
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   611
     * Base class for snippet classes. It provides a cache for {@link SnippetTemplate}s.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   612
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   613
    public abstract static class AbstractTemplates implements org.graalvm.compiler.api.replacements.SnippetTemplateCache {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   614
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   615
        protected final OptionValues options;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   616
        protected final Providers providers;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   617
        protected final SnippetReflectionProvider snippetReflection;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   618
        protected final Iterable<DebugHandlersFactory> factories;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   619
        protected final TargetDescription target;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   620
        private final Map<CacheKey, SnippetTemplate> templates;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   621
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   622
        protected AbstractTemplates(OptionValues options, Iterable<DebugHandlersFactory> factories, Providers providers, SnippetReflectionProvider snippetReflection, TargetDescription target) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   623
            this.options = options;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   624
            this.providers = providers;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   625
            this.snippetReflection = snippetReflection;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   626
            this.target = target;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   627
            this.factories = factories;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   628
            if (Options.UseSnippetTemplateCache.getValue(options)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   629
                int size = Options.MaxTemplatesPerSnippet.getValue(options);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   630
                this.templates = Collections.synchronizedMap(new LRUCache<>(size, size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   631
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   632
                this.templates = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   633
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   634
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   635
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   636
        public Providers getProviders() {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   637
            return providers;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   638
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   639
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   640
        public static Method findMethod(Class<? extends Snippets> declaringClass, String methodName, Method except) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   641
            for (Method m : declaringClass.getDeclaredMethods()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   642
                if (m.getName().equals(methodName) && !m.equals(except)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   643
                    return m;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   644
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   645
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   646
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   647
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   648
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   649
        public static ResolvedJavaMethod findMethod(MetaAccessProvider metaAccess, Class<?> declaringClass, String methodName) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   650
            ResolvedJavaType type = metaAccess.lookupJavaType(declaringClass);
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   651
            ResolvedJavaMethod result = null;
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   652
            for (ResolvedJavaMethod m : type.getDeclaredMethods()) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   653
                if (m.getName().equals(methodName)) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   654
                    if (!Assertions.assertionsEnabled()) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   655
                        return m;
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   656
                    } else {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   657
                        assert result == null : "multiple definitions found";
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   658
                        result = m;
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   659
                    }
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   660
                }
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   661
            }
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   662
            if (result == null) {
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   663
                throw new GraalError("Could not find method in " + declaringClass + " named " + methodName);
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   664
            }
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   665
            return result;
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   666
        }
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   667
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   668
        protected SnippetInfo snippet(Class<? extends Snippets> declaringClass, String methodName, LocationIdentity... initialPrivateLocations) {
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   669
            return snippet(declaringClass, methodName, null, null, initialPrivateLocations);
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   670
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   671
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   672
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   673
         * Finds the unique method in {@code declaringClass} named {@code methodName} annotated by
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   674
         * {@link Snippet} and returns a {@link SnippetInfo} value describing it. There must be
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   675
         * exactly one snippet method in {@code declaringClass} with a given name.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   676
         */
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   677
        protected SnippetInfo snippet(Class<? extends Snippets> declaringClass, String methodName, ResolvedJavaMethod original, Object receiver, LocationIdentity... initialPrivateLocations) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   678
            assert methodName != null;
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   679
            ResolvedJavaMethod javaMethod = findMethod(providers.getMetaAccess(), declaringClass, methodName);
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   680
            assert javaMethod != null : "did not find @" + Snippet.class.getSimpleName() + " method in " + declaringClass + " named " + methodName;
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   681
            assert javaMethod.getAnnotation(Snippet.class) != null : javaMethod + " must be annotated with @" + Snippet.class.getSimpleName();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   682
            providers.getReplacements().registerSnippet(javaMethod, original, receiver, GraalOptions.TrackNodeSourcePosition.getValue(options), options);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   683
            LocationIdentity[] privateLocations = GraalOptions.SnippetCounters.getValue(options) ? SnippetCounterNode.addSnippetCounters(initialPrivateLocations) : initialPrivateLocations;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   684
            if (GraalOptions.EagerSnippets.getValue(options)) {
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   685
                return new EagerSnippetInfo(javaMethod, original, privateLocations, receiver);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   686
            } else {
52956
4b0b796dd581 8215224: Update Graal
iveresov
parents: 52910
diff changeset
   687
                return new LazySnippetInfo(javaMethod, original, privateLocations, receiver);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   688
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   689
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   690
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   691
        static final AtomicInteger nextSnippetTemplateId = new AtomicInteger();
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   692
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   693
        private DebugContext openDebugContext(DebugContext outer, Arguments args) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   694
            if (DebugStubsAndSnippets.getValue(options)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   695
                Description description = new Description(args.cacheKey.method, "SnippetTemplate_" + nextSnippetTemplateId.incrementAndGet());
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   696
                return DebugContext.create(options, description, outer.getGlobalMetrics(), DEFAULT_LOG_STREAM, factories);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   697
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   698
            return DebugContext.disabled(options);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   699
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   700
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   701
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   702
         * Gets a template for a given key, creating it first if necessary.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   703
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   704
        @SuppressWarnings("try")
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   705
        public SnippetTemplate template(ValueNode replacee, final Arguments args) {
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   706
            StructuredGraph graph = replacee.graph();
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   707
            DebugContext outer = graph.getDebug();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   708
            SnippetTemplate template = Options.UseSnippetTemplateCache.getValue(options) && args.cacheable ? templates.get(args.cacheKey) : null;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   709
            if (template == null || (graph.trackNodeSourcePosition() && !template.snippet.trackNodeSourcePosition())) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   710
                try (DebugContext debug = openDebugContext(outer, args)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   711
                    try (DebugCloseable a = SnippetTemplateCreationTime.start(debug); DebugContext.Scope s = debug.scope("SnippetSpecialization", args.info.method)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   712
                        SnippetTemplates.increment(debug);
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   713
                        OptionValues snippetOptions = new OptionValues(options, GraalOptions.TraceInlining, GraalOptions.TraceInliningForStubsAndSnippets.getValue(options));
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   714
                        template = new SnippetTemplate(snippetOptions, debug, providers, snippetReflection, args, graph.trackNodeSourcePosition(), replacee);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   715
                        if (Options.UseSnippetTemplateCache.getValue(snippetOptions) && args.cacheable) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   716
                            templates.put(args.cacheKey, template);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   717
                        }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   718
                    } catch (Throwable e) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   719
                        throw debug.handle(e);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   720
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   721
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   722
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   723
            return template;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   724
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   725
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   726
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   727
    private static final class LRUCache<K, V> extends LinkedHashMap<K, V> {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   728
        private static final long serialVersionUID = 1L;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   729
        private final int maxCacheSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   730
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   731
        LRUCache(int initialCapacity, int maxCacheSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   732
            super(initialCapacity, 0.75F, true);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   733
            this.maxCacheSize = maxCacheSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   734
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   735
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   736
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   737
        protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   738
            return size() > maxCacheSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   739
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   740
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   741
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   742
    // These values must be compared with equals() not '==' to support replay compilation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   743
    private static final Object UNUSED_PARAMETER = "UNUSED_PARAMETER";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   744
    private static final Object CONSTANT_PARAMETER = "CONSTANT_PARAMETER";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   745
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   746
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   747
     * Determines if any parameter of a given method is annotated with {@link ConstantParameter}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   748
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   749
    public static boolean hasConstantParameter(ResolvedJavaMethod method) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   750
        for (ConstantParameter p : method.getParameterAnnotations(ConstantParameter.class)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   751
            if (p != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   752
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   753
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   754
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   755
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   756
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   757
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   758
    private final SnippetReflectionProvider snippetReflection;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   759
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   760
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   761
     * Creates a snippet template.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   762
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   763
    @SuppressWarnings("try")
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   764
    protected SnippetTemplate(OptionValues options, DebugContext debug, final Providers providers, SnippetReflectionProvider snippetReflection, Arguments args, boolean trackNodeSourcePosition,
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   765
                    Node replacee) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   766
        this.snippetReflection = snippetReflection;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   767
        this.info = args.info;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   768
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   769
        Object[] constantArgs = getConstantArgs(args);
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
   770
        boolean shouldTrackNodeSourcePosition1 = trackNodeSourcePosition || (providers.getCodeCache() != null && providers.getCodeCache().shouldDebugNonSafepoints());
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   771
        StructuredGraph snippetGraph = providers.getReplacements().getSnippet(args.info.method, args.info.original, constantArgs, shouldTrackNodeSourcePosition1, replacee.getNodeSourcePosition(),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   772
                        options);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   773
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   774
        ResolvedJavaMethod method = snippetGraph.method();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   775
        Signature signature = method.getSignature();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   776
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   777
        // Copy snippet graph, replacing constant parameters with given arguments
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   778
        final StructuredGraph snippetCopy = new StructuredGraph.Builder(options, debug).name(snippetGraph.name).method(snippetGraph.method()).trackNodeSourcePosition(
51736
42d99cb7f50f 8210478: Update Graal
iveresov
parents: 51436
diff changeset
   779
                        snippetGraph.trackNodeSourcePosition()).setIsSubstitution(true).build();
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   780
        assert !GraalOptions.TrackNodeSourcePosition.getValue(options) || snippetCopy.trackNodeSourcePosition();
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   781
        try (DebugContext.Scope scope = debug.scope("SpecializeSnippet", snippetCopy)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   782
            if (!snippetGraph.isUnsafeAccessTrackingEnabled()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   783
                snippetCopy.disableUnsafeAccessTracking();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   784
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   785
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   786
            EconomicMap<Node, Node> nodeReplacements = EconomicMap.create(Equivalence.IDENTITY);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   787
            nodeReplacements.put(snippetGraph.start(), snippetCopy.start());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   788
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   789
            MetaAccessProvider metaAccess = providers.getMetaAccess();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   790
            assert checkTemplate(metaAccess, args, method, signature);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   791
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   792
            int parameterCount = args.info.getParameterCount();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   793
            VarargsPlaceholderNode[] placeholders = new VarargsPlaceholderNode[parameterCount];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   794
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   795
            for (int i = 0; i < parameterCount; i++) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   796
                ParameterNode parameter = snippetGraph.getParameter(i);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   797
                if (parameter != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   798
                    if (args.info.isConstantParameter(i)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   799
                        Object arg = args.values[i];
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   800
                        JavaKind kind = signature.getParameterKind(i);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   801
                        ConstantNode constantNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   802
                        if (arg instanceof Constant) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   803
                            Stamp stamp = args.constStamps[i];
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   804
                            if (stamp == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   805
                                assert arg instanceof JavaConstant : "could not determine type of constant " + arg;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   806
                                constantNode = ConstantNode.forConstant((JavaConstant) arg, metaAccess, snippetCopy);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   807
                            } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   808
                                constantNode = ConstantNode.forConstant(stamp, (Constant) arg, metaAccess, snippetCopy);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   809
                            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   810
                        } else {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   811
                            constantNode = ConstantNode.forConstant(snippetReflection.forBoxed(kind, arg), metaAccess, snippetCopy);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   812
                        }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   813
                        nodeReplacements.put(parameter, constantNode);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   814
                    } else if (args.info.isVarargsParameter(i)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   815
                        Varargs varargs = (Varargs) args.values[i];
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   816
                        VarargsPlaceholderNode placeholder = snippetCopy.unique(new VarargsPlaceholderNode(varargs, providers.getMetaAccess()));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   817
                        nodeReplacements.put(parameter, placeholder);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   818
                        placeholders[i] = placeholder;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   819
                    } else if (args.info.isNonNullParameter(i)) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
   820
                        parameter.setStamp(parameter.stamp(NodeView.DEFAULT).join(StampFactory.objectNonNull()));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   821
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   822
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   823
            }
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   824
            try (InliningLog.UpdateScope updateScope = snippetCopy.getInliningLog().openDefaultUpdateScope()) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   825
                UnmodifiableEconomicMap<Node, Node> duplicates = snippetCopy.addDuplicates(snippetGraph.getNodes(), snippetGraph, snippetGraph.getNodeCount(), nodeReplacements);
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   826
                if (updateScope != null) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   827
                    snippetCopy.getInliningLog().replaceLog(duplicates, snippetGraph.getInliningLog());
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   828
                }
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
   829
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   830
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   831
            debug.dump(DebugContext.INFO_LEVEL, snippetCopy, "Before specialization");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   832
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   833
            // Gather the template parameters
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   834
            parameters = new Object[parameterCount];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   835
            for (int i = 0; i < parameterCount; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   836
                if (args.info.isConstantParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   837
                    parameters[i] = CONSTANT_PARAMETER;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   838
                } else if (args.info.isVarargsParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   839
                    assert snippetCopy.getParameter(i) == null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   840
                    Varargs varargs = (Varargs) args.values[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   841
                    int length = varargs.length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   842
                    ParameterNode[] params = new ParameterNode[length];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   843
                    Stamp stamp = varargs.stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   844
                    for (int j = 0; j < length; j++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   845
                        // Use a decimal friendly numbering make it more obvious how values map
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   846
                        assert parameterCount < 10000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   847
                        int idx = (i + 1) * 10000 + j;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   848
                        assert idx >= parameterCount : "collision in parameter numbering";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   849
                        ParameterNode local = snippetCopy.addOrUnique(new ParameterNode(idx, StampPair.createSingle(stamp)));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   850
                        params[j] = local;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   851
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   852
                    parameters[i] = params;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   853
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   854
                    VarargsPlaceholderNode placeholder = placeholders[i];
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   855
                    if (placeholder != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   856
                        for (Node usage : placeholder.usages().snapshot()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   857
                            if (usage instanceof LoadIndexedNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   858
                                LoadIndexedNode loadIndexed = (LoadIndexedNode) usage;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   859
                                debug.dump(DebugContext.INFO_LEVEL, snippetCopy, "Before replacing %s", loadIndexed);
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
   860
                                LoadSnippetVarargParameterNode loadSnippetParameter = snippetCopy.add(
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
   861
                                                new LoadSnippetVarargParameterNode(params, loadIndexed.index(), loadIndexed.stamp(NodeView.DEFAULT)));
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   862
                                snippetCopy.replaceFixedWithFixed(loadIndexed, loadSnippetParameter);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   863
                                debug.dump(DebugContext.INFO_LEVEL, snippetCopy, "After replacing %s", loadIndexed);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   864
                            } else if (usage instanceof StoreIndexedNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   865
                                /*
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   866
                                 * The template lowering doesn't really treat this as an array so
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   867
                                 * you can't store back into the varargs. Allocate your own array if
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   868
                                 * you really need this and EA should eliminate it.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   869
                                 */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   870
                                throw new GraalError("Can't store into VarargsParameter array");
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   871
                            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   872
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   873
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   874
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   875
                    ParameterNode local = snippetCopy.getParameter(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   876
                    if (local == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   877
                        // Parameter value was eliminated
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   878
                        parameters[i] = UNUSED_PARAMETER;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   879
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   880
                        parameters[i] = local;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   881
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   882
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   883
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   884
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   885
            explodeLoops(snippetCopy, providers);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   886
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   887
            GuardsStage guardsStage = args.cacheKey.guardsStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   888
            // Perform lowering on the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   889
            if (!guardsStage.allowsFloatingGuards()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   890
                new GuardLoweringPhase().apply(snippetCopy, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   891
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   892
            snippetCopy.setGuardsStage(guardsStage);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   893
            try (DebugContext.Scope s = debug.scope("LoweringSnippetTemplate", snippetCopy)) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   894
                new LoweringPhase(new CanonicalizerPhase(), args.cacheKey.loweringStage).apply(snippetCopy, providers);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   895
            } catch (Throwable e) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   896
                throw debug.handle(e);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   897
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   898
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   899
            ArrayList<StateSplit> curSideEffectNodes = new ArrayList<>();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   900
            ArrayList<DeoptimizingNode> curDeoptNodes = new ArrayList<>();
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   901
            ArrayList<ValueNode> curPlaceholderStampedNodes = new ArrayList<>();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   902
            for (Node node : snippetCopy.getNodes()) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   903
                if (node instanceof ValueNode) {
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   904
                    ValueNode valueNode = (ValueNode) node;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
   905
                    if (valueNode.stamp(NodeView.DEFAULT) == PlaceholderStamp.singleton()) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   906
                        curPlaceholderStampedNodes.add(valueNode);
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   907
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   908
                }
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   909
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   910
                if (node instanceof StateSplit) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   911
                    StateSplit stateSplit = (StateSplit) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   912
                    FrameState frameState = stateSplit.stateAfter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   913
                    if (stateSplit.hasSideEffect()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   914
                        curSideEffectNodes.add((StateSplit) node);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   915
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   916
                    if (frameState != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   917
                        stateSplit.setStateAfter(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   918
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   919
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   920
                if (node instanceof DeoptimizingNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   921
                    DeoptimizingNode deoptNode = (DeoptimizingNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   922
                    if (deoptNode.canDeoptimize()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   923
                        curDeoptNodes.add(deoptNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   924
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   925
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   926
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   927
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   928
            new DeadCodeEliminationPhase(Required).apply(snippetCopy);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   929
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   930
            assert checkAllVarargPlaceholdersAreDeleted(parameterCount, placeholders);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   931
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   932
            new FloatingReadPhase(true, true).apply(snippetCopy);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   933
            new RemoveValueProxyPhase().apply(snippetCopy);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   934
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   935
            MemoryAnchorNode anchor = snippetCopy.add(new MemoryAnchorNode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   936
            snippetCopy.start().replaceAtUsages(InputType.Memory, anchor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   937
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   938
            this.snippet = snippetCopy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   939
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   940
            StartNode entryPointNode = snippet.start();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   941
            if (anchor.hasNoUsages()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   942
                anchor.safeDelete();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   943
                this.memoryAnchor = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   944
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   945
                // Find out if all the return memory maps point to the anchor (i.e., there's no kill
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   946
                // anywhere)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   947
                boolean needsMemoryMaps = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   948
                for (ReturnNode retNode : snippet.getNodes(ReturnNode.TYPE)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   949
                    MemoryMapNode memoryMap = retNode.getMemoryMap();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   950
                    if (memoryMap.getLocations().size() > 1 || memoryMap.getLastLocationAccess(LocationIdentity.any()) != anchor) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   951
                        needsMemoryMaps = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   952
                        break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   953
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   954
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   955
                boolean needsAnchor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   956
                if (needsMemoryMaps) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   957
                    needsAnchor = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   958
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   959
                    // Check that all those memory maps where the only usages of the anchor
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   960
                    needsAnchor = anchor.usages().filter(isNotA(MemoryMapNode.class)).isNotEmpty();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   961
                    // Remove the useless memory map
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   962
                    MemoryMapNode memoryMap = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   963
                    for (ReturnNode retNode : snippet.getNodes(ReturnNode.TYPE)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   964
                        if (memoryMap == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   965
                            memoryMap = retNode.getMemoryMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   966
                        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   967
                            assert memoryMap == retNode.getMemoryMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   968
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   969
                        retNode.setMemoryMap(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   970
                    }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   971
                    if (memoryMap != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   972
                        memoryMap.safeDelete();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   973
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   974
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   975
                if (needsAnchor) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   976
                    snippetCopy.addAfterFixed(snippetCopy.start(), anchor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   977
                    this.memoryAnchor = anchor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   978
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   979
                    anchor.safeDelete();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   980
                    this.memoryAnchor = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   981
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   982
            }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   983
            debug.dump(DebugContext.INFO_LEVEL, snippet, "SnippetTemplate after fixing memory anchoring");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   984
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   985
            List<ReturnNode> returnNodes = snippet.getNodes(ReturnNode.TYPE).snapshot();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   986
            if (returnNodes.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   987
                this.returnNode = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   988
            } else if (returnNodes.size() == 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   989
                this.returnNode = returnNodes.get(0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   990
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   991
                AbstractMergeNode merge = snippet.add(new MergeNode());
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   992
                List<MemoryMapNode> memMaps = new ArrayList<>();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   993
                for (ReturnNode retNode : returnNodes) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   994
                    MemoryMapNode memoryMapNode = retNode.getMemoryMap();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   995
                    if (memoryMapNode != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   996
                        memMaps.add(memoryMapNode);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   997
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   998
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   999
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1000
                ValueNode returnValue = InliningUtil.mergeReturns(merge, returnNodes);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1001
                this.returnNode = snippet.add(new ReturnNode(returnValue));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1002
                if (!memMaps.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1003
                    MemoryMapImpl mmap = FloatingReadPhase.mergeMemoryMaps(merge, memMaps);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1004
                    MemoryMapNode memoryMap = snippet.unique(new MemoryMapNode(mmap.getMap()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1005
                    this.returnNode.setMemoryMap(memoryMap);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1006
                    for (MemoryMapNode mm : memMaps) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1007
                        if (mm != memoryMap && mm.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1008
                            assert mm.hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1009
                            GraphUtil.killWithUnusedFloatingInputs(mm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1010
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1011
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1012
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1013
                merge.setNext(this.returnNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1014
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1015
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1016
            assert verifyIntrinsicsProcessed(snippetCopy);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1017
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1018
            this.sideEffectNodes = curSideEffectNodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1019
            this.deoptNodes = curDeoptNodes;
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1020
            this.placeholderStampedNodes = curPlaceholderStampedNodes;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1021
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1022
            nodes = new ArrayList<>(snippet.getNodeCount());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1023
            for (Node node : snippet.getNodes()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1024
                if (node != entryPointNode && node != entryPointNode.stateAfter()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1025
                    nodes.add(node);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1026
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1027
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1028
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1029
            if (debug.areMetricsEnabled()) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1030
                DebugContext.counter("SnippetTemplateNodeCount[%#s]", args).add(debug, nodes.size());
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1031
            }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1032
            debug.dump(DebugContext.INFO_LEVEL, snippet, "SnippetTemplate final state");
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1033
            this.snippet.freeze();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1034
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1035
        } catch (Throwable ex) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1036
            throw debug.handle(ex);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1037
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1038
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1039
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1040
    private static boolean verifyIntrinsicsProcessed(StructuredGraph snippetCopy) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1041
        for (MethodCallTargetNode target : snippetCopy.getNodes(MethodCallTargetNode.TYPE)) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1042
            ResolvedJavaMethod targetMethod = target.targetMethod();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1043
            if (targetMethod != null) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1044
                assert targetMethod.getAnnotation(Fold.class) == null && targetMethod.getAnnotation(NodeIntrinsic.class) == null : "plugin should have been processed";
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1045
            }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1046
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1047
        return true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1048
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1049
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1050
    public static void explodeLoops(final StructuredGraph snippetCopy, CoreProviders providers) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1051
        // Do any required loop explosion
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1052
        boolean exploded = false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1053
        do {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1054
            exploded = false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1055
            ExplodeLoopNode explodeLoop = snippetCopy.getNodes().filter(ExplodeLoopNode.class).first();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1056
            if (explodeLoop != null) { // Earlier canonicalization may have removed the loop
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1057
                // altogether
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1058
                LoopBeginNode loopBegin = explodeLoop.findLoopBegin();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1059
                if (loopBegin != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1060
                    LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1061
                    Mark mark = snippetCopy.getMark();
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1062
                    LoopTransformations.fullUnroll(loop, providers, new CanonicalizerPhase());
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1063
                    new CanonicalizerPhase().applyIncremental(snippetCopy, providers, mark, false);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1064
                    loop.deleteUnusedNodes();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1065
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1066
                GraphUtil.removeFixedWithUnusedInputs(explodeLoop);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1067
                exploded = true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1068
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1069
        } while (exploded);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1070
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1071
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1072
    protected Object[] getConstantArgs(Arguments args) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1073
        Object[] constantArgs = args.values.clone();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1074
        for (int i = 0; i < args.info.getParameterCount(); i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1075
            if (!args.info.isConstantParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1076
                constantArgs[i] = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1077
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1078
                assert constantArgs[i] != null : "Can't pass raw null through as argument";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1079
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1080
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1081
        return constantArgs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1082
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1083
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1084
    private static boolean checkAllVarargPlaceholdersAreDeleted(int parameterCount, VarargsPlaceholderNode[] placeholders) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1085
        for (int i = 0; i < parameterCount; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1086
            if (placeholders[i] != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1087
                assert placeholders[i].isDeleted() : placeholders[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1088
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1089
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1090
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1091
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1092
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1093
    private static boolean checkConstantArgument(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int paramIndex, String name, Object arg, JavaKind kind) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1094
        ResolvedJavaType type = signature.getParameterType(paramIndex, method.getDeclaringClass()).resolve(method.getDeclaringClass());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1095
        if (metaAccess.lookupJavaType(WordBase.class).isAssignableFrom(type)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1096
            assert arg instanceof JavaConstant : method + ": word constant parameters must be passed boxed in a Constant value: " + arg;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1097
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1098
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1099
        if (kind != JavaKind.Object) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1100
            assert arg != null && kind.toBoxedJavaClass() == arg.getClass() : method + ": wrong value kind for " + name + ": expected " + kind + ", got " +
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1101
                            (arg == null ? "null" : arg.getClass().getSimpleName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1102
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1103
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1104
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1105
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1106
    private static boolean checkVarargs(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int i, String name, Varargs varargs) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1107
        ResolvedJavaType type = (ResolvedJavaType) signature.getParameterType(i, method.getDeclaringClass());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1108
        assert type.isArray() : "varargs parameter must be an array type";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1109
        assert type.getComponentType().isAssignableFrom(metaAccess.lookupJavaType(varargs.componentType)) : "componentType for " + name + " not matching " + type.toJavaName() + " instance: " +
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1110
                        varargs.componentType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1111
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1112
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1113
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1114
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1115
     * The graph built from the snippet method.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1116
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1117
    private final StructuredGraph snippet;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1118
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1119
    private final SnippetInfo info;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1120
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1121
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1122
     * The named parameters of this template that must be bound to values during instantiation. For
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1123
     * a parameter that is still live after specialization, the value in this map is either a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1124
     * {@link ParameterNode} instance or a {@link ParameterNode} array. For an eliminated parameter,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1125
     * the value is identical to the key.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1126
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1127
    private final Object[] parameters;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1128
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1129
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1130
     * The return node (if any) of the snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1131
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1132
    private final ReturnNode returnNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1133
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1134
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1135
     * The memory anchor (if any) of the snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1136
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1137
    private final MemoryAnchorNode memoryAnchor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1138
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1139
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1140
     * Nodes that inherit the {@link StateSplit#stateAfter()} from the replacee during
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1141
     * instantiation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1142
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1143
    private final ArrayList<StateSplit> sideEffectNodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1144
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1145
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1146
     * Nodes that inherit a deoptimization {@link FrameState} from the replacee during
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1147
     * instantiation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1148
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1149
    private final ArrayList<DeoptimizingNode> deoptNodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1150
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1151
    /**
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1152
     * Nodes that have a stamp originating from a {@link Placeholder}.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1153
     */
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1154
    private final ArrayList<ValueNode> placeholderStampedNodes;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1155
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1156
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1157
     * The nodes to be inlined when this specialization is instantiated.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1158
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1159
    private final ArrayList<Node> nodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1160
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1161
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1162
     * Gets the instantiation-time bindings to this template's parameters.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1163
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1164
     * @return the map that will be used to bind arguments to parameters when inlining this template
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1165
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1166
    private EconomicMap<Node, Node> bind(StructuredGraph replaceeGraph, MetaAccessProvider metaAccess, Arguments args) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1167
        EconomicMap<Node, Node> replacements = EconomicMap.create(Equivalence.IDENTITY);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1168
        assert args.info.getParameterCount() == parameters.length : "number of args (" + args.info.getParameterCount() + ") != number of parameters (" + parameters.length + ")";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1169
        for (int i = 0; i < parameters.length; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1170
            Object parameter = parameters[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1171
            assert parameter != null : this + " has no parameter named " + args.info.getParameterName(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1172
            Object argument = args.values[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1173
            if (parameter instanceof ParameterNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1174
                if (argument instanceof ValueNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1175
                    replacements.put((ParameterNode) parameter, (ValueNode) argument);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1176
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1177
                    JavaKind kind = ((ParameterNode) parameter).getStackKind();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1178
                    assert argument != null || kind == JavaKind.Object : this + " cannot accept null for non-object parameter named " + args.info.getParameterName(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1179
                    JavaConstant constant = forBoxed(argument, kind);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1180
                    replacements.put((ParameterNode) parameter, ConstantNode.forConstant(constant, metaAccess, replaceeGraph));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1181
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1182
            } else if (parameter instanceof ParameterNode[]) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1183
                ParameterNode[] params = (ParameterNode[]) parameter;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1184
                Varargs varargs = (Varargs) argument;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1185
                int length = params.length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1186
                List<?> list = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1187
                Object array = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1188
                if (varargs.value instanceof List) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1189
                    list = (List<?>) varargs.value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1190
                    assert list.size() == length : length + " != " + list.size();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1191
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1192
                    array = varargs.value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1193
                    assert array != null && array.getClass().isArray();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1194
                    assert Array.getLength(array) == length : length + " != " + Array.getLength(array);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1195
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1196
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1197
                for (int j = 0; j < length; j++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1198
                    ParameterNode param = params[j];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1199
                    assert param != null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1200
                    Object value = list != null ? list.get(j) : Array.get(array, j);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1201
                    if (value instanceof ValueNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1202
                        replacements.put(param, (ValueNode) value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1203
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1204
                        JavaConstant constant = forBoxed(value, param.getStackKind());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1205
                        ConstantNode element = ConstantNode.forConstant(constant, metaAccess, replaceeGraph);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1206
                        replacements.put(param, element);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1207
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1208
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1209
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1210
                assert parameter.equals(CONSTANT_PARAMETER) || parameter.equals(UNUSED_PARAMETER) : "unexpected entry for parameter: " + args.info.getParameterName(i) + " -> " + parameter;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1211
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1212
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1213
        return replacements;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1214
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1215
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1216
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1217
     * Converts a Java boxed value to a {@link JavaConstant} of the right kind. This adjusts for the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1218
     * limitation that a {@link Local}'s kind is a {@linkplain JavaKind#getStackKind() stack kind}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1219
     * and so cannot be used for re-boxing primitives smaller than an int.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1220
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1221
     * @param argument a Java boxed value
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1222
     * @param localKind the kind of the {@link Local} to which {@code argument} will be bound
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1223
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1224
    protected JavaConstant forBoxed(Object argument, JavaKind localKind) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1225
        assert localKind == localKind.getStackKind();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1226
        if (localKind == JavaKind.Int) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1227
            return JavaConstant.forBoxedPrimitive(argument);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1228
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1229
        return snippetReflection.forBoxed(localKind, argument);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1230
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1231
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1232
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1233
     * Logic for replacing a snippet-lowered node at its usages with the return value of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1234
     * snippet. An alternative to the {@linkplain SnippetTemplate#DEFAULT_REPLACER default}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1235
     * replacement logic can be used to handle mismatches between the stamp of the node being
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1236
     * lowered and the stamp of the snippet's return value.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1237
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1238
    public interface UsageReplacer {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1239
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1240
         * Replaces all usages of {@code oldNode} with direct or indirect usages of {@code newNode}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1241
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1242
        void replace(ValueNode oldNode, ValueNode newNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1243
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1244
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1245
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1246
     * Represents the default {@link UsageReplacer usage replacer} logic which simply delegates to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1247
     * {@link Node#replaceAtUsages(Node)}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1248
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1249
    public static final UsageReplacer DEFAULT_REPLACER = new UsageReplacer() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1250
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1251
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1252
        public void replace(ValueNode oldNode, ValueNode newNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1253
            if (newNode == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1254
                assert oldNode.hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1255
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1256
                oldNode.replaceAtUsages(newNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1257
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1258
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1259
    };
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1260
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1261
    private boolean assertSnippetKills(ValueNode replacee) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1262
        if (!replacee.graph().isAfterFloatingReadPhase()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1263
            // no floating reads yet, ignore locations created while lowering
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1264
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1265
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1266
        if (returnNode == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1267
            // The snippet terminates control flow
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1268
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1269
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1270
        MemoryMapNode memoryMap = returnNode.getMemoryMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1271
        if (memoryMap == null || memoryMap.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1272
            // there are no kills in the snippet graph
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1273
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1274
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1275
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1276
        EconomicSet<LocationIdentity> kills = EconomicSet.create(Equivalence.DEFAULT);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1277
        kills.addAll(memoryMap.getLocations());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1278
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1279
        if (replacee instanceof MemoryCheckpoint.Single) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1280
            // check if some node in snippet graph also kills the same location
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1281
            LocationIdentity locationIdentity = ((MemoryCheckpoint.Single) replacee).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1282
            if (locationIdentity.isAny()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1283
                assert !(memoryMap.getLastLocationAccess(any()) instanceof MemoryAnchorNode) : replacee + " kills ANY_LOCATION, but snippet does not";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1284
                // if the replacee kills ANY_LOCATION, the snippet can kill arbitrary locations
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1285
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1286
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1287
            assert kills.contains(locationIdentity) : replacee + " kills " + locationIdentity + ", but snippet doesn't contain a kill to this location";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1288
            kills.remove(locationIdentity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1289
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1290
        assert !(replacee instanceof MemoryCheckpoint.Multi) : replacee + " multi not supported (yet)";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1291
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1292
        // remove ANY_LOCATION if it's just a kill by the start node
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1293
        if (memoryMap.getLastLocationAccess(any()) instanceof MemoryAnchorNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1294
            kills.remove(any());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1295
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1296
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1297
        // node can only lower to a ANY_LOCATION kill if the replacee also kills ANY_LOCATION
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1298
        assert !kills.contains(any()) : "snippet graph contains a kill to ANY_LOCATION, but replacee (" + replacee + ") doesn't kill ANY_LOCATION.  kills: " + kills;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1299
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1300
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1301
         * Kills to private locations are safe, since there can be no floating read to these
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1302
         * locations except reads that are introduced by the snippet itself or related snippets in
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1303
         * the same lowering round. These reads are anchored to a MemoryAnchor at the beginning of
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1304
         * their snippet, so they can not float above a kill in another instance of the same
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1305
         * snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1306
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1307
        for (LocationIdentity p : this.info.privateLocations) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1308
            kills.remove(p);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1309
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1310
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1311
        assert kills.isEmpty() : "snippet graph kills non-private locations " + kills + " that replacee (" + replacee + ") doesn't kill";
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1312
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1313
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1314
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1315
    private static class MemoryInputMap implements MemoryMap {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1316
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1317
        private final LocationIdentity locationIdentity;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1318
        private final MemoryNode lastLocationAccess;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1319
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1320
        MemoryInputMap(ValueNode replacee) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1321
            if (replacee instanceof MemoryAccess) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1322
                MemoryAccess access = (MemoryAccess) replacee;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1323
                locationIdentity = access.getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1324
                lastLocationAccess = access.getLastLocationAccess();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1325
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1326
                locationIdentity = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1327
                lastLocationAccess = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1328
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1329
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1330
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1331
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1332
        public MemoryNode getLastLocationAccess(LocationIdentity location) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1333
            if (locationIdentity != null && locationIdentity.equals(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1334
                return lastLocationAccess;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1335
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1336
                return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1337
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1338
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1339
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1340
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1341
        public Collection<LocationIdentity> getLocations() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1342
            if (locationIdentity == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1343
                return Collections.emptySet();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1344
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1345
                return Collections.singleton(locationIdentity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1346
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1347
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1348
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1349
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1350
    private class MemoryOutputMap extends MemoryInputMap {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1351
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1352
        private final UnmodifiableEconomicMap<Node, Node> duplicates;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1353
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1354
        MemoryOutputMap(ValueNode replacee, UnmodifiableEconomicMap<Node, Node> duplicates) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1355
            super(replacee);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1356
            this.duplicates = duplicates;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1357
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1358
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1359
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1360
        public MemoryNode getLastLocationAccess(LocationIdentity locationIdentity) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1361
            MemoryMapNode memoryMap = returnNode.getMemoryMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1362
            assert memoryMap != null : "no memory map stored for this snippet graph (snippet doesn't have a ReturnNode?)";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1363
            MemoryNode lastLocationAccess = memoryMap.getLastLocationAccess(locationIdentity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1364
            assert lastLocationAccess != null : locationIdentity;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1365
            if (lastLocationAccess == memoryAnchor) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1366
                return super.getLastLocationAccess(locationIdentity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1367
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1368
                return (MemoryNode) duplicates.get(ValueNodeUtil.asNode(lastLocationAccess));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1369
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1370
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1371
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1372
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1373
        public Collection<LocationIdentity> getLocations() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1374
            return returnNode.getMemoryMap().getLocations();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1375
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1376
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1377
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1378
    private void rewireMemoryGraph(ValueNode replacee, UnmodifiableEconomicMap<Node, Node> duplicates) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1379
        if (replacee.graph().isAfterFloatingReadPhase()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1380
            // rewire outgoing memory edges
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1381
            replaceMemoryUsages(replacee, new MemoryOutputMap(replacee, duplicates));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1382
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1383
            if (returnNode != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1384
                ReturnNode ret = (ReturnNode) duplicates.get(returnNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1385
                if (ret != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1386
                    MemoryMapNode memoryMap = ret.getMemoryMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1387
                    if (memoryMap != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1388
                        ret.setMemoryMap(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1389
                        memoryMap.safeDelete();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1390
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1391
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1392
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1393
            if (memoryAnchor != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1394
                // rewire incoming memory edges
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1395
                MemoryAnchorNode memoryDuplicate = (MemoryAnchorNode) duplicates.get(memoryAnchor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1396
                replaceMemoryUsages(memoryDuplicate, new MemoryInputMap(replacee));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1397
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1398
                if (memoryDuplicate.hasNoUsages()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1399
                    if (memoryDuplicate.next() != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1400
                        memoryDuplicate.graph().removeFixed(memoryDuplicate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1401
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1402
                        // this was a dummy memory node used when instantiating pure data-flow
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1403
                        // snippets: it was not attached to the control flow.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1404
                        memoryDuplicate.safeDelete();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1405
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1406
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1407
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1408
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1409
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1410
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1411
    private static LocationIdentity getLocationIdentity(Node node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1412
        if (node instanceof MemoryAccess) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1413
            return ((MemoryAccess) node).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1414
        } else if (node instanceof MemoryProxy) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1415
            return ((MemoryProxy) node).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1416
        } else if (node instanceof MemoryPhiNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1417
            return ((MemoryPhiNode) node).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1418
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1419
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1420
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1421
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1422
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1423
    private void replaceMemoryUsages(ValueNode node, MemoryMap map) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1424
        for (Node usage : node.usages().snapshot()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1425
            if (usage instanceof MemoryMapNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1426
                continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1427
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1428
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1429
            LocationIdentity location = getLocationIdentity(usage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1430
            if (location != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1431
                for (Position pos : usage.inputPositions()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1432
                    if (pos.getInputType() == InputType.Memory && pos.get(usage) == node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1433
                        MemoryNode replacement = map.getLastLocationAccess(location);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1434
                        if (replacement == null) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1435
                            assert mayRemoveLocation || LocationIdentity.any().equals(location) ||
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1436
                                            CollectionsUtil.anyMatch(info.privateLocations, Predicate.isEqual(location)) : "Snippet " +
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1437
                                                            info.method.format("%h.%n") + " contains access to the non-private location " +
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1438
                                                            location + ", but replacee doesn't access this location." + map.getLocations();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1439
                        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1440
                            pos.set(usage, replacement.asNode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1441
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1442
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1443
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1444
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1445
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1446
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1447
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1448
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1449
     * Replaces a given fixed node with this specialized snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1450
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1451
     * @param metaAccess
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1452
     * @param replacee the node that will be replaced
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1453
     * @param replacer object that replaces the usages of {@code replacee}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1454
     * @param args the arguments to be bound to the flattened positional parameters of the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1455
     * @return the map of duplicated nodes (original -&gt; duplicate)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1456
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1457
    @SuppressWarnings("try")
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1458
    public UnmodifiableEconomicMap<Node, Node> instantiate(MetaAccessProvider metaAccess, FixedNode replacee, UsageReplacer replacer, Arguments args) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1459
        return instantiate(metaAccess, replacee, replacer, args, true);
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1460
    }
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1461
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1462
    /**
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1463
     * Replaces a given fixed node with this specialized snippet.
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1464
     *
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1465
     * @param metaAccess
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1466
     * @param replacee the node that will be replaced
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1467
     * @param replacer object that replaces the usages of {@code replacee}
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1468
     * @param args the arguments to be bound to the flattened positional parameters of the snippet
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1469
     * @param killReplacee is true, the replacee node is deleted
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1470
     * @return the map of duplicated nodes (original -&gt; duplicate)
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1471
     */
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1472
    @SuppressWarnings("try")
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1473
    public UnmodifiableEconomicMap<Node, Node> instantiate(MetaAccessProvider metaAccess, FixedNode replacee, UsageReplacer replacer, Arguments args, boolean killReplacee) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1474
        DebugContext debug = replacee.getDebug();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1475
        assert assertSnippetKills(replacee);
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
  1476
        try (DebugCloseable a = args.info.instantiationTimer.start(debug)) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1477
            args.info.instantiationCounter.increment(debug);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1478
            // Inline the snippet nodes, replacing parameters with the given args in the process
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1479
            StartNode entryPointNode = snippet.start();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1480
            FixedNode firstCFGNode = entryPointNode.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1481
            StructuredGraph replaceeGraph = replacee.graph();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1482
            EconomicMap<Node, Node> replacements = bind(replaceeGraph, metaAccess, args);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1483
            replacements.put(entryPointNode, AbstractBeginNode.prevBegin(replacee));
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1484
            UnmodifiableEconomicMap<Node, Node> duplicates = inlineSnippet(replacee, debug, replaceeGraph, replacements);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1485
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1486
            // Re-wire the control flow graph around the replacee
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1487
            FixedNode firstCFGNodeDuplicate = (FixedNode) duplicates.get(firstCFGNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1488
            replacee.replaceAtPredecessor(firstCFGNodeDuplicate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1489
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1490
            rewireFrameStates(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1491
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1492
            updateStamps(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1493
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1494
            rewireMemoryGraph(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1495
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1496
            // Replace all usages of the replacee with the value returned by the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1497
            ValueNode returnValue = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1498
            if (returnNode != null && !(replacee instanceof ControlSinkNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1499
                ReturnNode returnDuplicate = (ReturnNode) duplicates.get(returnNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1500
                returnValue = returnDuplicate.result();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1501
                if (returnValue == null && replacee.usages().isNotEmpty() && replacee instanceof MemoryCheckpoint) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1502
                    replacer.replace(replacee, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1503
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1504
                    assert returnValue != null || replacee.hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1505
                    replacer.replace(replacee, returnValue);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1506
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1507
                if (returnDuplicate.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1508
                    FixedNode next = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1509
                    if (replacee instanceof FixedWithNextNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1510
                        FixedWithNextNode fwn = (FixedWithNextNode) replacee;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1511
                        next = fwn.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1512
                        fwn.setNext(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1513
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1514
                    returnDuplicate.replaceAndDelete(next);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1515
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1516
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1517
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1518
            if (killReplacee) {
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1519
                // Remove the replacee from its graph
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1520
                GraphUtil.killCFG(replacee);
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1521
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1522
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1523
            debug.dump(DebugContext.DETAILED_LEVEL, replaceeGraph, "After lowering %s with %s", replacee, this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1524
            return duplicates;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1525
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1526
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1527
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1528
    private UnmodifiableEconomicMap<Node, Node> inlineSnippet(Node replacee, DebugContext debug, StructuredGraph replaceeGraph, EconomicMap<Node, Node> replacements) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1529
        Mark mark = replaceeGraph.getMark();
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1530
        try (InliningLog.UpdateScope scope = replaceeGraph.getInliningLog().openUpdateScope((oldNode, newNode) -> {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1531
            InliningLog log = replaceeGraph.getInliningLog();
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1532
            if (oldNode == null) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1533
                log.trackNewCallsite(newNode);
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1534
            }
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1535
        })) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1536
            UnmodifiableEconomicMap<Node, Node> duplicates = replaceeGraph.addDuplicates(nodes, snippet, snippet.getNodeCount(), replacements);
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1537
            if (scope != null) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1538
                replaceeGraph.getInliningLog().addLog(duplicates, snippet.getInliningLog());
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1539
            }
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1540
            NodeSourcePosition position = replacee.getNodeSourcePosition();
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
  1541
            InliningUtil.updateSourcePosition(replaceeGraph, duplicates, mark, position, true);
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1542
            debug.dump(DebugContext.DETAILED_LEVEL, replaceeGraph, "After inlining snippet %s", snippet.method());
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1543
            return duplicates;
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1544
        }
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1545
    }
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1546
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1547
    private void propagateStamp(Node node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1548
        if (node instanceof PhiNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1549
            PhiNode phi = (PhiNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1550
            if (phi.inferStamp()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1551
                for (Node usage : node.usages()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1552
                    propagateStamp(usage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1553
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1554
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1555
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1556
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1557
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1558
    private void updateStamps(ValueNode replacee, UnmodifiableEconomicMap<Node, Node> duplicates) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1559
        for (ValueNode node : placeholderStampedNodes) {
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1560
            ValueNode dup = (ValueNode) duplicates.get(node);
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47667
diff changeset
  1561
            Stamp replaceeStamp = replacee.stamp(NodeView.DEFAULT);
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1562
            if (node instanceof Placeholder) {
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1563
                Placeholder placeholderDup = (Placeholder) dup;
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1564
                placeholderDup.makeReplacement(replaceeStamp);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1565
            } else {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1566
                dup.setStamp(replaceeStamp);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1567
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1568
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1569
        for (ParameterNode paramNode : snippet.getNodes(ParameterNode.TYPE)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1570
            for (Node usage : paramNode.usages()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1571
                Node usageDup = duplicates.get(usage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1572
                propagateStamp(usageDup);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1573
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1574
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1575
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1576
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1577
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1578
     * Gets a copy of the specialized graph.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1579
     */
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1580
    public StructuredGraph copySpecializedGraph(DebugContext debugForCopy) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1581
        return (StructuredGraph) snippet.copy(debugForCopy);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1582
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1583
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1584
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1585
     * Replaces a given floating node with this specialized snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1586
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1587
     * @param metaAccess
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1588
     * @param replacee the node that will be replaced
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1589
     * @param replacer object that replaces the usages of {@code replacee}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1590
     * @param tool lowering tool used to insert the snippet into the control-flow
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1591
     * @param args the arguments to be bound to the flattened positional parameters of the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1592
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1593
    @SuppressWarnings("try")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1594
    public void instantiate(MetaAccessProvider metaAccess, FloatingNode replacee, UsageReplacer replacer, LoweringTool tool, Arguments args) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1595
        DebugContext debug = replacee.getDebug();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1596
        assert assertSnippetKills(replacee);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1597
        try (DebugCloseable a = args.info.instantiationTimer.start(debug)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1598
            args.info.instantiationCounter.increment(debug);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1599
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1600
            // Inline the snippet nodes, replacing parameters with the given args in the process
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1601
            StartNode entryPointNode = snippet.start();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1602
            FixedNode firstCFGNode = entryPointNode.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1603
            StructuredGraph replaceeGraph = replacee.graph();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1604
            EconomicMap<Node, Node> replacements = bind(replaceeGraph, metaAccess, args);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1605
            replacements.put(entryPointNode, tool.getCurrentGuardAnchor().asNode());
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1606
            UnmodifiableEconomicMap<Node, Node> duplicates = inlineSnippet(replacee, debug, replaceeGraph, replacements);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1607
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1608
            FixedWithNextNode lastFixedNode = tool.lastFixedNode();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1609
            assert lastFixedNode != null && lastFixedNode.isAlive() : replaceeGraph + " lastFixed=" + lastFixedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1610
            FixedNode next = lastFixedNode.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1611
            lastFixedNode.setNext(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1612
            FixedNode firstCFGNodeDuplicate = (FixedNode) duplicates.get(firstCFGNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1613
            replaceeGraph.addAfterFixed(lastFixedNode, firstCFGNodeDuplicate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1614
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1615
            // floating nodes are not state-splits not need to re-wire frame states
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1616
            assert !(replacee instanceof StateSplit);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1617
            updateStamps(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1618
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1619
            rewireMemoryGraph(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1620
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1621
            // Replace all usages of the replacee with the value returned by the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1622
            ReturnNode returnDuplicate = (ReturnNode) duplicates.get(returnNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1623
            ValueNode returnValue = returnDuplicate.result();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1624
            assert returnValue != null || replacee.hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1625
            replacer.replace(replacee, returnValue);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1626
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1627
            if (returnDuplicate.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1628
                returnDuplicate.replaceAndDelete(next);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1629
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1630
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1631
            debug.dump(DebugContext.DETAILED_LEVEL, replaceeGraph, "After lowering %s with %s", replacee, this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1632
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1633
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1634
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1635
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1636
     * Replaces a given floating node with this specialized snippet.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1637
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1638
     * This snippet must be pure data-flow
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1639
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1640
     * @param metaAccess
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1641
     * @param replacee the node that will be replaced
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1642
     * @param replacer object that replaces the usages of {@code replacee}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1643
     * @param args the arguments to be bound to the flattened positional parameters of the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1644
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1645
    @SuppressWarnings("try")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1646
    public void instantiate(MetaAccessProvider metaAccess, FloatingNode replacee, UsageReplacer replacer, Arguments args) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1647
        DebugContext debug = replacee.getDebug();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1648
        assert assertSnippetKills(replacee);
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1649
        try (DebugCloseable a = args.info.instantiationTimer.start(debug)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1650
            args.info.instantiationCounter.increment(debug);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1651
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1652
            // Inline the snippet nodes, replacing parameters with the given args in the process
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1653
            StartNode entryPointNode = snippet.start();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1654
            assert entryPointNode.next() == (memoryAnchor == null ? returnNode : memoryAnchor) : entryPointNode.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1655
            StructuredGraph replaceeGraph = replacee.graph();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1656
            EconomicMap<Node, Node> replacements = bind(replaceeGraph, metaAccess, args);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1657
            MemoryAnchorNode anchorDuplicate = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1658
            if (memoryAnchor != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1659
                anchorDuplicate = replaceeGraph.add(new MemoryAnchorNode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1660
                replacements.put(memoryAnchor, anchorDuplicate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1661
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1662
            List<Node> floatingNodes = new ArrayList<>(nodes.size() - 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1663
            for (Node n : nodes) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1664
                if (n != entryPointNode && n != returnNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1665
                    floatingNodes.add(n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1666
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1667
            }
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 48861
diff changeset
  1668
            UnmodifiableEconomicMap<Node, Node> duplicates = inlineSnippet(replacee, debug, replaceeGraph, replacements);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1669
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1670
            // floating nodes are not state-splits not need to re-wire frame states
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1671
            assert !(replacee instanceof StateSplit);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1672
            updateStamps(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1673
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1674
            rewireMemoryGraph(replacee, duplicates);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1675
            assert anchorDuplicate == null || anchorDuplicate.isDeleted();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1676
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1677
            // Replace all usages of the replacee with the value returned by the snippet
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1678
            ValueNode returnValue = (ValueNode) duplicates.get(returnNode.result());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1679
            replacer.replace(replacee, returnValue);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1680
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1681
            debug.dump(DebugContext.DETAILED_LEVEL, replaceeGraph, "After lowering %s with %s", replacee, this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1682
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1683
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1684
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1685
    protected void rewireFrameStates(ValueNode replacee, UnmodifiableEconomicMap<Node, Node> duplicates) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1686
        if (replacee.graph().getGuardsStage().areFrameStatesAtSideEffects() && replacee instanceof StateSplit) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1687
            for (StateSplit sideEffectNode : sideEffectNodes) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1688
                assert ((StateSplit) replacee).hasSideEffect();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1689
                Node sideEffectDup = duplicates.get(sideEffectNode.asNode());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1690
                ((StateSplit) sideEffectDup).setStateAfter(((StateSplit) replacee).stateAfter());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1691
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1692
        } else if (replacee.graph().getGuardsStage().areFrameStatesAtDeopts() && replacee instanceof DeoptimizingNode) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1693
            DeoptimizingNode replaceeDeopt = (DeoptimizingNode) replacee;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1694
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1695
            FrameState stateBefore = null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1696
            FrameState stateDuring = null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1697
            FrameState stateAfter = null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1698
            if (replaceeDeopt.canDeoptimize()) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1699
                if (replaceeDeopt instanceof DeoptimizingNode.DeoptBefore) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1700
                    stateBefore = ((DeoptimizingNode.DeoptBefore) replaceeDeopt).stateBefore();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1701
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1702
                if (replaceeDeopt instanceof DeoptimizingNode.DeoptDuring) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1703
                    stateDuring = ((DeoptimizingNode.DeoptDuring) replaceeDeopt).stateDuring();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1704
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1705
                if (replaceeDeopt instanceof DeoptimizingNode.DeoptAfter) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1706
                    stateAfter = ((DeoptimizingNode.DeoptAfter) replaceeDeopt).stateAfter();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1707
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1708
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1709
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1710
            for (DeoptimizingNode deoptNode : deoptNodes) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1711
                DeoptimizingNode deoptDup = (DeoptimizingNode) duplicates.get(deoptNode.asNode());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1712
                if (deoptDup.canDeoptimize()) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1713
                    if (deoptDup instanceof DeoptimizingNode.DeoptBefore) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1714
                        ((DeoptimizingNode.DeoptBefore) deoptDup).setStateBefore(stateBefore);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1715
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1716
                    if (deoptDup instanceof DeoptimizingNode.DeoptDuring) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1717
                        // compute a state "during" for a DeoptDuring inside the snippet depending
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1718
                        // on what kind of states we had on the node we are replacing.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1719
                        // If the original node had a state "during" already, we just use that,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1720
                        // otherwise we need to find a strategy to compute a state during based on
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1721
                        // some other state (before or after).
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1722
                        DeoptimizingNode.DeoptDuring deoptDupDuring = (DeoptimizingNode.DeoptDuring) deoptDup;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1723
                        if (stateDuring != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1724
                            deoptDupDuring.setStateDuring(stateDuring);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1725
                        } else if (stateAfter != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1726
                            deoptDupDuring.computeStateDuring(stateAfter);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1727
                        } else if (stateBefore != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1728
                            assert !deoptDupDuring.hasSideEffect() : "can't use stateBefore as stateDuring for state split " + deoptDupDuring;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1729
                            deoptDupDuring.setStateDuring(stateBefore);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1730
                        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1731
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1732
                    if (deoptDup instanceof DeoptimizingNode.DeoptAfter) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1733
                        DeoptimizingNode.DeoptAfter deoptDupAfter = (DeoptimizingNode.DeoptAfter) deoptDup;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1734
                        if (stateAfter != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1735
                            deoptDupAfter.setStateAfter(stateAfter);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1736
                        } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1737
                            assert !deoptDupAfter.hasSideEffect() : "can't use stateBefore as stateAfter for state split " + deoptDupAfter;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1738
                            deoptDupAfter.setStateAfter(stateBefore);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1739
                        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1740
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1741
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1742
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
  1743
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1744
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1745
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1746
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1747
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1748
    public String toString() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1749
        StringBuilder buf = new StringBuilder(snippet.toString()).append('(');
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1750
        String sep = "";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1751
        for (int i = 0; i < parameters.length; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1752
            String name = "[" + i + "]";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1753
            Object value = parameters[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1754
            buf.append(sep);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1755
            sep = ", ";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1756
            if (value == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1757
                buf.append("<null> ").append(name);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1758
            } else if (value.equals(UNUSED_PARAMETER)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1759
                buf.append("<unused> ").append(name);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1760
            } else if (value.equals(CONSTANT_PARAMETER)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1761
                buf.append("<constant> ").append(name);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1762
            } else if (value instanceof ParameterNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1763
                ParameterNode param = (ParameterNode) value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1764
                buf.append(param.getStackKind().getJavaName()).append(' ').append(name);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1765
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1766
                ParameterNode[] params = (ParameterNode[]) value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1767
                String kind = params.length == 0 ? "?" : params[0].getStackKind().getJavaName();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1768
                buf.append(kind).append('[').append(params.length).append("] ").append(name);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1769
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1770
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1771
        return buf.append(')').toString();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1772
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1773
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1774
    private static boolean checkTemplate(MetaAccessProvider metaAccess, Arguments args, ResolvedJavaMethod method, Signature signature) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1775
        int offset = args.info.hasReceiver() ? 1 : 0;
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1776
        for (int i = offset; i < args.info.getParameterCount(); i++) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1777
            if (args.info.isConstantParameter(i)) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1778
                JavaKind kind = signature.getParameterKind(i - offset);
583fd71c47d6 8214023: Update Graal
dlong
parents: 51736
diff changeset
  1779
                assert checkConstantArgument(metaAccess, method, signature, i - offset, args.info.getParameterName(i), args.values[i], kind);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1780
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1781
            } else if (args.info.isVarargsParameter(i)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1782
                assert args.values[i] instanceof Varargs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1783
                Varargs varargs = (Varargs) args.values[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1784
                assert checkVarargs(metaAccess, method, signature, i, args.info.getParameterName(i), varargs);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1785
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1786
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1787
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1788
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1789
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1790
    public void setMayRemoveLocation(boolean mayRemoveLocation) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1791
        this.mayRemoveLocation = mayRemoveLocation;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1792
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1793
}