annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java @ 5657:d71eb56d6bb0

new stamp inference in CanonicalizerPhase, IntegerStamp.mask
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 19 Jun 2012 20:03:06 +0200
parents b0f511b40eee
children f96e7b39e9fe f9c9c01969c0
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 /*
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
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;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
24
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
25 import java.util.*;
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
26
5507
dc71b06d09f8 Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5504
diff changeset
27 import com.oracle.graal.api.meta.*;
5387
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
28 import com.oracle.graal.graph.*;
5621
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
29 import com.oracle.graal.graph.iterators.*;
5387
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
30 import com.oracle.graal.nodes.type.*;
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
31 import com.oracle.graal.nodes.type.GenericStamp.*;
5563
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
32 import com.oracle.graal.nodes.util.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
33
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
34 /**
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
35 * This class represents a value within the graph, including local variables, phis, and
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
36 * all other instructions.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
37 */
4646
75dcf829cfdc experimental: "next" successor on all nodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 4199
diff changeset
38 public abstract class ValueNode extends ScheduledNode implements StampProvider {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
39
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
40 /**
5540
a891c53a295b Renaming RiKind => Kind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5538
diff changeset
41 * The kind of this value. This is {@link Kind#Void} for instructions that produce no value.
a891c53a295b Renaming RiKind => Kind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5538
diff changeset
42 * This kind is guaranteed to be a {@linkplain Kind#stackKind() stack kind}.
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
43 */
5299
0ebd9cfdc11f removed @Data annotation
Lukas Stadler <lukas.stadler@jku.at>
parents: 5080
diff changeset
44 private Stamp stamp;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
45
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
46 @Input(notDataflow = true) private NodeInputList<ValueNode> dependencies;
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
47
5387
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
48 /**
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
49 * This collection keeps dependencies that should be observed while scheduling (guards, etc.).
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
50 */
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
51 public NodeInputList<ValueNode> dependencies() {
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
52 return dependencies;
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
53 }
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
54
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
55 public ValueNode(Stamp stamp) {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
56 this.stamp = stamp;
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
57 this.dependencies = new NodeInputList<>(this);
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
58 assert kind() != null && kind() == kind().stackKind() : kind() + " != " + kind().stackKind();
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
59 }
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
60
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
61 public ValueNode(Stamp stamp, ValueNode... dependencies) {
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
62 this.stamp = stamp;
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
63 this.dependencies = new NodeInputList<>(this, dependencies);
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
64 assert kind() != null && kind() == kind().stackKind() : kind() + " != " + kind().stackKind();
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
65 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
66
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
67 public ValueNode(Stamp stamp, List<ValueNode> dependencies) {
5387
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
68 this.stamp = stamp;
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
69 this.dependencies = new NodeInputList<>(this, dependencies);
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
70 assert kind() != null && kind() == kind().stackKind() : kind() + " != " + kind().stackKind();
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
71 }
b6aaf6de4053 use dependencies collection instead of explicit guard fields
Lukas Stadler <lukas.stadler@jku.at>
parents: 5299
diff changeset
72
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
73 public Stamp stamp() {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
74 return stamp;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
75 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
76
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
77 public void setStamp(Stamp stamp) {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
78 this.stamp = stamp;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
79 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
80
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
81 /**
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
82 * Checks if the given stamp is different than the current one ({@code newStamp.equals(oldStamp) == false}). If it
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
83 * is different then the new stamp will become the current stamp for this node.
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
84 *
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
85 * @return true if the stamp has changed, false otherwise.
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
86 */
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
87 protected final boolean updateStamp(Stamp newStamp) {
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
88 if (newStamp.equals(stamp)) {
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
89 return false;
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
90 } else {
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
91 stamp = newStamp;
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
92 return true;
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
93 }
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
94 }
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
95
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
96 /**
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
97 * This method can be overridden by subclasses of {@link ValueNode} if they need to recompute their stamp if their
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
98 * inputs change. A typical implementation will compute the stamp and pass it to {@link #updateStamp(Stamp)}, whose
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
99 * return value can be used as the result of this method.
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
100 *
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
101 * @return true if the stamp has changed, false otherwise.
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
102 */
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
103 public boolean inferStamp() {
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
104 return false;
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
105 }
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
106
5540
a891c53a295b Renaming RiKind => Kind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5538
diff changeset
107 public Kind kind() {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
108 return stamp.kind();
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
109 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
110
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
111 /**
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
112 * Checks whether this value is a constant (i.e. it is of type {@link ConstantNode}.
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
113 *
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
114 * @return {@code true} if this value is a constant
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
115 */
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
116 public final boolean isConstant() {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
117 return this instanceof ConstantNode;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
118 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
119
5621
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
120 private static final NodePredicate IS_CONSTANT = new NodePredicate() {
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
121 @Override
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
122 public boolean apply(Node n) {
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
123 return n instanceof ValueNode && ((ValueNode) n).isConstant();
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
124 }
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
125 };
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
126
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
127 public static NodePredicate isConstantPredicate() {
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
128 return IS_CONSTANT;
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
129 }
b0f511b40eee Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5563
diff changeset
130
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
131 /**
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
132 * Checks whether this value represents the null constant.
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
133 *
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
134 * @return {@code true} if this value represents the null constant
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
135 */
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
136 public final boolean isNullConstant() {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
137 return this instanceof ConstantNode && ((ConstantNode) this).value.isNull();
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
138 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
139
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
140 /**
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
141 * Convert this value to a constant if it is a constant, otherwise return null.
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
142 *
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5621
diff changeset
143 * @return the {@link Constant} represented by this value if it is a constant; {@code null} otherwise
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
144 */
5538
e18ba36bfebc Renamed RiConstant => Constant.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5507
diff changeset
145 public final Constant asConstant() {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
146 if (this instanceof ConstantNode) {
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
147 return ((ConstantNode) this).value;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
148 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
149 return null;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
150 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
151
5563
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
152 public <T extends Stamp> boolean verifyStamp(Class<T> stampClass) {
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
153 assert stampClass.isInstance(stamp) : this + " (" + GraphUtil.approxSourceLocation(this) + ") has unexpected stamp type: expected " + stampClass.getName() +
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
154 ", got " + stamp.getClass().getName();
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
155 return true;
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
156 }
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
157
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
158 public final ObjectStamp objectStamp() {
5563
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
159 assert verifyStamp(ObjectStamp.class);
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
160 return (ObjectStamp) stamp;
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
161 }
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
162
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
163 public final IntegerStamp integerStamp() {
5563
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
164 assert verifyStamp(IntegerStamp.class);
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
165 return (IntegerStamp) stamp;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
166 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
167
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
168 public final FloatStamp floatStamp() {
5563
6a2671066204 added NewInstanceSnippets for lowering NewInstanceNodes (currently disabled by default)
Doug Simon <doug.simon@oracle.com>
parents: 5540
diff changeset
169 assert verifyStamp(FloatStamp.class);
5443
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
170 return (FloatStamp) stamp;
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
171 }
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
172
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
173 @Override
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
174 public boolean verify() {
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
175 for (ValueNode v : dependencies().nonNull()) {
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
176 assertTrue(!(v.stamp() instanceof GenericStamp) || ((GenericStamp) v.stamp()).type() == GenericStampType.Dependency, "cannot depend on node with stamp %s", v.stamp());
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
177 }
141817e206d4 changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents: 5391
diff changeset
178 return super.verify();
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
179 }
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
180
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
181 @Override
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
182 public Map<Object, Object> getDebugProperties() {
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
183 Map<Object, Object> properties = super.getDebugProperties();
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
184 if (!dependencies.isEmpty()) {
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
185 StringBuilder str = new StringBuilder();
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
186 for (int i = 0; i < dependencies.size(); i++) {
5391
5097f21f6c2b add a new simple CheckCast elimination phase
Lukas Stadler <lukas.stadler@jku.at>
parents: 5387
diff changeset
187 str.append(i == 0 ? "" : ", ").append(dependencies.get(i) == null ? "null" : dependencies.get(i).toString(Verbosity.Id));
5080
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
188 }
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
189 properties.put("dependencies", str.toString());
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
190 }
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
191 return properties;
68918a528cbe experimental: dependencies on all ValueNodes
Lukas Stadler <lukas.stadler@jku.at>
parents: 5061
diff changeset
192 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
193 }