< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java
Print this page
*** 76,85 ****
--- 76,86 ----
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.PrimitiveConstant;
import jdk.vm.ci.meta.ResolvedJavaMethod;
import jdk.vm.ci.meta.ResolvedJavaType;
+ import jdk.vm.ci.meta.TriState;
/**
* The {@code IfNode} represents a branch that can go one of two directions depending on the outcome
* of a comparison.
*/
*** 866,885 ****
}
}
}
}
private ValueNode canonicalizeConditionalCascade(SimplifierTool tool, ValueNode trueValue, ValueNode falseValue) {
if (trueValue.getStackKind() != falseValue.getStackKind()) {
return null;
}
if (trueValue.getStackKind() != JavaKind.Int && trueValue.getStackKind() != JavaKind.Long) {
return null;
}
if (trueValue.isConstant() && falseValue.isConstant()) {
return graph().unique(new ConditionalNode(condition(), trueValue, falseValue));
! } else if (!graph().isAfterExpandLogic()) {
ConditionalNode conditional = null;
ValueNode constant = null;
boolean negateCondition;
if (trueValue instanceof ConditionalNode && falseValue.isConstant()) {
conditional = (ConditionalNode) trueValue;
--- 867,919 ----
}
}
}
}
+ private ValueNode canonicalizeConditionalViaImplies(ValueNode trueValue, ValueNode falseValue) {
+ ValueNode collapsedTrue = trueValue;
+ ValueNode collapsedFalse = falseValue;
+ boolean simplify = false;
+ if (trueValue instanceof ConditionalNode) {
+ TriState result = condition().implies(false, ((ConditionalNode) trueValue).condition());
+ if (result.isKnown()) {
+ simplify = true;
+ collapsedTrue = result.toBoolean() ? ((ConditionalNode) trueValue).trueValue() : ((ConditionalNode) trueValue).falseValue();
+ }
+ }
+ if (falseValue instanceof ConditionalNode) {
+ TriState result = condition().implies(true, ((ConditionalNode) falseValue).condition());
+ if (result.isKnown()) {
+ simplify = true;
+ collapsedFalse = result.toBoolean() ? ((ConditionalNode) falseValue).trueValue() : ((ConditionalNode) falseValue).falseValue();
+ }
+ }
+ if (simplify) {
+ return graph().unique(new ConditionalNode(condition(), collapsedTrue, collapsedFalse));
+ }
+ return null;
+ }
+
private ValueNode canonicalizeConditionalCascade(SimplifierTool tool, ValueNode trueValue, ValueNode falseValue) {
if (trueValue.getStackKind() != falseValue.getStackKind()) {
return null;
}
if (trueValue.getStackKind() != JavaKind.Int && trueValue.getStackKind() != JavaKind.Long) {
return null;
}
if (trueValue.isConstant() && falseValue.isConstant()) {
return graph().unique(new ConditionalNode(condition(), trueValue, falseValue));
! }
! ValueNode value = canonicalizeConditionalViaImplies(trueValue, falseValue);
! if (value != null) {
! return value;
! }
! if (!graph().isAfterExpandLogic()) {
! /*
! * !isAfterExpandLogic() => Cannot spawn NormalizeCompareNodes after lowering in the
! * ExpandLogicPhase.
! */
ConditionalNode conditional = null;
ValueNode constant = null;
boolean negateCondition;
if (trueValue instanceof ConditionalNode && falseValue.isConstant()) {
conditional = (ConditionalNode) trueValue;
*** 903,914 ****
}
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
--- 937,951 ----
}
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));
! }
!
! 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
*** 921,951 ****
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));
--- 958,980 ----
boolean sameVars = x == x2 && y == y2;
if (!sameVars && x == y2 && y == x2) {
sameVars = true;
cond2 = cond2.mirror();
}
if (sameVars) {
JavaKind stackKind = conditional.trueValue().stamp(NodeView.from(tool)).getStackKind();
assert !stackKind.isNumericFloat();
!
! ValueNode v1 = constant;
! ValueNode v2 = conditional.trueValue();
! ValueNode v3 = conditional.falseValue();
!
! long c1 = v1.asJavaConstant().asLong();
! long c2 = v2.asJavaConstant().asLong();
! long c3 = v3.asJavaConstant().asLong();
!
! 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));
< prev index next >