src/share/vm/opto/parse2.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/parse2.cpp	Mon Nov 18 21:54:03 2013
--- new/src/share/vm/opto/parse2.cpp	Mon Nov 18 21:54:03 2013

*** 86,96 **** --- 86,96 ---- if (el && el->isa_instptr()) { const TypeInstPtr* toop = el->is_instptr(); if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) { // If we load from "AbstractClass[]" we must see "ConcreteSubClass". const Type* subklass = Type::get_const_type(toop->klass()); ! elemtype = subklass->join(el, true); } } } // Check for big class initializers with all constant offsets
*** 1276,1296 **** --- 1276,1296 ---- if (obj != NULL && (con_type->isa_instptr() || con_type->isa_aryptr())) { // Found: // Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq]) // or the narrowOop equivalent. const Type* obj_type = _gvn.type(obj); ! const TypeOopPtr* tboth = obj_type->join(con_type, true)->isa_oopptr(); if (tboth != NULL && tboth->klass_is_exact() && tboth != obj_type && tboth->higher_equal(obj_type)) { // obj has to be of the exact type Foo if the CmpP succeeds. int obj_in_map = map()->find_edge(obj); JVMState* jvms = this->jvms(); if (obj_in_map >= 0 && (jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) { TypeNode* ccast = new (C) CheckCastPPNode(control(), obj, tboth); const Type* tcc = ccast->as_Type()->type(); ! assert(tcc != obj_type && tcc->higher_equal(obj_type, true), "must improve"); // Delay transform() call to allow recovery of pre-cast value // at the control merge. _gvn.set_type_bottom(ccast); record_for_igvn(ccast); // Here's the payoff.
*** 1316,1326 **** --- 1316,1326 ---- Node* cast = NULL; switch (btest) { case BoolTest::eq: // Constant test? { ! const Type* tboth = tcon->join(tval, true); if (tboth == tval) break; // Nothing to gain. if (tcon->isa_int()) { ccast = new (C) CastIINode(val, tboth); } else if (tcon == TypePtr::NULL_PTR) { // Cast to null, but keep the pointer identity temporarily live.
*** 1350,1360 **** --- 1350,1360 ---- break; } if (ccast != NULL) { const Type* tcc = ccast->as_Type()->type(); ! assert(tcc != tval && tcc->higher_equal(tval, true), "must improve"); // Delay transform() call to allow recovery of pre-cast value // at the control merge. ccast->set_req(0, control()); _gvn.set_type_bottom(ccast); record_for_igvn(ccast);

src/share/vm/opto/parse2.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File