< prev index next >

src/hotspot/share/opto/graphKit.cpp

Print this page

        

*** 36,45 **** --- 36,46 ---- #include "opto/graphKit.hpp" #include "opto/idealKit.hpp" #include "opto/intrinsicnode.hpp" #include "opto/locknode.hpp" #include "opto/machnode.hpp" + #include "opto/narrowptrnode.hpp" #include "opto/opaquenode.hpp" #include "opto/parse.hpp" #include "opto/rootnode.hpp" #include "opto/runtime.hpp" #include "runtime/deoptimization.hpp"
*** 4532,4536 **** --- 4533,4578 ---- Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) { // Reify the property as a CastPP node in Ideal graph to comply with monotonicity // assumption of CCP analysis. return _gvn.transform(new CastPPNode(ary, ary_type->cast_to_stable(true))); } + + Node* GraphKit::acmp(Node* a, Node* b) { + // In the case were both operands might be value types, we need to + // use the new acmp implementation. Otherwise, i.e. if one operand + // is not a value type, we can use the old acmp implementation. + Node* cmp = C->optimize_acmp(&_gvn, a, b); + if (cmp != NULL) { + return cmp; // Use optimized/old acmp + } + + Node* region = new RegionNode(2); + Node* is_value = new PhiNode(region, TypeX_X); + + // Null check operand before loading the is_value bit + if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(b))) { + // Operand 'b' is never null, swap operands to avoid null check + swap(a, b); + } + // TODO we need to speculate on 'a' being non-null / always null + Node* null_ctl = top(); + Node* not_null_a = null_check_oop(a, &null_ctl); + assert(!stopped(), "operand is always null"); + if (null_ctl != top()) { + region->add_req(null_ctl); + is_value->add_req(_gvn.MakeConX(0)); + if (Verbose) tty->print_cr("\n# NEW (parse time)"); + } else { + if (Verbose) tty->print_cr("\n# NEW WITHOUT NULL (parse time)"); + } + + Node* value_bit = C->load_is_value_bit(&_gvn, not_null_a); + region->init_req(1, control()); + is_value->set_req(1, value_bit); + + set_control(_gvn.transform(region)); + is_value = _gvn.transform(is_value); + + // Perturbe oop if operand is a value type to make comparison fail + Node* pert = _gvn.transform(new AddPNode(a, a, is_value)); + return new CmpPNode(pert, b); + }
< prev index next >