Java Solaris Communities Sun Store Join SDN My Profile Why Join?
 
Bug Database
Bug Detail
Quick Lists
Top 25 Bugs
Top 25 RFE's
Recently Closed Bugs
Printable Page Printable Page


Bug Database
Bug ID: 4962416
Votes 0
Synopsis Server Compiler Crash in parser
Category hotspot:compiler2
Reported Against tiger-beta
Release Fixed
State 11-Closed, duplicate of 4292742, bug
Priority: 4-Low
Related Bugs
Submit Date 02-DEC-2003
Description




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) 
======================================================================
Work Around
N/A
Evaluation
Confirmed with latest Tiger bits. But the bug is not significant -
it will not be fixed in beta.

  xxxxx@xxxxx   2003-12-03

This flag is an internal developer feature, not intended for customer use.
It is occasionally used for certain kinds of performance test, but by developers
only.  Any developer who wants to use this flag must assume responsibility for
ensuring that it works.  In other words, this is a self-service feature.

I'm downgrading the priority to reflect the nature of this.  Not marking
"will not fix" because the failure may possibly mark a bug in the system.
(But it probably doesn't.)  Also, it would be nice to make this work right.
But customer-visible features must take priority.

  xxxxx@xxxxx   2003-12-03

To make the assert go away, we need to tweak the type to look non-null.
The fix probably looks like this:
  -  if( !GenerateCompilerNullChecks ) return value;
  +  if (!GenerateCompilerNullChecks && !assert_null)
  +    return cast_not_null(value);  // Make it look non-null.

  xxxxx@xxxxx   2003-12-22
Comments
  
  Include a link with my name & email   


PLEASE NOTE: JDK6 is formerly known as Project Mustang