1 /*
   2  * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  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 package org.graalvm.compiler.nodes;
  24 
  25 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
  26 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
  27 
  28 import org.graalvm.compiler.graph.Graph;
  29 import org.graalvm.compiler.graph.NodeClass;
  30 import org.graalvm.compiler.nodeinfo.NodeInfo;
  31 import org.graalvm.compiler.nodes.spi.LIRLowerable;
  32 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
  33 
  34 /**
  35  * The {@code LogicConstantNode} represents a boolean constant.
  36  */
  37 @NodeInfo(nameTemplate = "{p#value}", cycles = CYCLES_0, size = SIZE_0)
  38 public final class LogicConstantNode extends LogicNode implements LIRLowerable {
  39 
  40     public static final NodeClass<LogicConstantNode> TYPE = NodeClass.create(LogicConstantNode.class);
  41     protected final boolean value;
  42 
  43     public LogicConstantNode(boolean value) {
  44         super(TYPE);
  45         this.value = value;
  46     }
  47 
  48     /**
  49      * Returns a node for a boolean constant.
  50      *
  51      * @param v the boolean value for which to create the instruction
  52      * @param graph
  53      * @return a node representing the boolean
  54      */
  55     public static LogicConstantNode forBoolean(boolean v, Graph graph) {
  56         return graph.unique(new LogicConstantNode(v));
  57     }
  58 
  59     /**
  60      * Returns a node for a boolean constant.
  61      *
  62      * @param v the boolean value for which to create the instruction
  63      * @return a node representing the boolean
  64      */
  65     public static LogicConstantNode forBoolean(boolean v) {
  66         return new LogicConstantNode(v);
  67     }
  68 
  69     /**
  70      * Gets a constant for {@code true}.
  71      */
  72     public static LogicConstantNode tautology(Graph graph) {
  73         return forBoolean(true, graph);
  74     }
  75 
  76     /**
  77      * Gets a constant for {@code false}.
  78      */
  79     public static LogicConstantNode contradiction(Graph graph) {
  80         return forBoolean(false, graph);
  81     }
  82 
  83     /**
  84      * Gets a constant for {@code true}.
  85      */
  86     public static LogicConstantNode tautology() {
  87         return forBoolean(true);
  88     }
  89 
  90     /**
  91      * Gets a constant for {@code false}.
  92      */
  93     public static LogicConstantNode contradiction() {
  94         return forBoolean(false);
  95     }
  96 
  97     public boolean getValue() {
  98         return value;
  99     }
 100 
 101     @Override
 102     public void generate(NodeLIRBuilderTool generator) {
 103         // nothing to do
 104     }
 105 }