hotspot/src/share/vm/opto/compile.cpp
changeset 360 21d113ecbf6a
parent 347 df859fcca515
child 374 585c671c9c0e
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
  1029     if (ta->size() != TypeInt::POS) {
  1029     if (ta->size() != TypeInt::POS) {
  1030       const TypeAry *tary = TypeAry::make(ta->elem(), TypeInt::POS);
  1030       const TypeAry *tary = TypeAry::make(ta->elem(), TypeInt::POS);
  1031       tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,ta->klass(),false,offset, ta->instance_id());
  1031       tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,ta->klass(),false,offset, ta->instance_id());
  1032     }
  1032     }
  1033     // Arrays of known objects become arrays of unknown objects.
  1033     // Arrays of known objects become arrays of unknown objects.
       
  1034     if (ta->elem()->isa_narrowoop() && ta->elem() != TypeNarrowOop::BOTTOM) {
       
  1035       const TypeAry *tary = TypeAry::make(TypeNarrowOop::BOTTOM, ta->size());
       
  1036       tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset, ta->instance_id());
       
  1037     }
  1034     if (ta->elem()->isa_oopptr() && ta->elem() != TypeInstPtr::BOTTOM) {
  1038     if (ta->elem()->isa_oopptr() && ta->elem() != TypeInstPtr::BOTTOM) {
  1035       const TypeAry *tary = TypeAry::make(TypeInstPtr::BOTTOM, ta->size());
  1039       const TypeAry *tary = TypeAry::make(TypeInstPtr::BOTTOM, ta->size());
  1036       tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset, ta->instance_id());
  1040       tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset, ta->instance_id());
  1037     }
  1041     }
  1038     // Arrays of bytes and of booleans both use 'bastore' and 'baload' so
  1042     // Arrays of bytes and of booleans both use 'bastore' and 'baload' so
  1067       // Also, make sure exact and non-exact variants alias the same.
  1071       // Also, make sure exact and non-exact variants alias the same.
  1068       tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset, to->instance_id());
  1072       tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset, to->instance_id());
  1069     }
  1073     }
  1070     // Canonicalize the holder of this field
  1074     // Canonicalize the holder of this field
  1071     ciInstanceKlass *k = to->klass()->as_instance_klass();
  1075     ciInstanceKlass *k = to->klass()->as_instance_klass();
  1072     if (offset >= 0 && offset < oopDesc::header_size() * wordSize) {
  1076     if (offset >= 0 && offset < instanceOopDesc::base_offset_in_bytes()) {
  1073       // First handle header references such as a LoadKlassNode, even if the
  1077       // First handle header references such as a LoadKlassNode, even if the
  1074       // object's klass is unloaded at compile time (4965979).
  1078       // object's klass is unloaded at compile time (4965979).
  1075       tj = to = TypeInstPtr::make(TypePtr::BotPTR, env()->Object_klass(), false, NULL, offset, to->instance_id());
  1079       tj = to = TypeInstPtr::make(TypePtr::BotPTR, env()->Object_klass(), false, NULL, offset, to->instance_id());
  1076     } else if (offset < 0 || offset >= k->size_helper() * wordSize) {
  1080     } else if (offset < 0 || offset >= k->size_helper() * wordSize) {
  1077       to = NULL;
  1081       to = NULL;
  1308     // but the base pointer type is not distinctive enough to identify
  1312     // but the base pointer type is not distinctive enough to identify
  1309     // references into JavaThread.)
  1313     // references into JavaThread.)
  1310 
  1314 
  1311     // Check for final instance fields.
  1315     // Check for final instance fields.
  1312     const TypeInstPtr* tinst = flat->isa_instptr();
  1316     const TypeInstPtr* tinst = flat->isa_instptr();
  1313     if (tinst && tinst->offset() >= oopDesc::header_size() * wordSize) {
  1317     if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) {
  1314       ciInstanceKlass *k = tinst->klass()->as_instance_klass();
  1318       ciInstanceKlass *k = tinst->klass()->as_instance_klass();
  1315       ciField* field = k->get_field_by_offset(tinst->offset(), false);
  1319       ciField* field = k->get_field_by_offset(tinst->offset(), false);
  1316       // Set field() and is_rewritable() attributes.
  1320       // Set field() and is_rewritable() attributes.
  1317       if (field != NULL)  alias_type(idx)->set_field(field);
  1321       if (field != NULL)  alias_type(idx)->set_field(field);
  1318     }
  1322     }
  1728           continue;
  1732           continue;
  1729         }
  1733         }
  1730         if (bundle->starts_bundle())
  1734         if (bundle->starts_bundle())
  1731           starts_bundle = '+';
  1735           starts_bundle = '+';
  1732       }
  1736       }
       
  1737 
       
  1738       if (WizardMode) n->dump();
  1733 
  1739 
  1734       if( !n->is_Region() &&    // Dont print in the Assembly
  1740       if( !n->is_Region() &&    // Dont print in the Assembly
  1735           !n->is_Phi() &&       // a few noisely useless nodes
  1741           !n->is_Phi() &&       // a few noisely useless nodes
  1736           !n->is_Proj() &&
  1742           !n->is_Proj() &&
  1737           !n->is_MachTemp() &&
  1743           !n->is_MachTemp() &&
  1753 
  1759 
  1754       // If we have an instruction with a delay slot, and have seen a delay,
  1760       // If we have an instruction with a delay slot, and have seen a delay,
  1755       // then back up and print it
  1761       // then back up and print it
  1756       if (valid_bundle_info(n) && node_bundling(n)->use_unconditional_delay()) {
  1762       if (valid_bundle_info(n) && node_bundling(n)->use_unconditional_delay()) {
  1757         assert(delay != NULL, "no unconditional delay instruction");
  1763         assert(delay != NULL, "no unconditional delay instruction");
       
  1764         if (WizardMode) delay->dump();
       
  1765 
  1758         if (node_bundling(delay)->starts_bundle())
  1766         if (node_bundling(delay)->starts_bundle())
  1759           starts_bundle = '+';
  1767           starts_bundle = '+';
  1760         if (pcs && n->_idx < pc_limit)
  1768         if (pcs && n->_idx < pc_limit)
  1761           tty->print("%3.3x", pcs[n->_idx]);
  1769           tty->print("%3.3x", pcs[n->_idx]);
  1762         else
  1770         else
  1817 };
  1825 };
  1818 
  1826 
  1819 static bool oop_offset_is_sane(const TypeInstPtr* tp) {
  1827 static bool oop_offset_is_sane(const TypeInstPtr* tp) {
  1820   ciInstanceKlass *k = tp->klass()->as_instance_klass();
  1828   ciInstanceKlass *k = tp->klass()->as_instance_klass();
  1821   // Make sure the offset goes inside the instance layout.
  1829   // Make sure the offset goes inside the instance layout.
  1822   return (uint)tp->offset() < (uint)(oopDesc::header_size() + k->nonstatic_field_size())*wordSize;
  1830   return k->contains_field_offset(tp->offset());
  1823   // Note that OffsetBot and OffsetTop are very negative.
  1831   // Note that OffsetBot and OffsetTop are very negative.
  1824 }
  1832 }
  1825 
  1833 
  1826 //------------------------------final_graph_reshaping_impl----------------------
  1834 //------------------------------final_graph_reshaping_impl----------------------
  1827 // Implement items 1-5 from final_graph_reshaping below.
  1835 // Implement items 1-5 from final_graph_reshaping below.
  1944   case Op_StoreL:
  1952   case Op_StoreL:
  1945   case Op_StoreLConditional:
  1953   case Op_StoreLConditional:
  1946   case Op_CompareAndSwapI:
  1954   case Op_CompareAndSwapI:
  1947   case Op_CompareAndSwapL:
  1955   case Op_CompareAndSwapL:
  1948   case Op_CompareAndSwapP:
  1956   case Op_CompareAndSwapP:
       
  1957   case Op_CompareAndSwapN:
  1949   case Op_StoreP:
  1958   case Op_StoreP:
       
  1959   case Op_StoreN:
  1950   case Op_LoadB:
  1960   case Op_LoadB:
  1951   case Op_LoadC:
  1961   case Op_LoadC:
  1952   case Op_LoadI:
  1962   case Op_LoadI:
  1953   case Op_LoadKlass:
  1963   case Op_LoadKlass:
  1954   case Op_LoadL:
  1964   case Op_LoadL:
  1955   case Op_LoadL_unaligned:
  1965   case Op_LoadL_unaligned:
  1956   case Op_LoadPLocked:
  1966   case Op_LoadPLocked:
  1957   case Op_LoadLLocked:
  1967   case Op_LoadLLocked:
  1958   case Op_LoadP:
  1968   case Op_LoadP:
       
  1969   case Op_LoadN:
  1959   case Op_LoadRange:
  1970   case Op_LoadRange:
  1960   case Op_LoadS: {
  1971   case Op_LoadS: {
  1961   handle_mem:
  1972   handle_mem:
  1962 #ifdef ASSERT
  1973 #ifdef ASSERT
  1963     if( VerifyOptoOopOffsets ) {
  1974     if( VerifyOptoOopOffsets ) {