< 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
rev 52509 : [mq]: graal2


  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:


< prev index next >