hotspot/src/share/vm/opto/parse1.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14623 70c4c1be0a14
child 15118 1a1a6d1dfaab
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13393
diff changeset
     2
 * Copyright (c) 1997, 2012, 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: 5333
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5333
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: 5333
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: 5889
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    26
#include "compiler/compileLog.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    27
#include "interpreter/linkResolver.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13393
diff changeset
    28
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    29
#include "opto/addnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    30
#include "opto/idealGraphPrinter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    31
#include "opto/locknode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    32
#include "opto/memnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    33
#include "opto/parse.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    34
#include "opto/rootnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    35
#include "opto/runtime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    36
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    37
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    38
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5889
diff changeset
    39
#include "utilities/copy.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// Static array so we can figure out which bytecodes stop us from compiling
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// the most. Some of the non-static variables are needed in bytecodeInfo.cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// and eventually should be encapsulated in a proper class (gri 8/18/98).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    45
int nodes_created              = 0;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    46
int methods_parsed             = 0;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    47
int methods_seen               = 0;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    48
int blocks_parsed              = 0;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    49
int blocks_seen                = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    51
int explicit_null_checks_inserted = 0;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    52
int explicit_null_checks_elided   = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
int all_null_checks_found         = 0, implicit_null_checks              = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
int implicit_null_throws          = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
int reclaim_idx  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
int reclaim_in   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
int reclaim_node = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
bool Parse::BytecodeParseHistogram::_initialized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
uint Parse::BytecodeParseHistogram::_bytecodes_parsed [Bytecodes::number_of_codes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
uint Parse::BytecodeParseHistogram::_nodes_constructed[Bytecodes::number_of_codes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
uint Parse::BytecodeParseHistogram::_nodes_transformed[Bytecodes::number_of_codes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
uint Parse::BytecodeParseHistogram::_new_values       [Bytecodes::number_of_codes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
//------------------------------print_statistics-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
void Parse::print_statistics() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  tty->print_cr("--- Compiler Statistics ---");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  tty->print("Methods seen: %d  Methods parsed: %d", methods_seen, methods_parsed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  tty->print("  Nodes created: %d", nodes_created);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  if (methods_seen != methods_parsed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    tty->print_cr("Reasons for parse failures (NOT cumulative):");
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
    77
  tty->print_cr("Blocks parsed: %d  Blocks seen: %d", blocks_parsed, blocks_seen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  if( explicit_null_checks_inserted )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    tty->print_cr("%d original NULL checks - %d elided (%2d%%); optimizer leaves %d,", explicit_null_checks_inserted, explicit_null_checks_elided, (100*explicit_null_checks_elided)/explicit_null_checks_inserted, all_null_checks_found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  if( all_null_checks_found )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    tty->print_cr("%d made implicit (%2d%%)", implicit_null_checks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
                  (100*implicit_null_checks)/all_null_checks_found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  if( implicit_null_throws )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    tty->print_cr("%d implicit null exceptions at runtime",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
                  implicit_null_throws);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  if( PrintParseStatistics && BytecodeParseHistogram::initialized() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    BytecodeParseHistogram::print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
//------------------------------ON STACK REPLACEMENT---------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// Construct a node which can be used to get incoming state for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
// on stack replacement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
Node *Parse::fetch_interpreter_state(int index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
                                     BasicType bt,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
                                     Node *local_addrs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
                                     Node *local_addrs_base) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  Node *mem = memory(Compile::AliasIdxRaw);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  Node *adr = basic_plus_adr( local_addrs_base, local_addrs, -index*wordSize );
5889
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5547
diff changeset
   104
  Node *ctl = control();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // Very similar to LoadNode::make, except we handle un-aligned longs and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // doubles on Sparc.  Intel can handle them just fine directly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  Node *l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  switch( bt ) {                // Signature is flattened
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   110
  case T_INT:     l = new (C) LoadINode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   111
  case T_FLOAT:   l = new (C) LoadFNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   112
  case T_ADDRESS: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM  ); break;
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   113
  case T_OBJECT:  l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  case T_LONG:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  case T_DOUBLE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    // Since arguments are in reverse order, the argument address 'adr'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    // refers to the back half of the long/double.  Recompute adr.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    if( Matcher::misaligned_doubles_ok ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
      l = (bt == T_DOUBLE)
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   121
        ? (Node*)new (C) LoadDNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   122
        : (Node*)new (C) LoadLNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
      l = (bt == T_DOUBLE)
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   125
        ? (Node*)new (C) LoadD_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   126
        : (Node*)new (C) LoadL_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  return _gvn.transform(l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
// Helper routine to prevent the interpreter from handing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
// unexpected typestate to an OSR method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
// The Node l is a value newly dug out of the interpreter frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
// The type is the type predicted by ciTypeFlow.  Note that it is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
// not a general type, but can only come from Type::get_typeflow_type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
// The safepoint is a map which will feed an uncommon trap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
Node* Parse::check_interpreter_type(Node* l, const Type* type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
                                    SafePointNode* &bad_type_exit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  const TypeOopPtr* tp = type->isa_oopptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // TypeFlow may assert null-ness if a type appears unloaded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  if (type == TypePtr::NULL_PTR ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
      (tp != NULL && !tp->klass()->is_loaded())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    // Value must be null, not a real oop.
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   150
    Node* chk = _gvn.transform( new (C) CmpPNode(l, null()) );
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   151
    Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    IfNode* iff = create_and_map_if(control(), tst, PROB_MAX, COUNT_UNKNOWN);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   153
    set_control(_gvn.transform( new (C) IfTrueNode(iff) ));
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   154
    Node* bad_type = _gvn.transform( new (C) IfFalseNode(iff) );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    bad_type_exit->control()->add_req(bad_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    l = null();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Typeflow can also cut off paths from the CFG, based on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // types which appear unloaded, or call sites which appear unlinked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // When paths are cut off, values at later merge points can rise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // toward more specific classes.  Make sure these specific classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // are still in effect.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  if (tp != NULL && tp->klass() != C->env()->Object_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    // TypeFlow asserted a specific object type.  Value must have that type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    Node* bad_type_ctrl = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    l = gen_checkcast(l, makecon(TypeKlassPtr::make(tp->klass())), &bad_type_ctrl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    bad_type_exit->control()->add_req(bad_type_ctrl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  BasicType bt_l = _gvn.type(l)->basic_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  BasicType bt_t = type->basic_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  assert(_gvn.type(l)->higher_equal(type), "must constrain OSR typestate");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  return l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
// Helper routine which sets up elements of the initial parser map when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
// performing a parse for on stack replacement.  Add values into map.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
// The only parameter contains the address of a interpreter arguments.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
void Parse::load_interpreter_state(Node* osr_buf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  int index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  int max_locals = jvms()->loc_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  int max_stack  = jvms()->stk_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // Mismatch between method and jvms can occur since map briefly held
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // an OSR entry state (which takes up one RawPtr word).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  assert(max_locals == method()->max_locals(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  assert(max_stack  >= method()->max_stack(),  "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  assert((int)jvms()->endoff() == TypeFunc::Parms + max_locals + max_stack, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  assert((int)jvms()->endoff() == (int)map()->req(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Find the start block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  Block* osr_block = start_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  assert(osr_block->start() == osr_bci(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Set initial BCI.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  set_parse_bci(osr_block->start());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // Set initial stack depth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  set_sp(osr_block->start_sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Check bailouts.  We currently do not perform on stack replacement
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // of loops in catch blocks or loops which branch with a non-empty stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  if (sp() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    C->record_method_not_compilable("OSR starts with non-empty stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // Do not OSR inside finally clauses:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  if (osr_block->has_trap_at(osr_block->start())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    C->record_method_not_compilable("OSR starts with an immediate trap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Commute monitors from interpreter frame to compiler frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  assert(jvms()->monitor_depth() == 0, "should be no active locks at beginning of osr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  int mcnt = osr_block->flow()->monitor_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  Node *monitors_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals+mcnt*2-1)*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  for (index = 0; index < mcnt; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    // Make a BoxLockNode for the monitor.
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   221
    Node *box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    // Displaced headers and locked objects are interleaved in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    // temp OSR buffer.  We only copy the locked objects out here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    // Fetch the locked object from the OSR temp buffer and copy to our fastlock node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    Node *lock_object = fetch_interpreter_state(index*2, T_OBJECT, monitors_addr, osr_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    // Try and copy the displaced header to the BoxNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    Node *displaced_hdr = fetch_interpreter_state((index*2) + 1, T_ADDRESS, monitors_addr, osr_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    // Build a bogus FastLockNode (no code will be generated) and push the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    // monitor into our debug info.
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   236
    const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    map()->push_monitor(flock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    // If the lock is our method synchronization lock, tuck it away in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    // _sync_lock for return and rethrow exit paths.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    if (index == 0 && method()->is_synchronized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      _synch_lock = flock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 3261
diff changeset
   246
  // Use the raw liveness computation to make sure that unexpected
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 3261
diff changeset
   247
  // values don't propagate into the OSR frame.
4440
e53e962bd403 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 3910
diff changeset
   248
  MethodLivenessResult live_locals = method()->liveness_at_bci(osr_bci());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  if (!live_locals.is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    // Degenerate or breakpointed method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    C->record_method_not_compilable("OSR in empty or breakpointed method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // Extract the needed locals from the interpreter frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  Node *locals_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals-1)*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  // find all the locals that the interpreter thinks contain live oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  const BitMap live_oops = method()->live_local_oops_at_bci(osr_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  for (index = 0; index < max_locals; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    if (!live_locals.at(index)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    const Type *type = osr_block->local_type_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    if (type->isa_oopptr() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
      // 6403625: Verify that the interpreter oopMap thinks that the oop is live
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
      // else we might load a stale oop if the MethodLiveness disagrees with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
      // result of the interpreter. If the interpreter says it is dead we agree
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
      // by making the value go to top.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
      if (!live_oops.at(index)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
        if (C->log() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
          C->log()->elem("OSR_mismatch local_index='%d'",index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
        set_local(index, null());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
        // and ignore it for the loads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
        continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    // Filter out TOP, HALF, and BOTTOM.  (Cf. ensure_phi.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    if (type == Type::TOP || type == Type::HALF) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    // If the type falls to bottom, then this must be a local that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    // is mixing ints and oops or some such.  Forcing it to top
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    // makes it go dead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    if (type == Type::BOTTOM) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
    // Construct code to access the appropriate local.
5333
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   297
    BasicType bt = type->basic_type();
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   298
    if (type == TypePtr::NULL_PTR) {
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   299
      // Ptr types are mixed together with T_ADDRESS but NULL is
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   300
      // really for T_OBJECT types so correct it.
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   301
      bt = T_OBJECT;
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   302
    }
bb01e3adecb4 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 5228
diff changeset
   303
    Node *value = fetch_interpreter_state(index, bt, locals_addr, osr_buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    set_local(index, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Extract the needed stack entries from the interpreter frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  for (index = 0; index < sp(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    const Type *type = osr_block->stack_type_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    if (type != Type::TOP) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
      // Currently the compiler bails out when attempting to on stack replace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      // at a bci with a non-empty stack.  We should not reach here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // End the OSR migration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  make_runtime_call(RC_LEAF, OptoRuntime::osr_end_Type(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
                    CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_end),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
                    "OSR_migration_end", TypeRawPtr::BOTTOM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
                    osr_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // Now that the interpreter state is loaded, make sure it will match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // at execution time what the compiler is expecting now:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  SafePointNode* bad_type_exit = clone_map();
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   326
  bad_type_exit->set_control(new (C) RegionNode(1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
5029
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   328
  assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  for (index = 0; index < max_locals; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    if (stopped())  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    Node* l = local(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    if (l->is_top())  continue;  // nothing here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    const Type *type = osr_block->local_type_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    if (type->isa_oopptr() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      if (!live_oops.at(index)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
        // skip type check for dead oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
        continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    }
5032
785da8592568 6930398: fix for return address locals in OSR entries uses wrong test
never
parents: 5029
diff changeset
   340
    if (osr_block->flow()->local_type_at(index)->is_return_address()) {
5029
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   341
      // In our current system it's illegal for jsr addresses to be
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   342
      // live into an OSR entry point because the compiler performs
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   343
      // inlining of jsrs.  ciTypeFlow has a bailout that detect this
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   344
      // case and aborts the compile if addresses are live into an OSR
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   345
      // entry point.  Because of that we can assume that any address
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   346
      // locals at the OSR entry point are dead.  Method liveness
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   347
      // isn't precise enought to figure out that they are dead in all
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   348
      // cases so simply skip checking address locals all
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   349
      // together. Any type check is guaranteed to fail since the
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   350
      // interpreter type is the result of a load which might have any
cc2198aa63cb 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 4905
diff changeset
   351
      // value and the expected type is a constant.
4440
e53e962bd403 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 3910
diff changeset
   352
      continue;
e53e962bd403 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 3910
diff changeset
   353
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    set_local(index, check_interpreter_type(l, type, bad_type_exit));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  for (index = 0; index < sp(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    if (stopped())  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    Node* l = stack(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    if (l->is_top())  continue;  // nothing here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    const Type *type = osr_block->stack_type_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    set_stack(index, check_interpreter_type(l, type, bad_type_exit));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  if (bad_type_exit->control()->req() > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    // Build an uncommon trap here, if any inputs can be unexpected.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    bad_type_exit->set_control(_gvn.transform( bad_type_exit->control() ));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    record_for_igvn(bad_type_exit->control());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    SafePointNode* types_are_good = map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    set_map(bad_type_exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    // The unexpected type happens because a new edge is active
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    // in the CFG, which typeflow had previously ignored.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    // E.g., Object x = coldAtFirst() && notReached()? "str": new Integer(123).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    // This x will be typed as Integer if notReached is not yet linked.
13931
37366c0290fc 7199742: A lot of C2 OSR compilations of the same method's bci
kvn
parents: 13895
diff changeset
   375
    // It could also happen due to a problem in ciTypeFlow analysis.
37366c0290fc 7199742: A lot of C2 OSR compilations of the same method's bci
kvn
parents: 13895
diff changeset
   376
    uncommon_trap(Deoptimization::Reason_constraint,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
                  Deoptimization::Action_reinterpret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    set_map(types_are_good);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
//------------------------------Parse------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
// Main parser constructor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  : _exits(caller)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  // Init some variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  _caller = caller;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  _method = parse_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  _expected_uses = expected_uses;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  _depth = 1 + (caller->has_method() ? caller->depth() : 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  _wrote_final = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  _entry_bci = InvocationEntryBci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  _tf = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  _block = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  debug_only(_block_count = -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  debug_only(_blocks = (Block*)-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  if (PrintCompilation || PrintOpto) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    // Make sure I have an inline tree, so I can print messages about it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    JVMState* ilt_caller = is_osr_parse() ? caller->caller() : caller;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 11458
diff changeset
   402
    InlineTree::find_subtree_from_root(C->ilt(), ilt_caller, parse_method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  _max_switch_depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  _est_switch_depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  _tf = TypeFunc::make(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  _iter.reset_to_method(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  _flow = method()->get_flow_analysis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  if (_flow->failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    C->record_method_not_compilable_all_tiers(_flow->failure_reason());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   415
#ifndef PRODUCT
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   416
  if (_flow->has_irreducible_entry()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   417
    C->set_parsed_irreducible_loop(true);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   418
  }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   419
#endif
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   420
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  if (_expected_uses <= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
    _prof_factor = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
    float prof_total = parse_method->interpreter_invocation_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
    if (prof_total <= _expected_uses) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
      _prof_factor = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
      _prof_factor = _expected_uses / prof_total;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  CompileLog* log = C->log();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  if (log != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    log->begin_head("parse method='%d' uses='%g'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
                    log->identify(parse_method), expected_uses);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    if (depth() == 1 && C->is_osr_compilation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
      log->print(" osr_bci='%d'", C->entry_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    log->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    log->end_head();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  // Accumulate deoptimization counts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // (The range_check and store_check counts are checked elsewhere.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  ciMethodData* md = method()->method_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  for (uint reason = 0; reason < md->trap_reason_limit(); reason++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
    uint md_count = md->trap_count(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    if (md_count != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
      if (md_count == md->trap_count_limit())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
        md_count += md->overflow_trap_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
      uint total_count = C->trap_count(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
      uint old_count   = total_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
      total_count += md_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
      // Saturate the add if it overflows.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      if (total_count < old_count || total_count < md_count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
        total_count = (uint)-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
      C->set_trap_count(reason, total_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
      if (log != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
        log->elem("observe trap='%s' count='%d' total='%d'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
                  Deoptimization::trap_reason_name(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
                  md_count, total_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  // Accumulate total sum of decompilations, also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  C->set_decompile_count(C->decompile_count() + md->decompile_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  _count_invocations = C->do_count_invocations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  _method_data_update = C->do_method_data_update();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  if (log != NULL && method()->has_exception_handlers()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    log->elem("observe that='has_exception_handlers'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  assert(method()->can_be_compiled(),       "Can not parse this method, cutout earlier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  assert(method()->has_balanced_monitors(), "Can not parse unbalanced monitors, cutout earlier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  // Always register dependence if JVMTI is enabled, because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  // either breakpoint setting or hotswapping of methods may
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  // cause deoptimization.
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2570
diff changeset
   480
  if (C->env()->jvmti_can_hotswap_or_post_breakpoint()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    C->dependencies()->assert_evol_method(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  methods_seen++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  // Do some special top-level things.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  if (depth() == 1 && C->is_osr_compilation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    _entry_bci = C->entry_bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
    _flow = method()->get_osr_flow_analysis(osr_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    if (_flow->failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
      C->record_method_not_compilable(_flow->failure_reason());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
      if (PrintOpto && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
        tty->print_cr("OSR @%d type flow bailout: %s", _entry_bci, _flow->failure_reason());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
        if (Verbose) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13393
diff changeset
   496
          method()->print();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
          method()->print_codes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
          _flow->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    _tf = C->tf();     // the OSR entry type is different
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  if (depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    assert(C->is_osr_compilation() == this->is_osr_parse(), "OSR in sync");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    if (C->tf() != tf()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
      MutexLockerEx ml(Compile_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
      assert(C->env()->system_dictionary_modification_counter_changed(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
             "Must invalidate if TypeFuncs differ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    assert(!this->is_osr_parse(), "no recursive OSR");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  methods_parsed++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // add method size here to guarantee that inlined methods are added too
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  if (TimeCompiler)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    _total_bytes_compiled += method()->code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  show_parse_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  if (failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    if (log)  log->done("parse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  gvn().set_type(root(), root()->bottom_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  gvn().transform(top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // Import the results of the ciTypeFlow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  init_blocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // Merge point for all normal exits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  build_exits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  // Setup the initial JVM state map.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  SafePointNode* entry_map = create_entry_map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // Check for bailouts during map initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  if (failing() || entry_map == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    if (log)  log->done("parse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  Node_Notes* caller_nn = C->default_node_notes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  // Collect debug info for inlined calls unless -XX:-DebugInlinedCalls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  if (DebugInlinedCalls || depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    C->set_default_node_notes(make_node_notes(caller_nn));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  if (is_osr_parse()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    Node* osr_buf = entry_map->in(TypeFunc::Parms+0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
    entry_map->set_req(TypeFunc::Parms+0, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
    set_map(entry_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    load_interpreter_state(osr_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    set_map(entry_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    do_method_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // Check for bailouts during method entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  if (failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    if (log)  log->done("parse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
    C->set_default_node_notes(caller_nn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  entry_map = map();  // capture any changes performed by method setup code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  assert(jvms()->endoff() == map()->req(), "map matches JVMS layout");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  // We begin parsing as if we have just encountered a jump to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  // method entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  Block* entry_block = start_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  assert(entry_block->start() == (is_osr_parse() ? osr_bci() : 0), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  set_map_clone(entry_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  merge_common(entry_block, entry_block->next_path_num());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  BytecodeParseHistogram *parse_histogram_obj = new (C->env()->arena()) BytecodeParseHistogram(this, C);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  set_parse_histogram( parse_histogram_obj );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  // Parse all the basic blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  do_all_blocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  C->set_default_node_notes(caller_nn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // Check for bailouts during conversion to graph
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  if (failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    if (log)  log->done("parse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  // Fix up all exiting control flow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  set_map(entry_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  do_exits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14621
diff changeset
   604
  if (log)  log->done("parse nodes='%d' live='%d' memory='%d'",
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14621
diff changeset
   605
                      C->unique(), C->live_nodes(), C->node_arena()->used());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
//---------------------------do_all_blocks-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
void Parse::do_all_blocks() {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   610
  bool has_irreducible = flow()->has_irreducible_entry();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   611
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   612
  // Walk over all blocks in Reverse Post-Order.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   613
  while (true) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   614
    bool progress = false;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   615
    for (int rpo = 0; rpo < block_count(); rpo++) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   616
      Block* block = rpo_at(rpo);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   617
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   618
      if (block->is_parsed()) continue;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   620
      if (!block->is_merged()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   621
        // Dead block, no state reaches this block
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   622
        continue;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   623
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   625
      // Prepare to parse this block.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   626
      load_state_from(block);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   627
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   628
      if (stopped()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   629
        // Block is dead.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   630
        continue;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   631
      }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   632
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   633
      blocks_parsed++;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   635
      progress = true;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   636
      if (block->is_loop_head() || block->is_handler() || has_irreducible && !block->is_ready()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   637
        // Not all preds have been parsed.  We must build phis everywhere.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   638
        // (Note that dead locals do not get phis built, ever.)
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   639
        ensure_phis_everywhere();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   640
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   641
        if (block->is_SEL_head() &&
9446
748a37b25d10 5091921: Sign flip issues in loop optimizer
kvn
parents: 8921
diff changeset
   642
            (UseLoopPredicate || LoopLimitCheck)) {
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   643
          // Add predicate to single entry (not irreducible) loop head.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   644
          assert(!block->has_merged_backedge(), "only entry paths should be merged for now");
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   645
          // Need correct bci for predicate.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   646
          // It is fine to set it here since do_one_block() will set it anyway.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   647
          set_parse_bci(block->start());
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   648
          add_predicate();
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   649
          // Add new region for back branches.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   650
          int edges = block->pred_count() - block->preds_parsed() + 1; // +1 for original region
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   651
          RegionNode *r = new (C) RegionNode(edges+1);
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   652
          _gvn.set_type(r, Type::CONTROL);
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   653
          record_for_igvn(r);
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   654
          r->init_req(edges, control());
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   655
          set_control(r);
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   656
          // Add new phis.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   657
          ensure_phis_everywhere();
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   658
        }
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
   659
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   660
        // Leave behind an undisturbed copy of the map, for future merges.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   661
        set_map(clone_map());
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   662
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   664
      if (control()->is_Region() && !block->is_loop_head() && !has_irreducible && !block->is_handler()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   665
        // In the absence of irreducible loops, the Region and Phis
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   666
        // associated with a merge that doesn't involve a backedge can
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1399
diff changeset
   667
        // be simplified now since the RPO parsing order guarantees
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   668
        // that any path which was supposed to reach here has already
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   669
        // been parsed or must be dead.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   670
        Node* c = control();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   671
        Node* result = _gvn.transform_no_reclaim(control());
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   672
        if (c != result && TraceOptoParse) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   673
          tty->print_cr("Block #%d replace %d with %d", block->rpo(), c->_idx, result->_idx);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   674
        }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   675
        if (result != top()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   676
          record_for_igvn(result);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   677
        }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   678
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   680
      // Parse the block.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   681
      do_one_block();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   682
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   683
      // Check for bailouts.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   684
      if (failing())  return;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   685
    }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   686
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   687
    // with irreducible loops multiple passes might be necessary to parse everything
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   688
    if (!has_irreducible || !progress) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   691
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   693
  blocks_seen += block_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // Make sure there are no half-processed blocks remaining.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  // Every remaining unprocessed block is dead and may be ignored now.
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   698
  for (int rpo = 0; rpo < block_count(); rpo++) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   699
    Block* block = rpo_at(rpo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    if (!block->is_parsed()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
      if (TraceOptoParse) {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   702
        tty->print_cr("Skipped dead block %d at bci:%d", rpo, block->start());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
      }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
   704
      assert(!block->is_merged(), "no half-processed blocks");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
//-------------------------------build_exits----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
// Build normal and exceptional exit merge points.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
void Parse::build_exits() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  // make a clone of caller to prevent sharing of side-effects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  _exits.set_map(_exits.clone_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  _exits.clean_stack(_exits.sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  _exits.sync_jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   718
  RegionNode* region = new (C) RegionNode(1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  record_for_igvn(region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  gvn().set_type_bottom(region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  _exits.set_control(region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  // Note:  iophi and memphi are not transformed until do_exits.
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   724
  Node* iophi  = new (C) PhiNode(region, Type::ABIO);
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   725
  Node* memphi = new (C) PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  _exits.set_i_o(iophi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  _exits.set_all_memory(memphi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // Add a return value to the exit state.  (Do not push it yet.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  if (tf()->range()->cnt() > TypeFunc::Parms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    const Type* ret_type = tf()->range()->field_at(TypeFunc::Parms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    // Don't "bind" an unloaded return klass to the ret_phi. If the klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    // becomes loaded during the subsequent parsing, the loaded and unloaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    // types will not join when we transform and push in do_exits().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
    const TypeOopPtr* ret_oop_type = ret_type->isa_oopptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    if (ret_oop_type && !ret_oop_type->klass()->is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
      ret_type = TypeOopPtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
    int         ret_size = type2size[ret_type->basic_type()];
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   740
    Node*       ret_phi  = new (C) PhiNode(region, ret_type);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    _exits.ensure_stack(ret_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
    assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
    assert(method()->return_type()->size() == ret_size, "tf agrees w/ method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
    _exits.set_argument(0, ret_phi);  // here is where the parser finds it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
    // Note:  ret_phi is not yet pushed, until do_exits.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
//----------------------------build_start_state-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
// Construct a state which contains only the incoming arguments from an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
// unknown caller.  The method & bci will be NULL & InvocationEntryBci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
JVMState* Compile::build_start_state(StartNode* start, const TypeFunc* tf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  int        arg_size = tf->domain()->cnt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  int        max_size = MAX2(arg_size, (int)tf->range()->cnt());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  JVMState*  jvms     = new (this) JVMState(max_size - TypeFunc::Parms);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   757
  SafePointNode* map  = new (this) SafePointNode(max_size, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  record_for_igvn(map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  assert(arg_size == TypeFunc::Parms + (is_osr_compilation() ? 1 : method()->arg_size()), "correct arg_size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  Node_Notes* old_nn = default_node_notes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  if (old_nn != NULL && has_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
    Node_Notes* entry_nn = old_nn->clone(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
    JVMState* entry_jvms = new(this) JVMState(method(), old_nn->jvms());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
    entry_jvms->set_offsets(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
    entry_jvms->set_bci(entry_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
    entry_nn->set_jvms(entry_jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    set_default_node_notes(entry_nn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  uint i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  for (i = 0; i < (uint)arg_size; i++) {
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   771
    Node* parm = initial_gvn()->transform(new (this) ParmNode(start, i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
    map->init_req(i, parm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
    // Record all these guys for later GVN.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
    record_for_igvn(parm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  for (; i < map->req(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    map->init_req(i, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  assert(jvms->argoff() == TypeFunc::Parms, "parser gets arguments here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  set_default_node_notes(old_nn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  map->set_jvms(jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  jvms->set_map(map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  return jvms;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
//-----------------------------make_node_notes---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
Node_Notes* Parse::make_node_notes(Node_Notes* caller_nn) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  if (caller_nn == NULL)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  Node_Notes* nn = caller_nn->clone(C);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  JVMState* caller_jvms = nn->jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  JVMState* jvms = new (C) JVMState(method(), caller_jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  jvms->set_offsets(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  jvms->set_bci(_entry_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  nn->set_jvms(jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  return nn;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
//--------------------------return_values--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
void Compile::return_values(JVMState* jvms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  GraphKit kit(jvms);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   802
  Node* ret = new (this) ReturnNode(TypeFunc::Parms,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
                             kit.control(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
                             kit.i_o(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
                             kit.reset_memory(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
                             kit.frameptr(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
                             kit.returnadr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  // Add zero or 1 return values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  int ret_size = tf()->range()->cnt() - TypeFunc::Parms;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  if (ret_size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
    kit.inc_sp(-ret_size);  // pop the return value(s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    kit.sync_jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    ret->add_req(kit.argument(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    // Note:  The second dummy edge is not needed by a ReturnNode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  // bind it to root
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  root()->add_req(ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  record_for_igvn(ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  initial_gvn()->transform_no_reclaim(ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
//------------------------rethrow_exceptions-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
// Bind all exception states in the list into a single RethrowNode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
void Compile::rethrow_exceptions(JVMState* jvms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  GraphKit kit(jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  if (!kit.has_exceptions())  return;  // nothing to generate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // Load my combined exception state into the kit, with all phis transformed:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  SafePointNode* ex_map = kit.combine_and_pop_all_exception_states();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  Node* ex_oop = kit.use_exception_state(ex_map);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
   830
  RethrowNode* exit = new (this) RethrowNode(kit.control(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
                                      kit.i_o(), kit.reset_memory(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
                                      kit.frameptr(), kit.returnadr(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
                                      // like a return but with exception input
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
                                      ex_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  // bind to root
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  root()->add_req(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  record_for_igvn(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  initial_gvn()->transform_no_reclaim(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
//---------------------------do_exceptions-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
// Process exceptions arising from the current bytecode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
// Send caught exceptions to the proper handler within this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
// Unhandled exceptions feed into _exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
void Parse::do_exceptions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  if (!has_exceptions())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  if (failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
    // Pop them all off and throw them away.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    while (pop_exception_state() != NULL) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  PreserveJVMState pjvms(this, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  SafePointNode* ex_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
  while ((ex_map = pop_exception_state()) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
    if (!method()->has_exception_handlers()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
      // Common case:  Transfer control outward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
      // Doing it this early allows the exceptions to common up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
      // even between adjacent method calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
      throw_to_exit(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
      // Have to look at the exception first.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
      assert(stopped(), "catch_inline_exceptions trashes the map");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
      catch_inline_exceptions(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
      stop_and_kill_map();      // we used up this exception state; kill it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  // We now return to our regularly scheduled program:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
//---------------------------throw_to_exit-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
// Merge the given map into an exception exit from this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
// The exception exit will handle any unlocking of receiver.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
// The ex_oop must be saved within the ex_map, unlike merge_exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
void Parse::throw_to_exit(SafePointNode* ex_map) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  // Pop the JVMS to (a copy of) the caller.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  GraphKit caller;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  caller.set_map_clone(_caller->map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  caller.set_bci(_caller->bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  caller.set_sp(_caller->sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // Copy out the standard machine state:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  for (uint i = 0; i < TypeFunc::Parms; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
    caller.map()->set_req(i, ex_map->in(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // ...and the exception:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  Node*          ex_oop        = saved_ex_oop(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // Finally, collect the new exception state in my exits:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  _exits.add_exception_state(caller_ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
//------------------------------do_exits---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
void Parse::do_exits() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  set_parse_bci(InvocationEntryBci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  // Now peephole on the return bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  Node* region = _exits.control();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  _exits.set_control(gvn().transform(region));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  Node* iophi = _exits.i_o();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  _exits.set_i_o(gvn().transform(iophi));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  if (wrote_final()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
    // This method (which must be a constructor by the rules of Java)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
    // wrote a final.  The effects of all initializations must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
    // committed to memory before any code after the constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
    // publishes the reference to the newly constructor object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
    // Rather than wait for the publication, we simply block the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
    // writes here.  Rather than put a barrier on only those writes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    // which are required to complete, we force all writes to complete.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    // "All bets are off" unless the first publication occurs after a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
    // normal return from the constructor.  We do not attempt to detect
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
    // such unusual early publications.  But no barrier is needed on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    // exceptional returns, since they cannot publish normally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
    _exits.insert_mem_bar(Op_MemBarRelease);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
    if (PrintOpto && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
      method()->print_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
      tty->print_cr(" writes finals and needs a memory barrier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  for (MergeMemStream mms(_exits.merged_memory()); mms.next_non_empty(); ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
    // transform each slice of the original memphi:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    mms.set_memory(_gvn.transform(mms.memory()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  if (tf()->range()->cnt() > TypeFunc::Parms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
    const Type* ret_type = tf()->range()->field_at(TypeFunc::Parms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
    Node*       ret_phi  = _gvn.transform( _exits.argument(0) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
    assert(_exits.control()->is_top() || !_gvn.type(ret_phi)->empty(), "return value must be well defined");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
    _exits.push_node(ret_type->basic_type(), ret_phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  // Note:  Logic for creating and optimizing the ReturnNode is in Compile.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  // Unlock along the exceptional paths.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  // This is done late so that we can common up equivalent exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  // (e.g., null checks) arising from multiple points within this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  // See GraphKit::add_exception_state, which performs the commoning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  // record exit from a method if compiled while Dtrace is turned on.
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2570
diff changeset
   950
  if (do_synch || C->env()->dtrace_method_probes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
    // First move the exception list out of _exits:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
    GraphKit kit(_exits.transfer_exceptions_into_jvms());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
    SafePointNode* normal_map = kit.map();  // keep this guy safe
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
    // Now re-collect the exceptions into _exits:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
    SafePointNode* ex_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    while ((ex_map = kit.pop_exception_state()) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
      Node* ex_oop = kit.use_exception_state(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
      // Force the exiting JVM state to have this method at InvocationEntryBci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
      // The exiting JVM state is otherwise a copy of the calling JVMS.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
      JVMState* caller = kit.jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
      JVMState* ex_jvms = caller->clone_shallow(C);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
      ex_jvms->set_map(kit.clone_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
      ex_jvms->map()->set_jvms(ex_jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
      ex_jvms->set_bci(   InvocationEntryBci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
      kit.set_jvms(ex_jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
      if (do_synch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
        // Add on the synchronized-method box/object combo
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
        kit.map()->push_monitor(_synch_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
        // Unlock!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
        kit.shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
      }
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2570
diff changeset
   972
      if (C->env()->dtrace_method_probes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
        kit.make_dtrace_method_exit(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
      // Done with exception-path processing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
      ex_map = kit.make_exception_state(ex_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
      assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
      // Pop the last vestige of this method:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
      ex_map->set_jvms(caller->clone_shallow(C));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
      ex_map->jvms()->set_map(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
      _exits.push_exception_state(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
    assert(_exits.map() == normal_map, "keep the same return state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
    // Capture very early exceptions (receiver null checks) from caller JVMS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
    GraphKit caller(_caller);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
    SafePointNode* ex_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
    while ((ex_map = caller.pop_exception_state()) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
      _exits.add_exception_state(ex_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
//-----------------------------create_entry_map-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
// Initialize our parser map to contain the types at method entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
// For OSR, the map contains a single RawPtr parameter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
// Initial monitor locking for sync. methods is performed by do_method_entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
SafePointNode* Parse::create_entry_map() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  // Check for really stupid bail-out cases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  uint len = TypeFunc::Parms + method()->max_locals() + method()->max_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  if (len >= 32760) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    C->record_method_not_compilable_all_tiers("too many local variables");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  // If this is an inlined method, we may have to do a receiver null check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  if (_caller->has_method() && is_normal_parse() && !method()->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
    GraphKit kit(_caller);
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13964
diff changeset
  1011
    kit.null_check_receiver_before_call(method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
    _caller = kit.transfer_exceptions_into_jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
    if (kit.stopped()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
      _exits.add_exception_states_from(_caller);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
      _exits.set_jvms(_caller);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  assert(method() != NULL, "parser must have a method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  // Create an initial safepoint to hold JVM state during parsing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : NULL);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1024
  set_map(new (C) SafePointNode(len, jvms));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  jvms->set_map(map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  record_for_igvn(map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  assert(jvms->endoff() == len, "correct jvms sizing");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  SafePointNode* inmap = _caller->map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  assert(inmap != NULL, "must have inmap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  uint i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  // Pass thru the predefined input parameters.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  for (i = 0; i < TypeFunc::Parms; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    map()->init_req(i, inmap->in(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  if (depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
    assert(map()->memory()->Opcode() == Op_Parm, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    // Insert the memory aliasing node
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
    set_all_memory(reset_memory());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  assert(merged_memory(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  // Now add the locals which are initially bound to arguments:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  uint arg_size = tf()->domain()->cnt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  ensure_stack(arg_size - TypeFunc::Parms);  // OSR methods have funny args
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  for (i = TypeFunc::Parms; i < arg_size; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    map()->init_req(i, inmap->argument(_caller, i - TypeFunc::Parms));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  // Clear out the rest of the map (locals and stack)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  for (i = arg_size; i < len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
    map()->init_req(i, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  SafePointNode* entry_map = stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  return entry_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
//-----------------------------do_method_entry--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
// Emit any code needed in the pseudo-block before BCI zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
// The main thing to do is lock the receiver of a synchronized method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
void Parse::do_method_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  set_parse_bci(InvocationEntryBci); // Pseudo-BCP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  set_sp(0);                      // Java Stack Pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  NOT_PRODUCT( count_compiled_calls(true/*at_method_entry*/, false/*is_inline*/); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2570
diff changeset
  1071
  if (C->env()->dtrace_method_probes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    make_dtrace_method_entry(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  // If the method is synchronized, we need to construct a lock node, attach
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  // it to the Start node, and pin it there.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  if (method()->is_synchronized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
    // Insert a FastLockNode right after the Start which takes as arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
    // the current thread pointer, the "this" pointer & the address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
    // stack slot pair used for the lock.  The "this" pointer is a projection
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
    // off the start node, but the locking spot has to be constructed by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
    // creating a ConLNode of 0, and boxing it with a BoxLockNode.  The BoxLockNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
    // becomes the second argument to the FastLockNode call.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
    // FastLockNode becomes the new control parent to pin it to the start.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
    // Setup Object Pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
    Node *lock_obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
    if(method()->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
      ciInstance* mirror = _method->holder()->java_mirror();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
      const TypeInstPtr *t_lock = TypeInstPtr::make(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
      lock_obj = makecon(t_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
    } else {                  // Else pass the "this" pointer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
      lock_obj = local(0);    // which is Parm0 from StartNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    // Clear out dead values from the debug info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
    kill_dead_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    // Build the FastLockNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
    _synch_lock = shared_lock(lock_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  if (depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    increment_and_test_invocation_counter(Tier2CompileThreshold);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
//------------------------------init_blocks------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
// Initialize our parser map to contain the types/monitors at method entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
void Parse::init_blocks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  // Create the blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  _block_count = flow()->block_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  _blocks = NEW_RESOURCE_ARRAY(Block, _block_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  Copy::zero_to_bytes(_blocks, sizeof(Block)*_block_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1114
  int rpo;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  // Initialize the structs.
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1117
  for (rpo = 0; rpo < block_count(); rpo++) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1118
    Block* block = rpo_at(rpo);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1119
    block->init_node(this, rpo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
  // Collect predecessor and successor information.
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1123
  for (rpo = 0; rpo < block_count(); rpo++) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1124
    Block* block = rpo_at(rpo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
    block->init_graph(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
//-------------------------------init_node-------------------------------------
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1130
void Parse::Block::init_node(Parse* outer, int rpo) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1131
  _flow = outer->flow()->rpo_at(rpo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  _pred_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  _preds_parsed = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  _count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  assert(pred_count() == 0 && preds_parsed() == 0, "sanity");
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1136
  assert(!(is_merged() || is_parsed() || is_handler() || has_merged_backedge()), "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  assert(_live_locals.size() == 0, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  // entry point has additional predecessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  if (flow()->is_start())  _pred_count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  assert(flow()->is_start() == (this == outer->start_block()), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
//-------------------------------init_graph------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
void Parse::Block::init_graph(Parse* outer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  // Create the successor list for this parser block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  GrowableArray<ciTypeFlow::Block*>* tfs = flow()->successors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  GrowableArray<ciTypeFlow::Block*>* tfe = flow()->exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  int ns = tfs->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  int ne = tfe->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  _num_successors = ns;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  _all_successors = ns+ne;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  _successors = (ns+ne == 0) ? NULL : NEW_RESOURCE_ARRAY(Block*, ns+ne);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  int p = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  for (int i = 0; i < ns+ne; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
    ciTypeFlow::Block* tf2 = (i < ns) ? tfs->at(i) : tfe->at(i-ns);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1157
    Block* block2 = outer->rpo_at(tf2->rpo());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
    _successors[i] = block2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
    // Accumulate pred info for the other block, too.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
    if (i < ns) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
      block2->_pred_count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
      block2->_is_handler = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
    // A block's successors must be distinguishable by BCI.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    // That is, no bytecode is allowed to branch to two different
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    // clones of the same code location.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    for (int j = 0; j < i; j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
      Block* block1 = _successors[j];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
      if (block1 == block2)  continue;  // duplicates are OK
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
      assert(block1->start() != block2->start(), "successors have unique bcis");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
    #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  // Note: We never call next_path_num along exception paths, so they
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  // never get processed as "ready".  Also, the input phis of exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  // handlers get specially processed, so that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
//---------------------------successor_for_bci---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
Parse::Block* Parse::Block::successor_for_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  for (int i = 0; i < all_successors(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
    Block* block2 = successor_at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
    if (block2->start() == bci)  return block2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  // We can actually reach here if ciTypeFlow traps out a block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  // due to an unloaded class, and concurrently with compilation the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  // class is then loaded, so that a later phase of the parser is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  // able to see more of the bytecode CFG.  Or, the flow pass and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  // the parser can have a minor difference of opinion about executability
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  // of bytecodes.  For example, "obj.field = null" is executable even
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  // if the field's type is an unloaded class; the flow pass used to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  // make a trap for such code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
//-----------------------------stack_type_at-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
const Type* Parse::Block::stack_type_at(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  return get_type(flow()->stack_type_at(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
//-----------------------------local_type_at-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
const Type* Parse::Block::local_type_at(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  // Make dead locals fall to bottom.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  if (_live_locals.size() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
    MethodLivenessResult live_locals = flow()->outer()->method()->liveness_at_bci(start());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
    // This bitmap can be zero length if we saw a breakpoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
    // In such cases, pretend they are all live.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
    ((Block*)this)->_live_locals = live_locals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  if (_live_locals.size() > 0 && !_live_locals.at(i))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
    return Type::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  return get_type(flow()->local_type_at(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
//----------------------------name_for_bc--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
// helper method for BytecodeParseHistogram
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
static const char* name_for_bc(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  return Bytecodes::is_defined(i) ? Bytecodes::name(Bytecodes::cast(i)) : "xxxunusedxxx";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
//----------------------------BytecodeParseHistogram------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
Parse::BytecodeParseHistogram::BytecodeParseHistogram(Parse *p, Compile *c) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  _parser   = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  _compiler = c;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  if( ! _initialized ) { _initialized = true; reset(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
//----------------------------current_count------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
int Parse::BytecodeParseHistogram::current_count(BPHType bph_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  switch( bph_type ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  case BPH_transforms: { return _parser->gvn().made_progress(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  case BPH_values:     { return _parser->gvn().made_new_values(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  default: { ShouldNotReachHere(); return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
//----------------------------initialized--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
bool Parse::BytecodeParseHistogram::initialized() { return _initialized; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
//----------------------------reset--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
void Parse::BytecodeParseHistogram::reset() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  int i = Bytecodes::number_of_codes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  while (i-- > 0) { _bytecodes_parsed[i] = 0; _nodes_constructed[i] = 0; _nodes_transformed[i] = 0; _new_values[i] = 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
//----------------------------set_initial_state--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
// Record info when starting to parse one bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
void Parse::BytecodeParseHistogram::set_initial_state( Bytecodes::Code bc ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  if( PrintParseStatistics && !_parser->is_osr_parse() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
    _initial_bytecode    = bc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
    _initial_node_count  = _compiler->unique();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
    _initial_transforms  = current_count(BPH_transforms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
    _initial_values      = current_count(BPH_values);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
//----------------------------record_change--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
// Record results of parsing one bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
void Parse::BytecodeParseHistogram::record_change() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
  if( PrintParseStatistics && !_parser->is_osr_parse() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
    ++_bytecodes_parsed[_initial_bytecode];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
    _nodes_constructed [_initial_bytecode] += (_compiler->unique() - _initial_node_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    _nodes_transformed [_initial_bytecode] += (current_count(BPH_transforms) - _initial_transforms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
    _new_values        [_initial_bytecode] += (current_count(BPH_values)     - _initial_values);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
//----------------------------print--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
void Parse::BytecodeParseHistogram::print(float cutoff) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
  // print profile
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  int total  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
  int i      = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
  for( i = 0; i < Bytecodes::number_of_codes; ++i ) { total += _bytecodes_parsed[i]; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
  int abs_sum = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
  tty->cr();   //0123456789012345678901234567890123456789012345678901234567890123456789
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  tty->print_cr("Histogram of %d parsed bytecodes:", total);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  if( total == 0 ) { return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
  tty->print_cr("absolute:  count of compiled bytecodes of this type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
  tty->print_cr("relative:  percentage contribution to compiled nodes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  tty->print_cr("nodes   :  Average number of nodes constructed per bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
  tty->print_cr("rnodes  :  Significance towards total nodes constructed, (nodes*relative)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
  tty->print_cr("transforms: Average amount of tranform progress per bytecode compiled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  tty->print_cr("values  :  Average number of node values improved per bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  tty->print_cr("name    :  Bytecode name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
  tty->print_cr("  absolute  relative   nodes  rnodes  transforms  values   name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
  while (--i > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    int       abs = _bytecodes_parsed[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
    float     rel = abs * 100.0F / total;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    float   nodes = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _nodes_constructed[i])/_bytecodes_parsed[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
    float  rnodes = _bytecodes_parsed[i] == 0 ? 0 :  rel * nodes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
    float  xforms = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _nodes_transformed[i])/_bytecodes_parsed[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    float  values = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _new_values       [i])/_bytecodes_parsed[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
    if (cutoff <= rel) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
      tty->print_cr("%10d  %7.2f%%  %6.1f  %6.2f   %6.1f   %6.1f     %s", abs, rel, nodes, rnodes, xforms, values, name_for_bc(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
      abs_sum += abs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
  float rel_sum = abs_sum * 100.0F / total;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  tty->print_cr("%10d  %7.2f%%    (cutoff = %.2f%%)", abs_sum, rel_sum, cutoff);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
//----------------------------load_state_from----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
// Load block/map/sp.  But not do not touch iter/bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
void Parse::load_state_from(Block* block) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  set_block(block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  // load the block's JVM state:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
  set_map(block->start_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  set_sp( block->start_sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
//-----------------------------record_state------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
void Parse::Block::record_state(Parse* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  assert(!is_merged(), "can only record state once, on 1st inflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  assert(start_sp() == p->sp(), "stack pointer must agree with ciTypeFlow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  set_start_map(p->stop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
//------------------------------do_one_block-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
void Parse::do_one_block() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  if (TraceOptoParse) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
    Block *b = block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
    int ns = b->num_successors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
    int nt = b->all_successors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
    tty->print("Parsing block #%d at bci [%d,%d), successors: ",
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1348
                  block()->rpo(), block()->start(), block()->limit());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
    for (int i = 0; i < nt; i++) {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1350
      tty->print((( i < ns) ? " %d" : " %d(e)"), b->successor_at(i)->rpo());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
    }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1352
    if (b->is_loop_head()) tty->print("  lphd");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
    tty->print_cr("");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  assert(block()->is_merged(), "must be merged before being parsed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  block()->mark_parsed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  ++_blocks_parsed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
  // Set iterator to start of block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
  iter().reset_to_bci(block()->start());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  CompileLog* log = C->log();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  // Parse bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  while (!stopped() && !failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
    iter().next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
    // Learn the current bci from the iterator:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
    set_parse_bci(iter().cur_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
    if (bci() == block()->limit()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
      // Do not walk into the next block until directed by do_all_blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
      merge(bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
    assert(bci() < block()->limit(), "bci still in block");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
    if (log != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
      // Output an optional context marker, to help place actions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
      // that occur during parsing of this BC.  If there is no log
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
      // output until the next context string, this context string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
      // will be silently ignored.
13964
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13931
diff changeset
  1384
      log->set_context("bc code='%d' bci='%d'", (int)bc(), bci());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
    if (block()->has_trap_at(bci())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
      // We must respect the flow pass's traps, because it will refuse
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
      // to produce successors for trapping blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
      int trap_index = block()->flow()->trap_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
      assert(trap_index != 0, "trap index must be valid");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
      uncommon_trap(trap_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
    NOT_PRODUCT( parse_histogram()->set_initial_state(bc()); );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
    int pre_bc_sp = sp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
    int inputs, depth;
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13964
diff changeset
  1401
    bool have_se = !stopped() && compute_stack_effects(inputs, depth);
13393
f0344cc50a90 7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents: 13391
diff changeset
  1402
    assert(!have_se || pre_bc_sp >= inputs, err_msg_res("have enough stack to execute this BC: pre_bc_sp=%d, inputs=%d", pre_bc_sp, inputs));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
#endif //ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
    do_one_bytecode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
    assert(!have_se || stopped() || failing() || (sp() - pre_bc_sp) == depth, "correct depth prediction");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
    do_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
    NOT_PRODUCT( parse_histogram()->record_change(); );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
13964
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13931
diff changeset
  1413
    if (log != NULL)
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13931
diff changeset
  1414
      log->clear_context();  // skip marker if nothing was printed
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
    // Fall into next bytecode.  Each bytecode normally has 1 sequential
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
    // successor which is typically made ready by visiting this bytecode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
    // If the successor has several predecessors, then it is a merge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
    // point, starts a new basic block, and is handled like other basic blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
//------------------------------merge------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
void Parse::set_parse_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  set_bci(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
  Node_Notes* nn = C->default_node_notes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
  if (nn == NULL)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
  // Collect debug info for inlined calls unless -XX:-DebugInlinedCalls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
  if (!DebugInlinedCalls && depth() > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
  // Update the JVMS annotation, if present.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
  JVMState* jvms = nn->jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
  if (jvms != NULL && jvms->bci() != bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    // Update the JVMS.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
    jvms = jvms->clone_shallow(C);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    jvms->set_bci(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
    nn->set_jvms(jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
//------------------------------merge------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
// Merge the current mapping into the basic block starting at bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
void Parse::merge(int target_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  Block* target = successor_for_bci(target_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  if (target == NULL) { handle_missing_successor(target_bci); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  assert(!target->is_ready(), "our arrival must be expected");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  int pnum = target->next_path_num();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  merge_common(target, pnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
//-------------------------merge_new_path--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
// Merge the current mapping into the basic block, using a new path
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
void Parse::merge_new_path(int target_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
  Block* target = successor_for_bci(target_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
  if (target == NULL) { handle_missing_successor(target_bci); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  assert(!target->is_ready(), "new path into frozen graph");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  int pnum = target->add_new_path();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  merge_common(target, pnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
//-------------------------merge_exception-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
// Merge the current mapping into the basic block starting at bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
// The ex_oop must be pushed on the stack, unlike throw_to_exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
void Parse::merge_exception(int target_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  assert(sp() == 1, "must have only the throw exception on the stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  Block* target = successor_for_bci(target_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  if (target == NULL) { handle_missing_successor(target_bci); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  assert(target->is_handler(), "exceptions are handled by special blocks");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  int pnum = target->add_new_path();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
  merge_common(target, pnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
//--------------------handle_missing_successor---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
void Parse::handle_missing_successor(int target_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  Block* b = block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
  int trap_bci = b->flow()->has_trap()? b->flow()->trap_bci(): -1;
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1482
  tty->print_cr("### Missing successor at bci:%d for block #%d (trap_bci:%d)", target_bci, b->rpo(), trap_bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
//--------------------------merge_common---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
void Parse::merge_common(Parse::Block* target, int pnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  if (TraceOptoParse) {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1490
    tty->print("Merging state at block #%d bci:%d", target->rpo(), target->start());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  // Zap extra stack slots to top
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
  assert(sp() == target->start_sp(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
  clean_stack(sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
  if (!target->is_merged()) {   // No prior mapping at this bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
    if (TraceOptoParse) { tty->print(" with empty state");  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    // If this path is dead, do not bother capturing it as a merge.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
    // It is "as if" we had 1 fewer predecessors from the beginning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
    if (stopped()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
      if (TraceOptoParse)  tty->print_cr(", but path is dead and doesn't count");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    // Record that a new block has been merged.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
    ++_blocks_merged;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
    // Make a region if we know there are multiple or unpredictable inputs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
    // (Also, if this is a plain fall-through, we might see another region,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
    // which must not be allowed into this block's map.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
    if (pnum > PhiNode::Input         // Known multiple inputs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
        || target->is_handler()       // These have unpredictable inputs.
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1515
        || target->is_loop_head()     // Known multiple inputs
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
        || control()->is_Region()) {  // We must hide this guy.
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1517
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1518
      int current_bci = bci();
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1519
      set_parse_bci(target->start()); // Set target bci
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1520
      if (target->is_SEL_head()) {
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1521
        DEBUG_ONLY( target->mark_merged_backedge(block()); )
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1522
        if (target->start() == 0) {
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1523
          // Add loop predicate for the special case when
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1524
          // there are backbranches to the method entry.
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1525
          add_predicate();
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1526
        }
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1527
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
      // Add a Region to start the new basic block.  Phis will be added
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
      // later lazily.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
      int edges = target->pred_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
      if (edges < pnum)  edges = pnum;  // might be a new path!
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1532
      RegionNode *r = new (C) RegionNode(edges+1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
      gvn().set_type(r, Type::CONTROL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
      record_for_igvn(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
      // zap all inputs to NULL for debugging (done in Node(uint) constructor)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
      // for (int j = 1; j < edges+1; j++) { r->init_req(j, NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
      r->init_req(pnum, control());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
      set_control(r);
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1539
      set_parse_bci(current_bci); // Restore bci
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
    // Convert the existing Parser mapping into a mapping at this bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
    store_state_to(target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
    assert(target->is_merged(), "do not come here twice");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
  } else {                      // Prior mapping at this bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
    if (TraceOptoParse) {  tty->print(" with previous state"); }
8732
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1548
#ifdef ASSERT
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1549
    if (target->is_SEL_head()) {
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1550
      target->mark_merged_backedge(block());
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1551
    }
16fc1c68714b 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 7397
diff changeset
  1552
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
    // We must not manufacture more phis if the target is already parsed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
    bool nophi = target->is_parsed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
    SafePointNode* newin = map();// Hang on to incoming mapping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
    Block* save_block = block(); // Hang on to incoming block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
    load_state_from(target);    // Get prior mapping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
    assert(newin->jvms()->locoff() == jvms()->locoff(), "JVMS layouts agree");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
    assert(newin->jvms()->stkoff() == jvms()->stkoff(), "JVMS layouts agree");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
    assert(newin->jvms()->monoff() == jvms()->monoff(), "JVMS layouts agree");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
    assert(newin->jvms()->endoff() == jvms()->endoff(), "JVMS layouts agree");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    // Iterate over my current mapping and the old mapping.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
    // Where different, insert Phi functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
    // Use any existing Phi functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
    assert(control()->is_Region(), "must be merging to a region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
    RegionNode* r = control()->as_Region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
    // Compute where to merge into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    // Merge incoming control path
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1573
    r->init_req(pnum, newin->control());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
    if (pnum == 1) {            // Last merge for this Region?
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1576
      if (!block()->flow()->is_irreducible_entry()) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1577
        Node* result = _gvn.transform_no_reclaim(r);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1578
        if (r != result && TraceOptoParse) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1579
          tty->print_cr("Block #%d replace %d with %d", block()->rpo(), r->_idx, result->_idx);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1580
        }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1581
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
      record_for_igvn(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
    // Update all the non-control inputs to map:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
    assert(TypeFunc::Parms == newin->jvms()->locoff(), "parser map should contain only youngest jvms");
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1587
    bool check_elide_phi = target->is_SEL_backedge(save_block);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
    for (uint j = 1; j < newin->req(); j++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
      Node* m = map()->in(j);   // Current state of target.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
      Node* n = newin->in(j);   // Incoming change to target state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
      PhiNode* phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
      if (m->is_Phi() && m->as_Phi()->region() == r)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
        phi = m->as_Phi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
      else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
        phi = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
      if (m != n) {             // Different; must merge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
        switch (j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
        // Frame pointer and Return Address never changes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
        case TypeFunc::FramePtr:// Drop m, use the original value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
        case TypeFunc::ReturnAdr:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
        case TypeFunc::Memory:  // Merge inputs to the MergeMem node
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
          assert(phi == NULL, "the merge contains phis, not vice versa");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
          merge_memory_edges(n->as_MergeMem(), pnum, nophi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
        default:                // All normal stuff
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1607
          if (phi == NULL) {
11458
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1608
            const JVMState* jvms = map()->jvms();
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1609
            if (EliminateNestedLocks &&
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1610
                jvms->is_mon(j) && jvms->is_monitor_box(j)) {
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1611
              // BoxLock nodes are not commoning.
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1612
              // Use old BoxLock node as merged box.
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1613
              assert(newin->jvms()->is_monitor_box(j), "sanity");
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1614
              // This assert also tests that nodes are BoxLock.
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1615
              assert(BoxLockNode::same_slot(n, m), "sanity");
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1616
              C->gvn_replace_by(n, m);
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1617
            } else if (!check_elide_phi || !target->can_elide_SEL_phi(j)) {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1618
              phi = ensure_phi(j, nophi);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1619
            }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1620
          }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
      // At this point, n might be top if:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
      //  - there is no phi (because TypeFlow detected a conflict), or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
      //  - the corresponding control edges is top (a dead incoming path)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
      // It is a bug if we create a phi which sees a garbage value on a live path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
      if (phi != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
        assert(n != top() || r->in(pnum) == top(), "live value must not be garbage");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
        assert(phi->region() == r, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
        phi->set_req(pnum, n);  // Then add 'n' to the merge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
        if (pnum == PhiNode::Input) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
          // Last merge for this Phi.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
          // So far, Phis have had a reasonable type from ciTypeFlow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
          // Now _gvn will join that with the meet of current inputs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
          // BOTTOM is never permissible here, 'cause pessimistically
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
          // Phis of pointers cannot lose the basic pointer type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
          debug_only(const Type* bt1 = phi->bottom_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
          assert(bt1 != Type::BOTTOM, "should not be building conflict phis");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
          map()->set_req(j, _gvn.transform_no_reclaim(phi));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
          debug_only(const Type* bt2 = phi->bottom_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
          assert(bt2->higher_equal(bt1), "must be consistent with type-flow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
          record_for_igvn(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
    } // End of for all values to be merged
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
    if (pnum == PhiNode::Input &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
        !r->in(0)) {         // The occasional useless Region
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
      assert(control() == r, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
      set_control(r->nonnull_req());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
    // newin has been subsumed into the lazy merge, and is now dead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
    set_block(save_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
    stop();                     // done with this guy, for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
  if (TraceOptoParse) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
    tty->print_cr(" on path %d", pnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  // Done with this parser state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
  assert(stopped(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
//--------------------------merge_memory_edges---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
void Parse::merge_memory_edges(MergeMemNode* n, int pnum, bool nophi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
  // (nophi means we must not create phis, because we already parsed here)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  assert(n != NULL, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
  // Merge the inputs to the MergeMems
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
  MergeMemNode* m = merged_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
  assert(control()->is_Region(), "must be merging to a region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
  RegionNode* r = control()->as_Region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
  PhiNode* base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
  MergeMemNode* remerge = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
  for (MergeMemStream mms(m, n); mms.next_non_empty2(); ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
    Node *p = mms.force_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
    Node *q = mms.memory2();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
    if (mms.is_empty() && nophi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
      // Trouble:  No new splits allowed after a loop body is parsed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
      // Instead, wire the new split into a MergeMem on the backedge.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
      // The optimizer will sort it out, slicing the phi.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
      if (remerge == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
        assert(base != NULL, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
        assert(base->in(0) != NULL, "should not be xformed away");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
        remerge = MergeMemNode::make(C, base->in(pnum));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
        gvn().set_type(remerge, Type::MEMORY);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
        base->set_req(pnum, remerge);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
      remerge->set_memory_at(mms.alias_idx(), q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
    assert(!q->is_MergeMem(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
    PhiNode* phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
    if (p != q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
      phi = ensure_memory_phi(mms.alias_idx(), nophi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
      if (p->is_Phi() && p->as_Phi()->region() == r)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
        phi = p->as_Phi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
      else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
        phi = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
    // Insert q into local phi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
    if (phi != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
      assert(phi->region() == r, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
      p = phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
      phi->set_req(pnum, q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
      if (mms.at_base_memory()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
        base = phi;  // delay transforming it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
      } else if (pnum == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
        record_for_igvn(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
        p = _gvn.transform_no_reclaim(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
      mms.set_memory(p);// store back through the iterator
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
  // Transform base last, in case we must fiddle with remerging.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
  if (base != NULL && pnum == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
    record_for_igvn(base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
    m->set_base_memory( _gvn.transform_no_reclaim(base) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
//------------------------ensure_phis_everywhere-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
void Parse::ensure_phis_everywhere() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  ensure_phi(TypeFunc::I_O);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
  // Ensure a phi on all currently known memories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
  for (MergeMemStream mms(merged_memory()); mms.next_non_empty(); ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
    ensure_memory_phi(mms.alias_idx());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
    debug_only(mms.set_memory());  // keep the iterator happy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  // Note:  This is our only chance to create phis for memory slices.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  // If we miss a slice that crops up later, it will have to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  // merged into the base-memory phi that we are building here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  // Later, the optimizer will comb out the knot, and build separate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  // phi-loops for each memory slice that matters.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
  // Monitors must nest nicely and not get confused amongst themselves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
  // Phi-ify everything up to the monitors, though.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
  uint monoff = map()->jvms()->monoff();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
  uint nof_monitors = map()->jvms()->nof_monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
  assert(TypeFunc::Parms == map()->jvms()->locoff(), "parser map should contain only youngest jvms");
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1753
  bool check_elide_phi = block()->is_SEL_head();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  for (uint i = TypeFunc::Parms; i < monoff; i++) {
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1755
    if (!check_elide_phi || !block()->can_elide_SEL_phi(i)) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1756
      ensure_phi(i);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1757
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 670
diff changeset
  1759
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
  // Even monitors need Phis, though they are well-structured.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  // This is true for OSR methods, and also for the rare cases where
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  // a monitor object is the subject of a replace_in_map operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  // See bugs 4426707 and 5043395.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  for (uint m = 0; m < nof_monitors; m++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
    ensure_phi(map()->jvms()->monitor_obj_offset(m));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
//-----------------------------add_new_path------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
// Add a previously unaccounted predecessor to this block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
int Parse::Block::add_new_path() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
  // If there is no map, return the lowest unused path number.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
  if (!is_merged())  return pred_count()+1;  // there will be a map shortly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
  SafePointNode* map = start_map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
  if (!map->control()->is_Region())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
    return pred_count()+1;  // there may be a region some day
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
  RegionNode* r = map->control()->as_Region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  // Add new path to the region.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
  uint pnum = r->req();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  r->add_req(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  for (uint i = 1; i < map->req(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
    Node* n = map->in(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
    if (i == TypeFunc::Memory) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
      // Ensure a phi on all currently known memories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
      for (MergeMemStream mms(n->as_MergeMem()); mms.next_non_empty(); ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
        Node* phi = mms.memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
        if (phi->is_Phi() && phi->as_Phi()->region() == r) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
          assert(phi->req() == pnum, "must be same size as region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
          phi->add_req(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
      if (n->is_Phi() && n->as_Phi()->region() == r) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
        assert(n->req() == pnum, "must be same size as region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
        n->add_req(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
  return pnum;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
//------------------------------ensure_phi-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
// Turn the idx'th entry of the current map into a Phi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
PhiNode *Parse::ensure_phi(int idx, bool nocreate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  SafePointNode* map = this->map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  Node* region = map->control();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
  assert(region->is_Region(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
  Node* o = map->in(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
  assert(o != NULL, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
  if (o == top())  return NULL; // TOP always merges into TOP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  if (o->is_Phi() && o->as_Phi()->region() == region) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
    return o->as_Phi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  // Now use a Phi here for merging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
  assert(!nocreate, "Cannot build a phi for a block already parsed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
  const JVMState* jvms = map->jvms();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
  const Type* t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  if (jvms->is_loc(idx)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
    t = block()->local_type_at(idx - jvms->locoff());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  } else if (jvms->is_stk(idx)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
    t = block()->stack_type_at(idx - jvms->stkoff());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  } else if (jvms->is_mon(idx)) {
11458
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1832
    assert(!jvms->is_monitor_box(idx), "no phis for boxes");
5ba160829cef 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 11445
diff changeset
  1833
    t = TypeInstPtr::BOTTOM; // this is sufficient for a lock object
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  } else if ((uint)idx < TypeFunc::Parms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
    t = o->bottom_type();  // Type::RETURN_ADDRESS or such-like.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
    assert(false, "no type information for this phi");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
  // If the type falls to bottom, then this must be a local that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  // is mixing ints and oops or some such.  Forcing it to top
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  // makes it go dead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
  if (t == Type::BOTTOM) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
    map->set_req(idx, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  // Do not create phis for top either.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
  // A top on a non-null control flow must be an unused even after the.phi.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
  if (t == Type::TOP || t == Type::HALF) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
    map->set_req(idx, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  PhiNode* phi = PhiNode::make(region, o, t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  gvn().set_type(phi, t);
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
  1857
  if (C->do_escape_analysis()) record_for_igvn(phi);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
  map->set_req(idx, phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  return phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
//--------------------------ensure_memory_phi----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
// Turn the idx'th slice of the current memory into a Phi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
PhiNode *Parse::ensure_memory_phi(int idx, bool nocreate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  MergeMemNode* mem = merged_memory();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  Node* region = control();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
  assert(region->is_Region(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  Node *o = (idx == Compile::AliasIdxBot)? mem->base_memory(): mem->memory_at(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  assert(o != NULL && o != top(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
  PhiNode* phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  if (o->is_Phi() && o->as_Phi()->region() == region) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
    phi = o->as_Phi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
    if (phi == mem->base_memory() && idx >= Compile::AliasIdxRaw) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
      // clone the shared base memory phi to make a new memory split
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
      assert(!nocreate, "Cannot build a phi for a block already parsed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
      const Type* t = phi->bottom_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
      const TypePtr* adr_type = C->get_adr_type(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
      phi = phi->slice_memory(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
      gvn().set_type(phi, t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
    return phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  // Now use a Phi here for merging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  assert(!nocreate, "Cannot build a phi for a block already parsed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
  const Type* t = o->bottom_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  const TypePtr* adr_type = C->get_adr_type(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
  phi = PhiNode::make(region, o, t, adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  gvn().set_type(phi, t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  if (idx == Compile::AliasIdxBot)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
    mem->set_base_memory(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
    mem->set_memory_at(idx, phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
  return phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
//------------------------------call_register_finalizer-----------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
// Check the klass of the receiver and call register_finalizer if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
// class need finalization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
void Parse::call_register_finalizer() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
  Node* receiver = local(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  assert(receiver != NULL && receiver->bottom_type()->isa_instptr() != NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
         "must have non-null instance type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
  const TypeInstPtr *tinst = receiver->bottom_type()->isa_instptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
  if (tinst != NULL && tinst->klass()->is_loaded() && !tinst->klass_is_exact()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
    // The type isn't known exactly so see if CHA tells us anything.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
    ciInstanceKlass* ik = tinst->klass()->as_instance_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
    if (!Dependencies::has_finalizable_subclass(ik)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
      // No finalizable subclasses so skip the dynamic check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
      C->dependencies()->assert_has_no_finalizable_subclasses(ik);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  // Insert a dynamic test for whether the instance needs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  // finalization.  In general this will fold up since the concrete
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  // class is often visible so the access flags are constant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
  Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() );
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 211
diff changeset
  1922
  Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 9446
diff changeset
  1924
  Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
  Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1927
  Node* mask  = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1928
  Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0)));
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1929
  Node* test  = _gvn.transform(new (C) BoolNode(check, BoolTest::ne));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
  IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1933
  RegionNode* result_rgn = new (C) RegionNode(3);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
  record_for_igvn(result_rgn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1936
  Node *skip_register = _gvn.transform(new (C) IfFalseNode(iff));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  result_rgn->init_req(1, skip_register);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  1939
  Node *needs_register = _gvn.transform(new (C) IfTrueNode(iff));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  set_control(needs_register);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
  if (stopped()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
    // There is no slow path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
    result_rgn->init_req(2, top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
    Node *call = make_runtime_call(RC_NO_LEAF,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
                                   OptoRuntime::register_finalizer_Type(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
                                   OptoRuntime::register_finalizer_Java(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
                                   NULL, TypePtr::BOTTOM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
                                   receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
    make_slow_call_ex(call, env()->Throwable_klass(), true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
    Node* fast_io  = call->in(TypeFunc::I_O);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
    Node* fast_mem = call->in(TypeFunc::Memory);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
    // These two phis are pre-filled with copies of of the fast IO and Memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
    Node* io_phi   = PhiNode::make(result_rgn, fast_io,  Type::ABIO);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
    Node* mem_phi  = PhiNode::make(result_rgn, fast_mem, Type::MEMORY, TypePtr::BOTTOM);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
    result_rgn->init_req(2, control());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
    io_phi    ->init_req(2, i_o());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
    mem_phi   ->init_req(2, reset_memory());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
    set_all_memory( _gvn.transform(mem_phi) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
    set_i_o(        _gvn.transform(io_phi) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
  set_control( _gvn.transform(result_rgn) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
//------------------------------return_current---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
// Append current _map to _exit_return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
void Parse::return_current(Node* value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
  if (RegisterFinalizersAtInit &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
      method()->intrinsic_id() == vmIntrinsics::_Object_init) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
    call_register_finalizer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
  // Do not set_parse_bci, so that return goo is credited to the return insn.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  set_bci(InvocationEntryBci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
  if (method()->is_synchronized() && GenerateSynchronizationCode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
    shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
  }
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2570
diff changeset
  1982
  if (C->env()->dtrace_method_probes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
    make_dtrace_method_exit(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  SafePointNode* exit_return = _exits.map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
  exit_return->in( TypeFunc::Control  )->add_req( control() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  exit_return->in( TypeFunc::I_O      )->add_req( i_o    () );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  Node *mem = exit_return->in( TypeFunc::Memory   );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  for (MergeMemStream mms(mem->as_MergeMem(), merged_memory()); mms.next_non_empty2(); ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
    if (mms.is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
      // get a copy of the base memory, and patch just this one input
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
      const TypePtr* adr_type = mms.adr_type(C);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
      Node* phi = mms.force_memory()->as_Phi()->slice_memory(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
      assert(phi->as_Phi()->region() == mms.base_memory()->in(0), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
      gvn().set_type_bottom(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
      phi->del_req(phi->req()-1);  // prepare to re-patch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
      mms.set_memory(phi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
    mms.memory()->add_req(mms.memory2());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  // frame pointer is always same, already captured
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  if (value != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
    // If returning oops to an interface-return, there is a silent free
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
    // cast from oop to interface allowed by the Verifier.  Make it explicit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
    // here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
    Node* phi = _exits.argument(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
    const TypeInstPtr *tr = phi->bottom_type()->isa_instptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
    if( tr && tr->klass()->is_loaded() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
        tr->klass()->is_interface() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
      const TypeInstPtr *tp = value->bottom_type()->isa_instptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
      if (tp && tp->klass()->is_loaded() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
          !tp->klass()->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
        // sharpen the type eagerly; this eases certain assert checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
        if (tp->higher_equal(TypeInstPtr::NOTNULL))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
          tr = tr->join(TypeInstPtr::NOTNULL)->is_instptr();
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  2017
        value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
    phi->add_req(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  stop_and_kill_map();          // This CFG path dies here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
//------------------------------add_safepoint----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
void Parse::add_safepoint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
  // See if we can avoid this safepoint.  No need for a SafePoint immediately
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  // after a Call (except Leaf Call) or another SafePoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  Node *proj = control();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  bool add_poll_param = SafePointNode::needs_polling_address_input();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  uint parms = add_poll_param ? TypeFunc::Parms+1 : TypeFunc::Parms;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  if( proj->is_Proj() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
    Node *n0 = proj->in(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
    if( n0->is_Catch() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
      n0 = n0->in(0)->in(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
      assert( n0->is_Call(), "expect a call here" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
    if( n0->is_Call() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
      if( n0->as_Call()->guaranteed_safepoint() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
    } else if( n0->is_SafePoint() && n0->req() >= parms ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  // Clear out dead values from the debug info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
  kill_dead_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  // Clone the JVM State
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13728
diff changeset
  2052
  SafePointNode *sfpnt = new (C) SafePointNode(parms, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
  // Capture memory state BEFORE a SafePoint.  Since we can block at a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  // SafePoint we need our GC state to be safe; i.e. we need all our current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  // write barriers (card marks) to not float down after the SafePoint so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
  // must read raw memory.  Likewise we need all oop stores to match the card
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
  // marks.  If deopt can happen, we need ALL stores (we need the correct JVM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  // state on a deopt).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
  // We do not need to WRITE the memory state after a SafePoint.  The control
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
  // edge will keep card-marks and oop-stores from floating up from below a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
  // SafePoint and our true dependency added here will keep them from floating
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
  // down below a SafePoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
  // Clone the current memory state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
  Node* mem = MergeMemNode::make(C, map()->memory());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  mem = _gvn.transform(mem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
  // Pass control through the safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
  sfpnt->init_req(TypeFunc::Control  , control());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
  // Fix edges normally used by a call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
  sfpnt->init_req(TypeFunc::I_O      , top() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  sfpnt->init_req(TypeFunc::Memory   , mem   );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  sfpnt->init_req(TypeFunc::ReturnAdr, top() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
  sfpnt->init_req(TypeFunc::FramePtr , top() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
  // Create a node for the polling address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
  if( add_poll_param ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
    Node *polladr = ConPNode::make(C, (address)os::get_polling_page());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
    sfpnt->init_req(TypeFunc::Parms+0, _gvn.transform(polladr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  // Fix up the JVM State edges
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
  add_safepoint_edges(sfpnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
  Node *transformed_sfpnt = _gvn.transform(sfpnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
  set_control(transformed_sfpnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
  // Provide an edge from root to safepoint.  This makes the safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
  // appear useful until the parse has completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
  if( OptoRemoveUseless && transformed_sfpnt->is_SafePoint() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
    assert(C->root() != NULL, "Expect parse is still valid");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
    C->root()->add_prec(transformed_sfpnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
//------------------------show_parse_info--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
void Parse::show_parse_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
  InlineTree* ilt = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
  if (C->ilt() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
    JVMState* caller_jvms = is_osr_parse() ? caller()->caller() : caller();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
    ilt = InlineTree::find_subtree_from_root(C->ilt(), caller_jvms, method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
  if (PrintCompilation && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
    if (depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
      if( ilt->count_inlines() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
        tty->print("    __inlined %d (%d bytes)", ilt->count_inlines(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
                     ilt->count_inline_bcs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
        tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
      if (method()->is_synchronized())         tty->print("s");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
      if (method()->has_exception_handlers())  tty->print("!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
      // Check this is not the final compiled version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
      if (C->trap_can_recompile()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
        tty->print("-");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
        tty->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
      method()->print_short_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
      if (is_osr_parse()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
        tty->print(" @ %d", osr_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
      tty->print(" (%d bytes)",method()->code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
      if (ilt->count_inlines()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
        tty->print(" __inlined %d (%d bytes)", ilt->count_inlines(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
                   ilt->count_inline_bcs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
  if (PrintOpto && (depth() == 1 || PrintOptoInlining)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
    // Print that we succeeded; suppress this message on the first osr parse.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
    if (method()->is_synchronized())         tty->print("s");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
    if (method()->has_exception_handlers())  tty->print("!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
    // Check this is not the final compiled version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
    if (C->trap_can_recompile() && depth() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
      tty->print("-");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
      tty->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
    if( depth() != 1 ) { tty->print("   "); }  // missing compile count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
    for (int i = 1; i < depth(); ++i) { tty->print("  "); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
    method()->print_short_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
    if (is_osr_parse()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
      tty->print(" @ %d", osr_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
    if (ilt->caller_bci() != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
      tty->print(" @ %d", ilt->caller_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
    tty->print(" (%d bytes)",method()->code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
    if (ilt->count_inlines()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
      tty->print(" __inlined %d (%d bytes)", ilt->count_inlines(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
                 ilt->count_inline_bcs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
//------------------------------dump-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
// Dump information associated with the bytecodes of current _method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
void Parse::dump() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
  if( method() != NULL ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
    // Iterate over bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
    ciBytecodeStream iter(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
    for( Bytecodes::Code bc = iter.next(); bc != ciBytecodeStream::EOBC() ; bc = iter.next() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
      dump_bci( iter.cur_bci() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
      tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
// Dump information associated with a byte code index, 'bci'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
void Parse::dump_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
  // Output info on merge-points, cloning, and within _jsr..._ret
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
  // NYI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
  tty->print(" bci:%d", bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
#endif