src/hotspot/share/shark/sharkTopLevelBlock.hpp
changeset 47701 be620a591379
parent 47519 b1f360639517
parent 47700 c6d2381c6932
child 47702 cf8310446245
child 55762 e947a3a50a95
child 55767 8e22715afabc
child 55771 164d1a901f6e
equal deleted inserted replaced
47519:b1f360639517 47701:be620a591379
     1 /*
       
     2  * Copyright (c) 1999, 2010, 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  */
       
    25 
       
    26 #ifndef SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP
       
    27 #define SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP
       
    28 
       
    29 #include "ci/ciStreams.hpp"
       
    30 #include "ci/ciType.hpp"
       
    31 #include "ci/ciTypeFlow.hpp"
       
    32 #include "interpreter/bytecodes.hpp"
       
    33 #include "memory/allocation.hpp"
       
    34 #include "shark/llvmHeaders.hpp"
       
    35 #include "shark/sharkBlock.hpp"
       
    36 #include "shark/sharkBuilder.hpp"
       
    37 #include "shark/sharkFunction.hpp"
       
    38 #include "shark/sharkState.hpp"
       
    39 #include "shark/sharkValue.hpp"
       
    40 
       
    41 class SharkTopLevelBlock : public SharkBlock {
       
    42  public:
       
    43   SharkTopLevelBlock(SharkFunction* function, ciTypeFlow::Block* ciblock)
       
    44     : SharkBlock(function),
       
    45       _function(function),
       
    46       _ciblock(ciblock),
       
    47       _entered(false),
       
    48       _has_trap(false),
       
    49       _needs_phis(false),
       
    50       _entry_state(NULL),
       
    51       _entry_block(NULL) {}
       
    52 
       
    53  private:
       
    54   SharkFunction*     _function;
       
    55   ciTypeFlow::Block* _ciblock;
       
    56 
       
    57  public:
       
    58   SharkFunction* function() const {
       
    59     return _function;
       
    60   }
       
    61   ciTypeFlow::Block* ciblock() const {
       
    62     return _ciblock;
       
    63   }
       
    64 
       
    65   // Function properties
       
    66  public:
       
    67   SharkStack* stack() const {
       
    68     return function()->stack();
       
    69   }
       
    70 
       
    71   // Typeflow properties
       
    72  public:
       
    73   int index() const {
       
    74     return ciblock()->pre_order();
       
    75   }
       
    76   bool is_backedge_copy() const {
       
    77     return ciblock()->is_backedge_copy();
       
    78   }
       
    79   int stack_depth_at_entry() const {
       
    80     return ciblock()->stack_size();
       
    81   }
       
    82   ciType* local_type_at_entry(int index) const {
       
    83     return ciblock()->local_type_at(index);
       
    84   }
       
    85   ciType* stack_type_at_entry(int slot) const {
       
    86     return ciblock()->stack_type_at(slot);
       
    87   }
       
    88   int start() const {
       
    89     return ciblock()->start();
       
    90   }
       
    91   int limit() const {
       
    92     return ciblock()->limit();
       
    93   }
       
    94   bool falls_through() const {
       
    95     return ciblock()->control() == ciBlock::fall_through_bci;
       
    96   }
       
    97   int num_successors() const {
       
    98     return ciblock()->successors()->length();
       
    99   }
       
   100   SharkTopLevelBlock* successor(int index) const {
       
   101     return function()->block(ciblock()->successors()->at(index)->pre_order());
       
   102   }
       
   103   SharkTopLevelBlock* bci_successor(int bci) const;
       
   104 
       
   105   // Exceptions
       
   106  private:
       
   107   GrowableArray<ciExceptionHandler*>* _exc_handlers;
       
   108   GrowableArray<SharkTopLevelBlock*>* _exceptions;
       
   109 
       
   110  private:
       
   111   void compute_exceptions();
       
   112 
       
   113  private:
       
   114   int num_exceptions() const {
       
   115     return _exc_handlers->length();
       
   116   }
       
   117   ciExceptionHandler* exc_handler(int index) const {
       
   118     return _exc_handlers->at(index);
       
   119   }
       
   120   SharkTopLevelBlock* exception(int index) const {
       
   121     return _exceptions->at(index);
       
   122   }
       
   123 
       
   124   // Traps
       
   125  private:
       
   126   bool _has_trap;
       
   127   int  _trap_request;
       
   128   int  _trap_bci;
       
   129 
       
   130   void set_trap(int trap_request, int trap_bci) {
       
   131     assert(!has_trap(), "shouldn't have");
       
   132     _has_trap     = true;
       
   133     _trap_request = trap_request;
       
   134     _trap_bci     = trap_bci;
       
   135   }
       
   136 
       
   137  private:
       
   138   bool has_trap() {
       
   139     return _has_trap;
       
   140   }
       
   141   int trap_request() {
       
   142     assert(has_trap(), "should have");
       
   143     return _trap_request;
       
   144   }
       
   145   int trap_bci() {
       
   146     assert(has_trap(), "should have");
       
   147     return _trap_bci;
       
   148   }
       
   149 
       
   150  private:
       
   151   void scan_for_traps();
       
   152 
       
   153  private:
       
   154   bool static_field_ok_in_clinit(ciField* field);
       
   155 
       
   156   // Entry state
       
   157  private:
       
   158   bool _entered;
       
   159   bool _needs_phis;
       
   160 
       
   161  public:
       
   162   bool entered() const {
       
   163     return _entered;
       
   164   }
       
   165   bool needs_phis() const {
       
   166     return _needs_phis;
       
   167   }
       
   168 
       
   169  private:
       
   170   void enter(SharkTopLevelBlock* predecessor, bool is_exception);
       
   171 
       
   172  public:
       
   173   void enter() {
       
   174     enter(NULL, false);
       
   175   }
       
   176 
       
   177  private:
       
   178   SharkState* _entry_state;
       
   179 
       
   180  private:
       
   181   SharkState* entry_state();
       
   182 
       
   183  private:
       
   184   llvm::BasicBlock* _entry_block;
       
   185 
       
   186  public:
       
   187   llvm::BasicBlock* entry_block() const {
       
   188     return _entry_block;
       
   189   }
       
   190 
       
   191  public:
       
   192   void initialize();
       
   193 
       
   194  public:
       
   195   void add_incoming(SharkState* incoming_state);
       
   196 
       
   197   // Method
       
   198  public:
       
   199   llvm::Value* method() {
       
   200     return current_state()->method();
       
   201   }
       
   202 
       
   203   // Temporary oop storage
       
   204  public:
       
   205   void set_oop_tmp(llvm::Value* value) {
       
   206     assert(value, "value must be non-NULL (will be reset by get_oop_tmp)");
       
   207     assert(!current_state()->oop_tmp(), "oop_tmp gets and sets must match");
       
   208     current_state()->set_oop_tmp(value);
       
   209   }
       
   210   llvm::Value* get_oop_tmp() {
       
   211     llvm::Value* value = current_state()->oop_tmp();
       
   212     assert(value, "oop_tmp gets and sets must match");
       
   213     current_state()->set_oop_tmp(NULL);
       
   214     return value;
       
   215   }
       
   216 
       
   217   // Cache and decache
       
   218  private:
       
   219   void decache_for_Java_call(ciMethod* callee);
       
   220   void cache_after_Java_call(ciMethod* callee);
       
   221   void decache_for_VM_call();
       
   222   void cache_after_VM_call();
       
   223   void decache_for_trap();
       
   224 
       
   225   // Monitors
       
   226  private:
       
   227   int num_monitors() {
       
   228     return current_state()->num_monitors();
       
   229   }
       
   230   int set_num_monitors(int num_monitors) {
       
   231     current_state()->set_num_monitors(num_monitors);
       
   232   }
       
   233 
       
   234   // Code generation
       
   235  public:
       
   236   void emit_IR();
       
   237 
       
   238   // Branch helpers
       
   239  private:
       
   240   void do_branch(int successor_index);
       
   241 
       
   242   // Zero checks
       
   243  private:
       
   244   void do_zero_check(SharkValue* value);
       
   245   void zero_check_value(SharkValue* value, llvm::BasicBlock* continue_block);
       
   246 
       
   247  public:
       
   248   void do_deferred_zero_check(SharkValue*       value,
       
   249                               int               bci,
       
   250                               SharkState*       saved_state,
       
   251                               llvm::BasicBlock* continue_block);
       
   252   // Exceptions
       
   253  private:
       
   254   llvm::Value* pending_exception_address() const {
       
   255     return builder()->CreateAddressOfStructEntry(
       
   256       thread(), Thread::pending_exception_offset(),
       
   257       llvm::PointerType::getUnqual(SharkType::oop_type()),
       
   258       "pending_exception_addr");
       
   259   }
       
   260   llvm::LoadInst* get_pending_exception() const {
       
   261     return builder()->CreateLoad(
       
   262       pending_exception_address(), "pending_exception");
       
   263   }
       
   264   void clear_pending_exception() const {
       
   265     builder()->CreateStore(LLVMValue::null(), pending_exception_address());
       
   266   }
       
   267  public:
       
   268   enum ExceptionActionMask {
       
   269     // The actual bitmasks that things test against
       
   270     EAM_CHECK         = 1, // whether to check for pending exceptions
       
   271     EAM_HANDLE        = 2, // whether to attempt to handle pending exceptions
       
   272     EAM_MONITOR_FUDGE = 4, // whether the monitor count needs adjusting
       
   273 
       
   274     // More convenient values for passing
       
   275     EX_CHECK_NONE     = 0,
       
   276     EX_CHECK_NO_CATCH = EAM_CHECK,
       
   277     EX_CHECK_FULL     = EAM_CHECK | EAM_HANDLE
       
   278   };
       
   279   void check_pending_exception(int action);
       
   280   void handle_exception(llvm::Value* exception, int action);
       
   281   void marshal_exception_fast(int num_options);
       
   282   void marshal_exception_slow(int num_options);
       
   283   llvm::BasicBlock* handler_for_exception(int index);
       
   284 
       
   285   // VM calls
       
   286  private:
       
   287   llvm::CallInst* call_vm(llvm::Value*  callee,
       
   288                           llvm::Value** args_start,
       
   289                           llvm::Value** args_end,
       
   290                           int           exception_action) {
       
   291     decache_for_VM_call();
       
   292     stack()->CreateSetLastJavaFrame();
       
   293     llvm::CallInst *res = builder()->CreateCall(callee, llvm::makeArrayRef(args_start, args_end));
       
   294     stack()->CreateResetLastJavaFrame();
       
   295     cache_after_VM_call();
       
   296     if (exception_action & EAM_CHECK) {
       
   297       check_pending_exception(exception_action);
       
   298       current_state()->set_has_safepointed(true);
       
   299     }
       
   300     return res;
       
   301   }
       
   302 
       
   303  public:
       
   304   llvm::CallInst* call_vm(llvm::Value* callee,
       
   305                           int          exception_action) {
       
   306     llvm::Value *args[] = {thread()};
       
   307     return call_vm(callee, args, args + 1, exception_action);
       
   308   }
       
   309   llvm::CallInst* call_vm(llvm::Value* callee,
       
   310                           llvm::Value* arg1,
       
   311                           int          exception_action) {
       
   312     llvm::Value *args[] = {thread(), arg1};
       
   313     return call_vm(callee, args, args + 2, exception_action);
       
   314   }
       
   315   llvm::CallInst* call_vm(llvm::Value* callee,
       
   316                           llvm::Value* arg1,
       
   317                           llvm::Value* arg2,
       
   318                           int          exception_action) {
       
   319     llvm::Value *args[] = {thread(), arg1, arg2};
       
   320     return call_vm(callee, args, args + 3, exception_action);
       
   321   }
       
   322   llvm::CallInst* call_vm(llvm::Value* callee,
       
   323                           llvm::Value* arg1,
       
   324                           llvm::Value* arg2,
       
   325                           llvm::Value* arg3,
       
   326                           int          exception_action) {
       
   327     llvm::Value *args[] = {thread(), arg1, arg2, arg3};
       
   328     return call_vm(callee, args, args + 4, exception_action);
       
   329   }
       
   330 
       
   331   // VM call oop return handling
       
   332  private:
       
   333   llvm::LoadInst* get_vm_result() const {
       
   334     llvm::Value *addr = builder()->CreateAddressOfStructEntry(
       
   335       thread(), JavaThread::vm_result_offset(),
       
   336       llvm::PointerType::getUnqual(SharkType::oop_type()),
       
   337       "vm_result_addr");
       
   338     llvm::LoadInst *result = builder()->CreateLoad(addr, "vm_result");
       
   339     builder()->CreateStore(LLVMValue::null(), addr);
       
   340     return result;
       
   341   }
       
   342 
       
   343   // Synchronization
       
   344  private:
       
   345   void acquire_lock(llvm::Value* lockee, int exception_action);
       
   346   void release_lock(int exception_action);
       
   347 
       
   348  public:
       
   349   void acquire_method_lock();
       
   350 
       
   351   // Bounds checks
       
   352  private:
       
   353   void check_bounds(SharkValue* array, SharkValue* index);
       
   354 
       
   355   // Safepoints
       
   356  private:
       
   357   void maybe_add_safepoint();
       
   358   void maybe_add_backedge_safepoint();
       
   359 
       
   360   // Loop safepoint removal
       
   361  private:
       
   362   bool _can_reach_visited;
       
   363 
       
   364   bool can_reach(SharkTopLevelBlock* other);
       
   365   bool can_reach_helper(SharkTopLevelBlock* other);
       
   366 
       
   367   // Traps
       
   368  private:
       
   369   llvm::BasicBlock* make_trap(int trap_bci, int trap_request);
       
   370   void do_trap(int trap_request);
       
   371 
       
   372   // Returns
       
   373  private:
       
   374   void call_register_finalizer(llvm::Value* receiver);
       
   375   void handle_return(BasicType type, llvm::Value* exception);
       
   376 
       
   377   // arraylength
       
   378  private:
       
   379   void do_arraylength();
       
   380 
       
   381   // *aload and *astore
       
   382  private:
       
   383   void do_aload(BasicType basic_type);
       
   384   void do_astore(BasicType basic_type);
       
   385 
       
   386   // *return and athrow
       
   387  private:
       
   388   void do_return(BasicType type);
       
   389   void do_athrow();
       
   390 
       
   391   // goto*
       
   392  private:
       
   393   void do_goto();
       
   394 
       
   395   // jsr* and ret
       
   396  private:
       
   397   void do_jsr();
       
   398   void do_ret();
       
   399 
       
   400   // if*
       
   401  private:
       
   402   void do_if_helper(llvm::ICmpInst::Predicate p,
       
   403                     llvm::Value*              b,
       
   404                     llvm::Value*              a,
       
   405                     SharkState*               if_taken_state,
       
   406                     SharkState*               not_taken_state);
       
   407   void do_if(llvm::ICmpInst::Predicate p, SharkValue* b, SharkValue* a);
       
   408 
       
   409   // tableswitch and lookupswitch
       
   410  private:
       
   411   void do_switch();
       
   412 
       
   413   // invoke*
       
   414  private:
       
   415   ciMethod* improve_virtual_call(ciMethod*        caller,
       
   416                                  ciInstanceKlass* klass,
       
   417                                  ciMethod*        dest_method,
       
   418                                  ciType*          receiver_type);
       
   419   llvm::Value* get_direct_callee(ciMethod* method);
       
   420   llvm::Value* get_virtual_callee(SharkValue* receiver, int vtable_index);
       
   421   llvm::Value* get_interface_callee(SharkValue* receiver, ciMethod* method);
       
   422 
       
   423   void do_call();
       
   424 
       
   425   // checkcast and instanceof
       
   426  private:
       
   427   bool static_subtype_check(ciKlass* check_klass, ciKlass* object_klass);
       
   428   void do_full_instance_check(ciKlass* klass);
       
   429   void do_trapping_instance_check(ciKlass* klass);
       
   430 
       
   431   void do_instance_check();
       
   432   bool maybe_do_instanceof_if();
       
   433 
       
   434   // new and *newarray
       
   435  private:
       
   436   void do_new();
       
   437   void do_newarray();
       
   438   void do_anewarray();
       
   439   void do_multianewarray();
       
   440 
       
   441   // monitorenter and monitorexit
       
   442  private:
       
   443   void do_monitorenter();
       
   444   void do_monitorexit();
       
   445 };
       
   446 
       
   447 #endif // SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP