--- old/src/share/vm/opto/cfgnode.cpp Wed Jul 15 16:41:50 2009 +++ new/src/share/vm/opto/cfgnode.cpp Wed Jul 15 16:41:50 2009 @@ -1796,8 +1796,12 @@ for (uint i=1; iis_DecodeN() && ii->bottom_type() == bottom_type()) { - has_decodeN = true; - in_decodeN = ii->in(1); + // Note: in_decodeN is used only to define the type of new phi. + // Find a non dead path otherwise phi type will be wrong. + if (ii->in(1)->bottom_type() != Type::TOP) { + has_decodeN = true; + in_decodeN = ii->in(1); + } } else if (!ii->is_Phi()) { may_push = false; } @@ -1805,7 +1809,6 @@ if (has_decodeN && may_push) { PhaseIterGVN *igvn = phase->is_IterGVN(); - // Note: in_decodeN is used only to define the type of new phi here. PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN); uint orig_cnt = req(); for (uint i=1; i as = new ArrayList(); + for (int i = 0; i < 5000; i++) { + List bs = new ArrayList(); + for (int j = i; j < i + 1000; j++) + bs.add(new B(j)); + as.add(new A(bs.toArray(new B[0]))); + } + new Test().foo(as.get(0), as.subList(1, as.size()).toArray(new A[0])); + } +} + +class A { + final B[] bs; + + public A(B[] bs) { + this.bs = bs; + } + + final B[] c(final A a) { + return new BoxedArray(bs).filter(new Function() { + public Boolean apply(B arg) { + for (B b : a.bs) { + if (b.d == arg.d) + return true; + } + return false; + } + }); + } +} + +class BoxedArray { + + private final T[] array; + + BoxedArray(T[] array) { + this.array = array; + } + + public T[] filter(Function function) { + boolean[] include = new boolean[array.length]; + int len = 0; + int i = 0; + while (i < array.length) { + if (function.apply(array[i])) { + include[i] = true; + len += 1; + } + i += 1; + } + T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), len); + len = 0; + i = 0; + while (len < result.length) { + if (include[i]) { + result[len] = array[i]; + len += 1; + } + i += 1; + } + return result; + } +} + +interface Function { + R apply(T arg); +} + +class B { + final int d; + public B(int d) { + this.d = d; + } +} +