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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }