1 /*
2  * Copyright (c) 2014, 2018, 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 
24 
25 package org.graalvm.compiler.nodes.calc;
26 
27 import org.graalvm.compiler.core.common.calc.CanonicalCondition;
28 import org.graalvm.compiler.nodes.ValueNode;
29 import org.graalvm.compiler.nodes.ValueNodeInterface;
30 
31 import jdk.vm.ci.meta.Constant;
32 import jdk.vm.ci.meta.ConstantReflectionProvider;
33 
34 /**
35  * Represents a conversion between primitive types.
36  */
37 public interface ConvertNode extends ValueNodeInterface {
38 
getValue()39     ValueNode getValue();
40 
convert(Constant c, ConstantReflectionProvider constantReflection)41     Constant convert(Constant c, ConstantReflectionProvider constantReflection);
42 
reverse(Constant c, ConstantReflectionProvider constantReflection)43     Constant reverse(Constant c, ConstantReflectionProvider constantReflection);
44 
45     /**
46      * Checks whether a null check may skip the conversion. This is true if in the conversion NULL
47      * is converted to NULL and if it is the only value converted to NULL.
48      *
49      * @return whether a null check may skip the conversion
50      */
mayNullCheckSkipConversion()51     boolean mayNullCheckSkipConversion();
52 
53     /**
54      * Check whether a conversion is lossless.
55      *
56      * @return true iff reverse(convert(c)) == c for all c
57      */
isLossless()58     boolean isLossless();
59 
60     /**
61      * Check whether a conversion preserves comparison order.
62      *
63      * @param op a comparison operator
64      * @return true iff (c1 op c2) == (convert(c1) op convert(c2)) for all c1, c2
65      */
preservesOrder(CanonicalCondition op)66     default boolean preservesOrder(CanonicalCondition op) {
67         return isLossless();
68     }
69 
70     /**
71      * Check whether a conversion preserves comparison order against a particular constant value.
72      *
73      * @param op a comparison operator
74      * @param value
75      * @param constantReflection
76      * @return true iff (c1 op value) == (convert(c1) op convert(value)) for value and all c1
77      */
preservesOrder(CanonicalCondition op, Constant value, ConstantReflectionProvider constantReflection)78     default boolean preservesOrder(CanonicalCondition op, Constant value, ConstantReflectionProvider constantReflection) {
79         return preservesOrder(op);
80     }
81 }
82