147 C2ParseAccess& parse_access = static_cast<C2ParseAccess&>(access); |
147 C2ParseAccess& parse_access = static_cast<C2ParseAccess&>(access); |
148 GraphKit* kit = parse_access.kit(); |
148 GraphKit* kit = parse_access.kit(); |
149 Node* control = control_dependent ? kit->control() : NULL; |
149 Node* control = control_dependent ? kit->control() : NULL; |
150 |
150 |
151 if (in_native) { |
151 if (in_native) { |
152 load = kit->make_load(control, adr, val_type, access.type(), mo); |
152 load = kit->make_load(control, adr, val_type, access.type(), mo, dep, |
|
153 requires_atomic_access, unaligned, |
|
154 mismatched, unsafe, access.barrier_data()); |
153 } else { |
155 } else { |
154 load = kit->make_load(control, adr, val_type, access.type(), adr_type, mo, |
156 load = kit->make_load(control, adr, val_type, access.type(), adr_type, mo, |
155 dep, requires_atomic_access, unaligned, mismatched, unsafe); |
157 dep, requires_atomic_access, unaligned, mismatched, unsafe, |
|
158 access.barrier_data()); |
156 } |
159 } |
157 } else { |
160 } else { |
158 assert(!requires_atomic_access, "not yet supported"); |
161 assert(!requires_atomic_access, "not yet supported"); |
159 assert(access.is_opt_access(), "either parse or opt access"); |
162 assert(access.is_opt_access(), "either parse or opt access"); |
160 C2OptAccess& opt_access = static_cast<C2OptAccess&>(access); |
163 C2OptAccess& opt_access = static_cast<C2OptAccess&>(access); |
161 Node* control = control_dependent ? opt_access.ctl() : NULL; |
164 Node* control = control_dependent ? opt_access.ctl() : NULL; |
162 MergeMemNode* mm = opt_access.mem(); |
165 MergeMemNode* mm = opt_access.mem(); |
163 PhaseGVN& gvn = opt_access.gvn(); |
166 PhaseGVN& gvn = opt_access.gvn(); |
164 Node* mem = mm->memory_at(gvn.C->get_alias_index(adr_type)); |
167 Node* mem = mm->memory_at(gvn.C->get_alias_index(adr_type)); |
165 load = LoadNode::make(gvn, control, mem, adr, adr_type, val_type, access.type(), mo, dep, unaligned, mismatched); |
168 load = LoadNode::make(gvn, control, mem, adr, adr_type, val_type, access.type(), mo, |
|
169 dep, unaligned, mismatched, unsafe, access.barrier_data()); |
166 load = gvn.transform(load); |
170 load = gvn.transform(load); |
167 } |
171 } |
168 access.set_raw_access(load); |
172 access.set_raw_access(load); |
169 |
173 |
170 return load; |
174 return load; |
407 if (access.is_oop()) { |
411 if (access.is_oop()) { |
408 #ifdef _LP64 |
412 #ifdef _LP64 |
409 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
413 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
410 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
414 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
411 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
415 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
412 load_store = kit->gvn().transform(new CompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo)); |
416 load_store = new CompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo); |
413 } else |
417 } else |
414 #endif |
418 #endif |
415 { |
419 { |
416 load_store = kit->gvn().transform(new CompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo)); |
420 load_store = new CompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo); |
417 } |
421 } |
418 } else { |
422 } else { |
419 switch (access.type()) { |
423 switch (access.type()) { |
420 case T_BYTE: { |
424 case T_BYTE: { |
421 load_store = kit->gvn().transform(new CompareAndExchangeBNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo)); |
425 load_store = new CompareAndExchangeBNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo); |
422 break; |
426 break; |
423 } |
427 } |
424 case T_SHORT: { |
428 case T_SHORT: { |
425 load_store = kit->gvn().transform(new CompareAndExchangeSNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo)); |
429 load_store = new CompareAndExchangeSNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo); |
426 break; |
430 break; |
427 } |
431 } |
428 case T_INT: { |
432 case T_INT: { |
429 load_store = kit->gvn().transform(new CompareAndExchangeINode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo)); |
433 load_store = new CompareAndExchangeINode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo); |
430 break; |
434 break; |
431 } |
435 } |
432 case T_LONG: { |
436 case T_LONG: { |
433 load_store = kit->gvn().transform(new CompareAndExchangeLNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo)); |
437 load_store = new CompareAndExchangeLNode(kit->control(), mem, adr, new_val, expected_val, adr_type, mo); |
434 break; |
438 break; |
435 } |
439 } |
436 default: |
440 default: |
437 ShouldNotReachHere(); |
441 ShouldNotReachHere(); |
438 } |
442 } |
439 } |
443 } |
|
444 |
|
445 load_store->as_LoadStore()->set_barrier_data(access.barrier_data()); |
|
446 load_store = kit->gvn().transform(load_store); |
440 |
447 |
441 access.set_raw_access(load_store); |
448 access.set_raw_access(load_store); |
442 pin_atomic_op(access); |
449 pin_atomic_op(access); |
443 |
450 |
444 #ifdef _LP64 |
451 #ifdef _LP64 |
464 #ifdef _LP64 |
471 #ifdef _LP64 |
465 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
472 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
466 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
473 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
467 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
474 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
468 if (is_weak_cas) { |
475 if (is_weak_cas) { |
469 load_store = kit->gvn().transform(new WeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
476 load_store = new WeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo); |
470 } else { |
477 } else { |
471 load_store = kit->gvn().transform(new CompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
478 load_store = new CompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo); |
472 } |
479 } |
473 } else |
480 } else |
474 #endif |
481 #endif |
475 { |
482 { |
476 if (is_weak_cas) { |
483 if (is_weak_cas) { |
477 load_store = kit->gvn().transform(new WeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
484 load_store = new WeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo); |
478 } else { |
485 } else { |
479 load_store = kit->gvn().transform(new CompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
486 load_store = new CompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo); |
480 } |
487 } |
481 } |
488 } |
482 } else { |
489 } else { |
483 switch(access.type()) { |
490 switch(access.type()) { |
484 case T_BYTE: { |
491 case T_BYTE: { |
485 if (is_weak_cas) { |
492 if (is_weak_cas) { |
486 load_store = kit->gvn().transform(new WeakCompareAndSwapBNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
493 load_store = new WeakCompareAndSwapBNode(kit->control(), mem, adr, new_val, expected_val, mo); |
487 } else { |
494 } else { |
488 load_store = kit->gvn().transform(new CompareAndSwapBNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
495 load_store = new CompareAndSwapBNode(kit->control(), mem, adr, new_val, expected_val, mo); |
489 } |
496 } |
490 break; |
497 break; |
491 } |
498 } |
492 case T_SHORT: { |
499 case T_SHORT: { |
493 if (is_weak_cas) { |
500 if (is_weak_cas) { |
494 load_store = kit->gvn().transform(new WeakCompareAndSwapSNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
501 load_store = new WeakCompareAndSwapSNode(kit->control(), mem, adr, new_val, expected_val, mo); |
495 } else { |
502 } else { |
496 load_store = kit->gvn().transform(new CompareAndSwapSNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
503 load_store = new CompareAndSwapSNode(kit->control(), mem, adr, new_val, expected_val, mo); |
497 } |
504 } |
498 break; |
505 break; |
499 } |
506 } |
500 case T_INT: { |
507 case T_INT: { |
501 if (is_weak_cas) { |
508 if (is_weak_cas) { |
502 load_store = kit->gvn().transform(new WeakCompareAndSwapINode(kit->control(), mem, adr, new_val, expected_val, mo)); |
509 load_store = new WeakCompareAndSwapINode(kit->control(), mem, adr, new_val, expected_val, mo); |
503 } else { |
510 } else { |
504 load_store = kit->gvn().transform(new CompareAndSwapINode(kit->control(), mem, adr, new_val, expected_val, mo)); |
511 load_store = new CompareAndSwapINode(kit->control(), mem, adr, new_val, expected_val, mo); |
505 } |
512 } |
506 break; |
513 break; |
507 } |
514 } |
508 case T_LONG: { |
515 case T_LONG: { |
509 if (is_weak_cas) { |
516 if (is_weak_cas) { |
510 load_store = kit->gvn().transform(new WeakCompareAndSwapLNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
517 load_store = new WeakCompareAndSwapLNode(kit->control(), mem, adr, new_val, expected_val, mo); |
511 } else { |
518 } else { |
512 load_store = kit->gvn().transform(new CompareAndSwapLNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
519 load_store = new CompareAndSwapLNode(kit->control(), mem, adr, new_val, expected_val, mo); |
513 } |
520 } |
514 break; |
521 break; |
515 } |
522 } |
516 default: |
523 default: |
517 ShouldNotReachHere(); |
524 ShouldNotReachHere(); |
518 } |
525 } |
519 } |
526 } |
|
527 |
|
528 load_store->as_LoadStore()->set_barrier_data(access.barrier_data()); |
|
529 load_store = kit->gvn().transform(load_store); |
520 |
530 |
521 access.set_raw_access(load_store); |
531 access.set_raw_access(load_store); |
522 pin_atomic_op(access); |
532 pin_atomic_op(access); |
523 |
533 |
524 return load_store; |
534 return load_store; |
537 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
547 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
538 load_store = kit->gvn().transform(new GetAndSetNNode(kit->control(), mem, adr, newval_enc, adr_type, value_type->make_narrowoop())); |
548 load_store = kit->gvn().transform(new GetAndSetNNode(kit->control(), mem, adr, newval_enc, adr_type, value_type->make_narrowoop())); |
539 } else |
549 } else |
540 #endif |
550 #endif |
541 { |
551 { |
542 load_store = kit->gvn().transform(new GetAndSetPNode(kit->control(), mem, adr, new_val, adr_type, value_type->is_oopptr())); |
552 load_store = new GetAndSetPNode(kit->control(), mem, adr, new_val, adr_type, value_type->is_oopptr()); |
543 } |
553 } |
544 } else { |
554 } else { |
545 switch (access.type()) { |
555 switch (access.type()) { |
546 case T_BYTE: |
556 case T_BYTE: |
547 load_store = kit->gvn().transform(new GetAndSetBNode(kit->control(), mem, adr, new_val, adr_type)); |
557 load_store = new GetAndSetBNode(kit->control(), mem, adr, new_val, adr_type); |
548 break; |
558 break; |
549 case T_SHORT: |
559 case T_SHORT: |
550 load_store = kit->gvn().transform(new GetAndSetSNode(kit->control(), mem, adr, new_val, adr_type)); |
560 load_store = new GetAndSetSNode(kit->control(), mem, adr, new_val, adr_type); |
551 break; |
561 break; |
552 case T_INT: |
562 case T_INT: |
553 load_store = kit->gvn().transform(new GetAndSetINode(kit->control(), mem, adr, new_val, adr_type)); |
563 load_store = new GetAndSetINode(kit->control(), mem, adr, new_val, adr_type); |
554 break; |
564 break; |
555 case T_LONG: |
565 case T_LONG: |
556 load_store = kit->gvn().transform(new GetAndSetLNode(kit->control(), mem, adr, new_val, adr_type)); |
566 load_store = new GetAndSetLNode(kit->control(), mem, adr, new_val, adr_type); |
557 break; |
567 break; |
558 default: |
568 default: |
559 ShouldNotReachHere(); |
569 ShouldNotReachHere(); |
560 } |
570 } |
561 } |
571 } |
|
572 |
|
573 load_store->as_LoadStore()->set_barrier_data(access.barrier_data()); |
|
574 load_store = kit->gvn().transform(load_store); |
562 |
575 |
563 access.set_raw_access(load_store); |
576 access.set_raw_access(load_store); |
564 pin_atomic_op(access); |
577 pin_atomic_op(access); |
565 |
578 |
566 #ifdef _LP64 |
579 #ifdef _LP64 |
579 const TypePtr* adr_type = access.addr().type(); |
592 const TypePtr* adr_type = access.addr().type(); |
580 Node* mem = access.memory(); |
593 Node* mem = access.memory(); |
581 |
594 |
582 switch(access.type()) { |
595 switch(access.type()) { |
583 case T_BYTE: |
596 case T_BYTE: |
584 load_store = kit->gvn().transform(new GetAndAddBNode(kit->control(), mem, adr, new_val, adr_type)); |
597 load_store = new GetAndAddBNode(kit->control(), mem, adr, new_val, adr_type); |
585 break; |
598 break; |
586 case T_SHORT: |
599 case T_SHORT: |
587 load_store = kit->gvn().transform(new GetAndAddSNode(kit->control(), mem, adr, new_val, adr_type)); |
600 load_store = new GetAndAddSNode(kit->control(), mem, adr, new_val, adr_type); |
588 break; |
601 break; |
589 case T_INT: |
602 case T_INT: |
590 load_store = kit->gvn().transform(new GetAndAddINode(kit->control(), mem, adr, new_val, adr_type)); |
603 load_store = new GetAndAddINode(kit->control(), mem, adr, new_val, adr_type); |
591 break; |
604 break; |
592 case T_LONG: |
605 case T_LONG: |
593 load_store = kit->gvn().transform(new GetAndAddLNode(kit->control(), mem, adr, new_val, adr_type)); |
606 load_store = new GetAndAddLNode(kit->control(), mem, adr, new_val, adr_type); |
594 break; |
607 break; |
595 default: |
608 default: |
596 ShouldNotReachHere(); |
609 ShouldNotReachHere(); |
597 } |
610 } |
|
611 |
|
612 load_store->as_LoadStore()->set_barrier_data(access.barrier_data()); |
|
613 load_store = kit->gvn().transform(load_store); |
598 |
614 |
599 access.set_raw_access(load_store); |
615 access.set_raw_access(load_store); |
600 pin_atomic_op(access); |
616 pin_atomic_op(access); |
601 |
617 |
602 return load_store; |
618 return load_store; |