Mercurial > hg > truffle
comparison graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java @ 18360:6a5dc0bbebe7
Introduce PointerEqualsNode for metaspace pointer comparison.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Wed, 12 Nov 2014 11:48:54 +0100 |
parents | 8652481a1110 |
children | 0f4813e0b4a9 |
comparison
equal
deleted
inserted
replaced
18359:a3a2359ac88e | 18360:6a5dc0bbebe7 |
---|---|
23 package com.oracle.graal.nodes.calc; | 23 package com.oracle.graal.nodes.calc; |
24 | 24 |
25 import com.oracle.graal.api.meta.*; | 25 import com.oracle.graal.api.meta.*; |
26 import com.oracle.graal.compiler.common.*; | 26 import com.oracle.graal.compiler.common.*; |
27 import com.oracle.graal.compiler.common.calc.*; | 27 import com.oracle.graal.compiler.common.calc.*; |
28 import com.oracle.graal.compiler.common.type.*; | |
28 import com.oracle.graal.graph.spi.*; | 29 import com.oracle.graal.graph.spi.*; |
29 import com.oracle.graal.nodeinfo.*; | 30 import com.oracle.graal.nodeinfo.*; |
30 import com.oracle.graal.nodes.*; | 31 import com.oracle.graal.nodes.*; |
31 | 32 |
32 /* TODO (thomaswue/gdub) For high-level optimization purpose the compare node should be a boolean *value* (it is currently only a helper node) | 33 /* TODO (thomaswue/gdub) For high-level optimization purpose the compare node should be a boolean *value* (it is currently only a helper node) |
91 } | 92 } |
92 | 93 |
93 @Override | 94 @Override |
94 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { | 95 public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { |
95 if (forX.isConstant() && forY.isConstant()) { | 96 if (forX.isConstant() && forY.isConstant()) { |
96 return LogicConstantNode.forBoolean(condition().foldCondition(forX.asJavaConstant(), forY.asJavaConstant(), tool.getConstantReflection(), unorderedIsTrue())); | 97 return LogicConstantNode.forBoolean(condition().foldCondition(forX.asConstant(), forY.asConstant(), tool.getConstantReflection(), unorderedIsTrue())); |
97 } | 98 } |
98 ValueNode result; | 99 ValueNode result; |
99 if (forX.isConstant()) { | 100 if (forX.isConstant()) { |
100 if ((result = canonicalizeSymmetricConstant(tool, forX.asConstant(), forY, true)) != this) { | 101 if ((result = canonicalizeSymmetricConstant(tool, forX.asConstant(), forY, true)) != this) { |
101 return result; | 102 return result; |
154 assert condition.isCanonical() : "condition is not canonical: " + condition; | 155 assert condition.isCanonical() : "condition is not canonical: " + condition; |
155 assert !x.getKind().isNumericFloat(); | 156 assert !x.getKind().isNumericFloat(); |
156 | 157 |
157 CompareNode comparison; | 158 CompareNode comparison; |
158 if (condition == Condition.EQ) { | 159 if (condition == Condition.EQ) { |
159 if (x.getKind() == Kind.Object) { | 160 if (x.stamp() instanceof AbstractObjectStamp) { |
160 comparison = ObjectEqualsNode.create(x, y); | 161 comparison = ObjectEqualsNode.create(x, y); |
162 } else if (x.stamp() instanceof AbstractPointerStamp) { | |
163 comparison = PointerEqualsNode.create(x, y); | |
161 } else { | 164 } else { |
162 assert x.getKind().isNumericInteger(); | 165 assert x.getKind().isNumericInteger(); |
163 comparison = IntegerEqualsNode.create(x, y); | 166 comparison = IntegerEqualsNode.create(x, y); |
164 } | 167 } |
165 } else if (condition == Condition.LT) { | 168 } else if (condition == Condition.LT) { |