Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java @ 19410:61d3cb8e1280
Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Mon, 16 Feb 2015 17:47:43 +0100 |
parents | 26777392b971 |
children | 87a2901b1f42 |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17140
diff
changeset
|
2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
8415
2361bf148c06
rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents:
8409
diff
changeset
|
23 package com.oracle.graal.replacements; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
9350
e7c396ce0f3d
better error message for incorrect usage of @NodeIntrinsic
Doug Simon <doug.simon@oracle.com>
parents:
9147
diff
changeset
|
25 import static com.oracle.graal.api.meta.MetaUtil.*; |
e7c396ce0f3d
better error message for incorrect usage of @NodeIntrinsic
Doug Simon <doug.simon@oracle.com>
parents:
9147
diff
changeset
|
26 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
27 import java.lang.reflect.*; |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
28 import java.util.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
29 |
12363
78e5badf4b8e
moved lookupForeignCall() from CodeCacheProvider to ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12362
diff
changeset
|
30 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
|
31 import com.oracle.graal.api.meta.*; |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
32 import com.oracle.graal.api.replacements.*; |
15193
96bb07a5d667
Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents:
15018
diff
changeset
|
33 import com.oracle.graal.compiler.common.*; |
15198
2c0cfbf454b5
Move LIRTypeTool and Stamp to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents:
15193
diff
changeset
|
34 import com.oracle.graal.compiler.common.type.*; |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
35 import com.oracle.graal.debug.*; |
10635 | 36 import com.oracle.graal.debug.internal.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
37 import com.oracle.graal.graph.*; |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14953
diff
changeset
|
38 import com.oracle.graal.graph.Node.ConstantNodeParameter; |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14953
diff
changeset
|
39 import com.oracle.graal.graph.Node.InjectedNodeParameter; |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14953
diff
changeset
|
40 import com.oracle.graal.graph.Node.NodeIntrinsic; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
41 import com.oracle.graal.nodes.*; |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
42 import com.oracle.graal.nodes.calc.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
43 import com.oracle.graal.nodes.extended.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
44 import com.oracle.graal.nodes.java.*; |
18496
59ffee3765ec
LoadHubNode should always use StampProvider stamp
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
18487
diff
changeset
|
45 import com.oracle.graal.nodes.spi.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
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.*; |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
48 import com.oracle.graal.phases.util.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
49 |
8409
c3fc0e257800
rename: SnippetIntrinsificationPhase -> NodeIntrinsificationPhase
Doug Simon <doug.simon@oracle.com>
parents:
8378
diff
changeset
|
50 /** |
c3fc0e257800
rename: SnippetIntrinsificationPhase -> NodeIntrinsificationPhase
Doug Simon <doug.simon@oracle.com>
parents:
8378
diff
changeset
|
51 * Replaces calls to {@link NodeIntrinsic}s with nodes and calls to methods annotated with |
c3fc0e257800
rename: SnippetIntrinsificationPhase -> NodeIntrinsificationPhase
Doug Simon <doug.simon@oracle.com>
parents:
8378
diff
changeset
|
52 * {@link Fold} with the result of invoking the annotated method via reflection. |
c3fc0e257800
rename: SnippetIntrinsificationPhase -> NodeIntrinsificationPhase
Doug Simon <doug.simon@oracle.com>
parents:
8378
diff
changeset
|
53 */ |
c3fc0e257800
rename: SnippetIntrinsificationPhase -> NodeIntrinsificationPhase
Doug Simon <doug.simon@oracle.com>
parents:
8378
diff
changeset
|
54 public class NodeIntrinsificationPhase extends Phase { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
55 |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
56 private final Providers providers; |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
57 private final SnippetReflectionProvider snippetReflection; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
58 |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
59 public NodeIntrinsificationPhase(Providers providers, SnippetReflectionProvider snippetReflection) { |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
60 this.providers = providers; |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
61 this.snippetReflection = snippetReflection; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
62 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
63 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
64 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
65 protected void run(StructuredGraph graph) { |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
66 ArrayList<Node> cleanUpReturnList = new ArrayList<>(); |
19410
61d3cb8e1280
Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19357
diff
changeset
|
67 for (MethodCallTargetNode node : graph.getNodes(MethodCallTargetNode.TYPE)) { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
68 tryIntrinsify(node, cleanUpReturnList); |
5760
87e8baf5447c
added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents:
5719
diff
changeset
|
69 } |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
70 |
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
71 for (Node node : cleanUpReturnList) { |
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
72 cleanUpReturnCheckCast(node); |
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
73 } |
5760
87e8baf5447c
added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents:
5719
diff
changeset
|
74 } |
87e8baf5447c
added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents:
5719
diff
changeset
|
75 |
11588 | 76 protected boolean tryIntrinsify(MethodCallTargetNode methodCallTargetNode, List<Node> cleanUpReturnList) { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
77 ResolvedJavaMethod target = methodCallTargetNode.targetMethod(); |
7027
58dbea9fb973
CompilerToVM.lookupType() now fails with an exception if eagerResolve is true and resolution fails
Doug Simon <doug.simon@oracle.com>
parents:
6539
diff
changeset
|
78 ResolvedJavaType declaringClass = target.getDeclaringClass(); |
12655
2c4aa758ee18
made ConstantNodes external to a Graph (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
79 StructuredGraph graph = methodCallTargetNode.graph(); |
14952
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
80 |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
81 NodeIntrinsic intrinsic = getIntrinsic(target); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
82 if (intrinsic != null) { |
5576
a4d0ded32ddd
moved @Fold from Node.java to Snippet.java
Doug Simon <doug.simon@oracle.com>
parents:
5572
diff
changeset
|
83 assert target.getAnnotation(Fold.class) == null; |
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:
15261
diff
changeset
|
84 assert target.isStatic() : "node intrinsic must be static: " + target; |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
85 |
16486
d3fc4779fc60
moved signatureToTypes(ResolvedJavaMethod method) from MetaUtil to be a default method in ResolvedJavaMethod
Doug Simon <doug.simon@oracle.com>
parents:
16484
diff
changeset
|
86 ResolvedJavaType[] parameterTypes = resolveJavaTypes(target.toParameterTypes(), declaringClass); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
87 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
88 // Prepare the arguments for the reflective constructor call on the node class. |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
89 Object[] nodeConstructorArguments = prepareArguments(methodCallTargetNode, parameterTypes, target, false); |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
90 if (nodeConstructorArguments == null) { |
8175
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
91 return false; |
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
92 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
93 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
94 // Create the new node instance. |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
95 ResolvedJavaType c = getNodeClass(target, intrinsic); |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
96 Node newInstance = createNodeInstance(graph, c, parameterTypes, methodCallTargetNode.invoke().asNode().stamp(), intrinsic.setStampFromReturnType(), nodeConstructorArguments); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
97 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
98 // Replace the invoke with the new node. |
12655
2c4aa758ee18
made ConstantNodes external to a Graph (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
99 newInstance = graph.addOrUnique(newInstance); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
100 methodCallTargetNode.invoke().intrinsify(newInstance); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
101 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
102 // Clean up checkcast instructions inserted by javac if the return type is generic. |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
103 cleanUpReturnList.add(newInstance); |
11588 | 104 } else if (isFoldable(target)) { |
16486
d3fc4779fc60
moved signatureToTypes(ResolvedJavaMethod method) from MetaUtil to be a default method in ResolvedJavaMethod
Doug Simon <doug.simon@oracle.com>
parents:
16484
diff
changeset
|
105 ResolvedJavaType[] parameterTypes = resolveJavaTypes(target.toParameterTypes(), declaringClass); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
106 |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
107 // Prepare the arguments for the reflective method call |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
108 JavaConstant[] arguments = (JavaConstant[]) prepareArguments(methodCallTargetNode, parameterTypes, target, true); |
8175
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
109 if (arguments == null) { |
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
110 return false; |
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
111 } |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17140
diff
changeset
|
112 JavaConstant receiver = null; |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
113 if (!methodCallTargetNode.isStatic()) { |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
114 receiver = arguments[0]; |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
115 arguments = Arrays.copyOfRange(arguments, 1, arguments.length); |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
116 parameterTypes = Arrays.copyOfRange(parameterTypes, 1, parameterTypes.length); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
117 } |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
118 |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
119 // Call the method |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17140
diff
changeset
|
120 JavaConstant constant = target.invoke(receiver, arguments); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
121 |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
122 if (constant != null) { |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
123 // Replace the invoke with the result of the call |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
124 ConstantNode node = ConstantNode.forConstant(constant, providers.getMetaAccess(), methodCallTargetNode.graph()); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
125 methodCallTargetNode.invoke().intrinsify(node); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
126 |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
127 // Clean up checkcast instructions inserted by javac if the return type is generic. |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
128 cleanUpReturnList.add(node); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
129 } else { |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
130 // Remove the invoke |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
131 methodCallTargetNode.invoke().intrinsify(null); |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
132 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
133 } |
8175
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
134 return true; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
135 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
136 |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
137 /** |
14952
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
138 * Permits a subclass to override the default definition of "intrinsic". |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
139 */ |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
140 protected NodeIntrinsic getIntrinsic(ResolvedJavaMethod method) { |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
141 return method.getAnnotation(Node.NodeIntrinsic.class); |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
142 } |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
143 |
6b29befc7f38
Make intrinsification decisions customizable by subclass
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14633
diff
changeset
|
144 /** |
11588 | 145 * Permits a subclass to override the default definition of "foldable". |
146 */ | |
147 protected boolean isFoldable(ResolvedJavaMethod method) { | |
148 return method.getAnnotation(Fold.class) != null; | |
149 } | |
150 | |
151 /** | |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
152 * Converts the arguments of an invoke node to object values suitable for use as the arguments |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
153 * to a reflective invocation of a Java constructor or method. |
14873
00eb80d735ed
removed Debug.printf and added multi-arg versions of Debug.dump
Doug Simon <doug.simon@oracle.com>
parents:
14633
diff
changeset
|
154 * |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
155 * @param folding specifies if the invocation is for handling a {@link Fold} annotation |
8175
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
156 * @return the arguments for the reflective invocation or null if an argument of {@code invoke} |
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
157 * that is expected to be constant isn't |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
158 */ |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
159 private Object[] prepareArguments(MethodCallTargetNode methodCallTargetNode, ResolvedJavaType[] parameterTypes, ResolvedJavaMethod target, boolean folding) { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
160 NodeInputList<ValueNode> arguments = methodCallTargetNode.arguments(); |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
161 Object[] reflectionCallArguments = folding ? new JavaConstant[arguments.size()] : new Object[arguments.size()]; |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
162 for (int i = 0; i < reflectionCallArguments.length; ++i) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
163 int parameterIndex = i; |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9101
diff
changeset
|
164 if (!methodCallTargetNode.isStatic()) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
165 parameterIndex--; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
166 } |
8913
653110156f8a
refactored boxing identification and lowering, removed BoxingMethodPool and explicit boxing phases
Lukas Stadler <lukas.stadler@jku.at>
parents:
8575
diff
changeset
|
167 ValueNode argument = arguments.get(i); |
16477
46397dc87086
moved getParameterAnnotation() from MetaUtil to be a default method in ResolvedJavaMethod
Doug Simon <doug.simon@oracle.com>
parents:
16450
diff
changeset
|
168 if (folding || target.getParameterAnnotation(ConstantNodeParameter.class, parameterIndex) != null) { |
5760
87e8baf5447c
added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents:
5719
diff
changeset
|
169 if (!(argument instanceof ConstantNode)) { |
8175
11298242e782
removed use of NonConstantParameterError (GRAAL-147)
Doug Simon <doug.simon@oracle.com>
parents:
7897
diff
changeset
|
170 return null; |
5760
87e8baf5447c
added snippets for lowering array creation and initialization (in NewObjectSnippets)
Doug Simon <doug.simon@oracle.com>
parents:
5719
diff
changeset
|
171 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
172 ConstantNode constantNode = (ConstantNode) argument; |
18487
0f4813e0b4a9
Use asConstant() instead of asJavaConstant() where possible.
Roland Schatz <roland.schatz@oracle.com>
parents:
18402
diff
changeset
|
173 Constant constant = constantNode.asConstant(); |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
174 /* |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
175 * For intrinsification (but not for folding) if we have a Class<?> object we want |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
176 * the corresponding ResolvedJavaType. |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
177 */ |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
178 ResolvedJavaType type = folding ? null : providers.getConstantReflection().asJavaType(constant); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
179 Object arg; |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
180 if (type != null) { |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
181 /* If we found such a type then it's our arg */ |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
182 arg = type; |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
183 parameterTypes[i] = providers.getMetaAccess().lookupJavaType(ResolvedJavaType.class); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
184 } else { |
18487
0f4813e0b4a9
Use asConstant() instead of asJavaConstant() where possible.
Roland Schatz <roland.schatz@oracle.com>
parents:
18402
diff
changeset
|
185 JavaConstant javaConstant = (JavaConstant) constant; |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
186 if (folding) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
187 /* For folding we want JavaConstants */ |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
188 arg = javaConstant; |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
189 } else { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
190 /* For intrinsification we want want corresponding objects */ |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
191 if (parameterTypes[i].getKind() == Kind.Boolean) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
192 arg = Boolean.valueOf(javaConstant.asInt() != 0); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
193 } else if (parameterTypes[i].getKind() == Kind.Byte) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
194 arg = Byte.valueOf((byte) javaConstant.asInt()); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
195 } else if (parameterTypes[i].getKind() == Kind.Short) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
196 arg = Short.valueOf((short) javaConstant.asInt()); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
197 } else if (parameterTypes[i].getKind() == Kind.Char) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
198 arg = Character.valueOf((char) javaConstant.asInt()); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
199 } else if (parameterTypes[i].getKind() == Kind.Object) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
200 arg = snippetReflection.asObject(parameterTypes[i], javaConstant); |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
201 } else { |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
202 arg = javaConstant.asBoxedPrimitive(); |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
203 } |
5463
b6311d367bd6
support use of boolean, byte, char and short constant arguments in @NodeIntrinsic methods
Doug Simon <doug.simon@oracle.com>
parents:
5372
diff
changeset
|
204 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
205 } |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
206 |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
207 assert folding || !(arg instanceof JavaConstant); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
208 reflectionCallArguments[i] = arg; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
209 } else { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
210 reflectionCallArguments[i] = argument; |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
211 parameterTypes[i] = providers.getMetaAccess().lookupJavaType(ValueNode.class); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
212 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
213 } |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
214 return reflectionCallArguments; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
215 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
216 |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
217 private ResolvedJavaType getNodeClass(ResolvedJavaMethod target, NodeIntrinsic intrinsic) { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
218 ResolvedJavaType result; |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
219 if (intrinsic.value() == NodeIntrinsic.class) { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
220 result = target.getDeclaringClass(); |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
221 } else { |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
222 result = providers.getMetaAccess().lookupJavaType(intrinsic.value()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
223 } |
16478
1f1ac8857d92
moved toJavaName(JavaType type, boolean qualified) from MetaUtil to be a default method in JavaType
Doug Simon <doug.simon@oracle.com>
parents:
16477
diff
changeset
|
224 assert providers.getMetaAccess().lookupJavaType(ValueNode.class).isAssignableFrom(result) : "Node intrinsic class " + result.toJavaName(false) + " derived from @" + |
16480
10c12d09a8d2
moved format(String format, JavaMethod method) from MetaUtil to be a default method in JavaMethod
Doug Simon <doug.simon@oracle.com>
parents:
16479
diff
changeset
|
225 NodeIntrinsic.class.getSimpleName() + " annotation on " + target.format("%H.%n(%p)") + " is not a subclass of " + ValueNode.class; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
226 return result; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
227 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
228 |
17140
f95ddcd3e08a
Allow customization by subclasses
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17064
diff
changeset
|
229 protected Node createNodeInstance(StructuredGraph graph, ResolvedJavaType nodeClass, ResolvedJavaType[] parameterTypes, Stamp invokeStamp, boolean setStampFromReturnType, |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
230 Object[] nodeConstructorArguments) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
231 ResolvedJavaMethod constructor = null; |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
232 Object[] arguments = null; |
5578
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
233 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
234 for (ResolvedJavaMethod c : nodeClass.getDeclaredConstructors()) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
235 Object[] match = match(graph, invokeStamp, c, parameterTypes, nodeConstructorArguments); |
5578
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
236 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
237 if (match != null) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
238 if (constructor == null) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
239 constructor = c; |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
240 arguments = match; |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
241 } else { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
242 throw new GraalInternalError("Found multiple constructors in %s compatible with signature %s: %s, %s", nodeClass.toJavaName(), sigString(parameterTypes), constructor, c); |
5578
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
243 } |
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
244 } |
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
245 } |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
246 if (constructor == null) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
247 throw new GraalInternalError("Could not find constructor in %s compatible with signature %s", nodeClass.toJavaName(), sigString(parameterTypes)); |
5578
445dd1a9b8d8
enhanced @NodeIntrinsic intrinsification to take into account varargs in the node constructors when matching call arguments
Doug Simon <doug.simon@oracle.com>
parents:
5576
diff
changeset
|
248 } |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
249 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
250 try { |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
251 ValueNode intrinsicNode = (ValueNode) invokeConstructor(constructor, arguments); |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
252 |
6419
b74402a7079b
fixed oopmap bug caused by unsafe mixing of word and object values
Doug Simon <doug.simon@oracle.com>
parents:
6409
diff
changeset
|
253 if (setStampFromReturnType) { |
11698
4eec2ac671c2
Refactor the WordTypeVerificationPhase to use fewer graph iterations, and invoke it a fewer places
Christian Wimmer <christian.wimmer@oracle.com>
parents:
11652
diff
changeset
|
254 intrinsicNode.setStamp(invokeStamp); |
6419
b74402a7079b
fixed oopmap bug caused by unsafe mixing of word and object values
Doug Simon <doug.simon@oracle.com>
parents:
6409
diff
changeset
|
255 } |
b74402a7079b
fixed oopmap bug caused by unsafe mixing of word and object values
Doug Simon <doug.simon@oracle.com>
parents:
6409
diff
changeset
|
256 return intrinsicNode; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
257 } catch (Exception e) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
258 throw new RuntimeException(constructor + Arrays.toString(nodeConstructorArguments), e); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
259 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
260 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
261 |
19357
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
262 protected Object invokeConstructor(ResolvedJavaMethod constructor, Object[] arguments) { |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
263 return snippetReflection.invoke(constructor, null, arguments); |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
264 } |
26777392b971
Fix prepareArguments for @Fold usecase
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18969
diff
changeset
|
265 |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
266 private static String sigString(ResolvedJavaType[] types) { |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
267 StringBuilder sb = new StringBuilder("("); |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
268 for (int i = 0; i < types.length; i++) { |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
269 if (i != 0) { |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
270 sb.append(", "); |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
271 } |
16479
558cf39c646b
moved toJavaName(JavaType type) from MetaUtil to be a default method in JavaType
Doug Simon <doug.simon@oracle.com>
parents:
16478
diff
changeset
|
272 sb.append(types[i].toJavaName()); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
273 } |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
274 return sb.append(")").toString(); |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
275 } |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
276 |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
277 private static boolean checkNoMoreInjected(ResolvedJavaMethod c, int start) { |
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
278 int count = c.getSignature().getParameterCount(false); |
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
279 for (int i = start; i < count; i++) { |
16477
46397dc87086
moved getParameterAnnotation() from MetaUtil to be a default method in ResolvedJavaMethod
Doug Simon <doug.simon@oracle.com>
parents:
16450
diff
changeset
|
280 if (c.getParameterAnnotation(InjectedNodeParameter.class, i) != null) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
281 throw new GraalInternalError("Injected parameter %d of type %s must precede all non-injected parameters of %s", i, |
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
282 c.getSignature().getParameterType(i, c.getDeclaringClass()).toJavaName(false), c.format("%H.%n(%p)")); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
283 } |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
284 } |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
285 return true; |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
286 } |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
287 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
288 private Object[] match(StructuredGraph graph, Stamp invokeStamp, ResolvedJavaMethod c, ResolvedJavaType[] parameterTypes, Object[] nodeConstructorArguments) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
289 Object[] arguments = null; |
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
290 Object[] injected = null; |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
291 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
292 ResolvedJavaType[] signature = resolveJavaTypes(c.getSignature().toParameterTypes(null), c.getDeclaringClass()); |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
293 MetaAccessProvider metaAccess = providers.getMetaAccess(); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
294 for (int i = 0; i < signature.length; i++) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
295 if (c.getParameterAnnotation(InjectedNodeParameter.class, i) != null) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
296 injected = injected == null ? new Object[1] : Arrays.copyOf(injected, injected.length + 1); |
18515
e846c9e2f0e5
added support for binding arguments of arbitrary types to parameters of a node intrinsic constructor (or factory method)
Doug Simon <doug.simon@oracle.com>
parents:
18496
diff
changeset
|
297 Object injectedParameter = snippetReflection.getInjectedNodeIntrinsicParameter(signature[i]); |
e846c9e2f0e5
added support for binding arguments of arbitrary types to parameters of a node intrinsic constructor (or factory method)
Doug Simon <doug.simon@oracle.com>
parents:
18496
diff
changeset
|
298 if (injectedParameter != null) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
299 injected[injected.length - 1] = injectedParameter; |
18515
e846c9e2f0e5
added support for binding arguments of arbitrary types to parameters of a node intrinsic constructor (or factory method)
Doug Simon <doug.simon@oracle.com>
parents:
18496
diff
changeset
|
300 } else if (signature[i].equals(metaAccess.lookupJavaType(MetaAccessProvider.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
301 injected[injected.length - 1] = metaAccess; |
12655
2c4aa758ee18
made ConstantNodes external to a Graph (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
302 } else if (signature[i].equals(metaAccess.lookupJavaType(StructuredGraph.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
303 injected[injected.length - 1] = graph; |
12362
f53dc8bbb88c
refactored isReexecutable(), getKilledLocations() and canDeoptimize() out of MetaAccessProvider into ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12361
diff
changeset
|
304 } else if (signature[i].equals(metaAccess.lookupJavaType(ForeignCallsProvider.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
305 injected[injected.length - 1] = providers.getForeignCalls(); |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
306 } else if (signature[i].equals(metaAccess.lookupJavaType(SnippetReflectionProvider.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
307 injected[injected.length - 1] = snippetReflection; |
18402
64c042352f00
Make stamp of LoadHubNode flexible.
Roland Schatz <roland.schatz@oracle.com>
parents:
18370
diff
changeset
|
308 } else if (signature[i].isAssignableFrom(metaAccess.lookupJavaType(Stamp.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
309 injected[injected.length - 1] = invokeStamp; |
18496
59ffee3765ec
LoadHubNode should always use StampProvider stamp
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
18487
diff
changeset
|
310 } else if (signature[i].isAssignableFrom(metaAccess.lookupJavaType(StampProvider.class))) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
311 injected[injected.length - 1] = providers.getStampProvider(); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
312 } else { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
313 throw new GraalInternalError("Cannot handle injected argument of type %s in %s", signature[i].toJavaName(), c.format("%H.%n(%p)")); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
314 } |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
315 } else { |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
316 if (i > 0) { |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
317 // Chop injected arguments from signature |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
318 signature = Arrays.copyOfRange(signature, i, signature.length); |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
319 } |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
320 assert checkNoMoreInjected(c, i); |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
321 break; |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
322 } |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
323 } |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
324 |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
325 if (Arrays.equals(parameterTypes, signature)) { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
326 // Exact match |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
327 arguments = nodeConstructorArguments; |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
328 |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
329 } else if (signature.length > 0 && signature[signature.length - 1].isArray()) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
330 // Last constructor parameter is an array, so check if we have a vararg match |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
331 int fixedArgs = signature.length - 1; |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
332 if (parameterTypes.length < fixedArgs) { |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
333 return null; |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
334 } |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
335 for (int i = 0; i < fixedArgs; i++) { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
336 if (!parameterTypes[i].equals(signature[i])) { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
337 return null; |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
338 } |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
339 } |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
340 |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
341 ResolvedJavaType componentType = signature[fixedArgs].getComponentType(); |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
342 assert componentType != null; |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
343 for (int i = fixedArgs; i < nodeConstructorArguments.length; i++) { |
9101
cfe822a31f67
Use same type check for varargs and non-varargs parameters
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9100
diff
changeset
|
344 if (!parameterTypes[i].equals(componentType)) { |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
345 return null; |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
346 } |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
347 } |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
348 arguments = Arrays.copyOf(nodeConstructorArguments, fixedArgs + 1); |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
349 arguments[fixedArgs] = snippetReflection.newArray(componentType, nodeConstructorArguments.length - fixedArgs); |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
350 |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
351 Object varargs = arguments[fixedArgs]; |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
352 for (int i = fixedArgs; i < nodeConstructorArguments.length; i++) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
353 if (componentType.isPrimitive()) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
354 Array.set(varargs, i - fixedArgs, nodeConstructorArguments[i]); |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
355 } else { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18533
diff
changeset
|
356 ((Object[]) varargs)[i - fixedArgs] = nodeConstructorArguments[i]; |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
357 } |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
358 } |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
359 } else { |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
360 return null; |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
361 } |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
362 |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
363 if (injected != null) { |
18533
25a21e1794ec
modified SnippetReflectionProvider to support both VM-side and compiler-side constants in a compilation replay context
Doug Simon <doug.simon@oracle.com>
parents:
18515
diff
changeset
|
364 Object[] copy = new Object[injected.length + arguments.length]; |
12361
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
365 System.arraycopy(injected, 0, copy, 0, injected.length); |
ec57cc36371e
introduced @InjectedNodeParameter annotation to make injection of arguments during node intrinsification more extensible
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
366 System.arraycopy(arguments, 0, copy, injected.length, arguments.length); |
9100
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
367 arguments = copy; |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
368 } |
d24955427b0b
Remove MetaUtil.getMirrorOrFail; Add necessary functionality to the Graal API so that all previous usages of java.lang.Class can now use ResolvedJavaType
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9089
diff
changeset
|
369 return arguments; |
5175
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
370 } |
a8c5283a835c
added @Fold to folding methods during snippet intrinsification; replaced CardTableStartNode and CardTableShiftNode with @Fold methods
Doug Simon <doug.simon@oracle.com>
parents:
5061
diff
changeset
|
371 |
5563
6a2671066204
added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents:
5547
diff
changeset
|
372 private static String sourceLocation(Node n) { |
6a2671066204
added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents:
5547
diff
changeset
|
373 String loc = GraphUtil.approxSourceLocation(n); |
6a2671066204
added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents:
5547
diff
changeset
|
374 return loc == null ? "<unknown>" : loc; |
6a2671066204
added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents:
5547
diff
changeset
|
375 } |
6a2671066204
added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents:
5547
diff
changeset
|
376 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
377 public void cleanUpReturnCheckCast(Node newInstance) { |
17064
3c54a098455f
removed Node.recordsUsages()
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
378 if (newInstance instanceof ValueNode && (((ValueNode) newInstance).getKind() != Kind.Object || ((ValueNode) newInstance).stamp() == StampFactory.forNodeIntrinsic())) { |
4309
4a609a685fa4
changes to Node structures:
Lukas Stadler <lukas.stadler@jku.at>
parents:
4199
diff
changeset
|
379 StructuredGraph graph = (StructuredGraph) newInstance.graph(); |
4411
cd2b68ef8e23
cleanup around filter and predicates :
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4310
diff
changeset
|
380 for (CheckCastNode checkCastNode : newInstance.usages().filter(CheckCastNode.class).snapshot()) { |
cd2b68ef8e23
cleanup around filter and predicates :
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4310
diff
changeset
|
381 for (Node checkCastUsage : checkCastNode.usages().snapshot()) { |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
382 checkCheckCastUsage(graph, newInstance, checkCastNode, checkCastUsage); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
383 } |
16450
b650d0a98146
new GraphUtil.unlinkFixedNode utility method
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15311
diff
changeset
|
384 GraphUtil.unlinkFixedNode(checkCastNode); |
5372
4485e0edd1af
made CheckCastNode be a FixedNode instead of a BooleanNode
Doug Simon <doug.simon@oracle.com>
parents:
5210
diff
changeset
|
385 GraphUtil.killCFG(checkCastNode); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
386 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
387 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
388 } |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
389 |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
390 private static void checkCheckCastUsage(StructuredGraph graph, Node intrinsifiedNode, Node input, Node usage) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
391 if (usage instanceof ValueAnchorNode) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
392 ValueAnchorNode valueAnchorNode = (ValueAnchorNode) usage; |
11711
f12b418ebc74
Allow only single input for value anchors.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11698
diff
changeset
|
393 valueAnchorNode.removeAnchoredNode(); |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
394 Debug.log("%s: Removed a ValueAnchor input", Debug.contextSnapshot(JavaMethod.class)); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
395 } else if (usage instanceof UnboxNode) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
396 UnboxNode unbox = (UnboxNode) usage; |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
397 unbox.replaceAtUsages(intrinsifiedNode); |
10569
6b9ebfcf5fc5
make BoxNode and UnboxNode floating
Lukas Stadler <lukas.stadler@jku.at>
parents:
9861
diff
changeset
|
398 graph.removeFloating(unbox); |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
399 Debug.log("%s: Removed an UnboxNode", Debug.contextSnapshot(JavaMethod.class)); |
12738
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
400 } else if (usage instanceof UnsafeStoreNode) { |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
401 UnsafeStoreNode store = (UnsafeStoreNode) usage; |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
402 store.replaceFirstInput(input, intrinsifiedNode); |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
403 } else if (usage instanceof LoadFieldNode) { |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
404 LoadFieldNode load = (LoadFieldNode) usage; |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
405 load.replaceAtUsages(intrinsifiedNode); |
9a56121f285b
Add missing cases for CheckCast usages in NodeIntrisification when BoxingSubstitutions are disabled
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
12655
diff
changeset
|
406 graph.removeFixed(load); |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
407 } else if (usage instanceof MethodCallTargetNode) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
408 MethodCallTargetNode checkCastCallTarget = (MethodCallTargetNode) usage; |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
409 assert checkCastCallTarget.targetMethod().getAnnotation(NodeIntrinsic.class) != null : "checkcast at " + sourceLocation(input) + |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
410 " not used by an unboxing method or node intrinsic, but by a call at " + sourceLocation(checkCastCallTarget.usages().first()) + " to " + checkCastCallTarget.targetMethod(); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
411 usage.replaceFirstInput(input, intrinsifiedNode); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
412 Debug.log("%s: Checkcast used in an other node intrinsic", Debug.contextSnapshot(JavaMethod.class)); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
413 } else if (usage instanceof FrameState) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
414 usage.replaceFirstInput(input, null); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
415 Debug.log("%s: Checkcast used in a FS", Debug.contextSnapshot(JavaMethod.class)); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
416 } else if (usage instanceof ReturnNode && ((ValueNode) intrinsifiedNode).stamp() == StampFactory.forNodeIntrinsic()) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
417 usage.replaceFirstInput(input, intrinsifiedNode); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
418 Debug.log("%s: Checkcast used in a return with forNodeIntrinsic stamp", Debug.contextSnapshot(JavaMethod.class)); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
419 } else if (usage instanceof IsNullNode) { |
18937
ff232ff8d028
Add utility Node#hasNoUsages.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18845
diff
changeset
|
420 if (!usage.hasNoUsages()) { |
18969
14496953435e
Use Node#getUsageCount wherever possible.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18937
diff
changeset
|
421 assert usage.getUsageCount() == 1 && usage.usages().first().predecessor() == input : usage + " " + input; |
10635 | 422 graph.replaceFloating((FloatingNode) usage, LogicConstantNode.contradiction(graph)); |
423 Debug.log("%s: Replaced IsNull with false", Debug.contextSnapshot(JavaMethod.class)); | |
424 } else { | |
425 // Removed as usage of a GuardingPiNode | |
426 } | |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
427 } else if (usage instanceof ProxyNode) { |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
428 ProxyNode proxy = (ProxyNode) usage; |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14953
diff
changeset
|
429 assert proxy instanceof ValueProxyNode; |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14953
diff
changeset
|
430 ProxyNode newProxy = ProxyNode.forValue((ValueNode) intrinsifiedNode, proxy.proxyPoint(), graph); |
9861
2d5c0f7ce7a1
Add a PiNode for the null-checked receiver during inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9860
diff
changeset
|
431 for (Node proxyUsage : usage.usages().snapshot()) { |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
432 checkCheckCastUsage(graph, newProxy, proxy, proxyUsage); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
433 } |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
434 } else if (usage instanceof PiNode) { |
9861
2d5c0f7ce7a1
Add a PiNode for the null-checked receiver during inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9860
diff
changeset
|
435 for (Node piUsage : usage.usages().snapshot()) { |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
436 checkCheckCastUsage(graph, intrinsifiedNode, usage, piUsage); |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
437 } |
10635 | 438 } else if (usage instanceof GuardingPiNode) { |
439 GuardingPiNode pi = (GuardingPiNode) usage; | |
440 for (Node piUsage : pi.usages().snapshot()) { | |
441 checkCheckCastUsage(graph, intrinsifiedNode, usage, piUsage); | |
442 } | |
443 graph.removeFixed(pi); | |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
444 } else { |
14873
00eb80d735ed
removed Debug.printf and added multi-arg versions of Debug.dump
Doug Simon <doug.simon@oracle.com>
parents:
14633
diff
changeset
|
445 DebugScope.forceDump(graph, "exception"); |
10635 | 446 assert false : sourceLocation(usage) + " has unexpected usage " + usage + " of checkcast " + input + " at " + sourceLocation(input); |
9860
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
447 } |
6a0da51dfba4
Handle Proxies and pi nodes better in the NodeIntrinsificationPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9350
diff
changeset
|
448 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
449 } |