blob: 13ef10305d58483ee9422300ddf1f83bff46b856 [file] [log] [blame]
// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ShiftExhaustiveTest extends TestBase {
private static final List<String> shiptOperations = ImmutableList.of(">>", ">>>", "<<");
private static final List<Integer> negativeShiftValuesForInt =
ImmutableList.of(0, -1, -2, -10, -20, -30, -31, -32);
private static final List<Integer> positiveShiftValuesForInt =
ImmutableList.of(0, 1, 2, 10, 20, 30, 31, 32);
private static final List<Integer> negativeShiftValuesForLong =
ImmutableList.of(0, -1, -2, -20, -40, -62, -63, -64);
private static final List<Integer> positiveShiftValuesForLong =
ImmutableList.of(0, 1, 2, 20, 40, 62, 63, 64);
private static final List<Integer> testValuesInt =
ImmutableList.of(
Integer.MIN_VALUE,
Integer.MIN_VALUE + 1,
-2,
-1,
0,
1,
2,
Integer.MAX_VALUE - 1,
Integer.MAX_VALUE);
private static final List<Long> testValuesLong =
ImmutableList.of(
Long.MIN_VALUE,
Long.MIN_VALUE + 1L,
-2L,
-1L,
0L,
1L,
2L,
Long.MAX_VALUE - 1,
Long.MAX_VALUE);
private static List<String> EXPECTED_RESULT;
@BeforeClass
public static void generateExpectedResult() {
List<String> result = new ArrayList<>();
for (int i : testValuesInt) {
generateTestResultsInt(i, result);
}
for (long l : testValuesLong) {
generateTestResultsLong(l, result);
}
EXPECTED_RESULT = result;
}
public static void generateTestResultsInt(int x, List<String> result) {
for (String op : shiptOperations) {
for (int f : negativeShiftValuesForInt) {
for (int s : positiveShiftValuesForInt) {
if (op.equals(">>")) {
result.add("" + (x >> f >> s));
}
if (op.equals(">>>")) {
result.add("" + (x >>> f >>> s));
}
if (op.equals("<<")) {
result.add("" + (x << f << s));
}
}
}
}
}
public static void generateTestResultsLong(long x, List<String> result) {
for (String op : shiptOperations) {
for (int f : negativeShiftValuesForLong) {
for (int s : positiveShiftValuesForLong) {
switch (op) {
case ">>":
result.add("" + (x >> f >> s));
break;
case ">>>":
result.add("" + (x >>> f >>> s));
break;
case "<<":
result.add("" + (x << f << s));
break;
}
}
}
}
}
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withCfRuntimes().withDexRuntimes().withAllApiLevels().build();
}
private final TestParameters parameters;
public ShiftExhaustiveTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void testJvm() throws Exception {
assumeTrue(parameters.isCfRuntime());
testForJvm(parameters)
.addProgramClasses(Main.class)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(EXPECTED_RESULT);
}
@Test
public void testD8() throws Exception {
testForRuntime(parameters)
.addProgramClasses(Main.class)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(EXPECTED_RESULT);
}
@Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
.addProgramClasses(Main.class)
.addKeepMainRule(Main.class)
.enableInliningAnnotations()
.setMinApi(parameters)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(EXPECTED_RESULT);
}
// Methods of Main class generated by outer class main method below.
public static class Main {
public static void main(String[] args) {
testInt(-2147483648);
testInt(-2147483647);
testInt(-2);
testInt(-1);
testInt(0);
testInt(1);
testInt(2);
testInt(2147483646);
testInt(2147483647);
testLong(-9223372036854775808L);
testLong(-9223372036854775807L);
testLong(-2L);
testLong(-1L);
testLong(0L);
testLong(1L);
testLong(2L);
testLong(9223372036854775806L);
testLong(9223372036854775807L);
}
@NeverInline
private static void testInt(int x) {
System.out.println(x >> 0 >> 0);
System.out.println(x >> 0 >> 1);
System.out.println(x >> 0 >> 2);
System.out.println(x >> 0 >> 10);
System.out.println(x >> 0 >> 20);
System.out.println(x >> 0 >> 30);
System.out.println(x >> 0 >> 31);
System.out.println(x >> 0 >> 32);
System.out.println(x >> -1 >> 0);
System.out.println(x >> -1 >> 1);
System.out.println(x >> -1 >> 2);
System.out.println(x >> -1 >> 10);
System.out.println(x >> -1 >> 20);
System.out.println(x >> -1 >> 30);
System.out.println(x >> -1 >> 31);
System.out.println(x >> -1 >> 32);
System.out.println(x >> -2 >> 0);
System.out.println(x >> -2 >> 1);
System.out.println(x >> -2 >> 2);
System.out.println(x >> -2 >> 10);
System.out.println(x >> -2 >> 20);
System.out.println(x >> -2 >> 30);
System.out.println(x >> -2 >> 31);
System.out.println(x >> -2 >> 32);
System.out.println(x >> -10 >> 0);
System.out.println(x >> -10 >> 1);
System.out.println(x >> -10 >> 2);
System.out.println(x >> -10 >> 10);
System.out.println(x >> -10 >> 20);
System.out.println(x >> -10 >> 30);
System.out.println(x >> -10 >> 31);
System.out.println(x >> -10 >> 32);
System.out.println(x >> -20 >> 0);
System.out.println(x >> -20 >> 1);
System.out.println(x >> -20 >> 2);
System.out.println(x >> -20 >> 10);
System.out.println(x >> -20 >> 20);
System.out.println(x >> -20 >> 30);
System.out.println(x >> -20 >> 31);
System.out.println(x >> -20 >> 32);
System.out.println(x >> -30 >> 0);
System.out.println(x >> -30 >> 1);
System.out.println(x >> -30 >> 2);
System.out.println(x >> -30 >> 10);
System.out.println(x >> -30 >> 20);
System.out.println(x >> -30 >> 30);
System.out.println(x >> -30 >> 31);
System.out.println(x >> -30 >> 32);
System.out.println(x >> -31 >> 0);
System.out.println(x >> -31 >> 1);
System.out.println(x >> -31 >> 2);
System.out.println(x >> -31 >> 10);
System.out.println(x >> -31 >> 20);
System.out.println(x >> -31 >> 30);
System.out.println(x >> -31 >> 31);
System.out.println(x >> -31 >> 32);
System.out.println(x >> -32 >> 0);
System.out.println(x >> -32 >> 1);
System.out.println(x >> -32 >> 2);
System.out.println(x >> -32 >> 10);
System.out.println(x >> -32 >> 20);
System.out.println(x >> -32 >> 30);
System.out.println(x >> -32 >> 31);
System.out.println(x >> -32 >> 32);
System.out.println(x >>> 0 >>> 0);
System.out.println(x >>> 0 >>> 1);
System.out.println(x >>> 0 >>> 2);
System.out.println(x >>> 0 >>> 10);
System.out.println(x >>> 0 >>> 20);
System.out.println(x >>> 0 >>> 30);
System.out.println(x >>> 0 >>> 31);
System.out.println(x >>> 0 >>> 32);
System.out.println(x >>> -1 >>> 0);
System.out.println(x >>> -1 >>> 1);
System.out.println(x >>> -1 >>> 2);
System.out.println(x >>> -1 >>> 10);
System.out.println(x >>> -1 >>> 20);
System.out.println(x >>> -1 >>> 30);
System.out.println(x >>> -1 >>> 31);
System.out.println(x >>> -1 >>> 32);
System.out.println(x >>> -2 >>> 0);
System.out.println(x >>> -2 >>> 1);
System.out.println(x >>> -2 >>> 2);
System.out.println(x >>> -2 >>> 10);
System.out.println(x >>> -2 >>> 20);
System.out.println(x >>> -2 >>> 30);
System.out.println(x >>> -2 >>> 31);
System.out.println(x >>> -2 >>> 32);
System.out.println(x >>> -10 >>> 0);
System.out.println(x >>> -10 >>> 1);
System.out.println(x >>> -10 >>> 2);
System.out.println(x >>> -10 >>> 10);
System.out.println(x >>> -10 >>> 20);
System.out.println(x >>> -10 >>> 30);
System.out.println(x >>> -10 >>> 31);
System.out.println(x >>> -10 >>> 32);
System.out.println(x >>> -20 >>> 0);
System.out.println(x >>> -20 >>> 1);
System.out.println(x >>> -20 >>> 2);
System.out.println(x >>> -20 >>> 10);
System.out.println(x >>> -20 >>> 20);
System.out.println(x >>> -20 >>> 30);
System.out.println(x >>> -20 >>> 31);
System.out.println(x >>> -20 >>> 32);
System.out.println(x >>> -30 >>> 0);
System.out.println(x >>> -30 >>> 1);
System.out.println(x >>> -30 >>> 2);
System.out.println(x >>> -30 >>> 10);
System.out.println(x >>> -30 >>> 20);
System.out.println(x >>> -30 >>> 30);
System.out.println(x >>> -30 >>> 31);
System.out.println(x >>> -30 >>> 32);
System.out.println(x >>> -31 >>> 0);
System.out.println(x >>> -31 >>> 1);
System.out.println(x >>> -31 >>> 2);
System.out.println(x >>> -31 >>> 10);
System.out.println(x >>> -31 >>> 20);
System.out.println(x >>> -31 >>> 30);
System.out.println(x >>> -31 >>> 31);
System.out.println(x >>> -31 >>> 32);
System.out.println(x >>> -32 >>> 0);
System.out.println(x >>> -32 >>> 1);
System.out.println(x >>> -32 >>> 2);
System.out.println(x >>> -32 >>> 10);
System.out.println(x >>> -32 >>> 20);
System.out.println(x >>> -32 >>> 30);
System.out.println(x >>> -32 >>> 31);
System.out.println(x >>> -32 >>> 32);
System.out.println(x << 0 << 0);
System.out.println(x << 0 << 1);
System.out.println(x << 0 << 2);
System.out.println(x << 0 << 10);
System.out.println(x << 0 << 20);
System.out.println(x << 0 << 30);
System.out.println(x << 0 << 31);
System.out.println(x << 0 << 32);
System.out.println(x << -1 << 0);
System.out.println(x << -1 << 1);
System.out.println(x << -1 << 2);
System.out.println(x << -1 << 10);
System.out.println(x << -1 << 20);
System.out.println(x << -1 << 30);
System.out.println(x << -1 << 31);
System.out.println(x << -1 << 32);
System.out.println(x << -2 << 0);
System.out.println(x << -2 << 1);
System.out.println(x << -2 << 2);
System.out.println(x << -2 << 10);
System.out.println(x << -2 << 20);
System.out.println(x << -2 << 30);
System.out.println(x << -2 << 31);
System.out.println(x << -2 << 32);
System.out.println(x << -10 << 0);
System.out.println(x << -10 << 1);
System.out.println(x << -10 << 2);
System.out.println(x << -10 << 10);
System.out.println(x << -10 << 20);
System.out.println(x << -10 << 30);
System.out.println(x << -10 << 31);
System.out.println(x << -10 << 32);
System.out.println(x << -20 << 0);
System.out.println(x << -20 << 1);
System.out.println(x << -20 << 2);
System.out.println(x << -20 << 10);
System.out.println(x << -20 << 20);
System.out.println(x << -20 << 30);
System.out.println(x << -20 << 31);
System.out.println(x << -20 << 32);
System.out.println(x << -30 << 0);
System.out.println(x << -30 << 1);
System.out.println(x << -30 << 2);
System.out.println(x << -30 << 10);
System.out.println(x << -30 << 20);
System.out.println(x << -30 << 30);
System.out.println(x << -30 << 31);
System.out.println(x << -30 << 32);
System.out.println(x << -31 << 0);
System.out.println(x << -31 << 1);
System.out.println(x << -31 << 2);
System.out.println(x << -31 << 10);
System.out.println(x << -31 << 20);
System.out.println(x << -31 << 30);
System.out.println(x << -31 << 31);
System.out.println(x << -31 << 32);
System.out.println(x << -32 << 0);
System.out.println(x << -32 << 1);
System.out.println(x << -32 << 2);
System.out.println(x << -32 << 10);
System.out.println(x << -32 << 20);
System.out.println(x << -32 << 30);
System.out.println(x << -32 << 31);
System.out.println(x << -32 << 32);
}
@NeverInline
private static void testLong(long x) {
System.out.println(x >> 0 >> 0);
System.out.println(x >> 0 >> 1);
System.out.println(x >> 0 >> 2);
System.out.println(x >> 0 >> 20);
System.out.println(x >> 0 >> 40);
System.out.println(x >> 0 >> 62);
System.out.println(x >> 0 >> 63);
System.out.println(x >> 0 >> 64);
System.out.println(x >> -1 >> 0);
System.out.println(x >> -1 >> 1);
System.out.println(x >> -1 >> 2);
System.out.println(x >> -1 >> 20);
System.out.println(x >> -1 >> 40);
System.out.println(x >> -1 >> 62);
System.out.println(x >> -1 >> 63);
System.out.println(x >> -1 >> 64);
System.out.println(x >> -2 >> 0);
System.out.println(x >> -2 >> 1);
System.out.println(x >> -2 >> 2);
System.out.println(x >> -2 >> 20);
System.out.println(x >> -2 >> 40);
System.out.println(x >> -2 >> 62);
System.out.println(x >> -2 >> 63);
System.out.println(x >> -2 >> 64);
System.out.println(x >> -20 >> 0);
System.out.println(x >> -20 >> 1);
System.out.println(x >> -20 >> 2);
System.out.println(x >> -20 >> 20);
System.out.println(x >> -20 >> 40);
System.out.println(x >> -20 >> 62);
System.out.println(x >> -20 >> 63);
System.out.println(x >> -20 >> 64);
System.out.println(x >> -40 >> 0);
System.out.println(x >> -40 >> 1);
System.out.println(x >> -40 >> 2);
System.out.println(x >> -40 >> 20);
System.out.println(x >> -40 >> 40);
System.out.println(x >> -40 >> 62);
System.out.println(x >> -40 >> 63);
System.out.println(x >> -40 >> 64);
System.out.println(x >> -62 >> 0);
System.out.println(x >> -62 >> 1);
System.out.println(x >> -62 >> 2);
System.out.println(x >> -62 >> 20);
System.out.println(x >> -62 >> 40);
System.out.println(x >> -62 >> 62);
System.out.println(x >> -62 >> 63);
System.out.println(x >> -62 >> 64);
System.out.println(x >> -63 >> 0);
System.out.println(x >> -63 >> 1);
System.out.println(x >> -63 >> 2);
System.out.println(x >> -63 >> 20);
System.out.println(x >> -63 >> 40);
System.out.println(x >> -63 >> 62);
System.out.println(x >> -63 >> 63);
System.out.println(x >> -63 >> 64);
System.out.println(x >> -64 >> 0);
System.out.println(x >> -64 >> 1);
System.out.println(x >> -64 >> 2);
System.out.println(x >> -64 >> 20);
System.out.println(x >> -64 >> 40);
System.out.println(x >> -64 >> 62);
System.out.println(x >> -64 >> 63);
System.out.println(x >> -64 >> 64);
System.out.println(x >>> 0 >>> 0);
System.out.println(x >>> 0 >>> 1);
System.out.println(x >>> 0 >>> 2);
System.out.println(x >>> 0 >>> 20);
System.out.println(x >>> 0 >>> 40);
System.out.println(x >>> 0 >>> 62);
System.out.println(x >>> 0 >>> 63);
System.out.println(x >>> 0 >>> 64);
System.out.println(x >>> -1 >>> 0);
System.out.println(x >>> -1 >>> 1);
System.out.println(x >>> -1 >>> 2);
System.out.println(x >>> -1 >>> 20);
System.out.println(x >>> -1 >>> 40);
System.out.println(x >>> -1 >>> 62);
System.out.println(x >>> -1 >>> 63);
System.out.println(x >>> -1 >>> 64);
System.out.println(x >>> -2 >>> 0);
System.out.println(x >>> -2 >>> 1);
System.out.println(x >>> -2 >>> 2);
System.out.println(x >>> -2 >>> 20);
System.out.println(x >>> -2 >>> 40);
System.out.println(x >>> -2 >>> 62);
System.out.println(x >>> -2 >>> 63);
System.out.println(x >>> -2 >>> 64);
System.out.println(x >>> -20 >>> 0);
System.out.println(x >>> -20 >>> 1);
System.out.println(x >>> -20 >>> 2);
System.out.println(x >>> -20 >>> 20);
System.out.println(x >>> -20 >>> 40);
System.out.println(x >>> -20 >>> 62);
System.out.println(x >>> -20 >>> 63);
System.out.println(x >>> -20 >>> 64);
System.out.println(x >>> -40 >>> 0);
System.out.println(x >>> -40 >>> 1);
System.out.println(x >>> -40 >>> 2);
System.out.println(x >>> -40 >>> 20);
System.out.println(x >>> -40 >>> 40);
System.out.println(x >>> -40 >>> 62);
System.out.println(x >>> -40 >>> 63);
System.out.println(x >>> -40 >>> 64);
System.out.println(x >>> -62 >>> 0);
System.out.println(x >>> -62 >>> 1);
System.out.println(x >>> -62 >>> 2);
System.out.println(x >>> -62 >>> 20);
System.out.println(x >>> -62 >>> 40);
System.out.println(x >>> -62 >>> 62);
System.out.println(x >>> -62 >>> 63);
System.out.println(x >>> -62 >>> 64);
System.out.println(x >>> -63 >>> 0);
System.out.println(x >>> -63 >>> 1);
System.out.println(x >>> -63 >>> 2);
System.out.println(x >>> -63 >>> 20);
System.out.println(x >>> -63 >>> 40);
System.out.println(x >>> -63 >>> 62);
System.out.println(x >>> -63 >>> 63);
System.out.println(x >>> -63 >>> 64);
System.out.println(x >>> -64 >>> 0);
System.out.println(x >>> -64 >>> 1);
System.out.println(x >>> -64 >>> 2);
System.out.println(x >>> -64 >>> 20);
System.out.println(x >>> -64 >>> 40);
System.out.println(x >>> -64 >>> 62);
System.out.println(x >>> -64 >>> 63);
System.out.println(x >>> -64 >>> 64);
System.out.println(x << 0 << 0);
System.out.println(x << 0 << 1);
System.out.println(x << 0 << 2);
System.out.println(x << 0 << 20);
System.out.println(x << 0 << 40);
System.out.println(x << 0 << 62);
System.out.println(x << 0 << 63);
System.out.println(x << 0 << 64);
System.out.println(x << -1 << 0);
System.out.println(x << -1 << 1);
System.out.println(x << -1 << 2);
System.out.println(x << -1 << 20);
System.out.println(x << -1 << 40);
System.out.println(x << -1 << 62);
System.out.println(x << -1 << 63);
System.out.println(x << -1 << 64);
System.out.println(x << -2 << 0);
System.out.println(x << -2 << 1);
System.out.println(x << -2 << 2);
System.out.println(x << -2 << 20);
System.out.println(x << -2 << 40);
System.out.println(x << -2 << 62);
System.out.println(x << -2 << 63);
System.out.println(x << -2 << 64);
System.out.println(x << -20 << 0);
System.out.println(x << -20 << 1);
System.out.println(x << -20 << 2);
System.out.println(x << -20 << 20);
System.out.println(x << -20 << 40);
System.out.println(x << -20 << 62);
System.out.println(x << -20 << 63);
System.out.println(x << -20 << 64);
System.out.println(x << -40 << 0);
System.out.println(x << -40 << 1);
System.out.println(x << -40 << 2);
System.out.println(x << -40 << 20);
System.out.println(x << -40 << 40);
System.out.println(x << -40 << 62);
System.out.println(x << -40 << 63);
System.out.println(x << -40 << 64);
System.out.println(x << -62 << 0);
System.out.println(x << -62 << 1);
System.out.println(x << -62 << 2);
System.out.println(x << -62 << 20);
System.out.println(x << -62 << 40);
System.out.println(x << -62 << 62);
System.out.println(x << -62 << 63);
System.out.println(x << -62 << 64);
System.out.println(x << -63 << 0);
System.out.println(x << -63 << 1);
System.out.println(x << -63 << 2);
System.out.println(x << -63 << 20);
System.out.println(x << -63 << 40);
System.out.println(x << -63 << 62);
System.out.println(x << -63 << 63);
System.out.println(x << -63 << 64);
System.out.println(x << -64 << 0);
System.out.println(x << -64 << 1);
System.out.println(x << -64 << 2);
System.out.println(x << -64 << 20);
System.out.println(x << -64 << 40);
System.out.println(x << -64 << 62);
System.out.println(x << -64 << 63);
System.out.println(x << -64 << 64);
}
}
private static void generateTestMain() {
System.out.println(" public static void main(String[] args) {");
for (int i : testValuesInt) {
System.out.println(" testInt(" + i + ");");
}
for (long l : testValuesLong) {
System.out.println(" testLong(" + l + "L);");
}
System.out.println(" }");
}
private static void generateTestSourceInt() {
System.out.println(" @NeverInline");
System.out.println(" private static void testInt(int x) {");
for (String op : shiptOperations) {
for (int f : negativeShiftValuesForInt) {
for (int s : positiveShiftValuesForInt) {
System.out.println(
" System.out.println(x " + op + " " + f + " " + op + " " + s + ");");
}
}
}
System.out.println(" }");
}
private static void generateTestSourceLong() {
System.out.println(" @NeverInline");
System.out.println(" private static void testLong(long x) {");
for (String op : shiptOperations) {
for (int f : negativeShiftValuesForLong) {
for (int s : positiveShiftValuesForLong) {
System.out.println(
" System.out.println(x " + op + " " + f + " " + op + " " + s + ");");
}
}
}
System.out.println(" }");
}
public static void main(String[] args) {
generateTestMain();
System.out.println();
generateTestSourceInt();
System.out.println();
generateTestSourceLong();
}
}