Test for loop optimization
This test case tests whether constant calculation is sunk
of the loop
Test: ./test.py --host
Change-Id: I33ad79d21515e69bd469f6b18dd77dd515614713
Signed-off-by: anuvarsh <anuvarshini.bc@intel.com>
diff --git a/test/2019-constantcalculationsinking/expected.txt b/test/2019-constantcalculationsinking/expected.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/2019-constantcalculationsinking/expected.txt
diff --git a/test/2019-constantcalculationsinking/info.txt b/test/2019-constantcalculationsinking/info.txt
new file mode 100644
index 0000000..9092d95
--- /dev/null
+++ b/test/2019-constantcalculationsinking/info.txt
@@ -0,0 +1 @@
+Tests for Constant calculation sinking
diff --git a/test/2019-constantcalculationsinking/src/Main.java b/test/2019-constantcalculationsinking/src/Main.java
new file mode 100644
index 0000000..6cef77a
--- /dev/null
+++ b/test/2019-constantcalculationsinking/src/Main.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ *
+ * L: Break operator doesn't break one basic block limitation for int,
+ * for some reasons (most probably not a bug), there are two basic blocks for long type,
+ * 1 sinking expected for int, 0 for long.
+ * M: no limitations on basic blocks number, 1 constant calculation sinking expected for
+ * each method
+ *
+ **/
+
+public class Main {
+
+ final int iterations = 1100;
+
+ public static void assertIntEquals(int expected, int result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
+
+ public static void assertLongEquals(long expected, long result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
+
+
+ public int testLoopAddInt() {
+ int testVar = 10000;
+ int additionalVar = 10;
+
+ outer:
+ for (int i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (int k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar += 5;
+ continue outer;
+ }
+ }
+ assertIntEquals(testVar + additionalVar, 619960);
+ return testVar + additionalVar;
+ }
+
+ public int testLoopSubInt() {
+ int testVar = 10000;
+ int additionalVar = 10;
+
+ outer:
+ for (int i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (int k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar -= 5;
+ continue outer;
+ }
+ }
+ assertIntEquals(testVar + additionalVar, 608960);
+ return testVar + additionalVar;
+ }
+
+ public long testLoopSubLong() {
+ long testVar = 10000;
+ long additionalVar = 10;
+
+ outer:
+ for (long i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (long k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar -= 5;
+ continue outer;
+ }
+ }
+ assertLongEquals(testVar + additionalVar, 608960);
+ return testVar + additionalVar;
+ }
+
+ public int testLoopMulInt(int n) {
+ int testVar = 1;
+ int additionalVar = 10;
+
+ outer:
+ for (int i = 0; i < 3; i++) {
+ additionalVar += i + n * 2;
+ for (int k = 0; k < 5; k++) {
+ additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5
+ + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2;
+ testVar *= 6;
+ continue outer;
+ }
+ }
+ assertIntEquals(testVar + additionalVar, 324);
+ return testVar + additionalVar;
+ }
+
+ public long testLoopMulLong(long n) {
+ long testVar = 1;
+ long additionalVar = 10;
+
+ outer:
+ for (long i = 0; i < 5; i++) {
+ additionalVar += i + n;
+ for (long k = 0; k < 5; k++) {
+ additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5
+ + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2;
+ testVar *= 6L;
+ continue outer;
+ }
+ }
+ assertLongEquals(testVar + additionalVar, 7897);
+ return testVar + additionalVar;
+ }
+
+ public int testLoopDivInt() {
+ int testVar = 10000;
+ int additionalVar = 10;
+
+ outer:
+ for (int i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (int k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar /= 5;
+ continue outer;
+ }
+ }
+ assertIntEquals(testVar + additionalVar, 604460);
+ return testVar + additionalVar;
+ }
+
+ public long testLoopDivLong() {
+ long testVar = 10000;
+ long additionalVar = 10;
+
+ outer:
+ for (long i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (long k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar /= 5;
+ continue outer;
+ }
+ }
+ assertLongEquals(testVar + additionalVar, 604460);
+ return testVar + additionalVar;
+ }
+
+ public int testLoopRemInt() {
+ int testVar = 10000;
+ int additionalVar = 10;
+
+ outer:
+ for (int i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (int k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar %= 5;
+ continue outer;
+ }
+ }
+ assertIntEquals(testVar + additionalVar, 604460);
+ return testVar + additionalVar;
+ }
+
+ public long testLoopRemLong() {
+ long testVar = 10000;
+ long additionalVar = 10;
+
+ outer:
+ for (long i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (long k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar %= 5;
+ continue outer;
+ }
+ }
+ assertLongEquals(testVar + additionalVar, 604460);
+ return testVar + additionalVar;
+ }
+
+ public long testLoopAddLong() {
+ long testVar = 10000;
+ long additionalVar = 10;
+
+ outer:
+ for (long i = 0; i < iterations; i++) {
+ additionalVar += i;
+ for (long k = 0; k < iterations; k++) {
+ additionalVar += k;
+ testVar += 5;
+ continue outer;
+ }
+ }
+ assertLongEquals(testVar + additionalVar, 619960);
+ return testVar + additionalVar;
+ }
+
+ public static void main(String[] args) {
+ Main obj = new Main();
+ obj.testLoopAddInt();
+ obj.testLoopAddLong();
+ obj.testLoopRemLong();
+ obj.testLoopRemInt();
+ obj.testLoopDivLong();
+ obj.testLoopDivInt();
+ obj.testLoopMulLong(10);
+ obj.testLoopMulInt(10);
+ obj.testLoopSubLong();
+ obj.testLoopSubInt();
+ }
+
+}