Mercurial > hg > graal-compiler
view graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LogicNode.java @ 5621:b0f511b40eee
Add BinaryNode.reassociate to do generic +, -, *, &, |, ^ reassociation, use it for canoncialization. Will be used to reassociate loop invariants.
Better canonical form for +/-
Stop canonicalizing a-Cst to a+(-Cst)
Canonicalize a-(-Cst) to a+Cst
Canonicalize a+(-Cst) to a-Cst
Canonicalize -a+b to b-a
Add jtt and white box tests for that
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 15 Jun 2012 15:35:10 +0200 |
parents | a891c53a295b |
children | d71eb56d6bb0 |
line wrap: on
line source
/* * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; /** * The {@code LogicNode} class definition. */ public abstract class LogicNode extends BinaryNode { /** * Constructs a new logic operation node. * @param x the first input into this node * @param y the second input into this node */ public LogicNode(Kind kind, ValueNode x, ValueNode y) { super(kind, x, y); } public static LogicNode and(ValueNode v1, ValueNode v2) { assert v1.kind() == v2.kind() && v1.graph() == v2.graph(); Graph graph = v1.graph(); switch(v1.kind()) { case Int: return graph.unique(new AndNode(Kind.Int, v1, v2)); case Long: return graph.unique(new AndNode(Kind.Long, v1, v2)); default: throw ValueNodeUtil.shouldNotReachHere(); } } public static LogicNode or(ValueNode v1, ValueNode v2) { assert v1.kind() == v2.kind() && v1.graph() == v2.graph(); Graph graph = v1.graph(); switch(v1.kind()) { case Int: return graph.unique(new OrNode(Kind.Int, v1, v2)); case Long: return graph.unique(new OrNode(Kind.Long, v1, v2)); default: throw ValueNodeUtil.shouldNotReachHere(); } } public static LogicNode xor(ValueNode v1, ValueNode v2) { assert v1.kind() == v2.kind() && v1.graph() == v2.graph(); Graph graph = v1.graph(); switch(v1.kind()) { case Int: return graph.unique(new XorNode(Kind.Int, v1, v2)); case Long: return graph.unique(new XorNode(Kind.Long, v1, v2)); default: throw ValueNodeUtil.shouldNotReachHere(); } } }