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