comparison src/share/vm/opto/addnode.cpp @ 1541:b5fdf39b9749

6953576: bottom_type for matched AddPNodes doesn't always agree with ideal Reviewed-by: kvn
author never
date Tue, 18 May 2010 23:58:32 -0700
parents bd02caa94611
children c18cbe5936b8
comparison
equal deleted inserted replaced
1540:99791ad65936 1541:b5fdf39b9749
712 // Do we Match on this edge index or not? Do not match base pointer edge 712 // Do we Match on this edge index or not? Do not match base pointer edge
713 uint AddPNode::match_edge(uint idx) const { 713 uint AddPNode::match_edge(uint idx) const {
714 return idx > Base; 714 return idx > Base;
715 } 715 }
716 716
717 //---------------------------mach_bottom_type----------------------------------
718 // Utility function for use by ADLC. Implements bottom_type for matched AddP.
719 const Type *AddPNode::mach_bottom_type( const MachNode* n) {
720 Node* base = n->in(Base);
721 const Type *t = base->bottom_type();
722 if ( t == Type::TOP ) {
723 // an untyped pointer
724 return TypeRawPtr::BOTTOM;
725 }
726 const TypePtr* tp = t->isa_oopptr();
727 if ( tp == NULL ) return t;
728 if ( tp->_offset == TypePtr::OffsetBot ) return tp;
729
730 // We must carefully add up the various offsets...
731 intptr_t offset = 0;
732 const TypePtr* tptr = NULL;
733
734 uint numopnds = n->num_opnds();
735 uint index = n->oper_input_base();
736 for ( uint i = 1; i < numopnds; i++ ) {
737 MachOper *opnd = n->_opnds[i];
738 // Check for any interesting operand info.
739 // In particular, check for both memory and non-memory operands.
740 // %%%%% Clean this up: use xadd_offset
741 intptr_t con = opnd->constant();
742 if ( con == TypePtr::OffsetBot ) goto bottom_out;
743 offset += con;
744 con = opnd->constant_disp();
745 if ( con == TypePtr::OffsetBot ) goto bottom_out;
746 offset += con;
747 if( opnd->scale() != 0 ) goto bottom_out;
748
749 // Check each operand input edge. Find the 1 allowed pointer
750 // edge. Other edges must be index edges; track exact constant
751 // inputs and otherwise assume the worst.
752 for ( uint j = opnd->num_edges(); j > 0; j-- ) {
753 Node* edge = n->in(index++);
754 const Type* et = edge->bottom_type();
755 const TypeX* eti = et->isa_intptr_t();
756 if ( eti == NULL ) {
757 // there must be one pointer among the operands
758 guarantee(tptr == NULL, "must be only one pointer operand");
759 if (UseCompressedOops && Universe::narrow_oop_shift() == 0) {
760 // 32-bits narrow oop can be the base of address expressions
761 tptr = et->make_ptr()->isa_oopptr();
762 } else {
763 // only regular oops are expected here
764 tptr = et->isa_oopptr();
765 }
766 guarantee(tptr != NULL, "non-int operand must be pointer");
767 if (tptr->higher_equal(tp->add_offset(tptr->offset())))
768 tp = tptr; // Set more precise type for bailout
769 continue;
770 }
771 if ( eti->_hi != eti->_lo ) goto bottom_out;
772 offset += eti->_lo;
773 }
774 }
775 guarantee(tptr != NULL, "must be exactly one pointer operand");
776 return tptr->add_offset(offset);
777
778 bottom_out:
779 return tp->add_offset(TypePtr::OffsetBot);
780 }
781
782 //============================================================================= 717 //=============================================================================
783 //------------------------------Identity--------------------------------------- 718 //------------------------------Identity---------------------------------------
784 Node *OrINode::Identity( PhaseTransform *phase ) { 719 Node *OrINode::Identity( PhaseTransform *phase ) {
785 // x | x => x 720 // x | x => x
786 if (phase->eqv(in(1), in(2))) { 721 if (phase->eqv(in(1), in(2))) {