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