< prev index next >

src/share/vm/opto/cfgnode.cpp

Print this page

        

*** 1661,1686 **** // pushed down through Phis. const TypeValueTypePtr* vtptr = NULL; for (uint i = 1; i < req(); i++) { if (in(i) != NULL && in(i)->is_ValueTypePtr()) { const TypeValueTypePtr* t = phase->type(in(i))->is_valuetypeptr(); if (vtptr == NULL) { vtptr = t; } else { assert(vtptr == t, "Phi should merge identical value types"); } } else { assert(in(i) == NULL || vtptr == NULL || phase->type(in(i))->higher_equal(vtptr) || phase->type(in(i)) == Type::TOP || ! phase->type(in(i))->is_valuetypeptr()->value_type()->value_klass() == phase->C->env()->___Value_klass(), "bad type"); } } if (vtptr != NULL) { // One input is a value type. All inputs must have the same type. bool progress = false; PhaseIterGVN* igvn = phase->is_IterGVN(); for (uint i = 1; i < req(); i++) { ! if (in(i) != NULL && !phase->type(in(i))->higher_equal(vtptr)) { // Can't transform because CheckCastPPNode::Identity can // push the cast up through another Phi and cause this same // transformation to run again, indefinitely Node* cast = igvn->register_new_node_with_optimizer(new CheckCastPPNode(NULL, in(i), vtptr)); set_req(i, cast); --- 1661,1687 ---- // pushed down through Phis. const TypeValueTypePtr* vtptr = NULL; for (uint i = 1; i < req(); i++) { if (in(i) != NULL && in(i)->is_ValueTypePtr()) { const TypeValueTypePtr* t = phase->type(in(i))->is_valuetypeptr(); + t = t->cast_to_ptr_type(TypePtr::BotPTR)->is_valuetypeptr(); if (vtptr == NULL) { vtptr = t; } else { assert(vtptr == t, "Phi should merge identical value types"); } } else { assert(in(i) == NULL || vtptr == NULL || phase->type(in(i))->higher_equal(vtptr) || phase->type(in(i)) == Type::TOP || ! phase->type(in(i))->is_valuetypeptr()->is__Value(), "bad type"); } } if (vtptr != NULL) { // One input is a value type. All inputs must have the same type. bool progress = false; PhaseIterGVN* igvn = phase->is_IterGVN(); for (uint i = 1; i < req(); i++) { ! if (in(i) != NULL && !in(i)->is_Con() && !phase->type(in(i))->higher_equal(vtptr)) { // Can't transform because CheckCastPPNode::Identity can // push the cast up through another Phi and cause this same // transformation to run again, indefinitely Node* cast = igvn->register_new_node_with_optimizer(new CheckCastPPNode(NULL, in(i), vtptr)); set_req(i, cast);
< prev index next >