< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConditionalNode.java

Print this page
rev 52509 : [mq]: graal2


 213                     // replace IntegerTestNode with AndNode for the following patterns:
 214                     // (value & 1) == 0 ? 0 : 1
 215                     // (value & 1) == 1 ? 1 : 0
 216                     IntegerTestNode integerTestNode = (IntegerTestNode) condition;
 217                     if (integerTestNode.getY().isConstant()) {
 218                         assert integerTestNode.getX().stamp(view) instanceof IntegerStamp;
 219                         long testY = integerTestNode.getY().asJavaConstant().asLong();
 220                         if (testY == 1 && constTrueValue == 0 && constFalseValue == 1) {
 221                             return IntegerConvertNode.convertUnsigned(AndNode.create(integerTestNode.getX(), integerTestNode.getY(), view), stamp, view);
 222                         }
 223                     }
 224                 }
 225             }
 226 
 227             if (condition instanceof IntegerLessThanNode) {
 228                 /*
 229                  * Convert a conditional add ((x < 0) ? (x + y) : x) into (x + (y & (x >> (bits -
 230                  * 1)))) to avoid the test.
 231                  */
 232                 IntegerLessThanNode lt = (IntegerLessThanNode) condition;
 233                 if (lt.getY().isConstant() && lt.getY().asConstant().isDefaultForKind()) {
 234                     if (falseValue == lt.getX()) {
 235                         if (trueValue instanceof AddNode) {
 236                             AddNode add = (AddNode) trueValue;
 237                             if (add.getX() == falseValue) {
 238                                 int bits = ((IntegerStamp) trueValue.stamp(NodeView.DEFAULT)).getBits();
 239                                 ValueNode shift = new RightShiftNode(lt.getX(), ConstantNode.forIntegerBits(32, bits - 1));
 240                                 ValueNode and = new AndNode(shift, add.getY());
 241                                 return new AddNode(add.getX(), and);
 242                             }
 243                         }
 244                     }
 245                 }
 246             }
 247         }
 248 
 249         return null;
 250     }
 251 
 252     private static ValueNode findSynonym(ValueNode condition, ValueNode trueValue, ValueNode falseValue, NodeView view) {
 253         if (condition instanceof LogicNegationNode) {




 213                     // replace IntegerTestNode with AndNode for the following patterns:
 214                     // (value & 1) == 0 ? 0 : 1
 215                     // (value & 1) == 1 ? 1 : 0
 216                     IntegerTestNode integerTestNode = (IntegerTestNode) condition;
 217                     if (integerTestNode.getY().isConstant()) {
 218                         assert integerTestNode.getX().stamp(view) instanceof IntegerStamp;
 219                         long testY = integerTestNode.getY().asJavaConstant().asLong();
 220                         if (testY == 1 && constTrueValue == 0 && constFalseValue == 1) {
 221                             return IntegerConvertNode.convertUnsigned(AndNode.create(integerTestNode.getX(), integerTestNode.getY(), view), stamp, view);
 222                         }
 223                     }
 224                 }
 225             }
 226 
 227             if (condition instanceof IntegerLessThanNode) {
 228                 /*
 229                  * Convert a conditional add ((x < 0) ? (x + y) : x) into (x + (y & (x >> (bits -
 230                  * 1)))) to avoid the test.
 231                  */
 232                 IntegerLessThanNode lt = (IntegerLessThanNode) condition;
 233                 if (lt.getY().isDefaultConstant()) {
 234                     if (falseValue == lt.getX()) {
 235                         if (trueValue instanceof AddNode) {
 236                             AddNode add = (AddNode) trueValue;
 237                             if (add.getX() == falseValue) {
 238                                 int bits = ((IntegerStamp) trueValue.stamp(NodeView.DEFAULT)).getBits();
 239                                 ValueNode shift = new RightShiftNode(lt.getX(), ConstantNode.forIntegerBits(32, bits - 1));
 240                                 ValueNode and = new AndNode(shift, add.getY());
 241                                 return new AddNode(add.getX(), and);
 242                             }
 243                         }
 244                     }
 245                 }
 246             }
 247         }
 248 
 249         return null;
 250     }
 251 
 252     private static ValueNode findSynonym(ValueNode condition, ValueNode trueValue, ValueNode falseValue, NodeView view) {
 253         if (condition instanceof LogicNegationNode) {


< prev index next >