Mercurial > hg > truffle
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java @ 19541:c66037cb9cd1
Make Node#replaceAndDelete not accept null as an argument.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sun, 22 Feb 2015 22:39:26 +0100 |
parents | 8fc336a04d77 |
children | 2fd45bb25118 |
rev | line source |
---|---|
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
1 /* |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19250
diff
changeset
|
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
4 * |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
8 * |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
14 * |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
18 * |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
21 * questions. |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
22 */ |
8415
2361bf148c06
rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents:
7902
diff
changeset
|
23 package com.oracle.graal.replacements.nodes; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
24 |
15263
0b25b81414c9
Move various bci constants from FrameState (gral.nodes) to BytecodeFrame (graal.api.code)
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15193
diff
changeset
|
25 import com.oracle.graal.api.code.*; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
26 import com.oracle.graal.api.meta.*; |
16290
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
27 import com.oracle.graal.api.replacements.*; |
16449
d8d4120c62ae
throw error when lowering MacroNode without stateAfter to an InvokeNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16290
diff
changeset
|
28 import com.oracle.graal.compiler.common.*; |
16290
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
29 import com.oracle.graal.compiler.common.type.*; |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
30 import com.oracle.graal.debug.*; |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13153
diff
changeset
|
31 import com.oracle.graal.debug.Debug.Scope; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
32 import com.oracle.graal.graph.*; |
16841
cbd42807a31f
moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents:
16822
diff
changeset
|
33 import com.oracle.graal.nodeinfo.*; |
cbd42807a31f
moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents:
16822
diff
changeset
|
34 import com.oracle.graal.nodes.CallTargetNode.InvokeKind; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
35 import com.oracle.graal.nodes.*; |
13287
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
36 import com.oracle.graal.nodes.StructuredGraph.GuardsStage; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
37 import com.oracle.graal.nodes.java.*; |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
38 import com.oracle.graal.nodes.spi.*; |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
39 import com.oracle.graal.phases.common.*; |
15470
c55f44b3c5e5
remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15311
diff
changeset
|
40 import com.oracle.graal.phases.common.inlining.*; |
11732
03c781923573
made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents:
11700
diff
changeset
|
41 import com.oracle.graal.phases.tiers.*; |
13606
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
42 import com.oracle.graal.replacements.*; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
43 |
16290
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
44 /** |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
45 * Macro nodes can be used to temporarily replace an invoke (usually by using the |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
46 * {@link MacroSubstitution} annotation). They can, for example, be used to implement constant |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
47 * folding for known JDK functions like {@link Class#isInterface()}.<br/> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
48 * <br/> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
49 * During lowering, multiple sources are queried in order to look for a replacement: |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
50 * <ul> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
51 * <li>If {@link #getLoweredSnippetGraph(LoweringTool)} returns a non-null result, this graph is |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
52 * used as a replacement.</li> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
53 * <li>If a {@link MethodSubstitution} for the target method is found, this substitution is used as |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
54 * a replacement.</li> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
55 * <li>Otherwise, the macro node is replaced with an {@link InvokeNode}. Note that this is only |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
56 * possible if the macro node is a {@link MacroStateSplitNode}.</li> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
57 * </ul> |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
58 */ |
16822
5d468add216f
added @NodeInfo annotations to all Node classes
Doug Simon <doug.simon@oracle.com>
parents:
16563
diff
changeset
|
59 @NodeInfo |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19250
diff
changeset
|
60 public abstract class MacroNode extends FixedWithNextNode implements Lowerable { |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
61 |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19471
diff
changeset
|
62 public static final NodeClass<MacroNode> TYPE = NodeClass.create(MacroNode.class); |
16897
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
63 @Input protected NodeInputList<ValueNode> arguments; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
64 |
17328
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
65 protected final int bci; |
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
66 protected final ResolvedJavaMethod targetMethod; |
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
67 protected final JavaType returnType; |
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
68 protected final InvokeKind invokeKind; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
69 |
19471
880717e44675
Use typed NodeClass in node constructors.
Roland Schatz <roland.schatz@oracle.com>
parents:
19403
diff
changeset
|
70 protected MacroNode(NodeClass<? extends MacroNode> c, Invoke invoke) { |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19250
diff
changeset
|
71 super(c, StampFactory.forKind(((MethodCallTargetNode) invoke.callTarget()).targetMethod().getSignature().getReturnKind())); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
72 MethodCallTargetNode methodCallTarget = (MethodCallTargetNode) invoke.callTarget(); |
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
73 this.arguments = new NodeInputList<>(this, methodCallTarget.arguments()); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
74 this.bci = invoke.bci(); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
75 this.targetMethod = methodCallTarget.targetMethod(); |
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
76 this.returnType = methodCallTarget.returnType(); |
13782
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
77 this.invokeKind = methodCallTarget.invokeKind(); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
78 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
79 |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
80 public int getBci() { |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
81 return bci; |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
82 } |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
83 |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
84 public ResolvedJavaMethod getTargetMethod() { |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
85 return targetMethod; |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
86 } |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
87 |
8550
53cc1dd7ee18
pull replaceSnippetInvokes into MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
8416
diff
changeset
|
88 public JavaType getReturnType() { |
53cc1dd7ee18
pull replaceSnippetInvokes into MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
8416
diff
changeset
|
89 return returnType; |
53cc1dd7ee18
pull replaceSnippetInvokes into MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
8416
diff
changeset
|
90 } |
53cc1dd7ee18
pull replaceSnippetInvokes into MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
8416
diff
changeset
|
91 |
16290
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
92 protected FrameState stateAfter() { |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
93 return null; |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
94 } |
e6622e77e8c7
split MacroNode into MacroNode and MacroStateSplitNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16176
diff
changeset
|
95 |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
96 /** |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
97 * Gets a snippet to be used for lowering this macro node. The returned graph (if non-null) must |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
98 * have been {@linkplain #lowerReplacement(StructuredGraph, LoweringTool) lowered}. |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
99 */ |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
100 @SuppressWarnings("unused") |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
101 protected StructuredGraph getLoweredSnippetGraph(LoweringTool tool) { |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
102 return null; |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
103 } |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
104 |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
105 /** |
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
106 * Gets a normal method substitution to be used for lowering this macro node. This is only |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
107 * called if {@link #getLoweredSnippetGraph(LoweringTool)} returns null. The returned graph (if |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
108 * non-null) must have been {@linkplain #lowerReplacement(StructuredGraph, LoweringTool) |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
109 * lowered}. |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
110 */ |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
111 protected StructuredGraph getLoweredSubstitutionGraph(LoweringTool tool) { |
11732
03c781923573
made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents:
11700
diff
changeset
|
112 StructuredGraph methodSubstitution = tool.getReplacements().getMethodSubstitution(getTargetMethod()); |
03c781923573
made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents:
11700
diff
changeset
|
113 if (methodSubstitution != null) { |
13628
110795e38ac6
MacroNode: do not modify the cached version of the graph
Bernhard Urban <bernhard.urban@jku.at>
parents:
13618
diff
changeset
|
114 methodSubstitution = methodSubstitution.copy(); |
17328
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
115 if (stateAfter() == null || stateAfter().bci == BytecodeFrame.AFTER_BCI) { |
13606
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
116 /* |
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
117 * handles the case of a MacroNode inside a snippet used for another MacroNode |
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
118 * lowering |
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
119 */ |
13618
b87fcab6624a
Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents:
13617
diff
changeset
|
120 new CollapseFrameForSingleSideEffectPhase().apply(methodSubstitution); |
13606
bb8ea5fb4a2d
MacroNode: apply SnippetFrameStateCleanPhase for nested MacroNodes
Bernhard Urban <bernhard.urban@jku.at>
parents:
13505
diff
changeset
|
121 } |
13628
110795e38ac6
MacroNode: do not modify the cached version of the graph
Bernhard Urban <bernhard.urban@jku.at>
parents:
13618
diff
changeset
|
122 return lowerReplacement(methodSubstitution, tool); |
11732
03c781923573
made snippet and substitution graphs lower themselves before being inlined
Doug Simon <doug.simon@oracle.com>
parents:
11700
diff
changeset
|
123 } |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
124 return null; |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
125 } |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
126 |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
127 /** |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
128 * Applies {@linkplain LoweringPhase lowering} to a replacement graph. |
15002
06e50d290784
isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14633
diff
changeset
|
129 * |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
130 * @param replacementGraph a replacement (i.e., snippet or method substitution) graph |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
131 */ |
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
132 protected StructuredGraph lowerReplacement(final StructuredGraph replacementGraph, LoweringTool tool) { |
19250
8ab925a6f724
made Assumptions be part of a StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents:
18970
diff
changeset
|
133 final PhaseContext c = new PhaseContext(tool.getMetaAccess(), tool.getConstantReflection(), tool.getLowerer(), tool.getReplacements(), tool.getStampProvider()); |
16457
c51516ebe71c
remove value proxies during MacroNode lowering
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16449
diff
changeset
|
134 if (!graph().hasValueProxies()) { |
c51516ebe71c
remove value proxies during MacroNode lowering
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16449
diff
changeset
|
135 new RemoveValueProxyPhase().apply(replacementGraph); |
c51516ebe71c
remove value proxies during MacroNode lowering
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16449
diff
changeset
|
136 } |
13287
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
137 GuardsStage guardsStage = graph().getGuardsStage(); |
18970
edf3a7fdd067
Add utility methods to GuardsStage.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18845
diff
changeset
|
138 if (!guardsStage.allowsFloatingGuards()) { |
13287
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
139 new GuardLoweringPhase().apply(replacementGraph, null); |
18970
edf3a7fdd067
Add utility methods to GuardsStage.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18845
diff
changeset
|
140 if (guardsStage.areFrameStatesAtDeopts()) { |
13287
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
141 new FrameStateAssignmentPhase().apply(replacementGraph); |
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
142 } |
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
143 } |
9b053d478a4e
Use the appropriate phases in order to change the guards stage
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13197
diff
changeset
|
144 try (Scope s = Debug.scope("LoweringSnippetTemplate", replacementGraph)) { |
13505
75a67ebd50e8
Introduce a LoweringStage so that lowerings can be conditional on one of the three times that lowering is performed by default
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13287
diff
changeset
|
145 new LoweringPhase(new CanonicalizerPhase(true), tool.getLoweringStage()).apply(replacementGraph, c); |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13153
diff
changeset
|
146 } catch (Throwable e) { |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13153
diff
changeset
|
147 throw Debug.handle(e); |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13153
diff
changeset
|
148 } |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
149 return replacementGraph; |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
150 } |
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
151 |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
152 @Override |
11579
ae619d70bf4b
Rename LoweringType to GuardsPhase and make it an attribute of StructuredGraphs
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11252
diff
changeset
|
153 public void lower(LoweringTool tool) { |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
154 StructuredGraph replacementGraph = getLoweredSnippetGraph(tool); |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
155 if (replacementGraph == null) { |
11754
6e734982f89f
fixed concurrency issue in lowering of MacroNode replacement graphs
Doug Simon <doug.simon@oracle.com>
parents:
11732
diff
changeset
|
156 replacementGraph = getLoweredSubstitutionGraph(tool); |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
157 } |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
158 |
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
159 InvokeNode invoke = replaceWithInvoke(); |
9310
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9251
diff
changeset
|
160 assert invoke.verify(); |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
161 |
10888
406d9b8bf040
made it possible for a MacroNode to be lowered via a standard method substitution
Doug Simon <doug.simon@oracle.com>
parents:
10090
diff
changeset
|
162 if (replacementGraph != null) { |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
163 // Pull out the receiver null check so that a replaced |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
164 // receiver can be lowered if necessary |
15311
820c6d353358
added ModifiersProvider as superinterface for ResolvedJava[Method|Field|Type] and implemented all checks against modifiers as default methods
Doug Simon <doug.simon@oracle.com>
parents:
15263
diff
changeset
|
165 if (!targetMethod.isStatic()) { |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
166 ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
167 if (nonNullReceiver instanceof Lowerable) { |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
168 ((Lowerable) nonNullReceiver).lower(tool); |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
169 } |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
170 } |
16176
5785eca138b0
improve tracking of nodes to canonicalize after inlining
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15470
diff
changeset
|
171 InliningUtil.inline(invoke, replacementGraph, false, null); |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
172 Debug.dump(graph(), "After inlining replacement %s", replacementGraph); |
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
173 } else { |
19541
c66037cb9cd1
Make Node#replaceAndDelete not accept null as an argument.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19526
diff
changeset
|
174 if (invoke.stateAfter() == null) { |
16449
d8d4120c62ae
throw error when lowering MacroNode without stateAfter to an InvokeNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16290
diff
changeset
|
175 throw new GraalInternalError("cannot lower to invoke without state: %s", this); |
d8d4120c62ae
throw error when lowering MacroNode without stateAfter to an InvokeNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16290
diff
changeset
|
176 } |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11785
diff
changeset
|
177 invoke.lower(tool); |
7902
14fedab0419e
improved arraycopy and Object.clone snippets
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
178 } |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
179 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
180 |
13782
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
181 protected InvokeNode replaceWithInvoke() { |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
182 InvokeNode invoke = createInvoke(); |
9602
19c5a07c7843
Introduce a graph() method that returns a StructuredGraph, to make many explicit casts unnecessary
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9310
diff
changeset
|
183 graph().replaceFixedWithFixed(this, invoke); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
184 return invoke; |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
185 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
186 |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
187 protected InvokeNode createInvoke() { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18479
diff
changeset
|
188 MethodCallTargetNode callTarget = graph().add(new MethodCallTargetNode(invokeKind, targetMethod, arguments.toArray(new ValueNode[arguments.size()]), returnType)); |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18479
diff
changeset
|
189 InvokeNode invoke = graph().add(new InvokeNode(callTarget, bci)); |
13782
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
190 if (stateAfter() != null) { |
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
191 invoke.setStateAfter(stateAfter().duplicate()); |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14160
diff
changeset
|
192 if (getKind() != Kind.Void) { |
13782
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
193 invoke.stateAfter().replaceFirstInput(this, invoke); |
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
194 } |
c3d0aefceff7
remember InvokeKind in MacroNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
13628
diff
changeset
|
195 } |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
196 return invoke; |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
197 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
198 } |