src/share/vm/opto/live.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/live.cpp	Mon Dec  8 15:00:39 2008
--- new/src/share/vm/opto/live.cpp	Mon Dec  8 15:00:39 2008

*** 269,281 **** --- 269,280 ---- tty->print("\n"); } //------------------------------verify_base_ptrs------------------------------- // Verify that base pointers and derived pointers are still sane. // Basically, if a derived pointer is live at a safepoint, then its // base pointer must be live also. void PhaseChaitin::verify_base_ptrs( ResourceArea *a ) const { + Unique_Node_List worklist(a); for( uint i = 0; i < _cfg._num_blocks; i++ ) { Block *b = _cfg._blocks[i]; for( uint j = b->end_idx() + 1; j > 1; j-- ) { Node *n = b->_nodes[j-1]; if( n->is_Phi() ) break;
*** 285,311 **** --- 284,343 ---- JVMState* jvms = sfpt->jvms(); if (jvms != NULL) { // Now scan for a live derived pointer if (jvms->oopoff() < sfpt->req()) { // Check each derived/base pair ! for (uint idx = jvms->oopoff(); idx < sfpt->req(); idx += 2) { ! for (uint idx = jvms->oopoff(); idx < sfpt->req(); idx++) { Node *check = sfpt->in(idx); ! uint j = 0; ! bool is_derived = ((idx - jvms->oopoff()) & 1) == 0; // search upwards through spills and spill phis for AddP ! while(true) { ! if( !check ) break; ! int idx = check->is_Copy(); ! if( idx ) { ! check = check->in(idx); } else if( check->is_Phi() && check->_idx >= _oldphi ) { check = check->in(1); } else break; ! j++; assert(j < 100000,"Derived pointer checking in infinite loop"); ! worklist.clear(); ! worklist.push(check); ! uint k = 0; ! while( k < worklist.size() ) { ! check = worklist.at(k); + assert(check,"Bad base or derived pointer"); + // See PhaseChaitin::find_base_for_derived() for all cases. + int isc = check->is_Copy(); + if( isc ) { ! worklist.push(check->in(isc)); + } else if( check->is_Phi() ) { + for (uint m = 1; m < check->req(); m++) + worklist.push(check->in(m)); + } else if( check->is_Con() ) { + if (is_derived) { + // Derived is NULL+offset + assert(!is_derived || check->bottom_type()->is_ptr()->ptr() == TypePtr::Null,"Bad derived pointer"); + } else { + assert(check->bottom_type()->is_ptr()->_offset == 0,"Bad base pointer"); + // Base either ConP(NULL) or loadConP + if (check->is_Mach()) { + assert(check->as_Mach()->ideal_Opcode() == Op_ConP,"Bad base pointer"); + } else { + assert(check->Opcode() == Op_ConP && + check->bottom_type()->is_ptr()->ptr() == TypePtr::Null,"Bad base pointer"); + } + } + } else if( check->bottom_type()->is_ptr()->_offset == 0 ) { + assert(check->is_Proj() || check->is_Mach() && + (check->as_Mach()->ideal_Opcode() == Op_CreateEx || + check->as_Mach()->ideal_Opcode() == Op_ThreadLocal || + check->as_Mach()->ideal_Opcode() == Op_CMoveP || + check->as_Mach()->ideal_Opcode() == Op_CheckCastPP || + #ifdef _LP64 + UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_CastPP || + UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_DecodeN || + #endif + check->as_Mach()->ideal_Opcode() == Op_LoadP || + check->as_Mach()->ideal_Opcode() == Op_LoadKlass),"Bad base or derived pointer"); + } else { + assert(is_derived,"Bad base pointer"); + assert(check->is_Mach() && check->as_Mach()->ideal_Opcode() == Op_AddP,"Bad derived pointer"); + } + k++; + assert(k < 100000,"Derived pointer checking in infinite loop"); } // End while assert(check->is_Mach() && check->as_Mach()->ideal_Opcode() == Op_AddP,"Bad derived pointer") } } // End of check for derived pointers } // End of Kcheck for debug info } // End of if found a safepoint } // End of forall instructions in block

src/share/vm/opto/live.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File