United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-6761594 framesize rounding code rounds using wrong units leading to slightly oversized frames
JDK-6761594 : framesize rounding code rounds using wrong units leading to slightly oversized frames

Details
Type:
Bug
Submit Date:
2008-10-20
Status:
Resolved
Updated Date:
2010-04-02
Project Name:
JDK
Resolved Date:
2008-11-19
Component:
hotspot
OS:
solaris_9
Sub-Component:
compiler
CPU:
sparc
Priority:
P4
Resolution:
Fixed
Affected Versions:
hs14
Fixed Versions:
hs14 (b07)

Related Reports
Backport:
Backport:

Sub Tasks

Description
I believe that I have found a minor bug in the framesize calculation in chaitin.cpp:
 
  // Convert that to a frame_slot number.
  if( _max_reg <= _matcher._new_SP )
    _framesize = C->out_preserve_stack_slots();
  else _framesize = _max_reg -_matcher._new_SP;
  assert((int)(_matcher._new_SP+_framesize) >= (int)_matcher._out_arg_limit, "framesize must be large enough");
 
  // This frame must preserve the required fp alignment
  const int stack_alignment_in_words = Matcher::stack_alignment_in_slots();
  if (stack_alignment_in_words > 0)
    _framesize = round_to(_framesize, Matcher::stack_alignment_in_bytes());
  assert( _framesize >= 0 && _framesize <= 1000000, "sanity check" );
 
The granularity of _framesize at this point is OptoReg slots and so should it be aligned to Matcher::stack_alignment_in_slots() instead of Matcher::stack_alignment_in_bytes()? This is causing the minimum framesize on Itanium to be 80 bytes instead of 32 (2 words scratch, 1 word for the original_pc offset, and 1 word for alignment).

                                    

Comments
EVALUATION

That's correct.
                                     
2008-10-20
SUGGESTED FIX

diff --git a/src/share/vm/opto/chaitin.cpp b/src/share/vm/opto/chaitin.cpp                                                           
--- a/src/share/vm/opto/chaitin.cpp                                                                                                  
+++ b/src/share/vm/opto/chaitin.cpp                                                                                                  
@@ -442,7 +442,7 @@ void PhaseChaitin::Register_Allocate() {
   // This frame must preserve the required fp alignment                                                                             
   const int stack_alignment_in_words = Matcher::stack_alignment_in_slots();                                                         
   if (stack_alignment_in_words > 0)                                                                                                 
-    _framesize = round_to(_framesize, Matcher::stack_alignment_in_bytes());                                                         
+    _framesize = round_to(_framesize, stack_alignment_in_words);                                                                    
   assert( _framesize >= 0 && _framesize <= 1000000, "sanity check" );                                                               
 #ifndef PRODUCT                                                                                                                     
   _total_framesize += _framesize;
                                     
2008-10-20
EVALUATION

http://hg.openjdk.java.net/jdk7/hotspot-comp/hotspot/rev/0bf25c4807f9
                                     
2008-11-07



Hardware and Software, Engineered to Work Together