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) {