Mercurial > hg > truffle
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 |
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 | 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 | 491 LoopBeginNode loopBegin = explodeLoop.findLoopBegin(); |
492 if (loopBegin != null) { | |
493 LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin); | |
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 | 498 FixedNode explodeLoopNext = explodeLoop.next(); |
499 explodeLoop.clearSuccessors(); | |
500 explodeLoop.replaceAtPredecessor(explodeLoopNext); | |
501 explodeLoop.replaceAtUsages(null); | |
502 GraphUtil.killCFG(explodeLoop); | |
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 } |