1 /* 2 * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "compiler/compileLog.hpp" 27 #include "gc/shared/collectedHeap.inline.hpp" 28 #include "libadt/vectset.hpp" 29 #include "memory/universe.hpp" 30 #include "opto/addnode.hpp" 31 #include "opto/arraycopynode.hpp" 32 #include "opto/callnode.hpp" 33 #include "opto/castnode.hpp" 34 #include "opto/cfgnode.hpp" 35 #include "opto/compile.hpp" 36 #include "opto/convertnode.hpp" 37 #include "opto/graphKit.hpp" 38 #include "opto/intrinsicnode.hpp" 39 #include "opto/locknode.hpp" 40 #include "opto/loopnode.hpp" 41 #include "opto/macro.hpp" 42 #include "opto/memnode.hpp" 43 #include "opto/narrowptrnode.hpp" 44 #include "opto/node.hpp" 45 #include "opto/opaquenode.hpp" 46 #include "opto/phaseX.hpp" 47 #include "opto/rootnode.hpp" 48 #include "opto/runtime.hpp" 49 #include "opto/subnode.hpp" 50 #include "opto/subtypenode.hpp" 51 #include "opto/type.hpp" 52 #include "runtime/sharedRuntime.hpp" 53 #include "utilities/macros.hpp" 54 #include "utilities/powerOfTwo.hpp" 55 #if INCLUDE_G1GC 56 #include "gc/g1/g1ThreadLocalData.hpp" 57 #endif // INCLUDE_G1GC 58 #if INCLUDE_SHENANDOAHGC 59 #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp" 60 #endif 61 62 63 // 64 // Replace any references to "oldref" in inputs to "use" with "newref". 65 // Returns the number of replacements made. 66 // 67 int PhaseMacroExpand::replace_input(Node *use, Node *oldref, Node *newref) { 68 int nreplacements = 0; 69 uint req = use->req(); 70 for (uint j = 0; j < use->len(); j++) { 71 Node *uin = use->in(j); 72 if (uin == oldref) { 73 if (j < req) 74 use->set_req(j, newref); 75 else 76 use->set_prec(j, newref); 77 nreplacements++; 78 } else if (j >= req && uin == NULL) { 79 break; 80 } 81 } 82 return nreplacements; 83 } 84 85 void PhaseMacroExpand::migrate_outs(Node *old, Node *target) { 86 assert(old != NULL, "sanity"); 87 for (DUIterator_Fast imax, i = old->fast_outs(imax); i < imax; i++) { 88 Node* use = old->fast_out(i); 89 _igvn.rehash_node_delayed(use); 90 imax -= replace_input(use, old, target); 91 // back up iterator 92 --i; 93 } 94 assert(old->outcnt() == 0, "all uses must be deleted"); 95 } 96 97 void PhaseMacroExpand::copy_call_debug_info(CallNode *oldcall, CallNode * newcall) { 98 // Copy debug information and adjust JVMState information 99 uint old_dbg_start = oldcall->tf()->domain()->cnt(); 100 uint new_dbg_start = newcall->tf()->domain()->cnt(); 101 int jvms_adj = new_dbg_start - old_dbg_start; 102 assert (new_dbg_start == newcall->req(), "argument count mismatch"); 103 104 // SafePointScalarObject node could be referenced several times in debug info. 105 // Use Dict to record cloned nodes. 106 Dict* sosn_map = new Dict(cmpkey,hashkey); 107 for (uint i = old_dbg_start; i < oldcall->req(); i++) { 108 Node* old_in = oldcall->in(i); 109 // Clone old SafePointScalarObjectNodes, adjusting their field contents. 110 if (old_in != NULL && old_in->is_SafePointScalarObject()) { 111 SafePointScalarObjectNode* old_sosn = old_in->as_SafePointScalarObject(); 112 uint old_unique = C->unique(); 113 Node* new_in = old_sosn->clone(sosn_map); 114 if (old_unique != C->unique()) { // New node? 115 new_in->set_req(0, C->root()); // reset control edge 116 new_in = transform_later(new_in); // Register new node. 117 } 118 old_in = new_in; 119 } 120 newcall->add_req(old_in); 121 } 122 123 // JVMS may be shared so clone it before we modify it 124 newcall->set_jvms(oldcall->jvms() != NULL ? oldcall->jvms()->clone_deep(C) : NULL); 125 for (JVMState *jvms = newcall->jvms(); jvms != NULL; jvms = jvms->caller()) { 126 jvms->set_map(newcall); 127 jvms->set_locoff(jvms->locoff()+jvms_adj); 128 jvms->set_stkoff(jvms->stkoff()+jvms_adj); 129 jvms->set_monoff(jvms->monoff()+jvms_adj); 130 jvms->set_scloff(jvms->scloff()+jvms_adj); 131 jvms->set_endoff(jvms->endoff()+jvms_adj); 132 } 133 } 134 135 Node* PhaseMacroExpand::opt_bits_test(Node* ctrl, Node* region, int edge, Node* word, int mask, int bits, bool return_fast_path) { 136 Node* cmp; 137 if (mask != 0) { 138 Node* and_node = transform_later(new AndXNode(word, MakeConX(mask))); 139 cmp = transform_later(new CmpXNode(and_node, MakeConX(bits))); 140 } else { 141 cmp = word; 142 } 143 Node* bol = transform_later(new BoolNode(cmp, BoolTest::ne)); 144 IfNode* iff = new IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN ); 145 transform_later(iff); 146 147 // Fast path taken. 148 Node *fast_taken = transform_later(new IfFalseNode(iff)); 149 150 // Fast path not-taken, i.e. slow path 151 Node *slow_taken = transform_later(new IfTrueNode(iff)); 152 153 if (return_fast_path) { 154 region->init_req(edge, slow_taken); // Capture slow-control 155 return fast_taken; 156 } else { 157 region->init_req(edge, fast_taken); // Capture fast-control 158 return slow_taken; 159 } 160 } 161 162 //--------------------copy_predefined_input_for_runtime_call-------------------- 163 void PhaseMacroExpand::copy_predefined_input_for_runtime_call(Node * ctrl, CallNode* oldcall, CallNode* call) { 164 // Set fixed predefined input arguments 165 call->init_req( TypeFunc::Control, ctrl ); 166 call->init_req( TypeFunc::I_O , oldcall->in( TypeFunc::I_O) ); 167 call->init_req( TypeFunc::Memory , oldcall->in( TypeFunc::Memory ) ); // ????? 168 call->init_req( TypeFunc::ReturnAdr, oldcall->in( TypeFunc::ReturnAdr ) ); 169 call->init_req( TypeFunc::FramePtr, oldcall->in( TypeFunc::FramePtr ) ); 170 } 171 172 //------------------------------make_slow_call--------------------------------- 173 CallNode* PhaseMacroExpand::make_slow_call(CallNode *oldcall, const TypeFunc* slow_call_type, 174 address slow_call, const char* leaf_name, Node* slow_path, 175 Node* parm0, Node* parm1, Node* parm2) { 176 177 // Slow-path call 178 CallNode *call = leaf_name 179 ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM ) 180 : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM ); 181 182 // Slow path call has no side-effects, uses few values 183 copy_predefined_input_for_runtime_call(slow_path, oldcall, call ); 184 if (parm0 != NULL) call->init_req(TypeFunc::Parms+0, parm0); 185 if (parm1 != NULL) call->init_req(TypeFunc::Parms+1, parm1); 186 if (parm2 != NULL) call->init_req(TypeFunc::Parms+2, parm2); 187 copy_call_debug_info(oldcall, call); 188 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON. 189 _igvn.replace_node(oldcall, call); 190 transform_later(call); 191 192 return call; 193 } 194 195 void PhaseMacroExpand::extract_call_projections(CallNode *call) { 196 _fallthroughproj = NULL; 197 _fallthroughcatchproj = NULL; 198 _ioproj_fallthrough = NULL; 199 _ioproj_catchall = NULL; 200 _catchallcatchproj = NULL; 201 _memproj_fallthrough = NULL; 202 _memproj_catchall = NULL; 203 _resproj = NULL; 204 for (DUIterator_Fast imax, i = call->fast_outs(imax); i < imax; i++) { 205 ProjNode *pn = call->fast_out(i)->as_Proj(); 206 switch (pn->_con) { 207 case TypeFunc::Control: 208 { 209 // For Control (fallthrough) and I_O (catch_all_index) we have CatchProj -> Catch -> Proj 210 _fallthroughproj = pn; 211 DUIterator_Fast jmax, j = pn->fast_outs(jmax); 212 const Node *cn = pn->fast_out(j); 213 if (cn->is_Catch()) { 214 ProjNode *cpn = NULL; 215 for (DUIterator_Fast kmax, k = cn->fast_outs(kmax); k < kmax; k++) { 216 cpn = cn->fast_out(k)->as_Proj(); 217 assert(cpn->is_CatchProj(), "must be a CatchProjNode"); 218 if (cpn->_con == CatchProjNode::fall_through_index) 219 _fallthroughcatchproj = cpn; 220 else { 221 assert(cpn->_con == CatchProjNode::catch_all_index, "must be correct index."); 222 _catchallcatchproj = cpn; 223 } 224 } 225 } 226 break; 227 } 228 case TypeFunc::I_O: 229 if (pn->_is_io_use) 230 _ioproj_catchall = pn; 231 else 232 _ioproj_fallthrough = pn; 233 break; 234 case TypeFunc::Memory: 235 if (pn->_is_io_use) 236 _memproj_catchall = pn; 237 else 238 _memproj_fallthrough = pn; 239 break; 240 case TypeFunc::Parms: 241 _resproj = pn; 242 break; 243 default: 244 assert(false, "unexpected projection from allocation node."); 245 } 246 } 247 248 } 249 250 void PhaseMacroExpand::eliminate_gc_barrier(Node* p2x) { 251 BarrierSetC2 *bs = BarrierSet::barrier_set()->barrier_set_c2(); 252 bs->eliminate_gc_barrier(this, p2x); 253 } 254 255 // Search for a memory operation for the specified memory slice. 256 static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_mem, Node *alloc, PhaseGVN *phase) { 257 Node *orig_mem = mem; 258 Node *alloc_mem = alloc->in(TypeFunc::Memory); 259 const TypeOopPtr *tinst = phase->C->get_adr_type(alias_idx)->isa_oopptr(); 260 while (true) { 261 if (mem == alloc_mem || mem == start_mem ) { 262 return mem; // hit one of our sentinels 263 } else if (mem->is_MergeMem()) { 264 mem = mem->as_MergeMem()->memory_at(alias_idx); 265 } else if (mem->is_Proj() && mem->as_Proj()->_con == TypeFunc::Memory) { 266 Node *in = mem->in(0); 267 // we can safely skip over safepoints, calls, locks and membars because we 268 // already know that the object is safe to eliminate. 269 if (in->is_Initialize() && in->as_Initialize()->allocation() == alloc) { 270 return in; 271 } else if (in->is_Call()) { 272 CallNode *call = in->as_Call(); 273 if (call->may_modify(tinst, phase)) { 274 assert(call->is_ArrayCopy(), "ArrayCopy is the only call node that doesn't make allocation escape"); 275 if (call->as_ArrayCopy()->modifies(offset, offset, phase, false)) { 276 return in; 277 } 278 } 279 mem = in->in(TypeFunc::Memory); 280 } else if (in->is_MemBar()) { 281 ArrayCopyNode* ac = NULL; 282 if (ArrayCopyNode::may_modify(tinst, in->as_MemBar(), phase, ac)) { 283 assert(ac != NULL && ac->is_clonebasic(), "Only basic clone is a non escaping clone"); 284 return ac; 285 } 286 mem = in->in(TypeFunc::Memory); 287 } else { 288 assert(false, "unexpected projection"); 289 } 290 } else if (mem->is_Store()) { 291 const TypePtr* atype = mem->as_Store()->adr_type(); 292 int adr_idx = phase->C->get_alias_index(atype); 293 if (adr_idx == alias_idx) { 294 assert(atype->isa_oopptr(), "address type must be oopptr"); 295 int adr_offset = atype->offset(); 296 uint adr_iid = atype->is_oopptr()->instance_id(); 297 // Array elements references have the same alias_idx 298 // but different offset and different instance_id. 299 if (adr_offset == offset && adr_iid == alloc->_idx) 300 return mem; 301 } else { 302 assert(adr_idx == Compile::AliasIdxRaw, "address must match or be raw"); 303 } 304 mem = mem->in(MemNode::Memory); 305 } else if (mem->is_ClearArray()) { 306 intptr_t offset; 307 AllocateNode* alloc = AllocateNode::Ideal_allocation(mem->in(3), phase, offset); 308 309 if (alloc == NULL) { 310 return start_mem; 311 } 312 313 if (!ClearArrayNode::step_through(&mem, alloc->_idx, phase)) { 314 // Can not bypass initialization of the instance 315 // we are looking. 316 debug_only(intptr_t offset;) 317 assert(alloc == AllocateNode::Ideal_allocation(mem->in(3), phase, offset), "sanity"); 318 InitializeNode* init = alloc->as_Allocate()->initialization(); 319 // We are looking for stored value, return Initialize node 320 // or memory edge from Allocate node. 321 if (init != NULL) 322 return init; 323 else 324 return alloc->in(TypeFunc::Memory); // It will produce zero value (see callers). 325 } 326 // Otherwise skip it (the call updated 'mem' value). 327 } else if (mem->Opcode() == Op_SCMemProj) { 328 mem = mem->in(0); 329 Node* adr = NULL; 330 if (mem->is_LoadStore()) { 331 adr = mem->in(MemNode::Address); 332 } else { 333 assert(mem->Opcode() == Op_EncodeISOArray || 334 mem->Opcode() == Op_StrCompressedCopy, "sanity"); 335 adr = mem->in(3); // Destination array 336 } 337 const TypePtr* atype = adr->bottom_type()->is_ptr(); 338 int adr_idx = phase->C->get_alias_index(atype); 339 if (adr_idx == alias_idx) { 340 DEBUG_ONLY(mem->dump();) 341 assert(false, "Object is not scalar replaceable if a LoadStore node accesses its field"); 342 return NULL; 343 } 344 mem = mem->in(MemNode::Memory); 345 } else if (mem->Opcode() == Op_StrInflatedCopy) { 346 Node* adr = mem->in(3); // Destination array 347 const TypePtr* atype = adr->bottom_type()->is_ptr(); 348 int adr_idx = phase->C->get_alias_index(atype); 349 if (adr_idx == alias_idx) { 350 DEBUG_ONLY(mem->dump();) 351 assert(false, "Object is not scalar replaceable if a StrInflatedCopy node accesses its field"); 352 return NULL; 353 } 354 mem = mem->in(MemNode::Memory); 355 } else { 356 return mem; 357 } 358 assert(mem != orig_mem, "dead memory loop"); 359 } 360 } 361 362 // Generate loads from source of the arraycopy for fields of 363 // destination needed at a deoptimization point 364 Node* PhaseMacroExpand::make_arraycopy_load(ArrayCopyNode* ac, intptr_t offset, Node* ctl, Node* mem, BasicType ft, const Type *ftype, AllocateNode *alloc) { 365 BasicType bt = ft; 366 const Type *type = ftype; 367 if (ft == T_NARROWOOP) { 368 bt = T_OBJECT; 369 type = ftype->make_oopptr(); 370 } 371 Node* res = NULL; 372 if (ac->is_clonebasic()) { 373 assert(ac->in(ArrayCopyNode::Src) != ac->in(ArrayCopyNode::Dest), "clone source equals destination"); 374 Node* base = ac->in(ArrayCopyNode::Src); 375 Node* adr = _igvn.transform(new AddPNode(base, base, MakeConX(offset))); 376 const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset); 377 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::UnknownControl); 378 } else { 379 if (ac->modifies(offset, offset, &_igvn, true)) { 380 assert(ac->in(ArrayCopyNode::Dest) == alloc->result_cast(), "arraycopy destination should be allocation's result"); 381 uint shift = exact_log2(type2aelembytes(bt)); 382 Node* src_pos = ac->in(ArrayCopyNode::SrcPos); 383 Node* dest_pos = ac->in(ArrayCopyNode::DestPos); 384 const TypeInt* src_pos_t = _igvn.type(src_pos)->is_int(); 385 const TypeInt* dest_pos_t = _igvn.type(dest_pos)->is_int(); 386 387 Node* adr = NULL; 388 const TypePtr* adr_type = NULL; 389 if (src_pos_t->is_con() && dest_pos_t->is_con()) { 390 intptr_t off = ((src_pos_t->get_con() - dest_pos_t->get_con()) << shift) + offset; 391 Node* base = ac->in(ArrayCopyNode::Src); 392 adr = _igvn.transform(new AddPNode(base, base, MakeConX(off))); 393 adr_type = _igvn.type(base)->is_ptr()->add_offset(off); 394 if (ac->in(ArrayCopyNode::Src) == ac->in(ArrayCopyNode::Dest)) { 395 // Don't emit a new load from src if src == dst but try to get the value from memory instead 396 return value_from_mem(ac->in(TypeFunc::Memory), ctl, ft, ftype, adr_type->isa_oopptr(), alloc); 397 } 398 } else { 399 Node* diff = _igvn.transform(new SubINode(ac->in(ArrayCopyNode::SrcPos), ac->in(ArrayCopyNode::DestPos))); 400 #ifdef _LP64 401 diff = _igvn.transform(new ConvI2LNode(diff)); 402 #endif 403 diff = _igvn.transform(new LShiftXNode(diff, intcon(shift))); 404 405 Node* off = _igvn.transform(new AddXNode(MakeConX(offset), diff)); 406 Node* base = ac->in(ArrayCopyNode::Src); 407 adr = _igvn.transform(new AddPNode(base, base, off)); 408 adr_type = _igvn.type(base)->is_ptr()->add_offset(Type::OffsetBot); 409 if (ac->in(ArrayCopyNode::Src) == ac->in(ArrayCopyNode::Dest)) { 410 // Non constant offset in the array: we can't statically 411 // determine the value 412 return NULL; 413 } 414 } 415 res = LoadNode::make(_igvn, ctl, mem, adr, adr_type, type, bt, MemNode::unordered, LoadNode::UnknownControl); 416 } 417 } 418 if (res != NULL) { 419 res = _igvn.transform(res); 420 if (ftype->isa_narrowoop()) { 421 // PhaseMacroExpand::scalar_replacement adds DecodeN nodes 422 res = _igvn.transform(new EncodePNode(res, ftype)); 423 } 424 return res; 425 } 426 return NULL; 427 } 428 429 // 430 // Given a Memory Phi, compute a value Phi containing the values from stores 431 // on the input paths. 432 // Note: this function is recursive, its depth is limited by the "level" argument 433 // Returns the computed Phi, or NULL if it cannot compute it. 434 Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type *phi_type, const TypeOopPtr *adr_t, AllocateNode *alloc, Node_Stack *value_phis, int level) { 435 assert(mem->is_Phi(), "sanity"); 436 int alias_idx = C->get_alias_index(adr_t); 437 int offset = adr_t->offset(); 438 int instance_id = adr_t->instance_id(); 439 440 // Check if an appropriate value phi already exists. 441 Node* region = mem->in(0); 442 for (DUIterator_Fast kmax, k = region->fast_outs(kmax); k < kmax; k++) { 443 Node* phi = region->fast_out(k); 444 if (phi->is_Phi() && phi != mem && 445 phi->as_Phi()->is_same_inst_field(phi_type, (int)mem->_idx, instance_id, alias_idx, offset)) { 446 return phi; 447 } 448 } 449 // Check if an appropriate new value phi already exists. 450 Node* new_phi = value_phis->find(mem->_idx); 451 if (new_phi != NULL) 452 return new_phi; 453 454 if (level <= 0) { 455 return NULL; // Give up: phi tree too deep 456 } 457 Node *start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); 458 Node *alloc_mem = alloc->in(TypeFunc::Memory); 459 460 uint length = mem->req(); 461 GrowableArray <Node *> values(length, length, NULL); 462 463 // create a new Phi for the value 464 PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, mem->_idx, instance_id, alias_idx, offset); 465 transform_later(phi); 466 value_phis->push(phi, mem->_idx); 467 468 for (uint j = 1; j < length; j++) { 469 Node *in = mem->in(j); 470 if (in == NULL || in->is_top()) { 471 values.at_put(j, in); 472 } else { 473 Node *val = scan_mem_chain(in, alias_idx, offset, start_mem, alloc, &_igvn); 474 if (val == start_mem || val == alloc_mem) { 475 // hit a sentinel, return appropriate 0 value 476 values.at_put(j, _igvn.zerocon(ft)); 477 continue; 478 } 479 if (val->is_Initialize()) { 480 val = val->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn); 481 } 482 if (val == NULL) { 483 return NULL; // can't find a value on this path 484 } 485 if (val == mem) { 486 values.at_put(j, mem); 487 } else if (val->is_Store()) { 488 Node* n = val->in(MemNode::ValueIn); 489 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); 490 n = bs->step_over_gc_barrier(n); 491 values.at_put(j, n); 492 } else if(val->is_Proj() && val->in(0) == alloc) { 493 values.at_put(j, _igvn.zerocon(ft)); 494 } else if (val->is_Phi()) { 495 val = value_from_mem_phi(val, ft, phi_type, adr_t, alloc, value_phis, level-1); 496 if (val == NULL) { 497 return NULL; 498 } 499 values.at_put(j, val); 500 } else if (val->Opcode() == Op_SCMemProj) { 501 assert(val->in(0)->is_LoadStore() || 502 val->in(0)->Opcode() == Op_EncodeISOArray || 503 val->in(0)->Opcode() == Op_StrCompressedCopy, "sanity"); 504 assert(false, "Object is not scalar replaceable if a LoadStore node accesses its field"); 505 return NULL; 506 } else if (val->is_ArrayCopy()) { 507 Node* res = make_arraycopy_load(val->as_ArrayCopy(), offset, val->in(0), val->in(TypeFunc::Memory), ft, phi_type, alloc); 508 if (res == NULL) { 509 return NULL; 510 } 511 values.at_put(j, res); 512 } else { 513 #ifdef ASSERT 514 val->dump(); 515 assert(false, "unknown node on this path"); 516 #endif 517 return NULL; // unknown node on this path 518 } 519 } 520 } 521 // Set Phi's inputs 522 for (uint j = 1; j < length; j++) { 523 if (values.at(j) == mem) { 524 phi->init_req(j, phi); 525 } else { 526 phi->init_req(j, values.at(j)); 527 } 528 } 529 return phi; 530 } 531 532 // Search the last value stored into the object's field. 533 Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, Node *sfpt_ctl, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, AllocateNode *alloc) { 534 assert(adr_t->is_known_instance_field(), "instance required"); 535 int instance_id = adr_t->instance_id(); 536 assert((uint)instance_id == alloc->_idx, "wrong allocation"); 537 538 int alias_idx = C->get_alias_index(adr_t); 539 int offset = adr_t->offset(); 540 Node *start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); 541 Node *alloc_ctrl = alloc->in(TypeFunc::Control); 542 Node *alloc_mem = alloc->in(TypeFunc::Memory); 543 Arena *a = Thread::current()->resource_area(); 544 VectorSet visited(a); 545 546 bool done = sfpt_mem == alloc_mem; 547 Node *mem = sfpt_mem; 548 while (!done) { 549 if (visited.test_set(mem->_idx)) { 550 return NULL; // found a loop, give up 551 } 552 mem = scan_mem_chain(mem, alias_idx, offset, start_mem, alloc, &_igvn); 553 if (mem == start_mem || mem == alloc_mem) { 554 done = true; // hit a sentinel, return appropriate 0 value 555 } else if (mem->is_Initialize()) { 556 mem = mem->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn); 557 if (mem == NULL) { 558 done = true; // Something go wrong. 559 } else if (mem->is_Store()) { 560 const TypePtr* atype = mem->as_Store()->adr_type(); 561 assert(C->get_alias_index(atype) == Compile::AliasIdxRaw, "store is correct memory slice"); 562 done = true; 563 } 564 } else if (mem->is_Store()) { 565 const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr(); 566 assert(atype != NULL, "address type must be oopptr"); 567 assert(C->get_alias_index(atype) == alias_idx && 568 atype->is_known_instance_field() && atype->offset() == offset && 569 atype->instance_id() == instance_id, "store is correct memory slice"); 570 done = true; 571 } else if (mem->is_Phi()) { 572 // try to find a phi's unique input 573 Node *unique_input = NULL; 574 Node *top = C->top(); 575 for (uint i = 1; i < mem->req(); i++) { 576 Node *n = scan_mem_chain(mem->in(i), alias_idx, offset, start_mem, alloc, &_igvn); 577 if (n == NULL || n == top || n == mem) { 578 continue; 579 } else if (unique_input == NULL) { 580 unique_input = n; 581 } else if (unique_input != n) { 582 unique_input = top; 583 break; 584 } 585 } 586 if (unique_input != NULL && unique_input != top) { 587 mem = unique_input; 588 } else { 589 done = true; 590 } 591 } else if (mem->is_ArrayCopy()) { 592 done = true; 593 } else { 594 assert(false, "unexpected node"); 595 } 596 } 597 if (mem != NULL) { 598 if (mem == start_mem || mem == alloc_mem) { 599 // hit a sentinel, return appropriate 0 value 600 return _igvn.zerocon(ft); 601 } else if (mem->is_Store()) { 602 Node* n = mem->in(MemNode::ValueIn); 603 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); 604 n = bs->step_over_gc_barrier(n); 605 return n; 606 } else if (mem->is_Phi()) { 607 // attempt to produce a Phi reflecting the values on the input paths of the Phi 608 Node_Stack value_phis(a, 8); 609 Node * phi = value_from_mem_phi(mem, ft, ftype, adr_t, alloc, &value_phis, ValueSearchLimit); 610 if (phi != NULL) { 611 return phi; 612 } else { 613 // Kill all new Phis 614 while(value_phis.is_nonempty()) { 615 Node* n = value_phis.node(); 616 _igvn.replace_node(n, C->top()); 617 value_phis.pop(); 618 } 619 } 620 } else if (mem->is_ArrayCopy()) { 621 Node* ctl = mem->in(0); 622 Node* m = mem->in(TypeFunc::Memory); 623 if (sfpt_ctl->is_Proj() && sfpt_ctl->as_Proj()->is_uncommon_trap_proj(Deoptimization::Reason_none)) { 624 // pin the loads in the uncommon trap path 625 ctl = sfpt_ctl; 626 m = sfpt_mem; 627 } 628 return make_arraycopy_load(mem->as_ArrayCopy(), offset, ctl, m, ft, ftype, alloc); 629 } 630 } 631 // Something go wrong. 632 return NULL; 633 } 634 635 // Check the possibility of scalar replacement. 636 bool PhaseMacroExpand::can_eliminate_allocation(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints) { 637 // Scan the uses of the allocation to check for anything that would 638 // prevent us from eliminating it. 639 NOT_PRODUCT( const char* fail_eliminate = NULL; ) 640 DEBUG_ONLY( Node* disq_node = NULL; ) 641 bool can_eliminate = true; 642 643 Node* res = alloc->result_cast(); 644 const TypeOopPtr* res_type = NULL; 645 if (res == NULL) { 646 // All users were eliminated. 647 } else if (!res->is_CheckCastPP()) { 648 NOT_PRODUCT(fail_eliminate = "Allocation does not have unique CheckCastPP";) 649 can_eliminate = false; 650 } else { 651 res_type = _igvn.type(res)->isa_oopptr(); 652 if (res_type == NULL) { 653 NOT_PRODUCT(fail_eliminate = "Neither instance or array allocation";) 654 can_eliminate = false; 655 } else if (res_type->isa_aryptr()) { 656 int length = alloc->in(AllocateNode::ALength)->find_int_con(-1); 657 if (length < 0) { 658 NOT_PRODUCT(fail_eliminate = "Array's size is not constant";) 659 can_eliminate = false; 660 } 661 } 662 } 663 664 if (can_eliminate && res != NULL) { 665 for (DUIterator_Fast jmax, j = res->fast_outs(jmax); 666 j < jmax && can_eliminate; j++) { 667 Node* use = res->fast_out(j); 668 669 if (use->is_AddP()) { 670 const TypePtr* addp_type = _igvn.type(use)->is_ptr(); 671 int offset = addp_type->offset(); 672 673 if (offset == Type::OffsetTop || offset == Type::OffsetBot) { 674 NOT_PRODUCT(fail_eliminate = "Undefined field referrence";) 675 can_eliminate = false; 676 break; 677 } 678 for (DUIterator_Fast kmax, k = use->fast_outs(kmax); 679 k < kmax && can_eliminate; k++) { 680 Node* n = use->fast_out(k); 681 if (!n->is_Store() && n->Opcode() != Op_CastP2X 682 SHENANDOAHGC_ONLY(&& (!UseShenandoahGC || !ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(n))) ) { 683 DEBUG_ONLY(disq_node = n;) 684 if (n->is_Load() || n->is_LoadStore()) { 685 NOT_PRODUCT(fail_eliminate = "Field load";) 686 } else { 687 NOT_PRODUCT(fail_eliminate = "Not store field referrence";) 688 } 689 can_eliminate = false; 690 } 691 } 692 } else if (use->is_ArrayCopy() && 693 (use->as_ArrayCopy()->is_clonebasic() || 694 use->as_ArrayCopy()->is_arraycopy_validated() || 695 use->as_ArrayCopy()->is_copyof_validated() || 696 use->as_ArrayCopy()->is_copyofrange_validated()) && 697 use->in(ArrayCopyNode::Dest) == res) { 698 // ok to eliminate 699 } else if (use->is_SafePoint()) { 700 SafePointNode* sfpt = use->as_SafePoint(); 701 if (sfpt->is_Call() && sfpt->as_Call()->has_non_debug_use(res)) { 702 // Object is passed as argument. 703 DEBUG_ONLY(disq_node = use;) 704 NOT_PRODUCT(fail_eliminate = "Object is passed as argument";) 705 can_eliminate = false; 706 } 707 Node* sfptMem = sfpt->memory(); 708 if (sfptMem == NULL || sfptMem->is_top()) { 709 DEBUG_ONLY(disq_node = use;) 710 NOT_PRODUCT(fail_eliminate = "NULL or TOP memory";) 711 can_eliminate = false; 712 } else { 713 safepoints.append_if_missing(sfpt); 714 } 715 } else if (use->Opcode() != Op_CastP2X) { // CastP2X is used by card mark 716 if (use->is_Phi()) { 717 if (use->outcnt() == 1 && use->unique_out()->Opcode() == Op_Return) { 718 NOT_PRODUCT(fail_eliminate = "Object is return value";) 719 } else { 720 NOT_PRODUCT(fail_eliminate = "Object is referenced by Phi";) 721 } 722 DEBUG_ONLY(disq_node = use;) 723 } else { 724 if (use->Opcode() == Op_Return) { 725 NOT_PRODUCT(fail_eliminate = "Object is return value";) 726 }else { 727 NOT_PRODUCT(fail_eliminate = "Object is referenced by node";) 728 } 729 DEBUG_ONLY(disq_node = use;) 730 } 731 can_eliminate = false; 732 } 733 } 734 } 735 736 #ifndef PRODUCT 737 if (print_eliminate_allocations()) { 738 if (can_eliminate) { 739 tty->print("Scalar "); 740 if (res == NULL) 741 alloc->dump(); 742 else 743 res->dump(); 744 } else if (alloc->_is_scalar_replaceable) { 745 tty->print("NotScalar (%s)", fail_eliminate); 746 if (res == NULL) 747 alloc->dump(); 748 else 749 res->dump(); 750 #ifdef ASSERT 751 if (disq_node != NULL) { 752 tty->print(" >>>> "); 753 disq_node->dump(); 754 } 755 #endif /*ASSERT*/ 756 } 757 } 758 #endif 759 return can_eliminate; 760 } 761 762 void PhaseMacroExpand::adjust_safepoint_jvms(SafePointNode* sfpt, Node* res, SafePointScalarObjectNode* sobj) { 763 JVMState *jvms = sfpt->jvms(); 764 jvms->set_endoff(sfpt->req()); 765 766 // Now make a pass over the debug information replacing any references 767 // to the allocated object with "sobj" 768 int start = jvms->debug_start(); 769 int end = jvms->debug_end(); 770 sfpt->replace_edges_in_range(res, sobj, start, end); 771 _igvn._worklist.push(sfpt); 772 } 773 774 // Do scalar replacement. 775 bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints) { 776 GrowableArray <SafePointNode *> safepoints_done; 777 778 ciKlass* klass = NULL; 779 ciInstanceKlass* iklass = NULL; 780 int nfields = 0; 781 int array_base = 0; 782 int element_size = 0; 783 BasicType basic_elem_type = T_ILLEGAL; 784 ciType* elem_type = NULL; 785 786 Node* res = alloc->result_cast(); 787 assert(res == NULL || res->is_CheckCastPP(), "unexpected AllocateNode result"); 788 const TypeOopPtr* res_type = NULL; 789 if (res != NULL) { // Could be NULL when there are no users 790 res_type = _igvn.type(res)->isa_oopptr(); 791 } 792 793 if (res != NULL) { 794 klass = res_type->klass(); 795 if (res_type->isa_instptr()) { 796 // find the fields of the class which will be needed for safepoint debug information 797 assert(klass->is_instance_klass(), "must be an instance klass."); 798 iklass = klass->as_instance_klass(); 799 nfields = iklass->nof_nonstatic_fields(); 800 } else { 801 // find the array's elements which will be needed for safepoint debug information 802 nfields = alloc->in(AllocateNode::ALength)->find_int_con(-1); 803 assert(klass->is_array_klass() && nfields >= 0, "must be an array klass."); 804 elem_type = klass->as_array_klass()->element_type(); 805 basic_elem_type = elem_type->basic_type(); 806 array_base = arrayOopDesc::base_offset_in_bytes(basic_elem_type); 807 element_size = type2aelembytes(basic_elem_type); 808 } 809 } 810 // 811 // Process the safepoint uses 812 // 813 while (safepoints.length() > 0) { 814 SafePointNode* sfpt = safepoints.pop(); 815 Node* mem = sfpt->memory(); 816 Node* ctl = sfpt->control(); 817 assert(sfpt->jvms() != NULL, "missed JVMS"); 818 // Fields of scalar objs are referenced only at the end 819 // of regular debuginfo at the last (youngest) JVMS. 820 // Record relative start index. 821 uint first_ind = (sfpt->req() - sfpt->jvms()->scloff()); 822 SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(res_type, 823 #ifdef ASSERT 824 alloc, 825 #endif 826 first_ind, nfields); 827 sobj->init_req(0, C->root()); 828 transform_later(sobj); 829 830 // Scan object's fields adding an input to the safepoint for each field. 831 for (int j = 0; j < nfields; j++) { 832 intptr_t offset; 833 ciField* field = NULL; 834 if (iklass != NULL) { 835 field = iklass->nonstatic_field_at(j); 836 offset = field->offset(); 837 elem_type = field->type(); 838 basic_elem_type = field->layout_type(); 839 } else { 840 offset = array_base + j * (intptr_t)element_size; 841 } 842 843 const Type *field_type; 844 // The next code is taken from Parse::do_get_xxx(). 845 if (is_reference_type(basic_elem_type)) { 846 if (!elem_type->is_loaded()) { 847 field_type = TypeInstPtr::BOTTOM; 848 } else if (field != NULL && field->is_static_constant()) { 849 // This can happen if the constant oop is non-perm. 850 ciObject* con = field->constant_value().as_object(); 851 // Do not "join" in the previous type; it doesn't add value, 852 // and may yield a vacuous result if the field is of interface type. 853 field_type = TypeOopPtr::make_from_constant(con)->isa_oopptr(); 854 assert(field_type != NULL, "field singleton type must be consistent"); 855 } else { 856 field_type = TypeOopPtr::make_from_klass(elem_type->as_klass()); 857 } 858 if (UseCompressedOops) { 859 field_type = field_type->make_narrowoop(); 860 basic_elem_type = T_NARROWOOP; 861 } 862 } else { 863 field_type = Type::get_const_basic_type(basic_elem_type); 864 } 865 866 const TypeOopPtr *field_addr_type = res_type->add_offset(offset)->isa_oopptr(); 867 868 Node *field_val = value_from_mem(mem, ctl, basic_elem_type, field_type, field_addr_type, alloc); 869 if (field_val == NULL) { 870 // We weren't able to find a value for this field, 871 // give up on eliminating this allocation. 872 873 // Remove any extra entries we added to the safepoint. 874 uint last = sfpt->req() - 1; 875 for (int k = 0; k < j; k++) { 876 sfpt->del_req(last--); 877 } 878 _igvn._worklist.push(sfpt); 879 // rollback processed safepoints 880 while (safepoints_done.length() > 0) { 881 SafePointNode* sfpt_done = safepoints_done.pop(); 882 // remove any extra entries we added to the safepoint 883 last = sfpt_done->req() - 1; 884 for (int k = 0; k < nfields; k++) { 885 sfpt_done->del_req(last--); 886 } 887 JVMState *jvms = sfpt_done->jvms(); 888 jvms->set_endoff(sfpt_done->req()); 889 // Now make a pass over the debug information replacing any references 890 // to SafePointScalarObjectNode with the allocated object. 891 int start = jvms->debug_start(); 892 int end = jvms->debug_end(); 893 for (int i = start; i < end; i++) { 894 if (sfpt_done->in(i)->is_SafePointScalarObject()) { 895 SafePointScalarObjectNode* scobj = sfpt_done->in(i)->as_SafePointScalarObject(); 896 if (scobj->first_index(jvms) == sfpt_done->req() && 897 scobj->n_fields() == (uint)nfields) { 898 assert(scobj->alloc() == alloc, "sanity"); 899 sfpt_done->set_req(i, res); 900 } 901 } 902 } 903 _igvn._worklist.push(sfpt_done); 904 } 905 #ifndef PRODUCT 906 if (print_eliminate_allocations()) { 907 if (field != NULL) { 908 tty->print("=== At SafePoint node %d can't find value of Field: ", 909 sfpt->_idx); 910 field->print(); 911 int field_idx = C->get_alias_index(field_addr_type); 912 tty->print(" (alias_idx=%d)", field_idx); 913 } else { // Array's element 914 tty->print("=== At SafePoint node %d can't find value of array element [%d]", 915 sfpt->_idx, j); 916 } 917 tty->print(", which prevents elimination of: "); 918 if (res == NULL) 919 alloc->dump(); 920 else 921 res->dump(); 922 } 923 #endif 924 return false; 925 } 926 if (UseCompressedOops && field_type->isa_narrowoop()) { 927 // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation 928 // to be able scalar replace the allocation. 929 if (field_val->is_EncodeP()) { 930 field_val = field_val->in(1); 931 } else { 932 field_val = transform_later(new DecodeNNode(field_val, field_val->get_ptr_type())); 933 } 934 } 935 sfpt->add_req(field_val); 936 } 937 adjust_safepoint_jvms(sfpt, res, sobj); 938 safepoints_done.append_if_missing(sfpt); // keep it for rollback 939 } 940 return true; 941 } 942 943 static void disconnect_projections(MultiNode* n, PhaseIterGVN& igvn) { 944 Node* ctl_proj = n->proj_out_or_null(TypeFunc::Control); 945 Node* mem_proj = n->proj_out_or_null(TypeFunc::Memory); 946 if (ctl_proj != NULL) { 947 igvn.replace_node(ctl_proj, n->in(0)); 948 } 949 if (mem_proj != NULL) { 950 igvn.replace_node(mem_proj, n->in(TypeFunc::Memory)); 951 } 952 } 953 954 // Process users of eliminated allocation. 955 void PhaseMacroExpand::process_users_of_allocation(CallNode *alloc) { 956 Node* res = alloc->result_cast(); 957 if (res != NULL) { 958 for (DUIterator_Last jmin, j = res->last_outs(jmin); j >= jmin; ) { 959 Node *use = res->last_out(j); 960 uint oc1 = res->outcnt(); 961 962 if (use->is_AddP()) { 963 for (DUIterator_Last kmin, k = use->last_outs(kmin); k >= kmin; ) { 964 Node *n = use->last_out(k); 965 uint oc2 = use->outcnt(); 966 if (n->is_Store()) { 967 #ifdef ASSERT 968 // Verify that there is no dependent MemBarVolatile nodes, 969 // they should be removed during IGVN, see MemBarNode::Ideal(). 970 for (DUIterator_Fast pmax, p = n->fast_outs(pmax); 971 p < pmax; p++) { 972 Node* mb = n->fast_out(p); 973 assert(mb->is_Initialize() || !mb->is_MemBar() || 974 mb->req() <= MemBarNode::Precedent || 975 mb->in(MemBarNode::Precedent) != n, 976 "MemBarVolatile should be eliminated for non-escaping object"); 977 } 978 #endif 979 _igvn.replace_node(n, n->in(MemNode::Memory)); 980 } else { 981 eliminate_gc_barrier(n); 982 } 983 k -= (oc2 - use->outcnt()); 984 } 985 _igvn.remove_dead_node(use); 986 } else if (use->is_ArrayCopy()) { 987 // Disconnect ArrayCopy node 988 ArrayCopyNode* ac = use->as_ArrayCopy(); 989 if (ac->is_clonebasic()) { 990 Node* membar_after = ac->proj_out(TypeFunc::Control)->unique_ctrl_out(); 991 disconnect_projections(ac, _igvn); 992 assert(alloc->in(TypeFunc::Memory)->is_Proj() && alloc->in(TypeFunc::Memory)->in(0)->Opcode() == Op_MemBarCPUOrder, "mem barrier expected before allocation"); 993 Node* membar_before = alloc->in(TypeFunc::Memory)->in(0); 994 disconnect_projections(membar_before->as_MemBar(), _igvn); 995 if (membar_after->is_MemBar()) { 996 disconnect_projections(membar_after->as_MemBar(), _igvn); 997 } 998 } else { 999 assert(ac->is_arraycopy_validated() || 1000 ac->is_copyof_validated() || 1001 ac->is_copyofrange_validated(), "unsupported"); 1002 CallProjections callprojs; 1003 ac->extract_projections(&callprojs, true); 1004 1005 _igvn.replace_node(callprojs.fallthrough_ioproj, ac->in(TypeFunc::I_O)); 1006 _igvn.replace_node(callprojs.fallthrough_memproj, ac->in(TypeFunc::Memory)); 1007 _igvn.replace_node(callprojs.fallthrough_catchproj, ac->in(TypeFunc::Control)); 1008 1009 // Set control to top. IGVN will remove the remaining projections 1010 ac->set_req(0, top()); 1011 ac->replace_edge(res, top()); 1012 1013 // Disconnect src right away: it can help find new 1014 // opportunities for allocation elimination 1015 Node* src = ac->in(ArrayCopyNode::Src); 1016 ac->replace_edge(src, top()); 1017 // src can be top at this point if src and dest of the 1018 // arraycopy were the same 1019 if (src->outcnt() == 0 && !src->is_top()) { 1020 _igvn.remove_dead_node(src); 1021 } 1022 } 1023 _igvn._worklist.push(ac); 1024 } else { 1025 eliminate_gc_barrier(use); 1026 } 1027 j -= (oc1 - res->outcnt()); 1028 } 1029 assert(res->outcnt() == 0, "all uses of allocated objects must be deleted"); 1030 _igvn.remove_dead_node(res); 1031 } 1032 1033 eliminate_unused_allocation_edges(alloc); 1034 } 1035 1036 void PhaseMacroExpand::eliminate_unused_allocation_edges(CallNode* alloc) { 1037 // 1038 // Process other users of allocation's projections 1039 // 1040 if (_resproj != NULL && _resproj->outcnt() != 0) { 1041 // First disconnect stores captured by Initialize node. 1042 // If Initialize node is eliminated first in the following code, 1043 // it will kill such stores and DUIterator_Last will assert. 1044 for (DUIterator_Fast jmax, j = _resproj->fast_outs(jmax); j < jmax; j++) { 1045 Node *use = _resproj->fast_out(j); 1046 if (use->is_AddP()) { 1047 // raw memory addresses used only by the initialization 1048 _igvn.replace_node(use, C->top()); 1049 --j; --jmax; 1050 } 1051 } 1052 for (DUIterator_Last jmin, j = _resproj->last_outs(jmin); j >= jmin; ) { 1053 Node *use = _resproj->last_out(j); 1054 uint oc1 = _resproj->outcnt(); 1055 if (use->is_Initialize()) { 1056 // Eliminate Initialize node. 1057 InitializeNode *init = use->as_Initialize(); 1058 assert(init->outcnt() <= 2, "only a control and memory projection expected"); 1059 Node *ctrl_proj = init->proj_out_or_null(TypeFunc::Control); 1060 if (ctrl_proj != NULL) { 1061 _igvn.replace_node(ctrl_proj, init->in(TypeFunc::Control)); 1062 #ifdef ASSERT 1063 Node* tmp = init->in(TypeFunc::Control); 1064 assert(tmp == _fallthroughcatchproj, "allocation control projection"); 1065 #endif 1066 } 1067 Node *mem_proj = init->proj_out_or_null(TypeFunc::Memory); 1068 if (mem_proj != NULL) { 1069 Node *mem = init->in(TypeFunc::Memory); 1070 #ifdef ASSERT 1071 if (mem->is_MergeMem()) { 1072 assert(mem->in(TypeFunc::Memory) == _memproj_fallthrough, "allocation memory projection"); 1073 } else { 1074 assert(mem == _memproj_fallthrough, "allocation memory projection"); 1075 } 1076 #endif 1077 _igvn.replace_node(mem_proj, mem); 1078 } 1079 } else { 1080 assert(false, "only Initialize or AddP expected"); 1081 } 1082 j -= (oc1 - _resproj->outcnt()); 1083 } 1084 } 1085 if (_fallthroughcatchproj != NULL) { 1086 _igvn.replace_node(_fallthroughcatchproj, alloc->in(TypeFunc::Control)); 1087 } 1088 if (_memproj_fallthrough != NULL) { 1089 _igvn.replace_node(_memproj_fallthrough, alloc->in(TypeFunc::Memory)); 1090 } 1091 if (_memproj_catchall != NULL) { 1092 _igvn.replace_node(_memproj_catchall, C->top()); 1093 } 1094 if (_ioproj_fallthrough != NULL) { 1095 _igvn.replace_node(_ioproj_fallthrough, alloc->in(TypeFunc::I_O)); 1096 } 1097 if (_ioproj_catchall != NULL) { 1098 _igvn.replace_node(_ioproj_catchall, C->top()); 1099 } 1100 if (_catchallcatchproj != NULL) { 1101 _igvn.replace_node(_catchallcatchproj, C->top()); 1102 } 1103 } 1104 1105 #define STACK_REG_BUFFER 4 1106 1107 bool PhaseMacroExpand::stack_allocation_location_representable(int slot_location) { 1108 // TODO This is likely not enough as there are values on the stack above the fixed slots 1109 // Revist to see if there is a better check 1110 OptoReg::Name stack_reg = OptoReg::stack2reg(slot_location + STACK_REG_BUFFER); 1111 if (RegMask::can_represent(stack_reg)) { 1112 return true; 1113 } else { 1114 return false; 1115 } 1116 } 1117 1118 #undef STACK_REG_BUFFER 1119 1120 int PhaseMacroExpand::next_stack_allocated_object(int num_slots) { 1121 int current = C->fixed_slots(); 1122 int next = current + num_slots; 1123 if (!stack_allocation_location_representable(next)) { 1124 return -1; 1125 } 1126 // Keep the toplevel high water mark current: 1127 if (C->fixed_slots() < next) C->set_fixed_slots(next); 1128 return current; 1129 } 1130 1131 bool PhaseMacroExpand::process_write_barriers_on_stack_allocated_objects(AllocateNode* alloc) { 1132 GrowableArray<Node*> barriers; 1133 Node *res = alloc->result_cast(); 1134 assert(res != NULL, "result node must not be null"); 1135 1136 // Find direct barriers on the stack allocated objects. 1137 // Those we can simply eliminate. 1138 for (DUIterator_Fast imax, i = res->fast_outs(imax); i < imax; i++) { 1139 Node *use = res->fast_out(i); 1140 if (use->Opcode() == Op_CastP2X) { 1141 barriers.append_if_missing(use); 1142 } else if (use->is_AddP()) { 1143 for (DUIterator_Fast jmax, j = use->fast_outs(jmax); j < jmax; j++) { 1144 Node *addp_out = use->fast_out(j); 1145 if (addp_out->Opcode() == Op_CastP2X) { 1146 barriers.append_if_missing(addp_out); 1147 } 1148 } 1149 } 1150 } 1151 1152 while (barriers.length() != 0) { 1153 eliminate_gc_barrier(barriers.pop()); 1154 } 1155 1156 // After removing the direct barriers result may no longer be used 1157 if (alloc->result_cast() == NULL) { 1158 return true; 1159 } 1160 1161 // Next walk all uses of the allocate to discover the barriers that 1162 // might be reachable from our allocate. If the barrier is reachable 1163 // from stack allocated object, we unregister it, so that the check 1164 // elimination code doesn't run on it. 1165 VectorSet visited(Thread::current()->resource_area()); 1166 GrowableArray<Node*> node_worklist; 1167 1168 BarrierSetC2 *bs = BarrierSet::barrier_set()->barrier_set_c2(); 1169 1170 node_worklist.push(res); 1171 1172 while(node_worklist.length() != 0) { 1173 Node* n = node_worklist.pop(); 1174 1175 if (visited.test_set(n->_idx)) { 1176 continue; // already processed 1177 } 1178 1179 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { 1180 Node *use = n->fast_out(i); 1181 if (use->Opcode() == Op_CastP2X) { 1182 bs->unregister_potential_barrier_node(use); 1183 } else if (use->is_Phi() || 1184 use->is_CheckCastPP() || 1185 use->is_EncodeP() || 1186 use->is_DecodeN() || 1187 use->is_SafePoint() || 1188 use->is_Proj() || 1189 (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) { 1190 // Find barriers beyond our current result 1191 node_worklist.push(use); 1192 } else if (use->is_Store() && use->Opcode() == Op_StoreP) { 1193 if (n != use->in(MemNode::ValueIn)) { 1194 continue; 1195 } 1196 // TODO code copied from escape.cpp::ConnectionGraph::get_addp_base. 1197 // Common up this code into a helper 1198 Node *memory = use->in(MemNode::Address); 1199 if (memory->is_AddP()) { 1200 Node *base = memory->in(AddPNode::Base); 1201 if (base->uncast()->is_top()) { // The AddP case #3 and #6 and #9. 1202 base = memory->in(AddPNode::Address); 1203 while (base->is_AddP()) { 1204 // Case #6 (unsafe access) may have several chained AddP nodes. 1205 assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only"); 1206 base = base->in(AddPNode::Address); 1207 } 1208 if (base->Opcode() == Op_CheckCastPP && 1209 base->bottom_type()->isa_rawptr() && 1210 _igvn.type(base->in(1))->isa_oopptr()) { 1211 base = base->in(1); // Case #9 1212 } 1213 } 1214 node_worklist.push(base); 1215 } 1216 } else if (use->is_AddP() || 1217 (use->is_Load() && use->Opcode() == Op_LoadP)) { 1218 // Find barriers for loads 1219 node_worklist.push(use); 1220 } 1221 } 1222 } 1223 return false; 1224 } 1225 1226 bool PhaseMacroExpand::register_stack_allocated_object_with_safepoints(AllocateNode* alloc, Node* stack_oop) { 1227 VectorSet visited(Thread::current()->resource_area()); 1228 GrowableArray<Node*> node_worklist; 1229 GrowableArray<SafePointNode*> temp; 1230 Dict* safepoint_map = new Dict(cmpkey, hashkey); 1231 bool found_non_direct_safepoint = false; 1232 Node *res = alloc->result_cast(); 1233 1234 assert(res != NULL, "result node must not be null"); 1235 1236 node_worklist.push(res); 1237 1238 while(node_worklist.length() != 0) { 1239 Node* n = node_worklist.pop(); 1240 1241 if (visited.test_set(n->_idx)) { 1242 continue; // already processed 1243 } 1244 1245 for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { 1246 Node *use = n->fast_out(i); 1247 if (use->is_SafePoint()) { 1248 SafePointNode* sfpt = use->as_SafePoint(); 1249 if (sfpt->jvms() != NULL) { 1250 temp.push(sfpt); 1251 } 1252 } else if (use->is_Phi() || 1253 use->is_CheckCastPP() || 1254 use->is_EncodeP() || 1255 use->is_DecodeN() || 1256 use->is_Proj() || 1257 (use->Opcode() == Op_CastP2X) || 1258 use->is_MergeMem() || 1259 use->is_MemBar() || 1260 (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) { 1261 // Find safepoints beyond our current result 1262 node_worklist.push(use); 1263 } else if (use->is_Store() && use->Opcode() == Op_StoreP) { 1264 node_worklist.push(use); 1265 if (n != use->in(MemNode::ValueIn)) { 1266 continue; 1267 } 1268 // TODO code copied from escape.cpp::ConnectionGraph::get_addp_base. 1269 // Common up this code into a helper 1270 Node *memory = use->in(MemNode::Address); 1271 if (memory->is_AddP()) { 1272 Node *base = memory->in(AddPNode::Base); 1273 if (base->uncast()->is_top()) { // The AddP case #3 and #6 and #9. 1274 base = memory->in(AddPNode::Address); 1275 while (base->is_AddP()) { 1276 // Case #6 (unsafe access) may have several chained AddP nodes. 1277 assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only"); 1278 base = base->in(AddPNode::Address); 1279 } 1280 if (base->Opcode() == Op_CheckCastPP && 1281 base->bottom_type()->isa_rawptr() && 1282 _igvn.type(base->in(1))->isa_oopptr()) { 1283 base = base->in(1); // Case #9 1284 } 1285 } 1286 node_worklist.push(base); 1287 } 1288 } else if (use->is_AddP() || 1289 (use->is_Load() && use->Opcode() == Op_LoadP)) { 1290 // Find safepoints for arrays 1291 node_worklist.push(use); 1292 } 1293 } 1294 1295 while (temp.length() != 0) { 1296 SafePointNode* sfpt = temp.pop(); 1297 if (res != n) { 1298 found_non_direct_safepoint = true; 1299 } 1300 handle_safepoint_for_stack_allocation(safepoint_map, alloc, stack_oop, n, sfpt); 1301 } 1302 } 1303 1304 return found_non_direct_safepoint; 1305 } 1306 1307 void PhaseMacroExpand::handle_safepoint_for_stack_allocation(Dict* safepoint_map, AllocateNode* alloc, Node* oop_node, Node* parent, SafePointNode* sfpt) { 1308 Node* res = alloc->result_cast(); 1309 assert(res->is_CheckCastPP(), "unexpected AllocateNode result"); 1310 const TypeOopPtr* res_type = _igvn.type(res)->isa_oopptr(); 1311 ciKlass* klass = res_type->klass(); 1312 int nfields = 0; 1313 if (res_type->isa_instptr()) { 1314 // find the fields of the class which will be needed for safepoint debug information 1315 assert(klass->is_instance_klass(), "must be an instance klass."); 1316 ciInstanceKlass* iklass = klass->as_instance_klass(); 1317 nfields = iklass->nof_nonstatic_fields(); 1318 } else { 1319 // find the array's elements which will be needed for safepoint debug information 1320 nfields = alloc->in(AllocateNode::ALength)->find_int_con(-1); 1321 } 1322 1323 assert(nfields >= 0, "Sanity"); 1324 1325 SafePointScalarObjectNode* sobj = NULL; 1326 Node *result = (Node *)(*safepoint_map)[sfpt]; 1327 if (result != NULL) { 1328 assert(result->is_SafePointScalarObject(), "Has to be a safepointscalarobject"); 1329 sobj = result->as_SafePointScalarObject(); 1330 } else { 1331 // 1332 // Process the safepoint uses 1333 // 1334 Node* mem = sfpt->memory(); 1335 Node* ctl = sfpt->control(); 1336 assert(sfpt->jvms() != NULL, "missed JVMS"); 1337 // Fields of scalar objs are referenced only at the end 1338 // of regular debuginfo at the last (youngest) JVMS. 1339 // Record relative start index. 1340 uint first_ind = (sfpt->req() - sfpt->jvms()->scloff()); 1341 sobj = new SafePointScalarObjectNode(res_type, 1342 #ifdef ASSERT 1343 alloc, 1344 #endif 1345 first_ind, nfields); 1346 sobj->init_req(0, C->root()); 1347 sobj->add_req(oop_node); 1348 transform_later(sobj); 1349 sobj->set_stack_allocated(true); 1350 1351 JVMState *jvms = sfpt->jvms(); 1352 sfpt->add_req(sobj); 1353 jvms->set_endoff(sfpt->req()); 1354 _igvn._worklist.push(sfpt); 1355 safepoint_map->Insert(sfpt, sobj); 1356 } 1357 1358 if (parent == res) { 1359 adjust_safepoint_jvms(sfpt, parent, sobj); 1360 } 1361 } 1362 1363 bool PhaseMacroExpand::can_stack_allocate(AllocateNode* alloc, Node* res, intptr_t size_of_object) { 1364 return ((res != NULL) && alloc->_is_stack_allocateable && (size_of_object != -1) && should_stack_allocate()); 1365 } 1366 1367 void PhaseMacroExpand::estimate_stack_allocation_size(AllocateNode* alloc) { 1368 Node* res = alloc->result_cast(); 1369 Node* size_in_bytes = alloc->in(AllocateNode::AllocSize); 1370 intptr_t size_of_object = _igvn.find_intptr_t_con(size_in_bytes, -1); 1371 1372 if (alloc->_is_scalar_replaceable && !alloc->_is_stack_allocateable) { 1373 C->set_fail_stack_allocation_with_references(true); 1374 return; 1375 } 1376 1377 bool can_sa = can_stack_allocate(alloc, res, size_of_object); 1378 if (alloc->_is_stack_allocateable && !can_sa) { 1379 // If we marked the object as SA in EA and now we can not fail 1380 C->set_fail_stack_allocation_with_references(true); 1381 return; 1382 } 1383 1384 if (!alloc->_is_stack_allocateable) { 1385 // If we can not SA because EA said no then no need to count the size 1386 return; 1387 } 1388 1389 int current = C->stack_allocated_slots(); 1390 C->set_stack_allocated_slots(current + (size_of_object >> LogBytesPerInt)); 1391 } 1392 1393 // Do stack allocation 1394 bool PhaseMacroExpand::stack_allocation(AllocateNode* alloc) { 1395 Node* klass = alloc->in(AllocateNode::KlassNode); 1396 const TypeKlassPtr* tklass = _igvn.type(klass)->is_klassptr(); 1397 Node *length = (alloc->is_AllocateArray()) ? alloc->in(AllocateNode::ALength) : NULL; 1398 Node* size_in_bytes = alloc->in(AllocateNode::AllocSize); 1399 Node* res = alloc->result_cast(); 1400 Node* ctrl = alloc->in(TypeFunc::Control); 1401 Node* mem = alloc->in(TypeFunc::Memory); 1402 1403 intptr_t size_of_object = _igvn.find_intptr_t_con(size_in_bytes, -1); 1404 1405 if (!can_stack_allocate(alloc, res, size_of_object)) { 1406 return false; 1407 } 1408 1409 if (C->fail_stack_allocation_with_references()) { 1410 if (alloc->_is_referenced_stack_allocation) { 1411 #ifndef PRODUCT 1412 if (print_stack_allocation()) { 1413 tty->print_cr("---- Avoiding stack allocation on node %d because it is referenced by another alloc and SCR/SA failed in method %s", alloc->_idx, _igvn.C->method()->get_Method()->name_and_sig_as_C_string()); 1414 } 1415 #endif 1416 return false; 1417 } 1418 } 1419 1420 int next_stack_allocation_slot = next_stack_allocated_object(size_of_object >> LogBytesPerInt); 1421 if (next_stack_allocation_slot < 0) { 1422 #ifndef PRODUCT 1423 if (print_stack_allocation()) { 1424 tty->print_cr("---- Avoiding stack allocation on node %d with size %ld for method %s because of insufficient stack space", alloc->_idx, size_of_object, _igvn.C->method()->get_Method()->name_and_sig_as_C_string()); 1425 } 1426 #endif 1427 return false; 1428 } 1429 1430 if (mem->is_MergeMem()) { 1431 mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); 1432 } 1433 1434 extract_call_projections(alloc); 1435 1436 // Process barriers as this may result in result_cast() becoming NULL 1437 if (process_write_barriers_on_stack_allocated_objects(alloc)) { 1438 #ifndef PRODUCT 1439 if (print_stack_allocation()) { 1440 tty->print_cr("---- Allocation %d result_cast is no longer used so yank the alloc instead", alloc->_idx); 1441 } 1442 #endif 1443 InitializeNode* init = alloc->initialization(); 1444 if (init != NULL) { 1445 init->remove(&_igvn); 1446 } 1447 yank_alloc_node(alloc); 1448 return true; 1449 } 1450 1451 assert(res == alloc->result_cast(), "values much match"); 1452 1453 Node* stack_oop = transform_later(new BoxLockNode(next_stack_allocation_slot)); 1454 Node* new_raw_mem = initialize_object(alloc, ctrl, mem, stack_oop, klass, length, size_in_bytes); 1455 1456 bool non_direct_safepoints = register_stack_allocated_object_with_safepoints(alloc, stack_oop); 1457 if (non_direct_safepoints) { 1458 if (length != NULL) { 1459 stack_allocation_init_array_length_on_entry(alloc, length, stack_oop); 1460 } 1461 #ifndef PRODUCT 1462 stack_allocation_clear_object_data(alloc, stack_oop); 1463 #endif 1464 } 1465 1466 _igvn.replace_node(_resproj, stack_oop); 1467 1468 for (DUIterator_Fast imax, i = _memproj_fallthrough->fast_outs(imax); i < imax; i++) { 1469 Node *use = _memproj_fallthrough->fast_out(i); 1470 _igvn.rehash_node_delayed(use); 1471 imax -= replace_input(use, _memproj_fallthrough, new_raw_mem); 1472 // back up iterator 1473 --i; 1474 } 1475 1476 eliminate_unused_allocation_edges(alloc); 1477 1478 assert(_resproj->outcnt() == 0, "all uses of the original allocate result projection must be deleted"); 1479 _igvn.remove_dead_node(_resproj); 1480 1481 #ifndef PRODUCT 1482 if (print_stack_allocation()) { 1483 tty->print_cr("++++ Performing stack allocation on node %d with size %ld for method %s", alloc->_idx, size_of_object, _igvn.C->method()->get_Method()->name_and_sig_as_C_string()); 1484 } 1485 #endif 1486 1487 return true; 1488 } 1489 1490 /* 1491 Initialize stack allocated array length on entry to the method. 1492 This is required for de-opt so it can verify array lengths and so 1493 that GCs that happen after deopt will not crash for uninitialized 1494 arrays. 1495 */ 1496 void PhaseMacroExpand::stack_allocation_init_array_length_on_entry(AllocateNode *alloc, Node *length, Node *stack_oop) { 1497 Node* start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); 1498 assert(length != NULL, "Length can not be NULL"); 1499 1500 if (C->is_osr_compilation()) { 1501 for (DUIterator_Fast imax, i = start_mem->fast_outs(imax); i < imax; i++) { 1502 Node *child = start_mem->fast_out(i); 1503 if (child->is_CallLeaf() && child->as_CallLeaf()->is_call_to_osr_migration_end()) { 1504 CallLeafNode* call_leaf = child->as_CallLeaf(); 1505 start_mem = call_leaf->proj_out_or_null(TypeFunc::Memory); 1506 break; 1507 } 1508 } 1509 } 1510 assert(start_mem != NULL, "Must find start mem"); 1511 Node* init_mem = start_mem; 1512 1513 // need to set the length field for arrays for deopt 1514 init_mem = make_store(C->start()->proj_out_or_null(TypeFunc::Control), 1515 init_mem, stack_oop, arrayOopDesc::length_offset_in_bytes(), 1516 length, T_INT); 1517 1518 1519 if (init_mem != start_mem) { 1520 for (DUIterator_Fast imax, i = start_mem->fast_outs(imax); i < imax; i++) { 1521 Node *use = start_mem->fast_out(i); 1522 // Compressed refs can make a new store which adjusts the start 1523 // offet and it's sourced by start_mem. Make sure we don't make cycle. 1524 if (use == init_mem || (init_mem->find_edge(use) >= 0)) { 1525 continue; 1526 } 1527 _igvn.rehash_node_delayed(use); 1528 imax -= replace_input(use, start_mem, init_mem); 1529 // back up iterator 1530 --i; 1531 } 1532 } 1533 } 1534 1535 #ifndef PRODUCT 1536 /* 1537 Initialize SA object on entry to the method to ensure it is initialized 1538 before safepoints which may only be reachable through phis and the object 1539 may not actually have been initialized. 1540 */ 1541 void PhaseMacroExpand::stack_allocation_clear_object_data(AllocateNode *alloc, Node *stack_oop) { 1542 Node* klass = alloc->in(AllocateNode::KlassNode); 1543 Node *length = (alloc->is_AllocateArray()) ? alloc->in(AllocateNode::ALength) : NULL; 1544 Node* size_in_bytes = alloc->in(AllocateNode::AllocSize); 1545 Node* start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); 1546 if (C->is_osr_compilation()) { 1547 for (DUIterator_Fast imax, i = start_mem->fast_outs(imax); i < imax; i++) { 1548 Node *child = start_mem->fast_out(i); 1549 if (child->is_CallLeaf() && child->as_CallLeaf()->is_call_to_osr_migration_end()) { 1550 CallLeafNode* call_leaf = child->as_CallLeaf(); 1551 start_mem = call_leaf->proj_out_or_null(TypeFunc::Memory); 1552 break; 1553 } 1554 } 1555 } 1556 assert(start_mem != NULL, "Must find start mem"); 1557 int header_size = alloc->minimum_header_size(); 1558 Node* init_mem = start_mem; 1559 if (length != NULL) { 1560 // conservatively small header size: 1561 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE); 1562 ciKlass* k = _igvn.type(klass)->is_klassptr()->klass(); 1563 if (k->is_array_klass()) { // we know the exact header size in most cases: 1564 header_size = Klass::layout_helper_header_size(k->layout_helper()); 1565 } 1566 } 1567 init_mem = ClearArrayNode::clear_memory(C->start()->proj_out_or_null(TypeFunc::Control), 1568 init_mem, stack_oop, header_size, size_in_bytes, 1569 &_igvn); 1570 if (init_mem != start_mem) { 1571 for (DUIterator_Fast imax, i = start_mem->fast_outs(imax); i < imax; i++) { 1572 Node *use = start_mem->fast_out(i); 1573 // Compressed refs can make a new store which adjusts the start 1574 // offet and it's sourced by start_mem. Make sure we don't make cycle. 1575 if (use == init_mem || (init_mem->find_edge(use) >= 0)) { 1576 continue; 1577 } 1578 _igvn.rehash_node_delayed(use); 1579 imax -= replace_input(use, start_mem, init_mem); 1580 // back up iterator 1581 --i; 1582 } 1583 } 1584 } 1585 #endif 1586 1587 bool PhaseMacroExpand::eliminate_allocate_node(AllocateNode *alloc) { 1588 // Don't do scalar replacement if the frame can be popped by JVMTI: 1589 // if reallocation fails during deoptimization we'll pop all 1590 // interpreter frames for this compiled frame and that won't play 1591 // nice with JVMTI popframe. 1592 if (!EliminateAllocations || JvmtiExport::can_pop_frame() || !alloc->_is_non_escaping) { 1593 return false; 1594 } 1595 Node* klass = alloc->in(AllocateNode::KlassNode); 1596 const TypeKlassPtr* tklass = _igvn.type(klass)->is_klassptr(); 1597 Node* res = alloc->result_cast(); 1598 // Eliminate boxing allocations which are not used 1599 // regardless scalar replacable status. 1600 bool boxing_alloc = C->eliminate_boxing() && 1601 tklass->klass()->is_instance_klass() && 1602 tklass->klass()->as_instance_klass()->is_box_klass(); 1603 if (!alloc->_is_scalar_replaceable && (!boxing_alloc || (res != NULL))) { 1604 return false; 1605 } 1606 1607 extract_call_projections(alloc); 1608 1609 GrowableArray <SafePointNode *> safepoints; 1610 if (!can_eliminate_allocation(alloc, safepoints)) { 1611 return false; 1612 } 1613 1614 if (!alloc->_is_scalar_replaceable) { 1615 assert(res == NULL, "sanity"); 1616 // We can only eliminate allocation if all debug info references 1617 // are already replaced with SafePointScalarObject because 1618 // we can't search for a fields value without instance_id. 1619 if (safepoints.length() > 0) { 1620 return false; 1621 } 1622 } 1623 1624 if (!scalar_replacement(alloc, safepoints)) { 1625 return false; 1626 } 1627 1628 CompileLog* log = C->log(); 1629 if (log != NULL) { 1630 log->head("eliminate_allocation type='%d'", 1631 log->identify(tklass->klass())); 1632 JVMState* p = alloc->jvms(); 1633 while (p != NULL) { 1634 log->elem("jvms bci='%d' method='%d'", p->bci(), log->identify(p->method())); 1635 p = p->caller(); 1636 } 1637 log->tail("eliminate_allocation"); 1638 } 1639 1640 process_users_of_allocation(alloc); 1641 1642 #ifndef PRODUCT 1643 if (print_eliminate_allocations()) { 1644 if (alloc->is_AllocateArray()) 1645 tty->print_cr("++++ Eliminated: %d AllocateArray", alloc->_idx); 1646 else 1647 tty->print_cr("++++ Eliminated: %d Allocate", alloc->_idx); 1648 } 1649 #endif 1650 1651 return true; 1652 } 1653 1654 bool PhaseMacroExpand::eliminate_boxing_node(CallStaticJavaNode *boxing) { 1655 // EA should remove all uses of non-escaping boxing node. 1656 if (!C->eliminate_boxing() || boxing->proj_out_or_null(TypeFunc::Parms) != NULL) { 1657 return false; 1658 } 1659 1660 assert(boxing->result_cast() == NULL, "unexpected boxing node result"); 1661 1662 extract_call_projections(boxing); 1663 1664 const TypeTuple* r = boxing->tf()->range(); 1665 assert(r->cnt() > TypeFunc::Parms, "sanity"); 1666 const TypeInstPtr* t = r->field_at(TypeFunc::Parms)->isa_instptr(); 1667 assert(t != NULL, "sanity"); 1668 1669 CompileLog* log = C->log(); 1670 if (log != NULL) { 1671 log->head("eliminate_boxing type='%d'", 1672 log->identify(t->klass())); 1673 JVMState* p = boxing->jvms(); 1674 while (p != NULL) { 1675 log->elem("jvms bci='%d' method='%d'", p->bci(), log->identify(p->method())); 1676 p = p->caller(); 1677 } 1678 log->tail("eliminate_boxing"); 1679 } 1680 1681 process_users_of_allocation(boxing); 1682 1683 #ifndef PRODUCT 1684 if (print_eliminate_allocations()) { 1685 tty->print("++++ Eliminated: %d ", boxing->_idx); 1686 boxing->method()->print_short_name(tty); 1687 tty->cr(); 1688 } 1689 #endif 1690 1691 return true; 1692 } 1693 1694 //---------------------------set_eden_pointers------------------------- 1695 void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_adr) { 1696 if (UseTLAB) { // Private allocation: load from TLS 1697 Node* thread = transform_later(new ThreadLocalNode()); 1698 int tlab_top_offset = in_bytes(JavaThread::tlab_top_offset()); 1699 int tlab_end_offset = in_bytes(JavaThread::tlab_end_offset()); 1700 eden_top_adr = basic_plus_adr(top()/*not oop*/, thread, tlab_top_offset); 1701 eden_end_adr = basic_plus_adr(top()/*not oop*/, thread, tlab_end_offset); 1702 } else { // Shared allocation: load from globals 1703 CollectedHeap* ch = Universe::heap(); 1704 address top_adr = (address)ch->top_addr(); 1705 address end_adr = (address)ch->end_addr(); 1706 eden_top_adr = makecon(TypeRawPtr::make(top_adr)); 1707 eden_end_adr = basic_plus_adr(eden_top_adr, end_adr - top_adr); 1708 } 1709 } 1710 1711 1712 Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { 1713 Node* adr = basic_plus_adr(base, offset); 1714 const TypePtr* adr_type = adr->bottom_type()->is_ptr(); 1715 Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt, MemNode::unordered); 1716 transform_later(value); 1717 return value; 1718 } 1719 1720 1721 Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { 1722 Node* adr = basic_plus_adr(base, offset); 1723 mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt, MemNode::unordered); 1724 transform_later(mem); 1725 return mem; 1726 } 1727 1728 //============================================================================= 1729 // 1730 // A L L O C A T I O N 1731 // 1732 // Allocation attempts to be fast in the case of frequent small objects. 1733 // It breaks down like this: 1734 // 1735 // 1) Size in doublewords is computed. This is a constant for objects and 1736 // variable for most arrays. Doubleword units are used to avoid size 1737 // overflow of huge doubleword arrays. We need doublewords in the end for 1738 // rounding. 1739 // 1740 // 2) Size is checked for being 'too large'. Too-large allocations will go 1741 // the slow path into the VM. The slow path can throw any required 1742 // exceptions, and does all the special checks for very large arrays. The 1743 // size test can constant-fold away for objects. For objects with 1744 // finalizers it constant-folds the otherway: you always go slow with 1745 // finalizers. 1746 // 1747 // 3) If NOT using TLABs, this is the contended loop-back point. 1748 // Load-Locked the heap top. If using TLABs normal-load the heap top. 1749 // 1750 // 4) Check that heap top + size*8 < max. If we fail go the slow ` route. 1751 // NOTE: "top+size*8" cannot wrap the 4Gig line! Here's why: for largish 1752 // "size*8" we always enter the VM, where "largish" is a constant picked small 1753 // enough that there's always space between the eden max and 4Gig (old space is 1754 // there so it's quite large) and large enough that the cost of entering the VM 1755 // is dwarfed by the cost to initialize the space. 1756 // 1757 // 5) If NOT using TLABs, Store-Conditional the adjusted heap top back 1758 // down. If contended, repeat at step 3. If using TLABs normal-store 1759 // adjusted heap top back down; there is no contention. 1760 // 1761 // 6) If !ZeroTLAB then Bulk-clear the object/array. Fill in klass & mark 1762 // fields. 1763 // 1764 // 7) Merge with the slow-path; cast the raw memory pointer to the correct 1765 // oop flavor. 1766 // 1767 //============================================================================= 1768 // FastAllocateSizeLimit value is in DOUBLEWORDS. 1769 // Allocations bigger than this always go the slow route. 1770 // This value must be small enough that allocation attempts that need to 1771 // trigger exceptions go the slow route. Also, it must be small enough so 1772 // that heap_top + size_in_bytes does not wrap around the 4Gig limit. 1773 //=============================================================================j// 1774 // %%% Here is an old comment from parseHelper.cpp; is it outdated? 1775 // The allocator will coalesce int->oop copies away. See comment in 1776 // coalesce.cpp about how this works. It depends critically on the exact 1777 // code shape produced here, so if you are changing this code shape 1778 // make sure the GC info for the heap-top is correct in and around the 1779 // slow-path call. 1780 // 1781 1782 void PhaseMacroExpand::expand_allocate_common( 1783 AllocateNode* alloc, // allocation node to be expanded 1784 Node* length, // array length for an array allocation 1785 const TypeFunc* slow_call_type, // Type of slow call 1786 address slow_call_address // Address of slow call 1787 ) 1788 { 1789 Node* ctrl = alloc->in(TypeFunc::Control); 1790 Node* mem = alloc->in(TypeFunc::Memory); 1791 Node* i_o = alloc->in(TypeFunc::I_O); 1792 Node* size_in_bytes = alloc->in(AllocateNode::AllocSize); 1793 Node* klass_node = alloc->in(AllocateNode::KlassNode); 1794 Node* initial_slow_test = alloc->in(AllocateNode::InitialTest); 1795 assert(ctrl != NULL, "must have control"); 1796 1797 // We need a Region and corresponding Phi's to merge the slow-path and fast-path results. 1798 // they will not be used if "always_slow" is set 1799 enum { slow_result_path = 1, fast_result_path = 2 }; 1800 Node *result_region = NULL; 1801 Node *result_phi_rawmem = NULL; 1802 Node *result_phi_rawoop = NULL; 1803 Node *result_phi_i_o = NULL; 1804 1805 // The initial slow comparison is a size check, the comparison 1806 // we want to do is a BoolTest::gt 1807 bool expand_fast_path = true; 1808 int tv = _igvn.find_int_con(initial_slow_test, -1); 1809 if (tv >= 0) { 1810 // InitialTest has constant result 1811 // 0 - can fit in TLAB 1812 // 1 - always too big or negative 1813 assert(tv <= 1, "0 or 1 if a constant"); 1814 expand_fast_path = (tv == 0); 1815 initial_slow_test = NULL; 1816 } else { 1817 initial_slow_test = BoolNode::make_predicate(initial_slow_test, &_igvn); 1818 } 1819 1820 if (C->env()->dtrace_alloc_probes() || 1821 (!UseTLAB && !Universe::heap()->supports_inline_contig_alloc())) { 1822 // Force slow-path allocation 1823 expand_fast_path = false; 1824 initial_slow_test = NULL; 1825 } 1826 1827 bool allocation_has_use = (alloc->result_cast() != NULL); 1828 if (!allocation_has_use) { 1829 InitializeNode* init = alloc->initialization(); 1830 if (init != NULL) { 1831 init->remove(&_igvn); 1832 } 1833 if (expand_fast_path && (initial_slow_test == NULL)) { 1834 // Remove allocation node and return. 1835 // Size is a non-negative constant -> no initial check needed -> directly to fast path. 1836 // Also, no usages -> empty fast path -> no fall out to slow path -> nothing left. 1837 #ifndef PRODUCT 1838 if (PrintEliminateAllocations) { 1839 tty->print("NotUsed "); 1840 Node* res = alloc->proj_out_or_null(TypeFunc::Parms); 1841 if (res != NULL) { 1842 res->dump(); 1843 } else { 1844 alloc->dump(); 1845 } 1846 } 1847 #endif 1848 yank_alloc_node(alloc); 1849 return; 1850 } 1851 } 1852 1853 enum { too_big_or_final_path = 1, need_gc_path = 2 }; 1854 Node *slow_region = NULL; 1855 Node *toobig_false = ctrl; 1856 1857 // generate the initial test if necessary 1858 if (initial_slow_test != NULL ) { 1859 assert (expand_fast_path, "Only need test if there is a fast path"); 1860 slow_region = new RegionNode(3); 1861 1862 // Now make the initial failure test. Usually a too-big test but 1863 // might be a TRUE for finalizers or a fancy class check for 1864 // newInstance0. 1865 IfNode *toobig_iff = new IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN); 1866 transform_later(toobig_iff); 1867 // Plug the failing-too-big test into the slow-path region 1868 Node *toobig_true = new IfTrueNode( toobig_iff ); 1869 transform_later(toobig_true); 1870 slow_region ->init_req( too_big_or_final_path, toobig_true ); 1871 toobig_false = new IfFalseNode( toobig_iff ); 1872 transform_later(toobig_false); 1873 } else { 1874 // No initial test, just fall into next case 1875 assert(allocation_has_use || !expand_fast_path, "Should already have been handled"); 1876 toobig_false = ctrl; 1877 debug_only(slow_region = NodeSentinel); 1878 } 1879 1880 // If we are here there are several possibilities 1881 // - expand_fast_path is false - then only a slow path is expanded. That's it. 1882 // no_initial_check means a constant allocation. 1883 // - If check always evaluates to false -> expand_fast_path is false (see above) 1884 // - If check always evaluates to true -> directly into fast path (but may bailout to slowpath) 1885 // if !allocation_has_use the fast path is empty 1886 // if !allocation_has_use && no_initial_check 1887 // - Then there are no fastpath that can fall out to slowpath -> no allocation code at all. 1888 // removed by yank_alloc_node above. 1889 1890 Node *slow_mem = mem; // save the current memory state for slow path 1891 // generate the fast allocation code unless we know that the initial test will always go slow 1892 if (expand_fast_path) { 1893 // Fast path modifies only raw memory. 1894 if (mem->is_MergeMem()) { 1895 mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); 1896 } 1897 1898 // allocate the Region and Phi nodes for the result 1899 result_region = new RegionNode(3); 1900 result_phi_rawmem = new PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM); 1901 result_phi_i_o = new PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch 1902 1903 // Grab regular I/O before optional prefetch may change it. 1904 // Slow-path does no I/O so just set it to the original I/O. 1905 result_phi_i_o->init_req(slow_result_path, i_o); 1906 1907 // Name successful fast-path variables 1908 Node* fast_oop_ctrl; 1909 Node* fast_oop_rawmem; 1910 if (allocation_has_use) { 1911 Node* needgc_ctrl = NULL; 1912 result_phi_rawoop = new PhiNode(result_region, TypeRawPtr::BOTTOM); 1913 1914 intx prefetch_lines = length != NULL ? AllocatePrefetchLines : AllocateInstancePrefetchLines; 1915 BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); 1916 Node* fast_oop = bs->obj_allocate(this, ctrl, mem, toobig_false, size_in_bytes, i_o, needgc_ctrl, 1917 fast_oop_ctrl, fast_oop_rawmem, 1918 prefetch_lines); 1919 1920 if (initial_slow_test != NULL) { 1921 // This completes all paths into the slow merge point 1922 slow_region->init_req(need_gc_path, needgc_ctrl); 1923 transform_later(slow_region); 1924 } else { 1925 // No initial slow path needed! 1926 // Just fall from the need-GC path straight into the VM call. 1927 slow_region = needgc_ctrl; 1928 } 1929 1930 InitializeNode* init = alloc->initialization(); 1931 fast_oop_rawmem = initialize_object(alloc, 1932 fast_oop_ctrl, fast_oop_rawmem, fast_oop, 1933 klass_node, length, size_in_bytes); 1934 expand_initialize_membar(alloc, init, fast_oop_ctrl, fast_oop_rawmem); 1935 expand_dtrace_alloc_probe(alloc, fast_oop, fast_oop_ctrl, fast_oop_rawmem); 1936 1937 result_phi_rawoop->init_req(fast_result_path, fast_oop); 1938 } else { 1939 assert (initial_slow_test != NULL, "sanity"); 1940 fast_oop_ctrl = toobig_false; 1941 fast_oop_rawmem = mem; 1942 transform_later(slow_region); 1943 } 1944 1945 // Plug in the successful fast-path into the result merge point 1946 result_region ->init_req(fast_result_path, fast_oop_ctrl); 1947 result_phi_i_o ->init_req(fast_result_path, i_o); 1948 result_phi_rawmem->init_req(fast_result_path, fast_oop_rawmem); 1949 } else { 1950 slow_region = ctrl; 1951 result_phi_i_o = i_o; // Rename it to use in the following code. 1952 } 1953 1954 // Generate slow-path call 1955 CallNode *call = new CallStaticJavaNode(slow_call_type, slow_call_address, 1956 OptoRuntime::stub_name(slow_call_address), 1957 alloc->jvms()->bci(), 1958 TypePtr::BOTTOM); 1959 call->init_req(TypeFunc::Control, slow_region); 1960 call->init_req(TypeFunc::I_O, top()); // does no i/o 1961 call->init_req(TypeFunc::Memory, slow_mem); // may gc ptrs 1962 call->init_req(TypeFunc::ReturnAdr, alloc->in(TypeFunc::ReturnAdr)); 1963 call->init_req(TypeFunc::FramePtr, alloc->in(TypeFunc::FramePtr)); 1964 1965 call->init_req(TypeFunc::Parms+0, klass_node); 1966 if (length != NULL) { 1967 call->init_req(TypeFunc::Parms+1, length); 1968 } 1969 1970 // Copy debug information and adjust JVMState information, then replace 1971 // allocate node with the call 1972 copy_call_debug_info((CallNode *) alloc, call); 1973 if (expand_fast_path) { 1974 call->set_cnt(PROB_UNLIKELY_MAG(4)); // Same effect as RC_UNCOMMON. 1975 } else { 1976 // Hook i_o projection to avoid its elimination during allocation 1977 // replacement (when only a slow call is generated). 1978 call->set_req(TypeFunc::I_O, result_phi_i_o); 1979 } 1980 _igvn.replace_node(alloc, call); 1981 transform_later(call); 1982 1983 // Identify the output projections from the allocate node and 1984 // adjust any references to them. 1985 // The control and io projections look like: 1986 // 1987 // v---Proj(ctrl) <-----+ v---CatchProj(ctrl) 1988 // Allocate Catch 1989 // ^---Proj(io) <-------+ ^---CatchProj(io) 1990 // 1991 // We are interested in the CatchProj nodes. 1992 // 1993 extract_call_projections(call); 1994 1995 // An allocate node has separate memory projections for the uses on 1996 // the control and i_o paths. Replace the control memory projection with 1997 // result_phi_rawmem (unless we are only generating a slow call when 1998 // both memory projections are combined) 1999 if (expand_fast_path && _memproj_fallthrough != NULL) { 2000 migrate_outs(_memproj_fallthrough, result_phi_rawmem); 2001 } 2002 // Now change uses of _memproj_catchall to use _memproj_fallthrough and delete 2003 // _memproj_catchall so we end up with a call that has only 1 memory projection. 2004 if (_memproj_catchall != NULL ) { 2005 if (_memproj_fallthrough == NULL) { 2006 _memproj_fallthrough = new ProjNode(call, TypeFunc::Memory); 2007 transform_later(_memproj_fallthrough); 2008 } 2009 migrate_outs(_memproj_catchall, _memproj_fallthrough); 2010 _igvn.remove_dead_node(_memproj_catchall); 2011 } 2012 2013 // An allocate node has separate i_o projections for the uses on the control 2014 // and i_o paths. Always replace the control i_o projection with result i_o 2015 // otherwise incoming i_o become dead when only a slow call is generated 2016 // (it is different from memory projections where both projections are 2017 // combined in such case). 2018 if (_ioproj_fallthrough != NULL) { 2019 migrate_outs(_ioproj_fallthrough, result_phi_i_o); 2020 } 2021 // Now change uses of _ioproj_catchall to use _ioproj_fallthrough and delete 2022 // _ioproj_catchall so we end up with a call that has only 1 i_o projection. 2023 if (_ioproj_catchall != NULL ) { 2024 if (_ioproj_fallthrough == NULL) { 2025 _ioproj_fallthrough = new ProjNode(call, TypeFunc::I_O); 2026 transform_later(_ioproj_fallthrough); 2027 } 2028 migrate_outs(_ioproj_catchall, _ioproj_fallthrough); 2029 _igvn.remove_dead_node(_ioproj_catchall); 2030 } 2031 2032 // if we generated only a slow call, we are done 2033 if (!expand_fast_path) { 2034 // Now we can unhook i_o. 2035 if (result_phi_i_o->outcnt() > 1) { 2036 call->set_req(TypeFunc::I_O, top()); 2037 } else { 2038 assert(result_phi_i_o->unique_ctrl_out() == call, "sanity"); 2039 // Case of new array with negative size known during compilation. 2040 // AllocateArrayNode::Ideal() optimization disconnect unreachable 2041 // following code since call to runtime will throw exception. 2042 // As result there will be no users of i_o after the call. 2043 // Leave i_o attached to this call to avoid problems in preceding graph. 2044 } 2045 return; 2046 } 2047 2048 if (_fallthroughcatchproj != NULL) { 2049 ctrl = _fallthroughcatchproj->clone(); 2050 transform_later(ctrl); 2051 _igvn.replace_node(_fallthroughcatchproj, result_region); 2052 } else { 2053 ctrl = top(); 2054 } 2055 Node *slow_result; 2056 if (_resproj == NULL) { 2057 // no uses of the allocation result 2058 slow_result = top(); 2059 } else { 2060 slow_result = _resproj->clone(); 2061 transform_later(slow_result); 2062 _igvn.replace_node(_resproj, result_phi_rawoop); 2063 } 2064 2065 // Plug slow-path into result merge point 2066 result_region->init_req( slow_result_path, ctrl); 2067 transform_later(result_region); 2068 if (allocation_has_use) { 2069 result_phi_rawoop->init_req(slow_result_path, slow_result); 2070 transform_later(result_phi_rawoop); 2071 } 2072 result_phi_rawmem->init_req(slow_result_path, _memproj_fallthrough); 2073 transform_later(result_phi_rawmem); 2074 transform_later(result_phi_i_o); 2075 // This completes all paths into the result merge point 2076 } 2077 2078 // Remove alloc node that has no uses. 2079 void PhaseMacroExpand::yank_alloc_node(AllocateNode* alloc) { 2080 Node* ctrl = alloc->in(TypeFunc::Control); 2081 Node* mem = alloc->in(TypeFunc::Memory); 2082 Node* i_o = alloc->in(TypeFunc::I_O); 2083 2084 extract_call_projections(alloc); 2085 if (_resproj != NULL) { 2086 for (DUIterator_Fast imax, i = _resproj->fast_outs(imax); i < imax; i++) { 2087 Node* use = _resproj->fast_out(i); 2088 use->isa_MemBar()->remove(&_igvn); 2089 --imax; 2090 --i; // back up iterator 2091 } 2092 assert(_resproj->outcnt() == 0, "all uses must be deleted"); 2093 _igvn.remove_dead_node(_resproj); 2094 } 2095 if (_fallthroughcatchproj != NULL) { 2096 migrate_outs(_fallthroughcatchproj, ctrl); 2097 _igvn.remove_dead_node(_fallthroughcatchproj); 2098 } 2099 if (_catchallcatchproj != NULL) { 2100 _igvn.rehash_node_delayed(_catchallcatchproj); 2101 _catchallcatchproj->set_req(0, top()); 2102 } 2103 if (_fallthroughproj != NULL) { 2104 Node* catchnode = _fallthroughproj->unique_ctrl_out(); 2105 _igvn.remove_dead_node(catchnode); 2106 _igvn.remove_dead_node(_fallthroughproj); 2107 } 2108 if (_memproj_fallthrough != NULL) { 2109 migrate_outs(_memproj_fallthrough, mem); 2110 _igvn.remove_dead_node(_memproj_fallthrough); 2111 } 2112 if (_ioproj_fallthrough != NULL) { 2113 migrate_outs(_ioproj_fallthrough, i_o); 2114 _igvn.remove_dead_node(_ioproj_fallthrough); 2115 } 2116 if (_memproj_catchall != NULL) { 2117 _igvn.rehash_node_delayed(_memproj_catchall); 2118 _memproj_catchall->set_req(0, top()); 2119 } 2120 if (_ioproj_catchall != NULL) { 2121 _igvn.rehash_node_delayed(_ioproj_catchall); 2122 _ioproj_catchall->set_req(0, top()); 2123 } 2124 #ifndef PRODUCT 2125 if (PrintEliminateAllocations) { 2126 if (alloc->is_AllocateArray()) { 2127 tty->print_cr("++++ Eliminated: %d AllocateArray", alloc->_idx); 2128 } else { 2129 tty->print_cr("++++ Eliminated: %d Allocate", alloc->_idx); 2130 } 2131 } 2132 #endif 2133 _igvn.remove_dead_node(alloc); 2134 } 2135 2136 void PhaseMacroExpand::expand_initialize_membar(AllocateNode* alloc, InitializeNode* init, 2137 Node*& fast_oop_ctrl, Node*& fast_oop_rawmem) { 2138 // If initialization is performed by an array copy, any required 2139 // MemBarStoreStore was already added. If the object does not 2140 // escape no need for a MemBarStoreStore. If the object does not 2141 // escape in its initializer and memory barrier (MemBarStoreStore or 2142 // stronger) is already added at exit of initializer, also no need 2143 // for a MemBarStoreStore. Otherwise we need a MemBarStoreStore 2144 // so that stores that initialize this object can't be reordered 2145 // with a subsequent store that makes this object accessible by 2146 // other threads. 2147 // Other threads include java threads and JVM internal threads 2148 // (for example concurrent GC threads). Current concurrent GC 2149 // implementation: G1 will not scan newly created object, 2150 // so it's safe to skip storestore barrier when allocation does 2151 // not escape. 2152 if (!alloc->does_not_escape_thread() && 2153 !alloc->is_allocation_MemBar_redundant() && 2154 (init == NULL || !init->is_complete_with_arraycopy())) { 2155 if (init == NULL || init->req() < InitializeNode::RawStores) { 2156 // No InitializeNode or no stores captured by zeroing 2157 // elimination. Simply add the MemBarStoreStore after object 2158 // initialization. 2159 MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot); 2160 transform_later(mb); 2161 2162 mb->init_req(TypeFunc::Memory, fast_oop_rawmem); 2163 mb->init_req(TypeFunc::Control, fast_oop_ctrl); 2164 fast_oop_ctrl = new ProjNode(mb, TypeFunc::Control); 2165 transform_later(fast_oop_ctrl); 2166 fast_oop_rawmem = new ProjNode(mb, TypeFunc::Memory); 2167 transform_later(fast_oop_rawmem); 2168 } else { 2169 // Add the MemBarStoreStore after the InitializeNode so that 2170 // all stores performing the initialization that were moved 2171 // before the InitializeNode happen before the storestore 2172 // barrier. 2173 2174 Node* init_ctrl = init->proj_out_or_null(TypeFunc::Control); 2175 Node* init_mem = init->proj_out_or_null(TypeFunc::Memory); 2176 2177 MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot); 2178 transform_later(mb); 2179 2180 Node* ctrl = new ProjNode(init, TypeFunc::Control); 2181 transform_later(ctrl); 2182 Node* mem = new ProjNode(init, TypeFunc::Memory); 2183 transform_later(mem); 2184 2185 // The MemBarStoreStore depends on control and memory coming 2186 // from the InitializeNode 2187 mb->init_req(TypeFunc::Memory, mem); 2188 mb->init_req(TypeFunc::Control, ctrl); 2189 2190 ctrl = new ProjNode(mb, TypeFunc::Control); 2191 transform_later(ctrl); 2192 mem = new ProjNode(mb, TypeFunc::Memory); 2193 transform_later(mem); 2194 2195 // All nodes that depended on the InitializeNode for control 2196 // and memory must now depend on the MemBarNode that itself 2197 // depends on the InitializeNode 2198 if (init_ctrl != NULL) { 2199 _igvn.replace_node(init_ctrl, ctrl); 2200 } 2201 if (init_mem != NULL) { 2202 _igvn.replace_node(init_mem, mem); 2203 } 2204 } 2205 } 2206 } 2207 2208 void PhaseMacroExpand::expand_dtrace_alloc_probe(AllocateNode* alloc, Node* oop, 2209 Node*& ctrl, Node*& rawmem) { 2210 if (C->env()->dtrace_extended_probes()) { 2211 // Slow-path call 2212 int size = TypeFunc::Parms + 2; 2213 CallLeafNode *call = new CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(), 2214 CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base), 2215 "dtrace_object_alloc", 2216 TypeRawPtr::BOTTOM); 2217 2218 // Get base of thread-local storage area 2219 Node* thread = new ThreadLocalNode(); 2220 transform_later(thread); 2221 2222 call->init_req(TypeFunc::Parms + 0, thread); 2223 call->init_req(TypeFunc::Parms + 1, oop); 2224 call->init_req(TypeFunc::Control, ctrl); 2225 call->init_req(TypeFunc::I_O , top()); // does no i/o 2226 call->init_req(TypeFunc::Memory , ctrl); 2227 call->init_req(TypeFunc::ReturnAdr, alloc->in(TypeFunc::ReturnAdr)); 2228 call->init_req(TypeFunc::FramePtr, alloc->in(TypeFunc::FramePtr)); 2229 transform_later(call); 2230 ctrl = new ProjNode(call, TypeFunc::Control); 2231 transform_later(ctrl); 2232 rawmem = new ProjNode(call, TypeFunc::Memory); 2233 transform_later(rawmem); 2234 } 2235 } 2236 2237 // Helper for PhaseMacroExpand::expand_allocate_common. 2238 // Initializes the newly-allocated storage. 2239 Node* 2240 PhaseMacroExpand::initialize_object(AllocateNode* alloc, 2241 Node* control, Node* rawmem, Node* object, 2242 Node* klass_node, Node* length, 2243 Node* size_in_bytes) { 2244 InitializeNode* init = alloc->initialization(); 2245 // Store the klass & mark bits 2246 Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem); 2247 if (!mark_node->is_Con()) { 2248 transform_later(mark_node); 2249 } 2250 rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type()); 2251 2252 rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA); 2253 int header_size = alloc->minimum_header_size(); // conservatively small 2254 2255 // Array length 2256 if (length != NULL) { // Arrays need length field 2257 rawmem = make_store(control, rawmem, object, arrayOopDesc::length_offset_in_bytes(), length, T_INT); 2258 // conservatively small header size: 2259 header_size = arrayOopDesc::base_offset_in_bytes(T_BYTE); 2260 ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass(); 2261 if (k->is_array_klass()) // we know the exact header size in most cases: 2262 header_size = Klass::layout_helper_header_size(k->layout_helper()); 2263 } 2264 2265 // Clear the object body, if necessary. 2266 if (init == NULL) { 2267 // The init has somehow disappeared; be cautious and clear everything. 2268 // 2269 // This can happen if a node is allocated but an uncommon trap occurs 2270 // immediately. In this case, the Initialize gets associated with the 2271 // trap, and may be placed in a different (outer) loop, if the Allocate 2272 // is in a loop. If (this is rare) the inner loop gets unrolled, then 2273 // there can be two Allocates to one Initialize. The answer in all these 2274 // edge cases is safety first. It is always safe to clear immediately 2275 // within an Allocate, and then (maybe or maybe not) clear some more later. 2276 if (!(UseTLAB && ZeroTLAB)) { 2277 rawmem = ClearArrayNode::clear_memory(control, rawmem, object, 2278 header_size, size_in_bytes, 2279 &_igvn); 2280 } 2281 } else { 2282 if (!init->is_complete()) { 2283 // Try to win by zeroing only what the init does not store. 2284 // We can also try to do some peephole optimizations, 2285 // such as combining some adjacent subword stores. 2286 rawmem = init->complete_stores(control, rawmem, object, 2287 header_size, size_in_bytes, &_igvn); 2288 } 2289 // We have no more use for this link, since the AllocateNode goes away: 2290 init->set_req(InitializeNode::RawAddress, top()); 2291 // (If we keep the link, it just confuses the register allocator, 2292 // who thinks he sees a real use of the address by the membar.) 2293 } 2294 2295 return rawmem; 2296 } 2297 2298 // Generate prefetch instructions for next allocations. 2299 Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false, 2300 Node*& contended_phi_rawmem, 2301 Node* old_eden_top, Node* new_eden_top, 2302 intx lines) { 2303 enum { fall_in_path = 1, pf_path = 2 }; 2304 if( UseTLAB && AllocatePrefetchStyle == 2 ) { 2305 // Generate prefetch allocation with watermark check. 2306 // As an allocation hits the watermark, we will prefetch starting 2307 // at a "distance" away from watermark. 2308 2309 Node *pf_region = new RegionNode(3); 2310 Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY, 2311 TypeRawPtr::BOTTOM ); 2312 // I/O is used for Prefetch 2313 Node *pf_phi_abio = new PhiNode( pf_region, Type::ABIO ); 2314 2315 Node *thread = new ThreadLocalNode(); 2316 transform_later(thread); 2317 2318 Node *eden_pf_adr = new AddPNode( top()/*not oop*/, thread, 2319 _igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) ); 2320 transform_later(eden_pf_adr); 2321 2322 Node *old_pf_wm = new LoadPNode(needgc_false, 2323 contended_phi_rawmem, eden_pf_adr, 2324 TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, 2325 MemNode::unordered); 2326 transform_later(old_pf_wm); 2327 2328 // check against new_eden_top 2329 Node *need_pf_cmp = new CmpPNode( new_eden_top, old_pf_wm ); 2330 transform_later(need_pf_cmp); 2331 Node *need_pf_bol = new BoolNode( need_pf_cmp, BoolTest::ge ); 2332 transform_later(need_pf_bol); 2333 IfNode *need_pf_iff = new IfNode( needgc_false, need_pf_bol, 2334 PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN ); 2335 transform_later(need_pf_iff); 2336 2337 // true node, add prefetchdistance 2338 Node *need_pf_true = new IfTrueNode( need_pf_iff ); 2339 transform_later(need_pf_true); 2340 2341 Node *need_pf_false = new IfFalseNode( need_pf_iff ); 2342 transform_later(need_pf_false); 2343 2344 Node *new_pf_wmt = new AddPNode( top(), old_pf_wm, 2345 _igvn.MakeConX(AllocatePrefetchDistance) ); 2346 transform_later(new_pf_wmt ); 2347 new_pf_wmt->set_req(0, need_pf_true); 2348 2349 Node *store_new_wmt = new StorePNode(need_pf_true, 2350 contended_phi_rawmem, eden_pf_adr, 2351 TypeRawPtr::BOTTOM, new_pf_wmt, 2352 MemNode::unordered); 2353 transform_later(store_new_wmt); 2354 2355 // adding prefetches 2356 pf_phi_abio->init_req( fall_in_path, i_o ); 2357 2358 Node *prefetch_adr; 2359 Node *prefetch; 2360 uint step_size = AllocatePrefetchStepSize; 2361 uint distance = 0; 2362 2363 for ( intx i = 0; i < lines; i++ ) { 2364 prefetch_adr = new AddPNode( old_pf_wm, new_pf_wmt, 2365 _igvn.MakeConX(distance) ); 2366 transform_later(prefetch_adr); 2367 prefetch = new PrefetchAllocationNode( i_o, prefetch_adr ); 2368 transform_later(prefetch); 2369 distance += step_size; 2370 i_o = prefetch; 2371 } 2372 pf_phi_abio->set_req( pf_path, i_o ); 2373 2374 pf_region->init_req( fall_in_path, need_pf_false ); 2375 pf_region->init_req( pf_path, need_pf_true ); 2376 2377 pf_phi_rawmem->init_req( fall_in_path, contended_phi_rawmem ); 2378 pf_phi_rawmem->init_req( pf_path, store_new_wmt ); 2379 2380 transform_later(pf_region); 2381 transform_later(pf_phi_rawmem); 2382 transform_later(pf_phi_abio); 2383 2384 needgc_false = pf_region; 2385 contended_phi_rawmem = pf_phi_rawmem; 2386 i_o = pf_phi_abio; 2387 } else if( UseTLAB && AllocatePrefetchStyle == 3 ) { 2388 // Insert a prefetch instruction for each allocation. 2389 // This code is used to generate 1 prefetch instruction per cache line. 2390 2391 // Generate several prefetch instructions. 2392 uint step_size = AllocatePrefetchStepSize; 2393 uint distance = AllocatePrefetchDistance; 2394 2395 // Next cache address. 2396 Node *cache_adr = new AddPNode(old_eden_top, old_eden_top, 2397 _igvn.MakeConX(step_size + distance)); 2398 transform_later(cache_adr); 2399 cache_adr = new CastP2XNode(needgc_false, cache_adr); 2400 transform_later(cache_adr); 2401 // Address is aligned to execute prefetch to the beginning of cache line size 2402 // (it is important when BIS instruction is used on SPARC as prefetch). 2403 Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1)); 2404 cache_adr = new AndXNode(cache_adr, mask); 2405 transform_later(cache_adr); 2406 cache_adr = new CastX2PNode(cache_adr); 2407 transform_later(cache_adr); 2408 2409 // Prefetch 2410 Node *prefetch = new PrefetchAllocationNode( contended_phi_rawmem, cache_adr ); 2411 prefetch->set_req(0, needgc_false); 2412 transform_later(prefetch); 2413 contended_phi_rawmem = prefetch; 2414 Node *prefetch_adr; 2415 distance = step_size; 2416 for ( intx i = 1; i < lines; i++ ) { 2417 prefetch_adr = new AddPNode( cache_adr, cache_adr, 2418 _igvn.MakeConX(distance) ); 2419 transform_later(prefetch_adr); 2420 prefetch = new PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr ); 2421 transform_later(prefetch); 2422 distance += step_size; 2423 contended_phi_rawmem = prefetch; 2424 } 2425 } else if( AllocatePrefetchStyle > 0 ) { 2426 // Insert a prefetch for each allocation only on the fast-path 2427 Node *prefetch_adr; 2428 Node *prefetch; 2429 // Generate several prefetch instructions. 2430 uint step_size = AllocatePrefetchStepSize; 2431 uint distance = AllocatePrefetchDistance; 2432 for ( intx i = 0; i < lines; i++ ) { 2433 prefetch_adr = new AddPNode( old_eden_top, new_eden_top, 2434 _igvn.MakeConX(distance) ); 2435 transform_later(prefetch_adr); 2436 prefetch = new PrefetchAllocationNode( i_o, prefetch_adr ); 2437 // Do not let it float too high, since if eden_top == eden_end, 2438 // both might be null. 2439 if( i == 0 ) { // Set control for first prefetch, next follows it 2440 prefetch->init_req(0, needgc_false); 2441 } 2442 transform_later(prefetch); 2443 distance += step_size; 2444 i_o = prefetch; 2445 } 2446 } 2447 return i_o; 2448 } 2449 2450 2451 void PhaseMacroExpand::expand_allocate(AllocateNode *alloc) { 2452 expand_allocate_common(alloc, NULL, 2453 OptoRuntime::new_instance_Type(), 2454 OptoRuntime::new_instance_Java()); 2455 } 2456 2457 void PhaseMacroExpand::expand_allocate_array(AllocateArrayNode *alloc) { 2458 Node* length = alloc->in(AllocateNode::ALength); 2459 InitializeNode* init = alloc->initialization(); 2460 Node* klass_node = alloc->in(AllocateNode::KlassNode); 2461 ciKlass* k = _igvn.type(klass_node)->is_klassptr()->klass(); 2462 address slow_call_address; // Address of slow call 2463 if (init != NULL && init->is_complete_with_arraycopy() && 2464 k->is_type_array_klass()) { 2465 // Don't zero type array during slow allocation in VM since 2466 // it will be initialized later by arraycopy in compiled code. 2467 slow_call_address = OptoRuntime::new_array_nozero_Java(); 2468 } else { 2469 slow_call_address = OptoRuntime::new_array_Java(); 2470 } 2471 expand_allocate_common(alloc, length, 2472 OptoRuntime::new_array_Type(), 2473 slow_call_address); 2474 } 2475 2476 //-------------------mark_eliminated_box---------------------------------- 2477 // 2478 // During EA obj may point to several objects but after few ideal graph 2479 // transformations (CCP) it may point to only one non escaping object 2480 // (but still using phi), corresponding locks and unlocks will be marked 2481 // for elimination. Later obj could be replaced with a new node (new phi) 2482 // and which does not have escape information. And later after some graph 2483 // reshape other locks and unlocks (which were not marked for elimination 2484 // before) are connected to this new obj (phi) but they still will not be 2485 // marked for elimination since new obj has no escape information. 2486 // Mark all associated (same box and obj) lock and unlock nodes for 2487 // elimination if some of them marked already. 2488 void PhaseMacroExpand::mark_eliminated_box(Node* oldbox, Node* obj) { 2489 if (oldbox->as_BoxLock()->is_eliminated()) 2490 return; // This BoxLock node was processed already. 2491 2492 // New implementation (EliminateNestedLocks) has separate BoxLock 2493 // node for each locked region so mark all associated locks/unlocks as 2494 // eliminated even if different objects are referenced in one locked region 2495 // (for example, OSR compilation of nested loop inside locked scope). 2496 if (EliminateNestedLocks || 2497 oldbox->as_BoxLock()->is_simple_lock_region(NULL, obj)) { 2498 // Box is used only in one lock region. Mark this box as eliminated. 2499 _igvn.hash_delete(oldbox); 2500 oldbox->as_BoxLock()->set_eliminated(); // This changes box's hash value 2501 _igvn.hash_insert(oldbox); 2502 2503 for (uint i = 0; i < oldbox->outcnt(); i++) { 2504 Node* u = oldbox->raw_out(i); 2505 if (u->is_AbstractLock() && !u->as_AbstractLock()->is_non_esc_obj()) { 2506 AbstractLockNode* alock = u->as_AbstractLock(); 2507 // Check lock's box since box could be referenced by Lock's debug info. 2508 if (alock->box_node() == oldbox) { 2509 // Mark eliminated all related locks and unlocks. 2510 #ifdef ASSERT 2511 alock->log_lock_optimization(C, "eliminate_lock_set_non_esc4"); 2512 #endif 2513 alock->set_non_esc_obj(); 2514 } 2515 } 2516 } 2517 return; 2518 } 2519 2520 // Create new "eliminated" BoxLock node and use it in monitor debug info 2521 // instead of oldbox for the same object. 2522 BoxLockNode* newbox = oldbox->clone()->as_BoxLock(); 2523 2524 // Note: BoxLock node is marked eliminated only here and it is used 2525 // to indicate that all associated lock and unlock nodes are marked 2526 // for elimination. 2527 newbox->set_eliminated(); 2528 transform_later(newbox); 2529 2530 // Replace old box node with new box for all users of the same object. 2531 for (uint i = 0; i < oldbox->outcnt();) { 2532 bool next_edge = true; 2533 2534 Node* u = oldbox->raw_out(i); 2535 if (u->is_AbstractLock()) { 2536 AbstractLockNode* alock = u->as_AbstractLock(); 2537 if (alock->box_node() == oldbox && alock->obj_node()->eqv_uncast(obj)) { 2538 // Replace Box and mark eliminated all related locks and unlocks. 2539 #ifdef ASSERT 2540 alock->log_lock_optimization(C, "eliminate_lock_set_non_esc5"); 2541 #endif 2542 alock->set_non_esc_obj(); 2543 _igvn.rehash_node_delayed(alock); 2544 alock->set_box_node(newbox); 2545 next_edge = false; 2546 } 2547 } 2548 if (u->is_FastLock() && u->as_FastLock()->obj_node()->eqv_uncast(obj)) { 2549 FastLockNode* flock = u->as_FastLock(); 2550 assert(flock->box_node() == oldbox, "sanity"); 2551 _igvn.rehash_node_delayed(flock); 2552 flock->set_box_node(newbox); 2553 next_edge = false; 2554 } 2555 2556 // Replace old box in monitor debug info. 2557 if (u->is_SafePoint() && u->as_SafePoint()->jvms()) { 2558 SafePointNode* sfn = u->as_SafePoint(); 2559 JVMState* youngest_jvms = sfn->jvms(); 2560 int max_depth = youngest_jvms->depth(); 2561 for (int depth = 1; depth <= max_depth; depth++) { 2562 JVMState* jvms = youngest_jvms->of_depth(depth); 2563 int num_mon = jvms->nof_monitors(); 2564 // Loop over monitors 2565 for (int idx = 0; idx < num_mon; idx++) { 2566 Node* obj_node = sfn->monitor_obj(jvms, idx); 2567 Node* box_node = sfn->monitor_box(jvms, idx); 2568 if (box_node == oldbox && obj_node->eqv_uncast(obj)) { 2569 int j = jvms->monitor_box_offset(idx); 2570 _igvn.replace_input_of(u, j, newbox); 2571 next_edge = false; 2572 } 2573 } 2574 } 2575 } 2576 if (next_edge) i++; 2577 } 2578 } 2579 2580 //-----------------------mark_eliminated_locking_nodes----------------------- 2581 void PhaseMacroExpand::mark_eliminated_locking_nodes(AbstractLockNode *alock) { 2582 if (EliminateNestedLocks) { 2583 if (alock->is_nested()) { 2584 assert(alock->box_node()->as_BoxLock()->is_eliminated(), "sanity"); 2585 return; 2586 } else if (!alock->is_non_esc_obj()) { // Not eliminated or coarsened 2587 // Only Lock node has JVMState needed here. 2588 // Not that preceding claim is documented anywhere else. 2589 if (alock->jvms() != NULL) { 2590 if (alock->as_Lock()->is_nested_lock_region()) { 2591 // Mark eliminated related nested locks and unlocks. 2592 Node* obj = alock->obj_node(); 2593 BoxLockNode* box_node = alock->box_node()->as_BoxLock(); 2594 assert(!box_node->is_eliminated(), "should not be marked yet"); 2595 // Note: BoxLock node is marked eliminated only here 2596 // and it is used to indicate that all associated lock 2597 // and unlock nodes are marked for elimination. 2598 box_node->set_eliminated(); // Box's hash is always NO_HASH here 2599 for (uint i = 0; i < box_node->outcnt(); i++) { 2600 Node* u = box_node->raw_out(i); 2601 if (u->is_AbstractLock()) { 2602 alock = u->as_AbstractLock(); 2603 if (alock->box_node() == box_node) { 2604 // Verify that this Box is referenced only by related locks. 2605 assert(alock->obj_node()->eqv_uncast(obj), ""); 2606 // Mark all related locks and unlocks. 2607 #ifdef ASSERT 2608 alock->log_lock_optimization(C, "eliminate_lock_set_nested"); 2609 #endif 2610 alock->set_nested(); 2611 } 2612 } 2613 } 2614 } else { 2615 #ifdef ASSERT 2616 alock->log_lock_optimization(C, "eliminate_lock_NOT_nested_lock_region"); 2617 if (C->log() != NULL) 2618 alock->as_Lock()->is_nested_lock_region(C); // rerun for debugging output 2619 #endif 2620 } 2621 } 2622 return; 2623 } 2624 // Process locks for non escaping object 2625 assert(alock->is_non_esc_obj(), ""); 2626 } // EliminateNestedLocks 2627 2628 if (alock->is_non_esc_obj()) { // Lock is used for non escaping object 2629 // Look for all locks of this object and mark them and 2630 // corresponding BoxLock nodes as eliminated. 2631 Node* obj = alock->obj_node(); 2632 for (uint j = 0; j < obj->outcnt(); j++) { 2633 Node* o = obj->raw_out(j); 2634 if (o->is_AbstractLock() && 2635 o->as_AbstractLock()->obj_node()->eqv_uncast(obj)) { 2636 alock = o->as_AbstractLock(); 2637 Node* box = alock->box_node(); 2638 // Replace old box node with new eliminated box for all users 2639 // of the same object and mark related locks as eliminated. 2640 mark_eliminated_box(box, obj); 2641 } 2642 } 2643 } 2644 } 2645 2646 // we have determined that this lock/unlock can be eliminated, we simply 2647 // eliminate the node without expanding it. 2648 // 2649 // Note: The membar's associated with the lock/unlock are currently not 2650 // eliminated. This should be investigated as a future enhancement. 2651 // 2652 bool PhaseMacroExpand::eliminate_locking_node(AbstractLockNode *alock) { 2653 2654 if (!alock->is_eliminated()) { 2655 return false; 2656 } 2657 #ifdef ASSERT 2658 if (!alock->is_coarsened()) { 2659 // Check that new "eliminated" BoxLock node is created. 2660 BoxLockNode* oldbox = alock->box_node()->as_BoxLock(); 2661 assert(oldbox->is_eliminated(), "should be done already"); 2662 } 2663 #endif 2664 2665 alock->log_lock_optimization(C, "eliminate_lock"); 2666 2667 #ifndef PRODUCT 2668 if (PrintEliminateLocks) { 2669 if (alock->is_Lock()) { 2670 tty->print_cr("++++ Eliminated: %d Lock", alock->_idx); 2671 } else { 2672 tty->print_cr("++++ Eliminated: %d Unlock", alock->_idx); 2673 } 2674 } 2675 #endif 2676 2677 Node* mem = alock->in(TypeFunc::Memory); 2678 Node* ctrl = alock->in(TypeFunc::Control); 2679 guarantee(ctrl != NULL, "missing control projection, cannot replace_node() with NULL"); 2680 2681 extract_call_projections(alock); 2682 // There are 2 projections from the lock. The lock node will 2683 // be deleted when its last use is subsumed below. 2684 assert(alock->outcnt() == 2 && 2685 _fallthroughproj != NULL && 2686 _memproj_fallthrough != NULL, 2687 "Unexpected projections from Lock/Unlock"); 2688 2689 Node* fallthroughproj = _fallthroughproj; 2690 Node* memproj_fallthrough = _memproj_fallthrough; 2691 2692 // The memory projection from a lock/unlock is RawMem 2693 // The input to a Lock is merged memory, so extract its RawMem input 2694 // (unless the MergeMem has been optimized away.) 2695 if (alock->is_Lock()) { 2696 // Seach for MemBarAcquireLock node and delete it also. 2697 MemBarNode* membar = fallthroughproj->unique_ctrl_out()->as_MemBar(); 2698 assert(membar != NULL && membar->Opcode() == Op_MemBarAcquireLock, ""); 2699 Node* ctrlproj = membar->proj_out(TypeFunc::Control); 2700 Node* memproj = membar->proj_out(TypeFunc::Memory); 2701 _igvn.replace_node(ctrlproj, fallthroughproj); 2702 _igvn.replace_node(memproj, memproj_fallthrough); 2703 2704 // Delete FastLock node also if this Lock node is unique user 2705 // (a loop peeling may clone a Lock node). 2706 Node* flock = alock->as_Lock()->fastlock_node(); 2707 if (flock->outcnt() == 1) { 2708 assert(flock->unique_out() == alock, "sanity"); 2709 _igvn.replace_node(flock, top()); 2710 } 2711 } 2712 2713 // Seach for MemBarReleaseLock node and delete it also. 2714 if (alock->is_Unlock() && ctrl->is_Proj() && ctrl->in(0)->is_MemBar()) { 2715 MemBarNode* membar = ctrl->in(0)->as_MemBar(); 2716 assert(membar->Opcode() == Op_MemBarReleaseLock && 2717 mem->is_Proj() && membar == mem->in(0), ""); 2718 _igvn.replace_node(fallthroughproj, ctrl); 2719 _igvn.replace_node(memproj_fallthrough, mem); 2720 fallthroughproj = ctrl; 2721 memproj_fallthrough = mem; 2722 ctrl = membar->in(TypeFunc::Control); 2723 mem = membar->in(TypeFunc::Memory); 2724 } 2725 2726 _igvn.replace_node(fallthroughproj, ctrl); 2727 _igvn.replace_node(memproj_fallthrough, mem); 2728 return true; 2729 } 2730 2731 2732 //------------------------------expand_lock_node---------------------- 2733 void PhaseMacroExpand::expand_lock_node(LockNode *lock) { 2734 2735 Node* ctrl = lock->in(TypeFunc::Control); 2736 Node* mem = lock->in(TypeFunc::Memory); 2737 Node* obj = lock->obj_node(); 2738 Node* box = lock->box_node(); 2739 Node* flock = lock->fastlock_node(); 2740 2741 assert(!box->as_BoxLock()->is_eliminated(), "sanity"); 2742 2743 // Make the merge point 2744 Node *region; 2745 Node *mem_phi; 2746 Node *slow_path; 2747 2748 if (UseOptoBiasInlining) { 2749 /* 2750 * See the full description in MacroAssembler::biased_locking_enter(). 2751 * 2752 * if( (mark_word & biased_lock_mask) == biased_lock_pattern ) { 2753 * // The object is biased. 2754 * proto_node = klass->prototype_header; 2755 * o_node = thread | proto_node; 2756 * x_node = o_node ^ mark_word; 2757 * if( (x_node & ~age_mask) == 0 ) { // Biased to the current thread ? 2758 * // Done. 2759 * } else { 2760 * if( (x_node & biased_lock_mask) != 0 ) { 2761 * // The klass's prototype header is no longer biased. 2762 * cas(&mark_word, mark_word, proto_node) 2763 * goto cas_lock; 2764 * } else { 2765 * // The klass's prototype header is still biased. 2766 * if( (x_node & epoch_mask) != 0 ) { // Expired epoch? 2767 * old = mark_word; 2768 * new = o_node; 2769 * } else { 2770 * // Different thread or anonymous biased. 2771 * old = mark_word & (epoch_mask | age_mask | biased_lock_mask); 2772 * new = thread | old; 2773 * } 2774 * // Try to rebias. 2775 * if( cas(&mark_word, old, new) == 0 ) { 2776 * // Done. 2777 * } else { 2778 * goto slow_path; // Failed. 2779 * } 2780 * } 2781 * } 2782 * } else { 2783 * // The object is not biased. 2784 * cas_lock: 2785 * if( FastLock(obj) == 0 ) { 2786 * // Done. 2787 * } else { 2788 * slow_path: 2789 * OptoRuntime::complete_monitor_locking_Java(obj); 2790 * } 2791 * } 2792 */ 2793 2794 region = new RegionNode(5); 2795 // create a Phi for the memory state 2796 mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); 2797 2798 Node* fast_lock_region = new RegionNode(3); 2799 Node* fast_lock_mem_phi = new PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM); 2800 2801 // First, check mark word for the biased lock pattern. 2802 Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type()); 2803 2804 // Get fast path - mark word has the biased lock pattern. 2805 ctrl = opt_bits_test(ctrl, fast_lock_region, 1, mark_node, 2806 markWord::biased_lock_mask_in_place, 2807 markWord::biased_lock_pattern, true); 2808 // fast_lock_region->in(1) is set to slow path. 2809 fast_lock_mem_phi->init_req(1, mem); 2810 2811 // Now check that the lock is biased to the current thread and has 2812 // the same epoch and bias as Klass::_prototype_header. 2813 2814 // Special-case a fresh allocation to avoid building nodes: 2815 Node* klass_node = AllocateNode::Ideal_klass(obj, &_igvn); 2816 if (klass_node == NULL) { 2817 Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes()); 2818 klass_node = transform_later(LoadKlassNode::make(_igvn, NULL, mem, k_adr, _igvn.type(k_adr)->is_ptr())); 2819 #ifdef _LP64 2820 if (UseCompressedClassPointers && klass_node->is_DecodeNKlass()) { 2821 assert(klass_node->in(1)->Opcode() == Op_LoadNKlass, "sanity"); 2822 klass_node->in(1)->init_req(0, ctrl); 2823 } else 2824 #endif 2825 klass_node->init_req(0, ctrl); 2826 } 2827 Node *proto_node = make_load(ctrl, mem, klass_node, in_bytes(Klass::prototype_header_offset()), TypeX_X, TypeX_X->basic_type()); 2828 2829 Node* thread = transform_later(new ThreadLocalNode()); 2830 Node* cast_thread = transform_later(new CastP2XNode(ctrl, thread)); 2831 Node* o_node = transform_later(new OrXNode(cast_thread, proto_node)); 2832 Node* x_node = transform_later(new XorXNode(o_node, mark_node)); 2833 2834 // Get slow path - mark word does NOT match the value. 2835 STATIC_ASSERT(markWord::age_mask_in_place <= INT_MAX); 2836 Node* not_biased_ctrl = opt_bits_test(ctrl, region, 3, x_node, 2837 (~(int)markWord::age_mask_in_place), 0); 2838 // region->in(3) is set to fast path - the object is biased to the current thread. 2839 mem_phi->init_req(3, mem); 2840 2841 2842 // Mark word does NOT match the value (thread | Klass::_prototype_header). 2843 2844 2845 // First, check biased pattern. 2846 // Get fast path - _prototype_header has the same biased lock pattern. 2847 ctrl = opt_bits_test(not_biased_ctrl, fast_lock_region, 2, x_node, 2848 markWord::biased_lock_mask_in_place, 0, true); 2849 2850 not_biased_ctrl = fast_lock_region->in(2); // Slow path 2851 // fast_lock_region->in(2) - the prototype header is no longer biased 2852 // and we have to revoke the bias on this object. 2853 // We are going to try to reset the mark of this object to the prototype 2854 // value and fall through to the CAS-based locking scheme. 2855 Node* adr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes()); 2856 Node* cas = new StoreXConditionalNode(not_biased_ctrl, mem, adr, 2857 proto_node, mark_node); 2858 transform_later(cas); 2859 Node* proj = transform_later(new SCMemProjNode(cas)); 2860 fast_lock_mem_phi->init_req(2, proj); 2861 2862 2863 // Second, check epoch bits. 2864 Node* rebiased_region = new RegionNode(3); 2865 Node* old_phi = new PhiNode( rebiased_region, TypeX_X); 2866 Node* new_phi = new PhiNode( rebiased_region, TypeX_X); 2867 2868 // Get slow path - mark word does NOT match epoch bits. 2869 Node* epoch_ctrl = opt_bits_test(ctrl, rebiased_region, 1, x_node, 2870 markWord::epoch_mask_in_place, 0); 2871 // The epoch of the current bias is not valid, attempt to rebias the object 2872 // toward the current thread. 2873 rebiased_region->init_req(2, epoch_ctrl); 2874 old_phi->init_req(2, mark_node); 2875 new_phi->init_req(2, o_node); 2876 2877 // rebiased_region->in(1) is set to fast path. 2878 // The epoch of the current bias is still valid but we know 2879 // nothing about the owner; it might be set or it might be clear. 2880 Node* cmask = MakeConX(markWord::biased_lock_mask_in_place | 2881 markWord::age_mask_in_place | 2882 markWord::epoch_mask_in_place); 2883 Node* old = transform_later(new AndXNode(mark_node, cmask)); 2884 cast_thread = transform_later(new CastP2XNode(ctrl, thread)); 2885 Node* new_mark = transform_later(new OrXNode(cast_thread, old)); 2886 old_phi->init_req(1, old); 2887 new_phi->init_req(1, new_mark); 2888 2889 transform_later(rebiased_region); 2890 transform_later(old_phi); 2891 transform_later(new_phi); 2892 2893 // Try to acquire the bias of the object using an atomic operation. 2894 // If this fails we will go in to the runtime to revoke the object's bias. 2895 cas = new StoreXConditionalNode(rebiased_region, mem, adr, new_phi, old_phi); 2896 transform_later(cas); 2897 proj = transform_later(new SCMemProjNode(cas)); 2898 2899 // Get slow path - Failed to CAS. 2900 not_biased_ctrl = opt_bits_test(rebiased_region, region, 4, cas, 0, 0); 2901 mem_phi->init_req(4, proj); 2902 // region->in(4) is set to fast path - the object is rebiased to the current thread. 2903 2904 // Failed to CAS. 2905 slow_path = new RegionNode(3); 2906 Node *slow_mem = new PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM); 2907 2908 slow_path->init_req(1, not_biased_ctrl); // Capture slow-control 2909 slow_mem->init_req(1, proj); 2910 2911 // Call CAS-based locking scheme (FastLock node). 2912 2913 transform_later(fast_lock_region); 2914 transform_later(fast_lock_mem_phi); 2915 2916 // Get slow path - FastLock failed to lock the object. 2917 ctrl = opt_bits_test(fast_lock_region, region, 2, flock, 0, 0); 2918 mem_phi->init_req(2, fast_lock_mem_phi); 2919 // region->in(2) is set to fast path - the object is locked to the current thread. 2920 2921 slow_path->init_req(2, ctrl); // Capture slow-control 2922 slow_mem->init_req(2, fast_lock_mem_phi); 2923 2924 transform_later(slow_path); 2925 transform_later(slow_mem); 2926 // Reset lock's memory edge. 2927 lock->set_req(TypeFunc::Memory, slow_mem); 2928 2929 } else { 2930 region = new RegionNode(3); 2931 // create a Phi for the memory state 2932 mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); 2933 2934 // Optimize test; set region slot 2 2935 slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0); 2936 mem_phi->init_req(2, mem); 2937 } 2938 2939 // Make slow path call 2940 CallNode *call = make_slow_call((CallNode *) lock, OptoRuntime::complete_monitor_enter_Type(), 2941 OptoRuntime::complete_monitor_locking_Java(), NULL, slow_path, 2942 obj, box, NULL); 2943 2944 extract_call_projections(call); 2945 2946 // Slow path can only throw asynchronous exceptions, which are always 2947 // de-opted. So the compiler thinks the slow-call can never throw an 2948 // exception. If it DOES throw an exception we would need the debug 2949 // info removed first (since if it throws there is no monitor). 2950 assert ( _ioproj_fallthrough == NULL && _ioproj_catchall == NULL && 2951 _memproj_catchall == NULL && _catchallcatchproj == NULL, "Unexpected projection from Lock"); 2952 2953 // Capture slow path 2954 // disconnect fall-through projection from call and create a new one 2955 // hook up users of fall-through projection to region 2956 Node *slow_ctrl = _fallthroughproj->clone(); 2957 transform_later(slow_ctrl); 2958 _igvn.hash_delete(_fallthroughproj); 2959 _fallthroughproj->disconnect_inputs(NULL, C); 2960 region->init_req(1, slow_ctrl); 2961 // region inputs are now complete 2962 transform_later(region); 2963 _igvn.replace_node(_fallthroughproj, region); 2964 2965 Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory)); 2966 mem_phi->init_req(1, memproj ); 2967 transform_later(mem_phi); 2968 _igvn.replace_node(_memproj_fallthrough, mem_phi); 2969 } 2970 2971 //------------------------------expand_unlock_node---------------------- 2972 void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) { 2973 2974 Node* ctrl = unlock->in(TypeFunc::Control); 2975 Node* mem = unlock->in(TypeFunc::Memory); 2976 Node* obj = unlock->obj_node(); 2977 Node* box = unlock->box_node(); 2978 2979 assert(!box->as_BoxLock()->is_eliminated(), "sanity"); 2980 2981 // No need for a null check on unlock 2982 2983 // Make the merge point 2984 Node *region; 2985 Node *mem_phi; 2986 2987 if (UseOptoBiasInlining) { 2988 // Check for biased locking unlock case, which is a no-op. 2989 // See the full description in MacroAssembler::biased_locking_exit(). 2990 region = new RegionNode(4); 2991 // create a Phi for the memory state 2992 mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); 2993 mem_phi->init_req(3, mem); 2994 2995 Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type()); 2996 ctrl = opt_bits_test(ctrl, region, 3, mark_node, 2997 markWord::biased_lock_mask_in_place, 2998 markWord::biased_lock_pattern); 2999 } else { 3000 region = new RegionNode(3); 3001 // create a Phi for the memory state 3002 mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); 3003 } 3004 3005 FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box ); 3006 funlock = transform_later( funlock )->as_FastUnlock(); 3007 // Optimize test; set region slot 2 3008 Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0); 3009 Node *thread = transform_later(new ThreadLocalNode()); 3010 3011 CallNode *call = make_slow_call((CallNode *) unlock, OptoRuntime::complete_monitor_exit_Type(), 3012 CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C), 3013 "complete_monitor_unlocking_C", slow_path, obj, box, thread); 3014 3015 extract_call_projections(call); 3016 3017 assert ( _ioproj_fallthrough == NULL && _ioproj_catchall == NULL && 3018 _memproj_catchall == NULL && _catchallcatchproj == NULL, "Unexpected projection from Lock"); 3019 3020 // No exceptions for unlocking 3021 // Capture slow path 3022 // disconnect fall-through projection from call and create a new one 3023 // hook up users of fall-through projection to region 3024 Node *slow_ctrl = _fallthroughproj->clone(); 3025 transform_later(slow_ctrl); 3026 _igvn.hash_delete(_fallthroughproj); 3027 _fallthroughproj->disconnect_inputs(NULL, C); 3028 region->init_req(1, slow_ctrl); 3029 // region inputs are now complete 3030 transform_later(region); 3031 _igvn.replace_node(_fallthroughproj, region); 3032 3033 Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory) ); 3034 mem_phi->init_req(1, memproj ); 3035 mem_phi->init_req(2, mem); 3036 transform_later(mem_phi); 3037 _igvn.replace_node(_memproj_fallthrough, mem_phi); 3038 } 3039 3040 void PhaseMacroExpand::expand_subtypecheck_node(SubTypeCheckNode *check) { 3041 assert(check->in(SubTypeCheckNode::Control) == NULL, "should be pinned"); 3042 Node* bol = check->unique_out(); 3043 Node* obj_or_subklass = check->in(SubTypeCheckNode::ObjOrSubKlass); 3044 Node* superklass = check->in(SubTypeCheckNode::SuperKlass); 3045 assert(bol->is_Bool() && bol->as_Bool()->_test._test == BoolTest::ne, "unexpected bool node"); 3046 3047 for (DUIterator_Last imin, i = bol->last_outs(imin); i >= imin; --i) { 3048 Node* iff = bol->last_out(i); 3049 assert(iff->is_If(), "where's the if?"); 3050 3051 if (iff->in(0)->is_top()) { 3052 _igvn.replace_input_of(iff, 1, C->top()); 3053 continue; 3054 } 3055 3056 Node* iftrue = iff->as_If()->proj_out(1); 3057 Node* iffalse = iff->as_If()->proj_out(0); 3058 Node* ctrl = iff->in(0); 3059 3060 Node* subklass = NULL; 3061 if (_igvn.type(obj_or_subklass)->isa_klassptr()) { 3062 subklass = obj_or_subklass; 3063 } else { 3064 Node* k_adr = basic_plus_adr(obj_or_subklass, oopDesc::klass_offset_in_bytes()); 3065 subklass = _igvn.transform(LoadKlassNode::make(_igvn, NULL, C->immutable_memory(), k_adr, TypeInstPtr::KLASS)); 3066 } 3067 3068 Node* not_subtype_ctrl = Phase::gen_subtype_check(subklass, superklass, &ctrl, NULL, _igvn); 3069 3070 _igvn.replace_input_of(iff, 0, C->top()); 3071 _igvn.replace_node(iftrue, not_subtype_ctrl); 3072 _igvn.replace_node(iffalse, ctrl); 3073 } 3074 _igvn.replace_node(check, C->top()); 3075 } 3076 3077 //---------------------------eliminate_macro_nodes---------------------- 3078 // Eliminate scalar replaced allocations and associated locks. 3079 void PhaseMacroExpand::eliminate_macro_nodes() { 3080 if (C->macro_count() == 0) 3081 return; 3082 3083 // First, attempt to eliminate locks 3084 int cnt = C->macro_count(); 3085 for (int i=0; i < cnt; i++) { 3086 Node *n = C->macro_node(i); 3087 if (n->is_AbstractLock()) { // Lock and Unlock nodes 3088 // Before elimination mark all associated (same box and obj) 3089 // lock and unlock nodes. 3090 mark_eliminated_locking_nodes(n->as_AbstractLock()); 3091 } 3092 } 3093 bool progress = true; 3094 while (progress) { 3095 progress = false; 3096 for (int i = C->macro_count(); i > 0; i--) { 3097 Node * n = C->macro_node(i-1); 3098 bool success = false; 3099 debug_only(int old_macro_count = C->macro_count();); 3100 if (n->is_AbstractLock()) { 3101 success = eliminate_locking_node(n->as_AbstractLock()); 3102 } 3103 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); 3104 progress = progress || success; 3105 } 3106 } 3107 // Next, attempt to eliminate allocations 3108 _has_locks = false; 3109 progress = true; 3110 while (progress) { 3111 progress = false; 3112 for (int i = C->macro_count(); i > 0; i--) { 3113 Node * n = C->macro_node(i-1); 3114 bool success = false; 3115 debug_only(int old_macro_count = C->macro_count();); 3116 switch (n->class_id()) { 3117 case Node::Class_Allocate: 3118 case Node::Class_AllocateArray: 3119 success = eliminate_allocate_node(n->as_Allocate()); 3120 break; 3121 case Node::Class_CallStaticJava: 3122 success = eliminate_boxing_node(n->as_CallStaticJava()); 3123 break; 3124 case Node::Class_Lock: 3125 case Node::Class_Unlock: 3126 assert(!n->as_AbstractLock()->is_eliminated(), "sanity"); 3127 _has_locks = true; 3128 break; 3129 case Node::Class_ArrayCopy: 3130 break; 3131 case Node::Class_OuterStripMinedLoop: 3132 break; 3133 case Node::Class_SubTypeCheck: 3134 break; 3135 default: 3136 assert(n->Opcode() == Op_LoopLimit || 3137 n->Opcode() == Op_Opaque1 || 3138 n->Opcode() == Op_Opaque2 || 3139 n->Opcode() == Op_Opaque3 || 3140 BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(n), 3141 "unknown node type in macro list"); 3142 } 3143 assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); 3144 progress = progress || success; 3145 } 3146 } 3147 } 3148 3149 //------------------------------expand_macro_nodes---------------------- 3150 // Returns true if a failure occurred. 3151 bool PhaseMacroExpand::expand_macro_nodes() { 3152 // Last attempt to eliminate macro nodes. 3153 eliminate_macro_nodes(); 3154 3155 // Eliminate Opaque and LoopLimit nodes. Do it after all loop optimizations. 3156 bool progress = true; 3157 while (progress) { 3158 progress = false; 3159 for (int i = C->macro_count(); i > 0; i--) { 3160 Node* n = C->macro_node(i-1); 3161 bool success = false; 3162 debug_only(int old_macro_count = C->macro_count();); 3163 if (n->Opcode() == Op_LoopLimit) { 3164 // Remove it from macro list and put on IGVN worklist to optimize. 3165 C->remove_macro_node(n); 3166 _igvn._worklist.push(n); 3167 success = true; 3168 } else if (n->Opcode() == Op_CallStaticJava) { 3169 // Remove it from macro list and put on IGVN worklist to optimize. 3170 C->remove_macro_node(n); 3171 _igvn._worklist.push(n); 3172 success = true; 3173 } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { 3174 _igvn.replace_node(n, n->in(1)); 3175 success = true; 3176 #if INCLUDE_RTM_OPT 3177 } else if ((n->Opcode() == Op_Opaque3) && ((Opaque3Node*)n)->rtm_opt()) { 3178 assert(C->profile_rtm(), "should be used only in rtm deoptimization code"); 3179 assert((n->outcnt() == 1) && n->unique_out()->is_Cmp(), ""); 3180 Node* cmp = n->unique_out(); 3181 #ifdef ASSERT 3182 // Validate graph. 3183 assert((cmp->outcnt() == 1) && cmp->unique_out()->is_Bool(), ""); 3184 BoolNode* bol = cmp->unique_out()->as_Bool(); 3185 assert((bol->outcnt() == 1) && bol->unique_out()->is_If() && 3186 (bol->_test._test == BoolTest::ne), ""); 3187 IfNode* ifn = bol->unique_out()->as_If(); 3188 assert((ifn->outcnt() == 2) && 3189 ifn->proj_out(1)->is_uncommon_trap_proj(Deoptimization::Reason_rtm_state_change) != NULL, ""); 3190 #endif 3191 Node* repl = n->in(1); 3192 if (!_has_locks) { 3193 // Remove RTM state check if there are no locks in the code. 3194 // Replace input to compare the same value. 3195 repl = (cmp->in(1) == n) ? cmp->in(2) : cmp->in(1); 3196 } 3197 _igvn.replace_node(n, repl); 3198 success = true; 3199 #endif 3200 } else if (n->Opcode() == Op_OuterStripMinedLoop) { 3201 n->as_OuterStripMinedLoop()->adjust_strip_mined_loop(&_igvn); 3202 C->remove_macro_node(n); 3203 success = true; 3204 } 3205 assert(!success || (C->macro_count() == (old_macro_count - 1)), "elimination must have deleted one node from macro list"); 3206 progress = progress || success; 3207 } 3208 } 3209 3210 // Clean up the graph so we're less likely to hit the maximum node 3211 // limit 3212 _igvn.set_delay_transform(false); 3213 _igvn.optimize(); 3214 if (C->failing()) return true; 3215 _igvn.set_delay_transform(true); 3216 3217 3218 // Because we run IGVN after each expansion, some macro nodes may go 3219 // dead and be removed from the list as we iterate over it. Move 3220 // Allocate nodes (processed in a second pass) at the beginning of 3221 // the list and then iterate from the last element of the list until 3222 // an Allocate node is seen. This is robust to random deletion in 3223 // the list due to nodes going dead. 3224 C->sort_macro_nodes(); 3225 3226 // expand arraycopy "macro" nodes first 3227 // For ReduceBulkZeroing, we must first process all arraycopy nodes 3228 // before the allocate nodes are expanded. 3229 while (C->macro_count() > 0) { 3230 int macro_count = C->macro_count(); 3231 Node * n = C->macro_node(macro_count-1); 3232 assert(n->is_macro(), "only macro nodes expected here"); 3233 if (_igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())) { 3234 // node is unreachable, so don't try to expand it 3235 C->remove_macro_node(n); 3236 continue; 3237 } 3238 if (n->is_Allocate()) { 3239 break; 3240 } 3241 // Make sure expansion will not cause node limit to be exceeded. 3242 // Worst case is a macro node gets expanded into about 200 nodes. 3243 // Allow 50% more for optimization. 3244 if (C->check_node_count(300, "out of nodes before macro expansion")) { 3245 return true; 3246 } 3247 3248 debug_only(int old_macro_count = C->macro_count();); 3249 switch (n->class_id()) { 3250 case Node::Class_Lock: 3251 expand_lock_node(n->as_Lock()); 3252 assert(C->macro_count() == (old_macro_count - 1), "expansion must have deleted one node from macro list"); 3253 break; 3254 case Node::Class_Unlock: 3255 expand_unlock_node(n->as_Unlock()); 3256 assert(C->macro_count() == (old_macro_count - 1), "expansion must have deleted one node from macro list"); 3257 break; 3258 case Node::Class_ArrayCopy: 3259 expand_arraycopy_node(n->as_ArrayCopy()); 3260 assert(C->macro_count() == (old_macro_count - 1), "expansion must have deleted one node from macro list"); 3261 break; 3262 case Node::Class_SubTypeCheck: 3263 expand_subtypecheck_node(n->as_SubTypeCheck()); 3264 assert(C->macro_count() == (old_macro_count - 1), "expansion must have deleted one node from macro list"); 3265 break; 3266 default: 3267 assert(false, "unknown node type in macro list"); 3268 } 3269 assert(C->macro_count() < macro_count, "must have deleted a node from macro list"); 3270 if (C->failing()) return true; 3271 3272 // Clean up the graph so we're less likely to hit the maximum node 3273 // limit 3274 _igvn.set_delay_transform(false); 3275 _igvn.optimize(); 3276 if (C->failing()) return true; 3277 _igvn.set_delay_transform(true); 3278 } 3279 3280 for (int i = C->macro_count(); i > 0; i --) { 3281 Node * n = C->macro_node(i-1); 3282 assert(n->is_macro(), "only macro nodes expected here"); 3283 3284 switch (n->class_id()) { 3285 case Node::Class_Allocate: 3286 case Node::Class_AllocateArray: 3287 estimate_stack_allocation_size(n->as_Allocate()); 3288 break; 3289 default: 3290 assert(false, "unknown node type in macro list"); 3291 } 3292 } 3293 3294 // Check to see if stack allocation size is too large before macro expansion 3295 // so we can reject required stack allocations 3296 if (!stack_allocation_location_representable(C->fixed_slots() + C->stack_allocated_slots())) { 3297 C->set_fail_stack_allocation_with_references(true); 3298 } 3299 3300 // All nodes except Allocate nodes are expanded now. There could be 3301 // new optimization opportunities (such as folding newly created 3302 // load from a just allocated object). Run IGVN. 3303 3304 // expand "macro" nodes 3305 // nodes are removed from the macro list as they are processed 3306 while (C->macro_count() > 0) { 3307 int macro_count = C->macro_count(); 3308 Node * n = C->macro_node(macro_count-1); 3309 assert(n->is_macro(), "only macro nodes expected here"); 3310 if (_igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())) { 3311 // node is unreachable, so don't try to expand it 3312 C->remove_macro_node(n); 3313 continue; 3314 } 3315 // Make sure expansion will not cause node limit to be exceeded. 3316 // Worst case is a macro node gets expanded into about 200 nodes. 3317 // Allow 50% more for optimization. 3318 if (C->check_node_count(300, "out of nodes before macro expansion")) { 3319 return true; 3320 } 3321 switch (n->class_id()) { 3322 case Node::Class_Allocate: 3323 if (!stack_allocation(n->as_Allocate())) { 3324 expand_allocate(n->as_Allocate()); 3325 } 3326 break; 3327 case Node::Class_AllocateArray: 3328 if (!stack_allocation(n->as_AllocateArray())) { 3329 expand_allocate_array(n->as_AllocateArray()); 3330 } 3331 break; 3332 default: 3333 assert(false, "unknown node type in macro list"); 3334 } 3335 assert(C->macro_count() < macro_count, "must have deleted a node from macro list"); 3336 if (C->failing()) return true; 3337 3338 // Clean up the graph so we're less likely to hit the maximum node 3339 // limit 3340 _igvn.set_delay_transform(false); 3341 _igvn.optimize(); 3342 if (C->failing()) return true; 3343 _igvn.set_delay_transform(true); 3344 } 3345 3346 _igvn.set_delay_transform(false); 3347 return false; 3348 }