# HG changeset patch # User Doug Simon # Date 1402433778 -7200 # Node ID 2d296658a24ef675032b8f431014fa7fa44d5449 # Parent 06eedda53e1450b4548f1b5751bc5e4292af6215 HSAIL: enable arraycopy support in backend Contributed-by: Tom Deneau diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/EscapingNewStringConcatTest.java --- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/EscapingNewStringConcatTest.java Tue Jun 10 22:36:26 2014 +0200 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/EscapingNewStringConcatTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -50,8 +50,6 @@ myOutArray[gid] = inArray[(gid + NUM / 2) % NUM] + inArray[gid]; } - // Node implementing Lowerable not handled in HSAIL Backend: 6274|MonitorEnter - @Ignore @Test public void test() { try (DebugConfigScope s = disableIntercept()) { diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ArrayListGetTest.java --- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ArrayListGetTest.java Tue Jun 10 22:36:26 2014 +0200 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ArrayListGetTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -23,14 +23,11 @@ package com.oracle.graal.compiler.hsail.test.lambda; -import static com.oracle.graal.debug.Debug.*; - import java.util.*; import org.junit.*; import com.oracle.graal.compiler.hsail.test.infra.*; -import com.oracle.graal.debug.*; /** * Tests calling ArrayList.get(). @@ -58,13 +55,9 @@ }); } - // NYI emitForeignCall charAlignedDisjointArraycopy - @Test(expected = com.oracle.graal.compiler.common.GraalInternalError.class) - @Ignore + @Test public void testUsingLambdaMethod() { - try (DebugConfigScope s = disableIntercept()) { - testGeneratedHsailUsingLambdaMethod(); - } + testGeneratedHsailUsingLambdaMethod(); } } diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ArrayListSetTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ArrayListSetTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; +import java.util.*; + +/** + * Tests calling ArrayList.set(). + */ +public class ArrayListSetTest extends GraalKernelTester { + + final static int NUM = 50; + ArrayList aryList = new ArrayList<>(); + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + aryList.add(-1); + } + dispatchLambdaKernel(NUM, (gid) -> { + aryList.set(gid, gid); + }); + + for (int i = 0; i < NUM; i++) { + System.out.println(aryList.get(i)); + } + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ByteArrayCopyConjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ByteArrayCopyConjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a byte array where src and dest overlap. + */ +public class ByteArrayCopyConjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result byte[][] outArray = new byte[NUM][MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + for (int j = 0; j < outArray[i].length; j++) { + outArray[i][j] = (byte) (i + j); + } + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(outArray[gid], 0, outArray[gid], gid % NUM, NUM); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ByteArrayCopyDisjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ByteArrayCopyDisjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a byte array where src and dest do not overlap. + */ +public class ByteArrayCopyDisjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result byte[][] outArray = new byte[NUM][MAXOUTSIZ]; + byte[] inArray = new byte[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = (byte) i; + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/CharArrayCopyConjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/CharArrayCopyConjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a char array where src and dest overlap. + */ +public class CharArrayCopyConjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result char[][] outArray = new char[NUM][MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + for (int j = 0; j < outArray[i].length; j++) { + outArray[i][j] = (char) (i + j); + } + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(outArray[gid], 0, outArray[gid], gid % NUM, NUM); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/CharArrayCopyDisjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/CharArrayCopyDisjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a char array where src and dest do not overlap. + */ +public class CharArrayCopyDisjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result char[][] outArray = new char[NUM][MAXOUTSIZ]; + char[] inArray = new char[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = (char) i; + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/IntArrayCopyConjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/IntArrayCopyConjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a int array where src and dest overlap. + */ +public class IntArrayCopyConjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result int[][] outArray = new int[NUM][MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + for (int j = 0; j < outArray[i].length; j++) { + outArray[i][j] = i + j; + } + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(outArray[gid], 0, outArray[gid], gid % NUM, NUM); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/IntArrayCopyDisjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/IntArrayCopyDisjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a int array where src and dest do not overlap. + */ +public class IntArrayCopyDisjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result int[][] outArray = new int[NUM][MAXOUTSIZ]; + int[] inArray = new int[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = i; + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/LongArrayCopyConjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/LongArrayCopyConjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a long array where src and dest overlap. + */ +public class LongArrayCopyConjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result long[][] outArray = new long[NUM][MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + for (int j = 0; j < outArray[i].length; j++) { + outArray[i][j] = i + j; + } + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(outArray[gid], 0, outArray[gid], gid % NUM, NUM); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/LongArrayCopyDisjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/LongArrayCopyDisjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests copying a long array where src and dest do not overlap. + */ +public class LongArrayCopyDisjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result long[][] outArray = new long[NUM][MAXOUTSIZ]; + long[] inArray = new long[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = i; + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/NewStringEqualsTest.java --- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/NewStringEqualsTest.java Tue Jun 10 22:36:26 2014 +0200 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/NewStringEqualsTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -63,8 +63,6 @@ return (canHandleObjectAllocation()); } - // NYI emitForeignCall charAlignedDisjointArraycopy - @Ignore @Test public void test() { try (DebugConfigScope s = disableIntercept()) { @@ -72,7 +70,6 @@ } } - @Ignore @Test public void testUsingLambdaMethod() { try (DebugConfigScope s = disableIntercept()) { diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyConjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyConjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests {@link System#arraycopy} for object arrays where dest and src type are same, and overlap. + */ +public class ObjArrayCopyConjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result String[][] outArray = new String[NUM][MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + for (int j = 0; j < outArray[i].length; j++) { + outArray[i][j] = Integer.toString(i * 100 + j); + } + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(outArray[gid], 0, outArray[gid], gid % NUM, NUM); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyDisjointNonExactTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyDisjointNonExactTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests {@link System#arraycopy} for object arrays where dest is a superclass of src. + */ +public class ObjArrayCopyDisjointNonExactTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result Object[][] outArray = new Object[NUM][MAXOUTSIZ]; + String[] inArray = new String[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = Integer.toString(i * 1111); + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + // this fails because we do not have a pure java snippet for this case + // see ArrayCopySnippets.arrayCopy(Object, int, Object, int, int) + @Test(expected = com.oracle.graal.compiler.common.GraalInternalError.class) + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyDisjointTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/ObjArrayCopyDisjointTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests {@link System#arraycopy} for object arrays where dest and src type are same, no overlap. + */ +public class ObjArrayCopyDisjointTest extends GraalKernelTester { + + final static int MAXOUTSIZ = 100; + final static int NUM = 20; + + @Result String[][] outArray = new String[NUM][MAXOUTSIZ]; + String[] inArray = new String[NUM + MAXOUTSIZ]; + + @Override + public void runTest() { + for (int i = 0; i < inArray.length; i++) { + inArray[i] = Integer.toString(i * 1111); + } + dispatchLambdaKernel(NUM, (gid) -> { + System.arraycopy(inArray, gid, outArray[gid], 0, MAXOUTSIZ); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringBuilderTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringBuilderTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests creating a new String using StringBuilder (relies on {@link System#arraycopy}). + */ +public class StringBuilderTest extends GraalKernelTester { + + final static int NUM = 20; + StringBuilder[] builders = new StringBuilder[NUM]; + @Result String[] resultString = new String[NUM]; + + @Override + public void runTest() { + for (int i = 0; i < NUM; i++) { + builders[i] = new StringBuilder().append(i).append("abc"); + } + dispatchLambdaKernel(NUM, (gid) -> { + resultString[gid] = builders[gid].append(gid * 1234).toString(); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringSubsequenceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringSubsequenceTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests creating a new {@link CharSequence} using {@link String#subSequence(int, int)}. + */ +public class StringSubsequenceTest extends GraalKernelTester { + + final static int NUM = 50; + String inputString; + @Result CharSequence[] resultSequence = new String[NUM]; + + @Override + public void runTest() { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < NUM + 10; i++) { + builder.append(i); + } + inputString = builder.toString(); + dispatchLambdaKernel(NUM, (gid) -> { + resultSequence[gid] = inputString.subSequence(gid, gid + 10); + }); + + for (int i = 0; i < NUM; i++) { + System.out.println(resultSequence[i]); + } + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringSubstringTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/lambda/StringSubstringTest.java Tue Jun 10 22:56:18 2014 +0200 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, 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.compiler.hsail.test.lambda; + +import com.oracle.graal.compiler.hsail.test.infra.*; + +import org.junit.*; + +/** + * Tests creating a new String using {@link String#substring(int, int)}. + */ +public class StringSubstringTest extends GraalKernelTester { + + final static int NUM = 50; + String inputString; + @Result String[] resultString = new String[NUM]; + + @Override + public void runTest() { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < NUM + 10; i++) { + builder.append(i); + } + inputString = builder.toString(); + dispatchLambdaKernel(NUM, (gid) -> { + resultString[gid] = inputString.substring(gid, gid + 10); + }); + } + + @Test + public void testUsingLambdaMethod() { + testGeneratedHsailUsingLambdaMethod(); + } +} diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Tue Jun 10 22:36:26 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Tue Jun 10 22:56:18 2014 +0200 @@ -757,8 +757,8 @@ int numStackSlotBytes = 0; if (useHSAILDeoptimization) { /* - * Get the union of registers and stack slots needed to be saved at the infopoints. While - * doing this compute the highest register in each category. + * Get the union of registers and stack slots needed to be saved at the infopoints. + * While doing this compute the highest register in each category. */ HSAILHotSpotRegisterConfig hsailRegConfig = (HSAILHotSpotRegisterConfig) regConfig; Set infoUsedRegs = new TreeSet<>(); diff -r 06eedda53e14 -r 2d296658a24e graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotReplacementsImpl.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotReplacementsImpl.java Tue Jun 10 22:36:26 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotReplacementsImpl.java Tue Jun 10 22:56:18 2014 +0200 @@ -28,6 +28,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.replacements.*; +import com.oracle.graal.hotspot.replacements.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.phases.util.*; @@ -41,6 +42,7 @@ private final Replacements host; private HashSet ignoredResolvedMethods = new HashSet<>(); + private HashMap arrayCopyRedirectMethods = new HashMap<>(); public HSAILHotSpotReplacementsImpl(Providers providers, SnippetReflectionProvider snippetReflection, Assumptions assumptions, TargetDescription target, Replacements host) { super(providers, snippetReflection, assumptions, target); @@ -63,6 +65,28 @@ // Register the ignored substitutions addIgnoredResolvedMethod(String.class, "equals", Object.class); + + /* + * Register the special arraycopy snippet handling This basically ignores the sense of the + * CallArrayCopy flag and always directs to the snippets from UnsafeArrayCopyNode + */ + redirectArraycopySnippetMethod(Kind.Byte); + redirectArraycopySnippetMethod(Kind.Boolean); + redirectArraycopySnippetMethod(Kind.Char); + redirectArraycopySnippetMethod(Kind.Short); + redirectArraycopySnippetMethod(Kind.Int); + redirectArraycopySnippetMethod(Kind.Long); + redirectArraycopySnippetMethod(Kind.Float); + redirectArraycopySnippetMethod(Kind.Double); + redirectArraycopySnippetMethod(Kind.Object); + } + + private void redirectArraycopySnippetMethod(Kind kind) { + ResolvedJavaMethod foreignCallMethod = providers.getMetaAccess().lookupJavaMethod(ArrayCopySnippets.getSnippetForKind(kind, false, true)); + ResolvedJavaMethod nonForeignCallMethod = providers.getMetaAccess().lookupJavaMethod(ArrayCopySnippets.getSnippetForKind(kind, false, false)); + if (!foreignCallMethod.equals(nonForeignCallMethod)) { + arrayCopyRedirectMethods.put(foreignCallMethod, nonForeignCallMethod); + } } @Override @@ -75,25 +99,42 @@ public Class getMacroSubstitution(ResolvedJavaMethod method) { Class klass = super.getMacroSubstitution(method); if (klass == null) { - // eventually we want to only defer certain macro substitutions to the host, but for now - // we will do everything + /* + * Eventually we want to only defer certain macro substitutions to the host, but for now + * we will do everything. + */ return host.getMacroSubstitution(method); } return klass; } @Override - public StructuredGraph getSnippet(ResolvedJavaMethod method) { - // Must work in cooperation with HSAILHotSpotLoweringProvider - return host.getSnippet(method); + public StructuredGraph getSnippet(ResolvedJavaMethod method, ResolvedJavaMethod recursiveEntry) { + /* + * Must work in cooperation with HSAILHotSpotLoweringProvider. Before asking for the host + * snippet, see if it is one of the arraycopy methods which we want to redirect to the + * non-foreign-call version, regardless of the sense of CallArrayCopy option + */ + ResolvedJavaMethod snippetMethod = method; + ResolvedJavaMethod snippetRecursiveEntry = recursiveEntry; + ResolvedJavaMethod redirect = arrayCopyRedirectMethods.get(method); + if (redirect != null) { + snippetMethod = redirect; + if (recursiveEntry != null && recursiveEntry.equals(method)) { + snippetRecursiveEntry = redirect; + } + } + return host.getSnippet(snippetMethod, snippetRecursiveEntry); } @Override public StructuredGraph getMethodSubstitution(ResolvedJavaMethod original) { StructuredGraph m = super.getMethodSubstitution(original); if (m == null) { - // we check for a few special cases we do NOT want to defer here - // but basically we defer everything else to the host + /* + * We check for a few special cases we do NOT want to defer here but basically we defer + * everything else to the host. + */ if (ignoredResolvedMethods.contains(original)) { return null; } else { @@ -102,5 +143,4 @@ } return m; } - }