Mercurial > hg > truffle
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPlugin.java @ 21780:3d15183f3c93
Introduce Compiler interface in jvmci. Use it from jvmci.hotspot.CompilationTask
author | Gilles Duboscq <gilles.m.duboscq@oracle.com> |
---|---|
date | Wed, 03 Jun 2015 15:47:54 +0200 |
parents | 625b2b12b418 |
children |
rev | line source |
---|---|
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
1 /* |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
4 * |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
8 * |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
14 * |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
18 * |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
21 * questions. |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
22 */ |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
23 package com.oracle.graal.replacements; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
24 |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
25 import static com.oracle.graal.replacements.NodeIntrinsificationPhase.*; |
21556
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21543
diff
changeset
|
26 import static com.oracle.jvmci.meta.MetaUtil.*; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
27 |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
28 import java.util.*; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
29 |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
30 import com.oracle.graal.api.replacements.*; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
31 import com.oracle.graal.compiler.common.type.*; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
32 import com.oracle.graal.graph.Node.NodeIntrinsic; |
19883
4d33cd6e0c8f
refactored GraphBuilderConfiguration (and its component classes) into a separate project
Doug Simon <doug.simon@oracle.com>
parents:
19801
diff
changeset
|
33 import com.oracle.graal.graphbuilderconf.*; |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
34 import com.oracle.graal.nodeinfo.*; |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
35 import com.oracle.graal.nodeinfo.StructuralInput.MarkerType; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
36 import com.oracle.graal.nodes.*; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
37 import com.oracle.graal.nodes.extended.*; |
19801
2e6e20ac56b4
moved WordTypes from c.o.g.word.phases to c.o.g.word
Doug Simon <doug.simon@oracle.com>
parents:
19797
diff
changeset
|
38 import com.oracle.graal.word.*; |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21364
diff
changeset
|
39 import com.oracle.jvmci.common.*; |
21780
3d15183f3c93
Introduce Compiler interface in jvmci. Use it from jvmci.hotspot.CompilationTask
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents:
21606
diff
changeset
|
40 import com.oracle.jvmci.debug.*; |
21556
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21543
diff
changeset
|
41 import com.oracle.jvmci.meta.*; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
42 |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
43 /** |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
44 * An {@link NodePlugin} that handles methods annotated by {@link Fold} and {@link NodeIntrinsic}. |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
45 */ |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
46 public class NodeIntrinsificationPlugin implements NodePlugin { |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
47 protected final NodeIntrinsificationPhase nodeIntrinsification; |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
48 private final WordTypes wordTypes; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
49 private final ResolvedJavaType structuralInputType; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
50 private final boolean mustIntrinsify; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
51 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
52 public NodeIntrinsificationPlugin(MetaAccessProvider metaAccess, NodeIntrinsificationPhase nodeIntrinsification, WordTypes wordTypes, boolean mustIntrinsify) { |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
53 this.nodeIntrinsification = nodeIntrinsification; |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
54 this.wordTypes = wordTypes; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
55 this.mustIntrinsify = mustIntrinsify; |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
56 this.structuralInputType = metaAccess.lookupJavaType(StructuralInput.class); |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
57 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
58 |
21009
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
59 /** |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
60 * Calls in replacements to methods matching one of these filters are elided. Only void methods |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
61 * are considered for elision. The use of "snippets" in name of the variable and system property |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
62 * is purely for legacy reasons. |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
63 */ |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
64 private static final MethodFilter[] MethodsElidedInSnippets = getMethodsElidedInSnippets(); |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
65 |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
66 private static MethodFilter[] getMethodsElidedInSnippets() { |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
67 String commaSeparatedPatterns = System.getProperty("graal.MethodsElidedInSnippets"); |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
68 if (commaSeparatedPatterns != null) { |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
69 return MethodFilter.parse(commaSeparatedPatterns); |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
70 } |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
71 return null; |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
72 } |
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
73 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
74 @Override |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
75 public boolean handleInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
76 NodeIntrinsic intrinsic = nodeIntrinsification.getIntrinsic(method); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
77 if (intrinsic != null) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
78 Signature sig = method.getSignature(); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
79 Kind returnKind = sig.getReturnKind(); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
80 Stamp stamp = StampFactory.forKind(returnKind); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
81 if (returnKind == Kind.Object) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
82 JavaType returnType = sig.getReturnType(method.getDeclaringClass()); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
83 if (returnType instanceof ResolvedJavaType) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
84 ResolvedJavaType resolvedReturnType = (ResolvedJavaType) returnType; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
85 if (wordTypes.isWord(resolvedReturnType)) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
86 stamp = wordTypes.getWordStamp(resolvedReturnType); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
87 } else { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
88 stamp = StampFactory.declared(resolvedReturnType); |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
89 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
90 } |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
91 } |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
92 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
93 boolean result = processNodeIntrinsic(b, method, intrinsic, Arrays.asList(args), returnKind, stamp); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
94 if (!result && mustIntrinsify) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
95 reportIntrinsificationFailure(b, method, args); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
96 } |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
97 return result; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
98 |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
99 } else if (nodeIntrinsification.isFoldable(method)) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
100 ResolvedJavaType[] parameterTypes = resolveJavaTypes(method.toParameterTypes(), method.getDeclaringClass()); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
101 JavaConstant constant = nodeIntrinsification.tryFold(Arrays.asList(args), parameterTypes, method); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
102 if (!COULD_NOT_FOLD.equals(constant)) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
103 if (constant != null) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
104 // Replace the invoke with the result of the call |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
105 b.push(method.getSignature().getReturnKind(), ConstantNode.forConstant(constant, b.getMetaAccess(), b.getGraph())); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
106 } else { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
107 // This must be a void invoke |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
108 assert method.getSignature().getReturnKind() == Kind.Void; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
109 } |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
110 return true; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
111 } else if (mustIntrinsify) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
112 reportIntrinsificationFailure(b, method, args); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
113 } |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
114 |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
115 } else if (MethodsElidedInSnippets != null) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
116 if (MethodFilter.matches(MethodsElidedInSnippets, method)) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
117 if (method.getSignature().getReturnKind() != Kind.Void) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
118 throw new JVMCIError("Cannot elide non-void method " + method.format("%H.%n(%p)")); |
21009
0fe8b02e5cb6
moved MethodsElidedInSnippets mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20164
diff
changeset
|
119 } |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
120 return true; |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
121 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
122 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
123 return false; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
124 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
125 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
126 private static boolean reportIntrinsificationFailure(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
127 StringBuilder msg = new StringBuilder(); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
128 msg.append("Call in ").append(b.getMethod().format("%H.%n(%p)")); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
129 msg.append(" to ").append(method.format("%H.%n(%p)")); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
130 msg.append(" cannot be intrisfied or folded, probably because an argument is not a constant. Arguments: "); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
131 String sep = ""; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
132 for (ValueNode node : args) { |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
133 msg.append(sep).append(node.toString()); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
134 sep = ", "; |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
135 } |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
136 throw new JVMCIError(msg.toString()); |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
137 } |
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
138 |
20160
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
139 private InputType getInputType(ResolvedJavaType type) { |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
140 if (type != null && structuralInputType.isAssignableFrom(type)) { |
21100
8cc759c89af7
Use @Inherited on @MarkerType annotation.
Roland Schatz <roland.schatz@oracle.com>
parents:
21009
diff
changeset
|
141 MarkerType markerType = type.getAnnotation(MarkerType.class); |
8cc759c89af7
Use @Inherited on @MarkerType annotation.
Roland Schatz <roland.schatz@oracle.com>
parents:
21009
diff
changeset
|
142 if (markerType != null) { |
8cc759c89af7
Use @Inherited on @MarkerType annotation.
Roland Schatz <roland.schatz@oracle.com>
parents:
21009
diff
changeset
|
143 return markerType.value(); |
8cc759c89af7
Use @Inherited on @MarkerType annotation.
Roland Schatz <roland.schatz@oracle.com>
parents:
21009
diff
changeset
|
144 } else { |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21364
diff
changeset
|
145 throw JVMCIError.shouldNotReachHere(String.format("%s extends StructuralInput, but is not annotated with @MarkerType", type)); |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
146 } |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
147 } else { |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
148 return InputType.Value; |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
149 } |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
150 } |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
151 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
152 private boolean processNodeIntrinsic(GraphBuilderContext b, ResolvedJavaMethod method, NodeIntrinsic intrinsic, List<ValueNode> args, Kind returnKind, Stamp stamp) { |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
153 ValueNode res = createNodeIntrinsic(b, method, intrinsic, args, stamp); |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
154 if (res == null) { |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
155 return false; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
156 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
157 if (res instanceof UnsafeCopyNode) { |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
158 UnsafeCopyNode copy = (UnsafeCopyNode) res; |
20045
8470e81631f8
converted all @MacroSubstitution uses to InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
20041
diff
changeset
|
159 UnsafeLoadNode value = b.add(new UnsafeLoadNode(copy.sourceObject(), copy.sourceOffset(), copy.accessKind(), copy.getLocationIdentity())); |
20006
2d51a92a301a
added helper methods to GraphBuilderContext for common operation combinations
Doug Simon <doug.simon@oracle.com>
parents:
19886
diff
changeset
|
160 b.add(new UnsafeStoreNode(copy.destinationObject(), copy.destinationOffset(), value, copy.accessKind(), copy.getLocationIdentity())); |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
161 return true; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
162 } else if (res instanceof ForeignCallNode) { |
21289
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
163 /* |
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
164 * Need to update the BCI of a ForeignCallNode so that it gets the stateDuring in the |
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
165 * case that the foreign call can deoptimize. As with all deoptimization, we need a |
21364
600d37d28494
cleaned up and improved documentation for IntrinsicScope
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
166 * state in a non-intrinsic method. |
21289
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
167 */ |
21364
600d37d28494
cleaned up and improved documentation for IntrinsicScope
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
168 GraphBuilderContext nonIntrinsicAncestor = b.getNonIntrinsicAncestor(); |
600d37d28494
cleaned up and improved documentation for IntrinsicScope
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
169 if (nonIntrinsicAncestor != null) { |
21289
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
170 ForeignCallNode foreign = (ForeignCallNode) res; |
21364
600d37d28494
cleaned up and improved documentation for IntrinsicScope
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
171 foreign.setBci(nonIntrinsicAncestor.bci()); |
21289
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
172 } |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
173 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
174 |
20160
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
175 boolean nonValueType = false; |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
176 if (returnKind == Kind.Object && stamp instanceof ObjectStamp) { |
20160
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
177 ResolvedJavaType type = ((ObjectStamp) stamp).type(); |
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
178 if (type != null && structuralInputType.isAssignableFrom(type)) { |
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
179 assert res.isAllowedUsageType(getInputType(type)); |
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
180 nonValueType = true; |
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
181 } |
20033
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
182 } |
39c0ccfcd070
Allow InputTypes that are not Value in snippets.
Roland Schatz <roland.schatz@oracle.com>
parents:
20024
diff
changeset
|
183 |
20160
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
184 if (returnKind != Kind.Void) { |
90b5605032bc
Run input type verification only when assertions are enabled.
Roland Schatz <roland.schatz@oracle.com>
parents:
20045
diff
changeset
|
185 assert nonValueType || res.getKind().getStackKind() != Kind.Void; |
21567
f41409c6ff26
Do not rely on single/double slot information from the Kind of the value in a local variable or expression stack entry. With word type rewriting during parsing, long values can be single slot values when they are rewritten from Object values.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21556
diff
changeset
|
186 res = b.addPush(returnKind, res); |
19797
9594538080a8
ensure voidness of a @NodeIntrinsic method's return kind agrees with the voidness of the stamp of the intrinsified node
Doug Simon <doug.simon@oracle.com>
parents:
19791
diff
changeset
|
187 } else { |
9594538080a8
ensure voidness of a @NodeIntrinsic method's return kind agrees with the voidness of the stamp of the intrinsified node
Doug Simon <doug.simon@oracle.com>
parents:
19791
diff
changeset
|
188 assert res.getKind().getStackKind() == Kind.Void; |
21289
3b5ec1a2b3b5
consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents:
21280
diff
changeset
|
189 res = b.add(res); |
19854
4178f9830a27
Assign the state after when appending the node and not automatically in the main graph builder loop.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19801
diff
changeset
|
190 } |
4178f9830a27
Assign the state after when appending the node and not automatically in the main graph builder loop.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19801
diff
changeset
|
191 |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
192 return true; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
193 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
194 |
21606
625b2b12b418
Cleanup and generalize graph builder plugins
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
195 private ValueNode createNodeIntrinsic(GraphBuilderContext b, ResolvedJavaMethod method, NodeIntrinsic intrinsic, List<ValueNode> args, Stamp stamp) { |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
196 ValueNode res = nodeIntrinsification.createIntrinsicNode(args, stamp, method, b.getGraph(), intrinsic); |
20164
c36ab3cd360c
removed GraphBuilderContext.getRootMethod()
Doug Simon <doug.simon@oracle.com>
parents:
20160
diff
changeset
|
197 assert res != null || b.getGraph().method().getAnnotation(Snippet.class) != null : String.format( |
19791
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
198 "Could not create node intrinsic for call to %s as one of the arguments expected to be constant isn't: arguments=%s", method.format("%H.%n(%p)"), args); |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
199 return res; |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
200 } |
14e703edb2ab
use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
201 } |