annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java @ 12362:f53dc8bbb88c

refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
author Doug Simon <doug.simon@oracle.com>
date Sat, 12 Oct 2013 00:31:37 +0200
parents bba234a1670e
children d72864a2886e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1 /*
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
4 *
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
8 *
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
13 * accompanied this code).
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
14 *
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
18 *
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
21 * questions.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
22 */
8415
2361bf148c06 rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents: 8414
diff changeset
23 package com.oracle.graal.replacements;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
24
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
25 import static com.oracle.graal.api.meta.LocationIdentity.*;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
26
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
27 import java.lang.reflect.*;
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
28 import java.util.*;
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
29 import java.util.concurrent.*;
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
30
7034
89df4e71940a More flexible handling of stamp for word type: Define a singleton Stamp instance for words that is then re-written to the target-specific primitive word stamp by the WordTypeRewriterPhase. This allows nodes to have a word stamp without any dependency on global or static state.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7015
diff changeset
31 import com.oracle.graal.api.code.*;
5507
dc71b06d09f8 Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5503
diff changeset
32 import com.oracle.graal.api.meta.*;
9187
cd2600a2336e Store snippet templates in Replacements object.
Roland Schatz <roland.schatz@oracle.com>
parents: 9099
diff changeset
33 import com.oracle.graal.api.replacements.*;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.debug.*;
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
35 import com.oracle.graal.debug.internal.*;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.graph.*;
11844
1ce74467ab51 SnippetTemplate: remove canonicalizer. remove loop for return node. copy Set on user side
Bernhard Urban <bernhard.urban@jku.at>
parents: 11802
diff changeset
37 import com.oracle.graal.graph.iterators.*;
6523
c8763a2deb0c rename packages in graal.loop to match project name
Doug Simon <doug.simon@oracle.com>
parents: 6521
diff changeset
38 import com.oracle.graal.loop.*;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
39 import com.oracle.graal.nodes.*;
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
40 import com.oracle.graal.nodes.StructuredGraph.GuardsStage;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
41 import com.oracle.graal.nodes.calc.*;
9879
bf6943c12840 allow for late lowering of MemoryCheckpoints (handle usages by FloatingReads in SnippetTemplate)
Lukas Stadler <lukas.stadler@jku.at>
parents: 9602
diff changeset
42 import com.oracle.graal.nodes.extended.*;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
43 import com.oracle.graal.nodes.java.*;
8178
67ee3325c285 added support for node lowering to set the fixed node for the next node to be lowered
Doug Simon <doug.simon@oracle.com>
parents: 8175
diff changeset
44 import com.oracle.graal.nodes.spi.*;
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
45 import com.oracle.graal.nodes.type.*;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
46 import com.oracle.graal.nodes.util.*;
6526
ee651c726397 split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents: 6525
diff changeset
47 import com.oracle.graal.phases.common.*;
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
48 import com.oracle.graal.phases.common.FloatingReadPhase.MemoryMapImpl;
11569
2f6734f8126a Avoid direct usage of CanonicalizerPhase.Instance in replacements processing.
Roland Schatz <roland.schatz@oracle.com>
parents: 11550
diff changeset
49 import com.oracle.graal.phases.tiers.*;
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
50 import com.oracle.graal.phases.util.*;
8642
1093255fd0d4 simplified registration of snippets
Doug Simon <doug.simon@oracle.com>
parents: 8637
diff changeset
51 import com.oracle.graal.replacements.Snippet.ConstantParameter;
1093255fd0d4 simplified registration of snippets
Doug Simon <doug.simon@oracle.com>
parents: 8637
diff changeset
52 import com.oracle.graal.replacements.Snippet.VarargsParameter;
8415
2361bf148c06 rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents: 8414
diff changeset
53 import com.oracle.graal.replacements.nodes.*;
7300
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
54 import com.oracle.graal.word.*;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
55
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
56 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
57 * A snippet template is a graph created by parsing a snippet method and then specialized by binding
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
58 * constants to the snippet's {@link ConstantParameter} parameters.
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
59 *
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
60 * Snippet templates can be managed in a cache maintained by {@link AbstractTemplates}.
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
61 */
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
62 public class SnippetTemplate {
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
63
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
64 /**
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
65 * Holds the {@link ResolvedJavaMethod} of the snippet, together with some information about the
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
66 * method that needs to be computed only once. The {@link SnippetInfo} should be created once
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
67 * per snippet and then cached.
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
68 */
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
69 public static class SnippetInfo {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
70
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
71 protected final ResolvedJavaMethod method;
9099
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
72 protected final boolean[] constantParameters;
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
73 protected final boolean[] varargsParameters;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
74
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
75 /**
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
76 * The parameter names, taken from the local variables table. Only used for assertion
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
77 * checking, so use only within an assert statement.
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
78 */
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
79 protected final String[] names;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
80
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
81 protected SnippetInfo(ResolvedJavaMethod method) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
82 this.method = method;
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
83
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
84 assert Modifier.isStatic(method.getModifiers()) : "snippet method must be static: " + MetaUtil.format("%H.%n", method);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
85 int count = method.getSignature().getParameterCount(false);
9099
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
86 constantParameters = new boolean[count];
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
87 varargsParameters = new boolean[count];
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
88 for (int i = 0; i < count; i++) {
9099
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
89 constantParameters[i] = MetaUtil.getParameterAnnotation(ConstantParameter.class, i, method) != null;
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
90 varargsParameters[i] = MetaUtil.getParameterAnnotation(VarargsParameter.class, i, method) != null;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
91
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
92 assert !isConstantParameter(i) || !isVarargsParameter(i) : "Parameter cannot be annotated with both @" + ConstantParameter.class.getSimpleName() + " and @" +
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
93 VarargsParameter.class.getSimpleName();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
94 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
95
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
96 names = new String[count];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
97 // Retrieve the names only when assertions are turned on.
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
98 assert initNames();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
99 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
100
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
101 private boolean initNames() {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
102 int slotIdx = 0;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
103 for (int i = 0; i < names.length; i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
104 names[i] = method.getLocalVariableTable().getLocal(slotIdx, 0).getName();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
105
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
106 Kind kind = method.getSignature().getParameterKind(i);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
107 slotIdx += kind == Kind.Long || kind == Kind.Double ? 2 : 1;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
108 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
109 return true;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
110 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
111
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
112 public ResolvedJavaMethod getMethod() {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
113 return method;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
114 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
115
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
116 public int getParameterCount() {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
117 return constantParameters.length;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
118 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
119
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
120 public boolean isConstantParameter(int paramIdx) {
9099
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
121 return constantParameters[paramIdx];
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
122 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
123
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
124 public boolean isVarargsParameter(int paramIdx) {
9099
ed81c74f92ff Cache boolean flags instead of full Annotation objects
Christian Wimmer <christian.wimmer@oracle.com>
parents: 9049
diff changeset
125 return varargsParameters[paramIdx];
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
126 }
9417
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
127
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
128 public String getParameterName(int paramIdx) {
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
129 return names[paramIdx];
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
130 }
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
131 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
132
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
133 /**
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
134 * Values that are bound to the snippet method parameters. The methods {@link #add},
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
135 * {@link #addConst}, and {@link #addVarargs} must be called in the same order as in the
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
136 * signature of the snippet method. The parameter name is passed to the add methods for
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
137 * assertion checking, i.e., to enforce that the order matches. Which method needs to be called
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
138 * depends on the annotation of the snippet method parameter:
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
139 * <ul>
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
140 * <li>Use {@link #add} for a parameter without an annotation. The value is bound when the
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
141 * {@link SnippetTemplate} is {@link SnippetTemplate#instantiate instantiated}.
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
142 * <li>Use {@link #addConst} for a parameter annotated with {@link ConstantParameter}. The value
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
143 * is bound when the {@link SnippetTemplate} is {@link SnippetTemplate#SnippetTemplate created}.
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
144 * <li>Use {@link #addVarargs} for an array parameter annotated with {@link VarargsParameter}. A
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
145 * separate {@link SnippetTemplate} is {@link SnippetTemplate#SnippetTemplate created} for every
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
146 * distinct array length. The actual values are bound when the {@link SnippetTemplate} is
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
147 * {@link SnippetTemplate#instantiate instantiated}
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
148 * </ul>
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
149 */
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
150 public static class Arguments {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
151
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
152 protected final SnippetInfo info;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
153 protected final CacheKey cacheKey;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
154 protected final Object[] values;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
155
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
156 protected int nextParamIdx;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
157
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
158 public Arguments(SnippetInfo info, GuardsStage guardsStage) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
159 this.info = info;
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
160 this.cacheKey = new CacheKey(info, guardsStage);
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
161 this.values = new Object[info.getParameterCount()];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
162 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
163
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
164 public Arguments add(String name, Object value) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
165 assert check(name, false, false);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
166 values[nextParamIdx] = value;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
167 nextParamIdx++;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
168 return this;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
169 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
170
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
171 public Arguments addConst(String name, Object value) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
172 assert check(name, true, false);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
173 values[nextParamIdx] = value;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
174 cacheKey.setParam(nextParamIdx, value);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
175 nextParamIdx++;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
176 return this;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
177 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
178
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
179 public Arguments addVarargs(String name, Class componentType, Stamp argStamp, Object value) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
180 assert check(name, false, true);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
181 Varargs varargs = new Varargs(componentType, argStamp, value);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
182 values[nextParamIdx] = varargs;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
183 // A separate template is necessary for every distinct array length
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
184 cacheKey.setParam(nextParamIdx, varargs.length);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
185 nextParamIdx++;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
186 return this;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
187 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
188
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
189 private boolean check(String name, boolean constParam, boolean varargsParam) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
190 assert nextParamIdx < info.getParameterCount() : "too many parameters: " + name + " " + this;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
191 assert info.names[nextParamIdx].equals(name) : "wrong parameter name: " + name + " " + this;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
192 assert constParam == info.isConstantParameter(nextParamIdx) : "Parameter " + (constParam ? "not " : "") + "annotated with @" + ConstantParameter.class.getSimpleName() + ": " + name +
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
193 " " + this;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
194 assert varargsParam == info.isVarargsParameter(nextParamIdx) : "Parameter " + (varargsParam ? "not " : "") + "annotated with @" + VarargsParameter.class.getSimpleName() + ": " + name +
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
195 " " + this;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
196 return true;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
197 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
198
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
199 @Override
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
200 public String toString() {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
201 StringBuilder result = new StringBuilder();
10001
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
202 result.append("Parameters<").append(MetaUtil.format("%h.%n", info.method)).append(" [");
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
203 String sep = "";
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
204 for (int i = 0; i < info.getParameterCount(); i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
205 result.append(sep);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
206 if (info.isConstantParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
207 result.append("const ");
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
208 } else if (info.isVarargsParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
209 result.append("varargs ");
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
210 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
211 result.append(info.names[i]).append(" = ").append(values[i]);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
212 sep = ", ";
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
213 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
214 result.append(">");
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
215 return result.toString();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
216 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
217 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
218
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
219 /**
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
220 * Wrapper for the prototype value of a {@linkplain VarargsParameter varargs} parameter.
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
221 */
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
222 static class Varargs {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
223
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
224 protected final Class componentType;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
225 protected final Stamp stamp;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
226 protected final Object value;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
227 protected final int length;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
228
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
229 protected Varargs(Class componentType, Stamp stamp, Object value) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
230 this.componentType = componentType;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
231 this.stamp = stamp;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
232 this.value = value;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
233 if (value instanceof List) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
234 this.length = ((List) value).size();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
235 } else {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
236 this.length = Array.getLength(value);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
237 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
238 }
10001
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
239
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
240 @Override
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
241 public String toString() {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
242 if (value instanceof boolean[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
243 return Arrays.toString((boolean[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
244 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
245 if (value instanceof byte[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
246 return Arrays.toString((byte[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
247 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
248 if (value instanceof char[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
249 return Arrays.toString((char[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
250 }
10007
10b8973ac372 fixed copy-and-paste errors
Doug Simon <doug.simon@oracle.com>
parents: 10001
diff changeset
251 if (value instanceof short[]) {
10001
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
252 return Arrays.toString((short[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
253 }
10007
10b8973ac372 fixed copy-and-paste errors
Doug Simon <doug.simon@oracle.com>
parents: 10001
diff changeset
254 if (value instanceof int[]) {
10001
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
255 return Arrays.toString((int[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
256 }
10007
10b8973ac372 fixed copy-and-paste errors
Doug Simon <doug.simon@oracle.com>
parents: 10001
diff changeset
257 if (value instanceof long[]) {
10001
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
258 return Arrays.toString((long[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
259 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
260 if (value instanceof float[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
261 return Arrays.toString((float[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
262 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
263 if (value instanceof double[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
264 return Arrays.toString((double[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
265 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
266 if (value instanceof Object[]) {
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
267 return Arrays.toString((Object[]) value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
268 }
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
269 return String.valueOf(value);
38d7b55f87b0 added instanceof snippets that for a profile with 100% precise coverage of seen types.
Doug Simon <doug.simon@oracle.com>
parents: 9917
diff changeset
270 }
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
271 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
272
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
273 static class CacheKey {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
274
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
275 private final ResolvedJavaMethod method;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
276 private final Object[] values;
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
277 private final GuardsStage guardsStage;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
278 private int hash;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
279
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
280 protected CacheKey(SnippetInfo info, GuardsStage guardsStage) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
281 this.method = info.method;
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
282 this.guardsStage = guardsStage;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
283 this.values = new Object[info.getParameterCount()];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
284 this.hash = info.method.hashCode();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
285 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
286
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
287 protected void setParam(int paramIdx, Object value) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
288 values[paramIdx] = value;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
289 hash = (hash * 31) ^ (value == null ? 0 : value.hashCode());
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
290 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
291
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
292 @Override
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
293 public boolean equals(Object obj) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
294 if (!(obj instanceof CacheKey)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
295 return false;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
296 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
297 CacheKey other = (CacheKey) obj;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
298 if (method != other.method) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
299 return false;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
300 }
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
301 if (guardsStage != other.guardsStage) {
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
302 return false;
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
303 }
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
304 for (int i = 0; i < values.length; i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
305 if (values[i] != null && !values[i].equals(other.values[i])) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
306 return false;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
307 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
308 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
309 return true;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
310 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
311
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
312 @Override
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
313 public int hashCode() {
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
314 return hash;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
315 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
316 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
317
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
318 private static final DebugTimer SnippetCreationAndSpecialization = Debug.timer("SnippetCreationAndSpecialization");
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
319
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
320 /**
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
321 * Base class for snippet classes. It provides a cache for {@link SnippetTemplate}s.
5484
f70b1547c7bf small refactoring of snippet API
Doug Simon <doug.simon@oracle.com>
parents: 5482
diff changeset
322 */
9187
cd2600a2336e Store snippet templates in Replacements object.
Roland Schatz <roland.schatz@oracle.com>
parents: 9099
diff changeset
323 public abstract static class AbstractTemplates implements SnippetTemplateCache {
5484
f70b1547c7bf small refactoring of snippet API
Doug Simon <doug.simon@oracle.com>
parents: 5482
diff changeset
324
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
325 protected final Providers providers;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
326 protected final TargetDescription target;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
327 private final ConcurrentHashMap<CacheKey, SnippetTemplate> templates;
5484
f70b1547c7bf small refactoring of snippet API
Doug Simon <doug.simon@oracle.com>
parents: 5482
diff changeset
328
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
329 protected AbstractTemplates(Providers providers, TargetDescription target) {
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
330 this.providers = providers;
7034
89df4e71940a More flexible handling of stamp for word type: Define a singleton Stamp instance for words that is then re-written to the target-specific primitive word stamp by the WordTypeRewriterPhase. This allows nodes to have a word stamp without any dependency on global or static state.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7015
diff changeset
331 this.target = target;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
332 this.templates = new ConcurrentHashMap<>();
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
333 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
334
9417
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
335 /**
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
336 * Finds the method in {@code declaringClass} annotated with {@link Snippet} named
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
337 * {@code methodName}. If {@code methodName} is null, then there must be exactly one snippet
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
338 * method in {@code declaringClass}.
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
339 */
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
340 protected SnippetInfo snippet(Class<? extends Snippets> declaringClass, String methodName) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
341 Method found = null;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
342 for (Method method : declaringClass.getDeclaredMethods()) {
9417
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
343 if (method.getAnnotation(Snippet.class) != null && (methodName == null || method.getName().equals(methodName))) {
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
344 assert found == null : "found more than one @" + Snippet.class.getSimpleName() + " method in " + declaringClass + (methodName == null ? "" : " named " + methodName);
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
345 found = method;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
346 }
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
347 }
9417
ffa27c3058e9 minor simplifications for writing compiled stubs
Doug Simon <doug.simon@oracle.com>
parents: 9302
diff changeset
348 assert found != null : "did not find @" + Snippet.class.getSimpleName() + " method in " + declaringClass + (methodName == null ? "" : " named " + methodName);
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
349 return new SnippetInfo(providers.getMetaAccess().lookupJavaMethod(found));
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
350 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
351
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
352 /**
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
353 * Gets a template for a given key, creating it first if necessary.
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
354 */
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
355 protected SnippetTemplate template(final Arguments args) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
356 SnippetTemplate template = templates.get(args.cacheKey);
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
357 if (template == null) {
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
358 try (TimerCloseable a = SnippetCreationAndSpecialization.start()) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
359 template = Debug.scope("SnippetSpecialization", args.info.method, new Callable<SnippetTemplate>() {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
360
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
361 @Override
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
362 public SnippetTemplate call() throws Exception {
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
363 return new SnippetTemplate(providers, args);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
364 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
365 });
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
366 templates.put(args.cacheKey, template);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
367 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
368 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
369 return template;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
370 }
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
371 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
372
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents: 7141
diff changeset
373 private static final Object UNUSED_PARAMETER = "DEAD PARAMETER";
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
374 private static final Object CONSTANT_PARAMETER = "CONSTANT";
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
375
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
376 /**
5760
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
377 * Determines if any parameter of a given method is annotated with {@link ConstantParameter}.
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
378 */
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
379 public static boolean hasConstantParameter(ResolvedJavaMethod method) {
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
380 for (ConstantParameter p : MetaUtil.getParameterAnnotations(ConstantParameter.class, method)) {
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
381 if (p != null) {
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
382 return true;
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
383 }
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
384 }
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
385 return false;
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
386 }
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
387
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
388 private final DebugMetric instantiationCounter;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
389 private final DebugTimer instantiationTimer;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
390
5760
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
391 /**
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
392 * Creates a snippet template.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
393 */
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
394 protected SnippetTemplate(final Providers providers, Arguments args) {
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
395 StructuredGraph snippetGraph = providers.getReplacements().getSnippet(args.info.method);
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
396
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
397 ResolvedJavaMethod method = snippetGraph.method();
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
398 Signature signature = method.getSignature();
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
399
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
400 Assumptions assumptions = providers.getReplacements().getAssumptions();
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
401 PhaseContext phaseContext = new PhaseContext(providers, assumptions);
11572
a63b63822183 Pass canonicalizer into loop transformations.
Roland Schatz <roland.schatz@oracle.com>
parents: 11569
diff changeset
402
5760
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
403 // Copy snippet graph, replacing constant parameters with given arguments
11798
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
404 final StructuredGraph snippetCopy = new StructuredGraph(snippetGraph.name, snippetGraph.method());
8627
75db7afee829 implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents: 8606
diff changeset
405 IdentityHashMap<Node, Node> nodeReplacements = new IdentityHashMap<>();
75db7afee829 implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents: 8606
diff changeset
406 nodeReplacements.put(snippetGraph.start(), snippetCopy.start());
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
407
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
408 MetaAccessProvider metaAccess = providers.getMetaAccess();
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
409 assert checkTemplate(metaAccess, args, method, signature);
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
410
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
411 int parameterCount = args.info.getParameterCount();
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
412 ConstantNode[] placeholders = new ConstantNode[parameterCount];
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
413
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
414 for (int i = 0; i < parameterCount; i++) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
415 if (args.info.isConstantParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
416 Object arg = args.values[i];
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
417 Kind kind = signature.getParameterKind(i);
7141
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
418 Constant constantArg;
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
419 if (arg instanceof Constant) {
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
420 constantArg = (Constant) arg;
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
421 } else {
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
422 constantArg = Constant.forBoxed(kind, arg);
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
423 }
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
424 nodeReplacements.put(snippetGraph.getLocal(i), ConstantNode.forConstant(constantArg, metaAccess, snippetCopy));
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
425 } else if (args.info.isVarargsParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
426 Varargs varargs = (Varargs) args.values[i];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
427 Object array = Array.newInstance(varargs.componentType, varargs.length);
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
428 ConstantNode placeholder = ConstantNode.forObject(array, metaAccess, snippetCopy);
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
429 nodeReplacements.put(snippetGraph.getLocal(i), placeholder);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
430 placeholders[i] = placeholder;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
431 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
432 }
11675
77d9f12797c5 Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11572
diff changeset
433 snippetCopy.addDuplicates(snippetGraph.getNodes(), snippetGraph, snippetGraph.getNodeCount(), nodeReplacements);
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
434
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
435 Debug.dump(snippetCopy, "Before specialization");
8627
75db7afee829 implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents: 8606
diff changeset
436 if (!nodeReplacements.isEmpty()) {
5760
87e8baf5447c added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents: 5719
diff changeset
437 // Do deferred intrinsification of node intrinsics
12362
f53dc8bbb88c refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12054
diff changeset
438 new NodeIntrinsificationPhase(providers).apply(snippetCopy);
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
439 new CanonicalizerPhase(true).apply(snippetCopy, phaseContext);
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
440 }
9302
c78ef1df7b06 made verification of node intrinsification always be run, independent of whether assertions are enabled
Doug Simon <doug.simon@oracle.com>
parents: 9187
diff changeset
441 NodeIntrinsificationVerificationPhase.verify(snippetCopy);
5466
af07e798947d lifted fast subtype check into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5428
diff changeset
442
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
443 // Gather the template parameters
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
444 parameters = new Object[parameterCount];
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
445 for (int i = 0; i < parameterCount; i++) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
446 if (args.info.isConstantParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
447 parameters[i] = CONSTANT_PARAMETER;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
448 } else if (args.info.isVarargsParameter(i)) {
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
449 assert snippetCopy.getLocal(i) == null;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
450 Varargs varargs = (Varargs) args.values[i];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
451 int length = varargs.length;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
452 LocalNode[] locals = new LocalNode[length];
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
453 Stamp stamp = varargs.stamp;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
454 for (int j = 0; j < length; j++) {
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
455 assert (parameterCount & 0xFFFF) == parameterCount;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
456 int idx = i << 16 | j;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
457 LocalNode local = snippetCopy.unique(new LocalNode(idx, stamp));
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
458 locals[j] = local;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
459 }
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
460 parameters[i] = locals;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
461
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
462 ConstantNode placeholder = placeholders[i];
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
463 assert placeholder != null;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
464 for (Node usage : placeholder.usages().snapshot()) {
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
465 if (usage instanceof LoadIndexedNode) {
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
466 LoadIndexedNode loadIndexed = (LoadIndexedNode) usage;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
467 Debug.dump(snippetCopy, "Before replacing %s", loadIndexed);
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
468 LoadSnippetVarargParameterNode loadSnippetParameter = snippetCopy.add(new LoadSnippetVarargParameterNode(locals, loadIndexed.index(), loadIndexed.stamp()));
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
469 snippetCopy.replaceFixedWithFixed(loadIndexed, loadSnippetParameter);
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
470 Debug.dump(snippetCopy, "After replacing %s", loadIndexed);
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
471 }
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
472 }
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
473 } else {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
474 LocalNode local = snippetCopy.getLocal(i);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
475 if (local == null) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
476 // Parameter value was eliminated
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
477 parameters[i] = UNUSED_PARAMETER;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
478 } else {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
479 parameters[i] = local;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
480 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
481 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
482 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
483
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
484 // Do any required loop explosion
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
485 boolean exploded = false;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
486 do {
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
487 exploded = false;
5490
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
488 ExplodeLoopNode explodeLoop = snippetCopy.getNodes().filter(ExplodeLoopNode.class).first();
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
489 if (explodeLoop != null) { // Earlier canonicalization may have removed the loop
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
490 // altogether
5490
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
491 LoopBeginNode loopBegin = explodeLoop.findLoopBegin();
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
492 if (loopBegin != null) {
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
493 LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin);
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
494 int mark = snippetCopy.getMark();
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
495 LoopTransformations.fullUnroll(loop, phaseContext, new CanonicalizerPhase(true));
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
496 new CanonicalizerPhase(true).applyIncremental(snippetCopy, phaseContext, mark);
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
497 }
5490
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
498 FixedNode explodeLoopNext = explodeLoop.next();
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
499 explodeLoop.clearSuccessors();
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
500 explodeLoop.replaceAtPredecessor(explodeLoopNext);
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
501 explodeLoop.replaceAtUsages(null);
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
502 GraphUtil.killCFG(explodeLoop);
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5489 5482
diff changeset
503 exploded = true;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
504 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
505 } while (exploded);
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
506
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
507 // Perform lowering on the snippet
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
508 snippetCopy.setGuardsStage(args.cacheKey.guardsStage);
11798
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
509 Debug.scope("LoweringSnippetTemplate", snippetCopy, new Runnable() {
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
510
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
511 public void run() {
12054
bba234a1670e grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 12052
diff changeset
512 PhaseContext c = new PhaseContext(providers, new Assumptions(false));
11798
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
513 new LoweringPhase(new CanonicalizerPhase(true)).apply(snippetCopy, c);
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
514 }
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11768
diff changeset
515 });
11732
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
516
03c781923573 made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents: 11698
diff changeset
517 // Remove all frame states from snippet graph. Snippets must be atomic (i.e. free
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
518 // of side-effects that prevent deoptimizing to a point before the snippet).
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
519 ArrayList<StateSplit> curSideEffectNodes = new ArrayList<>();
10667
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
520 ArrayList<DeoptimizingNode> curDeoptNodes = new ArrayList<>();
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
521 ArrayList<ValueNode> curStampNodes = new ArrayList<>();
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
522 for (Node node : snippetCopy.getNodes()) {
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
523 if (node instanceof ValueNode && ((ValueNode) node).stamp() == StampFactory.forNodeIntrinsic()) {
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
524 curStampNodes.add((ValueNode) node);
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
525 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
526 if (node instanceof StateSplit) {
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
527 StateSplit stateSplit = (StateSplit) node;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
528 FrameState frameState = stateSplit.stateAfter();
6534
feb579677b58 SnippetTemplate must not depend on CodeCacheProvider (only on MetaAccessProvider). This means that the hasSideEffect flag of a RuntimeCall must be already fixed in the RuntimeCall.Descriptor to avoid a lookup of the actual RuntimeCall using the CodeCacheProvider.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6526
diff changeset
529 if (stateSplit.hasSideEffect()) {
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
530 curSideEffectNodes.add((StateSplit) node);
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
531 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
532 if (frameState != null) {
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
533 stateSplit.setStateAfter(null);
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
534 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
535 }
10667
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
536 if (node instanceof DeoptimizingNode) {
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
537 DeoptimizingNode deoptNode = (DeoptimizingNode) node;
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
538 if (deoptNode.canDeoptimize()) {
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
539 curDeoptNodes.add(deoptNode);
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
540 }
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
541 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
542 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
543
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
544 new DeadCodeEliminationPhase().apply(snippetCopy);
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
545
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
546 assert checkAllVarargPlaceholdersAreDeleted(parameterCount, placeholders);
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
547
11767
ac252c4c920b FloatingReadPhase: use enum for describing the execution mode of the phase
Bernhard Urban <bernhard.urban@jku.at>
parents: 11766
diff changeset
548 new FloatingReadPhase(FloatingReadPhase.ExecutionMode.ANALYSIS_ONLY).apply(snippetCopy);
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
549 this.memoryMap = null;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
550
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
551 this.snippet = snippetCopy;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
552 ReturnNode retNode = null;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
553 StartNode entryPointNode = snippet.start();
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
554 nodes = new ArrayList<>(snippet.getNodeCount());
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
555 boolean seenReturn = false;
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
556 boolean containsMemoryMap = false;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
557 for (Node node : snippet.getNodes()) {
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
558 if (node == entryPointNode || node == entryPointNode.stateAfter()) {
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
559 // Do nothing.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
560 } else {
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
561 nodes.add(node);
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
562 if (node instanceof ReturnNode) {
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
563 retNode = (ReturnNode) node;
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
564 NodeIterable<MemoryMapNode> memstates = retNode.inputs().filter(MemoryMapNode.class);
11844
1ce74467ab51 SnippetTemplate: remove canonicalizer. remove loop for return node. copy Set on user side
Bernhard Urban <bernhard.urban@jku.at>
parents: 11802
diff changeset
565 assert memstates.count() == 1;
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
566 memoryMap = memstates.first();
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
567 retNode.replaceFirstInput(memoryMap, null);
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
568 memoryMap.safeDelete();
11844
1ce74467ab51 SnippetTemplate: remove canonicalizer. remove loop for return node. copy Set on user side
Bernhard Urban <bernhard.urban@jku.at>
parents: 11802
diff changeset
569
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
570 assert !seenReturn : "can handle only one ReturnNode";
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
571 seenReturn = true;
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
572 } else if (node instanceof MemoryMapNode) {
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
573 containsMemoryMap = true;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
574 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
575 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
576 }
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
577 assert !containsMemoryMap;
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
578
7034
89df4e71940a More flexible handling of stamp for word type: Define a singleton Stamp instance for words that is then re-written to the target-specific primitive word stamp by the WordTypeRewriterPhase. This allows nodes to have a word stamp without any dependency on global or static state.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7015
diff changeset
579 this.sideEffectNodes = curSideEffectNodes;
10667
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
580 this.deoptNodes = curDeoptNodes;
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
581 this.stampNodes = curStampNodes;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
582 this.returnNode = retNode;
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
583
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
584 this.instantiationCounter = Debug.metric("SnippetInstantiationCount[" + method.getName() + "]");
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
585 this.instantiationTimer = Debug.timer("SnippetInstantiationTime[" + method.getName() + "]");
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
586 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
587
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
588 private static boolean checkAllVarargPlaceholdersAreDeleted(int parameterCount, ConstantNode[] placeholders) {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
589 for (int i = 0; i < parameterCount; i++) {
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
590 if (placeholders[i] != null) {
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
591 assert placeholders[i].isDeleted() : placeholders[i];
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
592 }
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
593 }
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
594 return true;
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
595 }
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
596
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
597 private static boolean checkConstantArgument(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int i, String name, Object arg, Kind kind) {
7141
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
598 ResolvedJavaType type = signature.getParameterType(i, method.getDeclaringClass()).resolve(method.getDeclaringClass());
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
599 if (metaAccess.lookupJavaType(WordBase.class).isAssignableFrom(type)) {
7141
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
600 assert arg instanceof Constant : method + ": word constant parameters must be passed boxed in a Constant value: " + arg;
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
601 return true;
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
602 }
7098
e23980f4a890 Cleanup of Kind class: remove isXxx methods
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7081
diff changeset
603 if (kind == Kind.Object) {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
604 assert arg == null || type.isInstance(Constant.forObject(arg)) : method + ": wrong value type for " + name + ": expected " + type.getName() + ", got " + arg.getClass().getName();
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
605 } else {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
606 assert arg != null && kind.toBoxedJavaClass() == arg.getClass() : method + ": wrong value kind for " + name + ": expected " + kind + ", got " +
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
607 (arg == null ? "null" : arg.getClass().getSimpleName());
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
608 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
609 return true;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
610 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
611
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
612 private static boolean checkVarargs(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int i, String name, Varargs varargs) {
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
613 ResolvedJavaType type = (ResolvedJavaType) signature.getParameterType(i, method.getDeclaringClass());
7060
06d5f450f32b rename: ResolvedJavaType.isArrayClass() -> ResolvedJavaType.isArray()
Doug Simon <doug.simon@oracle.com>
parents: 7034
diff changeset
614 assert type.isArray() : "varargs parameter must be an array type";
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
615 assert type.getComponentType().isAssignableFrom(metaAccess.lookupJavaType(varargs.componentType)) : "componentType for " + name + " not matching " + MetaUtil.toJavaName(type) + " instance: " +
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
616 varargs.componentType;
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
617 return true;
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
618 }
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
619
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
620 /**
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
621 * The graph built from the snippet method.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
622 */
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
623 private final StructuredGraph snippet;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
624
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
625 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
626 * The named parameters of this template that must be bound to values during instantiation. For
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
627 * a parameter that is still live after specialization, the value in this map is either a
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
628 * {@link LocalNode} instance or a {@link LocalNode} array. For an eliminated parameter, the
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
629 * value is identical to the key.
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
630 */
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
631 private final Object[] parameters;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
632
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
633 /**
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
634 * The return node (if any) of the snippet.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
635 */
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
636 private final ReturnNode returnNode;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
637
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
638 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
639 * Nodes that inherit the {@link StateSplit#stateAfter()} from the replacee during
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
640 * instantiation.
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
641 */
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
642 private final ArrayList<StateSplit> sideEffectNodes;
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
643
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
644 /**
10667
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
645 * Nodes that inherit the {@link DeoptimizingNode#getDeoptimizationState()} from the replacee
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
646 * during insantiation.
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
647 */
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
648 private final ArrayList<DeoptimizingNode> deoptNodes;
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
649
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
650 /**
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
651 * The nodes that inherit the {@link ValueNode#stamp()} from the replacee during instantiation.
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
652 */
7546
727e869891fc let CheckCastSnippets insert UnsafeCastNodes (so that type stays visible during lowering)
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
653 private final ArrayList<ValueNode> stampNodes;
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
654
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
655 /**
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
656 * The nodes to be inlined when this specialization is instantiated.
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
657 */
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
658 private final ArrayList<Node> nodes;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
659
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
660 /**
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
661 * map of killing locations to memory checkpoints (nodes).
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
662 */
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
663 private MemoryMapNode memoryMap;
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
664
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
665 /**
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
666 * Gets the instantiation-time bindings to this template's parameters.
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
667 *
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
668 * @return the map that will be used to bind arguments to parameters when inlining this template
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
669 */
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
670 private IdentityHashMap<Node, Node> bind(StructuredGraph replaceeGraph, MetaAccessProvider metaAccess, Arguments args) {
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
671 IdentityHashMap<Node, Node> replacements = new IdentityHashMap<>();
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
672 assert args.info.getParameterCount() == parameters.length : "number of args (" + args.info.getParameterCount() + ") != number of parameters (" + parameters.length + ")";
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
673 for (int i = 0; i < parameters.length; i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
674 Object parameter = parameters[i];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
675 assert parameter != null : this + " has no parameter named " + args.info.names[i];
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
676 Object argument = args.values[i];
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
677 if (parameter instanceof LocalNode) {
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
678 if (argument instanceof ValueNode) {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
679 replacements.put((LocalNode) parameter, (ValueNode) argument);
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
680 } else {
5540
a891c53a295b Renaming RiKind => Kind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5538
diff changeset
681 Kind kind = ((LocalNode) parameter).kind();
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
682 assert argument != null || kind == Kind.Object : this + " cannot accept null for non-object parameter named " + args.info.names[i];
8908
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
683 Constant constant = forBoxed(argument, kind);
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
684 replacements.put((LocalNode) parameter, ConstantNode.forConstant(constant, metaAccess, replaceeGraph));
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
685 }
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents: 7141
diff changeset
686 } else if (parameter instanceof LocalNode[]) {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
687 LocalNode[] locals = (LocalNode[]) parameter;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
688 Varargs varargs = (Varargs) argument;
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
689 int length = locals.length;
7300
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
690 List list = null;
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
691 Object array = null;
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
692 if (varargs.value instanceof List) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
693 list = (List) varargs.value;
7300
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
694 assert list.size() == length : length + " != " + list.size();
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
695 } else {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
696 array = varargs.value;
7300
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
697 assert array != null && array.getClass().isArray();
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
698 assert Array.getLength(array) == length : length + " != " + Array.getLength(array);
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
699 }
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
700
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
701 for (int j = 0; j < length; j++) {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
702 LocalNode local = locals[j];
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
703 assert local != null;
7300
2912b72d840a More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7271
diff changeset
704 Object value = list != null ? list.get(j) : Array.get(array, j);
6431
2e376f8ea4e2 added snippet for lowering NewMultiArrayNodes
Doug Simon <doug.simon@oracle.com>
parents: 6408
diff changeset
705 if (value instanceof ValueNode) {
2e376f8ea4e2 added snippet for lowering NewMultiArrayNodes
Doug Simon <doug.simon@oracle.com>
parents: 6408
diff changeset
706 replacements.put(local, (ValueNode) value);
2e376f8ea4e2 added snippet for lowering NewMultiArrayNodes
Doug Simon <doug.simon@oracle.com>
parents: 6408
diff changeset
707 } else {
8908
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
708 Constant constant = forBoxed(value, local.kind());
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
709 ConstantNode element = ConstantNode.forConstant(constant, metaAccess, replaceeGraph);
6431
2e376f8ea4e2 added snippet for lowering NewMultiArrayNodes
Doug Simon <doug.simon@oracle.com>
parents: 6408
diff changeset
710 replacements.put(local, element);
2e376f8ea4e2 added snippet for lowering NewMultiArrayNodes
Doug Simon <doug.simon@oracle.com>
parents: 6408
diff changeset
711 }
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
712 }
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents: 7141
diff changeset
713 } else {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
714 assert parameter == CONSTANT_PARAMETER || parameter == UNUSED_PARAMETER : "unexpected entry for parameter: " + args.info.names[i] + " -> " + parameter;
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
715 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
716 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
717 return replacements;
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
718 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
719
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
720 /**
8908
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
721 * Converts a Java boxed value to a {@link Constant} of the right kind. This adjusts for the
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
722 * limitation that a {@link Local}'s kind is a {@linkplain Kind#getStackKind() stack kind} and
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
723 * so cannot be used for re-boxing primitives smaller than an int.
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
724 *
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
725 * @param argument a Java boxed value
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
726 * @param localKind the kind of the {@link Local} to which {@code argument} will be bound
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
727 */
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
728 protected Constant forBoxed(Object argument, Kind localKind) {
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
729 assert localKind == localKind.getStackKind();
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
730 if (localKind == Kind.Int && !(argument instanceof Integer)) {
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
731 if (argument instanceof Boolean) {
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
732 return Constant.forBoxed(Kind.Boolean, argument);
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
733 }
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
734 if (argument instanceof Byte) {
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
735 return Constant.forBoxed(Kind.Byte, argument);
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
736 }
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
737 if (argument instanceof Short) {
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
738 return Constant.forBoxed(Kind.Short, argument);
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
739 }
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
740 assert argument instanceof Character;
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
741 return Constant.forBoxed(Kind.Char, argument);
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
742 }
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
743 return Constant.forBoxed(localKind, argument);
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
744 }
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
745
b9fb1ecaad92 convert non-int boxed primitives whose stack kind is int to Constants of the right kind
Doug Simon <doug.simon@oracle.com>
parents: 8642
diff changeset
746 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
747 * Logic for replacing a snippet-lowered node at its usages with the return value of the
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
748 * snippet. An alternative to the {@linkplain SnippetTemplate#DEFAULT_REPLACER default}
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
749 * replacement logic can be used to handle mismatches between the stamp of the node being
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
750 * lowered and the stamp of the snippet's return value.
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
751 */
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
752 public interface UsageReplacer {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
753
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
754 /**
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
755 * Replaces all usages of {@code oldNode} with direct or indirect usages of {@code newNode}.
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
756 */
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
757 void replace(ValueNode oldNode, ValueNode newNode, MemoryMapNode mmap);
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
758 }
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
759
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
760 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
761 * Represents the default {@link UsageReplacer usage replacer} logic which simply delegates to
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
762 * {@link Node#replaceAtUsages(Node)}.
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
763 */
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
764 public static final UsageReplacer DEFAULT_REPLACER = new UsageReplacer() {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
765
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
766 @Override
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
767 public void replace(ValueNode oldNode, ValueNode newNode, MemoryMapNode mmap) {
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
768 oldNode.replaceAtUsages(newNode);
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
769 if (mmap == null || newNode == null) {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
770 return;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
771 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
772 for (Node usage : newNode.usages().snapshot()) {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
773 if (usage instanceof FloatingReadNode && ((FloatingReadNode) usage).lastLocationAccess() == newNode) {
11766
c9c3f8efe6a9 FloatingReadPhase: add attribute to graph about application of FloatingReadPhase to this graph
Bernhard Urban <bernhard.urban@jku.at>
parents: 11750
diff changeset
774 assert newNode.graph().isAfterFloatingReadPhase();
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
775
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
776 // lastLocationAccess points into the snippet graph. find a proper
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
777 // MemoryCheckPoint inside the snippet graph
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
778 FloatingReadNode read = (FloatingReadNode) usage;
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
779 Node lastAccess = mmap.getLastLocationAccess(read.location().getLocationIdentity());
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
780
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
781 assert lastAccess != null : "no mapping found for lowerable node " + oldNode + ". (No node in the snippet kill the same location as the lowerable node?)";
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
782 read.setLastLocationAccess(lastAccess);
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
783 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
784 }
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
785 }
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
786 };
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
787
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
788 private boolean checkSnippetKills(ScheduledNode replacee) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
789 if (!replacee.graph().isAfterFloatingReadPhase()) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
790 // no floating reads yet, ignore locations created while lowering
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
791 return true;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
792 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
793 if (memoryMap == null || ((MemoryMapImpl) memoryMap).isEmpty()) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
794 // there're no kills in the snippet graph
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
795 return true;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
796 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
797
11844
1ce74467ab51 SnippetTemplate: remove canonicalizer. remove loop for return node. copy Set on user side
Bernhard Urban <bernhard.urban@jku.at>
parents: 11802
diff changeset
798 Set<LocationIdentity> kills = new HashSet<>(((MemoryMapImpl) memoryMap).getLocations());
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
799
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
800 if (replacee instanceof MemoryCheckpoint.Single) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
801 // check if some node in snippet graph also kills the same location
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
802 LocationIdentity locationIdentity = ((MemoryCheckpoint.Single) replacee).getLocationIdentity();
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
803 if (locationIdentity == ANY_LOCATION) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
804 assert !(memoryMap.getLastLocationAccess(ANY_LOCATION) instanceof StartNode);
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
805 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
806 assert kills.contains(locationIdentity) : replacee + " kills " + locationIdentity + ", but snippet doesn't contain a kill to this location";
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
807 return true;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
808 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
809 assert !(replacee instanceof MemoryCheckpoint.Multi) : replacee + " multi not supported (yet)";
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
810
11802
82c4106741f7 SnippetTemplate: avoid two getNodes() in assertions. comment fix and renames
Bernhard Urban <bernhard.urban@jku.at>
parents: 11798
diff changeset
811 Debug.log("WARNING: %s is not a MemoryCheckpoint, but the snippet graph contains kills (%s). You might want %s to be a MemoryCheckpoint", replacee, kills, replacee);
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
812
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
813 // remove ANY_LOCATION if it's just a kill by the start node
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
814 if (memoryMap.getLastLocationAccess(ANY_LOCATION) instanceof StartNode) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
815 kills.remove(ANY_LOCATION);
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
816 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
817
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
818 // node can only lower to a ANY_LOCATION kill if the replacee also kills ANY_LOCATION
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
819 assert !kills.contains(ANY_LOCATION) : "snippet graph contains a kill to ANY_LOCATION, but replacee (" + replacee + ") doesn't kill ANY_LOCATION. kills: " + kills;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
820
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
821 /*
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
822 * kills to other locations than ANY_LOCATION can be still inserted if there aren't any
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
823 * floating reads accessing this locations. Example: In HotSpot, InstanceOfNode is lowered
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
824 * to a snippet containing a write to SECONDARY_SUPER_CACHE_LOCATION. This is runtime
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
825 * specific, so the runtime independent InstanceOfNode can not kill this location. However,
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
826 * if no FloatingReadNode is reading from this location, the kill to this location is fine.
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
827 */
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
828 for (FloatingReadNode frn : replacee.graph().getNodes(FloatingReadNode.class)) {
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
829 assert !(kills.contains(frn.location().getLocationIdentity())) : frn + " reads from " + frn.location().getLocationIdentity() + " but " + replacee + " does not kill this location";
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
830 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
831 return true;
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
832 }
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
833
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
834 private class DuplicateMapper extends MemoryMapNode {
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
835
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
836 Map<Node, Node> duplicates;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
837 StartNode replaceeStart;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
838
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
839 public DuplicateMapper(Map<Node, Node> duplicates, StartNode replaceeStart) {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
840 this.duplicates = duplicates;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
841 this.replaceeStart = replaceeStart;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
842 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
843
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
844 @Override
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
845 public Node getLastLocationAccess(LocationIdentity locationIdentity) {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
846 assert memoryMap != null : "no memory map stored for this snippet graph (snippet doesn't have a ReturnNode?)";
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
847 Node lastLocationAccess = memoryMap.getLastLocationAccess(locationIdentity);
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
848 assert lastLocationAccess != null;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
849 if (lastLocationAccess instanceof StartNode) {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
850 return replaceeStart;
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
851 } else {
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
852 return duplicates.get(lastLocationAccess);
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
853 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
854 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
855 }
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
856
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
857 /**
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
858 * Replaces a given fixed node with this specialized snippet.
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
859 *
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
860 * @param metaAccess
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
861 * @param replacee the node that will be replaced
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
862 * @param replacer object that replaces the usages of {@code replacee}
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
863 * @param args the arguments to be bound to the flattened positional parameters of the snippet
6386
abeeb57b655d added MonitorSnippets which passes MonitorTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 6302
diff changeset
864 * @return the map of duplicated nodes (original -> duplicate)
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
865 */
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
866 public Map<Node, Node> instantiate(MetaAccessProvider metaAccess, FixedNode replacee, UsageReplacer replacer, Arguments args) {
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
867 assert checkSnippetKills(replacee);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
868 try (TimerCloseable a = instantiationTimer.start()) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
869 instantiationCounter.increment();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
870 // Inline the snippet nodes, replacing parameters with the given args in the process
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
871 StartNode entryPointNode = snippet.start();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
872 FixedNode firstCFGNode = entryPointNode.next();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
873 StructuredGraph replaceeGraph = replacee.graph();
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
874 IdentityHashMap<Node, Node> replacements = bind(replaceeGraph, metaAccess, args);
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
875 replacements.put(entryPointNode, replaceeGraph.start());
11675
77d9f12797c5 Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11572
diff changeset
876 Map<Node, Node> duplicates = replaceeGraph.addDuplicates(nodes, snippet, snippet.getNodeCount(), replacements);
11692
8b3a2258b368 Remove unused allocated graph in snippet instantiation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11675
diff changeset
877 Debug.dump(replaceeGraph, "After inlining snippet %s", snippet.method());
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
878
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
879 // Re-wire the control flow graph around the replacee
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
880 FixedNode firstCFGNodeDuplicate = (FixedNode) duplicates.get(firstCFGNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
881 replacee.replaceAtPredecessor(firstCFGNodeDuplicate);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
882 FixedNode next = null;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
883 if (replacee instanceof FixedWithNextNode) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
884 FixedWithNextNode fwn = (FixedWithNextNode) replacee;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
885 next = fwn.next();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
886 fwn.setNext(null);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
887 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
888
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
889 if (replacee instanceof StateSplit) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
890 for (StateSplit sideEffectNode : sideEffectNodes) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
891 assert ((StateSplit) replacee).hasSideEffect();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
892 Node sideEffectDup = duplicates.get(sideEffectNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
893 ((StateSplit) sideEffectDup).setStateAfter(((StateSplit) replacee).stateAfter());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
894 }
10667
5348b49b2a76 Assign framestates in snippet lowering after framestate assignment.
Roland Schatz <roland.schatz@oracle.com>
parents: 10422
diff changeset
895 }
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
896
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
897 if (replacee instanceof DeoptimizingNode) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
898 DeoptimizingNode replaceeDeopt = (DeoptimizingNode) replacee;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
899 FrameState state = replaceeDeopt.getDeoptimizationState();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
900 for (DeoptimizingNode deoptNode : deoptNodes) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
901 DeoptimizingNode deoptDup = (DeoptimizingNode) duplicates.get(deoptNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
902 assert replaceeDeopt.canDeoptimize() || !deoptDup.canDeoptimize();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
903 deoptDup.setDeoptimizationState(state);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
904 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
905 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
906
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
907 for (ValueNode stampNode : stampNodes) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
908 Node stampDup = duplicates.get(stampNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
909 ((ValueNode) stampDup).setStamp(((ValueNode) replacee).stamp());
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
910 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
911
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
912 // Replace all usages of the replacee with the value returned by the snippet
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
913 ValueNode returnValue = null;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
914 if (returnNode != null) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
915 if (returnNode.result() instanceof LocalNode) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
916 returnValue = (ValueNode) replacements.get(returnNode.result());
11675
77d9f12797c5 Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11572
diff changeset
917 } else if (returnNode.result() != null) {
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
918 returnValue = (ValueNode) duplicates.get(returnNode.result());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
919 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
920 Node returnDuplicate = duplicates.get(returnNode);
11847
f5faf49a86dd remove MemoryState, make MemoryMap a node, add MemoryMap input to ReturnNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 11844
diff changeset
921 MemoryMapNode mmap = new DuplicateMapper(duplicates, replaceeGraph.start());
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
922 if (returnValue == null && replacee.usages().isNotEmpty() && replacee instanceof MemoryCheckpoint) {
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
923 replacer.replace(replacee, (ValueNode) returnDuplicate.predecessor(), mmap);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
924 } else {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
925 assert returnValue != null || replacee.usages().isEmpty() : this + " " + returnValue + " " + returnNode + " " + replacee.usages();
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
926 replacer.replace(replacee, returnValue, mmap);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
927 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
928 if (returnDuplicate.isAlive()) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
929 returnDuplicate.clearInputs();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
930 returnDuplicate.replaceAndDelete(next);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
931 }
9879
bf6943c12840 allow for late lowering of MemoryCheckpoints (handle usages by FloatingReads in SnippetTemplate)
Lukas Stadler <lukas.stadler@jku.at>
parents: 9602
diff changeset
932 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
933
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
934 // Remove the replacee from its graph
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
935 replacee.clearInputs();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
936 replacee.replaceAtUsages(null);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
937 GraphUtil.killCFG(replacee);
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
938
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
939 Debug.dump(replaceeGraph, "After lowering %s with %s", replacee, this);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
940 return duplicates;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
941 }
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
942 }
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
943
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
944 /**
7141
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
945 * Gets a copy of the specialized graph.
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
946 */
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
947 public StructuredGraph copySpecializedGraph() {
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
948 return snippet.copy();
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
949 }
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
950
c85aecfee9e4 made snippet template specialization support ConstantParameters of type Word
Doug Simon <doug.simon@oracle.com>
parents: 7099
diff changeset
951 /**
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
952 * Replaces a given floating node with this specialized snippet.
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7313
diff changeset
953 *
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
954 * @param metaAccess
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
955 * @param replacee the node that will be replaced
6568
d8408e5563e5 added indirection for the replacement of a snippet-lowered node with the snippet's return value
Doug Simon <doug.simon@oracle.com>
parents: 6539
diff changeset
956 * @param replacer object that replaces the usages of {@code replacee}
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
957 * @param args the arguments to be bound to the flattened positional parameters of the snippet
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
958 */
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
959 public void instantiate(MetaAccessProvider metaAccess, FloatingNode replacee, UsageReplacer replacer, LoweringTool tool, Arguments args) {
11768
e53399f1b2cd SnippetTemplate: add assertions regarding memory kills
Bernhard Urban <bernhard.urban@jku.at>
parents: 11767
diff changeset
960 assert checkSnippetKills(replacee);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
961 try (TimerCloseable a = instantiationTimer.start()) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
962 instantiationCounter.increment();
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
963
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
964 // Inline the snippet nodes, replacing parameters with the given args in the process
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
965 String name = snippet.name == null ? "{copy}" : snippet.name + "{copy}";
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
966 StructuredGraph snippetCopy = new StructuredGraph(name, snippet.method());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
967 StartNode entryPointNode = snippet.start();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
968 FixedNode firstCFGNode = entryPointNode.next();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
969 StructuredGraph replaceeGraph = replacee.graph();
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
970 IdentityHashMap<Node, Node> replacements = bind(replaceeGraph, metaAccess, args);
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
971 replacements.put(entryPointNode, replaceeGraph.start());
11675
77d9f12797c5 Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11572
diff changeset
972 Map<Node, Node> duplicates = replaceeGraph.addDuplicates(nodes, snippet, snippet.getNodeCount(), replacements);
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
973 Debug.dump(replaceeGraph, "After inlining snippet %s", snippetCopy.method());
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
974
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
975 FixedWithNextNode lastFixedNode = tool.lastFixedNode();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
976 assert lastFixedNode != null && lastFixedNode.isAlive() : replaceeGraph + " lastFixed=" + lastFixedNode;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
977 FixedNode next = lastFixedNode.next();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
978 lastFixedNode.setNext(null);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
979 FixedNode firstCFGNodeDuplicate = (FixedNode) duplicates.get(firstCFGNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
980 replaceeGraph.addAfterFixed(lastFixedNode, firstCFGNodeDuplicate);
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
981
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
982 if (replacee instanceof StateSplit) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
983 for (StateSplit sideEffectNode : sideEffectNodes) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
984 assert ((StateSplit) replacee).hasSideEffect();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
985 Node sideEffectDup = duplicates.get(sideEffectNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
986 ((StateSplit) sideEffectDup).setStateAfter(((StateSplit) replacee).stateAfter());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
987 }
7034
89df4e71940a More flexible handling of stamp for word type: Define a singleton Stamp instance for words that is then re-written to the target-specific primitive word stamp by the WordTypeRewriterPhase. This allows nodes to have a word stamp without any dependency on global or static state.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7015
diff changeset
988 }
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
989 for (ValueNode stampNode : stampNodes) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
990 Node stampDup = duplicates.get(stampNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
991 ((ValueNode) stampDup).setStamp(((ValueNode) replacee).stamp());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
992 }
6408
e5768e936147 Allow snippets to inherit the stateAfter and stamp from the replacee
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6407
diff changeset
993
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
994 // Replace all usages of the replacee with the value returned by the snippet
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
995 assert returnNode != null : replaceeGraph;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
996 ValueNode returnValue = null;
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
997 if (returnNode.result() instanceof LocalNode) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
998 returnValue = (ValueNode) replacements.get(returnNode.result());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
999 } else {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1000 returnValue = (ValueNode) duplicates.get(returnNode.result());
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1001 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1002 assert returnValue != null || replacee.usages().isEmpty();
11749
a27fcd670725 SnippetTemplate: use FloatingReadPhase to store MemoryMap at ReturnNodes in order to connect the snippet graph properly when inlining it
Bernhard Urban <bernhard.urban@jku.at>
parents: 11732
diff changeset
1003 replacer.replace(replacee, returnValue, new DuplicateMapper(duplicates, replaceeGraph.start()));
11388
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1004
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1005 Node returnDuplicate = duplicates.get(returnNode);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1006 if (returnDuplicate.isAlive()) {
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1007 returnDuplicate.clearInputs();
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1008 returnDuplicate.replaceAndDelete(next);
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1009 }
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1010
f88427168d19 added counters and timers for snippet instantiation
Doug Simon <doug.simon@oracle.com>
parents: 10667
diff changeset
1011 Debug.dump(replaceeGraph, "After lowering %s with %s", replacee, this);
5670
29684ae5a194 Make sure snippet instentiation doesn't produce dead nodes and remove redundant DCE
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5574
diff changeset
1012 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1013 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1014
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1015 @Override
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1016 public String toString() {
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1017 StringBuilder buf = new StringBuilder(snippet.toString()).append('(');
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
1018 String sep = "";
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1019 for (int i = 0; i < parameters.length; i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1020 String name = "[" + i + "]";
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1021 Object value = parameters[i];
5481
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
1022 buf.append(sep);
e26e6dca0bcf added @Parameter and @Constant annotations which simplify creation and instantiation of snippets
Doug Simon <doug.simon@oracle.com>
parents: 5467
diff changeset
1023 sep = ", ";
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1024 if (value == null) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1025 buf.append("<null> ").append(name);
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1026 } else if (value == UNUSED_PARAMETER) {
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents: 7141
diff changeset
1027 buf.append("<unused> ").append(name);
9038
8802f66cba62 Fix bug in graph dumping.
Roland Schatz <roland.schatz@oracle.com>
parents: 9015
diff changeset
1028 } else if (value == CONSTANT_PARAMETER) {
8802f66cba62 Fix bug in graph dumping.
Roland Schatz <roland.schatz@oracle.com>
parents: 9015
diff changeset
1029 buf.append("<constant> ").append(name);
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents: 7141
diff changeset
1030 } else if (value instanceof LocalNode) {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
1031 LocalNode local = (LocalNode) value;
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
1032 buf.append(local.kind().getJavaName()).append(' ').append(name);
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1033 } else {
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
1034 LocalNode[] locals = (LocalNode[]) value;
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
1035 String kind = locals.length == 0 ? "?" : locals[0].kind().getJavaName();
5482
9f4783c0269e folded -G:+CheckcastCounters functionality into checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents: 5481
diff changeset
1036 buf.append(kind).append('[').append(locals.length).append("] ").append(name);
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1037 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1038 }
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1039 return buf.append(')').toString();
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1040 }
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1041
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
1042 private static boolean checkTemplate(MetaAccessProvider metaAccess, Arguments args, ResolvedJavaMethod method, Signature signature) {
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1043 for (int i = 0; i < args.info.getParameterCount(); i++) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1044 if (args.info.isConstantParameter(i)) {
6539
2463eb24b644 Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 6534
diff changeset
1045 Kind kind = signature.getParameterKind(i);
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
1046 assert checkConstantArgument(metaAccess, method, signature, i, args.info.names[i], args.values[i], kind);
9015
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1047
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1048 } else if (args.info.isVarargsParameter(i)) {
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1049 assert args.values[i] instanceof Varargs;
92d2bedb5dfc Change of Snippet template and instantiation process
Christian Wimmer <christian.wimmer@oracle.com>
parents: 8959
diff changeset
1050 Varargs varargs = (Varargs) args.values[i];
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11847
diff changeset
1051 assert checkVarargs(metaAccess, method, signature, i, args.info.names[i], varargs);
6302
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1052 }
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1053 }
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1054 return true;
5d7d9a6953bd added InstanceOfSnippets which passes InstanceOfTest but is not yet enabled for general lowering
Doug Simon <doug.simon@oracle.com>
parents: 5760
diff changeset
1055 }
5428
6ec0857cdf46 added support for snippet templates which are snippet graphs specialized by binding a constant to at least one of the snippet's parameters
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1056 }