1 /*
2  * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 
25 
26 package org.graalvm.compiler.core.test;
27 
28 import org.junit.Test;
29 
30 import org.graalvm.compiler.nodes.StructuredGraph;
31 import org.graalvm.compiler.nodes.java.NewArrayNode;
32 
33 public class ArrayCopyVirtualizationTest extends GraalCompilerTest {
34 
35     @Override
checkMidTierGraph(StructuredGraph graph)36     protected void checkMidTierGraph(StructuredGraph graph) {
37         assertTrue(graph.getNodes().filter(node -> node instanceof NewArrayNode).count() == 0, "shouldn't require allocation in %s", graph);
38         super.checkMidTierGraph(graph);
39     }
40 
byteCopyVirtualization()41     public byte byteCopyVirtualization() {
42         byte[] array = new byte[]{1, 2, 3, 4};
43         System.arraycopy(array, 1, array, 0, 3);
44         return array[0];
45     }
46 
shortCopyVirtualization()47     public short shortCopyVirtualization() {
48         short[] array = new short[]{1, 2, 3, 4};
49         System.arraycopy(array, 1, array, 0, 2);
50         return array[0];
51     }
52 
charCopyVirtualization()53     public char charCopyVirtualization() {
54         char[] array = new char[]{1, 2, 3, 4};
55         System.arraycopy(array, 1, array, 0, 3);
56         return array[0];
57     }
58 
intCopyVirtualization()59     public int intCopyVirtualization() {
60         int[] array = new int[]{1, 2, 3, 4};
61         System.arraycopy(array, 1, array, 0, 3);
62         return array[0];
63     }
64 
longCopyVirtualization()65     public long longCopyVirtualization() {
66         long[] array = new long[]{1, 2, 3, 4};
67         System.arraycopy(array, 1, array, 0, 3);
68         return array[0];
69     }
70 
floatCopyVirtualization()71     public float floatCopyVirtualization() {
72         float[] array = new float[]{1, 2, 3, 4};
73         System.arraycopy(array, 1, array, 0, 3);
74         return array[0];
75     }
76 
doubleCopyVirtualization()77     public double doubleCopyVirtualization() {
78         double[] array = new double[]{1, 2, 3, 4};
79         System.arraycopy(array, 1, array, 0, 3);
80         return array[0];
81     }
82 
objectCopyVirtualization()83     public Object objectCopyVirtualization() {
84         Object[] array = new Object[]{1, 2, 3, 4};
85         System.arraycopy(array, 1, array, 0, 3);
86         return array[0];
87     }
88 
89     @Test
testCopyVirtualization()90     public void testCopyVirtualization() {
91         test("byteCopyVirtualization");
92         test("shortCopyVirtualization");
93         test("charCopyVirtualization");
94         test("intCopyVirtualization");
95         test("longCopyVirtualization");
96         test("floatCopyVirtualization");
97         test("doubleCopyVirtualization");
98         test("objectCopyVirtualization");
99     }
100 
byteCopyBackwardsVirtualization()101     public byte byteCopyBackwardsVirtualization() {
102         byte[] array = new byte[]{1, 2, 3, 4};
103         System.arraycopy(array, 0, array, 1, 3);
104         return array[3];
105     }
106 
shortCopyBackwardsVirtualization()107     public short shortCopyBackwardsVirtualization() {
108         short[] array = new short[]{1, 2, 3, 4};
109         System.arraycopy(array, 0, array, 1, 3);
110         return array[3];
111     }
112 
charCopyBackwardsVirtualization()113     public char charCopyBackwardsVirtualization() {
114         char[] array = new char[]{1, 2, 3, 4};
115         System.arraycopy(array, 0, array, 1, 3);
116         return array[3];
117     }
118 
intCopyBackwardsVirtualization()119     public int intCopyBackwardsVirtualization() {
120         int[] array = new int[]{1, 2, 3, 4};
121         System.arraycopy(array, 0, array, 1, 3);
122         return array[3];
123     }
124 
longCopyBackwardsVirtualization()125     public long longCopyBackwardsVirtualization() {
126         long[] array = new long[]{1, 2, 3, 4};
127         System.arraycopy(array, 0, array, 1, 3);
128         return array[3];
129     }
130 
floatCopyBackwardsVirtualization()131     public float floatCopyBackwardsVirtualization() {
132         float[] array = new float[]{1, 2, 3, 4};
133         System.arraycopy(array, 0, array, 1, 3);
134         return array[3];
135     }
136 
doubleCopyBackwardsVirtualization()137     public double doubleCopyBackwardsVirtualization() {
138         double[] array = new double[]{1, 2, 3, 4};
139         System.arraycopy(array, 0, array, 1, 3);
140         return array[3];
141     }
142 
objectCopyBackwardsVirtualization()143     public Object objectCopyBackwardsVirtualization() {
144         Object[] array = new Object[]{1, 2, 3, 4};
145         System.arraycopy(array, 0, array, 1, 3);
146         return array[3];
147     }
148 
149     @Test
testCopyBackwardsVirtualization()150     public void testCopyBackwardsVirtualization() {
151         test("byteCopyBackwardsVirtualization");
152         test("shortCopyBackwardsVirtualization");
153         test("charCopyBackwardsVirtualization");
154         test("intCopyBackwardsVirtualization");
155         test("longCopyBackwardsVirtualization");
156         test("floatCopyBackwardsVirtualization");
157         test("doubleCopyBackwardsVirtualization");
158         test("objectCopyBackwardsVirtualization");
159     }
160 }
161