1 /* 2 * Copyright (c) 2013, 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 /** 26 * @test 27 * @bug 8023472 28 * @summary C2 optimization breaks with G1 29 * 30 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -Dcount=100000 G1CrashTest 31 * 32 * @author pbiswal@palantir.com 33 */ 34 35 public class G1CrashTest { 36 static Object[] set = new Object[11]; 37 main(String[] args)38 public static void main(String[] args) throws InterruptedException { 39 for (int j = 0; j < Integer.getInteger("count"); j++) { 40 Object key = new Object(); 41 insertKey(key); 42 if (j > set.length / 2) { 43 Object[] oldKeys = set; 44 set = new Object[2 * set.length - 1]; 45 for (Object o : oldKeys) { 46 if (o != null) 47 insertKey(o); 48 } 49 } 50 } 51 } 52 insertKey(Object key)53 static void insertKey(Object key) { 54 int hash = key.hashCode() & 0x7fffffff; 55 int index = hash % set.length; 56 Object cur = set[index]; 57 if (cur == null) 58 set[index] = key; 59 else 60 insertKeyRehash(key, index, hash, cur); 61 } 62 insertKeyRehash(Object key, int index, int hash, Object cur)63 static void insertKeyRehash(Object key, int index, int hash, Object cur) { 64 int loopIndex = index; 65 int firstRemoved = -1; 66 do { 67 if (cur == "dead") 68 firstRemoved = 1; 69 index--; 70 if (index < 0) 71 index += set.length; 72 cur = set[index]; 73 if (cur == null) { 74 if (firstRemoved != -1) 75 set[firstRemoved] = "dead"; 76 else 77 set[index] = key; 78 return; 79 } 80 } while (index != loopIndex); 81 if (firstRemoved != -1) 82 set[firstRemoved] = null; 83 } 84 } 85