Mercurial > hg > graal-compiler
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 |
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 | 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 | 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 } |