# HG changeset patch # User kvn # Date 1243452951 25200 # Node ID 549b4d80b29e352bcdc0c6dd3ed7ab650924e3b7 # Parent cb263b90c79436f59125ecdf9d858c53fe943421 6843752: missing code for an anti-dependent Phi in GCM Summary: Don't place a load below anti-dependent PHI. Reviewed-by: never, twisti diff -r cb263b90c794 -r 549b4d80b29e hotspot/src/share/vm/opto/gcm.cpp --- a/hotspot/src/share/vm/opto/gcm.cpp Thu May 21 10:05:36 2009 -0700 +++ b/hotspot/src/share/vm/opto/gcm.cpp Wed May 27 12:35:51 2009 -0700 @@ -617,6 +617,9 @@ assert(!LCA_orig->dominates(pred_block) || early->dominates(pred_block), "early is high enough"); must_raise_LCA = true; + } else { + // anti-dependent upon PHI pinned below 'early', no edge needed + LCA = early; // but can not schedule below 'early' } } } diff -r cb263b90c794 -r 549b4d80b29e hotspot/test/compiler/6843752/Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/6843752/Test.java Wed May 27 12:35:51 2009 -0700 @@ -0,0 +1,119 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6843752 + * @summary missing code for an anti-dependent Phi in GCM + * @run main/othervm -Xbatch Test + */ + +public class Test { + + Item list; + + static class Item { + public Item next; + public Item prev; + public boolean remove; + + Item(boolean r) { remove = r; } + } + + private void linkIn(Item item) { + Item head = list; + if (head == null) { + item.next = item; + item.prev = item; + list = item; + } else { + item.next = head; + item.prev = head.prev; + head.prev.next = item; + head.prev = item; + } + } + + private void linkOut(Item item) { + Item head = list; + if (item.next == item) { + list = null; + } else { + item.prev.next = item.next; + item.next.prev = item.prev; + if (head == item) { + list = item.next; + } + } + item.next = null; + item.prev = null; // this is the null pointer we are seeing + } + + private void removeItems(int numItems) { + Item item = list; + if (item == null) { + return; + } + Item last = item.prev; + boolean done = false; + while (!done && numItems > 1) { + // the original code "done = (item == last);" triggered an infinite loop + // and was changed slightly in order to produce an exception instead. + done = (item.next == last.next); + item = item.next; + if (item.prev.remove) { + linkOut(item.prev); + } + } + } + + public void perform(int numItems) { + for (int i = 0; i < numItems; i++) { + linkIn(new Item(i == 0)); + } + removeItems(numItems); + list = null; + } + + static public void main(String[] args) { + int caseCnt = 0; + Test bj = new Test(); + try { + for (; caseCnt < 500000;) { + int numItems = (++caseCnt % 2); + if ((caseCnt % 64) == 0) { + numItems = 5; + } + bj.perform(numItems); + if ((caseCnt % 100000) == 0) { + System.out.println("successfully performed " + caseCnt + " cases"); + } + } + } catch (Exception e) { + System.out.println("ERROR: crashed during case " + caseCnt); + e.printStackTrace(System.out); + System.exit(97); + } + } +} +