71 72 public static ValueNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2) { 73 if (isConstantZero(v2)) { 74 return v1; 75 } 76 return BinaryArithmeticNode.sub(graph, v1, v2, NodeView.DEFAULT); 77 } 78 79 public static ValueNode divBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, GuardingNode zeroCheck) { 80 return fixedDivBefore(graph, before, dividend, divisor, (dend, sor) -> SignedDivNode.create(dend, sor, zeroCheck, NodeView.DEFAULT)); 81 } 82 83 public static ValueNode unsignedDivBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, GuardingNode zeroCheck) { 84 return fixedDivBefore(graph, before, dividend, divisor, (dend, sor) -> UnsignedDivNode.create(dend, sor, zeroCheck, NodeView.DEFAULT)); 85 } 86 87 private static ValueNode fixedDivBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, BiFunction<ValueNode, ValueNode, ValueNode> createDiv) { 88 if (isConstantOne(divisor)) { 89 return dividend; 90 } 91 ValueNode div = graph.addOrUniqueWithInputs(createDiv.apply(dividend, divisor)); 92 if (div instanceof FixedBinaryNode) { 93 FixedBinaryNode fixedDiv = (FixedBinaryNode) div; 94 if (before.predecessor() instanceof FixedBinaryNode) { 95 FixedBinaryNode binaryPredecessor = (FixedBinaryNode) before.predecessor(); 96 if (fixedDiv.dataFlowEquals(binaryPredecessor)) { 97 fixedDiv.safeDelete(); 98 return binaryPredecessor; 99 } 100 } 101 graph.addBeforeFixed(before, fixedDiv); 102 } 103 return div; 104 } 105 } | 71 72 public static ValueNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2) { 73 if (isConstantZero(v2)) { 74 return v1; 75 } 76 return BinaryArithmeticNode.sub(graph, v1, v2, NodeView.DEFAULT); 77 } 78 79 public static ValueNode divBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, GuardingNode zeroCheck) { 80 return fixedDivBefore(graph, before, dividend, divisor, (dend, sor) -> SignedDivNode.create(dend, sor, zeroCheck, NodeView.DEFAULT)); 81 } 82 83 public static ValueNode unsignedDivBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, GuardingNode zeroCheck) { 84 return fixedDivBefore(graph, before, dividend, divisor, (dend, sor) -> UnsignedDivNode.create(dend, sor, zeroCheck, NodeView.DEFAULT)); 85 } 86 87 private static ValueNode fixedDivBefore(StructuredGraph graph, FixedNode before, ValueNode dividend, ValueNode divisor, BiFunction<ValueNode, ValueNode, ValueNode> createDiv) { 88 if (isConstantOne(divisor)) { 89 return dividend; 90 } 91 ValueNode div = createDiv.apply(dividend, divisor); 92 if (div instanceof FixedBinaryNode) { 93 FixedBinaryNode fixedDiv = (FixedBinaryNode) div; 94 if (before.predecessor() instanceof FixedBinaryNode) { 95 FixedBinaryNode binaryPredecessor = (FixedBinaryNode) before.predecessor(); 96 if (fixedDiv.dataFlowEquals(binaryPredecessor)) { 97 fixedDiv.safeDelete(); 98 return binaryPredecessor; 99 } 100 } 101 graph.addBeforeFixed(before, graph.addOrUniqueWithInputs(fixedDiv)); 102 } 103 return div; 104 } 105 } |