src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/PrimitiveStampBoundaryTest.java
author dlong
Tue, 24 Sep 2019 12:47:15 -0400
changeset 58299 6df94ce3ab2f
parent 54724 62f373a53296
permissions -rw-r--r--
8229201: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     1
/*
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 54724
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     4
 *
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     8
 *
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    13
 * accompanied this code).
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    14
 *
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    18
 *
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    21
 * questions.
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 49451
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 49451
diff changeset
    24
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    25
package org.graalvm.compiler.nodes.test;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    26
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    27
import java.util.EnumSet;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    28
import java.util.HashSet;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    29
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    30
import org.graalvm.compiler.core.common.calc.FloatConvert;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    31
import org.graalvm.compiler.core.common.calc.FloatConvertCategory;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    32
import org.graalvm.compiler.core.common.type.ArithmeticOpTable;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    33
import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    34
import org.graalvm.compiler.core.common.type.ArithmeticOpTable.IntegerConvertOp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    35
import org.graalvm.compiler.core.common.type.ArithmeticOpTable.ShiftOp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    36
import org.graalvm.compiler.core.common.type.FloatStamp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    37
import org.graalvm.compiler.core.common.type.IntegerStamp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    38
import org.graalvm.compiler.core.common.type.PrimitiveStamp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    39
import org.graalvm.compiler.core.common.type.Stamp;
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
    40
import org.graalvm.compiler.core.common.type.StampFactory;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    41
import org.graalvm.compiler.test.GraalTest;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    42
import org.junit.Test;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    43
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    44
import jdk.vm.ci.meta.Constant;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    45
import jdk.vm.ci.meta.JavaConstant;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    46
import jdk.vm.ci.meta.JavaKind;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    47
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    48
/**
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    49
 * Exercise the various stamp folding operations by generating ranges from a set of boundary values
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    50
 * and then ensuring that the values that produced those ranges are in the resulting stamp.
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    51
 */
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    52
public class PrimitiveStampBoundaryTest extends GraalTest {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    53
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    54
    static long[] longBoundaryValues = {Long.MIN_VALUE, Long.MIN_VALUE + 1, Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -1, 0, 1, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, Long.MAX_VALUE - 1,
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    55
                    Long.MAX_VALUE};
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    56
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    57
    static int[] shiftBoundaryValues = {-128, -1, 0, 1, 4, 8, 16, 31, 63, 128};
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    58
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    59
    static HashSet<IntegerStamp> shiftStamps;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    60
    static HashSet<PrimitiveStamp> integerTestStamps;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    61
    static HashSet<PrimitiveStamp> floatTestStamps;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    62
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    63
    static {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    64
        shiftStamps = new HashSet<>();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    65
        for (long v1 : shiftBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    66
            for (long v2 : shiftBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    67
                shiftStamps.add(IntegerStamp.create(32, Math.min(v1, v2), Math.max(v1, v2)));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    68
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    69
        }
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
    70
        shiftStamps.add((IntegerStamp) StampFactory.empty(JavaKind.Int));
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    71
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    72
        integerTestStamps = new HashSet<>();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    73
        for (long v1 : longBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    74
            for (long v2 : longBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    75
                if (v2 == (int) v2 && v1 == (int) v1) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    76
                    integerTestStamps.add(IntegerStamp.create(32, Math.min(v1, v2), Math.max(v1, v2)));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    77
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    78
                integerTestStamps.add(IntegerStamp.create(64, Math.min(v1, v2), Math.max(v1, v2)));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    79
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    80
        }
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
    81
        integerTestStamps.add((PrimitiveStamp) StampFactory.empty(JavaKind.Int));
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
    82
        integerTestStamps.add((PrimitiveStamp) StampFactory.empty(JavaKind.Long));
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    83
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    84
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    85
    static double[] doubleBoundaryValues = {Double.NEGATIVE_INFINITY, Double.MIN_VALUE, Float.NEGATIVE_INFINITY, Float.MIN_VALUE,
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
    86
                    Long.MIN_VALUE, Long.MIN_VALUE + 1, Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -1, -0.0, +0.0, 1,
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    87
                    Integer.MAX_VALUE - 1, Integer.MAX_VALUE, Long.MAX_VALUE - 1, Long.MAX_VALUE,
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    88
                    Float.MAX_VALUE, Float.POSITIVE_INFINITY, Double.MAX_VALUE, Double.POSITIVE_INFINITY};
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    89
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    90
    static double[] doubleSpecialValues = {Double.NaN, -0.0, -0.0F, Float.NaN};
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    91
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    92
    static {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    93
        floatTestStamps = new HashSet<>();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    94
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    95
        for (double d1 : doubleBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    96
            for (double d2 : doubleBoundaryValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    97
                float f1 = (float) d2;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    98
                float f2 = (float) d1;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
    99
                if (d2 == f1 && d1 == f2) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   100
                    generateFloatingStamps(new FloatStamp(32, Math.min(f2, f1), Math.max(f2, f1), true));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   101
                    generateFloatingStamps(new FloatStamp(32, Math.min(f2, f1), Math.max(f2, f1), false));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   102
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   103
                generateFloatingStamps(new FloatStamp(64, Math.min(d1, d2), Math.max(d1, d2), true));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   104
                generateFloatingStamps(new FloatStamp(64, Math.min(d1, d2), Math.max(d1, d2), false));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   105
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   106
        }
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   107
        floatTestStamps.add((PrimitiveStamp) StampFactory.empty(JavaKind.Float));
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   108
        floatTestStamps.add((PrimitiveStamp) StampFactory.empty(JavaKind.Double));
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   109
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   110
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   111
    private static void generateFloatingStamps(FloatStamp floatStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   112
        floatTestStamps.add(floatStamp);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   113
        for (double d : doubleSpecialValues) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   114
            FloatStamp newStamp = (FloatStamp) floatStamp.meet(floatStampForConstant(d, floatStamp.getBits()));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   115
            if (!newStamp.isUnrestricted()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   116
                floatTestStamps.add(newStamp);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   117
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   118
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   119
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   120
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   121
    @Test
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   122
    public void testConvertBoundaryValues() {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   123
        testConvertBoundaryValues(IntegerStamp.OPS.getSignExtend(), 32, 64, integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   124
        testConvertBoundaryValues(IntegerStamp.OPS.getZeroExtend(), 32, 64, integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   125
        testConvertBoundaryValues(IntegerStamp.OPS.getNarrow(), 64, 32, integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   126
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   127
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   128
    private static void testConvertBoundaryValues(IntegerConvertOp<?> op, int inputBits, int resultBits, HashSet<PrimitiveStamp> stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   129
        for (PrimitiveStamp stamp : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   130
            if (inputBits == stamp.getBits()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   131
                Stamp lower = boundaryStamp(stamp, false);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   132
                Stamp upper = boundaryStamp(stamp, true);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   133
                checkConvertOperation(op, inputBits, resultBits, op.foldStamp(inputBits, resultBits, stamp), lower);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   134
                checkConvertOperation(op, inputBits, resultBits, op.foldStamp(inputBits, resultBits, stamp), upper);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   135
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   136
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   137
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   138
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   139
    private static void checkConvertOperation(IntegerConvertOp<?> op, int inputBits, int resultBits, Stamp result, Stamp v1stamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   140
        Stamp folded = op.foldStamp(inputBits, resultBits, v1stamp);
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   141
        assertTrue(folded.isEmpty() || folded.asConstant() != null, "should constant fold %s %s %s", op, v1stamp, folded);
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   142
        assertTrue(result.meet(folded).equals(result), "result out of range %s %s %s %s %s", op, v1stamp, folded, result, result.meet(folded));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   143
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   144
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   145
    @Test
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   146
    public void testFloatConvertBoundaryValues() {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   147
        for (FloatConvert op : EnumSet.allOf(FloatConvert.class)) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   148
            ArithmeticOpTable.FloatConvertOp floatConvert = IntegerStamp.OPS.getFloatConvert(op);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   149
            if (floatConvert == null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   150
                continue;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   151
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   152
            assert op.getCategory() == FloatConvertCategory.IntegerToFloatingPoint : op;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   153
            testConvertBoundaryValues(floatConvert, op.getInputBits(), integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   154
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   155
        for (FloatConvert op : EnumSet.allOf(FloatConvert.class)) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   156
            ArithmeticOpTable.FloatConvertOp floatConvert = FloatStamp.OPS.getFloatConvert(op);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   157
            if (floatConvert == null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   158
                continue;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   159
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   160
            assert op.getCategory() == FloatConvertCategory.FloatingPointToInteger || op.getCategory() == FloatConvertCategory.FloatingPointToFloatingPoint : op;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   161
            testConvertBoundaryValues(floatConvert, op.getInputBits(), floatTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   162
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   163
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   164
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   165
    private static void testConvertBoundaryValues(ArithmeticOpTable.FloatConvertOp op, int bits, HashSet<PrimitiveStamp> stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   166
        for (PrimitiveStamp stamp : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   167
            if (bits == stamp.getBits()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   168
                Stamp lower = boundaryStamp(stamp, false);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   169
                Stamp upper = boundaryStamp(stamp, true);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   170
                checkConvertOperation(op, op.foldStamp(stamp), lower);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   171
                checkConvertOperation(op, op.foldStamp(stamp), upper);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   172
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   173
        }
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   174
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   175
    }
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   176
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   177
    static void shouldConstantFold(boolean b, Stamp folded, Object o, Stamp s1) {
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   178
        assertTrue(b || (folded instanceof FloatStamp && ((FloatStamp) folded).contains(0.0)), "should constant fold %s %s %s", o, s1, folded);
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   179
    }
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   180
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   181
    private static boolean constantFloatStampMayIncludeNegativeZero(Stamp s) {
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   182
        if (s instanceof FloatStamp) {
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   183
            FloatStamp f = (FloatStamp) s;
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   184
            return Double.compare(f.lowerBound(), f.upperBound()) == 0 && f.isNonNaN();
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   185
        }
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   186
        return false;
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   187
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   188
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   189
    private static void checkConvertOperation(ArithmeticOpTable.FloatConvertOp op, Stamp result, Stamp v1stamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   190
        Stamp folded = op.foldStamp(v1stamp);
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   191
        shouldConstantFold(folded.isEmpty() || folded.asConstant() != null, folded, op, v1stamp);
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   192
        assertTrue(result.meet(folded).equals(result), "result out of range %s %s %s %s %s", op, v1stamp, folded, result, result.meet(folded));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   193
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   194
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   195
    @Test
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   196
    public void testShiftBoundaryValues() {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   197
        for (ShiftOp<?> op : IntegerStamp.OPS.getShiftOps()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   198
            testShiftBoundaryValues(op, integerTestStamps, shiftStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   199
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   200
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   201
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   202
    private static void testShiftBoundaryValues(ShiftOp<?> shiftOp, HashSet<PrimitiveStamp> stamps, HashSet<IntegerStamp> shifts) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   203
        for (PrimitiveStamp testStamp : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   204
            if (testStamp instanceof IntegerStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   205
                IntegerStamp stamp = (IntegerStamp) testStamp;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   206
                for (IntegerStamp shiftStamp : shifts) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   207
                    IntegerStamp foldedStamp = (IntegerStamp) shiftOp.foldStamp(stamp, shiftStamp);
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   208
                    if (foldedStamp.isEmpty()) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   209
                        assertTrue(stamp.isEmpty() || shiftStamp.isEmpty());
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   210
                        continue;
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   211
                    }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   212
                    checkShiftOperation(stamp.getBits(), shiftOp, foldedStamp, stamp.lowerBound(), shiftStamp.lowerBound());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   213
                    checkShiftOperation(stamp.getBits(), shiftOp, foldedStamp, stamp.lowerBound(), shiftStamp.upperBound());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   214
                    checkShiftOperation(stamp.getBits(), shiftOp, foldedStamp, stamp.upperBound(), shiftStamp.lowerBound());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   215
                    checkShiftOperation(stamp.getBits(), shiftOp, foldedStamp, stamp.upperBound(), shiftStamp.upperBound());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   216
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   217
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   218
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   219
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   220
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   221
    private static void checkShiftOperation(int bits, ShiftOp<?> op, IntegerStamp result, long v1, long v2) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   222
        IntegerStamp v1stamp = IntegerStamp.create(bits, v1, v1);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   223
        IntegerStamp v2stamp = IntegerStamp.create(32, v2, v2);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   224
        IntegerStamp folded = (IntegerStamp) op.foldStamp(v1stamp, v2stamp);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   225
        Constant constant = op.foldConstant(JavaConstant.forPrimitiveInt(bits, v1), (int) v2);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   226
        assertTrue(constant != null);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   227
        assertTrue(folded.asConstant() != null, "should constant fold %s %s %s %s", op, v1stamp, v2stamp, folded);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   228
        assertTrue(result.meet(folded).equals(result), "result out of range %s %s %s %s %s %s", op, v1stamp, v2stamp, folded, result, result.meet(folded));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   229
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   230
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   231
    private static void checkBinaryOperation(ArithmeticOpTable.BinaryOp<?> op, Stamp result, Stamp v1stamp, Stamp v2stamp) {
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   232
        if (constantFloatStampMayIncludeNegativeZero(v1stamp) || constantFloatStampMayIncludeNegativeZero(v2stamp)) {
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   233
            return;
62f373a53296 8222665: Update Graal
jwilhelm
parents: 52910
diff changeset
   234
        }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   235
        Stamp folded = op.foldStamp(v1stamp, v2stamp);
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   236
        if (v1stamp.isEmpty() || v2stamp.isEmpty()) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   237
            assertTrue(folded.isEmpty());
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   238
            assertTrue(v1stamp.asConstant() != null || v1stamp.isEmpty());
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   239
            assertTrue(v2stamp.asConstant() != null || v2stamp.isEmpty());
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   240
            return;
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   241
        }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   242
        Constant constant = op.foldConstant(v1stamp.asConstant(), v2stamp.asConstant());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   243
        if (constant != null) {
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   244
            assertFalse(folded.isEmpty());
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   245
            Constant constant2 = folded.asConstant();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   246
            if (constant2 == null && v1stamp instanceof FloatStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   247
                JavaConstant c = (JavaConstant) constant;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   248
                assertTrue((c.getJavaKind() == JavaKind.Double && Double.isNaN(c.asDouble())) ||
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   249
                                (c.getJavaKind() == JavaKind.Float && Float.isNaN(c.asFloat())));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   250
            } else {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   251
                assertTrue(constant2 != null, "should constant fold %s %s %s %s", op, v1stamp, v2stamp, folded);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   252
                if (!constant.equals(constant2)) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   253
                    op.foldConstant(v1stamp.asConstant(), v2stamp.asConstant());
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   254
                    op.foldStamp(v1stamp, v2stamp);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   255
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   256
                assertTrue(constant.equals(constant2), "should produce same constant %s %s %s %s %s", op, v1stamp, v2stamp, constant, constant2);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   257
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   258
            assertTrue(result.meet(folded).equals(result), "result out of range %s %s %s %s %s %s", op, v1stamp, v2stamp, folded, result, result.meet(folded));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   259
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   260
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   261
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   262
    @Test
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   263
    public void testBinaryBoundaryValues() {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   264
        for (BinaryOp<?> op : IntegerStamp.OPS.getBinaryOps()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   265
            if (op != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   266
                testBinaryBoundaryValues(op, integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   267
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   268
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   269
        for (BinaryOp<?> op : FloatStamp.OPS.getBinaryOps()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   270
            if (op != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   271
                testBinaryBoundaryValues(op, floatTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   272
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   273
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   274
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   275
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   276
    private static Stamp boundaryStamp(Stamp v1, boolean upper) {
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   277
        if (v1.isEmpty()) {
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   278
            return v1;
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   279
        }
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   280
        if (v1 instanceof IntegerStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   281
            IntegerStamp istamp = (IntegerStamp) v1;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   282
            long bound = upper ? istamp.upperBound() : istamp.lowerBound();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   283
            return IntegerStamp.create(istamp.getBits(), bound, bound);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   284
        } else if (v1 instanceof FloatStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   285
            FloatStamp floatStamp = (FloatStamp) v1;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   286
            double bound = upper ? floatStamp.upperBound() : floatStamp.lowerBound();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   287
            int bits = floatStamp.getBits();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   288
            return floatStampForConstant(bound, bits);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   289
        } else {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   290
            throw new InternalError("unexpected stamp type " + v1);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   291
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   292
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   293
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   294
    private static FloatStamp floatStampForConstant(double bound, int bits) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   295
        if (bits == 32) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   296
            float fbound = (float) bound;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   297
            return new FloatStamp(bits, fbound, fbound, !Float.isNaN(fbound));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   298
        } else {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   299
            return new FloatStamp(bits, bound, bound, !Double.isNaN(bound));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   300
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   301
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   302
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   303
    private static void testBinaryBoundaryValues(ArithmeticOpTable.BinaryOp<?> op, HashSet<PrimitiveStamp> stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   304
        for (PrimitiveStamp v1 : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   305
            for (PrimitiveStamp v2 : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   306
                if (v1.getBits() == v2.getBits() && v1.getClass() == v2.getClass()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   307
                    Stamp result = op.foldStamp(v1, v2);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   308
                    Stamp v1lower = boundaryStamp(v1, false);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   309
                    Stamp v1upper = boundaryStamp(v1, true);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   310
                    Stamp v2lower = boundaryStamp(v2, false);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   311
                    Stamp v2upper = boundaryStamp(v2, true);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   312
                    checkBinaryOperation(op, result, v1lower, v2lower);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   313
                    checkBinaryOperation(op, result, v1lower, v2upper);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   314
                    checkBinaryOperation(op, result, v1upper, v2lower);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   315
                    checkBinaryOperation(op, result, v1upper, v2upper);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   316
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   317
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   318
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   319
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   320
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   321
    @Test
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   322
    public void testUnaryBoundaryValues() {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   323
        for (ArithmeticOpTable.UnaryOp<?> op : IntegerStamp.OPS.getUnaryOps()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   324
            if (op != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   325
                testUnaryBoundaryValues(op, integerTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   326
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   327
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   328
        for (ArithmeticOpTable.UnaryOp<?> op : FloatStamp.OPS.getUnaryOps()) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   329
            if (op != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   330
                testUnaryBoundaryValues(op, floatTestStamps);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   331
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   332
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   333
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   334
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   335
    private static void testUnaryBoundaryValues(ArithmeticOpTable.UnaryOp<?> op, HashSet<PrimitiveStamp> stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   336
        for (PrimitiveStamp v1 : stamps) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   337
            Stamp result = op.foldStamp(v1);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   338
            checkUnaryOperation(op, result, boundaryStamp(v1, false));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   339
            checkUnaryOperation(op, result, boundaryStamp(v1, true));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   340
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   341
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   342
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   343
    private static void checkUnaryOperation(ArithmeticOpTable.UnaryOp<?> op, Stamp result, Stamp v1stamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   344
        Stamp folded = op.foldStamp(v1stamp);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   345
        Constant v1constant = v1stamp.asConstant();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   346
        if (v1constant != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   347
            Constant constant = op.foldConstant(v1constant);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   348
            if (constant != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   349
                Constant constant2 = folded.asConstant();
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   350
                if (constant2 == null && v1stamp instanceof FloatStamp) {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   351
                    JavaConstant c = (JavaConstant) constant;
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   352
                    assertTrue((c.getJavaKind() == JavaKind.Double && Double.isNaN(c.asDouble())) ||
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   353
                                    (c.getJavaKind() == JavaKind.Float && Float.isNaN(c.asFloat())));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   354
                } else {
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   355
                    assertTrue(constant2 != null, "should constant fold %s %s %s", op, v1stamp, folded);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   356
                    assertTrue(constant.equals(constant2), "should produce same constant %s %s %s %s", op, v1stamp, constant, constant2);
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   357
                }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   358
            }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   359
        } else {
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 47798
diff changeset
   360
            assertTrue(v1stamp.isEmpty() || v1stamp instanceof FloatStamp);
47798
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   361
        }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   362
        assertTrue(result.meet(folded).equals(result), "result out of range %s %s %s %s %s", op, v1stamp, folded, result, result.meet(folded));
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   363
    }
9fe9292f5931 8190710: Update Graal
dlong
parents:
diff changeset
   364
}