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 ) { |