changeset 10575:97d280a879ff

ShiftNode: add constant with correct stamp in canonical()
author Bernhard Urban <bernhard.urban@jku.at>
date Thu, 20 Jun 2013 14:25:26 +0200
parents 0cad5096735e
children aee899c96b0b
files graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/InferStamp01.java graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/LongToSomethingArray01.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java
diffstat 5 files changed, 207 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/InferStamp01.java	Thu Jun 20 14:25:26 2013 +0200
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2013, 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.jtt.optimize;
+
+import com.oracle.graal.jtt.*;
+import org.junit.*;
+
+/**
+ * test some stamps in combination with full loop unrolling and shifts.
+ */
+public class InferStamp01 extends JTTTest {
+
+    public static int testi0(int arg) {
+        int a = arg;
+        for (int i = 0; i < 2; i++) {
+            a = a >> 16;
+        }
+        return a;
+    }
+
+    @Test
+    public void runi0() throws Throwable {
+        runTest("testi0", 0x7788_99aa);
+    }
+
+    public static int testi1(int arg) {
+        int a = arg;
+        for (int i = 0; i < 2; i++) {
+            a = a >>> 16;
+        }
+        return a;
+    }
+
+    @Test
+    public void runi1() throws Throwable {
+        runTest("testi1", 0x7788_99aa);
+    }
+
+    public static int testi2(int arg) {
+        int a = arg;
+        for (int i = 0; i < 2; i++) {
+            a = a << 16;
+        }
+        return a;
+    }
+
+    @Test
+    public void runi2() throws Throwable {
+        runTest("testi2", 0x7788_99aa);
+    }
+
+    public static long testl0(long arg) {
+        long a = arg;
+        for (long i = 0; i < 2; i++) {
+            a = a >> 32;
+        }
+        return a;
+    }
+
+    @Test
+    public void runl0() throws Throwable {
+        runTest("testl0", 0x3344_5566_7788_99aaL);
+    }
+
+    public static long testl1(long arg) {
+        long a = arg;
+        for (long i = 0; i < 2; i++) {
+            a = a >>> 32;
+        }
+        return a;
+    }
+
+    @Test
+    public void runl1() throws Throwable {
+        runTest("testl1", 0x3344_5566_7788_99aaL);
+    }
+
+    public static long testl2(long arg) {
+        long a = arg;
+        for (long i = 0; i < 2; i++) {
+            a = a << 32;
+        }
+        return a;
+    }
+
+    @Test
+    public void runl2() throws Throwable {
+        runTest("testl2", 0x3344_5566_7788_99aaL);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/optimize/LongToSomethingArray01.java	Thu Jun 20 14:25:26 2013 +0200
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2011, 2012, 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.jtt.optimize;
+
+import org.junit.*;
+
+import com.oracle.graal.jtt.*;
+
+/**
+ * inspired by java.security.SecureRandom.longToByteArray(long).
+ * 
+ */
+public class LongToSomethingArray01 extends JTTTest {
+
+    public static byte[] longToByteArray(long arg) {
+        long l = arg;
+        byte[] ret = new byte[8];
+        for (int i = 0; i < 8; i++) {
+            ret[i] = (byte) (l & 0xff);
+            l = l >> 8;
+        }
+        return ret;
+    }
+
+    @Test
+    public void runB0() throws Throwable {
+        runTest("longToByteArray", 0x1122_3344_5566_7788L);
+    }
+
+    public static short[] longToShortArray(long arg) {
+        long l = arg;
+        short[] ret = new short[4];
+        for (int i = 0; i < 4; i++) {
+            ret[i] = (short) (l & 0xffff);
+            l = l >> 16;
+        }
+        return ret;
+    }
+
+    @Test
+    public void runS0() throws Throwable {
+        runTest("longToShortArray", 0x1122_3344_5566_7788L);
+    }
+
+    public static int[] longToIntArray(long arg) {
+        long l = arg;
+        int[] ret = new int[2];
+        for (int i = 0; i < 2; i++) {
+            ret[i] = (int) (l & 0xffff_ffff);
+            l = l >> 32;
+        }
+        return ret;
+    }
+
+    @Test
+    public void runI0() throws Throwable {
+        runTest("longToIntArray", 0x1122_3344_5566_7788L);
+    }
+
+    public static long[] longToLongArray(long arg) {
+        long l = arg;
+        long[] ret = new long[1];
+        for (int i = 0; i < 1; i++) {
+            ret[i] = l & 0xffff_ffff_ffff_ffffL;
+            l = l >> 64;
+        }
+        return ret;
+    }
+
+    @Test
+    public void runL0() throws Throwable {
+        runTest("longToLongArray", 0x1122_3344_5566_7788L);
+    }
+}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java	Fri Jun 28 19:11:47 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java	Thu Jun 20 14:25:26 2013 +0200
@@ -71,7 +71,7 @@
                     if (other instanceof LeftShiftNode) {
                         int total = amount + otherAmount;
                         if (total != (total & mask)) {
-                            return ConstantNode.forInt(0, graph());
+                            return ConstantNode.forIntegerKind(kind(), 0, graph());
                         }
                         return graph().unique(new LeftShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph())));
                     } else if ((other instanceof RightShiftNode || other instanceof UnsignedRightShiftNode) && otherAmount == amount) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java	Fri Jun 28 19:11:47 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java	Thu Jun 20 14:25:26 2013 +0200
@@ -68,7 +68,7 @@
                     if (other instanceof RightShiftNode) {
                         int total = amount + otherAmount;
                         if (total != (total & mask)) {
-                            return ConstantNode.forInt(0, graph());
+                            return ConstantNode.forIntegerKind(kind(), 0, graph());
                         }
                         return graph().unique(new RightShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph())));
                     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java	Fri Jun 28 19:11:47 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java	Thu Jun 20 14:25:26 2013 +0200
@@ -71,7 +71,7 @@
                     if (other instanceof UnsignedRightShiftNode) {
                         int total = amount + otherAmount;
                         if (total != (total & mask)) {
-                            return ConstantNode.forInt(0, graph());
+                            return ConstantNode.forIntegerKind(kind(), 0, graph());
                         }
                         return graph().unique(new UnsignedRightShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph())));
                     } else if (other instanceof LeftShiftNode && otherAmount == amount) {