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();
+    }
+
+}