15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.nodes.calc;
26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_1;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1;
29
30 import java.io.Serializable;
31 import java.util.function.Function;
32
33 import org.graalvm.compiler.core.common.type.ArithmeticOpTable;
34 import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp;
35 import org.graalvm.compiler.core.common.type.Stamp;
36 import org.graalvm.compiler.debug.GraalError;
37 import org.graalvm.compiler.graph.Graph;
38 import org.graalvm.compiler.graph.Node;
39 import org.graalvm.compiler.graph.NodeClass;
40 import org.graalvm.compiler.graph.iterators.NodePredicate;
41 import org.graalvm.compiler.graph.spi.Canonicalizable;
42 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
43 import org.graalvm.compiler.nodeinfo.NodeInfo;
44 import org.graalvm.compiler.nodes.ArithmeticOperation;
45 import org.graalvm.compiler.nodes.ConstantNode;
46 import org.graalvm.compiler.nodes.NodeView;
47 import org.graalvm.compiler.nodes.StructuredGraph;
48 import org.graalvm.compiler.nodes.ValueNode;
49 import org.graalvm.compiler.nodes.ValuePhiNode;
50 import org.graalvm.compiler.nodes.spi.ArithmeticLIRLowerable;
51 import org.graalvm.compiler.nodes.spi.NodeValueMap;
52
53 import jdk.vm.ci.meta.Constant;
54
114 }
115
116 public static ValueNode add(ValueNode v1, ValueNode v2, NodeView view) {
117 return AddNode.create(v1, v2, view);
118 }
119
120 public static ValueNode mul(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
121 return graph.addOrUniqueWithInputs(MulNode.create(v1, v2, view));
122 }
123
124 public static ValueNode mul(ValueNode v1, ValueNode v2, NodeView view) {
125 return MulNode.create(v1, v2, view);
126 }
127
128 public static ValueNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
129 return graph.addOrUniqueWithInputs(SubNode.create(v1, v2, view));
130 }
131
132 public static ValueNode sub(ValueNode v1, ValueNode v2, NodeView view) {
133 return SubNode.create(v1, v2, view);
134 }
135
136 private enum ReassociateMatch {
137 x,
138 y;
139
140 public ValueNode getValue(BinaryNode binary) {
141 switch (this) {
142 case x:
143 return binary.getX();
144 case y:
145 return binary.getY();
146 default:
147 throw GraalError.shouldNotReachHere();
148 }
149 }
150
151 public ValueNode getOtherValue(BinaryNode binary) {
152 switch (this) {
153 case x:
|
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.nodes.calc;
26
27 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_1;
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1;
29
30 import java.io.Serializable;
31 import java.util.function.Function;
32
33 import org.graalvm.compiler.core.common.type.ArithmeticOpTable;
34 import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp;
35 import org.graalvm.compiler.core.common.type.IntegerStamp;
36 import org.graalvm.compiler.core.common.type.Stamp;
37 import org.graalvm.compiler.debug.GraalError;
38 import org.graalvm.compiler.graph.Graph;
39 import org.graalvm.compiler.graph.Node;
40 import org.graalvm.compiler.graph.NodeClass;
41 import org.graalvm.compiler.graph.iterators.NodePredicate;
42 import org.graalvm.compiler.graph.spi.Canonicalizable;
43 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
44 import org.graalvm.compiler.nodeinfo.NodeInfo;
45 import org.graalvm.compiler.nodes.ArithmeticOperation;
46 import org.graalvm.compiler.nodes.ConstantNode;
47 import org.graalvm.compiler.nodes.NodeView;
48 import org.graalvm.compiler.nodes.StructuredGraph;
49 import org.graalvm.compiler.nodes.ValueNode;
50 import org.graalvm.compiler.nodes.ValuePhiNode;
51 import org.graalvm.compiler.nodes.spi.ArithmeticLIRLowerable;
52 import org.graalvm.compiler.nodes.spi.NodeValueMap;
53
54 import jdk.vm.ci.meta.Constant;
55
115 }
116
117 public static ValueNode add(ValueNode v1, ValueNode v2, NodeView view) {
118 return AddNode.create(v1, v2, view);
119 }
120
121 public static ValueNode mul(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
122 return graph.addOrUniqueWithInputs(MulNode.create(v1, v2, view));
123 }
124
125 public static ValueNode mul(ValueNode v1, ValueNode v2, NodeView view) {
126 return MulNode.create(v1, v2, view);
127 }
128
129 public static ValueNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2, NodeView view) {
130 return graph.addOrUniqueWithInputs(SubNode.create(v1, v2, view));
131 }
132
133 public static ValueNode sub(ValueNode v1, ValueNode v2, NodeView view) {
134 return SubNode.create(v1, v2, view);
135 }
136
137 public static ValueNode branchlessMin(ValueNode v1, ValueNode v2, NodeView view) {
138 if (v1.isDefaultConstant() && !v2.isDefaultConstant()) {
139 return branchlessMin(v2, v1, view);
140 }
141 int bits = ((IntegerStamp) v1.stamp(view)).getBits();
142 assert ((IntegerStamp) v2.stamp(view)).getBits() == bits;
143 ValueNode t1 = sub(v1, v2, view);
144 ValueNode t2 = RightShiftNode.create(t1, bits - 1, view);
145 ValueNode t3 = AndNode.create(t1, t2, view);
146 return add(v2, t3, view);
147 }
148
149 public static ValueNode branchlessMax(ValueNode v1, ValueNode v2, NodeView view) {
150 if (v1.isDefaultConstant() && !v2.isDefaultConstant()) {
151 return branchlessMax(v2, v1, view);
152 }
153 int bits = ((IntegerStamp) v1.stamp(view)).getBits();
154 assert ((IntegerStamp) v2.stamp(view)).getBits() == bits;
155 if (v2.isDefaultConstant()) {
156 // prefer a & ~(a>>31) to a - (a & (a>>31))
157 return AndNode.create(v1, NotNode.create(RightShiftNode.create(v1, bits - 1, view)), view);
158 } else {
159 ValueNode t1 = sub(v1, v2, view);
160 ValueNode t2 = RightShiftNode.create(t1, bits - 1, view);
161 ValueNode t3 = AndNode.create(t1, t2, view);
162 return sub(v1, t3, view);
163 }
164 }
165
166 private enum ReassociateMatch {
167 x,
168 y;
169
170 public ValueNode getValue(BinaryNode binary) {
171 switch (this) {
172 case x:
173 return binary.getX();
174 case y:
175 return binary.getY();
176 default:
177 throw GraalError.shouldNotReachHere();
178 }
179 }
180
181 public ValueNode getOtherValue(BinaryNode binary) {
182 switch (this) {
183 case x:
|