6880034: Change 6420645 causes SIGBUS during deoptimisation at a safepoint on 64bit-SPARC

Volker Simonis volker.simonis at gmail.com
Fri Oct 2 10:35:03 PDT 2009


Hi Vladimir, Tom,

thank you for your evaluation.

You can find a webrev for this change at:

http://www.progdoc.de/webrev/6880034/

Could you please be so kind to review and submit it in case it's ok?

Thanks,
Volker


On 9/30/09, Vladimir Kozlov <Vladimir.Kozlov at sun.com> wrote:
> Volker Simonis wrote:
>  > I don't know why this strange encoding has been chosen for the 16
>  > upper double registers in sparc.ad, but changing it to:
>  >
>  > reg_def R_D32x(SOC, SOC, Op_RegD,255, F32->as_VMReg()->next());
>  > reg_def R_D32 (SOC, SOC, Op_RegD,  1, F32->as_VMReg());
>  > reg_def R_D34x(SOC, SOC, Op_RegD,255, F34->as_VMReg()->next());
>  > reg_def R_D34 (SOC, SOC, Op_RegD,  3, F34->as_VMReg());
>  > ...
>  > reg_def R_D62x(SOC, SOC, Op_RegD,255, F62->as_VMReg()->next());
>  > reg_def R_D62 (SOC, SOC, Op_RegD, 31, F62->as_VMReg());
>  >
>  > which seems more natural to me, solved the SIGBUS issue and didn't
>  > revealed any other problems in the tests which I run so far.
>  >
>  > Could you please comment on the proposed solution of changing the
>  > VMReg numbering of F32-F62 or advice a better solution if you think
>  > that the proposed one will not work in the general case?
>  >
>  > Thank you and best regards,
>  > Volker
>
>  Your changes are correct but I would also swap definitions
>  to be more clear.
>
>  reg_def R_D32 (SOC, SOC, Op_RegD,  1, F32->as_VMReg());
>  reg_def R_D32x(SOC, SOC, Op_RegD,255, F32->as_VMReg()->next());
>  reg_def R_D34 (SOC, SOC, Op_RegD,  3, F34->as_VMReg());
>  reg_def R_D34x(SOC, SOC, Op_RegD,255, F34->as_VMReg()->next());
>
>  I looked on the history and originally it was
>
>  reg_def R_D32( SOC, SOC, Op_RegD,  1, 0 );
>  reg_def R_D32L(SOC, SOC, Op_RegD, 99, 0 );
>  reg_def R_D34( SOC, SOC, Op_RegD,  3, 0 );
>  reg_def R_D34L(SOC, SOC, Op_RegD, 99, 0 );
>
>  where R_D32L and R_D34L represented nonexisting F33 and F35
>  low 32 bits halves of D32 and D34.
>
>  Then the ordering of declarations was changed and introduced
>  the confusion:
>
>  reg_def R_D32x(SOC, SOC, Op_RegD,255, 0 );
>  reg_def R_D32 (SOC, SOC, Op_RegD,  1, 0 );
>  reg_def R_D34x(SOC, SOC, Op_RegD,255, 0 );
>  reg_def R_D34 (SOC, SOC, Op_RegD,  3, 0 );
>
>  Vladimir
>
>  Tom Rodriguez wrote:
>
> >
> > > The problem can be easily solved by switching back to the old
> > > implementation of frame::oopmapreg_to_location(), but I
> assume there
> > > was a rational behind the change and that the new implementation is
> > > probably necessary for compressed oops (at least that's what the whole
> > > change was all about). So I dug a little further and found that in my
> > > opinion the root cause of the whole problem is the strange numbering
> > > of the 16 upper double registers in sparc.ad. They are defined as
> > > follows:
> > >
> > > reg_def R_D32x(SOC, SOC, Op_RegD,255, F32->as_VMReg());
> > > reg_def R_D32 (SOC, SOC, Op_RegD,  1, F32->as_VMReg()->next());
> > > reg_def R_D34x(SOC, SOC, Op_RegD,255, F34->as_VMReg());
> > > reg_def R_D34 (SOC, SOC, Op_RegD,  3, F34->as_VMReg()->next());
> > > ...
> > > reg_def R_D62x(SOC, SOC, Op_RegD,255, F62->as_VMReg());
> > > reg_def R_D62 (SOC, SOC, Op_RegD, 31, F62->as_VMReg()->next());
> > >
> >
> > I don't really know why it's done this way.  It's certainly not consistent
> with the others.  If it all works better I'd be ok with correcting.
> >
> >
> > > PS: while I was hunting the error, I also stumbled across the
> > > following code in RegisterSaver::save_live_registers():
> > >
> > >  // Save all the FP registers
> > >  int offset = d00_offset;
> > >  for( int i=0; i<64; i+=2 ) {
> > >   FloatRegister f = as_FloatRegister(i);
> > >   __ stf(FloatRegisterImpl::D,  f, SP, offset+STACK_BIAS);
> > >
> map->set_callee_saved(VMRegImpl::stack2reg(offset>>2),
> f->as_VMReg());
> > >   if (true) {
> > >     map->set_callee_saved(VMRegImpl::stack2reg((offset
> +
> > > sizeof(float))>>2), f->as_VMReg()->next());
> > >   }
> > >   offset += sizeof(double);
> > >  }
> > >
> >
> > That would probably be ok too.
> >
> > tom
> >
> >
> > >
> > > In my opinion, this could be changed to:
> > >
> > >  // Save all the FP registers
> > >  int offset = d00_offset;
> > >  for( int i=0; i<64; i+=2 ) {
> > >   FloatRegister f = as_FloatRegister(i);
> > >   __ stf(FloatRegisterImpl::D,  f, SP, offset+STACK_BIAS);
> > >
> map->set_callee_saved(VMRegImpl::stack2reg(offset>>2),
> f->as_VMReg());
> > >   if (i < 32) { // VS 2009-08-31: the 16 upper double registers
> > > can't be used as floats anyway
> > >     map->set_callee_saved(VMRegImpl::stack2reg((offset
> +
> > > sizeof(float))>>2), f->as_VMReg()->next());
> > >   }
> > >   offset += sizeof(double);
> > >  }
> > >
> > > because the 16 upper double registers can't be used as floats anyway.
> > > Again, I didn't found any regression in my few tests. What do you
> > > think?
> > > <DeoptTest.java>
> > >
> >
> >
>


More information about the hotspot-compiler-dev mailing list