1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/compiler/6661247/Test.java Wed Mar 19 15:14:36 2008 -0700 1.3 @@ -0,0 +1,155 @@ 1.4 +/* 1.5 + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 1.6 + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 1.7 + * 1.8 + * 1.9 + * 1.10 + * 1.11 + * 1.12 + * 1.13 + * 1.14 + * 1.15 + * 1.16 + * 1.17 + * 1.18 + * 1.19 + * 1.20 + * 1.21 + * 1.22 + * 1.23 + * 1.24 + * 1.25 + */ 1.26 + 1.27 +/* 1.28 + * @test 1.29 + * @bug 6661247 1.30 + * @summary Internal bug in 32-bit HotSpot optimizer while bit manipulations 1.31 + */ 1.32 + 1.33 +import java.util.Random; 1.34 +import java.nio.*; 1.35 + 1.36 +// This isn't a completely reliable test for 6661247 since the results 1.37 +// depend on what the local schedule looks like but it does reproduce 1.38 +// the issue in current builds. 1.39 + 1.40 +public class Test { 1.41 + 1.42 + public static void test(boolean[] src, int srcPos, LongBuffer dest, long destPos, int count) { 1.43 + int countStart = (destPos & 63) == 0 ? 0 : 64 - (int)(destPos & 63); 1.44 + if (countStart > count) 1.45 + countStart = count; 1.46 + for (int srcPosMax = srcPos + countStart; srcPos < srcPosMax; srcPos++, destPos++) { 1.47 + if (src[srcPos]) 1.48 + dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) | 1L << (destPos & 63)); 1.49 + else 1.50 + dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) & ~(1L << (destPos & 63))); 1.51 + } 1.52 + count -= countStart; 1.53 + int cnt = count >>> 6; 1.54 + for (int k = (int)(destPos >>> 6), kMax = k + cnt; k < kMax; k++) { 1.55 + int low = (src[srcPos] ? 1 : 0) 1.56 + | (src[srcPos + 1] ? 1 << 1 : 0) 1.57 + | (src[srcPos + 2] ? 1 << 2 : 0) 1.58 + | (src[srcPos + 3] ? 1 << 3 : 0) 1.59 + | (src[srcPos + 4] ? 1 << 4 : 0) 1.60 + | (src[srcPos + 5] ? 1 << 5 : 0) 1.61 + | (src[srcPos + 6] ? 1 << 6 : 0) 1.62 + | (src[srcPos + 7] ? 1 << 7 : 0) 1.63 + | (src[srcPos + 8] ? 1 << 8 : 0) 1.64 + | (src[srcPos + 9] ? 1 << 9 : 0) 1.65 + | (src[srcPos + 10] ? 1 << 10 : 0) 1.66 + | (src[srcPos + 11] ? 1 << 11 : 0) 1.67 + | (src[srcPos + 12] ? 1 << 12 : 0) 1.68 + | (src[srcPos + 13] ? 1 << 13 : 0) 1.69 + | (src[srcPos + 14] ? 1 << 14 : 0) 1.70 + | (src[srcPos + 15] ? 1 << 15 : 0) 1.71 + | (src[srcPos + 16] ? 1 << 16 : 0) 1.72 + | (src[srcPos + 17] ? 1 << 17 : 0) 1.73 + | (src[srcPos + 18] ? 1 << 18 : 0) 1.74 + | (src[srcPos + 19] ? 1 << 19 : 0) 1.75 + | (src[srcPos + 20] ? 1 << 20 : 0) 1.76 + | (src[srcPos + 21] ? 1 << 21 : 0) 1.77 + | (src[srcPos + 22] ? 1 << 22 : 0) 1.78 + | (src[srcPos + 23] ? 1 << 23 : 0) 1.79 + | (src[srcPos + 24] ? 1 << 24 : 0) 1.80 + | (src[srcPos + 25] ? 1 << 25 : 0) 1.81 + | (src[srcPos + 26] ? 1 << 26 : 0) 1.82 + | (src[srcPos + 27] ? 1 << 27 : 0) 1.83 + | (src[srcPos + 28] ? 1 << 28 : 0) 1.84 + | (src[srcPos + 29] ? 1 << 29 : 0) 1.85 + | (src[srcPos + 30] ? 1 << 30 : 0) 1.86 + | (src[srcPos + 31] ? 1 << 31 : 0) 1.87 + ; 1.88 + srcPos += 32; 1.89 + int high = (src[srcPos] ? 1 : 0) // PROBLEM! 1.90 + | (src[srcPos + 1] ? 1 << 1 : 0) 1.91 + | (src[srcPos + 2] ? 1 << 2 : 0) 1.92 + | (src[srcPos + 3] ? 1 << 3 : 0) 1.93 + | (src[srcPos + 4] ? 1 << 4 : 0) 1.94 + | (src[srcPos + 5] ? 1 << 5 : 0) 1.95 + | (src[srcPos + 6] ? 1 << 6 : 0) 1.96 + | (src[srcPos + 7] ? 1 << 7 : 0) 1.97 + | (src[srcPos + 8] ? 1 << 8 : 0) 1.98 + | (src[srcPos + 9] ? 1 << 9 : 0) 1.99 + | (src[srcPos + 10] ? 1 << 10 : 0) 1.100 + | (src[srcPos + 11] ? 1 << 11 : 0) 1.101 + | (src[srcPos + 12] ? 1 << 12 : 0) 1.102 + | (src[srcPos + 13] ? 1 << 13 : 0) 1.103 + | (src[srcPos + 14] ? 1 << 14 : 0) 1.104 + | (src[srcPos + 15] ? 1 << 15 : 0) 1.105 + | (src[srcPos + 16] ? 1 << 16 : 0) 1.106 + | (src[srcPos + 17] ? 1 << 17 : 0) 1.107 + | (src[srcPos + 18] ? 1 << 18 : 0) 1.108 + | (src[srcPos + 19] ? 1 << 19 : 0) 1.109 + | (src[srcPos + 20] ? 1 << 20 : 0) 1.110 + | (src[srcPos + 21] ? 1 << 21 : 0) 1.111 + | (src[srcPos + 22] ? 1 << 22 : 0) 1.112 + | (src[srcPos + 23] ? 1 << 23 : 0) 1.113 + | (src[srcPos + 24] ? 1 << 24 : 0) 1.114 + | (src[srcPos + 25] ? 1 << 25 : 0) 1.115 + | (src[srcPos + 26] ? 1 << 26 : 0) 1.116 + | (src[srcPos + 27] ? 1 << 27 : 0) 1.117 + | (src[srcPos + 28] ? 1 << 28 : 0) 1.118 + | (src[srcPos + 29] ? 1 << 29 : 0) 1.119 + | (src[srcPos + 30] ? 1 << 30 : 0) 1.120 + | (src[srcPos + 31] ? 1 << 31 : 0) 1.121 + ; 1.122 + srcPos += 32; 1.123 + dest.put(k, ((long)low & 0xFFFFFFFFL) | (((long)high) << 32)); 1.124 + destPos += 64; 1.125 + } 1.126 + int countFinish = count & 63; 1.127 + for (int srcPosMax = srcPos + countFinish; srcPos < srcPosMax; srcPos++, destPos++) { 1.128 + if (src[srcPos]) 1.129 + dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) | 1L << (destPos & 63)); 1.130 + else 1.131 + dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) & ~(1L << (destPos & 63))); 1.132 + } 1.133 + } 1.134 + public static void main(String[] args) { 1.135 + Random r = new Random(); 1.136 + int entries = 1000; 1.137 + boolean[] src = new boolean[entries * 64]; 1.138 + long[] dest = new long[entries]; 1.139 + long[] result = new long[entries]; 1.140 + 1.141 + for (int c = 0; c < 2000; c++) { 1.142 + for (int i = 0; i < entries; i++) { 1.143 + long l = r.nextLong(); 1.144 + for (int bit = 0; bit < 64; bit++) { 1.145 + src[i * 64 + bit] = (l & (1L << bit)) != 0; 1.146 + } 1.147 + dest[i] = 0; 1.148 + result[i] = l; 1.149 + } 1.150 + test(src, 0, LongBuffer.wrap(dest, 0, dest.length), 0, src.length); 1.151 + for (int i = 0; i < entries; i++) { 1.152 + if (dest[i] != result[i]) { 1.153 + throw new InternalError(i + ": " + Long.toHexString(dest[i]) + " != " + Long.toHexString(result[i])); 1.154 + } 1.155 + } 1.156 + } 1.157 + } 1.158 +}