Revert "load store elimination."
Breaks libcore tests:
libcore.java.lang.ref.FinalizeTest#testWatchdogDoesNotFailForObjectsThatAreNearTheDeadline
libcore.java.util.ResourceLeakageDetectorTest#testDetectsUnclosedCloseGuard
org.apache.harmony.tests.java.lang.ref.ReferenceTest#test_finalizeReferenceInteraction
This reverts commit 589dac7f0ce078d19aad7e35bb0195c47ddf01d2.
Change-Id: I55115765c10762d5bc152d3425e4622560d8b9f4
diff --git a/test/530-checker-lse/expected.txt b/test/530-checker-lse/expected.txt
deleted file mode 100644
index e69de29..0000000
--- a/test/530-checker-lse/expected.txt
+++ /dev/null
diff --git a/test/530-checker-lse/info.txt b/test/530-checker-lse/info.txt
deleted file mode 100644
index 5b45e20..0000000
--- a/test/530-checker-lse/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-Checker test for testing load-store elimination.
diff --git a/test/530-checker-lse/src/Main.java b/test/530-checker-lse/src/Main.java
deleted file mode 100644
index e4b2d86..0000000
--- a/test/530-checker-lse/src/Main.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright (C) 2015 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.
- */
-
-class Circle {
- Circle(double radius) {
- this.radius = radius;
- }
- public double getArea() {
- return radius * radius * Math.PI;
- }
- private double radius;
-};
-
-class TestClass {
- TestClass() {
- }
- TestClass(int i, int j) {
- this.i = i;
- this.j = j;
- }
- int i;
- int j;
- volatile int k;
- TestClass next;
- static int si;
-};
-
-class SubTestClass extends TestClass {
- int k;
-};
-
-class TestClass2 {
- int i;
- int j;
-};
-
-public class Main {
-
- /// CHECK-START: double Main.calcCircleArea(double) load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: double Main.calcCircleArea(double) load_store_elimination (after)
- /// CHECK-NOT: NewInstance
- /// CHECK-NOT: InstanceFieldSet
- /// CHECK-NOT: InstanceFieldGet
-
- static double calcCircleArea(double radius) {
- return new Circle(radius).getArea();
- }
-
- /// CHECK-START: int Main.test1(TestClass, TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test1(TestClass, TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Different fields shouldn't alias.
- static int test1(TestClass obj1, TestClass obj2) {
- obj1.i = 1;
- obj2.j = 2;
- return obj1.i + obj2.j;
- }
-
- /// CHECK-START: int Main.test2(TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test2(TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldSet
- /// CHECK-NOT: InstanceFieldGet
-
- // Redundant store of the same value.
- static int test2(TestClass obj) {
- obj.j = 1;
- obj.j = 1;
- return obj.j;
- }
-
- /// CHECK-START: int Main.test3(TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldSet
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test3(TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NewInstance
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldSet
- /// CHECK-NOT: InstanceFieldGet
-
- // A new allocation shouldn't alias with pre-existing values.
- static int test3(TestClass obj) {
- obj.i = 1;
- obj.next.j = 2;
- TestClass obj2 = new TestClass();
- obj2.i = 3;
- obj2.j = 4;
- return obj.i + obj.next.j + obj2.i + obj2.j;
- }
-
- /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: Return
- /// CHECK: InstanceFieldSet
-
- /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
- /// CHECK: Return
- /// CHECK: InstanceFieldSet
-
- // Set and merge the same value in two branches.
- static int test4(TestClass obj, boolean b) {
- if (b) {
- obj.i = 1;
- } else {
- obj.i = 1;
- }
- return obj.i;
- }
-
- /// CHECK-START: int Main.test5(TestClass, boolean) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: Return
- /// CHECK: InstanceFieldSet
-
- /// CHECK-START: int Main.test5(TestClass, boolean) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: Return
- /// CHECK: InstanceFieldSet
-
- // Set and merge different values in two branches.
- static int test5(TestClass obj, boolean b) {
- if (b) {
- obj.i = 1;
- } else {
- obj.i = 2;
- }
- return obj.i;
- }
-
- /// CHECK-START: int Main.test6(TestClass, TestClass, boolean) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test6(TestClass, TestClass, boolean) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Setting the same value doesn't clear the value for aliased locations.
- static int test6(TestClass obj1, TestClass obj2, boolean b) {
- obj1.i = 1;
- obj1.j = 2;
- if (b) {
- obj2.j = 2;
- }
- return obj1.j + obj2.j;
- }
-
- /// CHECK-START: int Main.test7(TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test7(TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- // Invocation should kill values in non-singleton heap locations.
- static int test7(TestClass obj) {
- obj.i = 1;
- System.out.print("");
- return obj.i;
- }
-
- /// CHECK-START: int Main.test8() load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InvokeVirtual
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test8() load_store_elimination (after)
- /// CHECK-NOT: NewInstance
- /// CHECK-NOT: InstanceFieldSet
- /// CHECK: InvokeVirtual
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Invocation should not kill values in singleton heap locations.
- static int test8() {
- TestClass obj = new TestClass();
- obj.i = 1;
- System.out.print("");
- return obj.i;
- }
-
- /// CHECK-START: int Main.test9(TestClass) load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test9(TestClass) load_store_elimination (after)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- // Invocation should kill values in non-singleton heap locations.
- static int test9(TestClass obj) {
- TestClass obj2 = new TestClass();
- obj2.i = 1;
- obj.next = obj2;
- System.out.print("");
- return obj2.i;
- }
-
- /// CHECK-START: int Main.test10(TestClass) load_store_elimination (before)
- /// CHECK: StaticFieldGet
- /// CHECK: InstanceFieldGet
- /// CHECK: StaticFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test10(TestClass) load_store_elimination (after)
- /// CHECK: StaticFieldGet
- /// CHECK: InstanceFieldGet
- /// CHECK: StaticFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Static fields shouldn't alias with instance fields.
- static int test10(TestClass obj) {
- TestClass.si += obj.i;
- return obj.i;
- }
-
- /// CHECK-START: int Main.test11(TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test11(TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Loop without heap writes.
- // obj.i is actually hoisted to the loop pre-header by licm already.
- static int test11(TestClass obj) {
- obj.i = 1;
- int sum = 0;
- for (int i = 0; i < 10; i++) {
- sum += obj.i;
- }
- return sum;
- }
-
- /// CHECK-START: int Main.test12(TestClass, TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldSet
-
- /// CHECK-START: int Main.test12(TestClass, TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldSet
-
- // Loop with heap writes.
- static int test12(TestClass obj1, TestClass obj2) {
- obj1.i = 1;
- int sum = 0;
- for (int i = 0; i < 10; i++) {
- sum += obj1.i;
- obj2.i = sum;
- }
- return sum;
- }
-
- /// CHECK-START: int Main.test13(TestClass, TestClass2) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test13(TestClass, TestClass2) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK-NOT: NullCheck
- /// CHECK-NOT: InstanceFieldGet
-
- // Different classes shouldn't alias.
- static int test13(TestClass obj1, TestClass2 obj2) {
- obj1.i = 1;
- obj2.i = 2;
- return obj1.i + obj2.i;
- }
-
- /// CHECK-START: int Main.test14(TestClass, SubTestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test14(TestClass, SubTestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- // Subclass may alias with super class.
- static int test14(TestClass obj1, SubTestClass obj2) {
- obj1.i = 1;
- obj2.i = 2;
- return obj1.i;
- }
-
- /// CHECK-START: int Main.test15() load_store_elimination (before)
- /// CHECK: StaticFieldSet
- /// CHECK: StaticFieldSet
- /// CHECK: StaticFieldGet
-
- /// CHECK-START: int Main.test15() load_store_elimination (after)
- /// CHECK: <<Const2:i\d+>> IntConstant 2
- /// CHECK: StaticFieldSet
- /// CHECK: StaticFieldSet
- /// CHECK-NOT: StaticFieldGet
- /// CHECK: Return [<<Const2>>]
-
- // Static field access from subclass's name.
- static int test15() {
- TestClass.si = 1;
- SubTestClass.si = 2;
- return TestClass.si;
- }
-
- /// CHECK-START: int Main.test16() load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test16() load_store_elimination (after)
- /// CHECK-NOT: NewInstance
- /// CHECK-NOT: StaticFieldSet
- /// CHECK-NOT: StaticFieldGet
-
- // Test inlined constructor.
- static int test16() {
- TestClass obj = new TestClass(1, 2);
- return obj.i + obj.j;
- }
-
- /// CHECK-START: int Main.test17() load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test17() load_store_elimination (after)
- /// CHECK: <<Const0:i\d+>> IntConstant 0
- /// CHECK-NOT: NewInstance
- /// CHECK-NOT: StaticFieldSet
- /// CHECK-NOT: StaticFieldGet
- /// CHECK: Return [<<Const0>>]
-
- // Test getting default value.
- static int test17() {
- TestClass obj = new TestClass();
- obj.j = 1;
- return obj.i;
- }
-
- /// CHECK-START: int Main.test18(TestClass) load_store_elimination (before)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- /// CHECK-START: int Main.test18(TestClass) load_store_elimination (after)
- /// CHECK: InstanceFieldSet
- /// CHECK: InstanceFieldGet
-
- // Volatile field load/store shouldn't be eliminated.
- static int test18(TestClass obj) {
- obj.k = 1;
- return obj.k;
- }
-
- /// CHECK-START: float Main.test19(float[], float[]) load_store_elimination (before)
- /// CHECK: <<IntTypeValue:i\d+>> ArrayGet
- /// CHECK: ArraySet
- /// CHECK: <<FloatTypeValue:f\d+>> ArrayGet
-
- /// CHECK-START: float Main.test19(float[], float[]) load_store_elimination (after)
- /// CHECK: <<IntTypeValue:i\d+>> ArrayGet
- /// CHECK: ArraySet
- /// CHECK: <<FloatTypeValue:f\d+>> ArrayGet
-
- // I/F, J/D aliasing should keep the load/store.
- static float test19(float[] fa1, float[] fa2) {
- fa1[0] = fa2[0];
- return fa1[0];
- }
-
- /// CHECK-START: TestClass Main.test20() load_store_elimination (before)
- /// CHECK: NewInstance
- /// CHECK: InstanceFieldSet
-
- /// CHECK-START: TestClass Main.test20() load_store_elimination (after)
- /// CHECK: NewInstance
- /// CHECK-NOT: InstanceFieldSet
-
- // Storing default heap value is redundant if the heap location has the
- // default heap value.
- static TestClass test20() {
- TestClass obj = new TestClass();
- obj.i = 0;
- return obj;
- }
-
- public static void assertIntEquals(int expected, int result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
- }
- }
-
- public static void assertFloatEquals(float expected, float result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
- }
- }
-
- public static void assertDoubleEquals(double expected, double result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
- }
- }
-
- public static void main(String[] args) {
- assertDoubleEquals(Math.PI * Math.PI * Math.PI, calcCircleArea(Math.PI));
- assertIntEquals(test1(new TestClass(), new TestClass()), 3);
- assertIntEquals(test2(new TestClass()), 1);
- TestClass obj1 = new TestClass();
- TestClass obj2 = new TestClass();
- obj1.next = obj2;
- assertIntEquals(test3(obj1), 10);
- assertIntEquals(test4(new TestClass(), true), 1);
- assertIntEquals(test4(new TestClass(), false), 1);
- assertIntEquals(test5(new TestClass(), true), 1);
- assertIntEquals(test5(new TestClass(), false), 2);
- assertIntEquals(test6(new TestClass(), new TestClass(), true), 4);
- assertIntEquals(test6(new TestClass(), new TestClass(), false), 2);
- assertIntEquals(test7(new TestClass()), 1);
- assertIntEquals(test8(), 1);
- obj1 = new TestClass();
- obj2 = new TestClass();
- obj1.next = obj2;
- assertIntEquals(test9(new TestClass()), 1);
- assertIntEquals(test10(new TestClass(3, 4)), 3);
- assertIntEquals(TestClass.si, 3);
- assertIntEquals(test11(new TestClass()), 10);
- assertIntEquals(test12(new TestClass(), new TestClass()), 10);
- assertIntEquals(test13(new TestClass(), new TestClass2()), 3);
- SubTestClass obj3 = new SubTestClass();
- assertIntEquals(test14(obj3, obj3), 2);
- assertIntEquals(test15(), 2);
- assertIntEquals(test16(), 3);
- assertIntEquals(test17(), 0);
- assertIntEquals(test18(new TestClass()), 1);
- float[] fa1 = { 0.8f };
- float[] fa2 = { 1.8f };
- assertFloatEquals(test19(fa1, fa2), 1.8f);
- assertFloatEquals(test20().i, 0);
- }
-}
diff --git a/test/532-checker-nonnull-arrayset/src/Main.java b/test/532-checker-nonnull-arrayset/src/Main.java
index 2c701bb..7d8fff4 100644
--- a/test/532-checker-nonnull-arrayset/src/Main.java
+++ b/test/532-checker-nonnull-arrayset/src/Main.java
@@ -29,10 +29,10 @@
/// CHECK-NOT: test
/// CHECK: ReturnVoid
public static void test() {
- Object[] array = new Object[2];
+ Object[] array = new Object[1];
Object nonNull = array[0];
nonNull.getClass(); // Ensure nonNull has an implicit null check.
- array[1] = nonNull;
+ array[0] = nonNull;
}
public static void main(String[] args) {}