# HG changeset patch # User kvn # Date 1214512440 25200 # Node ID 1dd146f175314e866caa6efc6083cbb94738bf9f # Parent 2a1a77d3458f445409f8c2ccbb44865615f916b7 6716441: error in meet with +DoEscapeAnalysis Summary: Set instance_id to InstanceBot for InstPtr->meet(AryPtr) when types are not related. Reviewed-by: jrose, never diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/callnode.cpp --- a/src/share/vm/opto/callnode.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/callnode.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -632,7 +632,7 @@ const TypeOopPtr *adrInst_t = addr_t->isa_oopptr(); // if not an InstPtr or not an instance type, assume the worst - if (adrInst_t == NULL || !adrInst_t->is_instance_field()) { + if (adrInst_t == NULL || !adrInst_t->is_known_instance_field()) { return true; } Compile *C = phase->C; diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/cfgnode.cpp --- a/src/share/vm/opto/cfgnode.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/cfgnode.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -708,12 +708,12 @@ // Split out an instance type from a bottom phi. PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const { const TypeOopPtr *t_oop = at->isa_oopptr(); - assert(t_oop != NULL && t_oop->is_instance(), "expecting instance oopptr"); + assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr"); const TypePtr *t = adr_type(); assert(type() == Type::MEMORY && (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || - t->isa_oopptr() && !t->is_oopptr()->is_instance() && - t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop), + t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && + t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop), "bottom or raw memory required"); // Check if an appropriate node already exists. diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/cfgnode.hpp --- a/src/share/vm/opto/cfgnode.hpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/cfgnode.hpp Thu Jun 26 13:34:00 2008 -0700 @@ -129,7 +129,7 @@ }; PhiNode( Node *r, const Type *t, const TypePtr* at = NULL, - const int iid = TypeOopPtr::UNKNOWN_INSTANCE, + const int iid = TypeOopPtr::InstanceTop, const int iidx = Compile::AliasIdxTop, const int ioffs = Type::OffsetTop ) : TypeNode(t,r->req()), diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/compile.cpp --- a/src/share/vm/opto/compile.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/compile.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -1069,7 +1069,7 @@ // No constant oop pointers (such as Strings); they alias with // unknown strings. tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset); - } else if( to->is_instance_field() ) { + } else if( to->is_known_instance_field() ) { tj = to; // Keep NotNull and klass_is_exact for instance type } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) { // During the 2nd round of IterGVN, NotNull castings are removed. @@ -1190,8 +1190,8 @@ _field = NULL; _is_rewritable = true; // default const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL; - if (atoop != NULL && atoop->is_instance()) { - const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); + if (atoop != NULL && atoop->is_known_instance()) { + const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot); _general_index = Compile::current()->get_alias_index(gt); } else { _general_index = 0; diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/escape.cpp --- a/src/share/vm/opto/escape.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/escape.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -483,7 +483,7 @@ // void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) { const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr(); - assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr"); + assert(base_t != NULL && base_t->is_known_instance(), "expecting instance oopptr"); const TypeOopPtr *t = igvn->type(addp)->isa_oopptr(); if (t == NULL) { // We are computing a raw address for a store captured by an Initialize @@ -494,8 +494,8 @@ assert(offs != Type::OffsetBot, "offset must be a constant"); t = base_t->add_offset(offs)->is_oopptr(); } - uint inst_id = base_t->instance_id(); - assert(!t->is_instance() || t->instance_id() == inst_id, + int inst_id = base_t->instance_id(); + assert(!t->is_known_instance() || t->instance_id() == inst_id, "old type must be non-instance or match new type"); const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr(); // Do NOT remove the next call: ensure an new alias index is allocated @@ -509,7 +509,7 @@ Node *adr = addp->in(AddPNode::Address); const TypeOopPtr *atype = igvn->type(adr)->isa_oopptr(); if (atype != NULL && atype->instance_id() != inst_id) { - assert(!atype->is_instance(), "no conflicting instances"); + assert(!atype->is_known_instance(), "no conflicting instances"); const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr(); Node *acast = new (_compile, 2) CastPPNode(adr, new_atype); acast->set_req(0, adr->in(0)); @@ -663,7 +663,7 @@ return orig_mem; Compile* C = phase->C; const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr(); - bool is_instance = (tinst != NULL) && tinst->is_instance(); + bool is_instance = (tinst != NULL) && tinst->is_known_instance(); Node *prev = NULL; Node *result = orig_mem; while (prev != result) { @@ -693,7 +693,7 @@ AllocateNode* alloc = proj_in->as_Initialize()->allocation(); // Stop if this is the initialization for the object instance which // which contains this memory slice, otherwise skip over it. - if (alloc == NULL || alloc->_idx != tinst->instance_id()) { + if (alloc == NULL || alloc->_idx != (uint)tinst->instance_id()) { result = proj_in->in(TypeFunc::Memory); } } else if (proj_in->is_MemBar()) { @@ -887,7 +887,7 @@ const TypeOopPtr *t = igvn->type(n)->isa_oopptr(); if (t == NULL) continue; // not a TypeInstPtr - tinst = t->cast_to_instance(ni); + tinst = t->cast_to_instance_id(ni); igvn->hash_delete(n); igvn->set_type(n, tinst); n->raise_bottom_type(tinst); @@ -959,14 +959,19 @@ Node *val = get_map(elem); // CheckCastPP node TypeNode *tn = n->as_Type(); tinst = igvn->type(val)->isa_oopptr(); - assert(tinst != NULL && tinst->is_instance() && - tinst->instance_id() == elem , "instance type expected."); + assert(tinst != NULL && tinst->is_known_instance() && + (uint)tinst->instance_id() == elem , "instance type expected."); const Type *tn_type = igvn->type(tn); - const TypeOopPtr *tn_t = tn_type->make_ptr()->isa_oopptr(); + const TypeOopPtr *tn_t; + if (tn_type->isa_narrowoop()) { + tn_t = tn_type->make_ptr()->isa_oopptr(); + } else { + tn_t = tn_type->isa_oopptr(); + } if (tn_t != NULL && - tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) { + tinst->cast_to_instance_id(TypeOopPtr::InstanceBot)->higher_equal(tn_t)) { if (tn_type->isa_narrowoop()) { tn_type = tinst->make_narrowoop(); } else { diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/loopopts.cpp --- a/src/share/vm/opto/loopopts.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/loopopts.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -41,7 +41,7 @@ const Type* type = n->bottom_type(); const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr(); Node *phi; - if( t_oop != NULL && t_oop->is_instance_field() ) { + if( t_oop != NULL && t_oop->is_known_instance_field() ) { int iid = t_oop->instance_id(); int index = C->get_alias_index(t_oop); int offset = t_oop->offset(); diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/macro.cpp --- a/src/share/vm/opto/macro.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/macro.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -320,9 +320,9 @@ // Search the last value stored into the object's field. Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) { - assert(adr_t->is_instance_field(), "instance required"); - uint instance_id = adr_t->instance_id(); - assert(instance_id == alloc->_idx, "wrong allocation"); + assert(adr_t->is_known_instance_field(), "instance required"); + int instance_id = adr_t->instance_id(); + assert((uint)instance_id == alloc->_idx, "wrong allocation"); int alias_idx = C->get_alias_index(adr_t); int offset = adr_t->offset(); @@ -354,7 +354,7 @@ const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr(); assert(atype != NULL, "address type must be oopptr"); assert(C->get_alias_index(atype) == alias_idx && - atype->is_instance_field() && atype->offset() == offset && + atype->is_known_instance_field() && atype->offset() == offset && atype->instance_id() == instance_id, "store is correct memory slice"); done = true; } else if (mem->is_Phi()) { diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/memnode.cpp --- a/src/share/vm/opto/memnode.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/memnode.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -91,7 +91,7 @@ Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) { const TypeOopPtr *tinst = t_adr->isa_oopptr(); - if (tinst == NULL || !tinst->is_instance_field()) + if (tinst == NULL || !tinst->is_known_instance_field()) return mchain; // don't try to optimize non-instance types uint instance_id = tinst->instance_id(); Node *prev = NULL; @@ -125,7 +125,7 @@ Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) { const TypeOopPtr *t_oop = t_adr->isa_oopptr(); - bool is_instance = (t_oop != NULL) && t_oop->is_instance_field(); + bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field(); PhaseIterGVN *igvn = phase->is_IterGVN(); Node *result = mchain; result = optimize_simple_memory_chain(result, t_adr, phase); @@ -134,8 +134,8 @@ assert(mphi->bottom_type() == Type::MEMORY, "memory phi required"); const TypePtr *t = mphi->adr_type(); if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM || - t->isa_oopptr() && !t->is_oopptr()->is_instance() && - t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop) { + t->isa_oopptr() && !t->is_oopptr()->is_known_instance() && + t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) { // clone the Phi with our address type result = mphi->split_out_instance(t_adr, igvn); } else { @@ -470,7 +470,7 @@ return mem; // let caller handle steps (c), (d) } - } else if (addr_t != NULL && addr_t->is_instance_field()) { + } else if (addr_t != NULL && addr_t->is_known_instance_field()) { // Can't use optimize_simple_memory_chain() since it needs PhaseGVN. if (mem->is_Proj() && mem->in(0)->is_Call()) { CallNode *call = mem->in(0)->as_Call(); @@ -916,7 +916,7 @@ in(MemNode::Address)->is_AddP() ) { const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr(); // Only instances. - if( t_oop != NULL && t_oop->is_instance_field() && + if( t_oop != NULL && t_oop->is_known_instance_field() && t_oop->offset() != Type::OffsetBot && t_oop->offset() != Type::OffsetTop) { return true; @@ -1139,7 +1139,7 @@ const TypeOopPtr *t_oop = addr_t->isa_oopptr(); assert(mem->is_Phi() && (t_oop != NULL) && - t_oop->is_instance_field(), "invalide conditions"); + t_oop->is_known_instance_field(), "invalide conditions"); Node *region = mem->in(0); if (region == NULL) { @@ -1307,7 +1307,7 @@ } const TypeOopPtr *t_oop = addr_t->isa_oopptr(); if (can_reshape && opt_mem->is_Phi() && - (t_oop != NULL) && t_oop->is_instance_field()) { + (t_oop != NULL) && t_oop->is_known_instance_field()) { // Split instance field load through Phi. Node* result = split_through_phi(phase); if (result != NULL) return result; @@ -1542,7 +1542,7 @@ } const TypeOopPtr *tinst = tp->isa_oopptr(); - if (tinst != NULL && tinst->is_instance_field()) { + if (tinst != NULL && tinst->is_known_instance_field()) { // If we have an instance type and our memory input is the // programs's initial memory state, there is no matching store, // so just return a zero of the appropriate type @@ -2137,7 +2137,7 @@ const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr(); if (adr_oop == NULL) return false; - if (!adr_oop->is_instance_field()) + if (!adr_oop->is_known_instance_field()) return false; // if not a distinct instance, there may be aliases of the address for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) { Node *use = adr->fast_out(i); diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/type.cpp --- a/src/share/vm/opto/type.cpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/type.cpp Thu Jun 26 13:34:00 2008 -0700 @@ -168,20 +168,7 @@ const Type *Type::make( enum TYPES t ) { return (new Type(t))->hashcons(); } -/* -//------------------------------make_ptr--------------------------------------- -// Returns this ptr type or the equivalent ptr type for this compressed pointer. -const TypePtr* Type::make_ptr() const { - return (_base == NarrowOop) ? is_narrowoop()->make_oopptr() : is_ptr(); -} - -//------------------------------make_narrowoop--------------------------------- -// Returns this compressed pointer or the equivalent compressed version -// of this pointer type. -const TypeNarrowOop* Type::make_narrowoop() const { - return (_base == NarrowOop) ? is_narrowoop() : TypeNarrowOop::make(is_ptr()); -} -*/ + //------------------------------cmp-------------------------------------------- int Type::cmp( const Type *const t1, const Type *const t2 ) { if( t1->_base != t2->_base ) @@ -527,23 +514,8 @@ bool t_interface = t_inst->klass()->is_interface(); interface_vs_oop = this_interface ^ t_interface; } - const Type *tdual = t->_dual; - const Type *thisdual = _dual; - // strip out instances - if (t2t->isa_oopptr() != NULL) { - t2t = t2t->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (t2this->isa_oopptr() != NULL) { - t2this = t2this->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (tdual->isa_oopptr() != NULL) { - tdual = tdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - if (thisdual->isa_oopptr() != NULL) { - thisdual = thisdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); - } - - if( !interface_vs_oop && (t2t != tdual || t2this != thisdual) ) { + + if( !interface_vs_oop && (t2t != t->_dual || t2this != _dual) ) { tty->print_cr("=== Meet Not Symmetric ==="); tty->print("t = "); t->dump(); tty->cr(); tty->print("this= "); dump(); tty->cr(); @@ -2235,7 +2207,7 @@ ciKlass* k = ciKlassKlass::make(); bool xk = false; ciObject* o = NULL; - return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, UNKNOWN_INSTANCE))->hashcons(); + return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons(); } @@ -2247,7 +2219,7 @@ } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeOopPtr::cast_to_instance(int instance_id) const { +const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const { // There are no instances of a general oop. // Return self unchanged. return this; @@ -2341,7 +2313,7 @@ const Type *TypeOopPtr::xdual() const { assert(klass() == ciKlassKlass::make(), "no klasses here"); assert(const_oop() == NULL, "no constants here"); - return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() ); + return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() ); } //--------------------------make_from_klass_common----------------------------- @@ -2555,7 +2527,9 @@ case 0: break; default: st->print("+%d",_offset); break; } - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif @@ -2587,16 +2561,24 @@ return make( _ptr, xadd_offset(offset) ); } -int TypeOopPtr::meet_instance(int iid) const { - if (iid == 0) { - return (_instance_id < 0) ? _instance_id : UNKNOWN_INSTANCE; - } else if (_instance_id == UNKNOWN_INSTANCE) { - return (iid < 0) ? iid : UNKNOWN_INSTANCE; - } else { - return (_instance_id == iid) ? iid : UNKNOWN_INSTANCE; - } +//------------------------------meet_instance_id-------------------------------- +int TypeOopPtr::meet_instance_id( int instance_id ) const { + // Either is 'TOP' instance? Return the other instance! + if( _instance_id == InstanceTop ) return instance_id; + if( instance_id == InstanceTop ) return _instance_id; + // If either is different, return 'BOTTOM' instance + if( _instance_id != instance_id ) return InstanceBot; + return _instance_id; } +//------------------------------dual_instance_id-------------------------------- +int TypeOopPtr::dual_instance_id( ) const { + if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM + if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP + return _instance_id; // Map everything else into self +} + + //============================================================================= // Convenience common pre-built types. const TypeInstPtr *TypeInstPtr::NOTNULL; @@ -2628,7 +2610,7 @@ // Ptr is never Null assert( ptr != Null, "NULL pointers are not typed" ); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = false; if (ptr == Constant) { @@ -2653,7 +2635,7 @@ if( ptr == _ptr ) return this; // Reconstruct _sig info here since not a problem with later lazy // construction, _sig will show up on demand. - return make(ptr, klass(), klass_is_exact(), const_oop(), _offset); + return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id); } @@ -2669,13 +2651,13 @@ } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeInstPtr::cast_to_instance(int instance_id) const { - if( instance_id == _instance_id) return this; - bool exact = true; - PTR ptr_t = NotNull; - if (instance_id == UNKNOWN_INSTANCE) { - exact = _klass_is_exact; - ptr_t = _ptr; +const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; + bool exact = _klass_is_exact; + PTR ptr_t = _ptr; + if ( instance_id > 0 ) { // instances are always exactly typed + if (UseExactTypes) exact = true; + ptr_t = NotNull; } return make(ptr_t, klass(), exact, const_oop(), _offset, instance_id); } @@ -2758,16 +2740,17 @@ const TypeAryPtr *tp = t->is_aryptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); - int iid = meet_instance(tp->instance_id()); + int instance_id = meet_instance_id(tp->instance_id()); switch (ptr) { case TopPTR: case AnyNull: // Fall 'down' to dual of object klass if (klass()->equals(ciEnv::current()->Object_klass())) { - return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid); + return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id); } else { // cannot subclass, so the meet has to fall badly below the centerline ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id); } case Constant: case NotNull: @@ -2778,14 +2761,15 @@ // then we can subclass in the Java class heirarchy. if (klass()->equals(ciEnv::current()->Object_klass())) { // that is, tp's array type is a subtype of my klass - return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid); + return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id); } } // The other case cannot happen, since I cannot be a subtype of an array. // The meet falls down to Object class below centerline. if( ptr == Constant ) ptr = NotNull; - return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid ); + instance_id = InstanceBot; + return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id ); default: typerr(t); } } @@ -2797,9 +2781,11 @@ PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { case TopPTR: - case AnyNull: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); return make(ptr, klass(), klass_is_exact(), - (ptr == Constant ? const_oop() : NULL), offset); + (ptr == Constant ? const_oop() : NULL), offset, instance_id); + } case NotNull: case BotPTR: return TypeOopPtr::make(ptr, offset); @@ -2815,10 +2801,13 @@ switch (tp->ptr()) { case Null: if( ptr == Null ) return TypePtr::make( AnyPtr, ptr, offset ); + // else fall through to AnyNull case TopPTR: - case AnyNull: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); return make( ptr, klass(), klass_is_exact(), - (ptr == Constant ? const_oop() : NULL), offset ); + (ptr == Constant ? const_oop() : NULL), offset, instance_id); + } case NotNull: case BotPTR: return TypePtr::make( AnyPtr, ptr, offset ); @@ -2847,7 +2836,7 @@ const TypeInstPtr *tinst = t->is_instptr(); int off = meet_offset( tinst->offset() ); PTR ptr = meet_ptr( tinst->ptr() ); - int instance_id = meet_instance(tinst->instance_id()); + int instance_id = meet_instance_id(tinst->instance_id()); // Check for easy case; klasses are equal (and perhaps not loaded!) // If we have constants, then we created oops so classes are loaded @@ -2916,7 +2905,7 @@ // Find out which constant. o = (this_klass == klass()) ? const_oop() : tinst->const_oop(); } - return make( ptr, k, xk, o, off ); + return make( ptr, k, xk, o, off, instance_id ); } // Either oop vs oop or interface vs interface or interface vs Object @@ -3003,7 +2992,7 @@ // Now we find the LCA of Java classes ciKlass* k = this_klass->least_common_ancestor(tinst_klass); - return make( ptr, k, false, NULL, off ); + return make( ptr, k, false, NULL, off, instance_id ); } // End of case InstPtr case KlassPtr: @@ -3030,7 +3019,7 @@ // Dual: do NOT dual on klasses. This means I do NOT understand the Java // inheritence mechanism. const Type *TypeInstPtr::xdual() const { - return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance() ); + return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id() ); } //------------------------------eq--------------------------------------------- @@ -3082,7 +3071,9 @@ } st->print(" *"); - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif @@ -3110,7 +3101,7 @@ assert(!(k == NULL && ary->_elem->isa_int()), "integral arrays must be pre-equipped with a class"); if (!xk) xk = ary->ary_must_be_exact(); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = (ptr == Constant); return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id))->hashcons(); @@ -3122,7 +3113,7 @@ "integral arrays must be pre-equipped with a class"); assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" ); if (!xk) xk = (o != NULL) || ary->ary_must_be_exact(); - if (instance_id != UNKNOWN_INSTANCE) + if ( instance_id > 0 ) xk = true; // instances are always exactly typed if (!UseExactTypes) xk = (ptr == Constant); return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id))->hashcons(); @@ -3131,7 +3122,7 @@ //------------------------------cast_to_ptr_type------------------------------- const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const { if( ptr == _ptr ) return this; - return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset); + return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id); } @@ -3144,13 +3135,13 @@ } //-----------------------------cast_to_instance------------------------------- -const TypeOopPtr *TypeAryPtr::cast_to_instance(int instance_id) const { - if( instance_id == _instance_id) return this; - bool exact = true; - PTR ptr_t = NotNull; - if (instance_id == UNKNOWN_INSTANCE) { - exact = _klass_is_exact; - ptr_t = _ptr; +const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; + bool exact = _klass_is_exact; + PTR ptr_t = _ptr; + if ( instance_id > 0 ) { // instances are always exactly typed + if (UseExactTypes) exact = true; + ptr_t = NotNull; } return make(ptr_t, const_oop(), _ary, klass(), exact, _offset, instance_id); } @@ -3203,7 +3194,7 @@ new_size = TypeInt::ZERO; // intermediate dead fast-path goo if (new_size == size()) return this; const TypeAry* new_ary = TypeAry::make(elem(), new_size); - return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset); + return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id); } @@ -3255,8 +3246,11 @@ PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { case TopPTR: - case AnyNull: - return make(ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset); + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + return make(ptr, (ptr == Constant ? const_oop() : NULL), + _ary, _klass, _klass_is_exact, offset, instance_id); + } case BotPTR: case NotNull: return TypeOopPtr::make(ptr, offset); @@ -3277,8 +3271,12 @@ return TypePtr::make(AnyPtr, ptr, offset); case Null: if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset); - case AnyNull: - return make( ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset ); + // else fall through to AnyNull + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + return make( ptr, (ptr == Constant ? const_oop() : NULL), + _ary, _klass, _klass_is_exact, offset, instance_id); + } default: ShouldNotReachHere(); } } @@ -3290,7 +3288,7 @@ int off = meet_offset(tap->offset()); const TypeAry *tary = _ary->meet(tap->_ary)->is_ary(); PTR ptr = meet_ptr(tap->ptr()); - int iid = meet_instance(tap->instance_id()); + int instance_id = meet_instance_id(tap->instance_id()); ciKlass* lazy_klass = NULL; if (tary->_elem->isa_int()) { // Integral array element types have irrelevant lattice relations. @@ -3311,7 +3309,7 @@ case TopPTR: // Compute new klass on demand, do not use tap->_klass xk = (tap->_klass_is_exact | this->_klass_is_exact); - return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid ); + return make( ptr, const_oop(), tary, lazy_klass, xk, off, instance_id ); case Constant: { ciObject* o = const_oop(); if( _ptr == Constant ) { @@ -3323,7 +3321,7 @@ o = tap->const_oop(); } xk = true; - return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid ); + return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id ); } case NotNull: case BotPTR: @@ -3334,7 +3332,7 @@ xk = this->_klass_is_exact; else xk = (tap->_klass_is_exact & this->_klass_is_exact) && (klass() == tap->klass()); // Only precise for identical arrays - return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, iid ); + return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, instance_id ); default: ShouldNotReachHere(); } } @@ -3344,16 +3342,17 @@ const TypeInstPtr *tp = t->is_instptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); - int iid = meet_instance(tp->instance_id()); + int instance_id = meet_instance_id(tp->instance_id()); switch (ptr) { case TopPTR: case AnyNull: // Fall 'down' to dual of object klass if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) { - return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, iid ); + return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id ); } else { // cannot subclass, so the meet has to fall badly below the centerline ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id); } case Constant: case NotNull: @@ -3364,14 +3363,15 @@ // then we can subclass in the Java class heirarchy. if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) { // that is, my array type is a subtype of 'tp' klass - return make( ptr, _ary, _klass, _klass_is_exact, offset, iid ); + return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id ); } } // The other case cannot happen, since t cannot be a subtype of an array. // The meet falls down to Object class below centerline. if( ptr == Constant ) ptr = NotNull; - return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid); + instance_id = InstanceBot; + return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id); default: typerr(t); } } @@ -3386,7 +3386,7 @@ //------------------------------xdual------------------------------------------ // Dual: compute field-by-field dual const Type *TypeAryPtr::xdual() const { - return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance() ); + return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id() ); } //------------------------------dump2------------------------------------------ @@ -3423,7 +3423,9 @@ } } st->print(" *"); - if (_instance_id != UNKNOWN_INSTANCE) + if (_instance_id == InstanceTop) + st->print(",iid=top"); + else if (_instance_id != InstanceBot) st->print(",iid=%d",_instance_id); } #endif diff -r 2a1a77d3458f -r 1dd146f17531 src/share/vm/opto/type.hpp --- a/src/share/vm/opto/type.hpp Tue Jun 24 16:00:14 2008 -0700 +++ b/src/share/vm/opto/type.hpp Thu Jun 26 13:34:00 2008 -0700 @@ -654,7 +654,8 @@ virtual int hash() const; // Type specific hashing virtual bool singleton(void) const; // TRUE if type is a singleton enum { - UNKNOWN_INSTANCE = 0 + InstanceTop = -1, // undefined instance + InstanceBot = 0 // any possible instance }; protected: @@ -667,14 +668,15 @@ bool _klass_is_exact; bool _is_ptr_to_narrowoop; - int _instance_id; // if not UNKNOWN_INSTANCE, indicates that this is a particular instance - // of this type which is distinct. This is the the node index of the - // node creating this instance + // If not InstanceTop or InstanceBot, indicates that this is + // a particular instance of this type which is distinct. + // This is the the node index of the allocation node creating this instance. + int _instance_id; static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact); - int dual_instance() const { return -_instance_id; } - int meet_instance(int uid) const; + int dual_instance_id() const; + int meet_instance_id(int uid) const; public: // Creates a type given a klass. Correctly handles multi-dimensional arrays @@ -707,9 +709,9 @@ // compressed oop references. bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; } - bool is_instance() const { return _instance_id != UNKNOWN_INSTANCE; } - uint instance_id() const { return _instance_id; } - bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; } + bool is_known_instance() const { return _instance_id > 0; } + int instance_id() const { return _instance_id; } + bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; } virtual intptr_t get_con() const; @@ -717,7 +719,7 @@ virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; // corresponding pointer to klass, for a given instance const TypeKlassPtr* as_klass_type() const; @@ -778,7 +780,7 @@ } // Make a pointer to an oop. - static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = 0 ); + static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot ); // If this is a java.lang.Class constant, return the type for it or NULL. // Pass to Type::get_const_type to turn it to a type, which will usually @@ -789,7 +791,7 @@ virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; virtual const TypePtr *add_offset( int offset ) const; @@ -823,9 +825,9 @@ const Type* elem() const { return _ary->_elem; } const TypeInt* size() const { return _ary->_size; } - static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0); + static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot); // Constant pointer to array - static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0); + static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot); // Convenience static const TypeAryPtr *make(ciObject* o); @@ -835,7 +837,7 @@ virtual const Type *cast_to_exactness(bool klass_is_exact) const; - virtual const TypeOopPtr *cast_to_instance(int instance_id) const; + virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const; virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const; diff -r 2a1a77d3458f -r 1dd146f17531 test/compiler/6716441/Tester.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/compiler/6716441/Tester.java Thu Jun 26 13:34:00 2008 -0700 @@ -0,0 +1,940 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6716441 + * @summary error in meet with +DoEscapeAnalysis + * @run main/othervm -Xcomp -XX:+AggressiveOpts Tester + */ + +/* Complexity upper bound: 70070 ops */ + +class Tester_Class_0 { + Object var_1; + + + public Tester_Class_0() + { + var_1 = "cmlv"; + { + final Object var_7 = false ? (var_1 = "flwnujmm") : (var_1 = ""); + } + float var_8 = 0F; + boolean var_9; + do + { + ((var_9 = (var_9 = (var_9 = false))) && true ? new String("yvirc") : "rmfkjbx").indexOf(99854165); + var_8++; + boolean var_10 = true; + var_10 |= true ? true : false; + var_10 |= false | var_10 ? (var_10 |= true) : true; + } while (var_8 < 1 && "tpb".charAt(~ ((byte)2449669946597620736L)) >>> (byte)1.704554E38F >= ('t' < var_8 ? (short)var_8 : 1237471887 / +4199632387838836736L)); + var_1 = (var_1 = "y"); + switch ((var_9 = "".equalsIgnoreCase("kqalxwsnu") | false) ? (new char[(byte)1.3230508534158742E308])[(byte)(short)93390917] : 'c') + { + case 'U': + + case 'W': + + case 'A': + + case 72: + + } + var_9 = (var_9 = false); + float var_11 = 0F; + var_9 = true; + for (var_1 = (var_1 = new boolean[(new byte[(byte)'O'])[(byte)'l']]); var_11 < 2; var_1 = (true ? "" : "nn").toUpperCase()) + { + var_9 = true; + var_11++; + var_9 = true; + int var_12 = (new short[(byte)1825213428])[(byte)1.6151095881186834E308] + (byte)(short)'V'; + } + var_1 = (new boolean[(byte)1546704177][(byte)6314352927310996480L][(byte)6838913812451802112L])["e".equalsIgnoreCase("d") ? (byte)3.964472879846357E307 : (byte)'L']; + var_9 = (var_9 = false); + } + + + + protected Object clone() + { + var_1 = (var_1 = "dbogknllu"); + var_1 = "jljax"; + var_1 = (var_1 = false ? "s" : "upqinst"); + if (false) + { + var_1 = (var_1 = (var_1 = "nwhu")); + } + else + { + short var_2; + var_2 = false ? (byte)((short)'e' - (byte)2.267975E38F) : (byte)1.28920093132789E308; + } + (((byte)2.3450009E38F >= (byte)- (+ - -1.6256751428449317E306 * 954071273906192384L) ? true : true) ? "gpv".substring(468176669, 1915798010) : "macqbvf").offsetByCodePoints("ivwivjege".charAt(1819923298) >>> (byte)((- ~653213024937366528L + 'N') * +1.0297164E38F) + (short)~ + -4535402293751053312L, (short)3837656677199316992L + (new byte[(byte)2.1586717E38F])[(byte)((short)719847962 - 8.599263E37F)]); + new String((char)650047353 > (short)'I' ? "maygldu".replaceAll("hpn", "bacoyows") : "nkx").endsWith(new String("h" + "vx")); + byte var_3; + return var_1 = "vbiccvdu"; + } + + public boolean equals(Object obj) + { + var_1 = "rxpocj"; + obj = "ndogtwvuh"; + { + { + var_1 = "vmdkvs"; + } + final boolean var_4 = false; + long var_5; + var_5 = (short)'G' >> + ((byte)1.1872624048733707E308); + } + var_1 = (new byte[(byte)(short)1.7804576633213148E308][(byte)(short)8.300151422843056E307])[(byte)3110360603258978304L]; + obj = "fudebwroh"; + obj = new Object[(false && false) & false ? (byte)8796624364629753856L : (byte)- +1.5843542184394165E308]; + if (true) + { + var_1 = new float[(byte)1372189277][(byte)((byte)8.352642520619892E307 == (! !false ^ true ? (short)1.3871033E37F : (byte)'f') ? 7.33899E37F - (short)2.2558552E37F : 2.6072269E38F)]; + } + else + { + var_1 = obj; + obj = new boolean[(byte)8.623747E37F][(byte)~ ((byte)(short)(byte)2100816354)]; + } + var_1 = new int[(new byte[(byte)7410132537719084032L])[(byte)1524949007]][(byte)((long)9188640 ^ 'n')]; + if (-3.0364305E38F > 8.114229090672013E307) + { + var_1 = (var_1 = new boolean[(byte)1.0354788699727844E308][(byte)-4867581638981979136L]); + } + else + { + obj = (obj = obj); + obj = (new int[(byte)'f'][(byte)7563033606293564416L])[(byte)2052737645]; + } + long var_6; + var_6 = (+ + ~3862500564271147008L != (short)8549491352795953152L || (byte)+ + (var_6 = 'D') > (var_6 = 1687952259)) && true ? (short)1756260278 : (byte)(short)3.202384E36F; + return false ^ ((false ? !true : true) ? false : (true ? ! !false : false)); + } + + + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_0.var_1 = "; result += Tester.Printer.print(var_1); + result += ""; + result += "\n]"; + return result; + } +} + + +interface Tester_Interface_1 { +} + + +final class Tester_Class_2 extends Tester_Class_0 { + static char var_13; + final static long var_14 = ~ ~ (((false ? !true ^ !true : !false | true) ? (byte)1.4363583E38F : (byte)(short)'X') * + + +3767002589844008960L << (var_13 = (var_13 = 'X'))); + + + public Tester_Class_2() + { + ((true ? (byte)- ((byte)2.6338962E38F) : (byte)'H') <= (short)8.671266E37F || !false & true ? (Tester_Class_0)(var_1 = "tgoexsr") : (Tester_Class_0)(var_1 = "mptusv")).var_1 = "tbxbgyti"; + var_1 = true ? (var_1 = "islgpxwa") : "rypkbu"; + var_1 = "vngiif"; + var_13 = (var_13 = (short)~ (-3250577075350561792L + +2983539228635145216L - '`') < 861590495 * (short)1.5299644E38F ? 'V' : 'G'); + Object[] var_27; + var_1 = (var_1 = "glu"); + } + + + + + + private static int func_0(Tester_Interface_1 arg_0, Tester_Interface_1 arg_1, final int arg_2) + { + var_13 = 'i'; + new String(); + (true ? "pu" : "oltbcysyd").substring(1236315614); + byte var_15; + var_15 = (new byte[(byte)1582653493940204544L][(byte)(char)-1.5806537192822515E308])[(byte)1.2986292E38F][(byte)(short)arg_2]; + if (true || true) + { + ((new Tester_Class_2[var_15 = (byte)'q'])[var_15 = 7.653082E37F < (var_13 = 'o') ? (byte)- - + +3.1640875E38F : (byte)-6820511772487837696L]).var_1 = (new Tester_Class_0[(byte)(short)(new byte[(byte)1080194717])[(byte)8297829563314362368L]])[var_15 = (var_15 = (var_15 = (var_15 = (byte)'t')))]; + double[] var_16; + } + else + { + arg_1 = (arg_1 = arg_0); + } + var_13 = (var_13 = 'o'); + var_13 = (false || false ^ false) ^ !true ? 'Z' : (var_13 = 'i'); + return true ? (var_15 = (byte)'C') : 1120493294; + } + + static double func_1(final int arg_0, long arg_1, long arg_2) + { + "ghtfhmbeg".compareToIgnoreCase("djn"); + { + ((true ? true : ! !true) ? "" : "ioowivxge").substring(1844979226, "ppsk".startsWith("lllmn") | false ? arg_0 * arg_0 : (byte)663320199); + ((Tester_Class_0)(((new Tester_Class_2[(byte)4797509007239530496L])[(byte)(- -2.8961086E38F - arg_1)]).var_1 = new float[(byte)('m' / 6.0657416E37F)])).var_1 = new boolean[(byte)(short)(+4.515459E37F - (short)arg_0)][(byte)(-1.3002677717712297E308 + (var_13 = "bcjfdnc".charAt(arg_0)) * (arg_2 - 1.6058080036165979E308))]; + var_13 = 'E'; + } + float var_17 = 0F; + --arg_1; + do + { + final String[] var_18 = new String[(byte)(short)arg_0]; + var_17++; + Object var_19 = (new Object[(byte)var_17])[(false ? "xfkx".equalsIgnoreCase("j") : !false) ^ !false ? (byte)(1.6627987E35F * 2.62825E38F) : (byte)var_17]; + } while (var_17 < 2 && false | ((byte)1.4661115E38F | arg_0 - 'l') < ('J' & (byte)+ ((float)1200013759))); + long var_20 = 0L; + arg_2--; + for (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'p'))))); var_20 < 4; var_13 = 'y') + { + new String((true | true ? "oxpfy" : "gaynucv") + (true ? "cmrrk".substring(653981013, arg_0) : "ociewl" + "srhbvcgci")); + var_20++; + arg_2 >>= arg_0; + arg_2 = false ? (byte)'l' : (byte)(~var_20 - (byte)1.1290483681734838E308); + } + ((new Tester_Class_2[(byte)arg_1++])[(byte)685259385]).var_1 = new Tester_Interface_1[(byte)arg_0]; + --arg_1; + var_13 = 483446392 - (byte)'P' < ((short)(true ? (var_13 = 't') : 'n') & (short)'l') ? (var_13 = 'q') : (var_13 = (var_13 = 'h')); + var_13 = 'y'; + return 1.097000731360761E308; + } + + private final boolean func_2(final short[][] arg_0, byte arg_1, Object arg_2) + { + var_1 = new char[arg_1]; + arg_1 /= (var_13 = 'A') + -var_14; + int var_21 = 0; + arg_2 = (new Tester_Class_0[arg_1 += var_14][arg_1])[arg_1 >>>= 'R' + + -var_14 - 4078879817303787520L]; + for (arg_1--; (+ +1.1473423E38F < 'w' & false | var_21 != (short)4633877342445358080L | !false ? false | !false : true) && (var_21 < 1 && (arg_0[arg_1])[arg_1 %= 7.136449148111178E307] > 7.362329280963185E307); arg_1++) + { + arg_1 = (arg_1 %= + -9.872181578576624E307); + var_21++; + arg_1 /= 7.365334241099395E307; + var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'A'))))); + } + arg_1 >>= var_14; + boolean var_22 = false; + return ((var_22 &= true) && var_22 ? (short)1.568578228250838E308 : arg_1) >= (new float[arg_1])[arg_1 /= 1.6849858816110731E308]; + } + + public final String func_3(Tester_Interface_1 arg_0) + { + arg_0 = arg_0; + arg_0 = (arg_0 = arg_0); + var_13 = (var_13 = (var_13 = (var_13 = "rqimya".charAt(390686412)))); + ((Tester_Class_0)(var_1 = "suxd")).var_1 = new Tester_Class_0[(byte)(float)(short)1.584667675541511E308]; + arg_0 = ((byte)+ + - +1.3636011E38F == 'L' ^ true) & (!true | true) ? (arg_0 = arg_0) : arg_0; + var_1 = (((Tester_Class_0)(var_1 = (Tester_Class_0)(var_1 = "ndxcurdr"))).var_1 = (var_1 = (var_1 = "schnhe"))); + var_1 = (new Object[(byte)(var_13 = (var_13 = 'G'))])[(byte)((byte)1.5366658198344074E308 - 1.0051541518022535E308)]; + var_13 = (var_13 = 'x'); + (true ? (Tester_Class_0)(var_1 = "slesdph") : (Tester_Class_0)(var_1 = "wxj")).var_1 = false ? (Tester_Class_0)(var_1 = "iddvoil") : (Tester_Class_0)(var_1 = "yjbxhuip"); + var_13 = (var_13 = 'f'); + var_1 = (new short[(byte)1.8902424351360974E307])[(new byte[(byte)1552392028])[(byte)'V']] >= (1.2449926736063704E308 + 'K') / (short)1.0847178E38F / ((short)'M' % (1.225890077244388E308 + + ((byte)1.5358312881295287E308))) ? (Tester_Class_0)(var_1 = "khfntg".toString()) : (Tester_Class_0)(var_1 = "jkttx"); + { + arg_0 = arg_0; + } + arg_0 = arg_0; + var_13 = (true ? "jndbffakc" : "hhcsc").charAt((byte)7322932713210745856L >> (short)(var_13 = (var_13 = 'R'))); + var_13 = (var_13 = (var_13 = 'U')); + { + "gepdu".trim(); + } + var_13 = 'H'; + new String(); + { + (false ^ (true ^ ((!true | ! !true) ^ ! (1.7800668444792402E308 * var_14 >= (var_13 = (var_13 = (var_13 = 'g')))))) ? "dsm" : "g").toUpperCase().toString(); + ((Tester_Class_0)(var_1 = "fcdvd")).var_1 = (Tester_Class_0)(((Tester_Class_0)(var_1 = "uwhnte")).var_1 = "vpatqpd"); + } + switch (((byte)((byte)((int)'n' / var_14) >>> (short)7.786475993917233E307 - (var_13 = 'm')) <= (("".endsWith("pbypgis") ^ false) & true ? (byte)func_0(arg_0, arg_0, 723551781) : (short)140766856) ? true | (!false || false) : 'F' != (var_13 = 'V')) ? (var_13 = 'j') : 'D') + { + case 'p': + + } + var_13 = (var_13 = (var_13 = 'y')); + var_13 = ("" + "wwbxwyt").charAt((short)8373354379880418304L << (short)(byte)1.557224945027141E308); + arg_0 = true ? (arg_0 = arg_0) : arg_0; + ((Tester_Class_0)(((Tester_Class_0)(var_1 = "rmkvbp")).var_1 = (var_1 = "gvb"))).var_1 = new Tester_Class_0[(byte)var_14]; + arg_0 = arg_0; + return 2.5245162E38F + 3.9088502076337727E307 > 1.0883030748712796E308 ? "efttufmbg" : "xy"; + } + + protected short func_4(final double arg_0, long arg_1, final Object arg_2, final byte arg_3) + { + (((("ptnmpn".startsWith("xxgxjvsie") ? !true : ! !true) ? ! !false : false) ? (true ? true : false) : (var_13 = (var_13 = 'X')) == 1948276447) ? (Tester_Class_0)(var_1 = new float[arg_3][arg_3]) : (Tester_Class_0)arg_2).var_1 = new double[(new byte[arg_3][arg_3])[arg_3][arg_3]][arg_3]; + boolean var_23; + return true ? (short)'r' : (byte)(short)('\\' >>> arg_3); + } + + final static byte func_5(final long arg_0, float arg_1, final double arg_2) + { + arg_1 = arg_2 <= ((var_13 = 'D') <= - (3463565869695079424L << 'S') ? 'a' : (var_13 = 'o')) | (true ? !false : !false) ? (byte)(short)(var_13 = 'r') : (short)(byte)'S'; + { + { + arg_1 %= '_'; + } + char var_24 = 'G'; + "hc".lastIndexOf(""); + arg_1 *= (arg_1 /= (byte)-8.308933840953204E306); + --var_24; + arg_1 /= ~ ((byte)2.2736606E38F) <= (3392301601783633920L == 3.015267E38F ^ ! !true ? (byte)88382550 : (byte)1.2019729E38F) ? 1027309963 : + -4.355887546298483E307; + ((new Tester_Class_2[(byte)arg_2])[(byte)870592870]).var_1 = "i"; + arg_1 /= 't'; + } + var_13 = 'f'; + Tester_Class_0 var_25 = (new Tester_Class_0[(byte)arg_1])[(true | false ^ !false) & ! !true & - +2.758844E38F >= (new short[(byte)5.9160883E37F])[(byte)'r'] ? (byte)arg_0 : (byte)((short)1802078016 & arg_0)]; + arg_1 /= (byte)arg_2; + var_13 = 'R'; + boolean var_26 = (true ? false : !false) ? false : !true == ! !false; + arg_1 %= (var_26 ^= (byte)1101752087 <= (short)arg_1) ? arg_1 : (float)1882235314; + var_25 = var_25; + if (var_26 &= var_26) + { + var_13 = "".startsWith("vp", - ((byte)2040501187) ^ (byte)-3921263616446438400L) ? "gam".charAt(+ ((byte)arg_1)) : (var_13 = 'H'); + arg_1 /= var_26 | ! (var_26 ^ (byte)arg_0 <= (var_13 = 'r') | (var_26 |= var_26)) ? 'N' : ~8963227563301903360L; + } + else + { + var_13 = 'l'; + var_25 = (var_25 = var_25); + } + arg_1 += (byte)(("m".substring(837996717, 861903057).startsWith("vwpky", (var_13 = 'Z') % (byte)arg_1) ? !false ^ !var_26 : var_26) ? (byte)arg_1 : ((var_26 | var_26) ^ !false ? (short)'U' : (short)'d')); + ((1.3445538E38F < (arg_1 -= 1236356135) ^ (var_26 = true)) & var_26 ? var_25 : (var_25 = var_25)).var_1 = true ? (var_25.var_1 = var_25) : (var_25.var_1 = var_25); + var_26 |= - ((byte)251113415) < (short)arg_1 & false & false; + arg_1 += (var_26 &= true) ? 7.546147305340402E307 : (true & !var_26 ? (byte)1.5107802154474685E307 : (byte)arg_1); + var_25.var_1 = true ? "bqsewhn" : "aojssvan"; + return (byte)(var_13 = (char)(new short[(byte)46697464])[(byte)var_14]); + } + + public String toString() + { + String result = "[\n"; + result += "Tester_Class_2.var_13 = "; result += Tester.Printer.print(var_13); + result += "\n"; + result += "Tester_Class_2.var_14 = "; result += Tester.Printer.print(var_14); + result += "\n"; + result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1); + result += ""; + result += "\n]"; + return result; + } +} + +public class Tester { + static Tester_Class_0 var_28; + double var_29 = 4.861846831496217E307; + static byte var_30 = 79; + static boolean var_31 = false; + final byte var_32 = 48; + + + public short func_0(final byte arg_0, boolean arg_1, final double arg_2) + { + --var_30; + new Tester_Class_2().var_1 = "xdwldeqhc"; + char var_33 = 'd'; + return (var_31 = var_30 < (new short[var_30])[var_30]) ? (short)(var_33 >>>= (short)2.3152642E38F) : var_30; + } + + private final float func_1(final long arg_0, final Tester_Class_0 arg_1, Tester_Class_0 arg_2, final char arg_3) + { + { + new Tester_Class_0(); + } + var_30 >>= (short)1.1469118780047631E308; + var_31 |= var_31; + if (true) + { + Tester_Class_2 var_34 = (var_31 ^= (var_31 ^= false)) ? (Tester_Class_2)arg_1 : (new Tester_Class_2[var_32])[var_30]; + } + else + { + "shqjwg".compareToIgnoreCase(false ? "gxoyw" + "cx" : "r" + "icj"); + } + ((new Tester_Class_2[var_32])[++var_30]).var_1 = (new Object[var_30][var_32][var_32])[var_30 |= var_32]; + arg_1.var_1 = (arg_2 = arg_2); + arg_1.var_1 = (((new Tester_Class_2[var_30])[var_30 = var_32]).var_1 = new String[var_32]); + var_28 = (Tester_Class_2)((arg_2 = arg_2).var_1 = new double[var_30]); + arg_2 = arg_1; + final boolean var_35 = "qjsdfuyru".endsWith("nuw" + "bne") | arg_3 >= 1.2054153346397785E308; + var_31 &= (var_31 ^= var_35); + { + var_31 &= var_31 ? false : !false; + } + if (var_31) + { + var_28 = (new Tester_Class_2[var_32])[var_32]; + } + else + { + arg_1.equals((new Object[var_32])[var_32]); + } + ((var_31 ^= true) ? "x" : "euc").substring(+ (var_30 ^= var_30) & (byte)(new short[var_30])[var_30 /= 4.220757896697652E307]); + arg_2 = var_31 ? (Tester_Class_2)arg_1 : (Tester_Class_2)arg_2; + arg_2 = (Tester_Class_2)(new Object[var_32][var_32])[var_30][var_32]; + return 9.932983E36F * (Tester_Class_2.var_13 = arg_3); + } + + public int func_2(Tester_Class_0 arg_0) + { + "ptwusxrxn".indexOf("v"); + var_30 |= 1770666843; + var_29 += (short)(Tester_Class_2.var_14 / Tester_Class_2.var_14); + if (var_31) + { + var_30 = var_32; + } + else + { + double var_36; + } + if (true) + { + var_30 -= 2.1474216E38F; + } + else + { + var_29 += 'f'; + } + var_29 -= Tester_Class_2.var_14; + if (false) + { + arg_0.var_1 = arg_0; + } + else + { + arg_0 = (var_28 = (var_28 = arg_0)); + } + { + Tester_Class_2.var_13 = 'p'; + } + var_29 = ~Tester_Class_2.var_14 % 'y'; + switch (var_30 >>>= var_30) + { + case 115: + + } + arg_0 = arg_0; + var_31 ^= (var_31 = true); + return "".charAt(~var_32) >> ((var_31 &= true) ? var_30 : var_32); + } + + protected double func_3(boolean[] arg_0, double arg_1, long[][] arg_2) + { + switch (var_31 ? (short)(var_32 / (arg_1 /= (int)(arg_1 *= (Tester_Class_2.var_13 = ']')))) : (var_30 ^= + +Tester_Class_2.var_14 * (+ +3075166460237931520L / '['))) + { + case 31: + + case 118: + + } + Tester_Class_2.var_13 = 'm'; + "mwkh".indexOf("hdgiquve", (new char[var_32])[var_30 &= 'S'] % var_30); + final boolean var_37 = false; + char var_38 = 'F'; + var_28 = (new Tester_Class_2[var_30][var_30])[var_30 *= var_38][var_32]; + new Tester_Class_0().var_1 = new char[var_32][var_30]; + var_30 &= var_30; + var_31 |= (var_31 |= true); + int var_39 = 1769831681; + final Tester_Class_2 var_40 = (var_31 |= false ? var_31 : var_37) ? (Tester_Class_2)((new Object[var_30][var_30][var_32])[var_30 <<= var_30])[var_30][var_30++] : (Tester_Class_2)new Tester_Class_0(); + var_30 -= +var_30; + "dvmuim".replaceFirst("clmisuxu", "".toLowerCase() + "xi"); + var_39 = var_38 - (short)585806817; + arg_1 += (double)(short)(6.4329855E37F / var_32 * (var_38 += 'w')); + ++var_39; + var_40.var_1 = (var_28 = (var_28 = var_40)); + var_29 /= 3.5705444317400964E306; + Tester_Interface_1 var_41; + return arg_1; + } + + final char func_4(final long arg_0, int arg_1, final int arg_2) + { + { + Tester_Class_2.var_13 = 'D'; + var_31 = false; + } + if (var_31) + { + var_30--; + Tester_Class_0 var_42 = var_28 = (new Tester_Class_0[var_32])[var_32]; + } + else + { + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'H'); + } + var_28 = (Tester_Class_2)(new Tester_Class_2().var_1 = (var_28 = (new Tester_Class_0[var_30])[var_30])); + arg_1 &= var_32; + --var_30; + return Tester_Class_2.var_13 = 'n'; + } + + final static Object func_5() + { + var_28 = (Tester_Class_2)(! (var_31 |= true & var_31) ? (new Tester_Class_0[var_30])[var_30] : (var_28 = (new Tester_Class_0[var_30])[var_30])); + var_31 |= false; + return var_31 ? (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = (new Tester_Class_0[var_30 /= 1366944127])[var_30]) : (new Tester_Class_0[var_30][var_30])[var_30 += 1.4070924450257891E307][var_30]; + } + + static Tester_Class_2 func_6(final Object arg_0) + { + var_28 = (var_31 ^= true) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0; + ((new Tester[--var_30])[var_30]).var_29 -= -3.0029087E38F * (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')); + var_28 = (Tester_Class_2)(var_28 = (var_28 = (var_28 = (Tester_Class_0)arg_0))); + return false ? new Tester_Class_2() : new Tester_Class_2(); + } + + private static Tester_Interface_1 func_7(byte arg_0, Tester_Class_2 arg_1, final int arg_2, char arg_3) + { + { + var_31 = var_31; + var_31 |= (var_31 &= (var_31 |= !true)); + arg_0 += Tester_Class_2.var_14; + } + var_30 = (var_30 *= ((new Tester[arg_0 ^= 1039546367])[arg_0]).var_32); + arg_1.var_1 = (var_31 ^= (var_31 &= !var_31 && !var_31)) ? (arg_1 = (arg_1 = arg_1)) : (new Tester_Class_0[arg_0++][arg_0])[arg_0][arg_0]; + arg_1.var_1 = var_31 ? "jpmg" : "epwvupaqp"; + var_28 = arg_1; + if (false) + { + arg_1 = arg_1; + } + else + { + arg_3 += var_30 % -9.298157E37F; + } + arg_1.var_1 = ((var_28 = (var_28 = arg_1)).var_1 = ((var_28 = arg_1).var_1 = "rlmf")); + var_28 = (arg_1 = arg_1); + arg_1 = arg_1; + { + var_31 = true; + } + (arg_1 = arg_1).var_1 = (arg_1.var_1 = (arg_1 = arg_1)); + final short[] var_43 = new short[(var_31 &= false) ? arg_0 : var_30]; + final short var_44 = 18087; + return false ? (new Tester_Interface_1[var_30 %= Tester_Class_2.var_14])[arg_0 -= 8.913955E37F * +arg_0] : (new Tester_Interface_1[var_30])[var_30]; + } + + private static float func_8(final Object[] arg_0, final byte arg_1, Tester_Class_0[] arg_2) + { + ((new Tester_Class_2[var_30 /= -2.37832E38F])[((new Tester[arg_1])[(new byte[arg_1])[arg_1]]).var_32]).var_1 = new Tester_Interface_1[arg_1]; + if (var_31) + { + var_28 = (Tester_Class_2)(var_28 = arg_2[var_30]); + } + else + { + var_30 -= Tester_Class_2.var_14; + final int var_45 = 1864933386; + final Tester_Class_0 var_46 = var_28 = (new Tester_Class_2[arg_1][var_30 |= Tester_Class_2.var_14])[((new Tester[arg_1][var_30])[var_30][var_30]).var_32][arg_1]; + var_31 &= (var_31 ^= false); + var_30 += (false ? 2.7581227E37F : + +1.8832631E38F) * ('P' * -1.9479086E38F); + } + (var_28 = (Tester_Class_2)arg_2[arg_1]).var_1 = (new Tester_Class_2[var_30][arg_1][arg_1])[arg_1]; + ++var_30; + (var_28 = (new Tester_Class_2[var_30])[arg_1]).var_1 = false ? (new Tester_Class_0[var_30][var_30])[var_30][arg_1] : arg_2[var_30]; + var_31 |= false; + ((new Tester[arg_1][var_30 >>>= (char)1981599])[arg_1][arg_1]).var_29 = false ^ (var_31 = var_31) ? (Tester_Class_2.var_13 = "nes".charAt(1080898679)) : - (var_30 %= 'n') ^ arg_1; + { + ((new Tester[arg_1])[var_30]).var_29 = (short)(Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'h')); + } + Tester_Class_2.var_13 = 'j'; + ((new Tester_Class_2[arg_1])[var_30]).var_1 = new byte[var_30]; + var_31 ^= (var_31 ^= !false); + "wcbi".toString(); + final byte var_47 = var_30; + if (true) + { + "mpbkilw".substring(199662864); + } + else + { + var_30++; + } + Tester_Class_2.var_13 = '`'; + "yujypq".indexOf("crve" + "inmvh", false ? ~arg_1 : "vukbkc".charAt(528096652)); + Tester_Class_2 var_48 = (Tester_Class_2)((!var_31 & (var_31 ^= false ^ !true) ? false | !true : false) ? (var_28 = (Tester_Class_2)arg_0[var_30]) : (new Tester_Class_2[arg_1])[var_30]); + return (float)(var_31 ^ var_31 ? (var_30 ^= (short)((new Tester[var_30])[var_30]).var_29) : (var_30 /= - -5.917837279005691E307 - - +3.2004715720509636E306)); + } + + final Tester_Class_0 func_9() + { + var_30 += -3531557622894482432L / ~var_30; + var_28 = (var_28 = (new Tester_Class_2[var_30 += + -7.0203367E37F])[var_30]); + var_31 ^= ! !false ^ false; + if (true) + { + byte[] var_49; + var_31 &= true; + short var_50 = 14869; + } + else + { + (((new Tester[var_32][var_30][var_32])[var_30])[var_32][var_30]).var_29 *= 'h'; + } + final int var_51 = false ? +var_32 >>> ~var_30 : --var_30; + var_31 |= false; + return (new Tester_Class_0[var_32][var_32])[var_30][var_30]; + } + + public static Object func_10() + { + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'O'); + return ((Tester_Class_2)(new Object[--var_30])[var_30]).var_1 = (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = "iu"); + } + + protected byte func_11(final Tester_Interface_1[] arg_0) + { + { + --var_30; + var_29 *= (short)1749707986816114688L; + var_31 = (var_31 = (var_31 |= var_31)); + var_30 -= 6.4575257E37F; + } + var_28 = (var_28 = func_9()); + Tester_Class_2.var_13 = 'b'; + var_30--; + var_28 = (var_28 = (var_28 = (var_28 = (Tester_Class_2)func_10()))); + var_28 = (new Tester_Class_2[var_32])[var_30]; + char var_52 = (var_31 = false) ? (char)+ +Tester_Class_2.var_14 : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = '_')); + if (false) + { + var_30 += (short)(var_32 + 840104459); + } + else + { + var_29 /= 2.5320765E38F; + } + if (true) + { + var_30 %= 379977167934025728L; + } + else + { + var_52 = var_52; + } + var_30 >>= ('A' ^ --var_30) & 'H'; + Tester_Class_2 var_53; + final int var_54 = 771623383; + var_29 %= (+1.938582E37F - 'G') * ++var_30; + int var_55 = (short)6.234053079170724E306 - (int)'^' / ((var_31 &= (var_31 ^= var_31)) ? (short)var_30 : ++var_30); + var_55 >>>= var_55 / ~6865244393150017536L; + var_31 ^= !false; + return var_30 >>>= 4351766607072508928L >> func_0(var_32, var_31, 1.021781609675458E308); + } + + public static String execute() + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { return t.toString(); } + catch (Throwable e) { return "Error during result conversion to String"; } + } catch (Throwable e) { return "Error during test execution"; } + } + + public static void main(String[] args) + { + try { + Tester t = new Tester(); + try { t.test(); } + catch(Throwable e) { } + try { System.out.println(t); } + catch(Throwable e) { } + } catch (Throwable e) { } + } + + private void test() + { + { + ((Tester_Class_2)(Tester_Class_0)((var_31 = true) ^ (var_31 |= false & true) ? func_10() : new Tester_Class_2[var_32])).var_1 = ((var_28 = new Tester_Class_0()).var_1 = (new Tester_Class_0().var_1 = new Tester_Class_2())); + } + new String(); + Tester_Class_2.var_13 = '['; + var_28 = (Tester_Class_2)(((var_31 ^= true) ? func_9() : new Tester_Class_0()).var_1 = new Tester_Class_2()); + var_28 = new Tester_Class_0(); + new String(); + { + if ((new boolean[var_30])[var_30] & 732877932 == 1.4654316E38F & "xpqy".replace(']', 'f').startsWith("pqrqunvfx") ? ((var_31 ^= (var_31 &= var_31)) ? !var_31 : (var_31 &= true)) : var_31) + { + var_31 &= var_31; + } + else + { + func_2(var_28 = new Tester_Class_0()); + } + { + ((new Tester_Class_0[var_30][var_30])[var_30][var_30]).var_1 = "uwrbjvl"; + var_28 = (Tester_Class_0)func_5(); + } + Tester_Class_2.var_13 = 's'; + Tester_Class_0 var_56 = var_28 = true ? func_6(func_5()) : (new Tester_Class_2[var_30][var_32])[var_32][var_32]; + double var_57 = 0; + var_29 += 1024895641427426304L % ~ ~Tester_Class_2.var_14; + while ((true || (var_31 = var_31)) && var_57 < 12) + { + (false & !false ? var_56 : (var_56 = var_56)).var_1 = "vbc"; + var_57++; + var_29 += func_0(var_30 /= (short)var_30 / var_32, false, var_57); + (var_31 ? (Tester_Class_2)var_56 : (new Tester_Class_2[var_30])[var_30]).var_1 = new double[var_31 ? (var_30 |= 177265600183083008L) : var_32]; + } + switch (var_31 ^ var_31 | ! (var_31 = false) & (var_31 & false) ? (true ? (short)var_30 : func_0(var_30, true, var_57)) : func_0(var_30, var_31, var_29 /= 2.7203017E38F)) + { + case 23: + var_31 ^= true ? var_31 : var_31; + break; + + case 40: + + default: + + case 104: + + } + Object var_58 = (var_31 ^= (var_31 ^= false) | (~3392263608888292352L < 1681682009 | var_31)) ? (((new Tester_Class_2[Tester_Class_2.func_5(Tester_Class_2.var_14, 3.3507317E38F, var_57)])[var_30 %= var_32]).var_1 = (var_56 = (Tester_Class_0)func_5())) : func_5(); + (var_56 = (var_28 = (var_56 = func_6(var_58)))).var_1 = (((new Tester_Class_2[var_30])[var_30]).var_1 = new float[(byte)Tester_Class_2.var_14][var_32]); + new Tester_Class_2().var_1 = new double[var_30]; + final Tester_Class_0 var_59 = var_28 = (!false & (false || (var_31 && !var_31) & false) ? var_31 : (var_31 |= !var_31)) ? (Tester_Class_2)(var_28 = new Tester_Class_2()) : (false ? new Tester_Class_2() : (Tester_Class_2)var_58); + } + var_30--; + { + var_29 += ~func_11(((new Tester_Interface_1[var_32][var_30][var_32])[var_30 ^= var_30])[var_32]); + } + float var_60 = 0F; + double var_61 = var_29; + do + { + long var_62; + var_60++; + "vcs".offsetByCodePoints((short)('w' | (short)var_30) & (new short[--var_30])[var_30], ((var_31 |= var_31) ^ (var_31 = var_31) ? var_32 : var_30) - (short)86413218); + } while (false && (var_60 < 100 && ((var_31 = false) ? var_31 : (var_31 ^= false)) & var_31)); + long var_63 = 0L; + double var_64 = (var_31 ? (Tester_Class_2.var_13 = 'V') : 'e') - (var_29 = 'A') * (var_29 = var_30); + var_31 &= (short)+ var_30-- + var_30 <= var_60; + while (false && (var_63 < 23 && false)) + { + var_30 >>= func_0(var_30, var_31, var_29) ^ ("".endsWith("mecvlajq" + "jhrbf") ? var_30 : (short)var_61); + var_63++; + var_28 = (Tester_Class_2)(var_28 = new Tester_Class_2()); + new Tester_Class_0(); + } + double var_65 = 0; + var_61 -= var_65; + for (((var_31 &= (var_31 ^= var_31)) | var_31 ? new Tester_Class_2() : new Tester_Class_2()).var_1 = ! (var_31 = false) && !var_31 ? func_10() : new Object[var_32][var_32]; var_31 | var_31 && (var_65 < 107 && (false ? !var_31 : (var_31 &= var_31))); var_30 *= Tester_Class_2.var_14) + { + var_28 = var_30 > (var_31 | true ? (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')) : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'r'))) ? (Tester_Class_2)((var_28 = (Tester_Class_0)func_5()).var_1 = func_5()) : new Tester_Class_2(); + var_65++; + var_29 = "efothsl".startsWith("qk") ? 3.2306712E37F : +1.1835607464479516E308; + new Tester_Class_2().var_1 = new Tester_Class_0(); + } + double var_66 = 0; + func_6(((Tester_Class_2)((true ? (Tester_Class_2)func_10() : (Tester_Class_2)func_9()).var_1 = (var_28 = (Tester_Class_2)func_10()))).var_1 = ""); + while (false | (new boolean[var_30][var_30])[var_30][var_32] && (var_66 < 104 && false)) + { + ((var_31 ^= !false) ? "" : "slgr").toUpperCase(); + var_66++; + var_28 = func_6(func_9().var_1 = func_10()); + var_31 |= (var_31 |= true); + } + Tester_Class_2.var_13 = var_31 ? (Tester_Class_2.var_13 = 'Y') : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = func_4(var_63, 137999726, 1870981930)))); + int var_67 = 0; + final double var_68 = 9.955130040461458E307; + do + { + "".lastIndexOf(var_32 != (Tester_Class_2.var_13 = 'f') ? (Tester_Class_2.var_13 = 'C') : ~var_30, (char)3.187607E38F + (var_30 /= var_30)); + var_67++; + Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'B'); + } while (var_67 < 9 && var_31 ^ var_31); + int var_69 = 0; + (true ? func_6(func_10()) : (Tester_Class_2)func_9()).var_1 = ((var_28 = (var_28 = new Tester_Class_2())).var_1 = (func_6(new Tester_Class_2().var_1 = new Tester_Class_0()).var_1 = (Tester_Class_2)func_9())); + do + { + var_28 = (Tester_Class_2)(var_28 = (Tester_Class_0)(new Tester_Class_2().var_1 = "qs")); + var_69++; + var_31 ^= var_31; + } while (var_69 < 189); + (! (var_31 = true) | var_31 ? new Tester_Class_2() : (new Tester_Class_0[var_30])[var_30]).var_1 = (((new Tester_Class_2[var_30 ^= (short)var_30])[var_30]).var_1 = (var_31 ? var_31 : (var_31 |= false)) ? "lfhliyphg" : "impovq"); + ((var_31 ? var_32 == (short)8901596111720974336L : 220705842 != var_60) ? (new Tester_Class_2[var_30])[var_32] : (new Tester_Class_2[var_30][var_32])[var_30][var_30]).var_1 = (var_28 = ((char)var_30 >= "pngjthlf".lastIndexOf("jjbuojp") & var_31 ? var_31 : var_31) ? (new Tester_Class_2[var_32])[var_30] : func_6(new Tester_Class_2().var_1 = new String[var_32])); + Tester_Class_2.var_13 = 'c'; + } + public String toString() + { + String result = "[\n"; + result += "Tester.var_29 = "; result += Printer.print(var_29); + result += "\n"; + result += "Tester.var_30 = "; result += Printer.print(var_30); + result += "\n"; + result += "Tester.var_32 = "; result += Printer.print(var_32); + result += "\n"; + result += "Tester.var_31 = "; result += Printer.print(var_31); + result += "\n"; + result += "Tester.var_28 = "; result += Printer.print(var_28); + result += ""; + result += "\n]"; + return result; + } + static class Printer + { + public static String print(boolean arg) { return String.valueOf(arg); } + public static String print(byte arg) { return String.valueOf(arg); } + public static String print(short arg) { return String.valueOf(arg); } + public static String print(char arg) { return String.valueOf((int)arg); } + public static String print(int arg) { return String.valueOf(arg); } + public static String print(long arg) { return String.valueOf(arg); } + public static String print(float arg) { return String.valueOf(arg); } + public static String print(double arg) { return String.valueOf(arg); } + + + public static String print(Object arg) + { + return print_r(new java.util.Stack(), arg); + } + + private static String print_r(java.util.Stack visitedObjects, Object arg) + { + String result = ""; + if (arg == null) + result += "null"; + else + if (arg.getClass().isArray()) + { + for (int i = 0; i < visitedObjects.size(); i++) + if (visitedObjects.elementAt(i) == arg) return ""; + + visitedObjects.push(arg); + + final String delimiter = ", "; + result += "["; + + if (arg instanceof Object[]) + { + Object[] array = (Object[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print_r(visitedObjects, array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof boolean[]) + { + boolean[] array = (boolean[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof byte[]) + { + byte[] array = (byte[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof short[]) + { + short[] array = (short[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof char[]) + { + char[] array = (char[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof int[]) + { + int[] array = (int[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof long[]) + { + long[] array = (long[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof float[]) + { + float[] array = (float[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + else + if (arg instanceof double[]) + { + double[] array = (double[]) arg; + for (int i = 0; i < array.length; i++) + { + result += print(array[i]); + if (i < array.length - 1) result += delimiter; + } + } + + result += "]"; + visitedObjects.pop(); + + } else + { + result += arg.toString(); + } + + return result; + } + } +} + +