1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import java.util.concurrent.*;
18
19/**
20 * Test for Jit regressions.
21 */
22public class Main {
23    public static void main(String args[]) throws Exception {
24        b2296099Test();
25        b2302318Test();
26        b2487514Test();
27        b5884080Test();
28        zeroTest();
29    }
30
31    static void b2296099Test() throws Exception {
32       int x = -1190771042;
33       int dist = 360530809;
34       int xl = -1190771042;
35       int distl = 360530809;
36
37       for (int i = 0; i < 100000; i++) {
38           int b = rotateLeft(x, dist);
39           if (b != 1030884493)
40               throw new RuntimeException("Unexpected value: " + b
41                       + " after " + i + " iterations");
42       }
43       for (int i = 0; i < 100000; i++) {
44           long bl = rotateLeft(xl, distl);
45           if (bl != 1030884493)
46               throw new RuntimeException("Unexpected value: " + bl
47                       + " after " + i + " iterations");
48       }
49       System.out.println("b2296099 passes");
50   }
51
52    static int rotateLeft(int i, int distance) {
53        return ((i << distance) | (i >>> (-distance)));
54    }
55
56    static void b2302318Test() {
57        System.gc();
58
59        SpinThread slow = new SpinThread(Thread.MIN_PRIORITY);
60        SpinThread fast1 = new SpinThread(Thread.NORM_PRIORITY);
61        SpinThread fast2 = new SpinThread(Thread.MAX_PRIORITY);
62
63        slow.setDaemon(true);
64        fast1.setDaemon(true);
65        fast2.setDaemon(true);
66
67        fast2.start();
68        slow.start();
69        fast1.start();
70        try {
71            Thread.sleep(3000);
72        } catch (InterruptedException ie) {/*ignore */}
73        System.gc();
74
75        System.out.println("b2302318 passes");
76    }
77
78    static void b2487514Test() {
79        PriorityBlockingQueue q = new PriorityBlockingQueue(10);
80        int catchCount = 0;
81
82        q.offer(new Integer(0));
83        /*
84         * Warm up the code cache to have toArray() compiled. The key here is
85         * to pass a compatible type so that there are no exceptions when
86         * executing the method body (ie the APUT_OBJECT bytecode).
87         */
88        for (int i = 0; i < 1000; i++) {
89            Integer[] ints = (Integer[]) q.toArray(new Integer[5]);
90        }
91
92        /* Now pass an incompatible type which is guaranteed to throw */
93        for (int i = 0; i < 1000; i++) {
94            try {
95                Object[] obj = q.toArray(new String[5]);
96            }
97            catch (ArrayStoreException  success) {
98                catchCount++;
99            }
100        }
101
102        if (catchCount == 1000) {
103            System.out.println("b2487514 passes");
104        }
105        else {
106            System.out.println("b2487514 fails: catchCount is " + catchCount +
107                               " (expecting 1000)");
108        }
109    }
110
111    static void b5884080Test() {
112        int vA = 1;
113
114        int l = 0;
115        do {
116            int k = 0;
117            do
118                vA += 1;
119            while(++k < 100);
120        } while (++l < 1000);
121        if (vA == 100001) {
122            System.out.println("b5884080 passes");
123        }
124        else {
125            System.out.println("b5884080 fails: vA is " + vA +
126                               " (expecting 100001)");
127        }
128    }
129
130    static void zeroTest() throws Exception {
131        ZeroTests zt = new ZeroTests();
132        try {
133            zt.longDivTest();
134        } catch (Throwable th) {
135            th.printStackTrace();
136        }
137        try {
138            zt.longModTest();
139        } catch (Throwable th) {
140            th.printStackTrace();
141        }
142    }
143}
144
145class SpinThread extends Thread {
146    int mPriority;
147
148    SpinThread(int prio) {
149        super("Spin prio=" + prio);
150        mPriority = prio;
151    }
152
153    public void run() {
154        setPriority(mPriority);
155        while (true) {}
156    }
157}
158