src/share/vm/shark/sharkTopLevelBlock.cpp

Wed, 11 Aug 2010 05:51:21 -0700

author
twisti
date
Wed, 11 Aug 2010 05:51:21 -0700
changeset 2047
d2ede61b7a12
child 2314
f95d63e2154a
permissions
-rw-r--r--

6976186: integrate Shark HotSpot changes
Summary: Shark is a JIT compiler for Zero that uses the LLVM compiler infrastructure.
Reviewed-by: kvn, twisti
Contributed-by: Gary Benson <gbenson@redhat.com>

     1 /*
     2  * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
     3  * Copyright 2008, 2009, 2010 Red Hat, Inc.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5  *
     6  * This code is free software; you can redistribute it and/or modify it
     7  * under the terms of the GNU General Public License version 2 only, as
     8  * published by the Free Software Foundation.
     9  *
    10  * This code is distributed in the hope that it will be useful, but WITHOUT
    11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    13  * version 2 for more details (a copy is included in the LICENSE file that
    14  * accompanied this code).
    15  *
    16  * You should have received a copy of the GNU General Public License version
    17  * 2 along with this work; if not, write to the Free Software Foundation,
    18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    19  *
    20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    21  * or visit www.oracle.com if you need additional information or have any
    22  * questions.
    23  *
    24  */
    26 #include "incls/_precompiled.incl"
    27 #include "incls/_sharkTopLevelBlock.cpp.incl"
    29 using namespace llvm;
    31 void SharkTopLevelBlock::scan_for_traps() {
    32   // If typeflow found a trap then don't scan past it
    33   int limit_bci = ciblock()->has_trap() ? ciblock()->trap_bci() : limit();
    35   // Scan the bytecode for traps that are always hit
    36   iter()->reset_to_bci(start());
    37   while (iter()->next_bci() < limit_bci) {
    38     iter()->next();
    40     ciField *field;
    41     ciMethod *method;
    42     ciInstanceKlass *klass;
    43     bool will_link;
    44     bool is_field;
    46     switch (bc()) {
    47     case Bytecodes::_ldc:
    48     case Bytecodes::_ldc_w:
    49       if (!SharkConstant::for_ldc(iter())->is_loaded()) {
    50         set_trap(
    51           Deoptimization::make_trap_request(
    52             Deoptimization::Reason_uninitialized,
    53             Deoptimization::Action_reinterpret), bci());
    54         return;
    55       }
    56       break;
    58     case Bytecodes::_getfield:
    59     case Bytecodes::_getstatic:
    60     case Bytecodes::_putfield:
    61     case Bytecodes::_putstatic:
    62       field = iter()->get_field(will_link);
    63       assert(will_link, "typeflow responsibility");
    64       is_field = (bc() == Bytecodes::_getfield || bc() == Bytecodes::_putfield);
    66       // If the bytecode does not match the field then bail out to
    67       // the interpreter to throw an IncompatibleClassChangeError
    68       if (is_field == field->is_static()) {
    69         set_trap(
    70           Deoptimization::make_trap_request(
    71             Deoptimization::Reason_unhandled,
    72             Deoptimization::Action_none), bci());
    73         return;
    74       }
    76       // Bail out if we are trying to access a static variable
    77       // before the class initializer has completed.
    78       if (!is_field && !field->holder()->is_initialized()) {
    79         if (!static_field_ok_in_clinit(field)) {
    80           set_trap(
    81             Deoptimization::make_trap_request(
    82               Deoptimization::Reason_uninitialized,
    83               Deoptimization::Action_reinterpret), bci());
    84           return;
    85         }
    86       }
    87       break;
    89     case Bytecodes::_invokestatic:
    90     case Bytecodes::_invokespecial:
    91     case Bytecodes::_invokevirtual:
    92     case Bytecodes::_invokeinterface:
    93       method = iter()->get_method(will_link);
    94       assert(will_link, "typeflow responsibility");
    96       if (!method->holder()->is_linked()) {
    97         set_trap(
    98           Deoptimization::make_trap_request(
    99             Deoptimization::Reason_uninitialized,
   100             Deoptimization::Action_reinterpret), bci());
   101           return;
   102       }
   104       if (bc() == Bytecodes::_invokevirtual) {
   105         klass = ciEnv::get_instance_klass_for_declared_method_holder(
   106           iter()->get_declared_method_holder());
   107         if (!klass->is_linked()) {
   108           set_trap(
   109             Deoptimization::make_trap_request(
   110               Deoptimization::Reason_uninitialized,
   111               Deoptimization::Action_reinterpret), bci());
   112             return;
   113         }
   114       }
   115       break;
   117     case Bytecodes::_new:
   118       klass = iter()->get_klass(will_link)->as_instance_klass();
   119       assert(will_link, "typeflow responsibility");
   121       // Bail out if the class is unloaded
   122       if (iter()->is_unresolved_klass() || !klass->is_initialized()) {
   123         set_trap(
   124           Deoptimization::make_trap_request(
   125             Deoptimization::Reason_uninitialized,
   126             Deoptimization::Action_reinterpret), bci());
   127         return;
   128       }
   130       // Bail out if the class cannot be instantiated
   131       if (klass->is_abstract() || klass->is_interface() ||
   132           klass->name() == ciSymbol::java_lang_Class()) {
   133         set_trap(
   134           Deoptimization::make_trap_request(
   135             Deoptimization::Reason_unhandled,
   136             Deoptimization::Action_reinterpret), bci());
   137         return;
   138       }
   139       break;
   140     }
   141   }
   143   // Trap if typeflow trapped (and we didn't before)
   144   if (ciblock()->has_trap()) {
   145     set_trap(
   146       Deoptimization::make_trap_request(
   147         Deoptimization::Reason_unloaded,
   148         Deoptimization::Action_reinterpret,
   149         ciblock()->trap_index()), ciblock()->trap_bci());
   150     return;
   151   }
   152 }
   154 bool SharkTopLevelBlock::static_field_ok_in_clinit(ciField* field) {
   155   assert(field->is_static(), "should be");
   157   // This code is lifted pretty much verbatim from C2's
   158   // Parse::static_field_ok_in_clinit() in parse3.cpp.
   159   bool access_OK = false;
   160   if (target()->holder()->is_subclass_of(field->holder())) {
   161     if (target()->is_static()) {
   162       if (target()->name() == ciSymbol::class_initializer_name()) {
   163         // It's OK to access static fields from the class initializer
   164         access_OK = true;
   165       }
   166     }
   167     else {
   168       if (target()->name() == ciSymbol::object_initializer_name()) {
   169         // It's also OK to access static fields inside a constructor,
   170         // because any thread calling the constructor must first have
   171         // synchronized on the class by executing a "new" bytecode.
   172         access_OK = true;
   173       }
   174     }
   175   }
   176   return access_OK;
   177 }
   179 SharkState* SharkTopLevelBlock::entry_state() {
   180   if (_entry_state == NULL) {
   181     assert(needs_phis(), "should do");
   182     _entry_state = new SharkPHIState(this);
   183   }
   184   return _entry_state;
   185 }
   187 void SharkTopLevelBlock::add_incoming(SharkState* incoming_state) {
   188   if (needs_phis()) {
   189     ((SharkPHIState *) entry_state())->add_incoming(incoming_state);
   190   }
   191   else if (_entry_state == NULL) {
   192     _entry_state = incoming_state;
   193   }
   194   else {
   195     assert(entry_state()->equal_to(incoming_state), "should be");
   196   }
   197 }
   199 void SharkTopLevelBlock::enter(SharkTopLevelBlock* predecessor,
   200                                bool is_exception) {
   201   // This block requires phis:
   202   //  - if it is entered more than once
   203   //  - if it is an exception handler, because in which
   204   //    case we assume it's entered more than once.
   205   //  - if the predecessor will be compiled after this
   206   //    block, in which case we can't simple propagate
   207   //    the state forward.
   208   if (!needs_phis() &&
   209       (entered() ||
   210        is_exception ||
   211        (predecessor && predecessor->index() >= index())))
   212     _needs_phis = true;
   214   // Recurse into the tree
   215   if (!entered()) {
   216     _entered = true;
   218     scan_for_traps();
   219     if (!has_trap()) {
   220       for (int i = 0; i < num_successors(); i++) {
   221         successor(i)->enter(this, false);
   222       }
   223     }
   224     compute_exceptions();
   225     for (int i = 0; i < num_exceptions(); i++) {
   226       SharkTopLevelBlock *handler = exception(i);
   227       if (handler)
   228         handler->enter(this, true);
   229     }
   230   }
   231 }
   233 void SharkTopLevelBlock::initialize() {
   234   char name[28];
   235   snprintf(name, sizeof(name),
   236            "bci_%d%s",
   237            start(), is_backedge_copy() ? "_backedge_copy" : "");
   238   _entry_block = function()->CreateBlock(name);
   239 }
   241 void SharkTopLevelBlock::decache_for_Java_call(ciMethod *callee) {
   242   SharkJavaCallDecacher(function(), bci(), callee).scan(current_state());
   243   for (int i = 0; i < callee->arg_size(); i++)
   244     xpop();
   245 }
   247 void SharkTopLevelBlock::cache_after_Java_call(ciMethod *callee) {
   248   if (callee->return_type()->size()) {
   249     ciType *type;
   250     switch (callee->return_type()->basic_type()) {
   251     case T_BOOLEAN:
   252     case T_BYTE:
   253     case T_CHAR:
   254     case T_SHORT:
   255       type = ciType::make(T_INT);
   256       break;
   258     default:
   259       type = callee->return_type();
   260     }
   262     push(SharkValue::create_generic(type, NULL, false));
   263   }
   264   SharkJavaCallCacher(function(), callee).scan(current_state());
   265 }
   267 void SharkTopLevelBlock::decache_for_VM_call() {
   268   SharkVMCallDecacher(function(), bci()).scan(current_state());
   269 }
   271 void SharkTopLevelBlock::cache_after_VM_call() {
   272   SharkVMCallCacher(function()).scan(current_state());
   273 }
   275 void SharkTopLevelBlock::decache_for_trap() {
   276   SharkTrapDecacher(function(), bci()).scan(current_state());
   277 }
   279 void SharkTopLevelBlock::emit_IR() {
   280   builder()->SetInsertPoint(entry_block());
   282   // Parse the bytecode
   283   parse_bytecode(start(), limit());
   285   // If this block falls through to the next then it won't have been
   286   // terminated by a bytecode and we have to add the branch ourselves
   287   if (falls_through() && !has_trap())
   288     do_branch(ciTypeFlow::FALL_THROUGH);
   289 }
   291 SharkTopLevelBlock* SharkTopLevelBlock::bci_successor(int bci) const {
   292   // XXX now with Linear Search Technology (tm)
   293   for (int i = 0; i < num_successors(); i++) {
   294     ciTypeFlow::Block *successor = ciblock()->successors()->at(i);
   295     if (successor->start() == bci)
   296       return function()->block(successor->pre_order());
   297   }
   298   ShouldNotReachHere();
   299 }
   301 void SharkTopLevelBlock::do_zero_check(SharkValue *value) {
   302   if (value->is_phi() && value->as_phi()->all_incomers_zero_checked()) {
   303     function()->add_deferred_zero_check(this, value);
   304   }
   305   else {
   306     BasicBlock *continue_block = function()->CreateBlock("not_zero");
   307     SharkState *saved_state = current_state();
   308     set_current_state(saved_state->copy());
   309     zero_check_value(value, continue_block);
   310     builder()->SetInsertPoint(continue_block);
   311     set_current_state(saved_state);
   312   }
   314   value->set_zero_checked(true);
   315 }
   317 void SharkTopLevelBlock::do_deferred_zero_check(SharkValue* value,
   318                                                 int         bci,
   319                                                 SharkState* saved_state,
   320                                                 BasicBlock* continue_block) {
   321   if (value->as_phi()->all_incomers_zero_checked()) {
   322     builder()->CreateBr(continue_block);
   323   }
   324   else {
   325     iter()->force_bci(start());
   326     set_current_state(saved_state);
   327     zero_check_value(value, continue_block);
   328   }
   329 }
   331 void SharkTopLevelBlock::zero_check_value(SharkValue* value,
   332                                           BasicBlock* continue_block) {
   333   BasicBlock *zero_block = builder()->CreateBlock(continue_block, "zero");
   335   Value *a, *b;
   336   switch (value->basic_type()) {
   337   case T_BYTE:
   338   case T_CHAR:
   339   case T_SHORT:
   340   case T_INT:
   341     a = value->jint_value();
   342     b = LLVMValue::jint_constant(0);
   343     break;
   344   case T_LONG:
   345     a = value->jlong_value();
   346     b = LLVMValue::jlong_constant(0);
   347     break;
   348   case T_OBJECT:
   349   case T_ARRAY:
   350     a = value->jobject_value();
   351     b = LLVMValue::LLVMValue::null();
   352     break;
   353   default:
   354     tty->print_cr("Unhandled type %s", type2name(value->basic_type()));
   355     ShouldNotReachHere();
   356   }
   358   builder()->CreateCondBr(
   359     builder()->CreateICmpNE(a, b), continue_block, zero_block);
   361   builder()->SetInsertPoint(zero_block);
   362   if (value->is_jobject()) {
   363     call_vm(
   364       builder()->throw_NullPointerException(),
   365       builder()->CreateIntToPtr(
   366         LLVMValue::intptr_constant((intptr_t) __FILE__),
   367         PointerType::getUnqual(SharkType::jbyte_type())),
   368       LLVMValue::jint_constant(__LINE__),
   369       EX_CHECK_NONE);
   370   }
   371   else {
   372     call_vm(
   373       builder()->throw_ArithmeticException(),
   374       builder()->CreateIntToPtr(
   375         LLVMValue::intptr_constant((intptr_t) __FILE__),
   376         PointerType::getUnqual(SharkType::jbyte_type())),
   377       LLVMValue::jint_constant(__LINE__),
   378       EX_CHECK_NONE);
   379   }
   381   Value *pending_exception = get_pending_exception();
   382   clear_pending_exception();
   383   handle_exception(pending_exception, EX_CHECK_FULL);
   384 }
   386 void SharkTopLevelBlock::check_bounds(SharkValue* array, SharkValue* index) {
   387   BasicBlock *out_of_bounds = function()->CreateBlock("out_of_bounds");
   388   BasicBlock *in_bounds     = function()->CreateBlock("in_bounds");
   390   Value *length = builder()->CreateArrayLength(array->jarray_value());
   391   // we use an unsigned comparison to catch negative values
   392   builder()->CreateCondBr(
   393     builder()->CreateICmpULT(index->jint_value(), length),
   394     in_bounds, out_of_bounds);
   396   builder()->SetInsertPoint(out_of_bounds);
   397   SharkState *saved_state = current_state()->copy();
   399   call_vm(
   400     builder()->throw_ArrayIndexOutOfBoundsException(),
   401     builder()->CreateIntToPtr(
   402       LLVMValue::intptr_constant((intptr_t) __FILE__),
   403       PointerType::getUnqual(SharkType::jbyte_type())),
   404     LLVMValue::jint_constant(__LINE__),
   405     index->jint_value(),
   406     EX_CHECK_NONE);
   408   Value *pending_exception = get_pending_exception();
   409   clear_pending_exception();
   410   handle_exception(pending_exception, EX_CHECK_FULL);
   412   set_current_state(saved_state);
   414   builder()->SetInsertPoint(in_bounds);
   415 }
   417 void SharkTopLevelBlock::check_pending_exception(int action) {
   418   assert(action & EAM_CHECK, "should be");
   420   BasicBlock *exception    = function()->CreateBlock("exception");
   421   BasicBlock *no_exception = function()->CreateBlock("no_exception");
   423   Value *pending_exception = get_pending_exception();
   424   builder()->CreateCondBr(
   425     builder()->CreateICmpEQ(pending_exception, LLVMValue::null()),
   426     no_exception, exception);
   428   builder()->SetInsertPoint(exception);
   429   SharkState *saved_state = current_state()->copy();
   430   if (action & EAM_MONITOR_FUDGE) {
   431     // The top monitor is marked live, but the exception was thrown
   432     // while setting it up so we need to mark it dead before we enter
   433     // any exception handlers as they will not expect it to be there.
   434     set_num_monitors(num_monitors() - 1);
   435     action ^= EAM_MONITOR_FUDGE;
   436   }
   437   clear_pending_exception();
   438   handle_exception(pending_exception, action);
   439   set_current_state(saved_state);
   441   builder()->SetInsertPoint(no_exception);
   442 }
   444 void SharkTopLevelBlock::compute_exceptions() {
   445   ciExceptionHandlerStream str(target(), start());
   447   int exc_count = str.count();
   448   _exc_handlers = new GrowableArray<ciExceptionHandler*>(exc_count);
   449   _exceptions   = new GrowableArray<SharkTopLevelBlock*>(exc_count);
   451   int index = 0;
   452   for (; !str.is_done(); str.next()) {
   453     ciExceptionHandler *handler = str.handler();
   454     if (handler->handler_bci() == -1)
   455       break;
   456     _exc_handlers->append(handler);
   458     // Try and get this exception's handler from typeflow.  We should
   459     // do it this way always, really, except that typeflow sometimes
   460     // doesn't record exceptions, even loaded ones, and sometimes it
   461     // returns them with a different handler bci.  Why???
   462     SharkTopLevelBlock *block = NULL;
   463     ciInstanceKlass* klass;
   464     if (handler->is_catch_all()) {
   465       klass = java_lang_Throwable_klass();
   466     }
   467     else {
   468       klass = handler->catch_klass();
   469     }
   470     for (int i = 0; i < ciblock()->exceptions()->length(); i++) {
   471       if (klass == ciblock()->exc_klasses()->at(i)) {
   472         block = function()->block(ciblock()->exceptions()->at(i)->pre_order());
   473         if (block->start() == handler->handler_bci())
   474           break;
   475         else
   476           block = NULL;
   477       }
   478     }
   480     // If typeflow let us down then try and figure it out ourselves
   481     if (block == NULL) {
   482       for (int i = 0; i < function()->block_count(); i++) {
   483         SharkTopLevelBlock *candidate = function()->block(i);
   484         if (candidate->start() == handler->handler_bci()) {
   485           if (block != NULL) {
   486             NOT_PRODUCT(warning("there may be trouble ahead"));
   487             block = NULL;
   488             break;
   489           }
   490           block = candidate;
   491         }
   492       }
   493     }
   494     _exceptions->append(block);
   495   }
   496 }
   498 void SharkTopLevelBlock::handle_exception(Value* exception, int action) {
   499   if (action & EAM_HANDLE && num_exceptions() != 0) {
   500     // Clear the stack and push the exception onto it
   501     while (xstack_depth())
   502       pop();
   503     push(SharkValue::create_jobject(exception, true));
   505     // Work out how many options we have to check
   506     bool has_catch_all = exc_handler(num_exceptions() - 1)->is_catch_all();
   507     int num_options = num_exceptions();
   508     if (has_catch_all)
   509       num_options--;
   511     // Marshal any non-catch-all handlers
   512     if (num_options > 0) {
   513       bool all_loaded = true;
   514       for (int i = 0; i < num_options; i++) {
   515         if (!exc_handler(i)->catch_klass()->is_loaded()) {
   516           all_loaded = false;
   517           break;
   518         }
   519       }
   521       if (all_loaded)
   522         marshal_exception_fast(num_options);
   523       else
   524         marshal_exception_slow(num_options);
   525     }
   527     // Install the catch-all handler, if present
   528     if (has_catch_all) {
   529       SharkTopLevelBlock* handler = this->exception(num_options);
   530       assert(handler != NULL, "catch-all handler cannot be unloaded");
   532       builder()->CreateBr(handler->entry_block());
   533       handler->add_incoming(current_state());
   534       return;
   535     }
   536   }
   538   // No exception handler was found; unwind and return
   539   handle_return(T_VOID, exception);
   540 }
   542 void SharkTopLevelBlock::marshal_exception_fast(int num_options) {
   543   Value *exception_klass = builder()->CreateValueOfStructEntry(
   544     xstack(0)->jobject_value(),
   545     in_ByteSize(oopDesc::klass_offset_in_bytes()),
   546     SharkType::oop_type(),
   547     "exception_klass");
   549   for (int i = 0; i < num_options; i++) {
   550     Value *check_klass =
   551       builder()->CreateInlineOop(exc_handler(i)->catch_klass());
   553     BasicBlock *not_exact   = function()->CreateBlock("not_exact");
   554     BasicBlock *not_subtype = function()->CreateBlock("not_subtype");
   556     builder()->CreateCondBr(
   557       builder()->CreateICmpEQ(check_klass, exception_klass),
   558       handler_for_exception(i), not_exact);
   560     builder()->SetInsertPoint(not_exact);
   561     builder()->CreateCondBr(
   562       builder()->CreateICmpNE(
   563         builder()->CreateCall2(
   564           builder()->is_subtype_of(), check_klass, exception_klass),
   565         LLVMValue::jbyte_constant(0)),
   566       handler_for_exception(i), not_subtype);
   568     builder()->SetInsertPoint(not_subtype);
   569   }
   570 }
   572 void SharkTopLevelBlock::marshal_exception_slow(int num_options) {
   573   int *indexes = NEW_RESOURCE_ARRAY(int, num_options);
   574   for (int i = 0; i < num_options; i++)
   575     indexes[i] = exc_handler(i)->catch_klass_index();
   577   Value *index = call_vm(
   578     builder()->find_exception_handler(),
   579     builder()->CreateInlineData(
   580       indexes,
   581       num_options * sizeof(int),
   582       PointerType::getUnqual(SharkType::jint_type())),
   583     LLVMValue::jint_constant(num_options),
   584     EX_CHECK_NO_CATCH);
   586   BasicBlock *no_handler = function()->CreateBlock("no_handler");
   587   SwitchInst *switchinst = builder()->CreateSwitch(
   588     index, no_handler, num_options);
   590   for (int i = 0; i < num_options; i++) {
   591     switchinst->addCase(
   592       LLVMValue::jint_constant(i),
   593       handler_for_exception(i));
   594   }
   596   builder()->SetInsertPoint(no_handler);
   597 }
   599 BasicBlock* SharkTopLevelBlock::handler_for_exception(int index) {
   600   SharkTopLevelBlock *successor = this->exception(index);
   601   if (successor) {
   602     successor->add_incoming(current_state());
   603     return successor->entry_block();
   604   }
   605   else {
   606     return make_trap(
   607       exc_handler(index)->handler_bci(),
   608       Deoptimization::make_trap_request(
   609         Deoptimization::Reason_unhandled,
   610         Deoptimization::Action_reinterpret));
   611   }
   612 }
   614 void SharkTopLevelBlock::maybe_add_safepoint() {
   615   if (current_state()->has_safepointed())
   616     return;
   618   BasicBlock *orig_block = builder()->GetInsertBlock();
   619   SharkState *orig_state = current_state()->copy();
   621   BasicBlock *do_safepoint = function()->CreateBlock("do_safepoint");
   622   BasicBlock *safepointed  = function()->CreateBlock("safepointed");
   624   Value *state = builder()->CreateLoad(
   625     builder()->CreateIntToPtr(
   626       LLVMValue::intptr_constant(
   627         (intptr_t) SafepointSynchronize::address_of_state()),
   628       PointerType::getUnqual(SharkType::jint_type())),
   629     "state");
   631   builder()->CreateCondBr(
   632     builder()->CreateICmpEQ(
   633       state,
   634       LLVMValue::jint_constant(SafepointSynchronize::_synchronizing)),
   635     do_safepoint, safepointed);
   637   builder()->SetInsertPoint(do_safepoint);
   638   call_vm(builder()->safepoint(), EX_CHECK_FULL);
   639   BasicBlock *safepointed_block = builder()->GetInsertBlock();
   640   builder()->CreateBr(safepointed);
   642   builder()->SetInsertPoint(safepointed);
   643   current_state()->merge(orig_state, orig_block, safepointed_block);
   645   current_state()->set_has_safepointed(true);
   646 }
   648 void SharkTopLevelBlock::maybe_add_backedge_safepoint() {
   649   if (current_state()->has_safepointed())
   650     return;
   652   for (int i = 0; i < num_successors(); i++) {
   653     if (successor(i)->can_reach(this)) {
   654       maybe_add_safepoint();
   655       break;
   656     }
   657   }
   658 }
   660 bool SharkTopLevelBlock::can_reach(SharkTopLevelBlock* other) {
   661   for (int i = 0; i < function()->block_count(); i++)
   662     function()->block(i)->_can_reach_visited = false;
   664   return can_reach_helper(other);
   665 }
   667 bool SharkTopLevelBlock::can_reach_helper(SharkTopLevelBlock* other) {
   668   if (this == other)
   669     return true;
   671   if (_can_reach_visited)
   672     return false;
   673   _can_reach_visited = true;
   675   if (!has_trap()) {
   676     for (int i = 0; i < num_successors(); i++) {
   677       if (successor(i)->can_reach_helper(other))
   678         return true;
   679     }
   680   }
   682   for (int i = 0; i < num_exceptions(); i++) {
   683     SharkTopLevelBlock *handler = exception(i);
   684     if (handler && handler->can_reach_helper(other))
   685       return true;
   686   }
   688   return false;
   689 }
   691 BasicBlock* SharkTopLevelBlock::make_trap(int trap_bci, int trap_request) {
   692   BasicBlock *trap_block = function()->CreateBlock("trap");
   693   BasicBlock *orig_block = builder()->GetInsertBlock();
   694   builder()->SetInsertPoint(trap_block);
   696   int orig_bci = bci();
   697   iter()->force_bci(trap_bci);
   699   do_trap(trap_request);
   701   builder()->SetInsertPoint(orig_block);
   702   iter()->force_bci(orig_bci);
   704   return trap_block;
   705 }
   707 void SharkTopLevelBlock::do_trap(int trap_request) {
   708   decache_for_trap();
   709   builder()->CreateRet(
   710     builder()->CreateCall2(
   711       builder()->uncommon_trap(),
   712       thread(),
   713       LLVMValue::jint_constant(trap_request)));
   714 }
   716 void SharkTopLevelBlock::call_register_finalizer(Value *receiver) {
   717   BasicBlock *orig_block = builder()->GetInsertBlock();
   718   SharkState *orig_state = current_state()->copy();
   720   BasicBlock *do_call = function()->CreateBlock("has_finalizer");
   721   BasicBlock *done    = function()->CreateBlock("done");
   723   Value *klass = builder()->CreateValueOfStructEntry(
   724     receiver,
   725     in_ByteSize(oopDesc::klass_offset_in_bytes()),
   726     SharkType::oop_type(),
   727     "klass");
   729   Value *klass_part = builder()->CreateAddressOfStructEntry(
   730     klass,
   731     in_ByteSize(klassOopDesc::klass_part_offset_in_bytes()),
   732     SharkType::klass_type(),
   733     "klass_part");
   735   Value *access_flags = builder()->CreateValueOfStructEntry(
   736     klass_part,
   737     in_ByteSize(Klass::access_flags_offset_in_bytes()),
   738     SharkType::jint_type(),
   739     "access_flags");
   741   builder()->CreateCondBr(
   742     builder()->CreateICmpNE(
   743       builder()->CreateAnd(
   744         access_flags,
   745         LLVMValue::jint_constant(JVM_ACC_HAS_FINALIZER)),
   746       LLVMValue::jint_constant(0)),
   747     do_call, done);
   749   builder()->SetInsertPoint(do_call);
   750   call_vm(builder()->register_finalizer(), receiver, EX_CHECK_FULL);
   751   BasicBlock *branch_block = builder()->GetInsertBlock();
   752   builder()->CreateBr(done);
   754   builder()->SetInsertPoint(done);
   755   current_state()->merge(orig_state, orig_block, branch_block);
   756 }
   758 void SharkTopLevelBlock::handle_return(BasicType type, Value* exception) {
   759   assert (exception == NULL || type == T_VOID, "exception OR result, please");
   761   if (num_monitors()) {
   762     // Protect our exception across possible monitor release decaches
   763     if (exception)
   764       set_oop_tmp(exception);
   766     // We don't need to check for exceptions thrown here.  If
   767     // we're returning a value then we just carry on as normal:
   768     // the caller will see the pending exception and handle it.
   769     // If we're returning with an exception then that exception
   770     // takes priority and the release_lock one will be ignored.
   771     while (num_monitors())
   772       release_lock(EX_CHECK_NONE);
   774     // Reload the exception we're throwing
   775     if (exception)
   776       exception = get_oop_tmp();
   777   }
   779   if (exception) {
   780     builder()->CreateStore(exception, pending_exception_address());
   781   }
   783   Value *result_addr = stack()->CreatePopFrame(type2size[type]);
   784   if (type != T_VOID) {
   785     builder()->CreateStore(
   786       pop_result(type)->generic_value(),
   787       builder()->CreateIntToPtr(
   788         result_addr,
   789         PointerType::getUnqual(SharkType::to_stackType(type))));
   790   }
   792   builder()->CreateRet(LLVMValue::jint_constant(0));
   793 }
   795 void SharkTopLevelBlock::do_arraylength() {
   796   SharkValue *array = pop();
   797   check_null(array);
   798   Value *length = builder()->CreateArrayLength(array->jarray_value());
   799   push(SharkValue::create_jint(length, false));
   800 }
   802 void SharkTopLevelBlock::do_aload(BasicType basic_type) {
   803   SharkValue *index = pop();
   804   SharkValue *array = pop();
   806   check_null(array);
   807   check_bounds(array, index);
   809   Value *value = builder()->CreateLoad(
   810     builder()->CreateArrayAddress(
   811       array->jarray_value(), basic_type, index->jint_value()));
   813   const Type *stack_type = SharkType::to_stackType(basic_type);
   814   if (value->getType() != stack_type)
   815     value = builder()->CreateIntCast(value, stack_type, basic_type != T_CHAR);
   817   switch (basic_type) {
   818   case T_BYTE:
   819   case T_CHAR:
   820   case T_SHORT:
   821   case T_INT:
   822     push(SharkValue::create_jint(value, false));
   823     break;
   825   case T_LONG:
   826     push(SharkValue::create_jlong(value, false));
   827     break;
   829   case T_FLOAT:
   830     push(SharkValue::create_jfloat(value));
   831     break;
   833   case T_DOUBLE:
   834     push(SharkValue::create_jdouble(value));
   835     break;
   837   case T_OBJECT:
   838     // You might expect that array->type()->is_array_klass() would
   839     // always be true, but it isn't.  If ciTypeFlow detects that a
   840     // value is always null then that value becomes an untyped null
   841     // object.  Shark doesn't presently support this, so a generic
   842     // T_OBJECT is created.  In this case we guess the type using
   843     // the BasicType we were supplied.  In reality the generated
   844     // code will never be used, as the null value will be caught
   845     // by the above null pointer check.
   846     // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=324
   847     push(
   848       SharkValue::create_generic(
   849         array->type()->is_array_klass() ?
   850           ((ciArrayKlass *) array->type())->element_type() :
   851           ciType::make(basic_type),
   852         value, false));
   853     break;
   855   default:
   856     tty->print_cr("Unhandled type %s", type2name(basic_type));
   857     ShouldNotReachHere();
   858   }
   859 }
   861 void SharkTopLevelBlock::do_astore(BasicType basic_type) {
   862   SharkValue *svalue = pop();
   863   SharkValue *index  = pop();
   864   SharkValue *array  = pop();
   866   check_null(array);
   867   check_bounds(array, index);
   869   Value *value;
   870   switch (basic_type) {
   871   case T_BYTE:
   872   case T_CHAR:
   873   case T_SHORT:
   874   case T_INT:
   875     value = svalue->jint_value();
   876     break;
   878   case T_LONG:
   879     value = svalue->jlong_value();
   880     break;
   882   case T_FLOAT:
   883     value = svalue->jfloat_value();
   884     break;
   886   case T_DOUBLE:
   887     value = svalue->jdouble_value();
   888     break;
   890   case T_OBJECT:
   891     value = svalue->jobject_value();
   892     // XXX assignability check
   893     break;
   895   default:
   896     tty->print_cr("Unhandled type %s", type2name(basic_type));
   897     ShouldNotReachHere();
   898   }
   900   const Type *array_type = SharkType::to_arrayType(basic_type);
   901   if (value->getType() != array_type)
   902     value = builder()->CreateIntCast(value, array_type, basic_type != T_CHAR);
   904   Value *addr = builder()->CreateArrayAddress(
   905     array->jarray_value(), basic_type, index->jint_value(), "addr");
   907   builder()->CreateStore(value, addr);
   909   if (basic_type == T_OBJECT) // XXX or T_ARRAY?
   910     builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
   911 }
   913 void SharkTopLevelBlock::do_return(BasicType type) {
   914   if (target()->intrinsic_id() == vmIntrinsics::_Object_init)
   915     call_register_finalizer(local(0)->jobject_value());
   916   maybe_add_safepoint();
   917   handle_return(type, NULL);
   918 }
   920 void SharkTopLevelBlock::do_athrow() {
   921   SharkValue *exception = pop();
   922   check_null(exception);
   923   handle_exception(exception->jobject_value(), EX_CHECK_FULL);
   924 }
   926 void SharkTopLevelBlock::do_goto() {
   927   do_branch(ciTypeFlow::GOTO_TARGET);
   928 }
   930 void SharkTopLevelBlock::do_jsr() {
   931   push(SharkValue::address_constant(iter()->next_bci()));
   932   do_branch(ciTypeFlow::GOTO_TARGET);
   933 }
   935 void SharkTopLevelBlock::do_ret() {
   936   assert(local(iter()->get_index())->address_value() ==
   937          successor(ciTypeFlow::GOTO_TARGET)->start(), "should be");
   938   do_branch(ciTypeFlow::GOTO_TARGET);
   939 }
   941 // All propagation of state from one block to the next (via
   942 // dest->add_incoming) is handled by these methods:
   943 //   do_branch
   944 //   do_if_helper
   945 //   do_switch
   946 //   handle_exception
   948 void SharkTopLevelBlock::do_branch(int successor_index) {
   949   SharkTopLevelBlock *dest = successor(successor_index);
   950   builder()->CreateBr(dest->entry_block());
   951   dest->add_incoming(current_state());
   952 }
   954 void SharkTopLevelBlock::do_if(ICmpInst::Predicate p,
   955                                SharkValue*         b,
   956                                SharkValue*         a) {
   957   Value *llvm_a, *llvm_b;
   958   if (a->is_jobject()) {
   959     llvm_a = a->intptr_value(builder());
   960     llvm_b = b->intptr_value(builder());
   961   }
   962   else {
   963     llvm_a = a->jint_value();
   964     llvm_b = b->jint_value();
   965   }
   966   do_if_helper(p, llvm_b, llvm_a, current_state(), current_state());
   967 }
   969 void SharkTopLevelBlock::do_if_helper(ICmpInst::Predicate p,
   970                                       Value*              b,
   971                                       Value*              a,
   972                                       SharkState*         if_taken_state,
   973                                       SharkState*         not_taken_state) {
   974   SharkTopLevelBlock *if_taken  = successor(ciTypeFlow::IF_TAKEN);
   975   SharkTopLevelBlock *not_taken = successor(ciTypeFlow::IF_NOT_TAKEN);
   977   builder()->CreateCondBr(
   978     builder()->CreateICmp(p, a, b),
   979     if_taken->entry_block(), not_taken->entry_block());
   981   if_taken->add_incoming(if_taken_state);
   982   not_taken->add_incoming(not_taken_state);
   983 }
   985 void SharkTopLevelBlock::do_switch() {
   986   int len = switch_table_length();
   988   SharkTopLevelBlock *dest_block = successor(ciTypeFlow::SWITCH_DEFAULT);
   989   SwitchInst *switchinst = builder()->CreateSwitch(
   990     pop()->jint_value(), dest_block->entry_block(), len);
   991   dest_block->add_incoming(current_state());
   993   for (int i = 0; i < len; i++) {
   994     int dest_bci = switch_dest(i);
   995     if (dest_bci != switch_default_dest()) {
   996       dest_block = bci_successor(dest_bci);
   997       switchinst->addCase(
   998         LLVMValue::jint_constant(switch_key(i)),
   999         dest_block->entry_block());
  1000       dest_block->add_incoming(current_state());
  1005 ciMethod* SharkTopLevelBlock::improve_virtual_call(ciMethod*   caller,
  1006                                               ciInstanceKlass* klass,
  1007                                               ciMethod*        dest_method,
  1008                                               ciType*          receiver_type) {
  1009   // If the method is obviously final then we are already done
  1010   if (dest_method->can_be_statically_bound())
  1011     return dest_method;
  1013   // Array methods are all inherited from Object and are monomorphic
  1014   if (receiver_type->is_array_klass() &&
  1015       dest_method->holder() == java_lang_Object_klass())
  1016     return dest_method;
  1018 #ifdef SHARK_CAN_DEOPTIMIZE_ANYWHERE
  1019   // This code can replace a virtual call with a direct call if this
  1020   // class is the only one in the entire set of loaded classes that
  1021   // implements this method.  This makes the compiled code dependent
  1022   // on other classes that implement the method not being loaded, a
  1023   // condition which is enforced by the dependency tracker.  If the
  1024   // dependency tracker determines a method has become invalid it
  1025   // will mark it for recompilation, causing running copies to be
  1026   // deoptimized.  Shark currently can't deoptimize arbitrarily like
  1027   // that, so this optimization cannot be used.
  1028   // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=481
  1030   // All other interesting cases are instance classes
  1031   if (!receiver_type->is_instance_klass())
  1032     return NULL;
  1034   // Attempt to improve the receiver
  1035   ciInstanceKlass* actual_receiver = klass;
  1036   ciInstanceKlass *improved_receiver = receiver_type->as_instance_klass();
  1037   if (improved_receiver->is_loaded() &&
  1038       improved_receiver->is_initialized() &&
  1039       !improved_receiver->is_interface() &&
  1040       improved_receiver->is_subtype_of(actual_receiver)) {
  1041     actual_receiver = improved_receiver;
  1044   // Attempt to find a monomorphic target for this call using
  1045   // class heirachy analysis.
  1046   ciInstanceKlass *calling_klass = caller->holder();
  1047   ciMethod* monomorphic_target =
  1048     dest_method->find_monomorphic_target(calling_klass, klass, actual_receiver);
  1049   if (monomorphic_target != NULL) {
  1050     assert(!monomorphic_target->is_abstract(), "shouldn't be");
  1052     // Opto has a bunch of type checking here that I don't
  1053     // understand.  It's to inhibit casting in one direction,
  1054     // possibly because objects in Opto can have inexact
  1055     // types, but I can't even tell which direction it
  1056     // doesn't like.  For now I'm going to block *any* cast.
  1057     if (monomorphic_target != dest_method) {
  1058       if (SharkPerformanceWarnings) {
  1059         warning("found monomorphic target, but inhibited cast:");
  1060         tty->print("  dest_method = ");
  1061         dest_method->print_short_name(tty);
  1062         tty->cr();
  1063         tty->print("  monomorphic_target = ");
  1064         monomorphic_target->print_short_name(tty);
  1065         tty->cr();
  1067       monomorphic_target = NULL;
  1071   // Replace the virtual call with a direct one.  This makes
  1072   // us dependent on that target method not getting overridden
  1073   // by dynamic class loading.
  1074   if (monomorphic_target != NULL) {
  1075     dependencies()->assert_unique_concrete_method(
  1076       actual_receiver, monomorphic_target);
  1077     return monomorphic_target;
  1080   // Because Opto distinguishes exact types from inexact ones
  1081   // it can perform a further optimization to replace calls
  1082   // with non-monomorphic targets if the receiver has an exact
  1083   // type.  We don't mark types this way, so we can't do this.
  1085 #endif // SHARK_CAN_DEOPTIMIZE_ANYWHERE
  1087   return NULL;
  1090 Value *SharkTopLevelBlock::get_direct_callee(ciMethod* method) {
  1091   return builder()->CreateBitCast(
  1092     builder()->CreateInlineOop(method),
  1093     SharkType::methodOop_type(),
  1094     "callee");
  1097 Value *SharkTopLevelBlock::get_virtual_callee(SharkValue* receiver,
  1098                                               int vtable_index) {
  1099   Value *klass = builder()->CreateValueOfStructEntry(
  1100     receiver->jobject_value(),
  1101     in_ByteSize(oopDesc::klass_offset_in_bytes()),
  1102     SharkType::oop_type(),
  1103     "klass");
  1105   return builder()->CreateLoad(
  1106     builder()->CreateArrayAddress(
  1107       klass,
  1108       SharkType::methodOop_type(),
  1109       vtableEntry::size() * wordSize,
  1110       in_ByteSize(instanceKlass::vtable_start_offset() * wordSize),
  1111       LLVMValue::intptr_constant(vtable_index)),
  1112     "callee");
  1115 Value* SharkTopLevelBlock::get_interface_callee(SharkValue *receiver,
  1116                                                 ciMethod*   method) {
  1117   BasicBlock *loop       = function()->CreateBlock("loop");
  1118   BasicBlock *got_null   = function()->CreateBlock("got_null");
  1119   BasicBlock *not_null   = function()->CreateBlock("not_null");
  1120   BasicBlock *next       = function()->CreateBlock("next");
  1121   BasicBlock *got_entry  = function()->CreateBlock("got_entry");
  1123   // Locate the receiver's itable
  1124   Value *object_klass = builder()->CreateValueOfStructEntry(
  1125     receiver->jobject_value(), in_ByteSize(oopDesc::klass_offset_in_bytes()),
  1126     SharkType::oop_type(),
  1127     "object_klass");
  1129   Value *vtable_start = builder()->CreateAdd(
  1130     builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()),
  1131     LLVMValue::intptr_constant(
  1132       instanceKlass::vtable_start_offset() * HeapWordSize),
  1133     "vtable_start");
  1135   Value *vtable_length = builder()->CreateValueOfStructEntry(
  1136     object_klass,
  1137     in_ByteSize(instanceKlass::vtable_length_offset() * HeapWordSize),
  1138     SharkType::jint_type(),
  1139     "vtable_length");
  1140   vtable_length =
  1141     builder()->CreateIntCast(vtable_length, SharkType::intptr_type(), false);
  1143   bool needs_aligning = HeapWordsPerLong > 1;
  1144   Value *itable_start = builder()->CreateAdd(
  1145     vtable_start,
  1146     builder()->CreateShl(
  1147       vtable_length,
  1148       LLVMValue::intptr_constant(exact_log2(vtableEntry::size() * wordSize))),
  1149     needs_aligning ? "" : "itable_start");
  1150   if (needs_aligning) {
  1151     itable_start = builder()->CreateAnd(
  1152       builder()->CreateAdd(
  1153         itable_start, LLVMValue::intptr_constant(BytesPerLong - 1)),
  1154       LLVMValue::intptr_constant(~(BytesPerLong - 1)),
  1155       "itable_start");
  1158   // Locate this interface's entry in the table
  1159   Value *iklass = builder()->CreateInlineOop(method->holder());
  1160   BasicBlock *loop_entry = builder()->GetInsertBlock();
  1161   builder()->CreateBr(loop);
  1162   builder()->SetInsertPoint(loop);
  1163   PHINode *itable_entry_addr = builder()->CreatePHI(
  1164     SharkType::intptr_type(), "itable_entry_addr");
  1165   itable_entry_addr->addIncoming(itable_start, loop_entry);
  1167   Value *itable_entry = builder()->CreateIntToPtr(
  1168     itable_entry_addr, SharkType::itableOffsetEntry_type(), "itable_entry");
  1170   Value *itable_iklass = builder()->CreateValueOfStructEntry(
  1171     itable_entry,
  1172     in_ByteSize(itableOffsetEntry::interface_offset_in_bytes()),
  1173     SharkType::oop_type(),
  1174     "itable_iklass");
  1176   builder()->CreateCondBr(
  1177     builder()->CreateICmpEQ(itable_iklass, LLVMValue::null()),
  1178     got_null, not_null);
  1180   // A null entry means that the class doesn't implement the
  1181   // interface, and wasn't the same as the class checked when
  1182   // the interface was resolved.
  1183   builder()->SetInsertPoint(got_null);
  1184   builder()->CreateUnimplemented(__FILE__, __LINE__);
  1185   builder()->CreateUnreachable();
  1187   builder()->SetInsertPoint(not_null);
  1188   builder()->CreateCondBr(
  1189     builder()->CreateICmpEQ(itable_iklass, iklass),
  1190     got_entry, next);
  1192   builder()->SetInsertPoint(next);
  1193   Value *next_entry = builder()->CreateAdd(
  1194     itable_entry_addr,
  1195     LLVMValue::intptr_constant(itableOffsetEntry::size() * wordSize));
  1196   builder()->CreateBr(loop);
  1197   itable_entry_addr->addIncoming(next_entry, next);
  1199   // Locate the method pointer
  1200   builder()->SetInsertPoint(got_entry);
  1201   Value *offset = builder()->CreateValueOfStructEntry(
  1202     itable_entry,
  1203     in_ByteSize(itableOffsetEntry::offset_offset_in_bytes()),
  1204     SharkType::jint_type(),
  1205     "offset");
  1206   offset =
  1207     builder()->CreateIntCast(offset, SharkType::intptr_type(), false);
  1209   return builder()->CreateLoad(
  1210     builder()->CreateIntToPtr(
  1211       builder()->CreateAdd(
  1212         builder()->CreateAdd(
  1213           builder()->CreateAdd(
  1214             builder()->CreatePtrToInt(
  1215               object_klass, SharkType::intptr_type()),
  1216             offset),
  1217           LLVMValue::intptr_constant(
  1218             method->itable_index() * itableMethodEntry::size() * wordSize)),
  1219         LLVMValue::intptr_constant(
  1220           itableMethodEntry::method_offset_in_bytes())),
  1221       PointerType::getUnqual(SharkType::methodOop_type())),
  1222     "callee");
  1225 void SharkTopLevelBlock::do_call() {
  1226   // Set frequently used booleans
  1227   bool is_static = bc() == Bytecodes::_invokestatic;
  1228   bool is_virtual = bc() == Bytecodes::_invokevirtual;
  1229   bool is_interface = bc() == Bytecodes::_invokeinterface;
  1231   // Find the method being called
  1232   bool will_link;
  1233   ciMethod *dest_method = iter()->get_method(will_link);
  1234   assert(will_link, "typeflow responsibility");
  1235   assert(dest_method->is_static() == is_static, "must match bc");
  1237   // Find the class of the method being called.  Note
  1238   // that the superclass check in the second assertion
  1239   // is to cope with a hole in the spec that allows for
  1240   // invokeinterface instructions where the resolved
  1241   // method is a virtual method in java.lang.Object.
  1242   // javac doesn't generate code like that, but there's
  1243   // no reason a compliant Java compiler might not.
  1244   ciInstanceKlass *holder_klass  = dest_method->holder();
  1245   assert(holder_klass->is_loaded(), "scan_for_traps responsibility");
  1246   assert(holder_klass->is_interface() ||
  1247          holder_klass->super() == NULL ||
  1248          !is_interface, "must match bc");
  1249   ciKlass *holder = iter()->get_declared_method_holder();
  1250   ciInstanceKlass *klass =
  1251     ciEnv::get_instance_klass_for_declared_method_holder(holder);
  1253   // Find the receiver in the stack.  We do this before
  1254   // trying to inline because the inliner can only use
  1255   // zero-checked values, not being able to perform the
  1256   // check itself.
  1257   SharkValue *receiver = NULL;
  1258   if (!is_static) {
  1259     receiver = xstack(dest_method->arg_size() - 1);
  1260     check_null(receiver);
  1263   // Try to improve non-direct calls
  1264   bool call_is_virtual = is_virtual || is_interface;
  1265   ciMethod *call_method = dest_method;
  1266   if (call_is_virtual) {
  1267     ciMethod *optimized_method = improve_virtual_call(
  1268       target(), klass, dest_method, receiver->type());
  1269     if (optimized_method) {
  1270       call_method = optimized_method;
  1271       call_is_virtual = false;
  1275   // Try to inline the call
  1276   if (!call_is_virtual) {
  1277     if (SharkInliner::attempt_inline(call_method, current_state()))
  1278       return;
  1281   // Find the method we are calling
  1282   Value *callee;
  1283   if (call_is_virtual) {
  1284     if (is_virtual) {
  1285       assert(klass->is_linked(), "scan_for_traps responsibility");
  1286       int vtable_index = call_method->resolve_vtable_index(
  1287         target()->holder(), klass);
  1288       assert(vtable_index >= 0, "should be");
  1289       callee = get_virtual_callee(receiver, vtable_index);
  1291     else {
  1292       assert(is_interface, "should be");
  1293       callee = get_interface_callee(receiver, call_method);
  1296   else {
  1297     callee = get_direct_callee(call_method);
  1300   // Load the SharkEntry from the callee
  1301   Value *base_pc = builder()->CreateValueOfStructEntry(
  1302     callee, methodOopDesc::from_interpreted_offset(),
  1303     SharkType::intptr_type(),
  1304     "base_pc");
  1306   // Load the entry point from the SharkEntry
  1307   Value *entry_point = builder()->CreateLoad(
  1308     builder()->CreateIntToPtr(
  1309       builder()->CreateAdd(
  1310         base_pc,
  1311         LLVMValue::intptr_constant(in_bytes(ZeroEntry::entry_point_offset()))),
  1312       PointerType::getUnqual(
  1313         PointerType::getUnqual(SharkType::entry_point_type()))),
  1314     "entry_point");
  1316   // Make the call
  1317   decache_for_Java_call(call_method);
  1318   Value *deoptimized_frames = builder()->CreateCall3(
  1319     entry_point, callee, base_pc, thread());
  1321   // If the callee got deoptimized then reexecute in the interpreter
  1322   BasicBlock *reexecute      = function()->CreateBlock("reexecute");
  1323   BasicBlock *call_completed = function()->CreateBlock("call_completed");
  1324   builder()->CreateCondBr(
  1325     builder()->CreateICmpNE(deoptimized_frames, LLVMValue::jint_constant(0)),
  1326     reexecute, call_completed);
  1328   builder()->SetInsertPoint(reexecute);
  1329   builder()->CreateCall2(
  1330     builder()->deoptimized_entry_point(),
  1331     builder()->CreateSub(deoptimized_frames, LLVMValue::jint_constant(1)),
  1332     thread());
  1333   builder()->CreateBr(call_completed);
  1335   // Cache after the call
  1336   builder()->SetInsertPoint(call_completed);
  1337   cache_after_Java_call(call_method);
  1339   // Check for pending exceptions
  1340   check_pending_exception(EX_CHECK_FULL);
  1342   // Mark that a safepoint check has occurred
  1343   current_state()->set_has_safepointed(true);
  1346 bool SharkTopLevelBlock::static_subtype_check(ciKlass* check_klass,
  1347                                               ciKlass* object_klass) {
  1348   // If the class we're checking against is java.lang.Object
  1349   // then this is a no brainer.  Apparently this can happen
  1350   // in reflective code...
  1351   if (check_klass == java_lang_Object_klass())
  1352     return true;
  1354   // Perform a subtype check.  NB in opto's code for this
  1355   // (GraphKit::static_subtype_check) it says that static
  1356   // interface types cannot be trusted, and if opto can't
  1357   // trust them then I assume we can't either.
  1358   if (object_klass->is_loaded() && !object_klass->is_interface()) {
  1359     if (object_klass == check_klass)
  1360       return true;
  1362     if (check_klass->is_loaded() && object_klass->is_subtype_of(check_klass))
  1363       return true;
  1366   return false;
  1369 void SharkTopLevelBlock::do_instance_check() {
  1370   // Get the class we're checking against
  1371   bool will_link;
  1372   ciKlass *check_klass = iter()->get_klass(will_link);
  1374   // Get the class of the object we're checking
  1375   ciKlass *object_klass = xstack(0)->type()->as_klass();
  1377   // Can we optimize this check away?
  1378   if (static_subtype_check(check_klass, object_klass)) {
  1379     if (bc() == Bytecodes::_instanceof) {
  1380       pop();
  1381       push(SharkValue::jint_constant(1));
  1383     return;
  1386   // Need to check this one at runtime
  1387   if (will_link)
  1388     do_full_instance_check(check_klass);
  1389   else
  1390     do_trapping_instance_check(check_klass);
  1393 bool SharkTopLevelBlock::maybe_do_instanceof_if() {
  1394   // Get the class we're checking against
  1395   bool will_link;
  1396   ciKlass *check_klass = iter()->get_klass(will_link);
  1398   // If the class is unloaded then the instanceof
  1399   // cannot possibly succeed.
  1400   if (!will_link)
  1401     return false;
  1403   // Keep a copy of the object we're checking
  1404   SharkValue *old_object = xstack(0);
  1406   // Get the class of the object we're checking
  1407   ciKlass *object_klass = old_object->type()->as_klass();
  1409   // If the instanceof can be optimized away at compile time
  1410   // then any subsequent checkcasts will be too so we handle
  1411   // it normally.
  1412   if (static_subtype_check(check_klass, object_klass))
  1413     return false;
  1415   // Perform the instance check
  1416   do_full_instance_check(check_klass);
  1417   Value *result = pop()->jint_value();
  1419   // Create the casted object
  1420   SharkValue *new_object = SharkValue::create_generic(
  1421     check_klass, old_object->jobject_value(), old_object->zero_checked());
  1423   // Create two copies of the current state, one with the
  1424   // original object and one with all instances of the
  1425   // original object replaced with the new, casted object.
  1426   SharkState *new_state = current_state();
  1427   SharkState *old_state = new_state->copy();
  1428   new_state->replace_all(old_object, new_object);
  1430   // Perform the check-and-branch
  1431   switch (iter()->next_bc()) {
  1432   case Bytecodes::_ifeq:
  1433     // branch if not an instance
  1434     do_if_helper(
  1435       ICmpInst::ICMP_EQ,
  1436       LLVMValue::jint_constant(0), result,
  1437       old_state, new_state);
  1438     break;
  1440   case Bytecodes::_ifne:
  1441     // branch if an instance
  1442     do_if_helper(
  1443       ICmpInst::ICMP_NE,
  1444       LLVMValue::jint_constant(0), result,
  1445       new_state, old_state);
  1446     break;
  1448   default:
  1449     ShouldNotReachHere();
  1452   return true;
  1455 void SharkTopLevelBlock::do_full_instance_check(ciKlass* klass) {
  1456   BasicBlock *not_null      = function()->CreateBlock("not_null");
  1457   BasicBlock *subtype_check = function()->CreateBlock("subtype_check");
  1458   BasicBlock *is_instance   = function()->CreateBlock("is_instance");
  1459   BasicBlock *not_instance  = function()->CreateBlock("not_instance");
  1460   BasicBlock *merge1        = function()->CreateBlock("merge1");
  1461   BasicBlock *merge2        = function()->CreateBlock("merge2");
  1463   enum InstanceCheckStates {
  1464     IC_IS_NULL,
  1465     IC_IS_INSTANCE,
  1466     IC_NOT_INSTANCE,
  1467   };
  1469   // Pop the object off the stack
  1470   Value *object = pop()->jobject_value();
  1472   // Null objects aren't instances of anything
  1473   builder()->CreateCondBr(
  1474     builder()->CreateICmpEQ(object, LLVMValue::null()),
  1475     merge2, not_null);
  1476   BasicBlock *null_block = builder()->GetInsertBlock();
  1478   // Get the class we're checking against
  1479   builder()->SetInsertPoint(not_null);
  1480   Value *check_klass = builder()->CreateInlineOop(klass);
  1482   // Get the class of the object being tested
  1483   Value *object_klass = builder()->CreateValueOfStructEntry(
  1484     object, in_ByteSize(oopDesc::klass_offset_in_bytes()),
  1485     SharkType::oop_type(),
  1486     "object_klass");
  1488   // Perform the check
  1489   builder()->CreateCondBr(
  1490     builder()->CreateICmpEQ(check_klass, object_klass),
  1491     is_instance, subtype_check);
  1493   builder()->SetInsertPoint(subtype_check);
  1494   builder()->CreateCondBr(
  1495     builder()->CreateICmpNE(
  1496       builder()->CreateCall2(
  1497         builder()->is_subtype_of(), check_klass, object_klass),
  1498       LLVMValue::jbyte_constant(0)),
  1499     is_instance, not_instance);
  1501   builder()->SetInsertPoint(is_instance);
  1502   builder()->CreateBr(merge1);
  1504   builder()->SetInsertPoint(not_instance);
  1505   builder()->CreateBr(merge1);
  1507   // First merge
  1508   builder()->SetInsertPoint(merge1);
  1509   PHINode *nonnull_result = builder()->CreatePHI(
  1510     SharkType::jint_type(), "nonnull_result");
  1511   nonnull_result->addIncoming(
  1512     LLVMValue::jint_constant(IC_IS_INSTANCE), is_instance);
  1513   nonnull_result->addIncoming(
  1514     LLVMValue::jint_constant(IC_NOT_INSTANCE), not_instance);
  1515   BasicBlock *nonnull_block = builder()->GetInsertBlock();
  1516   builder()->CreateBr(merge2);
  1518   // Second merge
  1519   builder()->SetInsertPoint(merge2);
  1520   PHINode *result = builder()->CreatePHI(
  1521     SharkType::jint_type(), "result");
  1522   result->addIncoming(LLVMValue::jint_constant(IC_IS_NULL), null_block);
  1523   result->addIncoming(nonnull_result, nonnull_block);
  1525   // Handle the result
  1526   if (bc() == Bytecodes::_checkcast) {
  1527     BasicBlock *failure = function()->CreateBlock("failure");
  1528     BasicBlock *success = function()->CreateBlock("success");
  1530     builder()->CreateCondBr(
  1531       builder()->CreateICmpNE(
  1532         result, LLVMValue::jint_constant(IC_NOT_INSTANCE)),
  1533       success, failure);
  1535     builder()->SetInsertPoint(failure);
  1536     SharkState *saved_state = current_state()->copy();
  1538     call_vm(
  1539       builder()->throw_ClassCastException(),
  1540       builder()->CreateIntToPtr(
  1541         LLVMValue::intptr_constant((intptr_t) __FILE__),
  1542         PointerType::getUnqual(SharkType::jbyte_type())),
  1543       LLVMValue::jint_constant(__LINE__),
  1544       EX_CHECK_NONE);
  1546     Value *pending_exception = get_pending_exception();
  1547     clear_pending_exception();
  1548     handle_exception(pending_exception, EX_CHECK_FULL);
  1550     set_current_state(saved_state);
  1551     builder()->SetInsertPoint(success);
  1552     push(SharkValue::create_generic(klass, object, false));
  1554   else {
  1555     push(
  1556       SharkValue::create_jint(
  1557         builder()->CreateIntCast(
  1558           builder()->CreateICmpEQ(
  1559             result, LLVMValue::jint_constant(IC_IS_INSTANCE)),
  1560           SharkType::jint_type(), false), false));
  1564 void SharkTopLevelBlock::do_trapping_instance_check(ciKlass* klass) {
  1565   BasicBlock *not_null = function()->CreateBlock("not_null");
  1566   BasicBlock *is_null  = function()->CreateBlock("null");
  1568   // Leave the object on the stack so it's there if we trap
  1569   builder()->CreateCondBr(
  1570     builder()->CreateICmpEQ(xstack(0)->jobject_value(), LLVMValue::null()),
  1571     is_null, not_null);
  1572   SharkState *saved_state = current_state()->copy();
  1574   // If it's not null then we need to trap
  1575   builder()->SetInsertPoint(not_null);
  1576   set_current_state(saved_state->copy());
  1577   do_trap(
  1578     Deoptimization::make_trap_request(
  1579       Deoptimization::Reason_uninitialized,
  1580       Deoptimization::Action_reinterpret));
  1582   // If it's null then we're ok
  1583   builder()->SetInsertPoint(is_null);
  1584   set_current_state(saved_state);
  1585   if (bc() == Bytecodes::_checkcast) {
  1586     push(SharkValue::create_generic(klass, pop()->jobject_value(), false));
  1588   else {
  1589     pop();
  1590     push(SharkValue::jint_constant(0));
  1594 void SharkTopLevelBlock::do_new() {
  1595   bool will_link;
  1596   ciInstanceKlass* klass = iter()->get_klass(will_link)->as_instance_klass();
  1597   assert(will_link, "typeflow responsibility");
  1599   BasicBlock *got_tlab            = NULL;
  1600   BasicBlock *heap_alloc          = NULL;
  1601   BasicBlock *retry               = NULL;
  1602   BasicBlock *got_heap            = NULL;
  1603   BasicBlock *initialize          = NULL;
  1604   BasicBlock *got_fast            = NULL;
  1605   BasicBlock *slow_alloc_and_init = NULL;
  1606   BasicBlock *got_slow            = NULL;
  1607   BasicBlock *push_object         = NULL;
  1609   SharkState *fast_state = NULL;
  1611   Value *tlab_object = NULL;
  1612   Value *heap_object = NULL;
  1613   Value *fast_object = NULL;
  1614   Value *slow_object = NULL;
  1615   Value *object      = NULL;
  1617   // The fast path
  1618   if (!Klass::layout_helper_needs_slow_path(klass->layout_helper())) {
  1619     if (UseTLAB) {
  1620       got_tlab          = function()->CreateBlock("got_tlab");
  1621       heap_alloc        = function()->CreateBlock("heap_alloc");
  1623     retry               = function()->CreateBlock("retry");
  1624     got_heap            = function()->CreateBlock("got_heap");
  1625     initialize          = function()->CreateBlock("initialize");
  1626     slow_alloc_and_init = function()->CreateBlock("slow_alloc_and_init");
  1627     push_object         = function()->CreateBlock("push_object");
  1629     size_t size_in_bytes = klass->size_helper() << LogHeapWordSize;
  1631     // Thread local allocation
  1632     if (UseTLAB) {
  1633       Value *top_addr = builder()->CreateAddressOfStructEntry(
  1634         thread(), Thread::tlab_top_offset(),
  1635         PointerType::getUnqual(SharkType::intptr_type()),
  1636         "top_addr");
  1638       Value *end = builder()->CreateValueOfStructEntry(
  1639         thread(), Thread::tlab_end_offset(),
  1640         SharkType::intptr_type(),
  1641         "end");
  1643       Value *old_top = builder()->CreateLoad(top_addr, "old_top");
  1644       Value *new_top = builder()->CreateAdd(
  1645         old_top, LLVMValue::intptr_constant(size_in_bytes));
  1647       builder()->CreateCondBr(
  1648         builder()->CreateICmpULE(new_top, end),
  1649         got_tlab, heap_alloc);
  1651       builder()->SetInsertPoint(got_tlab);
  1652       tlab_object = builder()->CreateIntToPtr(
  1653         old_top, SharkType::oop_type(), "tlab_object");
  1655       builder()->CreateStore(new_top, top_addr);
  1656       builder()->CreateBr(initialize);
  1658       builder()->SetInsertPoint(heap_alloc);
  1661     // Heap allocation
  1662     Value *top_addr = builder()->CreateIntToPtr(
  1663         LLVMValue::intptr_constant((intptr_t) Universe::heap()->top_addr()),
  1664       PointerType::getUnqual(SharkType::intptr_type()),
  1665       "top_addr");
  1667     Value *end = builder()->CreateLoad(
  1668       builder()->CreateIntToPtr(
  1669         LLVMValue::intptr_constant((intptr_t) Universe::heap()->end_addr()),
  1670         PointerType::getUnqual(SharkType::intptr_type())),
  1671       "end");
  1673     builder()->CreateBr(retry);
  1674     builder()->SetInsertPoint(retry);
  1676     Value *old_top = builder()->CreateLoad(top_addr, "top");
  1677     Value *new_top = builder()->CreateAdd(
  1678       old_top, LLVMValue::intptr_constant(size_in_bytes));
  1680     builder()->CreateCondBr(
  1681       builder()->CreateICmpULE(new_top, end),
  1682       got_heap, slow_alloc_and_init);
  1684     builder()->SetInsertPoint(got_heap);
  1685     heap_object = builder()->CreateIntToPtr(
  1686       old_top, SharkType::oop_type(), "heap_object");
  1688     Value *check = builder()->CreateCmpxchgPtr(new_top, top_addr, old_top);
  1689     builder()->CreateCondBr(
  1690       builder()->CreateICmpEQ(old_top, check),
  1691       initialize, retry);
  1693     // Initialize the object
  1694     builder()->SetInsertPoint(initialize);
  1695     if (tlab_object) {
  1696       PHINode *phi = builder()->CreatePHI(
  1697         SharkType::oop_type(), "fast_object");
  1698       phi->addIncoming(tlab_object, got_tlab);
  1699       phi->addIncoming(heap_object, got_heap);
  1700       fast_object = phi;
  1702     else {
  1703       fast_object = heap_object;
  1706     builder()->CreateMemset(
  1707       builder()->CreateBitCast(
  1708         fast_object, PointerType::getUnqual(SharkType::jbyte_type())),
  1709       LLVMValue::jbyte_constant(0),
  1710       LLVMValue::jint_constant(size_in_bytes),
  1711       LLVMValue::jint_constant(HeapWordSize));
  1713     Value *mark_addr = builder()->CreateAddressOfStructEntry(
  1714       fast_object, in_ByteSize(oopDesc::mark_offset_in_bytes()),
  1715       PointerType::getUnqual(SharkType::intptr_type()),
  1716       "mark_addr");
  1718     Value *klass_addr = builder()->CreateAddressOfStructEntry(
  1719       fast_object, in_ByteSize(oopDesc::klass_offset_in_bytes()),
  1720       PointerType::getUnqual(SharkType::oop_type()),
  1721       "klass_addr");
  1723     // Set the mark
  1724     intptr_t mark;
  1725     if (UseBiasedLocking) {
  1726       Unimplemented();
  1728     else {
  1729       mark = (intptr_t) markOopDesc::prototype();
  1731     builder()->CreateStore(LLVMValue::intptr_constant(mark), mark_addr);
  1733     // Set the class
  1734     Value *rtklass = builder()->CreateInlineOop(klass);
  1735     builder()->CreateStore(rtklass, klass_addr);
  1736     got_fast = builder()->GetInsertBlock();
  1738     builder()->CreateBr(push_object);
  1739     builder()->SetInsertPoint(slow_alloc_and_init);
  1740     fast_state = current_state()->copy();
  1743   // The slow path
  1744   call_vm(
  1745     builder()->new_instance(),
  1746     LLVMValue::jint_constant(iter()->get_klass_index()),
  1747     EX_CHECK_FULL);
  1748   slow_object = get_vm_result();
  1749   got_slow = builder()->GetInsertBlock();
  1751   // Push the object
  1752   if (push_object) {
  1753     builder()->CreateBr(push_object);
  1754     builder()->SetInsertPoint(push_object);
  1756   if (fast_object) {
  1757     PHINode *phi = builder()->CreatePHI(SharkType::oop_type(), "object");
  1758     phi->addIncoming(fast_object, got_fast);
  1759     phi->addIncoming(slow_object, got_slow);
  1760     object = phi;
  1761     current_state()->merge(fast_state, got_fast, got_slow);
  1763   else {
  1764     object = slow_object;
  1767   push(SharkValue::create_jobject(object, true));
  1770 void SharkTopLevelBlock::do_newarray() {
  1771   BasicType type = (BasicType) iter()->get_index();
  1773   call_vm(
  1774     builder()->newarray(),
  1775     LLVMValue::jint_constant(type),
  1776     pop()->jint_value(),
  1777     EX_CHECK_FULL);
  1779   ciArrayKlass *array_klass = ciArrayKlass::make(ciType::make(type));
  1780   push(SharkValue::create_generic(array_klass, get_vm_result(), true));
  1783 void SharkTopLevelBlock::do_anewarray() {
  1784   bool will_link;
  1785   ciKlass *klass = iter()->get_klass(will_link);
  1786   assert(will_link, "typeflow responsibility");
  1788   ciObjArrayKlass *array_klass = ciObjArrayKlass::make(klass);
  1789   if (!array_klass->is_loaded()) {
  1790     Unimplemented();
  1793   call_vm(
  1794     builder()->anewarray(),
  1795     LLVMValue::jint_constant(iter()->get_klass_index()),
  1796     pop()->jint_value(),
  1797     EX_CHECK_FULL);
  1799   push(SharkValue::create_generic(array_klass, get_vm_result(), true));
  1802 void SharkTopLevelBlock::do_multianewarray() {
  1803   bool will_link;
  1804   ciArrayKlass *array_klass = iter()->get_klass(will_link)->as_array_klass();
  1805   assert(will_link, "typeflow responsibility");
  1807   // The dimensions are stack values, so we use their slots for the
  1808   // dimensions array.  Note that we are storing them in the reverse
  1809   // of normal stack order.
  1810   int ndims = iter()->get_dimensions();
  1812   Value *dimensions = stack()->slot_addr(
  1813     stack()->stack_slots_offset() + max_stack() - xstack_depth(),
  1814     ArrayType::get(SharkType::jint_type(), ndims),
  1815     "dimensions");
  1817   for (int i = 0; i < ndims; i++) {
  1818     builder()->CreateStore(
  1819       xstack(ndims - 1 - i)->jint_value(),
  1820       builder()->CreateStructGEP(dimensions, i));
  1823   call_vm(
  1824     builder()->multianewarray(),
  1825     LLVMValue::jint_constant(iter()->get_klass_index()),
  1826     LLVMValue::jint_constant(ndims),
  1827     builder()->CreateStructGEP(dimensions, 0),
  1828     EX_CHECK_FULL);
  1830   // Now we can pop the dimensions off the stack
  1831   for (int i = 0; i < ndims; i++)
  1832     pop();
  1834   push(SharkValue::create_generic(array_klass, get_vm_result(), true));
  1837 void SharkTopLevelBlock::acquire_method_lock() {
  1838   Value *lockee;
  1839   if (target()->is_static())
  1840     lockee = builder()->CreateInlineOop(target()->holder()->java_mirror());
  1841   else
  1842     lockee = local(0)->jobject_value();
  1844   iter()->force_bci(start()); // for the decache in acquire_lock
  1845   acquire_lock(lockee, EX_CHECK_NO_CATCH);
  1848 void SharkTopLevelBlock::do_monitorenter() {
  1849   SharkValue *lockee = pop();
  1850   check_null(lockee);
  1851   acquire_lock(lockee->jobject_value(), EX_CHECK_FULL);
  1854 void SharkTopLevelBlock::do_monitorexit() {
  1855   pop(); // don't need this (monitors are block structured)
  1856   release_lock(EX_CHECK_NO_CATCH);
  1859 void SharkTopLevelBlock::acquire_lock(Value *lockee, int exception_action) {
  1860   BasicBlock *try_recursive = function()->CreateBlock("try_recursive");
  1861   BasicBlock *got_recursive = function()->CreateBlock("got_recursive");
  1862   BasicBlock *not_recursive = function()->CreateBlock("not_recursive");
  1863   BasicBlock *acquired_fast = function()->CreateBlock("acquired_fast");
  1864   BasicBlock *lock_acquired = function()->CreateBlock("lock_acquired");
  1866   int monitor = num_monitors();
  1867   Value *monitor_addr        = stack()->monitor_addr(monitor);
  1868   Value *monitor_object_addr = stack()->monitor_object_addr(monitor);
  1869   Value *monitor_header_addr = stack()->monitor_header_addr(monitor);
  1871   // Store the object and mark the slot as live
  1872   builder()->CreateStore(lockee, monitor_object_addr);
  1873   set_num_monitors(monitor + 1);
  1875   // Try a simple lock
  1876   Value *mark_addr = builder()->CreateAddressOfStructEntry(
  1877     lockee, in_ByteSize(oopDesc::mark_offset_in_bytes()),
  1878     PointerType::getUnqual(SharkType::intptr_type()),
  1879     "mark_addr");
  1881   Value *mark = builder()->CreateLoad(mark_addr, "mark");
  1882   Value *disp = builder()->CreateOr(
  1883     mark, LLVMValue::intptr_constant(markOopDesc::unlocked_value), "disp");
  1884   builder()->CreateStore(disp, monitor_header_addr);
  1886   Value *lock = builder()->CreatePtrToInt(
  1887     monitor_header_addr, SharkType::intptr_type());
  1888   Value *check = builder()->CreateCmpxchgPtr(lock, mark_addr, disp);
  1889   builder()->CreateCondBr(
  1890     builder()->CreateICmpEQ(disp, check),
  1891     acquired_fast, try_recursive);
  1893   // Locking failed, but maybe this thread already owns it
  1894   builder()->SetInsertPoint(try_recursive);
  1895   Value *addr = builder()->CreateAnd(
  1896     disp,
  1897     LLVMValue::intptr_constant(~markOopDesc::lock_mask_in_place));
  1899   // NB we use the entire stack, but JavaThread::is_lock_owned()
  1900   // uses a more limited range.  I don't think it hurts though...
  1901   Value *stack_limit = builder()->CreateValueOfStructEntry(
  1902     thread(), Thread::stack_base_offset(),
  1903     SharkType::intptr_type(),
  1904     "stack_limit");
  1906   assert(sizeof(size_t) == sizeof(intptr_t), "should be");
  1907   Value *stack_size = builder()->CreateValueOfStructEntry(
  1908     thread(), Thread::stack_size_offset(),
  1909     SharkType::intptr_type(),
  1910     "stack_size");
  1912   Value *stack_start =
  1913     builder()->CreateSub(stack_limit, stack_size, "stack_start");
  1915   builder()->CreateCondBr(
  1916     builder()->CreateAnd(
  1917       builder()->CreateICmpUGE(addr, stack_start),
  1918       builder()->CreateICmpULT(addr, stack_limit)),
  1919     got_recursive, not_recursive);
  1921   builder()->SetInsertPoint(got_recursive);
  1922   builder()->CreateStore(LLVMValue::intptr_constant(0), monitor_header_addr);
  1923   builder()->CreateBr(acquired_fast);
  1925   // Create an edge for the state merge
  1926   builder()->SetInsertPoint(acquired_fast);
  1927   SharkState *fast_state = current_state()->copy();
  1928   builder()->CreateBr(lock_acquired);
  1930   // It's not a recursive case so we need to drop into the runtime
  1931   builder()->SetInsertPoint(not_recursive);
  1932   call_vm(
  1933     builder()->monitorenter(), monitor_addr,
  1934     exception_action | EAM_MONITOR_FUDGE);
  1935   BasicBlock *acquired_slow = builder()->GetInsertBlock();
  1936   builder()->CreateBr(lock_acquired);
  1938   // All done
  1939   builder()->SetInsertPoint(lock_acquired);
  1940   current_state()->merge(fast_state, acquired_fast, acquired_slow);
  1943 void SharkTopLevelBlock::release_lock(int exception_action) {
  1944   BasicBlock *not_recursive = function()->CreateBlock("not_recursive");
  1945   BasicBlock *released_fast = function()->CreateBlock("released_fast");
  1946   BasicBlock *slow_path     = function()->CreateBlock("slow_path");
  1947   BasicBlock *lock_released = function()->CreateBlock("lock_released");
  1949   int monitor = num_monitors() - 1;
  1950   Value *monitor_addr        = stack()->monitor_addr(monitor);
  1951   Value *monitor_object_addr = stack()->monitor_object_addr(monitor);
  1952   Value *monitor_header_addr = stack()->monitor_header_addr(monitor);
  1954   // If it is recursive then we're already done
  1955   Value *disp = builder()->CreateLoad(monitor_header_addr);
  1956   builder()->CreateCondBr(
  1957     builder()->CreateICmpEQ(disp, LLVMValue::intptr_constant(0)),
  1958     released_fast, not_recursive);
  1960   // Try a simple unlock
  1961   builder()->SetInsertPoint(not_recursive);
  1963   Value *lock = builder()->CreatePtrToInt(
  1964     monitor_header_addr, SharkType::intptr_type());
  1966   Value *lockee = builder()->CreateLoad(monitor_object_addr);
  1968   Value *mark_addr = builder()->CreateAddressOfStructEntry(
  1969     lockee, in_ByteSize(oopDesc::mark_offset_in_bytes()),
  1970     PointerType::getUnqual(SharkType::intptr_type()),
  1971     "mark_addr");
  1973   Value *check = builder()->CreateCmpxchgPtr(disp, mark_addr, lock);
  1974   builder()->CreateCondBr(
  1975     builder()->CreateICmpEQ(lock, check),
  1976     released_fast, slow_path);
  1978   // Create an edge for the state merge
  1979   builder()->SetInsertPoint(released_fast);
  1980   SharkState *fast_state = current_state()->copy();
  1981   builder()->CreateBr(lock_released);
  1983   // Need to drop into the runtime to release this one
  1984   builder()->SetInsertPoint(slow_path);
  1985   call_vm(builder()->monitorexit(), monitor_addr, exception_action);
  1986   BasicBlock *released_slow = builder()->GetInsertBlock();
  1987   builder()->CreateBr(lock_released);
  1989   // All done
  1990   builder()->SetInsertPoint(lock_released);
  1991   current_state()->merge(fast_state, released_fast, released_slow);
  1993   // The object slot is now dead
  1994   set_num_monitors(monitor);

mercurial