comparison src/share/vm/opto/graphKit.cpp @ 10278:6f3fd5150b67

6934604: enable parts of EliminateAutoBox by default Summary: Resurrected autobox elimination code and enabled part of it by default. Reviewed-by: roland, twisti
author kvn
date Wed, 08 May 2013 15:08:01 -0700
parents d50cc62e94ff
children 836a62f43af9 2b3fe74309b6
comparison
equal deleted inserted replaced
10277:aabf54ccedb1 10278:6f3fd5150b67
331 JVMState* ex_jvms = ex_map->_jvms; 331 JVMState* ex_jvms = ex_map->_jvms;
332 assert(ex_jvms->same_calls_as(phi_map->_jvms), "consistent call chains"); 332 assert(ex_jvms->same_calls_as(phi_map->_jvms), "consistent call chains");
333 assert(ex_jvms->stkoff() == phi_map->_jvms->stkoff(), "matching locals"); 333 assert(ex_jvms->stkoff() == phi_map->_jvms->stkoff(), "matching locals");
334 assert(ex_jvms->sp() == phi_map->_jvms->sp(), "matching stack sizes"); 334 assert(ex_jvms->sp() == phi_map->_jvms->sp(), "matching stack sizes");
335 assert(ex_jvms->monoff() == phi_map->_jvms->monoff(), "matching JVMS"); 335 assert(ex_jvms->monoff() == phi_map->_jvms->monoff(), "matching JVMS");
336 assert(ex_jvms->scloff() == phi_map->_jvms->scloff(), "matching scalar replaced objects");
336 assert(ex_map->req() == phi_map->req(), "matching maps"); 337 assert(ex_map->req() == phi_map->req(), "matching maps");
337 uint tos = ex_jvms->stkoff() + ex_jvms->sp(); 338 uint tos = ex_jvms->stkoff() + ex_jvms->sp();
338 Node* hidden_merge_mark = root(); 339 Node* hidden_merge_mark = root();
339 Node* region = phi_map->control(); 340 Node* region = phi_map->control();
340 MergeMemNode* phi_mem = phi_map->merged_memory(); 341 MergeMemNode* phi_mem = phi_map->merged_memory();
407 phi_map->set_req(i, dst); 408 phi_map->set_req(i, dst);
408 // Prepare to append interesting stuff onto the new phi: 409 // Prepare to append interesting stuff onto the new phi:
409 while (dst->req() > orig_width) dst->del_req(dst->req()-1); 410 while (dst->req() > orig_width) dst->del_req(dst->req()-1);
410 } else { 411 } else {
411 assert(dst->is_Phi(), "nobody else uses a hidden region"); 412 assert(dst->is_Phi(), "nobody else uses a hidden region");
412 phi = (PhiNode*)dst; 413 phi = dst->as_Phi();
413 } 414 }
414 if (add_multiple && src->in(0) == ex_control) { 415 if (add_multiple && src->in(0) == ex_control) {
415 // Both are phis. 416 // Both are phis.
416 add_n_reqs(dst, src); 417 add_n_reqs(dst, src);
417 } else { 418 } else {
1436 if (require_atomic_access && bt == T_LONG) { 1437 if (require_atomic_access && bt == T_LONG) {
1437 ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t); 1438 ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t);
1438 } else { 1439 } else {
1439 ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt); 1440 ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt);
1440 } 1441 }
1441 return _gvn.transform(ld); 1442 ld = _gvn.transform(ld);
1443 if ((bt == T_OBJECT) && C->do_escape_analysis() || C->eliminate_boxing()) {
1444 // Improve graph before escape analysis and boxing elimination.
1445 record_for_igvn(ld);
1446 }
1447 return ld;
1442 } 1448 }
1443 1449
1444 Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt, 1450 Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt,
1445 int adr_idx, 1451 int adr_idx,
1446 bool require_atomic_access) { 1452 bool require_atomic_access) {
3142 // since GC and deoptimization can happened. 3148 // since GC and deoptimization can happened.
3143 Node *mem = reset_memory(); 3149 Node *mem = reset_memory();
3144 set_all_memory(mem); // Create new memory state 3150 set_all_memory(mem); // Create new memory state
3145 3151
3146 AllocateNode* alloc 3152 AllocateNode* alloc
3147 = new (C) AllocateNode(C, AllocateNode::alloc_type(), 3153 = new (C) AllocateNode(C, AllocateNode::alloc_type(Type::TOP),
3148 control(), mem, i_o(), 3154 control(), mem, i_o(),
3149 size, klass_node, 3155 size, klass_node,
3150 initial_slow_test); 3156 initial_slow_test);
3151 3157
3152 return set_output_for_allocation(alloc, oop_type); 3158 return set_output_for_allocation(alloc, oop_type);
3283 Node *mem = reset_memory(); 3289 Node *mem = reset_memory();
3284 set_all_memory(mem); // Create new memory state 3290 set_all_memory(mem); // Create new memory state
3285 3291
3286 // Create the AllocateArrayNode and its result projections 3292 // Create the AllocateArrayNode and its result projections
3287 AllocateArrayNode* alloc 3293 AllocateArrayNode* alloc
3288 = new (C) AllocateArrayNode(C, AllocateArrayNode::alloc_type(), 3294 = new (C) AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT),
3289 control(), mem, i_o(), 3295 control(), mem, i_o(),
3290 size, klass_node, 3296 size, klass_node,
3291 initial_slow_test, 3297 initial_slow_test,
3292 length); 3298 length);
3293 3299
3324 // Given an oop pointer or raw pointer, see if it feeds from an AllocateNode. 3330 // Given an oop pointer or raw pointer, see if it feeds from an AllocateNode.
3325 AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase) { 3331 AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase) {
3326 if (ptr == NULL) { // reduce dumb test in callers 3332 if (ptr == NULL) { // reduce dumb test in callers
3327 return NULL; 3333 return NULL;
3328 } 3334 }
3329 if (ptr->is_CheckCastPP()) { // strip a raw-to-oop cast 3335 ptr = ptr->uncast(); // strip a raw-to-oop cast
3330 ptr = ptr->in(1); 3336 if (ptr == NULL) return NULL;
3331 if (ptr == NULL) return NULL; 3337
3332 }
3333 if (ptr->is_Proj()) { 3338 if (ptr->is_Proj()) {
3334 Node* allo = ptr->in(0); 3339 Node* allo = ptr->in(0);
3335 if (allo != NULL && allo->is_Allocate()) { 3340 if (allo != NULL && allo->is_Allocate()) {
3336 return allo->as_Allocate(); 3341 return allo->as_Allocate();
3337 } 3342 }
3367 for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) { 3372 for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) {
3368 Node* init = rawoop->fast_out(i); 3373 Node* init = rawoop->fast_out(i);
3369 if (init->is_Initialize()) { 3374 if (init->is_Initialize()) {
3370 assert(init->as_Initialize()->allocation() == this, "2-way link"); 3375 assert(init->as_Initialize()->allocation() == this, "2-way link");
3371 return init->as_Initialize(); 3376 return init->as_Initialize();
3372 }
3373 }
3374 return NULL;
3375 }
3376
3377 // Trace Allocate -> Proj[Parm] -> MemBarStoreStore
3378 MemBarStoreStoreNode* AllocateNode::storestore() {
3379 ProjNode* rawoop = proj_out(AllocateNode::RawAddress);
3380 if (rawoop == NULL) return NULL;
3381 for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) {
3382 Node* storestore = rawoop->fast_out(i);
3383 if (storestore->is_MemBarStoreStore()) {
3384 return storestore->as_MemBarStoreStore();
3385 } 3377 }
3386 } 3378 }
3387 return NULL; 3379 return NULL;
3388 } 3380 }
3389 3381