提交 50b9047d 编写于 作者: O ohair

Merge

...@@ -274,10 +274,10 @@ public class OopUtilities implements /* imports */ JVMTIThreadState { ...@@ -274,10 +274,10 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
// hc_klass is a HotSpot magic field and hence we can't // hc_klass is a HotSpot magic field and hence we can't
// find it from InstanceKlass for java.lang.Class. // find it from InstanceKlass for java.lang.Class.
TypeDataBase db = VM.getVM().getTypeDataBase(); TypeDataBase db = VM.getVM().getTypeDataBase();
int hcKlassOffset = (int) Oop.getHeaderSize(); int hcKlassOffset = (int) Instance.getHeaderSize();
try { try {
hcKlassOffset += (db.lookupIntConstant("java_lang_Class::hc_klass_offset").intValue() * hcKlassOffset += (db.lookupIntConstant("java_lang_Class::hc_klass_offset").intValue() *
db.getAddressSize()); VM.getVM().getHeapOopSize());
} catch (RuntimeException re) { } catch (RuntimeException re) {
// ignore, currently java_lang_Class::hc_klass_offset is zero // ignore, currently java_lang_Class::hc_klass_offset is zero
} }
......
...@@ -3643,6 +3643,7 @@ void MacroAssembler::store_heap_oop(Register d, const Address& a, int offset) { ...@@ -3643,6 +3643,7 @@ void MacroAssembler::store_heap_oop(Register d, const Address& a, int offset) {
void MacroAssembler::encode_heap_oop(Register src, Register dst) { void MacroAssembler::encode_heap_oop(Register src, Register dst) {
assert (UseCompressedOops, "must be compressed"); assert (UseCompressedOops, "must be compressed");
verify_oop(src);
Label done; Label done;
if (src == dst) { if (src == dst) {
// optimize for frequent case src == dst // optimize for frequent case src == dst
...@@ -3664,12 +3665,14 @@ void MacroAssembler::encode_heap_oop(Register src, Register dst) { ...@@ -3664,12 +3665,14 @@ void MacroAssembler::encode_heap_oop(Register src, Register dst) {
void MacroAssembler::encode_heap_oop_not_null(Register r) { void MacroAssembler::encode_heap_oop_not_null(Register r) {
assert (UseCompressedOops, "must be compressed"); assert (UseCompressedOops, "must be compressed");
verify_oop(r);
sub(r, G6_heapbase, r); sub(r, G6_heapbase, r);
srlx(r, LogMinObjAlignmentInBytes, r); srlx(r, LogMinObjAlignmentInBytes, r);
} }
void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) { void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) {
assert (UseCompressedOops, "must be compressed"); assert (UseCompressedOops, "must be compressed");
verify_oop(src);
sub(src, G6_heapbase, dst); sub(src, G6_heapbase, dst);
srlx(dst, LogMinObjAlignmentInBytes, dst); srlx(dst, LogMinObjAlignmentInBytes, dst);
} }
...@@ -3682,11 +3685,13 @@ void MacroAssembler::decode_heap_oop(Register src, Register dst) { ...@@ -3682,11 +3685,13 @@ void MacroAssembler::decode_heap_oop(Register src, Register dst) {
bpr(rc_nz, true, Assembler::pt, dst, done); bpr(rc_nz, true, Assembler::pt, dst, done);
delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken
bind(done); bind(done);
verify_oop(dst);
} }
void MacroAssembler::decode_heap_oop_not_null(Register r) { void MacroAssembler::decode_heap_oop_not_null(Register r) {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp // Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit. // pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
assert (UseCompressedOops, "must be compressed"); assert (UseCompressedOops, "must be compressed");
sllx(r, LogMinObjAlignmentInBytes, r); sllx(r, LogMinObjAlignmentInBytes, r);
add(r, G6_heapbase, r); add(r, G6_heapbase, r);
...@@ -3695,6 +3700,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) { ...@@ -3695,6 +3700,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) {
void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) { void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp // Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit. // pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
assert (UseCompressedOops, "must be compressed"); assert (UseCompressedOops, "must be compressed");
sllx(src, LogMinObjAlignmentInBytes, dst); sllx(src, LogMinObjAlignmentInBytes, dst);
add(dst, G6_heapbase, dst); add(dst, G6_heapbase, dst);
......
...@@ -2720,7 +2720,8 @@ nmethod *SharedRuntime::generate_dtrace_nmethod( ...@@ -2720,7 +2720,8 @@ nmethod *SharedRuntime::generate_dtrace_nmethod(
#endif /* ASSERT */ #endif /* ASSERT */
VMRegPair zero; VMRegPair zero;
zero.set2(G0->as_VMReg()); const Register g0 = G0; // without this we get a compiler warning (why??)
zero.set2(g0->as_VMReg());
int c_arg, j_arg; int c_arg, j_arg;
......
...@@ -5975,7 +5975,8 @@ instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{ ...@@ -5975,7 +5975,8 @@ instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{
%} %}
instruct decodeHeapOop(iRegP dst, iRegN src) %{ instruct decodeHeapOop(iRegP dst, iRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull &&
n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant);
match(Set dst (DecodeN src)); match(Set dst (DecodeN src));
format %{ "decode_heap_oop $src, $dst" %} format %{ "decode_heap_oop $src, $dst" %}
ins_encode %{ ins_encode %{
...@@ -5985,7 +5986,8 @@ instruct decodeHeapOop(iRegP dst, iRegN src) %{ ...@@ -5985,7 +5986,8 @@ instruct decodeHeapOop(iRegP dst, iRegN src) %{
%} %}
instruct decodeHeapOop_not_null(iRegP dst, iRegN src) %{ instruct decodeHeapOop_not_null(iRegP dst, iRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull ||
n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant);
match(Set dst (DecodeN src)); match(Set dst (DecodeN src));
format %{ "decode_heap_oop_not_null $src, $dst" %} format %{ "decode_heap_oop_not_null $src, $dst" %}
ins_encode %{ ins_encode %{
...@@ -6677,10 +6679,9 @@ instruct compareAndSwapP_bool(iRegP mem_ptr, iRegP oldval, iRegP newval, iRegI r ...@@ -6677,10 +6679,9 @@ instruct compareAndSwapP_bool(iRegP mem_ptr, iRegP oldval, iRegP newval, iRegI r
ins_pipe( long_memory_op ); ins_pipe( long_memory_op );
%} %}
instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp, flagsReg ccr ) %{ instruct compareAndSwapN_bool(iRegP mem_ptr, iRegN oldval, iRegN newval, iRegI res, o7RegI tmp1, flagsReg ccr ) %{
match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval))); match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval)));
effect( USE mem_ptr, KILL ccr, KILL tmp); effect( USE mem_ptr, KILL ccr, KILL tmp1);
format %{ format %{
"MOV $newval,O7\n\t" "MOV $newval,O7\n\t"
"CASA [$mem_ptr],$oldval,O7\t! If $oldval==[$mem_ptr] Then store O7 into [$mem_ptr], set O7=[$mem_ptr] in any case\n\t" "CASA [$mem_ptr],$oldval,O7\t! If $oldval==[$mem_ptr] Then store O7 into [$mem_ptr], set O7=[$mem_ptr] in any case\n\t"
...@@ -6688,18 +6689,8 @@ instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iR ...@@ -6688,18 +6689,8 @@ instruct compareAndSwapN_bool_comp(iRegP mem_ptr, iRegN oldval, iRegN newval, iR
"MOV 1,$res\n\t" "MOV 1,$res\n\t"
"MOVne icc,R_G0,$res" "MOVne icc,R_G0,$res"
%} %}
ins_encode %{ ins_encode( enc_casi(mem_ptr, oldval, newval),
Register Rmem = reg_to_register_object($mem_ptr$$reg); enc_iflags_ne_to_boolean(res) );
Register Rold = reg_to_register_object($oldval$$reg);
Register Rnew = reg_to_register_object($newval$$reg);
Register Rres = reg_to_register_object($res$$reg);
__ cas(Rmem, Rold, Rnew);
__ cmp( Rold, Rnew );
__ mov(1, Rres);
__ movcc( Assembler::notEqual, false, Assembler::icc, G0, Rres );
%}
ins_pipe( long_memory_op ); ins_pipe( long_memory_op );
%} %}
......
...@@ -5007,8 +5007,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re ...@@ -5007,8 +5007,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
jcc(Assembler::notEqual, cas_label); jcc(Assembler::notEqual, cas_label);
// The bias pattern is present in the object's header. Need to check // The bias pattern is present in the object's header. Need to check
// whether the bias owner and the epoch are both still current. // whether the bias owner and the epoch are both still current.
load_klass(tmp_reg, obj_reg); load_prototype_header(tmp_reg, obj_reg);
movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
orq(tmp_reg, r15_thread); orq(tmp_reg, r15_thread);
xorq(tmp_reg, swap_reg); xorq(tmp_reg, swap_reg);
andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place)); andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
...@@ -5082,8 +5081,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re ...@@ -5082,8 +5081,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
// //
// FIXME: due to a lack of registers we currently blow away the age // FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them. // bits in this situation. Should attempt to preserve them.
load_klass(tmp_reg, obj_reg); load_prototype_header(tmp_reg, obj_reg);
movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
orq(tmp_reg, r15_thread); orq(tmp_reg, r15_thread);
if (os::is_MP()) { if (os::is_MP()) {
lock(); lock();
...@@ -5113,8 +5111,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re ...@@ -5113,8 +5111,7 @@ int MacroAssembler::biased_locking_enter(Register lock_reg, Register obj_reg, Re
// //
// FIXME: due to a lack of registers we currently blow away the age // FIXME: due to a lack of registers we currently blow away the age
// bits in this situation. Should attempt to preserve them. // bits in this situation. Should attempt to preserve them.
load_klass(tmp_reg, obj_reg); load_prototype_header(tmp_reg, obj_reg);
movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
if (os::is_MP()) { if (os::is_MP()) {
lock(); lock();
} }
...@@ -5158,6 +5155,16 @@ void MacroAssembler::load_klass(Register dst, Register src) { ...@@ -5158,6 +5155,16 @@ void MacroAssembler::load_klass(Register dst, Register src) {
} }
} }
void MacroAssembler::load_prototype_header(Register dst, Register src) {
if (UseCompressedOops) {
movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
} else {
movq(dst, Address(src, oopDesc::klass_offset_in_bytes()));
movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
}
}
void MacroAssembler::store_klass(Register dst, Register src) { void MacroAssembler::store_klass(Register dst, Register src) {
if (UseCompressedOops) { if (UseCompressedOops) {
encode_heap_oop_not_null(src); encode_heap_oop_not_null(src);
...@@ -5282,6 +5289,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) { ...@@ -5282,6 +5289,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register r) {
assert (UseCompressedOops, "should only be used for compressed headers"); assert (UseCompressedOops, "should only be used for compressed headers");
// Cannot assert, unverified entry point counts instructions (see .ad file) // Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit. // vtableStubs also counts instructions in pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong"); assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong");
leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); leaq(r, Address(r12_heapbase, r, Address::times_8, 0));
} }
...@@ -5290,6 +5298,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { ...@@ -5290,6 +5298,7 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
assert (UseCompressedOops, "should only be used for compressed headers"); assert (UseCompressedOops, "should only be used for compressed headers");
// Cannot assert, unverified entry point counts instructions (see .ad file) // Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit. // vtableStubs also counts instructions in pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong"); assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong");
leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
} }
......
...@@ -1111,6 +1111,8 @@ class MacroAssembler : public Assembler { ...@@ -1111,6 +1111,8 @@ class MacroAssembler : public Assembler {
void store_klass(Register dst, Register src); void store_klass(Register dst, Register src);
void store_klass_gap(Register dst, Register src); void store_klass_gap(Register dst, Register src);
void load_prototype_header(Register dst, Register src);
void load_heap_oop(Register dst, Address src); void load_heap_oop(Register dst, Address src);
void store_heap_oop(Address dst, Register src); void store_heap_oop(Address dst, Register src);
void encode_heap_oop(Register r); void encode_heap_oop(Register r);
......
...@@ -233,7 +233,7 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, ...@@ -233,7 +233,7 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
assert(Rsub_klass != rcx, "rcx holds 2ndary super array length"); assert(Rsub_klass != rcx, "rcx holds 2ndary super array length");
assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr"); assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr");
Label not_subtype, loop; Label not_subtype, not_subtype_pop, loop;
// Profile the not-null value's klass. // Profile the not-null value's klass.
profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, rdi profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, rdi
...@@ -272,12 +272,13 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, ...@@ -272,12 +272,13 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
// and we store values in objArrays always encoded, thus we need to encode value // and we store values in objArrays always encoded, thus we need to encode value
// before repne // before repne
if (UseCompressedOops) { if (UseCompressedOops) {
pushq(rax);
encode_heap_oop(rax); encode_heap_oop(rax);
repne_scanl(); repne_scanl();
// Not equal? // Not equal?
jcc(Assembler::notEqual, not_subtype); jcc(Assembler::notEqual, not_subtype_pop);
// decode heap oop here for movq // restore heap oop here for movq
decode_heap_oop(rax); popq(rax);
} else { } else {
repne_scanq(); repne_scanq();
jcc(Assembler::notEqual, not_subtype); jcc(Assembler::notEqual, not_subtype);
...@@ -287,9 +288,10 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, ...@@ -287,9 +288,10 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
Klass::secondary_super_cache_offset_in_bytes()), rax); Klass::secondary_super_cache_offset_in_bytes()), rax);
jmp(ok_is_subtype); jmp(ok_is_subtype);
bind(not_subtype_pop);
// restore heap oop here for miss
if (UseCompressedOops) popq(rax);
bind(not_subtype); bind(not_subtype);
// decode heap oop here for miss
if (UseCompressedOops) decode_heap_oop(rax);
profile_typecheck_failed(rcx); // blows rcx profile_typecheck_failed(rcx); // blows rcx
} }
......
...@@ -6149,7 +6149,7 @@ instruct loadNKlass(rRegN dst, memory mem) ...@@ -6149,7 +6149,7 @@ instruct loadNKlass(rRegN dst, memory mem)
match(Set dst (LoadNKlass mem)); match(Set dst (LoadNKlass mem));
ins_cost(125); // XXX ins_cost(125); // XXX
format %{ "movl $dst, $mem\t# compressed klass ptr\n\t" %} format %{ "movl $dst, $mem\t# compressed klass ptr" %}
ins_encode %{ ins_encode %{
Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp);
Register dst = as_Register($dst$$reg); Register dst = as_Register($dst$$reg);
...@@ -7089,7 +7089,8 @@ instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ ...@@ -7089,7 +7089,8 @@ instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
%} %}
instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull &&
n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant);
match(Set dst (DecodeN src)); match(Set dst (DecodeN src));
effect(KILL cr); effect(KILL cr);
format %{ "decode_heap_oop $dst,$src" %} format %{ "decode_heap_oop $dst,$src" %}
...@@ -7105,7 +7106,8 @@ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ ...@@ -7105,7 +7106,8 @@ instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{
%} %}
instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{ instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{
predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull ||
n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant);
match(Set dst (DecodeN src)); match(Set dst (DecodeN src));
format %{ "decode_heap_oop_not_null $dst,$src" %} format %{ "decode_heap_oop_not_null $dst,$src" %}
ins_encode %{ ins_encode %{
......
...@@ -878,7 +878,7 @@ int ciMethod::instructions_size() { ...@@ -878,7 +878,7 @@ int ciMethod::instructions_size() {
(TieredCompilation && code->compiler() != NULL && code->compiler()->is_c1())) { (TieredCompilation && code->compiler() != NULL && code->compiler()->is_c1())) {
return 0; return 0;
} }
return code->code_size(); return code->code_end() - code->verified_entry_point();
) )
} }
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
// Used for backward compatibility reasons: // Used for backward compatibility reasons:
// - to check for javac bug fixes that happened after 1.5 // - to check for javac bug fixes that happened after 1.5
// - also used as the max version when running in jdk6
#define JAVA_6_VERSION 50 #define JAVA_6_VERSION 50
...@@ -3507,9 +3508,11 @@ bool ClassFileParser::has_illegal_visibility(jint flags) { ...@@ -3507,9 +3508,11 @@ bool ClassFileParser::has_illegal_visibility(jint flags) {
} }
bool ClassFileParser::is_supported_version(u2 major, u2 minor) { bool ClassFileParser::is_supported_version(u2 major, u2 minor) {
u2 max_version = JDK_Version::is_gte_jdk17x_version() ?
JAVA_MAX_SUPPORTED_VERSION : JAVA_6_VERSION;
return (major >= JAVA_MIN_SUPPORTED_VERSION) && return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
(major <= JAVA_MAX_SUPPORTED_VERSION) && (major <= max_version) &&
((major != JAVA_MAX_SUPPORTED_VERSION) || ((major != max_version) ||
(minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION)); (minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
} }
......
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- <!--
6opyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation. published by the Free Software Foundation.
This code is distributed in the hope that it will be useful, but WITHOUT This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that version 2 for more details (a copy is included in the LICENSE file that
accompanied this code). accompanied this code).
You should have received a copy of the GNU General Public License version You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation, 2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
CA 95054 USA or visit www.sun.com if you need additional information or CA 95054 USA or visit www.sun.com if you need additional information or
have any questions. have any questions.
--> -->
<!DOCTYPE processcode [ <!DOCTYPE processcode [
<!ELEMENT processcode ANY> <!ELEMENT processcode ANY>
......
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- <!--
Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation. published by the Free Software Foundation.
This code is distributed in the hope that it will be useful, but WITHOUT This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that version 2 for more details (a copy is included in the LICENSE file that
accompanied this code). accompanied this code).
You should have received a copy of the GNU General Public License version You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation, 2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
CA 95054 USA or visit www.sun.com if you need additional information or CA 95054 USA or visit www.sun.com if you need additional information or
have any questions. have any questions.
--> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
......
...@@ -1621,64 +1621,6 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { ...@@ -1621,64 +1621,6 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
if (opt != NULL) return opt; if (opt != NULL) return opt;
} }
if (in(1) != NULL && in(1)->Opcode() == Op_AddP && can_reshape) {
// Try to undo Phi of AddP:
// (Phi (AddP base base y) (AddP base2 base2 y))
// becomes:
// newbase := (Phi base base2)
// (AddP newbase newbase y)
//
// This occurs as a result of unsuccessful split_thru_phi and
// interferes with taking advantage of addressing modes. See the
// clone_shift_expressions code in matcher.cpp
Node* addp = in(1);
const Type* type = addp->in(AddPNode::Base)->bottom_type();
Node* y = addp->in(AddPNode::Offset);
if (y != NULL && addp->in(AddPNode::Base) == addp->in(AddPNode::Address)) {
// make sure that all the inputs are similar to the first one,
// i.e. AddP with base == address and same offset as first AddP
bool doit = true;
for (uint i = 2; i < req(); i++) {
if (in(i) == NULL ||
in(i)->Opcode() != Op_AddP ||
in(i)->in(AddPNode::Base) != in(i)->in(AddPNode::Address) ||
in(i)->in(AddPNode::Offset) != y) {
doit = false;
break;
}
// Accumulate type for resulting Phi
type = type->meet(in(i)->in(AddPNode::Base)->bottom_type());
}
Node* base = NULL;
if (doit) {
// Check for neighboring AddP nodes in a tree.
// If they have a base, use that it.
for (DUIterator_Fast kmax, k = this->fast_outs(kmax); k < kmax; k++) {
Node* u = this->fast_out(k);
if (u->is_AddP()) {
Node* base2 = u->in(AddPNode::Base);
if (base2 != NULL && !base2->is_top()) {
if (base == NULL)
base = base2;
else if (base != base2)
{ doit = false; break; }
}
}
}
}
if (doit) {
if (base == NULL) {
base = new (phase->C, in(0)->req()) PhiNode(in(0), type, NULL);
for (uint i = 1; i < req(); i++) {
base->init_req(i, in(i)->in(AddPNode::Base));
}
phase->is_IterGVN()->register_new_node_with_optimizer(base);
}
return new (phase->C, 4) AddPNode(base, base, y);
}
}
}
// Split phis through memory merges, so that the memory merges will go away. // Split phis through memory merges, so that the memory merges will go away.
// Piggy-back this transformation on the search for a unique input.... // Piggy-back this transformation on the search for a unique input....
// It will be as if the merged memory is the unique value of the phi. // It will be as if the merged memory is the unique value of the phi.
......
...@@ -1992,11 +1992,49 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { ...@@ -1992,11 +1992,49 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) {
} }
case Op_AddP: { // Assert sane base pointers case Op_AddP: { // Assert sane base pointers
const Node *addp = n->in(AddPNode::Address); Node *addp = n->in(AddPNode::Address);
assert( !addp->is_AddP() || assert( !addp->is_AddP() ||
addp->in(AddPNode::Base)->is_top() || // Top OK for allocation addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
addp->in(AddPNode::Base) == n->in(AddPNode::Base), addp->in(AddPNode::Base) == n->in(AddPNode::Base),
"Base pointers must match" ); "Base pointers must match" );
#ifdef _LP64
if (UseCompressedOops &&
addp->Opcode() == Op_ConP &&
addp == n->in(AddPNode::Base) &&
n->in(AddPNode::Offset)->is_Con()) {
// Use addressing with narrow klass to load with offset on x86.
// On sparc loading 32-bits constant and decoding it have less
// instructions (4) then load 64-bits constant (7).
// Do this transformation here since IGVN will convert ConN back to ConP.
const Type* t = addp->bottom_type();
if (t->isa_oopptr()) {
Node* nn = NULL;
// Look for existing ConN node of the same exact type.
Compile* C = Compile::current();
Node* r = C->root();
uint cnt = r->outcnt();
for (uint i = 0; i < cnt; i++) {
Node* m = r->raw_out(i);
if (m!= NULL && m->Opcode() == Op_ConN &&
m->bottom_type()->is_narrowoop()->make_oopptr() == t) {
nn = m;
break;
}
}
if (nn != NULL) {
// Decode a narrow oop to match address
// [R12 + narrow_oop_reg<<3 + offset]
nn = new (C, 2) DecodeNNode(nn, t);
n->set_req(AddPNode::Base, nn);
n->set_req(AddPNode::Address, nn);
if (addp->outcnt() == 0) {
addp->disconnect_inputs(NULL);
}
}
}
}
#endif
break; break;
} }
......
...@@ -940,6 +940,7 @@ const Type *TypeD::xmeet( const Type *t ) const { ...@@ -940,6 +940,7 @@ const Type *TypeD::xmeet( const Type *t ) const {
case InstPtr: case InstPtr:
case KlassPtr: case KlassPtr:
case AryPtr: case AryPtr:
case NarrowOop:
case Int: case Int:
case Long: case Long:
case FloatTop: case FloatTop:
...@@ -1086,6 +1087,7 @@ const Type *TypeInt::xmeet( const Type *t ) const { ...@@ -1086,6 +1087,7 @@ const Type *TypeInt::xmeet( const Type *t ) const {
case InstPtr: case InstPtr:
case KlassPtr: case KlassPtr:
case AryPtr: case AryPtr:
case NarrowOop:
case Long: case Long:
case FloatTop: case FloatTop:
case FloatCon: case FloatCon:
...@@ -1093,7 +1095,6 @@ const Type *TypeInt::xmeet( const Type *t ) const { ...@@ -1093,7 +1095,6 @@ const Type *TypeInt::xmeet( const Type *t ) const {
case DoubleTop: case DoubleTop:
case DoubleCon: case DoubleCon:
case DoubleBot: case DoubleBot:
case NarrowOop:
case Bottom: // Ye Olde Default case Bottom: // Ye Olde Default
return Type::BOTTOM; return Type::BOTTOM;
default: // All else is a mistake default: // All else is a mistake
...@@ -1328,6 +1329,7 @@ const Type *TypeLong::xmeet( const Type *t ) const { ...@@ -1328,6 +1329,7 @@ const Type *TypeLong::xmeet( const Type *t ) const {
case InstPtr: case InstPtr:
case KlassPtr: case KlassPtr:
case AryPtr: case AryPtr:
case NarrowOop:
case Int: case Int:
case FloatTop: case FloatTop:
case FloatCon: case FloatCon:
......
...@@ -1176,7 +1176,9 @@ void Arguments::set_ergonomics_flags() { ...@@ -1176,7 +1176,9 @@ void Arguments::set_ergonomics_flags() {
// by ergonomics. // by ergonomics.
if (!UseConcMarkSweepGC && MaxHeapSize <= max_heap_for_compressed_oops()) { if (!UseConcMarkSweepGC && MaxHeapSize <= max_heap_for_compressed_oops()) {
if (FLAG_IS_DEFAULT(UseCompressedOops)) { if (FLAG_IS_DEFAULT(UseCompressedOops)) {
FLAG_SET_ERGO(bool, UseCompressedOops, true); // Leave compressed oops off by default. Uncomment
// the following line to return it to default status.
// FLAG_SET_ERGO(bool, UseCompressedOops, true);
} }
} else { } else {
if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) { if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) {
......
...@@ -68,8 +68,24 @@ class JDK_Version : AllStatic { ...@@ -68,8 +68,24 @@ class JDK_Version : AllStatic {
static bool is_jdk13x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 3; } static bool is_jdk13x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 3; }
static bool is_jdk14x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 4; } static bool is_jdk14x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 4; }
static bool is_jdk15x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 5; } static bool is_jdk15x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 5; }
static bool is_jdk16x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 6; }
static bool is_jdk17x_version() { assert(is_jdk_version_initialized(), "must have been initialized"); return _jdk_version == 7; } static bool is_jdk16x_version() {
if (is_jdk_version_initialized()) {
return _jdk_version == 6;
} else {
assert(is_pre_jdk16_version(), "must have been initialized");
return false;
}
}
static bool is_jdk17x_version() {
if (is_jdk_version_initialized()) {
return _jdk_version == 7;
} else {
assert(is_pre_jdk16_version(), "must have been initialized");
return false;
}
}
static bool supports_thread_park_blocker() { return _version_info.thread_park_blocker; } static bool supports_thread_park_blocker() { return _version_info.thread_park_blocker; }
...@@ -85,14 +101,22 @@ class JDK_Version : AllStatic { ...@@ -85,14 +101,22 @@ class JDK_Version : AllStatic {
} }
static bool is_gte_jdk16x_version() { static bool is_gte_jdk16x_version() {
// Keep the semantics of this that the version number is >= 1.6 // Keep the semantics of this that the version number is >= 1.6
assert(is_jdk_version_initialized(), "Not initialized"); if (is_jdk_version_initialized()) {
return _jdk_version >= 6; return _jdk_version >= 6;
} else {
assert(is_pre_jdk16_version(), "Not initialized");
return false;
}
} }
static bool is_gte_jdk17x_version() { static bool is_gte_jdk17x_version() {
// Keep the semantics of this that the version number is >= 1.7 // Keep the semantics of this that the version number is >= 1.7
assert(is_jdk_version_initialized(), "Not initialized"); if (is_jdk_version_initialized()) {
return _jdk_version >= 7; return _jdk_version >= 7;
} else {
assert(is_pre_jdk16_version(), "Not initialized");
return false;
}
} }
static bool is_jdk_version_initialized() { static bool is_jdk_version_initialized() {
......
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* * This code is free software; you can redistribute it and/or modify it
* * under the terms of the GNU General Public License version 2 only, as
* * published by the Free Software Foundation.
* *
* * This code is distributed in the hope that it will be useful, but WITHOUT
* * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* * version 2 for more details (a copy is included in the LICENSE file that
* * accompanied this code).
* *
* * You should have received a copy of the GNU General Public License version
* * 2 along with this work; if not, write to the Free Software Foundation,
* * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* * CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
* *
*/ */
......
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* * This code is free software; you can redistribute it and/or modify it
* * under the terms of the GNU General Public License version 2 only, as
* * published by the Free Software Foundation.
* *
* * This code is distributed in the hope that it will be useful, but WITHOUT
* * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* * version 2 for more details (a copy is included in the LICENSE file that
* * accompanied this code).
* *
* * You should have received a copy of the GNU General Public License version
* * 2 along with this work; if not, write to the Free Software Foundation,
* * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* * CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
* *
*/ */
......
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* * This code is free software; you can redistribute it and/or modify it
* * under the terms of the GNU General Public License version 2 only, as
* * published by the Free Software Foundation.
* *
* * This code is distributed in the hope that it will be useful, but WITHOUT
* * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* * version 2 for more details (a copy is included in the LICENSE file that
* * accompanied this code).
* *
* * You should have received a copy of the GNU General Public License version
* * 2 along with this work; if not, write to the Free Software Foundation,
* * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* * CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
* *
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册