diff options
author | Vladimir Marko <vmarko@google.com> | 2014-10-01 17:45:38 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-10-01 17:45:38 +0000 |
commit | 37241e5c70aa599ff7383ad18af5ddf5694a7144 (patch) | |
tree | 0b79d3fd2242746abb9af6c459e04c2a7a4bfe1b /test | |
parent | d25cee7088d03881265fe3d04c09ec2f798860f5 (diff) | |
parent | fa23645319cca1f1c4a7c208f931820f6783b1a4 (diff) | |
download | art-37241e5c70aa599ff7383ad18af5ddf5694a7144.zip art-37241e5c70aa599ff7383ad18af5ddf5694a7144.tar.gz art-37241e5c70aa599ff7383ad18af5ddf5694a7144.tar.bz2 |
Merge "Quick: Fix LVN/GVN handling of acquire operations."
Diffstat (limited to 'test')
-rw-r--r-- | test/123-compiler-regressions-mt/expected.txt | 2 | ||||
-rw-r--r-- | test/123-compiler-regressions-mt/info.txt | 6 | ||||
-rw-r--r-- | test/123-compiler-regressions-mt/src/Main.java | 117 |
3 files changed, 125 insertions, 0 deletions
diff --git a/test/123-compiler-regressions-mt/expected.txt b/test/123-compiler-regressions-mt/expected.txt new file mode 100644 index 0000000..a11e5bf --- /dev/null +++ b/test/123-compiler-regressions-mt/expected.txt @@ -0,0 +1,2 @@ +b17689750TestVolatile passed. +b17689750TestMonitor passed. diff --git a/test/123-compiler-regressions-mt/info.txt b/test/123-compiler-regressions-mt/info.txt new file mode 100644 index 0000000..cac7e75 --- /dev/null +++ b/test/123-compiler-regressions-mt/info.txt @@ -0,0 +1,6 @@ +This is a test for bad optimizations affecting multi-threaded program +behavior. + +This test covers fixed AOT/JIT bugs to prevent regressions. + +17689750 GVN assigns the same value names across MONITOR_ENTER and volatile reads. diff --git a/test/123-compiler-regressions-mt/src/Main.java b/test/123-compiler-regressions-mt/src/Main.java new file mode 100644 index 0000000..11fa021 --- /dev/null +++ b/test/123-compiler-regressions-mt/src/Main.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2009 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. + */ + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Test for Jit regressions. + */ +public class Main { + public static void main(String args[]) throws Exception { + b17689750TestVolatile(); + b17689750TestMonitor(); + } + + static void b17689750TestVolatile() { + final B17689750TestVolatile test = new B17689750TestVolatile(); + new Thread() { + public void run() { + test.thread1(); + } + }.start(); + try { + test.thread2(); + } catch (NullPointerException expected) { + System.out.println("b17689750TestVolatile passed."); + } + } + + static void b17689750TestMonitor() { + final B17689750TestMonitor test = new B17689750TestMonitor(); + new Thread() { + public void run() { + test.thread1(); + } + }.start(); + try { + test.thread2(); + } catch (NullPointerException expected) { + System.out.println("b17689750TestMonitor passed."); + } + } +} + +class B17689750TestVolatile { + private volatile int state = 0; + private int[] values = { 42 }; + + void thread1() { + while (state != 1) { } // Busy loop. + values = null; + state = 2; + } + + void thread2() { + int[] vs1 = values; + state = 1; + while (state != 2) { } // Busy loop. + int[] vs2 = values; + int v1 = vs1[0]; + int v2 = vs2[0]; + System.out.println("b17689750TestVolatile failed: " + v1 + ", " + v2); + } +} + +class B17689750TestMonitor { + private int state = 0; + private Object lock = new Object(); + private int[] values = { 42 }; + + void thread1() { + int s; + do { + synchronized (lock) { + s = state; + } + } while (s != 1); // Busy loop. + + synchronized (lock) { + values = null; + state = 2; + } + } + + void thread2() { + int[] vs1; + synchronized (lock) { + vs1 = values; + state = 1; + } + + int s; + do { + synchronized (lock) { + s = state; + } + } while (s != 2); // Busy loop. + + int[] vs2 = values; + int v1 = vs1[0]; + int v2 = vs2[0]; + System.out.println("b17689750TestMonitor failed: " + v1 + ", " + v2); + } +} |