annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java @ 15198:2c0cfbf454b5

Move LIRTypeTool and Stamp to graal.compiler.common.
author Josef Eisl <josef.eisl@jku.at>
date Thu, 17 Apr 2014 17:28:20 +0200
parents 844cfee4041a
children 61363577a184
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
4314
9ce8594bedaf Allow CiAddress as Input and Alive operands of LIR instructions.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents: 4309
diff changeset
2 * Copyright (c) 2011, 2012, 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 */
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
23 package com.oracle.graal.nodes.extended;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
24
5507
dc71b06d09f8 Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5504
diff changeset
25 import com.oracle.graal.api.meta.*;
15198
2c0cfbf454b5 Move LIRTypeTool and Stamp to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15132
diff changeset
26 import com.oracle.graal.compiler.common.type.*;
11880
9a747d8e0d0f broadened types in Canonicalizable interface so that it can be moved to the com.oracle.graal.graph project (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11661
diff changeset
27 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
28 import com.oracle.graal.graph.spi.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
29 import com.oracle.graal.nodes.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
30 import com.oracle.graal.nodes.spi.*;
5076
01ffb0fc9aec propagate stamps while lowering
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
31 import com.oracle.graal.nodes.type.*;
9875
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
32 import com.oracle.graal.nodes.virtual.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
33
5823
f238fe91dc7f partial (non XIR) support for inlining virtual dispatch at call sites - still needs fixing
Doug Simon <doug.simon@oracle.com>
parents: 5758
diff changeset
34 /**
13289
1734954cc73d Rename AccessNode to FixedAccessNode
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13153
diff changeset
35 * Reads an {@linkplain FixedAccessNode accessed} value.
5823
f238fe91dc7f partial (non XIR) support for inlining virtual dispatch at call sites - still needs fixing
Doug Simon <doug.simon@oracle.com>
parents: 5758
diff changeset
36 */
15001
27c04ee36dcb input types
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14976
diff changeset
37 public final class ReadNode extends FloatableAccessNode implements LIRLowerable, Canonicalizable, PiPushable, Virtualizable, GuardingNode {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
38
10828
b05e1ff3aac0 Rename WriteBarrierType to BarrierType
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10821
diff changeset
39 public ReadNode(ValueNode object, ValueNode location, Stamp stamp, BarrierType barrierType, boolean compressible) {
10821
0910c930c66e Method and variables' renaming
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10799
diff changeset
40 super(object, location, stamp, barrierType, compressible);
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
41 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
42
10828
b05e1ff3aac0 Rename WriteBarrierType to BarrierType
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10821
diff changeset
43 public ReadNode(ValueNode object, ValueNode location, Stamp stamp, GuardingNode guard, BarrierType barrierType, boolean compressible) {
10821
0910c930c66e Method and variables' renaming
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10799
diff changeset
44 super(object, location, stamp, guard, barrierType, compressible);
8295
60f90b4b6a12 Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 7861
diff changeset
45 }
60f90b4b6a12 Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 7861
diff changeset
46
13120
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
47 private ReadNode(ValueNode object, ValueNode location, ValueNode guard, BarrierType barrierType, boolean compressible) {
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
48 /*
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
49 * Used by node intrinsics. Really, you can trust me on that! Since the initial value for
13614
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13289
diff changeset
50 * location is a parameter, i.e., a ParameterNode, the constructor cannot use the declared
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13289
diff changeset
51 * type LocationNode.
13120
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
52 */
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
53 super(object, location, StampFactory.forNodeIntrinsic(), (GuardingNode) guard, barrierType, compressible);
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
54 }
37b166b8f08e Reintroduce constructor used by node intrinsics
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12695
diff changeset
55
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
56 @Override
14950
d5a1206e1923 NodeLIRBuilderTool: fix typo in interface name.
Josef Eisl <josef.eisl@jku.at>
parents: 14945
diff changeset
57 public void generate(NodeLIRBuilderTool gen) {
15130
ec22234bde0d Pass more restricted interfaces to ArithmeticLIRLowerable and LocationNode in LIR generation.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
58 Value address = location().generateAddress(gen, gen.getLIRGeneratorTool(), gen.operand(object()));
14945
b14cb2d9253d Make compression and uncompression explicit in the high level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 14888
diff changeset
59 PlatformKind readKind = gen.getLIRGeneratorTool().getPlatformKind(stamp());
b14cb2d9253d Make compression and uncompression explicit in the high level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 14888
diff changeset
60 gen.setResult(this, gen.getLIRGeneratorTool().emitLoad(readKind, address, this));
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
61 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
62
6950
41938af2b3d8 modifications to support non-perm-gen changes in HotSpot
Doug Simon <doug.simon@oracle.com>
parents: 6458
diff changeset
63 @Override
11880
9a747d8e0d0f broadened types in Canonicalizable interface so that it can be moved to the com.oracle.graal.graph project (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11661
diff changeset
64 public Node canonical(CanonicalizerTool tool) {
14714
b602356a9cfc additional canonicalizers for accesses and value nodes (improves number of implicit null checks)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14710
diff changeset
65 if (object() instanceof PiNode && ((PiNode) object()).getGuard() == getGuard()) {
15081
5ffcd28b9340 do not drop null check in ReadNode.canonical
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15023
diff changeset
66 ReadNode readNode = graph().add(new ReadNode(((PiNode) object()).getOriginalNode(), location(), stamp(), getGuard(), getBarrierType(), isCompressible()));
5ffcd28b9340 do not drop null check in ReadNode.canonical
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15023
diff changeset
67 readNode.setNullCheck(getNullCheck());
5ffcd28b9340 do not drop null check in ReadNode.canonical
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15023
diff changeset
68 readNode.setStateBefore(stateBefore());
5ffcd28b9340 do not drop null check in ReadNode.canonical
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15023
diff changeset
69 return readNode;
14714
b602356a9cfc additional canonicalizers for accesses and value nodes (improves number of implicit null checks)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14710
diff changeset
70 }
10831
000ee2d0c518 Method renaming
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10828
diff changeset
71 return canonicalizeRead(this, location(), object(), tool, isCompressible());
6950
41938af2b3d8 modifications to support non-perm-gen changes in HotSpot
Doug Simon <doug.simon@oracle.com>
parents: 6458
diff changeset
72 }
5833
2a9fda4f9f1e Fix canonicalisation of final reads and factor out read/floating read canonicalization code
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5758
diff changeset
73
8423
86ef0438d1d3 Generalize FloatingReadPhase to support arbitrary floatable access nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 8395
diff changeset
74 @Override
13153
ae0001b445c0 Common base interface for nodes in the memory graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 13120
diff changeset
75 public FloatingAccessNode asFloatingNode(MemoryNode lastLocationAccess) {
10831
000ee2d0c518 Method renaming
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10828
diff changeset
76 return graph().unique(new FloatingReadNode(object(), location(), lastLocationAccess, stamp(), getGuard(), getBarrierType(), isCompressible()));
8423
86ef0438d1d3 Generalize FloatingReadPhase to support arbitrary floatable access nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 8395
diff changeset
77 }
86ef0438d1d3 Generalize FloatingReadPhase to support arbitrary floatable access nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 8395
diff changeset
78
15002
06e50d290784 isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15001
diff changeset
79 @Override
06e50d290784 isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15001
diff changeset
80 public boolean isAllowedUsageType(InputType type) {
06e50d290784 isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15001
diff changeset
81 return (getNullCheck() && type == InputType.Guard) ? true : super.isAllowedUsageType(type);
06e50d290784 isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15001
diff changeset
82 }
06e50d290784 isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15001
diff changeset
83
10863
5404cde63c43 Remove redundant checks for loading compressed constants
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10831
diff changeset
84 public static ValueNode canonicalizeRead(ValueNode read, LocationNode location, ValueNode object, CanonicalizerTool tool, boolean compressible) {
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11926
diff changeset
85 MetaAccessProvider metaAccess = tool.getMetaAccess();
11532
6a1b7d28f2d4 replace usages().count() == 0 with usages().isEmpty()
Doug Simon <doug.simon@oracle.com>
parents: 11447
diff changeset
86 if (read.usages().isEmpty()) {
14710
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
87 GuardingNode guard = ((Access) read).getGuard();
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
88 if (guard != null && !(guard instanceof FixedNode)) {
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
89 // The guard is necessary even if the read goes away.
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
90 return read.graph().add(new ValueAnchorNode((ValueNode) guard));
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
91 } else {
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
92 // Read without usages or guard can be safely removed.
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
93 return null;
6fd5f25b546c keep the guard alive when removing ReadNodes without usages
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14633
diff changeset
94 }
9696
ce80e563cd22 Remove unused read nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9646
diff changeset
95 }
14019
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
96 if (tool.canonicalizeReads()) {
15023
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
97 if (metaAccess != null && object != null && object.isConstant() && !compressible) {
14157
8c4a3d9308a7 fixed FindBugs bugs
twisti
parents: 14020
diff changeset
98 if ((location.getLocationIdentity() == LocationIdentity.FINAL_LOCATION || location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION) &&
14020
39f5ea16e13a don't directly access the arraylength of Constant objects
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 14019
diff changeset
99 location instanceof ConstantLocationNode) {
14019
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
100 long displacement = ((ConstantLocationNode) location).getDisplacement();
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15009
diff changeset
101 Constant base = object.asConstant();
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15009
diff changeset
102 if (base != null) {
15023
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
103 Constant constant;
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
104 if (read.stamp() instanceof PrimitiveStamp) {
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
105 PrimitiveStamp stamp = (PrimitiveStamp) read.stamp();
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
106 constant = tool.getConstantReflection().readRawConstant(stamp.getStackKind(), base, displacement, stamp.getBits());
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
107 } else {
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
108 assert read.stamp() instanceof ObjectStamp;
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
109 constant = tool.getConstantReflection().readUnsafeConstant(Kind.Object, base, displacement);
14019
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
110 }
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15009
diff changeset
111 if (constant != null) {
15023
652564fe42d5 Use CompressionNode for accessing compressed Klass pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 15018
diff changeset
112 return ConstantNode.forConstant(read.stamp(), constant, metaAccess, read.graph());
7672
1a4a00390113 Make the access of raw memory via Unsafe specific to HotSpot.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 7556
diff changeset
113 }
7163
2ed8d74e5984 fixed bug in ReadNode.canonicalizeRead (can not canonicalize when the base address is a null object)
Doug Simon <doug.simon@oracle.com>
parents: 7160
diff changeset
114 }
14019
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
115 }
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
116 }
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
117 if (location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION && object instanceof ArrayLengthProvider) {
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
118 ValueNode length = ((ArrayLengthProvider) object).length();
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
119 if (length != null) {
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
120 // TODO Does this need a PiCastNode to the positive range?
9d864856336a support canonicalization of arraylength in ReadNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13930
diff changeset
121 return length;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
122 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
123 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
124 }
8395
d6ec0c05a2a2 don't use Access interface in ReadNode.canonicalizeRead
Lukas Stadler <lukas.stadler@jku.at>
parents: 8295
diff changeset
125 return read;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
126 }
6290
01d274503562 canonicalize reads and writes on null objects to deopts
Lukas Stadler <lukas.stadler@jku.at>
parents: 5838
diff changeset
127
8653
193403beca24 PiPushable: implementation for ReadNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 8423
diff changeset
128 @Override
8656
369710426f74 PushNodesThroughPi: add metric for pushed nodes
Bernhard Urban <bernhard.urban@jku.at>
parents: 8653
diff changeset
129 public boolean push(PiNode parent) {
11447
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
130 if (!(location() instanceof ConstantLocationNode && parent.stamp() instanceof ObjectStamp && parent.object().stamp() instanceof ObjectStamp)) {
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
131 return false;
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
132 }
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
133
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
134 ObjectStamp piStamp = (ObjectStamp) parent.stamp();
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
135 ResolvedJavaType receiverType = piStamp.type();
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
136 if (receiverType == null) {
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
137 return false;
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
138 }
8653
193403beca24 PiPushable: implementation for ReadNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 8423
diff changeset
139
11447
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
140 ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(((ConstantLocationNode) location()).getDisplacement());
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
141 if (field == null) {
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
142 // field was not declared by receiverType
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
143 return false;
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
144 }
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
145
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
146 ObjectStamp valueStamp = (ObjectStamp) parent.object().stamp();
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
147 ResolvedJavaType valueType = ObjectStamp.typeOrNull(valueStamp);
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
148 if (valueType != null && field.getDeclaringClass().isAssignableFrom(valueType)) {
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
149 if (piStamp.nonNull() == valueStamp.nonNull() && piStamp.alwaysNull() == valueStamp.alwaysNull()) {
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
150 replaceFirstInput(parent, parent.object());
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
151 return true;
8653
193403beca24 PiPushable: implementation for ReadNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 8423
diff changeset
152 }
11447
3653d3a66d3b ReadNode: minor refactoring in push()
Bernhard Urban <bernhard.urban@jku.at>
parents: 11411
diff changeset
153 }
9544
5bf09c5cd2e6 ReadNode/PiPush: compute declaring class by field offset
Bernhard Urban <bernhard.urban@jku.at>
parents: 9526
diff changeset
154
8656
369710426f74 PushNodesThroughPi: add metric for pushed nodes
Bernhard Urban <bernhard.urban@jku.at>
parents: 8653
diff changeset
155 return false;
8653
193403beca24 PiPushable: implementation for ReadNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 8423
diff changeset
156 }
193403beca24 PiPushable: implementation for ReadNode
Bernhard Urban <bernhard.urban@jku.at>
parents: 8423
diff changeset
157
9875
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
158 @Override
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
159 public void virtualize(VirtualizerTool tool) {
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
160 if (location() instanceof ConstantLocationNode) {
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
161 ConstantLocationNode constantLocation = (ConstantLocationNode) location();
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
162 State state = tool.getObjectState(object());
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
163 if (state != null && state.getState() == EscapeState.Virtual) {
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
164 VirtualObjectNode virtual = state.getVirtualObject();
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
165 int entryIndex = virtual.entryIndexForOffset(constantLocation.getDisplacement());
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
166 if (entryIndex != -1 && virtual.entryKind(entryIndex) == constantLocation.getValueKind()) {
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
167 tool.replaceWith(state.getEntry(entryIndex));
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
168 }
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
169 }
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
170 }
2c55e8c4a591 make ReadNode and WriteNode virtualizable
Lukas Stadler <lukas.stadler@jku.at>
parents: 9851
diff changeset
171 }
14976
82399ac30721 make implicit null checking optional for Access nodes (fixes CAS crash)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14950
diff changeset
172
82399ac30721 make implicit null checking optional for Access nodes (fixes CAS crash)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14950
diff changeset
173 public boolean canNullCheck() {
82399ac30721 make implicit null checking optional for Access nodes (fixes CAS crash)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14950
diff changeset
174 return true;
82399ac30721 make implicit null checking optional for Access nodes (fixes CAS crash)
Lukas Stadler <lukas.stadler@oracle.com>
parents: 14950
diff changeset
175 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
176 }