1/*
2 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @bug 6891750
27 * @summary deopt blob kills values in O5
28 * @run main compiler.runtime.cr6891750.Test6891750
29 */
30
31package compiler.runtime.cr6891750;
32
33abstract class Base6891750 extends Thread {
34    abstract public long m();
35}
36class Other6891750 extends Base6891750 {
37    public long m() {
38        return 0;
39    }
40}
41
42public class Test6891750 extends Base6891750 {
43    Base6891750 d;
44    volatile long  value = 9;
45
46    static int limit = 400000;
47
48    Test6891750() {
49        d = this;
50
51    }
52    public long m() {
53        return value;
54    }
55
56    public long test(boolean doit) {
57        if (doit) {
58            long total0 = 0;
59            long total1 = 0;
60            long total2 = 0;
61            long total3 = 0;
62            long total4 = 0;
63            long total5 = 0;
64            long total6 = 0;
65            long total7 = 0;
66            long total8 = 0;
67            long total9 = 0;
68            for (int i = 0; i < limit; i++) {
69                total0 += d.m();
70                total1 += d.m();
71                total2 += d.m();
72                total3 += d.m();
73                total4 += d.m();
74                total5 += d.m();
75                total6 += d.m();
76                total7 += d.m();
77                total8 += d.m();
78                total9 += d.m();
79            }
80            return total0 + total1 + total2 + total3 + total4 + total5 + total6 + total7 + total8 + total9;
81        }
82        return 0;
83    }
84
85    public void run() {
86        long result = test(true);
87        for (int i = 0; i < 300; i++) {
88            long result2 = test(true);
89            if (result != result2) {
90                throw new InternalError(result + " != " + result2);
91            }
92        }
93    }
94
95    public static void main(String[] args) throws Exception {
96        Test6891750 Test6891750 = new Test6891750();
97        // warm it up
98        for (int i = 0; i < 200000; i++) {
99            Test6891750.test(false);
100        }
101        // set in off running
102        Test6891750.start();
103        Thread.sleep(2000);
104
105        // Load a class to invalidate CHA
106        new Other6891750();
107    }
108}
109