1 /*
2  * Copyright (c) 2009, 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  * @test
26  * @bug 6843752 8192992
27  * @summary missing code for an anti-dependent Phi in GCM
28  *
29  * @run main/othervm -Xbatch compiler.c2.Test6843752
30  */
31 
32 package compiler.c2;
33 
34 public class Test6843752 {
35 
36     Item list;
37 
38     static class Item {
39         public Item    next;
40         public Item    prev;
41         public boolean remove;
42 
Item(boolean r)43         Item(boolean r) { remove = r; }
44     }
45 
linkIn(Item item)46     private void linkIn(Item item) {
47         Item head = list;
48         if (head == null) {
49             item.next = item;
50             item.prev = item;
51             list = item;
52         } else {
53             item.next = head;
54             item.prev = head.prev;
55             head.prev.next = item;
56             head.prev = item;
57         }
58     }
59 
linkOut(Item item)60     private void linkOut(Item item) {
61         Item head = list;
62         if (item.next == item) {
63             list = null;
64         } else {
65             item.prev.next = item.next;
66             item.next.prev = item.prev;
67             if (head == item) {
68                 list = item.next;
69             }
70         }
71         item.next = null;
72         item.prev = null; // this is the null pointer we are seeing
73     }
74 
removeItems(int numItems)75     private void removeItems(int numItems) {
76         Item item = list;
77         if (item == null) {
78             return;
79         }
80         Item last = item.prev;
81         boolean done = false;
82         while (!done && numItems > 1) {
83             // the original code "done = (item == last);" triggered an infinite loop
84             // and was changed slightly in order to produce an exception instead.
85             done = (item.next == last.next);
86             item = item.next;
87             if (item.prev.remove) {
88                 linkOut(item.prev);
89             }
90         }
91     }
92 
perform(int numItems)93     public void perform(int numItems) {
94         for (int i = 0; i < numItems; i++) {
95             linkIn(new Item(i == 0));
96         }
97         removeItems(numItems);
98         list = null;
99     }
100 
main(String[] args)101     static public void main(String[] args) {
102         int caseCnt = 0;
103         Test6843752 bj = new Test6843752();
104         try {
105             for (; caseCnt < 500000;) {
106                 int numItems = (++caseCnt % 2);
107                 if ((caseCnt % 64) == 0) {
108                     numItems = 5;
109                 }
110                 bj.perform(numItems);
111                 if ((caseCnt % 100000) == 0) {
112                     System.out.println("successfully performed " + caseCnt + " cases");
113                 }
114             }
115         } catch (Exception e) {
116             System.out.println("ERROR: crashed during case " + caseCnt);
117             e.printStackTrace(System.out);
118             System.exit(97);
119         }
120     }
121 }
122 
123