blob: 76f31518e1698f6f449836989f5bed5e07d2f0bb [file] [log] [blame]
/*
* Copyright (c) 2009, 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 org.graalvm.compiler.jtt.optimize;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import org.junit.Test;
import org.graalvm.compiler.jtt.JTTTest;
/*
* Tests optimization of switches.
*/
public class Switch02 extends JTTTest {
private static char staticCharVal = 0;
private static short staticShortVal = 0;
private static byte staticByteVal = 0;
public static int test(int arg) {
switch (arg) {
case 1:
return 2;
default:
return 1;
}
}
public static int test2char(char arg) {
int result = 392123;
Object x = null;
char val = staticCharVal != 0 ? staticCharVal : arg;
switch (val) {
case (char) 0xFFFF:
result = 23212 / val;
break;
case (char) 0xFFFF - 3:
result = 932991439 / val;
break;
case (char) 0xFFFF - 6:
result = 47329561 / val;
break;
case (char) 0xFFFF - 9:
result = 1950976984 / val;
break;
case (char) 0xFFFF - 10:
result = 97105581 / val;
switch (result) {
case 1:
result = 321;
break;
default:
result = 2391;
break;
}
break;
case (char) 0xFFFF - 12:
result = 99757362 / val;
break;
case (char) 0xFFFF - 15:
result = 912573 / val;
x = new LinkedList<>();
break;
case (char) 0xFFFF - 18:
x = new HashSet<>();
result = 876765 / val;
break;
case (char) 0xFFFF - 19:
result = 75442917 / val;
break;
case (char) 0xFFFF - 21:
result = 858112498 / val;
x = new HashMap<>();
break;
default:
result = 34324341 / val;
}
result = result + (x == null ? 0 : x.hashCode());
return result;
}
public static int test2short(short arg) {
int result = 392123;
Object x = null;
short val = staticShortVal != 0 ? staticShortVal : arg;
switch (val) {
case (short) -0x7FFF:
result = 23212 / val;
break;
case (short) -0x7FFF + 3:
result = 932991439 / val;
break;
case (short) -0x7FFF + 6:
result = 47329561 / val;
break;
case (short) -0x7FFF + 9:
result = 1950976984 / val;
break;
case (short) -0x7FFF + 10:
result = 97105581 / val;
switch (result) {
case 1:
result = 321;
break;
default:
result = 2391;
break;
}
break;
case (short) -0x7FFF + 12:
result = 99757362 / val;
break;
case (short) -0x7FFF + 15:
result = 912573 / val;
x = new LinkedList<>();
break;
case (short) -0x7FFF + 18:
x = new HashSet<>();
result = 876765 / val;
break;
case (short) -0x7FFF + 19:
result = 75442917 / val;
break;
case (short) -0x7FFF + 21:
result = 858112498 / val;
x = new HashMap<>();
break;
default:
result = 34324341 / val;
}
result = result + (x == null ? 0 : x.hashCode());
return result;
}
public static int test2byte(byte arg) {
int result = 392123;
Object x = null;
byte val = staticByteVal != 0 ? staticByteVal : arg;
switch (val) {
case (byte) -0x7F:
result = 23212 / val;
break;
case (byte) -0x7F + 3:
result = 932991439 / val;
break;
case (byte) -0x7F + 6:
result = 47329561 / val;
break;
case (byte) -0x7F + 9:
result = 1950976984 / val;
break;
case (byte) -0x7F + 10:
result = 97105581 / val;
switch (result) {
case 1:
result = 321;
break;
default:
result = 2391;
break;
}
break;
case (byte) -0x7F + 12:
result = 99757362 / val;
break;
case (byte) -0x7F + 15:
result = 912573 / val;
x = new LinkedList<>();
break;
case (byte) -0x7F + 18:
x = new HashSet<>();
result = 876765 / val;
break;
case (byte) -0x7F + 19:
result = 75442917 / val;
break;
case (byte) -0x7F + 20:
result = 856261268 / val;
break;
case (byte) -0x7F + 21:
result = 858112498 / val;
x = new HashMap<>();
break;
default:
result = 34324341 / val;
}
result = result + (x == null ? 0 : x.hashCode());
return result;
}
@Test
public void run0() throws Throwable {
runTest("test", 0);
}
@Test
public void run1() throws Throwable {
runTest("test", 1);
}
@Test
public void run2() throws Throwable {
runTest("test2char", (char) (0x0));
runTest("test2char", (char) (0xFFFF));
runTest("test2char", (char) (0xFFFF - 21)); // miss
runTest("test2char", (char) (0xFFFF - 22)); // hit
runTest("test2char", (char) (0xFFFF - 23)); // miss (out of bound)
staticCharVal = (char) 0xFFFF;
runTest("test2char", (char) 0);
staticCharVal = (char) (0xFFFF - 21);
runTest("test2char", (char) 0xFFFF);
staticCharVal = (char) (0xFFFF - 22);
runTest("test2char", (char) 0xFFFF);
staticCharVal = (char) (0xFFFF - 23);
runTest("test2char", (char) 0xFFFF);
}
@Test
public void run3() throws Throwable {
runTest("test2short", (short) 0x0);
runTest("test2short", (short) -0x7FFF);
runTest("test2short", (short) (-0x7FFF + 21)); // Miss
runTest("test2short", (short) (-0x7FFF + 22)); // hit
runTest("test2short", (short) (-0x7FFF + 23)); // miss (out of bound)
runTest("test2short", (short) 0x7FFF); // miss (out of bound)
staticShortVal = (short) -0x7FFF;
runTest("test2short", (short) 0);
staticShortVal = (short) (-0x7FFF + 21);
runTest("test2short", (short) 0);
staticShortVal = (short) (-0x7FFF + 22);
runTest("test2short", (short) 0);
staticShortVal = (short) (-0x7FFF + 23);
runTest("test2short", (short) 0);
staticShortVal = (short) 0x7FFF;
runTest("test2short", (short) 0);
}
@Test
public void run4() throws Throwable {
runTest("test2byte", (byte) 0);
runTest("test2byte", (byte) -0x7F);
runTest("test2byte", (byte) (-0x7F + 21)); // Miss
runTest("test2byte", (byte) (-0x7F + 22)); // hit
runTest("test2byte", (byte) (-0x7F + 23)); // miss (out of bound)
runTest("test2byte", (byte) 0x7F); // miss (out of bound)
staticByteVal = (byte) -0x7F;
runTest("test2short", (short) 0);
staticByteVal = (byte) (-0x7F + 21);
runTest("test2short", (short) 0);
staticByteVal = (byte) (-0x7F + 22);
runTest("test2short", (short) 0);
staticByteVal = (byte) (-0x7F + 23);
runTest("test2short", (short) 0);
staticByteVal = (byte) 0x7F;
runTest("test2short", (short) 0);
}
}