src/hotspot/share/gc/shared/c2/barrierSetC2.cpp
changeset 59025 b398685dd029
parent 58931 304c63b17b07
child 59324 5e8f9713e343
equal deleted inserted replaced
59024:b046ba510bbc 59025:b398685dd029
   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;