diff options
Diffstat (limited to 'test')
29 files changed, 518 insertions, 65 deletions
diff --git a/test/004-ReferenceMap/stack_walk_refmap_jni.cc b/test/004-ReferenceMap/stack_walk_refmap_jni.cc index e626e48be9..767e1de68f 100644 --- a/test/004-ReferenceMap/stack_walk_refmap_jni.cc +++ b/test/004-ReferenceMap/stack_walk_refmap_jni.cc @@ -29,10 +29,10 @@ namespace art { } while (false); struct ReferenceMap2Visitor : public CheckReferenceMapVisitor { - explicit ReferenceMap2Visitor(Thread* thread) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + explicit ReferenceMap2Visitor(Thread* thread) SHARED_REQUIRES(Locks::mutator_lock_) : CheckReferenceMapVisitor(thread) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { if (CheckReferenceMapVisitor::VisitFrame()) { return true; } diff --git a/test/004-StackWalk/stack_walk_jni.cc b/test/004-StackWalk/stack_walk_jni.cc index 6b155149a4..3a5854ba96 100644 --- a/test/004-StackWalk/stack_walk_jni.cc +++ b/test/004-StackWalk/stack_walk_jni.cc @@ -29,10 +29,10 @@ static int gJava_StackWalk_refmap_calls = 0; class TestReferenceMapVisitor : public CheckReferenceMapVisitor { public: - explicit TestReferenceMapVisitor(Thread* thread) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + explicit TestReferenceMapVisitor(Thread* thread) SHARED_REQUIRES(Locks::mutator_lock_) : CheckReferenceMapVisitor(thread) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { if (CheckReferenceMapVisitor::VisitFrame()) { return true; } diff --git a/test/046-reflect/expected.txt b/test/046-reflect/expected.txt index fa053fb92d..d657d44e61 100644 --- a/test/046-reflect/expected.txt +++ b/test/046-reflect/expected.txt @@ -24,7 +24,7 @@ Method name is myMethod SuperTarget constructor ()V Target constructor ()V Before, float is 3.1415925 -myMethod: hi there 3.1415925 Q ! +myMethod: hi there 3.1415925 ✔ ! Result of invoke: 7 Calling no-arg void-return method myNoargMethod ()V diff --git a/test/046-reflect/src/Main.java b/test/046-reflect/src/Main.java index 0d8e576086..0c90109c69 100644 --- a/test/046-reflect/src/Main.java +++ b/test/046-reflect/src/Main.java @@ -147,7 +147,7 @@ public class Main { Object[] argList = new Object[] { new String[] { "hi there" }, new Float(3.1415926f), - new Character('Q') + new Character('\u2714') }; System.out.println("Before, float is " + ((Float)argList[1]).floatValue()); diff --git a/test/051-thread/thread_test.cc b/test/051-thread/thread_test.cc index 2b8e675cc6..4215207c97 100644 --- a/test/051-thread/thread_test.cc +++ b/test/051-thread/thread_test.cc @@ -28,7 +28,7 @@ extern "C" JNIEXPORT jint JNICALL Java_Main_getNativePriority(JNIEnv* env, extern "C" JNIEXPORT jboolean JNICALL Java_Main_supportsThreadPriorities( JNIEnv* env ATTRIBUTE_UNUSED, jclass clazz ATTRIBUTE_UNUSED) { -#if defined(HAVE_ANDROID_OS) +#if defined(__ANDROID__) return JNI_TRUE; #else return JNI_FALSE; diff --git a/test/082-inline-execute/src/Main.java b/test/082-inline-execute/src/Main.java index 177c5a4700..77c1a99728 100644 --- a/test/082-inline-execute/src/Main.java +++ b/test/082-inline-execute/src/Main.java @@ -45,6 +45,8 @@ public class Main { test_Long_reverseBytes(); test_Integer_reverse(); test_Long_reverse(); + test_Integer_numberOfLeadingZeros(); + test_Long_numberOfLeadingZeros(); test_StrictMath_abs_I(); test_StrictMath_abs_J(); test_StrictMath_min_I(); @@ -1041,6 +1043,24 @@ public class Main { return (r1 / i1) + (r2 / i2) + i3 + i4 + i5 + i6 + i7 + i8; } + public static void test_Integer_numberOfLeadingZeros() { + Assert.assertEquals(Integer.numberOfLeadingZeros(0), Integer.SIZE); + for (int i = 0; i < Integer.SIZE; i++) { + Assert.assertEquals(Integer.numberOfLeadingZeros(1 << i), Integer.SIZE - 1 - i); + Assert.assertEquals(Integer.numberOfLeadingZeros((1 << i) | 1), Integer.SIZE - 1 - i); + Assert.assertEquals(Integer.numberOfLeadingZeros(0xFFFFFFFF >>> i), i); + } + } + + public static void test_Long_numberOfLeadingZeros() { + Assert.assertEquals(Long.numberOfLeadingZeros(0L), Long.SIZE); + for (int i = 0; i < Long.SIZE; i++) { + Assert.assertEquals(Long.numberOfLeadingZeros(1L << i), Long.SIZE - 1 - i); + Assert.assertEquals(Long.numberOfLeadingZeros((1L << i) | 1L), Long.SIZE - 1 - i); + Assert.assertEquals(Long.numberOfLeadingZeros(0xFFFFFFFFFFFFFFFFL >>> i), i); + } + } + static Object runtime; static Method address_of; static Method new_non_movable_array; diff --git a/test/100-reflect2/expected.txt b/test/100-reflect2/expected.txt index 7db61a1023..c932761c3b 100644 --- a/test/100-reflect2/expected.txt +++ b/test/100-reflect2/expected.txt @@ -1,6 +1,6 @@ true 8 -x +✔ 3.141592653589793 3.14 32 diff --git a/test/100-reflect2/src/Main.java b/test/100-reflect2/src/Main.java index 72e14b15f3..bf3a574c99 100644 --- a/test/100-reflect2/src/Main.java +++ b/test/100-reflect2/src/Main.java @@ -20,7 +20,7 @@ import java.util.*; class Main { private static boolean z = true; private static byte b = 8; - private static char c = 'x'; + private static char c = '\u2714'; private static double d = Math.PI; private static float f = 3.14f; private static int i = 32; @@ -144,7 +144,7 @@ class Main { /* private static boolean z = true; private static byte b = 8; - private static char c = 'x'; + private static char c = '\u2714'; private static double d = Math.PI; private static float f = 3.14f; private static int i = 32; @@ -263,7 +263,7 @@ class Main { show(ctor.newInstance((Object[]) null)); ctor = String.class.getConstructor(char[].class, int.class, int.class); - show(ctor.newInstance(new char[] { 'x', 'y', 'z', '!' }, 1, 2)); + show(ctor.newInstance(new char[] { '\u2714', 'y', 'z', '!' }, 1, 2)); } private static void testPackagePrivateConstructor() { diff --git a/test/109-suspend-check/src/Main.java b/test/109-suspend-check/src/Main.java index 8046d751ed..3c3353b4db 100644 --- a/test/109-suspend-check/src/Main.java +++ b/test/109-suspend-check/src/Main.java @@ -32,6 +32,8 @@ public class Main { new InfiniteWhileLoopWithSpecialPutOrNop(new SpecialMethods2()), new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods1()), new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods2()), + new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods1()), + new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods2()), }; doWhileLoopWithLong.start(); for (SimpleLoopThread loop : simpleLoops) { @@ -135,6 +137,21 @@ class InfiniteWhileLoopWithSpecialConstOrIGet extends SimpleLoopThread { } } +class InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch extends SimpleLoopThread { + private SpecialMethodInterface smi; + public InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(SpecialMethodInterface smi) { + this.smi = smi; + } + public void run() { + try { + long i = 0L; + while (keepGoing) { + i += smi.ConstOrIGet(); + } + } catch (Throwable ignored) { } + } +} + class InfiniteWhileLoopWithIntrinsic extends SimpleLoopThread { private String[] strings = { "a", "b", "c", "d" }; private int sum = 0; diff --git a/test/115-native-bridge/expected.txt b/test/115-native-bridge/expected.txt index 464d2c887e..372ecd0484 100644 --- a/test/115-native-bridge/expected.txt +++ b/test/115-native-bridge/expected.txt @@ -61,3 +61,4 @@ Getting trampoline for Java_Main_testNewStringObject with shorty V. trampoline_Java_Main_testNewStringObject called! Getting trampoline for Java_Main_testSignal with shorty I. NB signal handler with signal 11. +NB signal handler with signal 4. diff --git a/test/115-native-bridge/nativebridge.cc b/test/115-native-bridge/nativebridge.cc index c8141a7fb8..a6a6e08e26 100644 --- a/test/115-native-bridge/nativebridge.cc +++ b/test/115-native-bridge/nativebridge.cc @@ -200,8 +200,9 @@ static jint trampoline_Java_Main_testSignal(JNIEnv*, jclass) { #if !defined(__APPLE__) && !defined(__mips__) tmp.sa_restorer = nullptr; #endif - sigaction(SIGSEGV, &tmp, nullptr); + // Test segv + sigaction(SIGSEGV, &tmp, nullptr); #if defined(__arm__) || defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) // On supported architectures we cause a real SEGV. *go_away_compiler = 'a'; @@ -209,6 +210,11 @@ static jint trampoline_Java_Main_testSignal(JNIEnv*, jclass) { // On other architectures we simulate SEGV. kill(getpid(), SIGSEGV); #endif + + // Test sigill + sigaction(SIGILL, &tmp, nullptr); + kill(getpid(), SIGILL); + return 1234; } @@ -385,27 +391,29 @@ extern "C" bool nb_is_compatible(uint32_t bridge_version ATTRIBUTE_UNUSED) { // 004-SignalTest. static bool nb_signalhandler(int sig, siginfo_t* info ATTRIBUTE_UNUSED, void* context) { printf("NB signal handler with signal %d.\n", sig); + if (sig == SIGSEGV) { #if defined(__arm__) - struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); - struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext); - sc->arm_pc += 2; // Skip instruction causing segv. + struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); + struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext); + sc->arm_pc += 2; // Skip instruction causing segv & sigill. #elif defined(__aarch64__) - struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); - struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext); - sc->pc += 4; // Skip instruction causing segv. + struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); + struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext); + sc->pc += 4; // Skip instruction causing segv & sigill. #elif defined(__i386__) || defined(__x86_64__) - struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); - uc->CTX_EIP += 3; + struct ucontext *uc = reinterpret_cast<struct ucontext*>(context); + uc->CTX_EIP += 3; #else - UNUSED(context); + UNUSED(context); #endif + } // We handled this... return true; } static ::android::NativeBridgeSignalHandlerFn native_bridge_get_signal_handler(int signal) { - // Only test segfault handler. - if (signal == SIGSEGV) { + // Test segv for already claimed signal, and sigill for not claimed signal + if ((signal == SIGSEGV) || (signal == SIGILL)) { return &nb_signalhandler; } return nullptr; diff --git a/test/441-checker-inliner/src/Main.java b/test/441-checker-inliner/src/Main.java index 4db116a128..c108a900e2 100644 --- a/test/441-checker-inliner/src/Main.java +++ b/test/441-checker-inliner/src/Main.java @@ -157,6 +157,31 @@ public class Main { return x; } + /// CHECK-START: int Main.returnAbs(int) intrinsics_recognition (before) + /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect + /// CHECK-DAG: Return [<<Result>>] + + /// CHECK-START: int Main.returnAbs(int) intrinsics_recognition (after) + /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:MathAbsInt + /// CHECK-DAG: Return [<<Result>>] + + private static int returnAbs(int i) { + return Math.abs(i); + } + + /// CHECK-START: int Main.InlinedIntrinsicsAreStillIntrinsic() inliner (before) + /// CHECK-DAG: <<ConstMinus1:i\d+>> IntConstant -1 + /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect + /// CHECK-DAG: Return [<<Result>>] + + /// CHECK-START: int Main.InlinedIntrinsicsAreStillIntrinsic() inliner (after) + /// CHECK-DAG: <<ConstMinus1:i\d+>> IntConstant -1 + /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:MathAbsInt + /// CHECK-DAG: Return [<<Result>>] + + public static int InlinedIntrinsicsAreStillIntrinsic() { + return returnAbs(-1); + } private static void returnVoid() { return; @@ -238,5 +263,13 @@ public class Main { if (InlineWithControlFlow(false) != 2) { throw new Error(); } + + if (InlinedIntrinsicsAreStillIntrinsic() != 1) { + throw new Error(); + } + + if (returnAbs(-1) != 1) { + throw new Error(); + } } } diff --git a/test/449-checker-bce/expected.txt b/test/449-checker-bce/expected.txt index e69de29bb2..e114c50371 100644 --- a/test/449-checker-bce/expected.txt +++ b/test/449-checker-bce/expected.txt @@ -0,0 +1 @@ +java.lang.ArrayIndexOutOfBoundsException: length=5; index=82 diff --git a/test/449-checker-bce/src/Main.java b/test/449-checker-bce/src/Main.java index c4f7ddbeaf..a746664160 100644 --- a/test/449-checker-bce/src/Main.java +++ b/test/449-checker-bce/src/Main.java @@ -1101,6 +1101,28 @@ public class Main { } + public void testExceptionMessage() { + short[] B1 = new short[5]; + int[] B2 = new int[5]; + Exception err = null; + try { + testExceptionMessage1(B1, B2, null, -1, 6); + } catch (Exception e) { + err = e; + } + System.out.println(err); + } + + void testExceptionMessage1(short[] a1, int[] a2, long a3[], int start, int finish) { + int j = finish + 77; + // Bug: 22665511 + // A deoptimization will be triggered here right before the loop. Need to make + // sure the value of j is preserved for the interpreter. + for (int i = start; i <= finish; i++) { + a2[j - 1] = a1[i + 1]; + } + } + // Make sure this method is compiled with optimizing. /// CHECK-START: void Main.main(java.lang.String[]) register (after) /// CHECK: ParallelMove @@ -1141,6 +1163,7 @@ public class Main { }; testUnknownBounds(); + new Main().testExceptionMessage(); } } diff --git a/test/450-checker-types/src/Main.java b/test/450-checker-types/src/Main.java index 4e14b90fe3..251a53e456 100644 --- a/test/450-checker-types/src/Main.java +++ b/test/450-checker-types/src/Main.java @@ -483,6 +483,24 @@ public class Main { s.$noinline$f(); } + /// CHECK-START: java.lang.String Main.checkcastPreserveNullCheck(java.lang.Object) reference_type_propagation_after_inlining (after) + /// CHECK: <<This:l\d+>> ParameterValue + /// CHECK: <<Param:l\d+>> ParameterValue + /// CHECK: <<Clazz:l\d+>> LoadClass + /// CHECK: CheckCast [<<Param>>,<<Clazz>>] + /// CHECK: BoundType [<<Param>>] can_be_null:true + + /// CHECK-START: java.lang.String Main.checkcastPreserveNullCheck(java.lang.Object) instruction_simplifier_after_types (after) + /// CHECK: <<This:l\d+>> ParameterValue + /// CHECK: <<Param:l\d+>> ParameterValue + /// CHECK: <<Clazz:l\d+>> LoadClass + /// CHECK: CheckCast [<<Param>>,<<Clazz>>] + /// CHECK: <<Bound:l\d+>> BoundType [<<Param>>] + /// CHECK: NullCheck [<<Bound>>] + public String checkcastPreserveNullCheck(Object a) { + return ((SubclassA)a).toString(); + } + public static void main(String[] args) { } } diff --git a/test/454-get-vreg/get_vreg_jni.cc b/test/454-get-vreg/get_vreg_jni.cc index 33bdc200db..9facfdb076 100644 --- a/test/454-get-vreg/get_vreg_jni.cc +++ b/test/454-get-vreg/get_vreg_jni.cc @@ -28,12 +28,12 @@ namespace { class TestVisitor : public StackVisitor { public: TestVisitor(Thread* thread, Context* context, mirror::Object* this_value) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + SHARED_REQUIRES(Locks::mutator_lock_) : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames), this_value_(this_value), found_method_index_(0) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { ArtMethod* m = GetMethod(); std::string m_name(m->GetName()); diff --git a/test/455-set-vreg/set_vreg_jni.cc b/test/455-set-vreg/set_vreg_jni.cc index 754118935c..21149f67e8 100644 --- a/test/455-set-vreg/set_vreg_jni.cc +++ b/test/455-set-vreg/set_vreg_jni.cc @@ -28,11 +28,11 @@ namespace { class TestVisitor : public StackVisitor { public: TestVisitor(Thread* thread, Context* context, mirror::Object* this_value) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + SHARED_REQUIRES(Locks::mutator_lock_) : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames), this_value_(this_value) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { ArtMethod* m = GetMethod(); std::string m_name(m->GetName()); diff --git a/test/457-regs/regs_jni.cc b/test/457-regs/regs_jni.cc index 96f0e52995..c21168b81e 100644 --- a/test/457-regs/regs_jni.cc +++ b/test/457-regs/regs_jni.cc @@ -28,10 +28,10 @@ namespace { class TestVisitor : public StackVisitor { public: TestVisitor(Thread* thread, Context* context) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + SHARED_REQUIRES(Locks::mutator_lock_) : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { ArtMethod* m = GetMethod(); std::string m_name(m->GetName()); diff --git a/test/461-get-reference-vreg/get_reference_vreg_jni.cc b/test/461-get-reference-vreg/get_reference_vreg_jni.cc index 23fe43d906..8108c97f77 100644 --- a/test/461-get-reference-vreg/get_reference_vreg_jni.cc +++ b/test/461-get-reference-vreg/get_reference_vreg_jni.cc @@ -28,12 +28,12 @@ namespace { class TestVisitor : public StackVisitor { public: TestVisitor(Thread* thread, Context* context, mirror::Object* this_value) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + SHARED_REQUIRES(Locks::mutator_lock_) : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames), this_value_(this_value), found_method_index_(0) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { ArtMethod* m = GetMethod(); std::string m_name(m->GetName()); diff --git a/test/466-get-live-vreg/get_live_vreg_jni.cc b/test/466-get-live-vreg/get_live_vreg_jni.cc index c4f415b3f9..9b32fc397b 100644 --- a/test/466-get-live-vreg/get_live_vreg_jni.cc +++ b/test/466-get-live-vreg/get_live_vreg_jni.cc @@ -27,10 +27,10 @@ namespace { class TestVisitor : public StackVisitor { public: - TestVisitor(Thread* thread, Context* context) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + TestVisitor(Thread* thread, Context* context) SHARED_REQUIRES(Locks::mutator_lock_) : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames) {} - bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { ArtMethod* m = GetMethod(); std::string m_name(m->GetName()); diff --git a/test/484-checker-register-hints/src/Main.java b/test/484-checker-register-hints/src/Main.java index 3715ca2b14..6e68f7c91e 100644 --- a/test/484-checker-register-hints/src/Main.java +++ b/test/484-checker-register-hints/src/Main.java @@ -16,6 +16,14 @@ public class Main { + static class Foo { + int field0; + int field1; + int field2; + int field3; + int field4; + }; + /// CHECK-START: void Main.test1(boolean, int, int, int, int, int) register (after) /// CHECK: name "B0" /// CHECK-NOT: ParallelMove @@ -25,7 +33,7 @@ public class Main { /// CHECK-NOT: ParallelMove /// CHECK: name "B3" /// CHECK-NOT: end_block - /// CHECK: ArraySet + /// CHECK: InstanceFieldSet // We could check here that there is a parallel move, but it's only valid // for some architectures (for example x86), as other architectures may // not do move at all. @@ -36,19 +44,19 @@ public class Main { int e = live1; int f = live2; int g = live3; + int j = live0; if (z) { } else { // Create enough live instructions to force spilling on x86. int h = live4; int i = live5; - array[2] = e + i + h; - array[3] = f + i + h; - array[4] = g + i + h; - array[0] = h; - array[1] = i + h; - + foo.field2 = e + i + h; + foo.field3 = f + i + h; + foo.field4 = g + i + h; + foo.field0 = h; + foo.field1 = i + h; } - live1 = e + f + g; + live1 = e + f + g + j; } /// CHECK-START: void Main.test2(boolean, int, int, int, int, int) register (after) @@ -60,7 +68,7 @@ public class Main { /// CHECK-NOT: ParallelMove /// CHECK: name "B3" /// CHECK-NOT: end_block - /// CHECK: ArraySet + /// CHECK: InstanceFieldSet // We could check here that there is a parallel move, but it's only valid // for some architectures (for example x86), as other architectures may // not do move at all. @@ -71,18 +79,19 @@ public class Main { int e = live1; int f = live2; int g = live3; + int j = live0; if (z) { if (y) { int h = live4; int i = live5; - array[2] = e + i + h; - array[3] = f + i + h; - array[4] = g + i + h; - array[0] = h; - array[1] = i + h; + foo.field2 = e + i + h; + foo.field3 = f + i + h; + foo.field4 = g + i + h; + foo.field0 = h; + foo.field1 = i + h; } } - live1 = e + f + g; + live1 = e + f + g + j; } /// CHECK-START: void Main.test3(boolean, int, int, int, int, int) register (after) @@ -94,7 +103,7 @@ public class Main { /// CHECK-NOT: ParallelMove /// CHECK: name "B6" /// CHECK-NOT: end_block - /// CHECK: ArraySet + /// CHECK: InstanceFieldSet // We could check here that there is a parallel move, but it's only valid // for some architectures (for example x86), as other architectures may // not do move at all. @@ -107,6 +116,7 @@ public class Main { int e = live1; int f = live2; int g = live3; + int j = live0; if (z) { live1 = e; } else { @@ -115,24 +125,25 @@ public class Main { } else { int h = live4; int i = live5; - array[2] = e + i + h; - array[3] = f + i + h; - array[4] = g + i + h; - array[0] = h; - array[1] = i + h; + foo.field2 = e + i + h; + foo.field3 = f + i + h; + foo.field4 = g + i + h; + foo.field0 = h; + foo.field1 = i + h; } } - live1 = e + f + g; + live1 = e + f + g + j; } public static void main(String[] args) { } static boolean y; + static int live0; static int live1; static int live2; static int live3; static int live4; static int live5; - static int[] array; + static Foo foo; } diff --git a/test/525-arrays-and-fields/expected.txt b/test/525-checker-arrays-and-fields/expected.txt index e69de29bb2..e69de29bb2 100644 --- a/test/525-arrays-and-fields/expected.txt +++ b/test/525-checker-arrays-and-fields/expected.txt diff --git a/test/525-arrays-and-fields/info.txt b/test/525-checker-arrays-and-fields/info.txt index 3e16abf204..3e16abf204 100644 --- a/test/525-arrays-and-fields/info.txt +++ b/test/525-checker-arrays-and-fields/info.txt diff --git a/test/525-arrays-and-fields/src/Main.java b/test/525-checker-arrays-and-fields/src/Main.java index cb1e4afeab..a635a5157f 100644 --- a/test/525-arrays-and-fields/src/Main.java +++ b/test/525-checker-arrays-and-fields/src/Main.java @@ -80,56 +80,129 @@ public class Main { // // Loops on static arrays with invariant static field references. + // The checker is used to ensure hoisting occurred. // + /// CHECK-START: void Main.SInvLoopZ() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopZ() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopZ() { for (int i = 0; i < sArrZ.length; i++) { sArrZ[i] = sZ; } } + /// CHECK-START: void Main.SInvLoopB() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopB() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopB() { for (int i = 0; i < sArrB.length; i++) { sArrB[i] = sB; } } + /// CHECK-START: void Main.SInvLoopC() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopC() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopC() { for (int i = 0; i < sArrC.length; i++) { sArrC[i] = sC; } } + /// CHECK-START: void Main.SInvLoopS() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopS() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopS() { for (int i = 0; i < sArrS.length; i++) { sArrS[i] = sS; } } + /// CHECK-START: void Main.SInvLoopI() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopI() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopI() { for (int i = 0; i < sArrI.length; i++) { sArrI[i] = sI; } } + /// CHECK-START: void Main.SInvLoopJ() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopJ() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopJ() { for (int i = 0; i < sArrJ.length; i++) { sArrJ[i] = sJ; } } + /// CHECK-START: void Main.SInvLoopF() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopF() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopF() { for (int i = 0; i < sArrF.length; i++) { sArrF[i] = sF; } } + /// CHECK-START: void Main.SInvLoopD() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopD() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopD() { for (int i = 0; i < sArrD.length; i++) { sArrD[i] = sD; } } + /// CHECK-START: void Main.SInvLoopL() licm (before) + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.SInvLoopL() licm (after) + /// CHECK-DAG: StaticFieldGet loop:none + /// CHECK-DAG: StaticFieldGet loop:none + private static void SInvLoopL() { for (int i = 0; i < sArrL.length; i++) { sArrL[i] = sL; @@ -138,6 +211,7 @@ public class Main { // // Loops on static arrays with variant static field references. + // Incorrect hoisting is detected by incorrect outcome. // private static void SVarLoopZ() { @@ -214,56 +288,130 @@ public class Main { // // Loops on static arrays with a cross-over reference. + // Incorrect hoisting is detected by incorrect outcome. + // In addition, the checker is used to detect no hoisting. // + /// CHECK-START: void Main.SCrossOverLoopZ() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopZ() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopZ() { for (int i = 0; i < sArrZ.length; i++) { sArrZ[i] = !sArrZ[20]; } } + /// CHECK-START: void Main.SCrossOverLoopB() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopB() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopB() { for (int i = 0; i < sArrB.length; i++) { sArrB[i] = (byte)(sArrB[20] + 2); } } + /// CHECK-START: void Main.SCrossOverLoopC() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopC() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopC() { for (int i = 0; i < sArrC.length; i++) { sArrC[i] = (char)(sArrC[20] + 2); } } + /// CHECK-START: void Main.SCrossOverLoopS() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopS() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopS() { for (int i = 0; i < sArrS.length; i++) { sArrS[i] = (short)(sArrS[20] + 2); } } + /// CHECK-START: void Main.SCrossOverLoopI() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopI() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopI() { for (int i = 0; i < sArrI.length; i++) { sArrI[i] = sArrI[20] + 2; } } + /// CHECK-START: void Main.SCrossOverLoopJ() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopJ() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopJ() { for (int i = 0; i < sArrJ.length; i++) { sArrJ[i] = sArrJ[20] + 2; } } + /// CHECK-START: void Main.SCrossOverLoopF() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopF() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopF() { for (int i = 0; i < sArrF.length; i++) { sArrF[i] = sArrF[20] + 2; } } + /// CHECK-START: void Main.SCrossOverLoopD() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopD() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopD() { for (int i = 0; i < sArrD.length; i++) { sArrD[i] = sArrD[20] + 2; } } + /// CHECK-START: void Main.SCrossOverLoopL() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.SCrossOverLoopL() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private static void SCrossOverLoopL() { for (int i = 0; i < sArrL.length; i++) { sArrL[i] = (sArrL[20] == anObject) ? anotherObject : anObject; @@ -272,56 +420,129 @@ public class Main { // // Loops on instance arrays with invariant instance field references. + // The checker is used to ensure hoisting occurred. // + /// CHECK-START: void Main.InvLoopZ() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopZ() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopZ() { for (int i = 0; i < mArrZ.length; i++) { mArrZ[i] = mZ; } } + /// CHECK-START: void Main.InvLoopB() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopB() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopB() { for (int i = 0; i < mArrB.length; i++) { mArrB[i] = mB; } } + /// CHECK-START: void Main.InvLoopC() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopC() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopC() { for (int i = 0; i < mArrC.length; i++) { mArrC[i] = mC; } } + /// CHECK-START: void Main.InvLoopS() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopS() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopS() { for (int i = 0; i < mArrS.length; i++) { mArrS[i] = mS; } } + /// CHECK-START: void Main.InvLoopI() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopI() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopI() { for (int i = 0; i < mArrI.length; i++) { mArrI[i] = mI; } } + /// CHECK-START: void Main.InvLoopJ() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopJ() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopJ() { for (int i = 0; i < mArrJ.length; i++) { mArrJ[i] = mJ; } } + /// CHECK-START: void Main.InvLoopF() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopF() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopF() { for (int i = 0; i < mArrF.length; i++) { mArrF[i] = mF; } } + /// CHECK-START: void Main.InvLoopD() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopD() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopD() { for (int i = 0; i < mArrD.length; i++) { mArrD[i] = mD; } } + /// CHECK-START: void Main.InvLoopL() licm (before) + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} + + /// CHECK-START: void Main.InvLoopL() licm (after) + /// CHECK-DAG: InstanceFieldGet loop:none + /// CHECK-DAG: InstanceFieldGet loop:none + private void InvLoopL() { for (int i = 0; i < mArrL.length; i++) { mArrL[i] = mL; @@ -330,6 +551,7 @@ public class Main { // // Loops on instance arrays with variant instance field references. + // Incorrect hoisting is detected by incorrect outcome. // private void VarLoopZ() { @@ -406,56 +628,130 @@ public class Main { // // Loops on instance arrays with a cross-over reference. + // Incorrect hoisting is detected by incorrect outcome. + // In addition, the checker is used to detect no hoisting. // + /// CHECK-START: void Main.CrossOverLoopZ() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopZ() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopZ() { for (int i = 0; i < mArrZ.length; i++) { mArrZ[i] = !mArrZ[20]; } } + /// CHECK-START: void Main.CrossOverLoopB() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopB() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopB() { for (int i = 0; i < mArrB.length; i++) { mArrB[i] = (byte)(mArrB[20] + 2); } } + /// CHECK-START: void Main.CrossOverLoopC() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopC() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopC() { for (int i = 0; i < mArrC.length; i++) { mArrC[i] = (char)(mArrC[20] + 2); } } + /// CHECK-START: void Main.CrossOverLoopS() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopS() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopS() { for (int i = 0; i < mArrS.length; i++) { mArrS[i] = (short)(mArrS[20] + 2); } } + /// CHECK-START: void Main.CrossOverLoopI() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopI() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopI() { for (int i = 0; i < mArrI.length; i++) { mArrI[i] = mArrI[20] + 2; } } + /// CHECK-START: void Main.CrossOverLoopJ() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopJ() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopJ() { for (int i = 0; i < mArrJ.length; i++) { mArrJ[i] = mArrJ[20] + 2; } } + /// CHECK-START: void Main.CrossOverLoopF() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopF() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopF() { for (int i = 0; i < mArrF.length; i++) { mArrF[i] = mArrF[20] + 2; } } + /// CHECK-START: void Main.CrossOverLoopD() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopD() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopD() { for (int i = 0; i < mArrD.length; i++) { mArrD[i] = mArrD[20] + 2; } } + /// CHECK-START: void Main.CrossOverLoopL() licm (before) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + + /// CHECK-START: void Main.CrossOverLoopL() licm (after) + /// CHECK-DAG: ArrayGet loop:{{B\d+}} + /// CHECK-DAG: ArraySet loop:{{B\d+}} + private void CrossOverLoopL() { for (int i = 0; i < mArrL.length; i++) { mArrL[i] = (mArrL[20] == anObject) ? anotherObject : anObject; diff --git a/test/800-smali/expected.txt b/test/800-smali/expected.txt index fd9fcafbff..728ccea256 100644 --- a/test/800-smali/expected.txt +++ b/test/800-smali/expected.txt @@ -36,4 +36,5 @@ b/22411633 (2) b/22411633 (3) b/22411633 (4) b/22411633 (5) +b/22777307 Done! diff --git a/test/800-smali/smali/b_22777307.smali b/test/800-smali/smali/b_22777307.smali new file mode 100644 index 0000000000..6de3c703b5 --- /dev/null +++ b/test/800-smali/smali/b_22777307.smali @@ -0,0 +1,18 @@ +.class public LB22777307; +.super Ljava/lang/Object; + +# A static field. That way we can use the reference. +.field private static sTest:Ljava/lang/Object; + +.method public static run()V +.registers 2 + # This is a broken new-instance. It needs to throw at runtime, though. This test is here to + # ensure we won't produce a VerifyError. + # Cloneable was chosen because it's an already existing interface. + new-instance v0, Ljava/lang/Cloneable; + invoke-direct {v0}, Ljava/lang/Cloneable;-><init>()V + sput-object v0, LB22777307;->sTest:Ljava/lang/Object; + + return-void + +.end method diff --git a/test/800-smali/src/Main.java b/test/800-smali/src/Main.java index 8da2af4e84..438e21481c 100644 --- a/test/800-smali/src/Main.java +++ b/test/800-smali/src/Main.java @@ -119,6 +119,8 @@ public class Main { new VerifyError(), null)); testCases.add(new TestCase("b/22411633 (5)", "B22411633_5", "run", new Object[] { false }, null, null)); + testCases.add(new TestCase("b/22777307", "B22777307", "run", null, new InstantiationError(), + null)); } public void runTests() { diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 3d5c483a3b..3698bc8248 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -113,7 +113,7 @@ ifeq ($(ART_TEST_DEFAULT_COMPILER),true) COMPILER_TYPES += default endif ifeq ($(ART_TEST_INTERPRETER_ACCESS_CHECKS),true) - COMPILER_TYPES += interpreter-access-checks + COMPILER_TYPES += interp-ac endif ifeq ($(ART_TEST_INTERPRETER),true) COMPILER_TYPES += interpreter @@ -277,9 +277,9 @@ TEST_ART_BROKEN_INTERPRETER_ACCESS_CHECK_TESTS := \ 506-verify-aput \ 800-smali -ifneq (,$(filter interpreter-access-checks,$(COMPILER_TYPES))) +ifneq (,$(filter interp-ac,$(COMPILER_TYPES))) ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,$(TARGET_TYPES),$(RUN_TYPES),$(PREBUILD_TYPES), \ - interpreter-access-checks,$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES), \ + interp-ac,$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES), \ $(IMAGE_TYPES), $(PICTEST_TYPES), $(DEBUGGABLE_TYPES), $(TEST_ART_BROKEN_INTERPRETER_ACCESS_CHECK_TESTS), $(ALL_ADDRESS_SIZES)) endif @@ -629,7 +629,7 @@ endif # Create a rule to build and run a tests following the form: # test-art-{1: host or target}-run-test-{2: debug ndebug}-{3: prebuild no-prebuild no-dex2oat}- -# {4: interpreter default optimizing jit interpreter-access-checks}- +# {4: interpreter default optimizing jit interp-ac}- # {5: relocate nrelocate relocate-npatchoat}- # {6: trace or ntrace}-{7: gcstress gcverify cms}-{8: forcecopy checkjni jni}- # {9: no-image image picimage}-{10: pictest npictest}- @@ -700,7 +700,7 @@ define define-test-art-run-test ifeq ($(4),interpreter) test_groups += ART_RUN_TEST_$$(uc_host_or_target)_INTERPRETER_RULES run_test_options += --interpreter - else ifeq ($(4),interpreter-access-checks) + else ifeq ($(4),interp-ac) test_groups += ART_RUN_TEST_$$(uc_host_or_target)_INTERPRETER_ACCESS_CHECKS_RULES run_test_options += --interpreter --verify-soft-fail else diff --git a/test/run-test b/test/run-test index eabbab32a9..934329f4dc 100755 --- a/test/run-test +++ b/test/run-test @@ -264,7 +264,7 @@ while true; do shift elif [ "x$1" = "x--verify-soft-fail" ]; then run_args="${run_args} --verify-soft-fail" - image_suffix="-interpreter-access-checks" + image_suffix="-interp-ac" shift elif [ "x$1" = "x--no-optimize" ]; then run_args="${run_args} --no-optimize" @@ -621,9 +621,13 @@ if [[ "$TEST_NAME" =~ ^[0-9]+-checker- ]]; then USE_JACK="false" if [ "$runtime" = "art" -a "$image_suffix" = "-optimizing" -a "$target_mode" = "no" -a "$debuggable" = "no" ]; then - run_checker="yes" - run_args="${run_args} -Xcompiler-option --dump-cfg=$tmp_dir/$cfg_output \ - -Xcompiler-option -j1" + # In no-prebuild mode, the compiler is only invoked if both dex2oat and + # patchoat are available. Disable Checker otherwise (b/22552692). + if [ "$prebuild_mode" = "yes" ] || [ "$have_patchoat" = "yes" -a "$have_dex2oat" = "yes" ]; then + run_checker="yes" + run_args="${run_args} -Xcompiler-option --dump-cfg=$tmp_dir/$cfg_output \ + -Xcompiler-option -j1" + fi fi fi |