10e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee/*
20e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * Copyright (C) 2009 The Android Open Source Project
30e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee *
40e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * Licensed under the Apache License, Version 2.0 (the "License");
50e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * you may not use this file except in compliance with the License.
60e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * You may obtain a copy of the License at
70e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee *
80e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee *      http://www.apache.org/licenses/LICENSE-2.0
90e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee *
100e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * Unless required by applicable law or agreed to in writing, software
110e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * distributed under the License is distributed on an "AS IS" BASIS,
120e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * See the License for the specific language governing permissions and
140e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * limitations under the License.
150e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee */
160e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee
1760a6fa031b0e84b508b9795bc826a121e34d5e33Ben Chengimport java.util.concurrent.*;
1860a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng
190e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee/**
200e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee * Test for Jit regressions.
210e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee */
220e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbeepublic class Main {
230e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee    public static void main(String args[]) throws Exception {
240e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee        b2296099Test();
252ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        b2302318Test();
2660a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        b2487514Test();
27f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        b5884080Test();
28ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        zeroTest();
290e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee    }
300e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee
310e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee    static void b2296099Test() throws Exception {
320e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       int x = -1190771042;
330e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       int dist = 360530809;
340e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       int xl = -1190771042;
350e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       int distl = 360530809;
360e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee
370e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       for (int i = 0; i < 100000; i++) {
380e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee           int b = rotateLeft(x, dist);
390e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee           if (b != 1030884493)
400e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee               throw new RuntimeException("Unexpected value: " + b
410e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee                       + " after " + i + " iterations");
420e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       }
430e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       for (int i = 0; i < 100000; i++) {
440e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee           long bl = rotateLeft(xl, distl);
450e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee           if (bl != 1030884493)
460e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee               throw new RuntimeException("Unexpected value: " + bl
470e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee                       + " after " + i + " iterations");
480e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee       }
4960a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng       System.out.println("b2296099 passes");
500e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee   }
510e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee
522ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    static int rotateLeft(int i, int distance) {
532ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        return ((i << distance) | (i >>> (-distance)));
542ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    }
552ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
562ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    static void b2302318Test() {
572ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        System.gc();
582ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
592ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        SpinThread slow = new SpinThread(Thread.MIN_PRIORITY);
602ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        SpinThread fast1 = new SpinThread(Thread.NORM_PRIORITY);
612ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        SpinThread fast2 = new SpinThread(Thread.MAX_PRIORITY);
622ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
632ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        slow.setDaemon(true);
642ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        fast1.setDaemon(true);
652ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        fast2.setDaemon(true);
662ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
672ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        fast2.start();
682ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        slow.start();
692ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        fast1.start();
702ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        try {
712ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee            Thread.sleep(3000);
722ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        } catch (InterruptedException ie) {/*ignore */}
732ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        System.gc();
742ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
7511aa1bb56f84e83d49a4b9e7b2cb90fd9ab094b0Bill Buzbee        System.out.println("b2302318 passes");
762ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    }
7760a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng
7860a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng    static void b2487514Test() {
7960a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        PriorityBlockingQueue q = new PriorityBlockingQueue(10);
8060a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        int catchCount = 0;
8160a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng
8260a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        q.offer(new Integer(0));
8360a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        /*
8460a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng         * Warm up the code cache to have toArray() compiled. The key here is
8560a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng         * to pass a compatible type so that there are no exceptions when
8660a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng         * executing the method body (ie the APUT_OBJECT bytecode).
8760a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng         */
8860a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        for (int i = 0; i < 1000; i++) {
8960a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            Integer[] ints = (Integer[]) q.toArray(new Integer[5]);
9060a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        }
9160a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng
9260a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        /* Now pass an incompatible type which is guaranteed to throw */
9360a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        for (int i = 0; i < 1000; i++) {
9460a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            try {
9560a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng                Object[] obj = q.toArray(new String[5]);
9660a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            }
9760a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            catch (ArrayStoreException  success) {
9860a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng                catchCount++;
9960a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            }
10060a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        }
10160a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng
10260a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        if (catchCount == 1000) {
10360a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            System.out.println("b2487514 passes");
10460a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        }
10560a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        else {
10660a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng            System.out.println("b2487514 fails: catchCount is " + catchCount +
10760a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng                               " (expecting 1000)");
10860a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng        }
10960a6fa031b0e84b508b9795bc826a121e34d5e33Ben Cheng    }
110f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng
111f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng    static void b5884080Test() {
112f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        int vA = 1;
113f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng
114f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        int l = 0;
115ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        do {
116f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng            int k = 0;
117f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng            do
118f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng                vA += 1;
119f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng            while(++k < 100);
120ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        } while (++l < 1000);
121f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        if (vA == 100001) {
122f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng            System.out.println("b5884080 passes");
123f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        }
124f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        else {
125f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng            System.out.println("b5884080 fails: vA is " + vA +
126f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng                               " (expecting 100001)");
127f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng        }
128f36ff048fa354bcc7597a187002728106a8b9346Ben Cheng    }
129ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson
130ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson    static void zeroTest() throws Exception {
131ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        ZeroTests zt = new ZeroTests();
132ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        try {
133ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson            zt.longDivTest();
134ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        } catch (Throwable th) {
135ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson            th.printStackTrace();
136ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        }
137ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        try {
138ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson            zt.longModTest();
139ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        } catch (Throwable th) {
140ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson            th.printStackTrace();
141ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson        }
142ac3da004fe02e855e2444ce76abf13f12e2e0050Mattias Petersson    }
1432ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee}
1442ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
1452ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbeeclass SpinThread extends Thread {
1462ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    int mPriority;
1472ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
1482ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    SpinThread(int prio) {
1492ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        super("Spin prio=" + prio);
1502ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        mPriority = prio;
1512ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    }
1522ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee
1532ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    public void run() {
1542ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        setPriority(mPriority);
1552ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee        while (true) {}
1562ce8a6c8c11432338cf0cbca8f462e2cf7da1843Bill Buzbee    }
1570e605279abe713cb54cac3b8eec90d674b6766ceBill Buzbee}
158