< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryArithmeticNode.java
Print this page
*** 88,97 ****
--- 88,117 ----
NodeView view = NodeView.from(tool);
ValueNode result = tryConstantFold(getOp(forX, forY), forX, forY, stamp(view), view);
if (result != null) {
return result;
}
+ if (forX instanceof ConditionalNode && forY.isConstant() && forX.hasExactlyOneUsage()) {
+ ConditionalNode conditionalNode = (ConditionalNode) forX;
+ BinaryOp<OP> arithmeticOp = getArithmeticOp();
+ ConstantNode trueConstant = tryConstantFold(arithmeticOp, conditionalNode.trueValue(), forY, this.stamp(view), view);
+ if (trueConstant != null) {
+ ConstantNode falseConstant = tryConstantFold(arithmeticOp, conditionalNode.falseValue(), forY, this.stamp(view), view);
+ if (falseConstant != null) {
+ // @formatter:off
+ /* The arithmetic is folded into a constant on both sides of the conditional.
+ * Example:
+ * (cond ? -5 : 5) + 100
+ * canonicalizes to:
+ * (cond ? 95 : 105)
+ */
+ // @formatter:on
+ return ConditionalNode.create(conditionalNode.condition, trueConstant,
+ falseConstant, view);
+ }
+ }
+ }
return this;
}
@SuppressWarnings("unused")
public static <OP> ConstantNode tryConstantFold(BinaryOp<OP> op, ValueNode forX, ValueNode forY, Stamp stamp, NodeView view) {
*** 116,141 ****
--- 136,173 ----
public static ValueNode add(ValueNode v1, ValueNode v2, NodeView view) {
return AddNode.create(v1, v2, view);
}
+ public static ValueNode add(ValueNode v1, ValueNode v2) {
+ return add(v1, v2, NodeView.DEFAULT);
+ }
+
public static ValueNode mul(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
return graph.addOrUniqueWithInputs(MulNode.create(v1, v2, view));
}
public static ValueNode mul(ValueNode v1, ValueNode v2, NodeView view) {
return MulNode.create(v1, v2, view);
}
+ public static ValueNode mul(ValueNode v1, ValueNode v2) {
+ return mul(v1, v2, NodeView.DEFAULT);
+ }
+
public static ValueNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
return graph.addOrUniqueWithInputs(SubNode.create(v1, v2, view));
}
public static ValueNode sub(ValueNode v1, ValueNode v2, NodeView view) {
return SubNode.create(v1, v2, view);
}
+ public static ValueNode sub(ValueNode v1, ValueNode v2) {
+ return sub(v1, v2, NodeView.DEFAULT);
+ }
+
public static ValueNode branchlessMin(ValueNode v1, ValueNode v2, NodeView view) {
if (v1.isDefaultConstant() && !v2.isDefaultConstant()) {
return branchlessMin(v2, v1, view);
}
int bits = ((IntegerStamp) v1.stamp(view)).getBits();
< prev index next >