changeset 22088:b68929da1ac5

Fix bug in constant folding of unsigned division.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 25 Jun 2015 15:08:08 +0200
parents ba177df8f5aa
children 13a50cb905b7
files graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/DivideUnsigned.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java
diffstat 3 files changed, 104 insertions(+), 6 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/jdk/DivideUnsigned.java	Thu Jun 25 15:08:08 2015 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, 2015, 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.jdk;
+
+import org.junit.*;
+
+import com.oracle.graal.jtt.*;
+
+public class DivideUnsigned extends JTTTest {
+
+    public static int divUInt(int a, int b) {
+        return Integer.divideUnsigned(a, b);
+    }
+
+    public static int remUInt(int a, int b) {
+        return Integer.remainderUnsigned(a, b);
+    }
+
+    public static long divULong(long a, long b) {
+        return Long.divideUnsigned(a, b);
+    }
+
+    public static long remULong(long a, long b) {
+        return Long.remainderUnsigned(a, b);
+    }
+
+    public void testInt(int a, int b) {
+        runTest("divUInt", a, b);
+        runTest("remUInt", a, b);
+    }
+
+    public void testLong(long a, long b) {
+        runTest("divULong", a, b);
+        runTest("remULong", a, b);
+    }
+
+    @Test
+    public void testIntPP() {
+        testInt(5, 2);
+    }
+
+    @Test
+    public void testIntNP() {
+        testInt(-5, 2);
+    }
+
+    @Test
+    public void testIntPN() {
+        testInt(5, -2);
+    }
+
+    @Test
+    public void testIntNN() {
+        testInt(-5, -2);
+    }
+
+    @Test
+    public void testLongPP() {
+        testLong(5, 2);
+    }
+
+    @Test
+    public void testLongNP() {
+        testLong(-5, 2);
+    }
+
+    @Test
+    public void testLongPN() {
+        testLong(5, -2);
+    }
+
+    @Test
+    public void testLongNN() {
+        testLong(-5, -2);
+    }
+}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java	Thu Jun 25 14:33:53 2015 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java	Thu Jun 25 15:08:08 2015 +0200
@@ -46,14 +46,15 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
+        int bits = ((IntegerStamp) stamp()).getBits();
         if (forX.isConstant() && forY.isConstant()) {
-            long yConst = forY.asJavaConstant().asLong();
+            long yConst = CodeUtil.zeroExtend(forY.asJavaConstant().asLong(), bits);
             if (yConst == 0) {
                 return this; // this will trap, cannot canonicalize
             }
-            return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.divide(forX.asJavaConstant().asLong(), yConst));
+            return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.divide(CodeUtil.zeroExtend(forX.asJavaConstant().asLong(), bits), yConst));
         } else if (forY.isConstant()) {
-            long c = forY.asJavaConstant().asLong();
+            long c = CodeUtil.zeroExtend(forY.asJavaConstant().asLong(), bits);
             if (c == 1) {
                 return forX;
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java	Thu Jun 25 14:33:53 2015 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java	Thu Jun 25 15:08:08 2015 +0200
@@ -46,14 +46,15 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
+        int bits = ((IntegerStamp) stamp()).getBits();
         if (forX.isConstant() && forY.isConstant()) {
-            long yConst = forY.asJavaConstant().asLong();
+            long yConst = CodeUtil.zeroExtend(forY.asJavaConstant().asLong(), bits);
             if (yConst == 0) {
                 return this; // this will trap, cannot canonicalize
             }
-            return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.remainder(forX.asJavaConstant().asLong(), yConst));
+            return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.remainder(CodeUtil.zeroExtend(forX.asJavaConstant().asLong(), bits), yConst));
         } else if (forY.isConstant()) {
-            long c = forY.asJavaConstant().asLong();
+            long c = CodeUtil.zeroExtend(forY.asJavaConstant().asLong(), bits);
             if (c == 1) {
                 return ConstantNode.forIntegerStamp(stamp(), 0);
             } else if (CodeUtil.isPowerOf2(c)) {