< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java
Print this page
rev 52509 : [mq]: graal2
*** 903,929 ****
}
if (otherValue != null && otherValue.isConstant()) {
double shortCutProbability = probability(trueSuccessor());
LogicNode newCondition = LogicNode.or(condition(), negateCondition, conditional.condition(), negateConditionalCondition, shortCutProbability);
return graph().unique(new ConditionalNode(newCondition, constant, otherValue));
! } else if (!negateCondition && constant.isJavaConstant() && conditional.trueValue().isJavaConstant() && conditional.falseValue().isJavaConstant()) {
! IntegerLessThanNode lessThan = null;
! IntegerEqualsNode equals = null;
! if (condition() instanceof IntegerLessThanNode && conditional.condition() instanceof IntegerEqualsNode && constant.asJavaConstant().asLong() == -1 &&
! conditional.trueValue().asJavaConstant().asLong() == 0 && conditional.falseValue().asJavaConstant().asLong() == 1) {
! lessThan = (IntegerLessThanNode) condition();
! equals = (IntegerEqualsNode) conditional.condition();
! } else if (condition() instanceof IntegerEqualsNode && conditional.condition() instanceof IntegerLessThanNode && constant.asJavaConstant().asLong() == 0 &&
! conditional.trueValue().asJavaConstant().asLong() == -1 && conditional.falseValue().asJavaConstant().asLong() == 1) {
! lessThan = (IntegerLessThanNode) conditional.condition();
! equals = (IntegerEqualsNode) condition();
! }
! if (lessThan != null) {
! assert equals != null;
! NodeView view = NodeView.from(tool);
! if ((lessThan.getX() == equals.getX() && lessThan.getY() == equals.getY()) || (lessThan.getX() == equals.getY() && lessThan.getY() == equals.getX())) {
! return graph().unique(new NormalizeCompareNode(lessThan.getX(), lessThan.getY(), conditional.trueValue().stamp(view).getStackKind(), false));
}
}
}
}
return null;
--- 903,974 ----
}
if (otherValue != null && otherValue.isConstant()) {
double shortCutProbability = probability(trueSuccessor());
LogicNode newCondition = LogicNode.or(condition(), negateCondition, conditional.condition(), negateConditionalCondition, shortCutProbability);
return graph().unique(new ConditionalNode(newCondition, constant, otherValue));
! } else if (constant.isJavaConstant() && conditional.trueValue().isJavaConstant() && conditional.falseValue().isJavaConstant() && condition() instanceof CompareNode &&
! conditional.condition() instanceof CompareNode) {
! Condition cond1 = ((CompareNode) condition()).condition().asCondition();
! if (negateCondition) {
! cond1 = cond1.negate();
! }
! // cond1 is EQ, NE, LT, or GE
! Condition cond2 = ((CompareNode) conditional.condition()).condition().asCondition();
! ValueNode x = ((CompareNode) condition()).getX();
! ValueNode y = ((CompareNode) condition()).getY();
! ValueNode x2 = ((CompareNode) conditional.condition()).getX();
! ValueNode y2 = ((CompareNode) conditional.condition()).getY();
! // `x cond1 y ? c1 : (x2 cond2 y2 ? c2 : c3)`
! boolean sameVars = x == x2 && y == y2;
! if (!sameVars && x == y2 && y == x2) {
! sameVars = true;
! cond2 = cond2.mirror();
! }
! // cond2 is EQ, LT, or GT
! if (sameVars) {
! JavaKind stackKind = conditional.trueValue().stamp(NodeView.from(tool)).getStackKind();
! assert !stackKind.isNumericFloat();
! long c1 = constant.asJavaConstant().asLong();
! long c2 = conditional.trueValue().asJavaConstant().asLong();
! long c3 = conditional.falseValue().asJavaConstant().asLong();
! // `x cond1 y ? c1 : (x cond2 y ? c2 : c3)`
! if (cond1 == Condition.GE && cond2 == Condition.LT) {
! // x >= y ? v1 : (x < y ? v2 : v3) => x >= y ? v1 : v2
! return graph().unique(new ConditionalNode(condition(), conditional.trueValue(), constant));
! } else if (cond1 == Condition.GE && cond2 == Condition.GT) {
! // x >= y ? v1 : (x > y ? v2 : v3) => x >= y ? v1 : v3
! return graph().unique(new ConditionalNode(condition(), conditional.falseValue(), constant));
! } else if (cond1 == Condition.EQ && cond2 == Condition.EQ) {
! // x == y ? v1 : (x == y ? v2 : v3) => x == y ? v1 : v3
! return graph().unique(new ConditionalNode(condition(), conditional.falseValue(), constant));
! } else if (cond1 == Condition.NE && cond2 == Condition.LT) {
! // x != y ? v1 : (x < y ? v2 : v3) => x != y ? v1 : v3
! return graph().unique(new ConditionalNode(condition(), conditional.falseValue(), constant));
! } else if (cond1 == Condition.LT && cond2 == Condition.EQ && c1 == -1 && c2 == 0 && c3 == 1) {
! // x < y ? -1 : (x == y ? 0 : 1) => x cmp y
! return graph().unique(new NormalizeCompareNode(x, y, stackKind, false));
! } else if (cond1 == Condition.LT && cond2 == Condition.EQ && c1 == 1 && c2 == 0 && c3 == -1) {
! // x < y ? 1 : (x == y ? 0 : -1) => y cmp x
! return graph().unique(new NormalizeCompareNode(y, x, stackKind, false));
! } else if (cond1 == Condition.EQ && cond2 == Condition.LT && c1 == 0 && c2 == -1 && c3 == 1) {
! // x == y ? 0 : (x < y ? -1 : 1) => x cmp y
! return graph().unique(new NormalizeCompareNode(x, y, stackKind, false));
! } else if (cond1 == Condition.EQ && cond2 == Condition.LT && c1 == 0 && c2 == 1 && c3 == -1) {
! // x == y ? 0 : (x < y ? 1 : -1) => y cmp x
! return graph().unique(new NormalizeCompareNode(y, x, stackKind, false));
! } else if (cond1 == Condition.EQ && cond2 == Condition.GT && c1 == 0 && c2 == -1 && c3 == 1) {
! // x == y ? 0 : (x > y ? -1 : 1) => y cmp x
! return graph().unique(new NormalizeCompareNode(y, x, stackKind, false));
! } else if (cond1 == Condition.EQ && cond2 == Condition.GT && c1 == 0 && c2 == 1 && c3 == -1) {
! // x == y ? 0 : (x > y ? 1 : -1) => x cmp y
! return graph().unique(new NormalizeCompareNode(x, y, stackKind, false));
! } else if (cond1 == Condition.LT && cond2 == Condition.GT && c1 == 1 && c2 == -1 && c3 == 0) {
! // x < y ? 1 : (x > y ? -1 : 0) => y cmp x
! return graph().unique(new NormalizeCompareNode(y, x, stackKind, false));
! } else if (cond1 == Condition.LT && cond2 == Condition.GT && c1 == -1 && c2 == 1 && c3 == 0) {
! // x < y ? -1 : (x > y ? 1 : 0) => x cmp y
! return graph().unique(new NormalizeCompareNode(x, y, stackKind, false));
}
}
}
}
return null;
< prev index next >