hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
changeset 11886 feebf5c9f40c
parent 11787 cfb5950b7706
child 12106 5a4af5175bd3
equal deleted inserted replaced
11885:b81164faebae 11886:feebf5c9f40c
  1416   if (RegisterFinalizersAtInit &&
  1416   if (RegisterFinalizersAtInit &&
  1417       method()->intrinsic_id() == vmIntrinsics::_Object_init) {
  1417       method()->intrinsic_id() == vmIntrinsics::_Object_init) {
  1418     call_register_finalizer();
  1418     call_register_finalizer();
  1419   }
  1419   }
  1420 
  1420 
       
  1421   bool need_mem_bar = false;
       
  1422   if (method()->name() == ciSymbol::object_initializer_name() &&
       
  1423       scope()->wrote_final()) {
       
  1424     need_mem_bar = true;
       
  1425   }
       
  1426 
  1421   // Check to see whether we are inlining. If so, Return
  1427   // Check to see whether we are inlining. If so, Return
  1422   // instructions become Gotos to the continuation point.
  1428   // instructions become Gotos to the continuation point.
  1423   if (continuation() != NULL) {
  1429   if (continuation() != NULL) {
  1424     assert(!method()->is_synchronized() || InlineSynchronizedMethods, "can not inline synchronized methods yet");
  1430     assert(!method()->is_synchronized() || InlineSynchronizedMethods, "can not inline synchronized methods yet");
  1425 
  1431 
  1433     // If the inlined method is synchronized, the monitor must be
  1439     // If the inlined method is synchronized, the monitor must be
  1434     // released before we jump to the continuation block.
  1440     // released before we jump to the continuation block.
  1435     if (method()->is_synchronized()) {
  1441     if (method()->is_synchronized()) {
  1436       assert(state()->locks_size() == 1, "receiver must be locked here");
  1442       assert(state()->locks_size() == 1, "receiver must be locked here");
  1437       monitorexit(state()->lock_at(0), SynchronizationEntryBCI);
  1443       monitorexit(state()->lock_at(0), SynchronizationEntryBCI);
       
  1444     }
       
  1445 
       
  1446     if (need_mem_bar) {
       
  1447       append(new MemBar(lir_membar_storestore));
  1438     }
  1448     }
  1439 
  1449 
  1440     // State at end of inlined method is the state of the caller
  1450     // State at end of inlined method is the state of the caller
  1441     // without the method parameters on stack, including the
  1451     // without the method parameters on stack, including the
  1442     // return value, if any, of the inlined method on operand stack.
  1452     // return value, if any, of the inlined method on operand stack.
  1454 
  1464 
  1455     // The current bci() is in the wrong scope, so use the bci() of
  1465     // The current bci() is in the wrong scope, so use the bci() of
  1456     // the continuation point.
  1466     // the continuation point.
  1457     append_with_bci(goto_callee, scope_data()->continuation()->bci());
  1467     append_with_bci(goto_callee, scope_data()->continuation()->bci());
  1458     incr_num_returns();
  1468     incr_num_returns();
  1459 
       
  1460     return;
  1469     return;
  1461   }
  1470   }
  1462 
  1471 
  1463   state()->truncate_stack(0);
  1472   state()->truncate_stack(0);
  1464   if (method()->is_synchronized()) {
  1473   if (method()->is_synchronized()) {
  1468       receiver = _initial_state->local_at(0);
  1477       receiver = _initial_state->local_at(0);
  1469     } else {
  1478     } else {
  1470       receiver = append(new Constant(new ClassConstant(method()->holder())));
  1479       receiver = append(new Constant(new ClassConstant(method()->holder())));
  1471     }
  1480     }
  1472     append_split(new MonitorExit(receiver, state()->unlock()));
  1481     append_split(new MonitorExit(receiver, state()->unlock()));
       
  1482   }
       
  1483 
       
  1484   if (need_mem_bar) {
       
  1485       append(new MemBar(lir_membar_storestore));
  1473   }
  1486   }
  1474 
  1487 
  1475   append(new Return(x));
  1488   append(new Return(x));
  1476 }
  1489 }
  1477 
  1490 
  1502     } else {
  1515     } else {
  1503       obj = new Constant(new InstanceConstant(holder->java_mirror()));
  1516       obj = new Constant(new InstanceConstant(holder->java_mirror()));
  1504     }
  1517     }
  1505   }
  1518   }
  1506 
  1519 
       
  1520   if (field->is_final() && (code == Bytecodes::_putfield)) {
       
  1521     scope()->set_wrote_final();
       
  1522   }
  1507 
  1523 
  1508   const int offset = !needs_patching ? field->offset() : -1;
  1524   const int offset = !needs_patching ? field->offset() : -1;
  1509   switch (code) {
  1525   switch (code) {
  1510     case Bytecodes::_getstatic: {
  1526     case Bytecodes::_getstatic: {
  1511       // check for compile-time constants, i.e., initialized static final fields
  1527       // check for compile-time constants, i.e., initialized static final fields