Mon, 28 Apr 2008 08:08:12 -0700
Merge
1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp Wed Apr 23 06:35:28 2008 -0400 1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp Mon Apr 28 08:08:12 2008 -0700 1.3 @@ -3647,6 +3647,12 @@ 1.4 srlx(r, LogMinObjAlignmentInBytes, r); 1.5 } 1.6 1.7 +void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) { 1.8 + assert (UseCompressedOops, "must be compressed"); 1.9 + sub(src, G6_heapbase, dst); 1.10 + srlx(dst, LogMinObjAlignmentInBytes, dst); 1.11 +} 1.12 + 1.13 // Same algorithm as oops.inline.hpp decode_heap_oop. 1.14 void MacroAssembler::decode_heap_oop(Register src, Register dst) { 1.15 assert (UseCompressedOops, "must be compressed"); 1.16 @@ -3665,6 +3671,14 @@ 1.17 add(r, G6_heapbase, r); 1.18 } 1.19 1.20 +void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) { 1.21 + // Do not add assert code to this unless you change vtableStubs_sparc.cpp 1.22 + // pd_code_size_limit. 1.23 + assert (UseCompressedOops, "must be compressed"); 1.24 + sllx(src, LogMinObjAlignmentInBytes, dst); 1.25 + add(dst, G6_heapbase, dst); 1.26 +} 1.27 + 1.28 void MacroAssembler::reinit_heapbase() { 1.29 if (UseCompressedOops) { 1.30 // call indirectly to solve generation ordering problem
2.1 --- a/src/cpu/sparc/vm/assembler_sparc.hpp Wed Apr 23 06:35:28 2008 -0400 2.2 +++ b/src/cpu/sparc/vm/assembler_sparc.hpp Mon Apr 28 08:08:12 2008 -0700 2.3 @@ -1998,6 +1998,8 @@ 2.4 } 2.5 void encode_heap_oop_not_null(Register r); 2.6 void decode_heap_oop_not_null(Register r); 2.7 + void encode_heap_oop_not_null(Register src, Register dst); 2.8 + void decode_heap_oop_not_null(Register src, Register dst); 2.9 2.10 // Support for managing the JavaThread pointer (i.e.; the reference to 2.11 // thread-local information).
3.1 --- a/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Wed Apr 23 06:35:28 2008 -0400 3.2 +++ b/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Mon Apr 28 08:08:12 2008 -0700 3.3 @@ -78,7 +78,7 @@ 3.4 3.5 #define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)]) 3.6 #define LOCALS_ADDR(offset) ((address)locals[-(offset)]) 3.7 -#define LOCALS_INT(offset) ((jint)(locals[-(offset)])) 3.8 +#define LOCALS_INT(offset) (*((jint*)&locals[-(offset)])) 3.9 #define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)])) 3.10 #define LOCALS_OBJECT(offset) ((oop)locals[-(offset)]) 3.11 #define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d)
4.1 --- a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Wed Apr 23 06:35:28 2008 -0400 4.2 +++ b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Mon Apr 28 08:08:12 2008 -0700 4.3 @@ -159,7 +159,7 @@ 4.4 break; 4.5 case T_LONG : 4.6 #ifndef _LP64 4.7 -#if !defined(_LP64) && defined(COMPILER2) 4.8 +#if defined(COMPILER2) 4.9 // All return values are where we want them, except for Longs. C2 returns 4.10 // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1. 4.11 // Since the interpreter will return longs in G1 and O0/O1 in the 32bit 4.12 @@ -173,10 +173,9 @@ 4.13 // native result is in O0, O1 4.14 __ st(O1, L1_scratch, 0); // Low order 4.15 __ st(O0, L1_scratch, -wordSize); // High order 4.16 -#endif /* !_LP64 && COMPILER2 */ 4.17 +#endif /* COMPILER2 */ 4.18 #else 4.19 - __ stx(O0, L1_scratch, 0); 4.20 -__ breakpoint_trap(); 4.21 + __ stx(O0, L1_scratch, -wordSize); 4.22 #endif 4.23 __ sub(L1_scratch, 2*wordSize, L1_scratch); 4.24 break; 4.25 @@ -237,7 +236,6 @@ 4.26 case T_VOID: break; 4.27 break; 4.28 case T_FLOAT : 4.29 - __ breakpoint_trap(Assembler::zero); 4.30 case T_BOOLEAN: 4.31 case T_CHAR : 4.32 case T_BYTE : 4.33 @@ -255,11 +253,7 @@ 4.34 // except we allocated one extra word for this intepretState so we won't overwrite it 4.35 // when we return a two word result. 4.36 #ifdef _LP64 4.37 -__ breakpoint_trap(); 4.38 - // Hmm now that longs are in one entry should "_ptr" really be "x"? 4.39 __ ld_ptr(O0, 0, O2); 4.40 - __ ld_ptr(O0, wordSize, O3); 4.41 - __ st_ptr(O3, O1, 0); 4.42 __ st_ptr(O2, O1, -wordSize); 4.43 #else 4.44 __ ld(O0, 0, O2); 4.45 @@ -319,10 +313,7 @@ 4.46 // except we allocated one extra word for this intepretState so we won't overwrite it 4.47 // when we return a two word result. 4.48 #ifdef _LP64 4.49 -__ breakpoint_trap(); 4.50 - // Hmm now that longs are in one entry should "_ptr" really be "x"? 4.51 __ ld_ptr(O0, 0, O0->after_save()); 4.52 - __ ld_ptr(O0, wordSize, O1->after_save()); 4.53 #else 4.54 __ ld(O0, wordSize, O1->after_save()); 4.55 __ ld(O0, 0, O0->after_save()); 4.56 @@ -1373,7 +1364,7 @@ 4.57 __ delayed()->ld_ptr(L1_scratch, entry_size, L3_scratch); 4.58 4.59 // now zero the slot so we can find it. 4.60 - __ st(G0, L4_scratch, BasicObjectLock::obj_offset_in_bytes()); 4.61 + __ st_ptr(G0, L4_scratch, BasicObjectLock::obj_offset_in_bytes()); 4.62 4.63 } 4.64 4.65 @@ -1713,7 +1704,7 @@ 4.66 __ lduh(L4_scratch, in_bytes(methodOopDesc::size_of_parameters_offset()), L2_scratch); // get parameter size 4.67 __ sll(L2_scratch, LogBytesPerWord, L2_scratch ); // parameter size in bytes 4.68 __ add(L1_scratch, L2_scratch, L1_scratch); // stack destination for result 4.69 - __ ld_ptr(L4_scratch, in_bytes(methodOopDesc::result_index_offset()), L3_scratch); // called method result type index 4.70 + __ ld(L4_scratch, in_bytes(methodOopDesc::result_index_offset()), L3_scratch); // called method result type index 4.71 4.72 // tosca is really just native abi 4.73 __ set((intptr_t)CppInterpreter::_tosca_to_stack, L4_scratch); 4.74 @@ -1757,7 +1748,7 @@ 4.75 4.76 __ ld_ptr(STATE(_prev_link), L1_scratch); 4.77 __ ld_ptr(STATE(_method), L2_scratch); // get method just executed 4.78 - __ ld_ptr(L2_scratch, in_bytes(methodOopDesc::result_index_offset()), L2_scratch); 4.79 + __ ld(L2_scratch, in_bytes(methodOopDesc::result_index_offset()), L2_scratch); 4.80 __ tst(L1_scratch); 4.81 __ brx(Assembler::zero, false, Assembler::pt, return_to_initial_caller); 4.82 __ delayed()->sll(L2_scratch, LogBytesPerWord, L2_scratch); 4.83 @@ -1923,10 +1914,10 @@ 4.84 // compute the unused java stack size 4.85 __ sub(Gargs, L1_scratch, L2_scratch); // compute unused space 4.86 4.87 - // Round down the unused space to that stack is always aligned 4.88 - // by making the unused space a multiple of the size of a long. 4.89 + // Round down the unused space to that stack is always 16-byte aligned 4.90 + // by making the unused space a multiple of the size of two longs. 4.91 4.92 - __ and3(L2_scratch, -BytesPerLong, L2_scratch); 4.93 + __ and3(L2_scratch, -2*BytesPerLong, L2_scratch); 4.94 4.95 // Now trim the stack 4.96 __ add(SP, L2_scratch, SP); 4.97 @@ -2176,6 +2167,9 @@ 4.98 // MUCHO HACK 4.99 4.100 intptr_t* frame_bottom = interpreter_frame->sp() - (full_frame_words - frame_words); 4.101 + // 'interpreter_frame->sp()' is unbiased while 'frame_bottom' must be a biased value in 64bit mode. 4.102 + assert(((intptr_t)frame_bottom & 0xf) == 0, "SP biased in layout_activation"); 4.103 + frame_bottom = (intptr_t*)((intptr_t)frame_bottom - STACK_BIAS); 4.104 4.105 /* Now fillin the interpreterState object */ 4.106
5.1 --- a/src/cpu/sparc/vm/sparc.ad Wed Apr 23 06:35:28 2008 -0400 5.2 +++ b/src/cpu/sparc/vm/sparc.ad Mon Apr 28 08:08:12 2008 -0700 5.3 @@ -5957,15 +5957,27 @@ 5.4 5.5 // Convert oop pointer into compressed form 5.6 instruct encodeHeapOop(iRegN dst, iRegP src) %{ 5.7 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull); 5.8 match(Set dst (EncodeP src)); 5.9 - format %{ "SRL $src,3,$dst\t encodeHeapOop" %} 5.10 + format %{ "encode_heap_oop $src, $dst" %} 5.11 ins_encode %{ 5.12 __ encode_heap_oop($src$$Register, $dst$$Register); 5.13 %} 5.14 ins_pipe(ialu_reg); 5.15 %} 5.16 5.17 +instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{ 5.18 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull); 5.19 + match(Set dst (EncodeP src)); 5.20 + format %{ "encode_heap_oop_not_null $src, $dst" %} 5.21 + ins_encode %{ 5.22 + __ encode_heap_oop_not_null($src$$Register, $dst$$Register); 5.23 + %} 5.24 + ins_pipe(ialu_reg); 5.25 +%} 5.26 + 5.27 instruct decodeHeapOop(iRegP dst, iRegN src) %{ 5.28 + predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); 5.29 match(Set dst (DecodeN src)); 5.30 format %{ "decode_heap_oop $src, $dst" %} 5.31 ins_encode %{ 5.32 @@ -5974,6 +5986,16 @@ 5.33 ins_pipe(ialu_reg); 5.34 %} 5.35 5.36 +instruct decodeHeapOop_not_null(iRegP dst, iRegN src) %{ 5.37 + predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); 5.38 + match(Set dst (DecodeN src)); 5.39 + format %{ "decode_heap_oop_not_null $src, $dst" %} 5.40 + ins_encode %{ 5.41 + __ decode_heap_oop_not_null($src$$Register, $dst$$Register); 5.42 + %} 5.43 + ins_pipe(ialu_reg); 5.44 +%} 5.45 + 5.46 5.47 // Store Zero into Aligned Packed Bytes 5.48 instruct storeA8B0(memory mem, immI0 zero) %{
6.1 --- a/src/cpu/x86/vm/assembler_x86_64.cpp Wed Apr 23 06:35:28 2008 -0400 6.2 +++ b/src/cpu/x86/vm/assembler_x86_64.cpp Mon Apr 28 08:08:12 2008 -0700 6.3 @@ -4150,7 +4150,7 @@ 6.4 if (oop_result->is_valid()) { 6.5 movq(oop_result, Address(r15_thread, JavaThread::vm_result_offset())); 6.6 movptr(Address(r15_thread, JavaThread::vm_result_offset()), NULL_WORD); 6.7 - verify_oop(oop_result); 6.8 + verify_oop(oop_result, "broken oop in call_VM_base"); 6.9 } 6.10 } 6.11 6.12 @@ -4689,6 +4689,10 @@ 6.13 popq(r12); 6.14 } 6.15 6.16 +#ifndef PRODUCT 6.17 +extern "C" void findpc(intptr_t x); 6.18 +#endif 6.19 + 6.20 void MacroAssembler::debug(char* msg, int64_t pc, int64_t regs[]) { 6.21 // In order to get locks to work, we need to fake a in_VM state 6.22 if (ShowMessageBoxOnError ) { 6.23 @@ -4707,6 +4711,11 @@ 6.24 if (os::message_box(msg, "Execution stopped, print registers?")) { 6.25 ttyLocker ttyl; 6.26 tty->print_cr("rip = 0x%016lx", pc); 6.27 +#ifndef PRODUCT 6.28 + tty->cr(); 6.29 + findpc(pc); 6.30 + tty->cr(); 6.31 +#endif 6.32 tty->print_cr("rax = 0x%016lx", regs[15]); 6.33 tty->print_cr("rbx = 0x%016lx", regs[12]); 6.34 tty->print_cr("rcx = 0x%016lx", regs[14]); 6.35 @@ -5187,7 +5196,7 @@ 6.36 bind(ok); 6.37 popq(rscratch1); 6.38 #endif 6.39 - verify_oop(r); 6.40 + verify_oop(r, "broken oop in encode_heap_oop"); 6.41 testq(r, r); 6.42 cmovq(Assembler::equal, r, r12_heapbase); 6.43 subq(r, r12_heapbase); 6.44 @@ -5203,11 +5212,28 @@ 6.45 stop("null oop passed to encode_heap_oop_not_null"); 6.46 bind(ok); 6.47 #endif 6.48 - verify_oop(r); 6.49 + verify_oop(r, "broken oop in encode_heap_oop_not_null"); 6.50 subq(r, r12_heapbase); 6.51 shrq(r, LogMinObjAlignmentInBytes); 6.52 } 6.53 6.54 +void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) { 6.55 + assert (UseCompressedOops, "should be compressed"); 6.56 +#ifdef ASSERT 6.57 + Label ok; 6.58 + testq(src, src); 6.59 + jcc(Assembler::notEqual, ok); 6.60 + stop("null oop passed to encode_heap_oop_not_null2"); 6.61 + bind(ok); 6.62 +#endif 6.63 + verify_oop(src, "broken oop in encode_heap_oop_not_null2"); 6.64 + if (dst != src) { 6.65 + movq(dst, src); 6.66 + } 6.67 + subq(dst, r12_heapbase); 6.68 + shrq(dst, LogMinObjAlignmentInBytes); 6.69 +} 6.70 + 6.71 void MacroAssembler::decode_heap_oop(Register r) { 6.72 assert (UseCompressedOops, "should be compressed"); 6.73 #ifdef ASSERT 6.74 @@ -5232,7 +5258,7 @@ 6.75 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 6.76 #endif 6.77 bind(done); 6.78 - verify_oop(r); 6.79 + verify_oop(r, "broken oop in decode_heap_oop"); 6.80 } 6.81 6.82 void MacroAssembler::decode_heap_oop_not_null(Register r) { 6.83 @@ -5243,6 +5269,14 @@ 6.84 leaq(r, Address(r12_heapbase, r, Address::times_8, 0)); 6.85 } 6.86 6.87 +void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) { 6.88 + assert (UseCompressedOops, "should only be used for compressed headers"); 6.89 + // Cannot assert, unverified entry point counts instructions (see .ad file) 6.90 + // vtableStubs also counts instructions in pd_code_size_limit. 6.91 + assert(Address::times_8 == LogMinObjAlignmentInBytes, "decode alg wrong"); 6.92 + leaq(dst, Address(r12_heapbase, src, Address::times_8, 0)); 6.93 +} 6.94 + 6.95 Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) { 6.96 switch (cond) { 6.97 // Note some conditions are synonyms for others
7.1 --- a/src/cpu/x86/vm/assembler_x86_64.hpp Wed Apr 23 06:35:28 2008 -0400 7.2 +++ b/src/cpu/x86/vm/assembler_x86_64.hpp Mon Apr 28 08:08:12 2008 -0700 7.3 @@ -1111,6 +1111,8 @@ 7.4 void decode_heap_oop(Register r); 7.5 void encode_heap_oop_not_null(Register r); 7.6 void decode_heap_oop_not_null(Register r); 7.7 + void encode_heap_oop_not_null(Register dst, Register src); 7.8 + void decode_heap_oop_not_null(Register dst, Register src); 7.9 7.10 // Stack frame creation/removal 7.11 void enter();
8.1 --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Wed Apr 23 06:35:28 2008 -0400 8.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Mon Apr 28 08:08:12 2008 -0700 8.3 @@ -913,11 +913,12 @@ 8.4 // Stack after saving c_rarg3: 8.5 // [tos + 0]: saved c_rarg3 8.6 // [tos + 1]: saved c_rarg2 8.7 - // [tos + 2]: saved flags 8.8 - // [tos + 3]: return address 8.9 - // * [tos + 4]: error message (char*) 8.10 - // * [tos + 5]: object to verify (oop) 8.11 - // * [tos + 6]: saved rax - saved by caller and bashed 8.12 + // [tos + 2]: saved r12 (several TemplateTable methods use it) 8.13 + // [tos + 3]: saved flags 8.14 + // [tos + 4]: return address 8.15 + // * [tos + 5]: error message (char*) 8.16 + // * [tos + 6]: object to verify (oop) 8.17 + // * [tos + 7]: saved rax - saved by caller and bashed 8.18 // * = popped on exit 8.19 address generate_verify_oop() { 8.20 StubCodeMark mark(this, "StubRoutines", "verify_oop"); 8.21 @@ -928,12 +929,24 @@ 8.22 __ pushfq(); 8.23 __ incrementl(ExternalAddress((address) StubRoutines::verify_oop_count_addr())); 8.24 8.25 + __ pushq(r12); 8.26 + 8.27 // save c_rarg2 and c_rarg3 8.28 __ pushq(c_rarg2); 8.29 __ pushq(c_rarg3); 8.30 8.31 + enum { 8.32 + // After previous pushes. 8.33 + oop_to_verify = 6 * wordSize, 8.34 + saved_rax = 7 * wordSize, 8.35 + 8.36 + // Before the call to MacroAssembler::debug(), see below. 8.37 + return_addr = 16 * wordSize, 8.38 + error_msg = 17 * wordSize 8.39 + }; 8.40 + 8.41 // get object 8.42 - __ movq(rax, Address(rsp, 5 * wordSize)); 8.43 + __ movq(rax, Address(rsp, oop_to_verify)); 8.44 8.45 // make sure object is 'reasonable' 8.46 __ testq(rax, rax); 8.47 @@ -946,6 +959,9 @@ 8.48 __ cmpq(c_rarg2, c_rarg3); 8.49 __ jcc(Assembler::notZero, error); 8.50 8.51 + // set r12 to heapbase for load_klass() 8.52 + __ reinit_heapbase(); 8.53 + 8.54 // make sure klass is 'reasonable' 8.55 __ load_klass(rax, rax); // get klass 8.56 __ testq(rax, rax); 8.57 @@ -971,40 +987,45 @@ 8.58 8.59 // return if everything seems ok 8.60 __ bind(exit); 8.61 - __ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back 8.62 - __ popq(c_rarg3); // restore c_rarg3 8.63 - __ popq(c_rarg2); // restore c_rarg2 8.64 + __ movq(rax, Address(rsp, saved_rax)); // get saved rax back 8.65 + __ popq(c_rarg3); // restore c_rarg3 8.66 + __ popq(c_rarg2); // restore c_rarg2 8.67 + __ popq(r12); // restore r12 8.68 __ popfq(); // restore flags 8.69 __ ret(3 * wordSize); // pop caller saved stuff 8.70 8.71 // handle errors 8.72 __ bind(error); 8.73 - __ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back 8.74 - __ popq(c_rarg3); // get saved c_rarg3 back 8.75 - __ popq(c_rarg2); // get saved c_rarg2 back 8.76 + __ movq(rax, Address(rsp, saved_rax)); // get saved rax back 8.77 + __ popq(c_rarg3); // get saved c_rarg3 back 8.78 + __ popq(c_rarg2); // get saved c_rarg2 back 8.79 + __ popq(r12); // get saved r12 back 8.80 __ popfq(); // get saved flags off stack -- 8.81 // will be ignored 8.82 8.83 __ pushaq(); // push registers 8.84 // (rip is already 8.85 // already pushed) 8.86 - // debug(char* msg, int64_t regs[]) 8.87 + // debug(char* msg, int64_t pc, int64_t regs[]) 8.88 // We've popped the registers we'd saved (c_rarg3, c_rarg2 and flags), and 8.89 // pushed all the registers, so now the stack looks like: 8.90 // [tos + 0] 16 saved registers 8.91 // [tos + 16] return address 8.92 - // [tos + 17] error message (char*) 8.93 - 8.94 - __ movq(c_rarg0, Address(rsp, 17 * wordSize)); // pass address of error message 8.95 - __ movq(c_rarg1, rsp); // pass address of regs on stack 8.96 + // * [tos + 17] error message (char*) 8.97 + // * [tos + 18] object to verify (oop) 8.98 + // * [tos + 19] saved rax - saved by caller and bashed 8.99 + // * = popped on exit 8.100 + 8.101 + __ movq(c_rarg0, Address(rsp, error_msg)); // pass address of error message 8.102 + __ movq(c_rarg1, Address(rsp, return_addr)); // pass return address 8.103 + __ movq(c_rarg2, rsp); // pass address of regs on stack 8.104 __ movq(r12, rsp); // remember rsp 8.105 __ subq(rsp, frame::arg_reg_save_area_bytes);// windows 8.106 __ andq(rsp, -16); // align stack as required by ABI 8.107 BLOCK_COMMENT("call MacroAssembler::debug"); 8.108 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug))); 8.109 __ movq(rsp, r12); // restore rsp 8.110 - __ reinit_heapbase(); // r12 is heapbase 8.111 - __ popaq(); // pop registers 8.112 + __ popaq(); // pop registers (includes r12) 8.113 __ ret(3 * wordSize); // pop caller saved stuff 8.114 8.115 return start; 8.116 @@ -1038,7 +1059,7 @@ 8.117 assert_different_registers(Rtmp, Rint); 8.118 __ movslq(Rtmp, Rint); 8.119 __ cmpq(Rtmp, Rint); 8.120 - __ jccb(Assembler::equal, L); 8.121 + __ jcc(Assembler::equal, L); 8.122 __ stop("high 32-bits of int value are not 0"); 8.123 __ bind(L); 8.124 #endif
9.1 --- a/src/cpu/x86/vm/x86_64.ad Wed Apr 23 06:35:28 2008 -0400 9.2 +++ b/src/cpu/x86/vm/x86_64.ad Mon Apr 28 08:08:12 2008 -0700 9.3 @@ -6080,7 +6080,8 @@ 9.4 predicate(n->in(MemNode::Address)->bottom_type()->is_narrow()); 9.5 9.6 ins_cost(125); // XXX 9.7 - format %{ "movl $dst, $mem\t# compressed class" %} 9.8 + format %{ "movl $dst, $mem\t# compressed class\n\t" 9.9 + "decode_heap_oop $dst,$dst" %} 9.10 ins_encode %{ 9.11 Address addr = build_address($mem$$base, $mem$$index, $mem$$scale, $mem$$disp); 9.12 Register dst = as_Register($dst$$reg); 9.13 @@ -6349,7 +6350,7 @@ 9.14 instruct loadConN0(rRegN dst, immN0 src, rFlagsReg cr) %{ 9.15 match(Set dst src); 9.16 effect(KILL cr); 9.17 - format %{ "xorq $dst, $src\t# compressed ptr" %} 9.18 + format %{ "xorq $dst, $src\t# compressed NULL ptr" %} 9.19 ins_encode %{ 9.20 Register dst = $dst$$Register; 9.21 __ xorq(dst, dst); 9.22 @@ -6361,7 +6362,8 @@ 9.23 match(Set dst src); 9.24 9.25 ins_cost(125); 9.26 - format %{ "movl $dst, $src\t# compressed ptr" %} 9.27 + format %{ "movq $dst, $src\t# compressed ptr\n\t" 9.28 + "encode_heap_oop_not_null $dst,$dst" %} 9.29 ins_encode %{ 9.30 address con = (address)$src$$constant; 9.31 Register dst = $dst$$Register; 9.32 @@ -6996,6 +6998,7 @@ 9.33 9.34 // Convert oop pointer into compressed form 9.35 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ 9.36 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull); 9.37 match(Set dst (EncodeP src)); 9.38 effect(KILL cr); 9.39 format %{ "encode_heap_oop $dst,$src" %} 9.40 @@ -7010,7 +7013,21 @@ 9.41 ins_pipe(ialu_reg_long); 9.42 %} 9.43 9.44 +instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ 9.45 + predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull); 9.46 + match(Set dst (EncodeP src)); 9.47 + effect(KILL cr); 9.48 + format %{ "encode_heap_oop_not_null $dst,$src" %} 9.49 + ins_encode %{ 9.50 + Register s = $src$$Register; 9.51 + Register d = $dst$$Register; 9.52 + __ encode_heap_oop_not_null(d, s); 9.53 + %} 9.54 + ins_pipe(ialu_reg_long); 9.55 +%} 9.56 + 9.57 instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ 9.58 + predicate(n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull); 9.59 match(Set dst (DecodeN src)); 9.60 effect(KILL cr); 9.61 format %{ "decode_heap_oop $dst,$src" %} 9.62 @@ -7025,6 +7042,18 @@ 9.63 ins_pipe(ialu_reg_long); 9.64 %} 9.65 9.66 +instruct decodeHeapOop_not_null(rRegP dst, rRegN src) %{ 9.67 + predicate(n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull); 9.68 + match(Set dst (DecodeN src)); 9.69 + format %{ "decode_heap_oop_not_null $dst,$src" %} 9.70 + ins_encode %{ 9.71 + Register s = $src$$Register; 9.72 + Register d = $dst$$Register; 9.73 + __ decode_heap_oop_not_null(d, s); 9.74 + %} 9.75 + ins_pipe(ialu_reg_long); 9.76 +%} 9.77 + 9.78 9.79 //----------Conditional Move--------------------------------------------------- 9.80 // Jump
10.1 --- a/src/share/vm/interpreter/bytecodeInterpreter.cpp Wed Apr 23 06:35:28 2008 -0400 10.2 +++ b/src/share/vm/interpreter/bytecodeInterpreter.cpp Mon Apr 28 08:08:12 2008 -0700 10.3 @@ -518,16 +518,16 @@ 10.4 10.5 /* 0xC0 */ &&opc_checkcast, &&opc_instanceof, &&opc_monitorenter, &&opc_monitorexit, 10.6 /* 0xC4 */ &&opc_wide, &&opc_multianewarray, &&opc_ifnull, &&opc_ifnonnull, 10.7 -/* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_fast_igetfield, 10.8 -/* 0xCC */ &&opc_fastagetfield,&&opc_fast_aload_0, &&opc_fast_iaccess_0, &&opc__fast_aaccess_0, 10.9 - 10.10 -/* 0xD0 */ &&opc_fast_linearswitch, &&opc_fast_binaryswitch, &&opc_return_register_finalizer, &&opc_default, 10.11 +/* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_default, 10.12 +/* 0xCC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.13 + 10.14 +/* 0xD0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.15 /* 0xD4 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.16 /* 0xD8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.17 /* 0xDC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.18 10.19 /* 0xE0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.20 -/* 0xE4 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.21 +/* 0xE4 */ &&opc_default, &&opc_return_register_finalizer, &&opc_default, &&opc_default, 10.22 /* 0xE8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.23 /* 0xEC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, 10.24
11.1 --- a/src/share/vm/opto/cfgnode.cpp Wed Apr 23 06:35:28 2008 -0400 11.2 +++ b/src/share/vm/opto/cfgnode.cpp Mon Apr 28 08:08:12 2008 -0700 11.3 @@ -1419,7 +1419,8 @@ 11.4 // Check inputs of phi's inputs also. 11.5 // It is much less expensive then full graph walk. 11.6 uint cnt = in->req(); 11.7 - for (uint i = 1; i < cnt; ++i) { 11.8 + uint i = (in->is_Proj() && !in->is_CFG()) ? 0 : 1; 11.9 + for (; i < cnt; ++i) { 11.10 Node* m = in->in(i); 11.11 if (m == (Node*)this) 11.12 return UnsafeLoop; // Unsafe loop 11.13 @@ -1467,7 +1468,8 @@ 11.14 while (nstack.size() != 0) { 11.15 Node* n = nstack.pop(); 11.16 uint cnt = n->req(); 11.17 - for (uint i = 1; i < cnt; i++) { // Only data paths 11.18 + uint i = (n->is_Proj() && !n->is_CFG()) ? 0 : 1; 11.19 + for (; i < cnt; i++) { 11.20 Node* m = n->in(i); 11.21 if (m == (Node*)this) { 11.22 return true; // Data loop 11.23 @@ -2017,6 +2019,28 @@ 11.24 } 11.25 11.26 //============================================================================= 11.27 +//------------------------------Value------------------------------------------ 11.28 +// Check for being unreachable. 11.29 +const Type *NeverBranchNode::Value( PhaseTransform *phase ) const { 11.30 + if (!in(0) || in(0)->is_top()) return Type::TOP; 11.31 + return bottom_type(); 11.32 +} 11.33 + 11.34 +//------------------------------Ideal------------------------------------------ 11.35 +// Check for no longer being part of a loop 11.36 +Node *NeverBranchNode::Ideal(PhaseGVN *phase, bool can_reshape) { 11.37 + if (can_reshape && !in(0)->is_Loop()) { 11.38 + // Dead code elimination can sometimes delete this projection so 11.39 + // if it's not there, there's nothing to do. 11.40 + Node* fallthru = proj_out(0); 11.41 + if (fallthru != NULL) { 11.42 + phase->is_IterGVN()->subsume_node(fallthru, in(0)); 11.43 + } 11.44 + return phase->C->top(); 11.45 + } 11.46 + return NULL; 11.47 +} 11.48 + 11.49 #ifndef PRODUCT 11.50 void NeverBranchNode::format( PhaseRegAlloc *ra_, outputStream *st) const { 11.51 st->print("%s", Name());
12.1 --- a/src/share/vm/opto/cfgnode.hpp Wed Apr 23 06:35:28 2008 -0400 12.2 +++ b/src/share/vm/opto/cfgnode.hpp Mon Apr 28 08:08:12 2008 -0700 12.3 @@ -244,6 +244,8 @@ 12.4 MultiBranchNode( uint required ) : MultiNode(required) { 12.5 init_class_id(Class_MultiBranch); 12.6 } 12.7 + // returns required number of users to be well formed. 12.8 + virtual int required_outcnt() const = 0; 12.9 }; 12.10 12.11 //------------------------------IfNode----------------------------------------- 12.12 @@ -333,6 +335,7 @@ 12.13 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } 12.14 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 12.15 virtual const Type *Value( PhaseTransform *phase ) const; 12.16 + virtual int required_outcnt() const { return 2; } 12.17 virtual const RegMask &out_RegMask() const; 12.18 void dominated_by(Node* prev_dom, PhaseIterGVN* igvn); 12.19 int is_range_check(Node* &range, Node* &index, jint &offset); 12.20 @@ -391,6 +394,7 @@ 12.21 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 12.22 virtual const Type *bottom_type() const; 12.23 virtual bool pinned() const { return true; } 12.24 + virtual int required_outcnt() const { return _size; } 12.25 }; 12.26 12.27 //------------------------------JumpNode--------------------------------------- 12.28 @@ -504,7 +508,9 @@ 12.29 virtual int Opcode() const; 12.30 virtual bool pinned() const { return true; }; 12.31 virtual const Type *bottom_type() const { return TypeTuple::IFBOTH; } 12.32 - 12.33 + virtual const Type *Value( PhaseTransform *phase ) const; 12.34 + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 12.35 + virtual int required_outcnt() const { return 2; } 12.36 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { } 12.37 virtual uint size(PhaseRegAlloc *ra_) const { return 0; } 12.38 #ifndef PRODUCT
13.1 --- a/src/share/vm/opto/compile.cpp Wed Apr 23 06:35:28 2008 -0400 13.2 +++ b/src/share/vm/opto/compile.cpp Mon Apr 28 08:08:12 2008 -0700 13.3 @@ -1981,10 +1981,6 @@ 13.4 #endif 13.5 break; 13.6 } 13.7 - case Op_If: 13.8 - case Op_CountedLoopEnd: 13.9 - fpu._tests.push(n); // Collect CFG split points 13.10 - break; 13.11 13.12 case Op_AddP: { // Assert sane base pointers 13.13 const Node *addp = n->in(AddPNode::Address); 13.14 @@ -2083,10 +2079,12 @@ 13.15 default: 13.16 assert( !n->is_Call(), "" ); 13.17 assert( !n->is_Mem(), "" ); 13.18 - if( n->is_If() || n->is_PCTable() ) 13.19 - fpu._tests.push(n); // Collect CFG split points 13.20 break; 13.21 } 13.22 + 13.23 + // Collect CFG split points 13.24 + if (n->is_MultiBranch()) 13.25 + fpu._tests.push(n); 13.26 } 13.27 13.28 //------------------------------final_graph_reshaping_walk--------------------- 13.29 @@ -2165,19 +2163,18 @@ 13.30 13.31 // Check for unreachable (from below) code (i.e., infinite loops). 13.32 for( uint i = 0; i < fpu._tests.size(); i++ ) { 13.33 - Node *n = fpu._tests[i]; 13.34 - assert( n->is_PCTable() || n->is_If(), "either PCTables or IfNodes" ); 13.35 - // Get number of CFG targets; 2 for IfNodes or _size for PCTables. 13.36 + MultiBranchNode *n = fpu._tests[i]->as_MultiBranch(); 13.37 + // Get number of CFG targets. 13.38 // Note that PCTables include exception targets after calls. 13.39 - uint expected_kids = n->is_PCTable() ? n->as_PCTable()->_size : 2; 13.40 - if (n->outcnt() != expected_kids) { 13.41 + uint required_outcnt = n->required_outcnt(); 13.42 + if (n->outcnt() != required_outcnt) { 13.43 // Check for a few special cases. Rethrow Nodes never take the 13.44 // 'fall-thru' path, so expected kids is 1 less. 13.45 if (n->is_PCTable() && n->in(0) && n->in(0)->in(0)) { 13.46 if (n->in(0)->in(0)->is_Call()) { 13.47 CallNode *call = n->in(0)->in(0)->as_Call(); 13.48 if (call->entry_point() == OptoRuntime::rethrow_stub()) { 13.49 - expected_kids--; // Rethrow always has 1 less kid 13.50 + required_outcnt--; // Rethrow always has 1 less kid 13.51 } else if (call->req() > TypeFunc::Parms && 13.52 call->is_CallDynamicJava()) { 13.53 // Check for null receiver. In such case, the optimizer has 13.54 @@ -2187,7 +2184,7 @@ 13.55 Node *arg0 = call->in(TypeFunc::Parms); 13.56 if (arg0->is_Type() && 13.57 arg0->as_Type()->type()->higher_equal(TypePtr::NULL_PTR)) { 13.58 - expected_kids--; 13.59 + required_outcnt--; 13.60 } 13.61 } else if (call->entry_point() == OptoRuntime::new_array_Java() && 13.62 call->req() > TypeFunc::Parms+1 && 13.63 @@ -2198,13 +2195,13 @@ 13.64 Node *arg1 = call->in(TypeFunc::Parms+1); 13.65 if (arg1->is_Type() && 13.66 arg1->as_Type()->type()->join(TypeInt::POS)->empty()) { 13.67 - expected_kids--; 13.68 + required_outcnt--; 13.69 } 13.70 } 13.71 } 13.72 } 13.73 - // Recheck with a better notion of 'expected_kids' 13.74 - if (n->outcnt() != expected_kids) { 13.75 + // Recheck with a better notion of 'required_outcnt' 13.76 + if (n->outcnt() != required_outcnt) { 13.77 record_method_not_compilable("malformed control flow"); 13.78 return true; // Not all targets reachable! 13.79 }
14.1 --- a/src/share/vm/opto/connode.cpp Wed Apr 23 06:35:28 2008 -0400 14.2 +++ b/src/share/vm/opto/connode.cpp Mon Apr 28 08:08:12 2008 -0700 14.3 @@ -563,6 +563,26 @@ 14.4 return this; 14.5 } 14.6 14.7 +const Type *DecodeNNode::Value( PhaseTransform *phase ) const { 14.8 + if (phase->type( in(1) ) == TypeNarrowOop::NULL_PTR) { 14.9 + return TypePtr::NULL_PTR; 14.10 + } 14.11 + return bottom_type(); 14.12 +} 14.13 + 14.14 +Node* DecodeNNode::decode(PhaseGVN* phase, Node* value) { 14.15 + if (value->Opcode() == Op_EncodeP) { 14.16 + // (DecodeN (EncodeP p)) -> p 14.17 + return value->in(1); 14.18 + } 14.19 + const Type* newtype = value->bottom_type(); 14.20 + if (newtype == TypeNarrowOop::NULL_PTR) { 14.21 + return phase->transform(new (phase->C, 1) ConPNode(TypePtr::NULL_PTR)); 14.22 + } else { 14.23 + return phase->transform(new (phase->C, 2) DecodeNNode(value, newtype->is_narrowoop()->make_oopptr())); 14.24 + } 14.25 +} 14.26 + 14.27 Node* EncodePNode::Identity(PhaseTransform* phase) { 14.28 const Type *t = phase->type( in(1) ); 14.29 if( t == Type::TOP ) return in(1); 14.30 @@ -574,14 +594,26 @@ 14.31 return this; 14.32 } 14.33 14.34 +const Type *EncodePNode::Value( PhaseTransform *phase ) const { 14.35 + if (phase->type( in(1) ) == TypePtr::NULL_PTR) { 14.36 + return TypeNarrowOop::NULL_PTR; 14.37 + } 14.38 + return bottom_type(); 14.39 +} 14.40 14.41 Node* EncodePNode::encode(PhaseGVN* phase, Node* value) { 14.42 + if (value->Opcode() == Op_DecodeN) { 14.43 + // (EncodeP (DecodeN p)) -> p 14.44 + return value->in(1); 14.45 + } 14.46 const Type* newtype = value->bottom_type(); 14.47 if (newtype == TypePtr::NULL_PTR) { 14.48 return phase->transform(new (phase->C, 1) ConNNode(TypeNarrowOop::NULL_PTR)); 14.49 + } else if (newtype->isa_oopptr()) { 14.50 + return phase->transform(new (phase->C, 2) EncodePNode(value, newtype->is_oopptr()->make_narrowoop())); 14.51 } else { 14.52 - return phase->transform(new (phase->C, 2) EncodePNode(value, 14.53 - newtype->is_oopptr()->make_narrowoop())); 14.54 + ShouldNotReachHere(); 14.55 + return NULL; // to make C++ compiler happy. 14.56 } 14.57 } 14.58
15.1 --- a/src/share/vm/opto/connode.hpp Wed Apr 23 06:35:28 2008 -0400 15.2 +++ b/src/share/vm/opto/connode.hpp Mon Apr 28 08:08:12 2008 -0700 15.3 @@ -239,10 +239,7 @@ 15.4 // cast pointer to pointer (different type) 15.5 class CastPPNode: public ConstraintCastNode { 15.6 public: 15.7 - CastPPNode (Node *n, const Type *t ): ConstraintCastNode(n, t) { 15.8 - // Only CastPP is safe. CastII can cause optimizer loops. 15.9 - init_flags(Flag_is_dead_loop_safe); 15.10 - } 15.11 + CastPPNode (Node *n, const Type *t ): ConstraintCastNode(n, t) {} 15.12 virtual int Opcode() const; 15.13 virtual uint ideal_reg() const { return Op_RegP; } 15.14 virtual Node *Ideal_DU_postCCP( PhaseCCP * ); 15.15 @@ -254,10 +251,10 @@ 15.16 public: 15.17 CheckCastPPNode( Node *c, Node *n, const Type *t ) : TypeNode(t,2) { 15.18 init_class_id(Class_CheckCastPP); 15.19 - init_flags(Flag_is_dead_loop_safe); 15.20 init_req(0, c); 15.21 init_req(1, n); 15.22 } 15.23 + 15.24 virtual Node *Identity( PhaseTransform *phase ); 15.25 virtual const Type *Value( PhaseTransform *phase ) const; 15.26 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 15.27 @@ -282,6 +279,7 @@ 15.28 } 15.29 virtual int Opcode() const; 15.30 virtual Node *Identity( PhaseTransform *phase ); 15.31 + virtual const Type *Value( PhaseTransform *phase ) const; 15.32 virtual uint ideal_reg() const { return Op_RegN; } 15.33 15.34 static Node* encode(PhaseGVN* phase, Node* value); 15.35 @@ -300,7 +298,10 @@ 15.36 } 15.37 virtual int Opcode() const; 15.38 virtual Node *Identity( PhaseTransform *phase ); 15.39 + virtual const Type *Value( PhaseTransform *phase ) const; 15.40 virtual uint ideal_reg() const { return Op_RegP; } 15.41 + 15.42 + static Node* decode(PhaseGVN* phase, Node* value); 15.43 }; 15.44 15.45 //------------------------------Conv2BNode-------------------------------------
16.1 --- a/src/share/vm/opto/escape.cpp Wed Apr 23 06:35:28 2008 -0400 16.2 +++ b/src/share/vm/opto/escape.cpp Mon Apr 28 08:08:12 2008 -0700 16.3 @@ -215,6 +215,10 @@ 16.4 VectorSet visited(Thread::current()->resource_area()); 16.5 GrowableArray<uint> worklist; 16.6 16.7 +#ifdef ASSERT 16.8 + Node *orig_n = n; 16.9 +#endif 16.10 + 16.11 n = n->uncast(); 16.12 PointsToNode npt = _nodes->at_grow(n->_idx); 16.13 16.14 @@ -223,8 +227,14 @@ 16.15 ptset.set(n->_idx); 16.16 return; 16.17 } 16.18 - assert(npt._node != NULL, "unregistered node"); 16.19 - 16.20 +#ifdef ASSERT 16.21 + if (npt._node == NULL) { 16.22 + if (orig_n != n) 16.23 + orig_n->dump(); 16.24 + n->dump(); 16.25 + assert(npt._node != NULL, "unregistered node"); 16.26 + } 16.27 +#endif 16.28 worklist.push(n->_idx); 16.29 while(worklist.length() > 0) { 16.30 int ni = worklist.pop(); 16.31 @@ -266,7 +276,7 @@ 16.32 PointsToNode *ptn = ptnode_adr(ni); 16.33 16.34 // Mark current edges as visited and move deferred edges to separate array. 16.35 - for (; i < ptn->edge_count(); i++) { 16.36 + while (i < ptn->edge_count()) { 16.37 uint t = ptn->edge_target(i); 16.38 #ifdef ASSERT 16.39 assert(!visited->test_set(t), "expecting no duplications"); 16.40 @@ -276,6 +286,8 @@ 16.41 if (ptn->edge_type(i) == PointsToNode::DeferredEdge) { 16.42 ptn->remove_edge(t, PointsToNode::DeferredEdge); 16.43 deferred_edges->append(t); 16.44 + } else { 16.45 + i++; 16.46 } 16.47 } 16.48 for (int next = 0; next < deferred_edges->length(); ++next) { 16.49 @@ -1716,6 +1728,8 @@ 16.50 } 16.51 case Op_CastPP: 16.52 case Op_CheckCastPP: 16.53 + case Op_EncodeP: 16.54 + case Op_DecodeN: 16.55 { 16.56 add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false); 16.57 int ti = n->in(1)->_idx; 16.58 @@ -1743,12 +1757,6 @@ 16.59 add_node(n, PointsToNode::JavaObject, es, true); 16.60 break; 16.61 } 16.62 - case Op_CreateEx: 16.63 - { 16.64 - // assume that all exception objects globally escape 16.65 - add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); 16.66 - break; 16.67 - } 16.68 case Op_ConN: 16.69 { 16.70 // assume all narrow oop constants globally escape except for null 16.71 @@ -1761,6 +1769,12 @@ 16.72 add_node(n, PointsToNode::JavaObject, es, true); 16.73 break; 16.74 } 16.75 + case Op_CreateEx: 16.76 + { 16.77 + // assume that all exception objects globally escape 16.78 + add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); 16.79 + break; 16.80 + } 16.81 case Op_LoadKlass: 16.82 { 16.83 add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); 16.84 @@ -1976,10 +1990,11 @@ 16.85 break; 16.86 } 16.87 case Op_LoadP: 16.88 + case Op_LoadN: 16.89 { 16.90 const Type *t = phase->type(n); 16.91 #ifdef ASSERT 16.92 - if (t->isa_ptr() == NULL) 16.93 + if (!t->isa_narrowoop() && t->isa_ptr() == NULL) 16.94 assert(false, "Op_LoadP"); 16.95 #endif 16.96 16.97 @@ -2060,11 +2075,16 @@ 16.98 break; 16.99 } 16.100 case Op_StoreP: 16.101 + case Op_StoreN: 16.102 case Op_StorePConditional: 16.103 case Op_CompareAndSwapP: 16.104 + case Op_CompareAndSwapN: 16.105 { 16.106 Node *adr = n->in(MemNode::Address); 16.107 const Type *adr_type = phase->type(adr); 16.108 + if (adr_type->isa_narrowoop()) { 16.109 + adr_type = adr_type->is_narrowoop()->make_oopptr(); 16.110 + } 16.111 #ifdef ASSERT 16.112 if (!adr_type->isa_oopptr()) 16.113 assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");
17.1 --- a/src/share/vm/opto/lcm.cpp Wed Apr 23 06:35:28 2008 -0400 17.2 +++ b/src/share/vm/opto/lcm.cpp Mon Apr 28 08:08:12 2008 -0700 17.3 @@ -629,6 +629,10 @@ 17.4 // of the phi to be scheduled first. The select() method breaks 17.5 // ties in scheduling by worklist order. 17.6 delay.push(m); 17.7 + } else if (m->is_Mach() && m->as_Mach()->ideal_Opcode() == Op_CreateEx) { 17.8 + // Force the CreateEx to the top of the list so it's processed 17.9 + // first and ends up at the start of the block. 17.10 + worklist.insert(0, m); 17.11 } else { 17.12 worklist.push(m); // Then on to worklist! 17.13 }
18.1 --- a/src/share/vm/opto/macro.cpp Wed Apr 23 06:35:28 2008 -0400 18.2 +++ b/src/share/vm/opto/macro.cpp Mon Apr 28 08:08:12 2008 -0700 18.3 @@ -584,7 +584,7 @@ 18.4 18.5 const Type *field_type; 18.6 // The next code is taken from Parse::do_get_xxx(). 18.7 - if (basic_elem_type == T_OBJECT) { 18.8 + if (basic_elem_type == T_OBJECT || basic_elem_type == T_ARRAY) { 18.9 if (!elem_type->is_loaded()) { 18.10 field_type = TypeInstPtr::BOTTOM; 18.11 } else if (field != NULL && field->is_constant()) { 18.12 @@ -597,6 +597,10 @@ 18.13 } else { 18.14 field_type = TypeOopPtr::make_from_klass(elem_type->as_klass()); 18.15 } 18.16 + if (UseCompressedOops) { 18.17 + field_type = field_type->is_oopptr()->make_narrowoop(); 18.18 + basic_elem_type = T_NARROWOOP; 18.19 + } 18.20 } else { 18.21 field_type = Type::get_const_basic_type(basic_elem_type); 18.22 } 18.23 @@ -659,6 +663,13 @@ 18.24 #endif 18.25 return false; 18.26 } 18.27 + if (UseCompressedOops && field_type->isa_narrowoop()) { 18.28 + // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation 18.29 + // to be able scalar replace the allocation. 18.30 + _igvn.set_delay_transform(false); 18.31 + field_val = DecodeNNode::decode(&_igvn, field_val); 18.32 + _igvn.set_delay_transform(true); 18.33 + } 18.34 sfpt->add_req(field_val); 18.35 } 18.36 JVMState *jvms = sfpt->jvms();
19.1 --- a/src/share/vm/opto/memnode.cpp Wed Apr 23 06:35:28 2008 -0400 19.2 +++ b/src/share/vm/opto/memnode.cpp Mon Apr 28 08:08:12 2008 -0700 19.3 @@ -754,13 +754,12 @@ 19.4 const TypeNarrowOop* narrowtype; 19.5 if (rt->isa_narrowoop()) { 19.6 narrowtype = rt->is_narrowoop(); 19.7 - rt = narrowtype->make_oopptr(); 19.8 } else { 19.9 narrowtype = rt->is_oopptr()->make_narrowoop(); 19.10 } 19.11 Node* load = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype)); 19.12 19.13 - return new (C, 2) DecodeNNode(load, rt); 19.14 + return DecodeNNode::decode(&gvn, load); 19.15 } else 19.16 #endif 19.17 { 19.18 @@ -1841,15 +1840,7 @@ 19.19 (UseCompressedOops && val->bottom_type()->isa_klassptr() && 19.20 adr->bottom_type()->isa_rawptr())) { 19.21 const TypePtr* type = val->bottom_type()->is_ptr(); 19.22 - Node* cp; 19.23 - if (type->isa_oopptr()) { 19.24 - const TypeNarrowOop* etype = type->is_oopptr()->make_narrowoop(); 19.25 - cp = gvn.transform(new (C, 2) EncodePNode(val, etype)); 19.26 - } else if (type == TypePtr::NULL_PTR) { 19.27 - cp = gvn.transform(new (C, 1) ConNNode(TypeNarrowOop::NULL_PTR)); 19.28 - } else { 19.29 - ShouldNotReachHere(); 19.30 - } 19.31 + Node* cp = EncodePNode::encode(&gvn, val); 19.32 return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp); 19.33 } else 19.34 #endif
20.1 --- a/src/share/vm/opto/multnode.hpp Wed Apr 23 06:35:28 2008 -0400 20.2 +++ b/src/share/vm/opto/multnode.hpp Mon Apr 28 08:08:12 2008 -0700 20.3 @@ -61,6 +61,9 @@ 20.4 : Node( src ), _con(con), _is_io_use(io_use) 20.5 { 20.6 init_class_id(Class_Proj); 20.7 + // Optimistic setting. Need additional checks in Node::is_dead_loop_safe(). 20.8 + if (con != TypeFunc::Memory || src->is_Start()) 20.9 + init_flags(Flag_is_dead_loop_safe); 20.10 debug_only(check_con()); 20.11 } 20.12 const uint _con; // The field in the tuple we are projecting
21.1 --- a/src/share/vm/opto/node.hpp Wed Apr 23 06:35:28 2008 -0400 21.2 +++ b/src/share/vm/opto/node.hpp Mon Apr 28 08:08:12 2008 -0700 21.3 @@ -741,8 +741,9 @@ 21.4 bool is_Goto() const { return (_flags & Flag_is_Goto) != 0; } 21.5 // The data node which is safe to leave in dead loop during IGVN optimization. 21.6 bool is_dead_loop_safe() const { 21.7 - return is_Phi() || is_Proj() || 21.8 - (_flags & (Flag_is_dead_loop_safe | Flag_is_Con)) != 0; 21.9 + return is_Phi() || (is_Proj() && in(0) == NULL) || 21.10 + ((_flags & (Flag_is_dead_loop_safe | Flag_is_Con)) != 0 && 21.11 + (!is_Proj() || !in(0)->is_Allocate())); 21.12 } 21.13 21.14 // is_Copy() returns copied edge index (0 or 1)
22.1 --- a/src/share/vm/runtime/sharedRuntime.cpp Wed Apr 23 06:35:28 2008 -0400 22.2 +++ b/src/share/vm/runtime/sharedRuntime.cpp Mon Apr 28 08:08:12 2008 -0700 22.3 @@ -2229,6 +2229,8 @@ 22.4 #ifndef PRODUCT 22.5 bool AdapterHandlerLibrary::contains(CodeBlob* b) { 22.6 22.7 + if (_handlers == NULL) return false; 22.8 + 22.9 for (int i = 0 ; i < _handlers->length() ; i++) { 22.10 AdapterHandlerEntry* a = get_entry(i); 22.11 if ( a != NULL && b == CodeCache::find_blob(a->get_i2c_entry()) ) return true;
23.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 23.2 +++ b/test/compiler/6663848/Tester.java Mon Apr 28 08:08:12 2008 -0700 23.3 @@ -0,0 +1,478 @@ 23.4 +/* 23.5 + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. 23.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 23.7 + * 23.8 + * This code is free software; you can redistribute it and/or modify it 23.9 + * under the terms of the GNU General Public License version 2 only, as 23.10 + * published by the Free Software Foundation. 23.11 + * 23.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 23.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 23.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23.15 + * version 2 for more details (a copy is included in the LICENSE file that 23.16 + * accompanied this code). 23.17 + * 23.18 + * You should have received a copy of the GNU General Public License version 23.19 + * 2 along with this work; if not, write to the Free Software Foundation, 23.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 23.21 + * 23.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 23.23 + * CA 95054 USA or visit www.sun.com if you need additional information or 23.24 + * have any questions. 23.25 + */ 23.26 + 23.27 +/* 23.28 + * @test 23.29 + * @bug 6663848 23.30 + * @summary assert(i < Max(),"oob") 23.31 + */ 23.32 + 23.33 +/* Complexity upper bound: 296055 ops */ 23.34 + 23.35 +final class Tester_Class_0 { 23.36 + byte var_1; 23.37 + static double var_2; 23.38 + String var_3; 23.39 + char var_4 = 'n'; 23.40 + static int var_5; 23.41 + String var_6; 23.42 + final long var_7 = 4161100809902398464L; 23.43 + static String var_8 = "a"; 23.44 + 23.45 + 23.46 + public Tester_Class_0() 23.47 + { 23.48 + switch (((false ^ !"n".startsWith("kmmhtohv", 553985525) ? true : false) ? 'k' : (var_4 *= - (var_2 = 3.1182935E38F))) - (~2013121027650726912L >= 2.929692E38F / (var_1 = (byte)4.2723157E37F) ? var_4 | (short)var_7 : ~ ((byte)"".indexOf("yuno", 4922080)))) 23.49 + { 23.50 + case 125: 23.51 + 23.52 + case ']': 23.53 + 23.54 + case 6: 23.55 + var_5 = (false ? false : 3708707602755734528L >= 1648075631) ? var_4 : (false ? var_4 : ++var_4); 23.56 + break; 23.57 + 23.58 + case 46: 23.59 + Object var_15; 23.60 + ++var_4; 23.61 + float var_16 = 3.1085987E38F; 23.62 + var_5 = 'h'; 23.63 + var_1 = true ? (byte)9.482988718680618E307 : (false && false ? (byte)var_7 : (byte)6793807430041920512L); 23.64 + final byte var_17 = var_1 = (337740577 ^ ~8932537004307666944L) / (short)var_16 - (byte)var_7 << var_7 > ~1539422023641354240L ? (false ? (byte)var_4 : (byte)9.302678E37F) : (byte)(var_5 = (byte)1.3007792E38F); 23.65 + var_15 = "an"; 23.66 + break; 23.67 + 23.68 + case 29: 23.69 + var_3 = (var_6 = (var_8 = "kgc")); 23.70 + break; 23.71 + 23.72 + case 60: 23.73 + 23.74 + } 23.75 + char var_18; 23.76 + ((new Tester_Class_0[var_1 = (byte)(var_2 = 93813743)])[var_1 = (byte)var_4]).var_1 = (var_1 = (var_1 = (byte)5.1405316E37F)); 23.77 + var_8 = var_8; 23.78 + float var_19 = 0F; 23.79 + var_2 = var_4; 23.80 + do 23.81 + { 23.82 + var_4 >>= var_7; 23.83 + var_19++; 23.84 + var_4 %= true ? (short)7643330105057892352L : (short)1.1014013E38F; 23.85 + } while (var_19 < 2 && (! (true & (!true && false)) && true)); 23.86 + var_4++; 23.87 + int var_20 = 0; 23.88 + var_4 = ~var_7 == (var_1 = (byte)var_7) | (float)var_20 <= 'H' ? 'r' : (var_4 |= (byte)var_4); 23.89 + for (var_6 = (var_8 = "wqmnvxava"); (false ? (short)+ ~3540350558052792320L : + ~ ~3244965056572428288L - (var_4 *= 8.314953959831226E307)) <= +9.34280058703911E307 && var_20 < 6; var_2 = 3.0507823E38F) 23.90 + { 23.91 + var_2 = ~ ((byte)844279629935048704L) ^ (var_19 <= (false ? '\\' : 'B') ? (byte)(short)(var_1 = (byte)(short)var_19) : (var_1 = (var_1 = (var_1 = (byte)'T')))); 23.92 + var_20++; 23.93 + var_5 = (short)(var_7 >>> (! !true & true ? 'D' : (var_4 -= 1.1444072012663494E308))); 23.94 + (var_6 = "jnjbrmaus").compareTo(var_3 = false ? "pfmv" : (var_8 = var_8)); 23.95 + } 23.96 + var_2 = func_0(1248385981, 'V' != '[' ? (short)1.0082348960424545E308 : (byte)var_4, new double[var_1 = (byte)'p'][(byte)var_19], 1.3646683639847343E308); 23.97 + var_5 = (var_1 = (var_1 = (true ^ false ? "bfh".startsWith(var_8) : true || !true) | false ? (byte)(var_2 = - ~var_7) : (var_1 = (byte)var_19))); 23.98 + var_3 = (var_3 = "dn"); 23.99 + var_2 = false ? (var_1 = (byte)9.136750130102702E307) : var_7; 23.100 + } 23.101 + 23.102 + 23.103 + 23.104 + 23.105 + final short func_0(int arg_0, short arg_1, double[][] arg_2, double arg_3) 23.106 + { 23.107 + double[][] var_9 = arg_2; 23.108 + arg_0 <<= true ? (byte)- +1.1174307E37F : (var_1 = (byte)911334714); 23.109 + switch ("touoh".endsWith(var_8) ^ ! ! (++var_4 != 1.8567045E38F) ? (var_4 <<= arg_1) : 'E') 23.110 + { 23.111 + case 'a': 23.112 + 23.113 + case 46: 23.114 + 23.115 + case 's': 23.116 + 23.117 + case 50: 23.118 + ((new Tester_Class_0[(byte)arg_0][(byte)- (- + - - + - +1.775205E38F - (arg_1 |= 'Z'))])[var_1 = (var_1 = (byte)4.020531E37F)][var_1 = (var_1 = (byte)883328311549528064L)]).var_4 &= (var_6 = var_8).charAt(arg_0); 23.119 + var_3 = false ? var_8 : "amfijbpwa"; 23.120 + var_4 -= -1.4699719646972257E308; 23.121 + var_2 = (var_1 = (byte)(arg_1 += 1.6757431E38F)); 23.122 + var_1 = (var_1 = (var_1 = (byte)+1.4416583523884388E308)); 23.123 + final Object var_10 = (new Object[(byte)(arg_1 += var_4)])[var_1 = (byte)- +1.0281942E38F]; 23.124 + arg_1 = arg_1; 23.125 + break; 23.126 + 23.127 + case 7: 23.128 + var_8 = var_8 + var_8; 23.129 + break; 23.130 + 23.131 + case 'N': 23.132 + 23.133 + case 'V': 23.134 + 23.135 + case 56: 23.136 + 23.137 + case 'I': 23.138 + 23.139 + } 23.140 + arg_0 &= arg_1; 23.141 + var_3 = false ? var_8 : "vpaj"; 23.142 + var_4 = (var_4 *= arg_1); 23.143 + arg_3 *= (var_4 = var_4); 23.144 + final char var_11 = true ? var_4 : (char)(var_4 << (var_1 = (byte)(arg_1 &= arg_0))); 23.145 + boolean var_12; 23.146 + var_4 ^= '`'; 23.147 + "nkj".startsWith(var_6 = "wrcnrdd"); 23.148 + var_1 = (byte)~var_7; 23.149 + var_6 = (var_8 = "ul"); 23.150 + return (var_12 = 3548576322219573248L <= var_4++ & ((var_12 = !true) || (var_12 = !false | false))) ? arg_1-- : (var_1 = (byte)+ (var_2 = 2.7633542E38F)); 23.151 + } 23.152 + 23.153 + protected final void func_1(final String arg_0, Object arg_1, short arg_2) 23.154 + { 23.155 + arg_2 *= ~8267766955221100544L; 23.156 + arg_1 = (var_6 = var_8); 23.157 + arg_2 <<= false ? (var_1 = (var_1 = (var_1 = (byte)1.6645553629318776E308))) : arg_2; 23.158 + } 23.159 + 23.160 + protected final static float func_2(byte arg_0, final String arg_1) 23.161 + { 23.162 + var_8 = arg_1; 23.163 + char var_13 = ((new Tester_Class_0[arg_0 |= ']'])[arg_0]).var_4--; 23.164 + var_5 = 907889433; 23.165 + { 23.166 + var_13 ^= (var_5 = var_13); 23.167 + } 23.168 + var_8 = arg_1; 23.169 + var_5 = (byte)1759688161; 23.170 + var_8 = (new String[arg_0 >>>= (short)1072761211])[arg_0]; 23.171 + return 5.108221E37F; 23.172 + } 23.173 + 23.174 + private static boolean func_3(boolean arg_0, final boolean arg_1) 23.175 + { 23.176 + var_2 = ((new Tester_Class_0[(byte)(short)'H'])[(byte)(short)(var_2 = (short)'k')]).var_4; 23.177 + if (false) 23.178 + { 23.179 + var_8 = "cl"; 23.180 + } 23.181 + else 23.182 + { 23.183 + final byte[] var_14 = new byte[true ? (byte)(- ((byte)9.760296114722793E307) | ~1867374212153383936L) : (byte)(short)'Q']; 23.184 + var_2 = (float)~3838271533006646272L / (- ~ ~1786841397228277760L ^ ~3695911615719734272L & 'Z'); 23.185 + } 23.186 + { 23.187 + var_8 = var_8; 23.188 + } 23.189 + ((new Tester_Class_0[(byte)(var_2 = (short)~ - +4818709334539164672L)])[(byte)'W']).var_1 = true || false & arg_0 ^ (arg_1 ^ arg_0 ? arg_0 : (arg_0 ^= true)) ? (byte)1.5309163701271477E308 : (byte)3.0904342E38F; 23.190 + ((new Tester_Class_0[(byte)756871578277111808L][(byte)+ + -3.0687752E38F])[(byte)'f'][(byte)1544156315]).var_6 = (var_8 = "vqey"); 23.191 + return arg_1; 23.192 + } 23.193 + 23.194 + public final char func_4(short arg_0) 23.195 + { 23.196 + { 23.197 + var_6 = (var_3 = "hjtjar"); 23.198 + var_1 = false ? (byte)4.02486350499973E307 : (byte)1.3222663E38F; 23.199 + } 23.200 + var_1 = (new byte[var_1 = (var_1 = (byte)1770517884)])[var_1 = (byte)arg_0]; 23.201 + var_4++; 23.202 + --arg_0; 23.203 + var_5 = true ? 'D' : (var_4 ^= (var_5 = 134858941)); 23.204 + return (char)~ (7273058621469586432L << (byte)3.1756883E38F ^ (false ? (byte)(var_5 = var_4) : (arg_0 >>= 6165812289376474112L))) < (2046127339 ^ + ((byte)arg_0)) ? (!false ? (var_4 %= 1.8187417377124746E307) : (var_4 *= 445936805)) : var_4; 23.205 + } 23.206 + 23.207 +} 23.208 + 23.209 + 23.210 +class Tester_Class_1 { 23.211 + Tester_Class_0[][] var_21; 23.212 + static long var_22 = 6671342492736446464L; 23.213 + float var_23 = 2.9329673E38F; 23.214 + final int var_24 = 1834862519; 23.215 + int var_25 = 69920645; 23.216 + static char var_26; 23.217 + static Object var_27; 23.218 + static int var_28 = Tester_Class_0.var_5 = false ? 'U' : (var_26 = (var_26 = 'R')); 23.219 + 23.220 + 23.221 + public Tester_Class_1() 23.222 + { 23.223 + (false ? (Tester_Class_0)(var_27 = Tester_Class_0.var_8) : (Tester_Class_0)(var_27 = "a")).var_1 = (short)(var_23 %= var_23) >= (byte)1217257602 | var_25 == (char)(var_23 += var_23) ? (byte)new Tester_Class_0().var_4-- : ((true | false) ^ !false ? (byte)6.122806E37F : (byte)1.084542872057614E308); 23.224 + Tester_Class_0.var_2 = new Tester_Class_0().var_7; 23.225 + --var_22; 23.226 + boolean var_32 = ! ((new Tester_Class_0().var_1 = (((new Tester_Class_0[(byte)var_22])[(byte)var_23]).var_1 = false ? (byte)(var_23 = var_28) : (byte)1.5858707076311894E308)) != (char)+var_23); 23.227 + var_25 -= (true ? (byte)5.488240359086226E307 : (((Tester_Class_0)(var_27 = Tester_Class_0.var_8)).var_1 = (byte)'L')) * (Tester_Class_0.var_2 = 7.045106259776882E307); 23.228 + Object var_33 = (var_32 ^= var_32) ? (var_27 = (Tester_Class_0.var_8 = (Tester_Class_0.var_8 = "gaemnaep"))) : (new Tester_Class_0[(byte)'g'])[(byte)(short)271735827]; 23.229 + byte var_34 = var_32 ? (byte)((Tester_Class_0)var_33).var_7 : ((var_32 &= true) ? (byte)(Tester_Class_0.var_2 = 1.6975344767401616E307) : (byte)- ((double)var_22)); 23.230 + Tester_Class_0.var_2 = 1.4644308179397427E308; 23.231 + var_28 /= (short)1681483575; 23.232 + Tester_Class_0.var_2 = (var_34 <<= (var_25 ^= ~ (var_22 |= (var_22 = var_22)))); 23.233 + var_23 *= (char)(var_28 *= var_32 ? var_34 ^ --var_34 : 3220732582528450560L); 23.234 + if ((((Tester_Class_0)var_33).var_4 &= var_34) != (short)var_28) 23.235 + { 23.236 + Tester_Class_0.var_8 = ((false ? (Tester_Class_0)var_33 : (Tester_Class_0)var_33).var_6 = Tester_Class_0.var_8); 23.237 + } 23.238 + else 23.239 + { 23.240 + var_33 = false | (var_32 ^= true) ? ((new Tester_Class_0[var_34][var_34])[var_34])[var_34] : (Tester_Class_0)var_33; 23.241 + } 23.242 + if (false) 23.243 + { 23.244 + var_22 = 107656877775594496L; 23.245 + } 23.246 + else 23.247 + { 23.248 + ((var_32 &= (var_32 |= var_32)) || (var_23 /= var_25) == (Tester_Class_0.var_2 = 7649348100017113088L) ? (new Tester_Class_0[var_34])[var_34] : (Tester_Class_0)var_33).var_4 >>>= (((new Tester_Class_0[var_34])[var_34 <<= 'C']).var_6 = (((Tester_Class_0)(var_33 = (var_33 = var_33))).var_6 = ++var_28 > var_23 ? "qgq" : (Tester_Class_0.var_8 = Tester_Class_0.var_8))).equalsIgnoreCase(Tester_Class_0.var_8) ? var_34++ : ++var_34; 23.249 + } 23.250 + String[][] var_35; 23.251 + Tester_Class_0.var_8 = Tester_Class_0.var_8; 23.252 + var_27 = (new Tester_Class_0[var_34][var_34 /= 226411329])[false ? --var_34 : (var_34 /= 1.7237614E38F)][var_34]; 23.253 + var_23 %= var_25; 23.254 + } 23.255 + 23.256 + 23.257 + 23.258 + protected Object clone() 23.259 + { 23.260 + var_28 >>>= (new Tester_Class_0().var_1 = (byte)new Tester_Class_0().var_4); 23.261 + ((Tester_Class_0)(var_27 = (Tester_Class_0.var_8 = (Tester_Class_0.var_8 = (Tester_Class_0.var_8 = "ybndugrur"))))).var_3 = Tester_Class_0.var_8; 23.262 + var_22--; 23.263 + new Tester_Class_0().var_4 -= (new Tester_Class_0().var_1 = (byte)'O'); 23.264 + { 23.265 + short var_29 = 12378; 23.266 + } 23.267 + Tester_Class_0.var_8 = "fd"; 23.268 + "".lastIndexOf("bgsxwmil"); 23.269 + new Tester_Class_0().var_6 = (Tester_Class_0.var_2 = -1.7590174497347678E308) == (var_26 = 'o') | true && !false ? Tester_Class_0.var_8 : (((Tester_Class_0)(var_27 = "")).var_6 = Tester_Class_0.var_8); 23.270 + return var_27 = (var_27 = (var_27 = (var_27 = (Tester_Class_0.var_8 = Tester_Class_0.var_8).substring(var_24)))); 23.271 + } 23.272 + 23.273 + public boolean equals(Object obj) 23.274 + { 23.275 + --var_28; 23.276 + var_23 /= +var_23 * -6025098819014877184L / 3.3957492E38F / (short)'i'; 23.277 + Tester_Class_0.var_2 = 3.0420988E38F * ((short)var_23 <= (var_23 %= 8.761205585617465E307) % + -1.2374670294031777E308 ? (var_23 = 'P') : (float)+ +1.0313120780554142E308); 23.278 + (7489001532003495936L >= 'C' ? (Tester_Class_0)obj : (Tester_Class_0)(var_27 = obj)).func_4((short)(float)(byte)(float)(Tester_Class_0.var_2 = 1601763635)); 23.279 + (var_23 * 2.2882572E38F <= (short)var_25 * (true || false ? (short)~ ((byte)1.1382317160718865E307) : (Tester_Class_0.var_2 = 7.909133507918336E307)) ? (Tester_Class_0)obj : (Tester_Class_0)obj).var_4++; 23.280 + boolean var_30 = true; 23.281 + var_27 = new Tester_Class_0(); 23.282 + final String var_31 = "aiqnc"; 23.283 + return 1.1357028E38F + (var_30 ? (Tester_Class_0)(var_27 = obj) : (Tester_Class_0)obj).var_7 == 3.860172628750592E306; 23.284 + } 23.285 + 23.286 + 23.287 +} 23.288 + 23.289 +public class Tester { 23.290 + final static long var_36 = (4.4957056E37F < Tester_Class_1.var_22 + 281107777128915968L ? (Tester_Class_1.var_26 = 't') : (char)Tester_Class_1.var_28) - (4654994097042818048L | (byte)(Tester_Class_0.var_2 = (short)(Tester_Class_1.var_26 = ']'))) ^ 349774342780012544L; 23.291 + 23.292 + 23.293 + static long func_0(final Tester_Class_1 arg_0, long arg_1) 23.294 + { 23.295 + ((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0)(Tester_Class_1.var_27 = Tester_Class_0.var_8))).var_4 |= --new Tester_Class_0().var_4; 23.296 + return Tester_Class_1.var_22 &= new Tester_Class_0().var_4; 23.297 + } 23.298 + 23.299 + protected Tester_Class_1 func_1(final boolean arg_0, Object arg_1) 23.300 + { 23.301 + Tester_Class_0.var_2 = (short)Tester_Class_1.var_22; 23.302 + ((arg_0 ? (byte)8.639448452214698E307 : ((Tester_Class_1)arg_1).var_24) <= ((Tester_Class_1)(Tester_Class_1.var_27 = new float[(byte)Tester_Class_1.var_22])).var_25++ ? (Tester_Class_0)arg_1 : (Tester_Class_0)(arg_1 = (Tester_Class_1.var_27 = (Tester_Class_0)arg_1))).var_3 = (Tester_Class_0.var_8 = "pgfdbinj"); 23.303 + arg_1 = (new Tester_Class_0[((Tester_Class_0)arg_1).var_1 = (byte)1.0730194668655324E308])[(byte)'l']; 23.304 + Tester_Class_0.var_8 = Tester_Class_0.var_8; 23.305 + Tester_Class_1.var_27 = arg_0 & (true | !true) ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1; 23.306 + Tester_Class_1.var_28 += arg_0 ? (byte)(Tester_Class_0.var_8.compareToIgnoreCase(Tester_Class_0.var_8) % (Tester_Class_1.var_28 %= 2.2770412E38F)) : (byte)((byte)(short)Tester_Class_1.var_28 ^ var_36); 23.307 + Tester_Class_1.var_28 <<= ((Tester_Class_0)arg_1).var_4; 23.308 + return arg_0 ? (false ^ false ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1) : (Tester_Class_1)arg_1; 23.309 + } 23.310 + 23.311 + protected final static String[][] func_2(final double arg_0) 23.312 + { 23.313 + Tester_Class_0.var_2 = (((Tester_Class_1.var_22 = ((Tester_Class_1)(Tester_Class_1.var_27 = "")).var_25++) != + ((byte)(Tester_Class_0.var_2 = - ((byte)2.690435E38F))) ? (Tester_Class_1)(Tester_Class_1.var_27 = "twoj") : (new Tester_Class_1[(byte)'n'])[(byte)- ((byte)'p')]).var_25 /= (new short[false ? (byte)arg_0 : (byte)3.1713847E38F])[(byte)(short)((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_1.var_27 = "fi"))).var_7]); 23.314 + { 23.315 + ((new Tester_Class_1[(byte)9.709543613377303E307])[((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0.var_8 = "efwkox"))).var_1 = (byte)7789404846284517376L]).var_23 *= (((new Tester_Class_0[(byte)'J'][(byte)++Tester_Class_1.var_28])[(byte)Tester_Class_1.var_28][(byte)(Tester_Class_1.var_28 = 1677818267)]).var_1 = false || true ? (byte)1.4659824E38F : (byte)(Tester_Class_1.var_26 = 'T')); 23.316 + } 23.317 + Tester_Class_0.var_2 = !true | !false | false & ! (!true & (true ^ false)) ? (byte)(Tester_Class_1.var_26 = 'l') : (short)(arg_0 * (char)(byte)Tester_Class_1.var_28); 23.318 + Tester_Class_1.var_28 <<= false ^ (! ! (!false | ! !true | true) | (Tester_Class_0.var_2 = arg_0) == 245171309) ? (byte)arg_0 : (short)Tester_Class_1.var_22; 23.319 + { 23.320 + ((Tester_Class_1)(true ? (Tester_Class_1.var_27 = "axpbpadi") : Tester_Class_0.var_8)).var_23 = ((Tester_Class_1)(Tester_Class_1.var_27 = (new Tester_Class_0[(byte)1.1668668415637981E308][(byte)1.4116134699564312E308])[(byte)-7.4415765E37F][(byte)5156322492367086592L])).var_25; 23.321 + } 23.322 + final double var_37 = 1.6970877829548446E308; 23.323 + --(Tester_Class_1.var_28 == (byte)((byte)arg_0 + (byte)1.1632396E38F) ? (Tester_Class_0)(Tester_Class_1.var_27 = "vluk") : (Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0.var_8 = "pfki"))).var_4; 23.324 + Tester_Class_1.var_22--; 23.325 + return new String[new Tester_Class_0().var_1 = (((Tester_Class_0)(Tester_Class_1.var_27 = "filxvch")).var_1 = (byte)var_36)][new Tester_Class_0().var_1 = (byte)'C']; 23.326 + } 23.327 + 23.328 + final short func_3(byte arg_0, final short arg_1) 23.329 + { 23.330 + ((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0.var_8 = "oenvgqdit"))).var_6 = Tester_Class_0.var_8; 23.331 + new Tester_Class_0().var_4 >>>= + -var_36; 23.332 + Tester_Class_0.var_2 = (((new Tester_Class_1[arg_0])[arg_0 %= ++Tester_Class_1.var_28]).var_25 &= Tester_Class_1.var_22); 23.333 + ((new Tester_Class_1[arg_0])[arg_0 |= 1942533325]).var_23 %= arg_0 < arg_0 ? 'm' : 'N'; 23.334 + float var_38; 23.335 + ((new Tester_Class_1[arg_0])[arg_0]).var_23 /= (((new Tester_Class_1[arg_0][arg_0])[arg_0 |= 'N'])[arg_0 <<= - ((byte)- (Tester_Class_0.var_2 = 3.3324301E38F))]).var_23; 23.336 + return true ? arg_1 : arg_1; 23.337 + } 23.338 + 23.339 + private String func_4() 23.340 + { 23.341 + if (true) 23.342 + { 23.343 + ((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_1.var_27 = (Tester_Class_1.var_27 = Tester_Class_0.var_8)))).var_1 = (byte)6.4527776E37F; 23.344 + ((Tester_Class_0)(Tester_Class_1.var_27 = new char[(byte)1.5121402849337185E307])).var_4 >>= - ((byte)3.3631582E37F) + (Tester_Class_1.var_28 /= 2.813947549586372E307); 23.345 + } 23.346 + else 23.347 + { 23.348 + { 23.349 + Tester_Class_1.var_22 *= 1.6498653E36F; 23.350 + } 23.351 + Tester_Class_0.var_2 = + ((byte)7.750601265069686E307) > (short)(byte)3131520439106527232L ? (short)4699552681135671296L : (short)Tester_Class_1.var_22; 23.352 + Tester_Class_1.var_22++; 23.353 + ((Tester_Class_1)(new Object[(byte)6.231994821505742E307])[(byte)Tester_Class_1.var_22]).var_23 %= 30526551; 23.354 + { 23.355 + Tester_Class_0.var_2 = ((Tester_Class_1)(Tester_Class_1.var_27 = new short[(byte)9.628297E37F])).var_25; 23.356 + } 23.357 + Tester_Class_1.var_28 /= (byte)(false ^ Tester_Class_0.var_8.equalsIgnoreCase(Tester_Class_0.var_8) ? (byte)2.689633745095358E307 : (short)1.2532476E38F); 23.358 + float var_39; 23.359 + long[] var_40 = new long[((Tester_Class_0)(Tester_Class_1.var_27 = Tester_Class_0.var_8)).var_1 = (((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0.var_8 = Tester_Class_0.var_8))).var_1 = (byte)(1.8335008E38F % (true | false ? (short)Tester_Class_1.var_22 : (byte)'P')))]; 23.360 + } 23.361 + Tester_Class_0.var_2 = (((new Tester_Class_0[((Tester_Class_0)(Tester_Class_1.var_27 = "inufeoe")).var_1 = (byte)(short)'M'])[(byte)(Tester_Class_0.var_2 = + - -2.274269E38F)]).var_1 = (((Tester_Class_0)(Tester_Class_1.var_27 = "c")).var_1 = (byte)'Z')); 23.362 + Tester_Class_0.var_8 = (Tester_Class_0.var_8 = Tester_Class_0.var_8); 23.363 + return "rkvffvlf"; 23.364 + } 23.365 + 23.366 + final char func_5(final char arg_0, final Object[] arg_1, final double arg_2, Object arg_3) 23.367 + { 23.368 + arg_3 = true && Tester_Class_1.var_22 < (((Tester_Class_0)arg_3).var_1 = (((Tester_Class_0)(Tester_Class_1.var_27 = arg_3)).var_1 = (byte)arg_2)) ? "dgmwbkv" : Tester_Class_0.var_8; 23.369 + (true ? (Tester_Class_1)arg_3 : (Tester_Class_1)arg_3).var_23 -= (Tester_Class_0.var_2 = arg_0); 23.370 + arg_3 = (new String[(byte)arg_2])[(byte)-2.797633529863769E307]; 23.371 + (false ^ !false ^ (!true && true) ? (Tester_Class_0)arg_3 : (Tester_Class_0)arg_3).var_4 -= (new char[((Tester_Class_0)arg_3).var_1 = (((Tester_Class_0)arg_3).var_1 = (((Tester_Class_0)arg_3).var_1 = (byte)2.433897E38F))])[((Tester_Class_0)arg_3).var_1 = (byte)+7.036923762392132E307]; 23.372 + Tester_Class_0.var_8 = Tester_Class_0.var_8; 23.373 + Tester_Class_0.var_2 = true ^ +((Tester_Class_1)(arg_3 = "o")).var_23 <= arg_2 ? (short)Tester_Class_1.var_22 : (((Tester_Class_0)arg_3).var_1 = (byte)1.9730195E38F); 23.374 + (false ? (Tester_Class_0)arg_3 : (Tester_Class_0)arg_3).var_6 = "bpjqfacys"; 23.375 + ((new Tester_Class_0[((Tester_Class_0)arg_3).var_1 = (byte)1969581340][((Tester_Class_0)arg_3).var_1 = (byte)(Tester_Class_0.var_2 = arg_0)])[((Tester_Class_0)arg_3).var_1 = (byte)(Tester_Class_0.var_2 = 4044194664687833088L)][((Tester_Class_0)arg_3).var_1 = (byte)((Tester_Class_1)arg_3).var_24]).var_1 = (false ? (byte)+ ((byte)1.2689328633821032E305) == arg_2 : false) ? (byte)arg_2 : (((Tester_Class_0)arg_3).var_1 = (byte)1586517741); 23.376 + return (func_3(((Tester_Class_0)arg_3).var_1 = (byte)Tester_Class_1.var_28, (short)(byte)- +func_1(true, arg_3).var_23) > 1882532904 ? (short)2.6362656E38F >= (char)2.445034E38F & false : var_36 > Tester_Class_1.var_22) ? ((new Tester_Class_0[(byte)1.2074529E38F][(byte)'N'])[(byte)1.3365433211782782E308][(byte)Tester_Class_1.var_28]).var_4 : 'O'; 23.377 + } 23.378 + 23.379 + private final static Tester_Class_1 func_6(String arg_0, String arg_1) 23.380 + { 23.381 + Tester_Class_1.var_22 += ((new Tester_Class_0[(byte)4.1707075152824266E306])[(byte)(short)(((Tester_Class_0)(Tester_Class_1.var_27 = "tmyiha")).var_4 &= 'e')]).var_4; 23.382 + return (new Tester_Class_1[((Tester_Class_0)(Tester_Class_1.var_27 = arg_1)).var_1 = (byte)2.8419246E38F][(byte)Tester_Class_1.var_22])[((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_1.var_27 = arg_0))).var_1 = (((Tester_Class_0)(Tester_Class_1.var_27 = (Tester_Class_0.var_8 = "nvyfpdyms"))).var_1 = (byte)Tester_Class_1.var_22--)][((Tester_Class_0)(Tester_Class_1.var_27 = "kklsnsnia")).var_1 = (byte)'[']; 23.383 + } 23.384 + 23.385 + double func_7(Object arg_0, final String arg_1) 23.386 + { 23.387 + if (false) 23.388 + { 23.389 + ((Tester_Class_0)arg_0).var_1 = (byte)'Z'; 23.390 + } 23.391 + else 23.392 + { 23.393 + ((Tester_Class_0)arg_0).var_3 = Tester_Class_0.var_8; 23.394 + } 23.395 + float var_41 = (true ? (new Tester_Class_1[((Tester_Class_0)arg_0).var_1 = (byte)var_36])[((Tester_Class_0)arg_0).var_1 = (byte)Tester_Class_1.var_22] : (Tester_Class_1)arg_0).var_23 /= 'n'; 23.396 + ++Tester_Class_1.var_22; 23.397 + return true ^ +func_6(arg_1, Tester_Class_0.var_8).var_23 < ~6945306015697774592L & (Tester_Class_1.var_28 |= var_36) <= var_36 ? + -1.4330949313452472E308 - -6602331706844466176L : Tester_Class_1.var_28; 23.398 + } 23.399 + 23.400 + private final static byte func_8(final Object arg_0, double arg_1, final double arg_2, double arg_3) 23.401 + { 23.402 + ((Tester_Class_1)arg_0).var_23 = (short)(!false && (new boolean[(byte)2.2566308E38F])[((Tester_Class_0)arg_0).var_1 = (byte)((Tester_Class_1)arg_0).var_25] ? arg_2 : 3.0315489414155014E307); 23.403 + short var_42 = (new short[((Tester_Class_0)arg_0).var_1 = (((Tester_Class_0)arg_0).var_1 = (byte)var_36)])[(byte)arg_2]; 23.404 + Tester_Class_1.var_22 <<= ((new Tester_Class_0[(byte)var_42])[((Tester_Class_0)arg_0).var_1 = (byte)'X']).var_4; 23.405 + (false ? new Tester_Class_0() : new Tester_Class_0()).var_4 *= 6.636831399350763E307; 23.406 + (true & false ^ !((Tester_Class_1)arg_0).equals(arg_0) ? (Tester_Class_0)arg_0 : (Tester_Class_0)arg_0).var_4 <<= (Tester_Class_1.var_22 >>>= (Tester_Class_1.var_28 -= Tester_Class_1.var_28)) / 1064434; 23.407 + int var_43; 23.408 + final Object var_44 = Tester_Class_1.var_27 = new byte[((Tester_Class_0)arg_0).var_1 = (byte)+arg_2]; 23.409 + ((Tester_Class_0)var_44).var_1 = (byte)arg_1; 23.410 + Tester_Class_1 var_45 = (3582921389614857216L != 2.132918E38F / Tester_Class_1.var_22 % (((Tester_Class_1)var_44).var_23 %= var_42--) ? false : false ^ !false) ? func_6(((Tester_Class_0)arg_0).var_6 = Tester_Class_0.var_8, Tester_Class_0.var_8 = Tester_Class_0.var_8) : (Tester_Class_1)arg_0; 23.411 + arg_1 *= false ? (false ? (byte)var_45.var_23 : (byte)var_45.var_24) : (byte)8158132319185776640L; 23.412 + Tester_Class_0.var_8 = (new Tester_Class_0().var_6 = "gvxkyj"); 23.413 + Tester_Class_1.var_27 = "bkfbu"; 23.414 + arg_1 *= (((Tester_Class_0)arg_0).var_4 += new Tester_Class_0().var_4); 23.415 + Tester_Class_0 var_46 = (false ? false && - (((Tester_Class_0)arg_0).var_1 = (byte)var_45.var_24) > var_45.var_23 - arg_2 : ("fn".startsWith(Tester_Class_0.var_8) && false) & !true) ? (Tester_Class_0)arg_0 : (Tester_Class_0)arg_0; 23.416 + return var_46.var_1 = (var_46.var_1 = (var_46.var_1 = (byte)var_45.var_23)); 23.417 + } 23.418 + 23.419 + public static void main(String[] args) 23.420 + { 23.421 + for (int i = 0; i < 100000; i++) { 23.422 + Tester t = new Tester(); 23.423 + try { 23.424 + t.test(); 23.425 + } catch(Throwable e) { 23.426 + } 23.427 + if (t.var_36 != -4918908939899620363L) { 23.428 + throw new InternalError(t.var_36 + " != -4918908939899620363"); 23.429 + } 23.430 + } 23.431 + } 23.432 + 23.433 + private void test() 23.434 + { 23.435 + ((Tester_Class_0)(Tester_Class_1.var_27 = new Tester_Class_0())).var_4 &= new Tester_Class_0().var_4 >>> (short)new Tester_Class_1().var_25; 23.436 + Tester_Class_1.var_22 <<= Tester_Class_1.var_22; 23.437 + Tester_Class_1.var_27 = ((true | ! !false) & false ? ! !true : 6.5017485E37F == (short)(Tester_Class_1.var_22 &= 'h')) ? (Tester_Class_1.var_27 = new Tester_Class_1()) : new Tester_Class_1(); 23.438 + (1.252611E37F < (((new Tester_Class_0[(byte)'X'])[(byte)6.916916470825763E307]).var_4 /= (byte)Tester_Class_1.var_28 < (new short[(byte)7.626803503643197E307])[(byte)var_36] ? (short)new Tester_Class_0().var_4 : (short)(byte)Tester_Class_1.var_22) ? (true ? new Tester_Class_0() : new Tester_Class_0()) : (true ? new Tester_Class_0() : (Tester_Class_0)(Tester_Class_1.var_27 = Tester_Class_0.var_8))).var_4 ^= Tester_Class_1.var_28++; 23.439 + (true ? new Tester_Class_1() : func_1(true, Tester_Class_1.var_27 = "jjgccelm")).var_23 -= (- - + + +1.2976166388790213E308 != ((!true ^ ! !true) & (short)(Tester_Class_1.var_28 &= var_36) <= (Tester_Class_1.var_26 = 'C') ? 1163089569715148800L : 8.591879058615699E307) ? (new Tester_Class_0().var_1 = (new Tester_Class_0().var_1 = (byte)2.7209893E38F)) : (!false ^ ! !false ? (short)'x' : (short)'a')) + 7620981797791666176L; 23.440 + new Tester_Class_0().var_4 ^= 8777687662500669440L; 23.441 + final String[] var_47 = new String[((1864097118983963648L | (Tester_Class_1.var_26 = '[')) < + (new Tester_Class_1().var_23 += --new Tester_Class_0().var_4) ? ! !true : false) ? (new Tester_Class_0().var_1 = (new Tester_Class_0().var_1 = (byte)2.6448988E38F)) : (byte)Tester_Class_1.var_22]; 23.442 + long var_48 = 0L; 23.443 + Tester_Class_0.var_2 = "nwcmc".codePointAt("wgcdlmd".compareTo("jyt")); 23.444 + do 23.445 + { 23.446 + Tester_Class_1.var_22 += new Tester_Class_0().var_4; 23.447 + var_48++; 23.448 + Tester_Class_1.var_27 = false ? "dfvpqs" : Tester_Class_0.var_8; 23.449 + new Tester_Class_0().var_1 = (new Tester_Class_0().var_1 = (new byte[(byte)2.2825838E38F])[(byte)4.2446597794703817E307]); 23.450 + } while ((true ? !false : false & !false) && (var_48 < 117 && true)); 23.451 + int var_49 = 0; 23.452 + Tester_Class_1.var_26 = 'I'; 23.453 + short var_50; 23.454 + while (var_49 < 225 && ('U' | ~ ((byte)9.556538701292864E306)) < var_49) 23.455 + { 23.456 + var_50 = (var_50 = ((byte)1.2016701369644112E308 != (var_50 = (short)1.2518271E38F) ^ !true ? !true : false) ? (short)6.629572378442352E307 : (byte)'O'); 23.457 + var_49++; 23.458 + var_50 = true ? (byte)Tester_Class_1.var_22 : (byte)(Tester_Class_1.var_22 = (byte)var_48); 23.459 + byte var_51; 23.460 + short var_52; 23.461 + } 23.462 + Tester_Class_1.var_27 = Tester_Class_0.var_8 + "r"; 23.463 + var_50 = (var_50 = true ^ ! (!false ^ false) ? (byte)573442894 : (byte)2.1479471E38F); 23.464 + ((var_50 = (short)'w') >= (new Tester_Class_0().var_1 = (byte)5.148172E37F) & true ? new Tester_Class_0() : new Tester_Class_0()).var_4 >>= true ? (new Tester_Class_0().var_4 /= (byte)Tester_Class_1.var_28) : (Tester_Class_1.var_26 = '^'); 23.465 + float var_53; 23.466 + (func_6(Tester_Class_0.var_8, Tester_Class_0.var_8).var_24 <= (var_50 = (var_50 = (short)var_48)) ^ !true | true & true | true ^ false ? (Tester_Class_1)(Tester_Class_1.var_27 = Tester_Class_0.var_8) : new Tester_Class_1()).var_23 /= ((new Tester_Class_0[(byte)1.6656795E38F])[new Tester_Class_0().var_1 = (byte)1.212530193895014E308]).var_4; 23.467 + long var_54 = 0L; 23.468 + Object var_55; 23.469 + (true | --new Tester_Class_0().var_4 == 2898909413610959872L & true == true ? func_6(Tester_Class_0.var_8, Tester_Class_0.var_8) : new Tester_Class_1()).var_23 %= 7471272661059674112L; 23.470 + while (false & (false | 5.7300464E37F != (short)(Tester_Class_0.var_2 = (short)var_36)) && var_54 < 293) 23.471 + { 23.472 + func_6(Tester_Class_0.var_8 = "wts", Tester_Class_0.var_8 = (Tester_Class_0.var_8 = Tester_Class_0.var_8)).var_25 |= (Tester_Class_1.var_22 ^= (var_50 = (byte)1.0904691577897794E308)); 23.473 + var_54++; 23.474 + (false ? func_6(Tester_Class_0.var_8, "inujn") : func_6(Tester_Class_0.var_8, Tester_Class_0.var_8 = Tester_Class_0.var_8)).var_23 /= (Tester_Class_0.var_2 = (var_50 = (((Tester_Class_0)(var_55 = Tester_Class_0.var_8)).var_1 = (byte)(short)Tester_Class_1.var_28))); 23.475 + Tester_Class_0.var_8 = Tester_Class_0.var_8; 23.476 + } 23.477 + var_50 = func_3(new Tester_Class_0().var_1 = (new Tester_Class_0().var_1 = (byte)var_36), var_50 = (var_50 = (var_50 = (byte)var_36))); 23.478 + Tester_Class_1.var_22++; 23.479 + Tester_Class_1.var_28 <<= 'Y'; 23.480 + } 23.481 +}