001/*
002 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation.
008 *
009 * This code is distributed in the hope that it will be useful, but WITHOUT
010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
011 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
012 * version 2 for more details (a copy is included in the LICENSE file that
013 * accompanied this code).
014 *
015 * You should have received a copy of the GNU General Public License version
016 * 2 along with this work; if not, write to the Free Software Foundation,
017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
018 *
019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
020 * or visit www.oracle.com if you need additional information or have any
021 * questions.
022 */
023package com.oracle.graal.compiler.test;
024
025import org.junit.*;
026
027/**
028 * Check for incorrect elimination of 0.0 and -0.0 from computations. They can affect the sign of
029 * the result of an add or substract.
030 */
031public class FloatOptimizationTest extends GraalCompilerTest {
032
033    @Test
034    public void test1() {
035        test("test1Snippet", -0.0);
036    }
037
038    @SuppressWarnings("all")
039    public static double test1Snippet(double x) {
040        return x + 0.0;
041    }
042
043    @Test
044    public void test2() {
045        test("test2Snippet", -0.0f);
046    }
047
048    @SuppressWarnings("all")
049    public static double test2Snippet(float x) {
050        return x + 0.0f;
051    }
052
053    @Test
054    public void test3() {
055        test("test3Snippet", -0.0);
056    }
057
058    @SuppressWarnings("all")
059    public static double test3Snippet(double x) {
060        return x - -0.0;
061    }
062
063    @Test
064    public void test4() {
065        test("test4Snippet", -0.0f);
066    }
067
068    @SuppressWarnings("all")
069    public static double test4Snippet(float x) {
070        return x - -0.0f;
071    }
072
073    @Override
074    protected void assertDeepEquals(String message, Object expected, Object actual, double delta) {
075        if (expected instanceof Double && actual instanceof Double) {
076            double e = (double) expected;
077            double a = (double) actual;
078            if (Double.doubleToRawLongBits(a) != Double.doubleToRawLongBits(e)) {
079                Assert.fail((message == null ? "" : message) + "raw double bits not equal " + Double.doubleToRawLongBits(a) + " != " + Double.doubleToRawLongBits(e));
080            }
081        } else {
082            super.assertDeepEquals(message, expected, actual, delta);
083        }
084    }
085}