hotspot/src/share/vm/c1/c1_IR.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7397 5b173b4ca846
child 11886 feebf5c9f40c
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5046
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5046
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5046
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5046
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    25
#ifndef SHARE_VM_C1_C1_IR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    26
#define SHARE_VM_C1_C1_IR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    28
#include "c1/c1_Instruction.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    29
#include "ci/ciExceptionHandler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    30
#include "ci/ciMethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    31
#include "ci/ciStreams.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    32
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
    33
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// An XHandler is a C1 internal description for an exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class XHandler: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  ciExceptionHandler* _desc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  BlockBegin*         _entry_block;  // Entry block of xhandler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  LIR_List*           _entry_code;   // LIR-operations that must be executed before jumping to entry_block
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  int                 _entry_pco;    // pco where entry_code (or entry_block if no entry_code) starts
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  int                 _phi_operand;  // For resolving of phi functions at begin of entry_block
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  int                 _scope_count;  // for filling ExceptionRangeEntry::scope_count
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  int                 _lir_op_id;    // op_id of the LIR-operation throwing to this handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  XHandler(ciExceptionHandler* desc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    : _desc(desc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    , _entry_block(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    , _entry_code(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
    , _entry_pco(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    , _phi_operand(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    , _scope_count(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    , _lir_op_id(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  XHandler(XHandler* other)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
    : _desc(other->_desc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    , _entry_block(other->_entry_block)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    , _entry_code(other->_entry_code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    , _entry_pco(other->_entry_pco)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    , _phi_operand(other->_phi_operand)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    , _scope_count(other->_scope_count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    , _lir_op_id(other->_lir_op_id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  // accessors for data of ciExceptionHandler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  int  beg_bci() const                           { return _desc->start(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  int  end_bci() const                           { return _desc->limit(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  int  handler_bci() const                       { return _desc->handler_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  bool is_catch_all() const                      { return _desc->is_catch_all(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  int  catch_type() const                        { return _desc->catch_klass_index(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  ciInstanceKlass* catch_klass() const           { return _desc->catch_klass(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  bool covers(int bci) const                     { return beg_bci() <= bci && bci < end_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // accessors for additional fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  BlockBegin* entry_block() const                { return _entry_block; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  LIR_List*   entry_code() const                 { return _entry_code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  int         entry_pco() const                  { return _entry_pco; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  int         phi_operand() const                { assert(_phi_operand != -1, "not set"); return _phi_operand; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  int         scope_count() const                { assert(_scope_count != -1, "not set"); return _scope_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  DEBUG_ONLY(int lir_op_id() const               { return _lir_op_id; });
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  void set_entry_block(BlockBegin* entry_block) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    assert(entry_block->is_set(BlockBegin::exception_entry_flag), "must be an exception handler entry");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    assert(entry_block->bci() == handler_bci(), "bci's must correspond");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    _entry_block = entry_block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  void set_entry_code(LIR_List* entry_code)      { _entry_code = entry_code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  void set_entry_pco(int entry_pco)              { _entry_pco = entry_pco; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  void set_phi_operand(int phi_operand)          { _phi_operand = phi_operand; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  void set_scope_count(int scope_count)          { _scope_count = scope_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  DEBUG_ONLY(void set_lir_op_id(int lir_op_id)   { _lir_op_id = lir_op_id; });
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  bool equals(XHandler* other) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
define_array(_XHandlerArray, XHandler*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
define_stack(_XHandlerList, _XHandlerArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
// XHandlers is the C1 internal list of exception handlers for a method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
class XHandlers: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  _XHandlerList    _list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  XHandlers() : _list()                          { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  XHandlers(ciMethod* method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  XHandlers(XHandlers* other);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  int       length() const                       { return _list.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  XHandler* handler_at(int i) const              { return _list.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  bool      has_handlers() const                 { return _list.length() > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  void      append(XHandler* h)                  { _list.append(h); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  XHandler* remove_last()                        { return _list.pop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  bool      could_catch(ciInstanceKlass* klass, bool type_is_exact) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  bool      equals(XHandlers* others) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
class IRScope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
define_array(IRScopeArray, IRScope*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
define_stack(IRScopeList, IRScopeArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
class Compilation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
class IRScope: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  Compilation*  _compilation;                    // the current compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  IRScope*      _caller;                         // the caller scope, or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  int           _level;                          // the inlining level
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  ciMethod*     _method;                         // the corresponding method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  IRScopeList   _callees;                        // the inlined method scopes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // graph
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  XHandlers*    _xhandlers;                      // the exception handlers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  int           _number_of_locks;                // the number of monitor lock slots needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  bool          _monitor_pairing_ok;             // the monitor pairing info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  BlockBegin*   _start;                          // the start block, successsors are method entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  BitMap        _requires_phi_function;          // bit is set if phi functions at loop headers are necessary for a local variable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // helper functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  BlockBegin* build_graph(Compilation* compilation, int osr_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMethod* method, int osr_bci, bool create_graph = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  Compilation*  compilation() const              { return _compilation; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  IRScope*      caller() const                   { return _caller; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  int           level() const                    { return _level; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  ciMethod*     method() const                   { return _method; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  int           max_stack() const;               // NOTE: expensive
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  BitMap&       requires_phi_function()          { return _requires_phi_function; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  bool          is_top_scope() const             { return _caller == NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  void          add_callee(IRScope* callee)      { _callees.append(callee); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  int           number_of_callees() const        { return _callees.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  IRScope*      callee_no(int i) const           { return _callees.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // accessors, graph
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  bool          is_valid() const                 { return start() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  XHandlers*    xhandlers() const                { return _xhandlers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  int           number_of_locks() const          { return _number_of_locks; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  void          set_min_number_of_locks(int n)   { if (n > _number_of_locks) _number_of_locks = n; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  bool          monitor_pairing_ok() const       { return _monitor_pairing_ok; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  BlockBegin*   start() const                    { return _start; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
// IRScopeDebugInfo records the debug information for a particular IRScope
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
// in a particular CodeEmitInfo.  This allows the information to be computed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
// once early enough for the OopMap to be available to the LIR and also to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
// reemited for different pcs using the same CodeEmitInfo without recomputing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
// everything.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
class IRScopeDebugInfo: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  IRScope*                      _scope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  int                           _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  GrowableArray<ScopeValue*>*   _locals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  GrowableArray<ScopeValue*>*   _expressions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  GrowableArray<MonitorValue*>* _monitors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  IRScopeDebugInfo*             _caller;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  IRScopeDebugInfo(IRScope*                      scope,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
                   int                           bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
                   GrowableArray<ScopeValue*>*   locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
                   GrowableArray<ScopeValue*>*   expressions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
                   GrowableArray<MonitorValue*>* monitors,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
                   IRScopeDebugInfo*             caller):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
      _scope(scope)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    , _locals(locals)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
    , _bci(bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    , _expressions(expressions)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    , _monitors(monitors)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    , _caller(caller) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  IRScope*                      scope()       { return _scope;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  int                           bci()         { return _bci;         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  GrowableArray<ScopeValue*>*   locals()      { return _locals;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  GrowableArray<ScopeValue*>*   expressions() { return _expressions; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  GrowableArray<MonitorValue*>* monitors()    { return _monitors;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  IRScopeDebugInfo*             caller()      { return _caller;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
   226
  //Whether we should reexecute this bytecode for deopt
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
   227
  bool should_reexecute();
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
   228
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4894
diff changeset
   229
  void record_debug_info(DebugInformationRecorder* recorder, int pc_offset, bool topmost, bool is_method_handle_invoke = false) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    if (caller() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
      // Order is significant:  Must record caller first.
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
   232
      caller()->record_debug_info(recorder, pc_offset, false/*topmost*/);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    DebugToken* locvals = recorder->create_scope_values(locals());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    DebugToken* expvals = recorder->create_scope_values(expressions());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    DebugToken* monvals = recorder->create_monitor_values(monitors());
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
   237
    // reexecute allowed only for the topmost frame
4564
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 3795
diff changeset
   238
    bool reexecute = topmost ? should_reexecute() : false;
4894
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 4564
diff changeset
   239
    bool return_oop = false; // This flag will be ignored since it used only for C2 with escape analysis.
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 4564
diff changeset
   240
    recorder->describe_scope(pc_offset, scope()->method(), bci(), reexecute, is_method_handle_invoke, return_oop, locvals, expvals, monvals);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
class CodeEmitInfo: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  friend class LinearScan;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  IRScopeDebugInfo* _scope_debug_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  IRScope*          _scope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  XHandlers*        _exception_handlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  OopMap*           _oop_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  ValueStack*       _stack;                      // used by deoptimization (contains also monitors
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5046
diff changeset
   253
  bool              _is_method_handle_invoke;    // true if the associated call site is a MethodHandle call site.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  FrameMap*     frame_map() const                { return scope()->compilation()->frame_map(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  Compilation*  compilation() const              { return scope()->compilation(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // use scope from ValueStack
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 5707
diff changeset
   261
  CodeEmitInfo(ValueStack* stack, XHandlers* exception_handlers);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // make a copy
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 5707
diff changeset
   264
  CodeEmitInfo(CodeEmitInfo* info, ValueStack* stack = NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  OopMap* oop_map()                              { return _oop_map; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  ciMethod* method() const                       { return _scope->method(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  IRScope* scope() const                         { return _scope; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  XHandlers* exception_handlers() const          { return _exception_handlers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  ValueStack* stack() const                      { return _stack; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  void add_register_oop(LIR_Opr opr);
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5046
diff changeset
   274
  void record_debug_info(DebugInformationRecorder* recorder, int pc_offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5046
diff changeset
   276
  bool     is_method_handle_invoke() const { return _is_method_handle_invoke;     }
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5046
diff changeset
   277
  void set_is_method_handle_invoke(bool x) {        _is_method_handle_invoke = x; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
class IR: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  Compilation*     _compilation;                 // the current compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  IRScope*         _top_scope;                   // the root of the scope hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  WordSize         _locals_size;                 // the space required for all locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  int              _num_loops;                   // Total number of loops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  BlockList*       _code;                        // the blocks in code generation order w/ use counts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  IR(Compilation* compilation, ciMethod* method, int osr_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  bool             is_valid() const              { return top_scope()->is_valid(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  Compilation*     compilation() const           { return _compilation; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  IRScope*         top_scope() const             { return _top_scope; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  int              number_of_locks() const       { return top_scope()->number_of_locks(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  ciMethod*        method() const                { return top_scope()->method(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  BlockBegin*      start() const                 { return top_scope()->start(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  BlockBegin*      std_entry() const             { return start()->end()->as_Base()->std_entry(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  BlockBegin*      osr_entry() const             { return start()->end()->as_Base()->osr_entry(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  WordSize         locals_size() const           { return _locals_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  int              locals_size_in_words() const  { return in_words(_locals_size); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  BlockList*       code() const                  { return _code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  int              num_loops() const             { return _num_loops; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  int              max_stack() const             { return top_scope()->max_stack(); } // expensive
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // ir manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  void optimize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void compute_predecessors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  void split_critical_edges();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  void compute_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  void compute_use_counts();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // The linear-scan order and the code emission order are equal, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // this may change in future
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  BlockList* linear_scan_order() {  assert(_code != NULL, "not computed"); return _code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  void iterate_preorder   (BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  void iterate_postorder  (BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  void iterate_linear_scan_order(BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  static void print(BlockBegin* start, bool cfg_only, bool live_only = false) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  void print(bool cfg_only, bool live_only = false)                           PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  void verify()                                                               PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
// Globally do instruction substitution and remove substituted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
// instructions from the instruction list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5702
diff changeset
   335
class SubstitutionResolver: public BlockClosure, ValueVisitor {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5702
diff changeset
   336
  virtual void visit(Value* v);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  SubstitutionResolver(IR* hir) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    hir->iterate_preorder(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  SubstitutionResolver(BlockBegin* block) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    block->iterate_preorder(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  virtual void block_do(BlockBegin* block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
   349
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6745
diff changeset
   350
#endif // SHARE_VM_C1_C1_IR_HPP