Name: ks84122 Date: 12/02/2003
The below testcase when run with the debug version of java with CompilerNullChecks off would cause an assert in the server compiler.
cat > SieveBits.java << \!
class BitSet
{ int P[];
int K;
public BitSet (int k)
{ P=new int[k/32+1]; K=k;
}
synchronized public void set (int i)
{ if (i<0) throw new ArrayIndexOutOfBoundsException("");
P[i>>5]|=(1<<(i&0x0000001F));
}
synchronized public void clear (int i)
{ P[i>>5]&=~(1<<(i&0x0000001F));
}
synchronized public boolean get (int i)
{ return (P[i>>5]&(1<<(i&0x0000001F)))!=0;
}
public int size ()
{ return K;
}
}
/* Sieve.java
Das Primzahlsieb f?r Java.
*/
public class SieveBits
{ static BitSet prime;
// Enthaelt Flags fuer die ungeraden Zahlen:
// 3,5,7,...
// D.h., 2*i+3 ist prim, wenn prime[i] war ist
static public void main (String args[])
// Hauptprogramm
{ int n;
if (args.length==0) n=100000000;
// falls keine Argumente in der Kommandozeile
else n=Integer.parseInt(args[0]);
// lies Anzahl aus der Kommandozeile
int k=(n-3)/2;
System.out.println("Counting primes up to "+(2*k+3)+".");
long time=System.currentTimeMillis();
prime=new BitSet(k);
sieve(); // das Sieb
// Zaehle gefundene Primzahlen:
int count=1,i;
for (i=0; i<k; i++)
if (prime.get(i)) count++;
// Ausgabe:
time=System.currentTimeMillis()-time;
System.out.println(count+" primes found.");
System.out.println(time/1000+" seconds needed");
// list(); // nur fuer Testzwecke
}
static void sieve ()
// das Sieb
{ int k=prime.size(),i,j,p,l;
// Zuerst alle Zahlen auf prim setzen
for (i=0; i<k; i++) prime.set(i);
// Dann Vielfache von Primzahlen aussieben
for (i=0; i<k; i++)
{
if (prime.get(i)) // 2*i+3 ist prim
{ p=2*i+3;
l=(p*p-3)/2;
if (l>k) break;
for (j=l; j<k; j+=p) prime.clear(j);
// streicht p*p,p*(p+2), etc.
}
}
}
}
!
/opt/jdk1.4.2/bin/java_g -server -XX:-GenerateCompilerNullChecks SieveBits
VM option '-GenerateCompilerNullChecks'
Counting primes up to 99999999.
# To suppress the following error report, specify this argument
# after -XX: or in .hotspotrc: SuppressErrorAt=/parse3.cpp:80
#
# HotSpot Virtual Machine Error, assertion failure
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Server VM (1.4.2-b28-debug mixed mode)
#
# assert(_gvn.type(obj)->higher_equal(tjp), "cast_up is no longer needed")
#
# Error ID: /export1/jdk/jdk1.4.2/hotspot/src/share/vm/opto/parse3.cpp, 80 [ Patched ]
#
# Problematic Thread: prio=5 tid=0x00120780 nid=0xa runnable
#
Heap at VM Abort:
Heap
def new generation total 2112K, used 0K [0xf0800000, 0xf0a20000, 0xf1d50000)
eden space 2048K, 0% used [0xf0800000, 0xf0800000, 0xf0a00000)
from space 64K, 0% used [0xf0a10000, 0xf0a10000, 0xf0a20000)
to space 64K, 0% used [0xf0a00000, 0xf0a00000, 0xf0a10000)
tenured generation total 7512K, used 6186K [0xf1d50000, 0xf24a6000, 0xf4800000)
the space 7512K, 82% used [0xf1d50000, 0xf235a948, 0xf235aa00, 0xf24a6000)
compacting perm gen total 16384K, used 1043K [0xf4800000, 0xf5800000, 0xf8800000)
the space 16384K, 6% used [0xf4800000, 0xf4904f18, 0xf4905000, 0xf5800000)
Dumping core....
Abort (core dumped)
(Incident Review ID: 228797)
======================================================================