From 83066b1a7d9569fbb41476fd7411893ba46e4adf Mon Sep 17 00:00:00 2001 From: never Date: Tue, 18 Mar 2008 23:54:17 -0700 Subject: [PATCH] 6659207: access violation in CompilerThread0 Summary: split_thru_phi produces top on a non-dead path Reviewed-by: kvn, rasbold, sgoldman --- src/share/vm/opto/loopopts.cpp | 5 +++ test/compiler/6659207/Test.java | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 test/compiler/6659207/Test.java diff --git a/src/share/vm/opto/loopopts.cpp b/src/share/vm/opto/loopopts.cpp index d0a94b4c2..6535c5529 100644 --- a/src/share/vm/opto/loopopts.cpp +++ b/src/share/vm/opto/loopopts.cpp @@ -29,6 +29,11 @@ //------------------------------split_thru_phi--------------------------------- // Split Node 'n' through merge point if there is enough win. Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) { + if (n->Opcode() == Op_ConvI2L && n->bottom_type() != TypeLong::LONG) { + // ConvI2L may have type information on it which is unsafe to push up + // so disable this for now + return NULL; + } int wins = 0; assert( !n->is_CFG(), "" ); assert( region->is_Region(), "" ); diff --git a/test/compiler/6659207/Test.java b/test/compiler/6659207/Test.java new file mode 100644 index 000000000..3c729758e --- /dev/null +++ b/test/compiler/6659207/Test.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +/* + * @test + * @bug 6659207 + * @summary access violation in CompilerThread0 + */ + +public class Test { + static int[] array = new int[12]; + + static int index(int i) { + if (i == 0) return 0; + for (int n = 0; n < array.length; n++) + if (i < array[n]) return n; + return -1; + } + + static int test(int i) { + int result = 0; + i = index(i); + if (i >= 0) + if (array[i] != 0) + result++; + + if (i != -1) + array[i]++; + + return result; + } + + public static void main(String[] args) { + int total = 0; + for (int i = 0; i < 100000; i++) { + total += test(10); + } + System.out.println(total); + } +} -- GitLab