Merge

Mon, 28 Apr 2008 08:08:12 -0700

author
rasbold
date
Mon, 28 Apr 2008 08:08:12 -0700
changeset 563
a76240c8b133
parent 557
ec73d88d5b43
parent 562
e0bd2e08e3d0
child 565
3e2d987e2e68
child 572
53735b80b9f1

Merge

src/share/vm/opto/memnode.cpp file | annotate | diff | comparison | revisions
src/share/vm/opto/node.hpp file | annotate | diff | comparison | revisions
src/share/vm/runtime/sharedRuntime.cpp file | annotate | diff | comparison | revisions
     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 +}

mercurial