test/compiler/6843752/Test.java

Mon, 28 Jul 2014 15:06:38 -0700

author
fzhinkin
date
Mon, 28 Jul 2014 15:06:38 -0700
changeset 6997
dbb05f6d93c4
parent 1907
c18cbe5936b8
child 6876
710a3c8b516e
permissions
-rw-r--r--

8051344: JVM crashed in Compile::start() during method parsing w/ UseRTMDeopt turned on
Summary: call rtm_deopt() only if there were no compilation bailouts before.
Reviewed-by: kvn

kvn@1223 1 /*
trims@1907 2 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
kvn@1223 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
kvn@1223 4 *
kvn@1223 5 * This code is free software; you can redistribute it and/or modify it
kvn@1223 6 * under the terms of the GNU General Public License version 2 only, as
kvn@1223 7 * published by the Free Software Foundation.
kvn@1223 8 *
kvn@1223 9 * This code is distributed in the hope that it will be useful, but WITHOUT
kvn@1223 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kvn@1223 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kvn@1223 12 * version 2 for more details (a copy is included in the LICENSE file that
kvn@1223 13 * accompanied this code).
kvn@1223 14 *
kvn@1223 15 * You should have received a copy of the GNU General Public License version
kvn@1223 16 * 2 along with this work; if not, write to the Free Software Foundation,
kvn@1223 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
kvn@1223 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
kvn@1223 22 */
kvn@1223 23
kvn@1223 24 /*
kvn@1223 25 * @test
kvn@1223 26 * @bug 6843752
kvn@1223 27 * @summary missing code for an anti-dependent Phi in GCM
kvn@1223 28 * @run main/othervm -Xbatch Test
kvn@1223 29 */
kvn@1223 30
kvn@1223 31 public class Test {
kvn@1223 32
kvn@1223 33 Item list;
kvn@1223 34
kvn@1223 35 static class Item {
kvn@1223 36 public Item next;
kvn@1223 37 public Item prev;
kvn@1223 38 public boolean remove;
kvn@1223 39
kvn@1223 40 Item(boolean r) { remove = r; }
kvn@1223 41 }
kvn@1223 42
kvn@1223 43 private void linkIn(Item item) {
kvn@1223 44 Item head = list;
kvn@1223 45 if (head == null) {
kvn@1223 46 item.next = item;
kvn@1223 47 item.prev = item;
kvn@1223 48 list = item;
kvn@1223 49 } else {
kvn@1223 50 item.next = head;
kvn@1223 51 item.prev = head.prev;
kvn@1223 52 head.prev.next = item;
kvn@1223 53 head.prev = item;
kvn@1223 54 }
kvn@1223 55 }
kvn@1223 56
kvn@1223 57 private void linkOut(Item item) {
kvn@1223 58 Item head = list;
kvn@1223 59 if (item.next == item) {
kvn@1223 60 list = null;
kvn@1223 61 } else {
kvn@1223 62 item.prev.next = item.next;
kvn@1223 63 item.next.prev = item.prev;
kvn@1223 64 if (head == item) {
kvn@1223 65 list = item.next;
kvn@1223 66 }
kvn@1223 67 }
kvn@1223 68 item.next = null;
kvn@1223 69 item.prev = null; // this is the null pointer we are seeing
kvn@1223 70 }
kvn@1223 71
kvn@1223 72 private void removeItems(int numItems) {
kvn@1223 73 Item item = list;
kvn@1223 74 if (item == null) {
kvn@1223 75 return;
kvn@1223 76 }
kvn@1223 77 Item last = item.prev;
kvn@1223 78 boolean done = false;
kvn@1223 79 while (!done && numItems > 1) {
kvn@1223 80 // the original code "done = (item == last);" triggered an infinite loop
kvn@1223 81 // and was changed slightly in order to produce an exception instead.
kvn@1223 82 done = (item.next == last.next);
kvn@1223 83 item = item.next;
kvn@1223 84 if (item.prev.remove) {
kvn@1223 85 linkOut(item.prev);
kvn@1223 86 }
kvn@1223 87 }
kvn@1223 88 }
kvn@1223 89
kvn@1223 90 public void perform(int numItems) {
kvn@1223 91 for (int i = 0; i < numItems; i++) {
kvn@1223 92 linkIn(new Item(i == 0));
kvn@1223 93 }
kvn@1223 94 removeItems(numItems);
kvn@1223 95 list = null;
kvn@1223 96 }
kvn@1223 97
kvn@1223 98 static public void main(String[] args) {
kvn@1223 99 int caseCnt = 0;
kvn@1223 100 Test bj = new Test();
kvn@1223 101 try {
kvn@1223 102 for (; caseCnt < 500000;) {
kvn@1223 103 int numItems = (++caseCnt % 2);
kvn@1223 104 if ((caseCnt % 64) == 0) {
kvn@1223 105 numItems = 5;
kvn@1223 106 }
kvn@1223 107 bj.perform(numItems);
kvn@1223 108 if ((caseCnt % 100000) == 0) {
kvn@1223 109 System.out.println("successfully performed " + caseCnt + " cases");
kvn@1223 110 }
kvn@1223 111 }
kvn@1223 112 } catch (Exception e) {
kvn@1223 113 System.out.println("ERROR: crashed during case " + caseCnt);
kvn@1223 114 e.printStackTrace(System.out);
kvn@1223 115 System.exit(97);
kvn@1223 116 }
kvn@1223 117 }
kvn@1223 118 }
kvn@1223 119

mercurial