Mercurial > hg > truffle
annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java @ 21556:48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 27 May 2015 00:36:16 +0200 |
parents | 14e703edb2ab |
children |
rev | line source |
---|---|
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
1 /* |
16222
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
2 * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
4 * |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
8 * |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
14 * |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
18 * |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
21 * questions. |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
22 */ |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
23 package com.oracle.graal.nodes.java; |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
24 |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18998
diff
changeset
|
25 import com.oracle.graal.graph.*; |
11881
da9db8331658
moved Canonicalizable and Simplifiable to the com.oracle.graal.graph project (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents:
11880
diff
changeset
|
26 import com.oracle.graal.graph.spi.*; |
16841
cbd42807a31f
moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents:
16822
diff
changeset
|
27 import com.oracle.graal.nodeinfo.*; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
28 import com.oracle.graal.nodes.*; |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
29 import com.oracle.graal.nodes.spi.*; |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
30 import com.oracle.graal.nodes.type.*; |
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:
19791
diff
changeset
|
31 import com.oracle.jvmci.meta.*; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
32 |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
33 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
6648
diff
changeset
|
34 * Implements a type check where the type being checked is loaded at runtime. This is used, for |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
6648
diff
changeset
|
35 * instance, to implement an object array store check. |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
36 */ |
16822
5d468add216f
added @NodeInfo annotations to all Node classes
Doug Simon <doug.simon@oracle.com>
parents:
16248
diff
changeset
|
37 @NodeInfo |
18998
ec0733b5a90a
Allow final modifier on node subclasses and start adding the modifier to leaf classes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18845
diff
changeset
|
38 public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable.Binary<ValueNode>, Lowerable { |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
39 |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19403
diff
changeset
|
40 public static final NodeClass<CheckCastDynamicNode> TYPE = NodeClass.create(CheckCastDynamicNode.class); |
16897
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
41 @Input ValueNode object; |
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
42 @Input ValueNode hub; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
43 |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
44 /** |
9478
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
45 * Determines the exception thrown by this node if the check fails: {@link ClassCastException} |
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
46 * if false; {@link ArrayStoreException} if true. |
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
47 */ |
17328
c9bb0da795d4
Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents:
17327
diff
changeset
|
48 protected final boolean forStoreCheck; |
9478
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
49 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18490
diff
changeset
|
50 public CheckCastDynamicNode(ValueNode hub, ValueNode object, boolean forStoreCheck) { |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18998
diff
changeset
|
51 super(TYPE, object.stamp()); |
11226
422b0e9b9aed
removed obsolete checkcast snippets
Doug Simon <doug.simon@oracle.com>
parents:
9481
diff
changeset
|
52 this.hub = hub; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
53 this.object = object; |
9478
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
54 this.forStoreCheck = forStoreCheck; |
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
55 } |
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
56 |
16222
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
57 public ValueNode object() { |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
58 return object; |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
59 } |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
60 |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
61 /** |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
62 * Gets the runtime-loaded type being cast to. |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
63 */ |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
64 public ValueNode hub() { |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
65 return hub; |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
66 } |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
67 |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
68 public ValueNode getX() { |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
69 return object; |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
70 } |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
71 |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
72 public ValueNode getY() { |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
73 return hub; |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
74 } |
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
75 |
9478
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
76 public boolean isForStoreCheck() { |
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
77 return forStoreCheck; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
78 } |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
79 |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
80 @Override |
11579
ae619d70bf4b
Rename LoweringType to GuardsPhase and make it an attribute of StructuredGraphs
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
81 public void lower(LoweringTool tool) { |
12045
0fc653a9e019
made GraalCodeCacheProvider independent of CodeCacheProvider and renamed the former to LoweringProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
82 tool.getLowerer().lower(this, tool); |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
83 } |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
84 |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
85 @Override |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
86 public boolean inferStamp() { |
11265 | 87 return updateStamp(object().stamp()); |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
88 } |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
89 |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
90 @Override |
16222
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
91 public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forHub) { |
18490
ca81508f2a19
Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
18487
diff
changeset
|
92 if (StampTool.isPointerAlwaysNull(forObject)) { |
16222
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
93 return forObject; |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
94 } |
16222
7a0035cbf808
let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15260
diff
changeset
|
95 if (forHub.isConstant()) { |
18487
0f4813e0b4a9
Use asConstant() instead of asJavaConstant() where possible.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
96 ResolvedJavaType t = tool.getConstantReflection().asJavaType(forHub.asConstant()); |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14024
diff
changeset
|
97 if (t != null) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18490
diff
changeset
|
98 return new CheckCastNode(t, forObject, null, forStoreCheck); |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14024
diff
changeset
|
99 } |
9478
fb22b4d5f475
Allow distinction between ClassCastException and ArrayStoreException. Add more canonicalizations for check casts.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9251
diff
changeset
|
100 } |
6648
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
101 return this; |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
102 } |
7bf5a6c42db7
factored CheckCastDynamicNode out of CheckCastNode
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
103 } |