hotspot/src/share/vm/opto/compile.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14828 bb9dffedf46c
child 15113 823590505eb4
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
/*
12158
f24f2560da32 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 11435
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: 5353
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5353
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: 5353
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: 6453
diff changeset
    25
#include "precompiled.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14623
diff changeset
    26
#include "asm/macroAssembler.hpp"
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14623
diff changeset
    27
#include "asm/macroAssembler.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "code/exceptionHandlerTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "code/nmethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "compiler/compileLog.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14623
diff changeset
    32
#include "compiler/disassembler.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "compiler/oopMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
#include "opto/addnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    35
#include "opto/block.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    36
#include "opto/c2compiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    37
#include "opto/callGenerator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    38
#include "opto/callnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    39
#include "opto/cfgnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    40
#include "opto/chaitin.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    41
#include "opto/compile.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    42
#include "opto/connode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    43
#include "opto/divnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    44
#include "opto/escape.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    45
#include "opto/idealGraphPrinter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    46
#include "opto/loopnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    47
#include "opto/machnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    48
#include "opto/macro.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    49
#include "opto/matcher.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    50
#include "opto/memnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    51
#include "opto/mulnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    52
#include "opto/node.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    53
#include "opto/opcodes.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    54
#include "opto/output.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    55
#include "opto/parse.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    56
#include "opto/phaseX.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    57
#include "opto/rootnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    58
#include "opto/runtime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    59
#include "opto/stringopts.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    60
#include "opto/type.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    61
#include "opto/vectornode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    62
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    63
#include "runtime/signature.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    64
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    65
#include "runtime/timer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    66
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    67
#ifdef TARGET_ARCH_MODEL_x86_32
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    68
# include "adfiles/ad_x86_32.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    69
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    70
#ifdef TARGET_ARCH_MODEL_x86_64
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    71
# include "adfiles/ad_x86_64.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    72
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    73
#ifdef TARGET_ARCH_MODEL_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    74
# include "adfiles/ad_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    75
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    76
#ifdef TARGET_ARCH_MODEL_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    77
# include "adfiles/ad_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    78
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    79
#ifdef TARGET_ARCH_MODEL_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    80
# include "adfiles/ad_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    81
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    82
#ifdef TARGET_ARCH_MODEL_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    83
# include "adfiles/ad_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7715
diff changeset
    84
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    86
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    87
// -------------------- Compile::mach_constant_base_node -----------------------
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    88
// Constant table base node singleton.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    89
MachConstantBaseNode* Compile::mach_constant_base_node() {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    90
  if (_mach_constant_base_node == NULL) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    91
    _mach_constant_base_node = new (C) MachConstantBaseNode();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    92
    _mach_constant_base_node->add_req(C->root());
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    93
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    94
  return _mach_constant_base_node;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    95
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    96
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
    97
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
/// Support for intrinsics.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
// Return the index at which m must be inserted (or already exists).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// The sort order is by the address of the ciMethod, with is_virtual as minor key.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
int Compile::intrinsic_insertion_index(ciMethod* m, bool is_virtual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  for (int i = 1; i < _intrinsics->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    CallGenerator* cg1 = _intrinsics->at(i-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    CallGenerator* cg2 = _intrinsics->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    assert(cg1->method() != cg2->method()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
           ? cg1->method()     < cg2->method()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
           : cg1->is_virtual() < cg2->is_virtual(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
           "compiler intrinsics list must stay sorted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // Binary search sorted list, in decreasing intervals [lo, hi].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  int lo = 0, hi = _intrinsics->length()-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  while (lo <= hi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    int mid = (uint)(hi + lo) / 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    ciMethod* mid_m = _intrinsics->at(mid)->method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    if (m < mid_m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
      hi = mid-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    } else if (m > mid_m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
      lo = mid+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
      // look at minor sort key
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
      bool mid_virt = _intrinsics->at(mid)->is_virtual();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
      if (is_virtual < mid_virt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
        hi = mid-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
      } else if (is_virtual > mid_virt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
        lo = mid+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
        return mid;  // exact match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  return lo;  // inexact match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
void Compile::register_intrinsic(CallGenerator* cg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  if (_intrinsics == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    _intrinsics = new GrowableArray<CallGenerator*>(60);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // This code is stolen from ciObjectFactory::insert.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // Really, GrowableArray should have methods for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // insert_at, remove_at, and binary_search.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  int len = _intrinsics->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  int index = intrinsic_insertion_index(cg->method(), cg->is_virtual());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  if (index == len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    _intrinsics->append(cg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    CallGenerator* oldcg = _intrinsics->at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    assert(oldcg->method() != cg->method() || oldcg->is_virtual() != cg->is_virtual(), "don't register twice");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    _intrinsics->append(_intrinsics->at(len-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    int pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    for (pos = len-2; pos >= index; pos--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
      _intrinsics->at_put(pos+1,_intrinsics->at(pos));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    _intrinsics->at_put(index, cg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  assert(find_intrinsic(cg->method(), cg->is_virtual()) == cg, "registration worked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
CallGenerator* Compile::find_intrinsic(ciMethod* m, bool is_virtual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  assert(m->is_loaded(), "don't try this on unloaded methods");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  if (_intrinsics != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    int index = intrinsic_insertion_index(m, is_virtual);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    if (index < _intrinsics->length()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
        && _intrinsics->at(index)->method() == m
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
        && _intrinsics->at(index)->is_virtual() == is_virtual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
      return _intrinsics->at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Lazily create intrinsics for intrinsic IDs well-known in the runtime.
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2259
diff changeset
   174
  if (m->intrinsic_id() != vmIntrinsics::_none &&
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2259
diff changeset
   175
      m->intrinsic_id() <= vmIntrinsics::LAST_COMPILER_INLINE) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    CallGenerator* cg = make_vm_intrinsic(m, is_virtual);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    if (cg != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
      // Save it for next time:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      register_intrinsic(cg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      return cg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
      gather_intrinsic_statistics(m->intrinsic_id(), is_virtual, _intrinsic_disabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
// Compile:: register_library_intrinsics and make_vm_intrinsic are defined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
// in library_call.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
// statistics gathering...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
juint  Compile::_intrinsic_hist_count[vmIntrinsics::ID_LIMIT] = {0};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
jubyte Compile::_intrinsic_hist_flags[vmIntrinsics::ID_LIMIT] = {0};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
bool Compile::gather_intrinsic_statistics(vmIntrinsics::ID id, bool is_virtual, int flags) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  assert(id > vmIntrinsics::_none && id < vmIntrinsics::ID_LIMIT, "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  int oflags = _intrinsic_hist_flags[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  assert(flags != 0, "what happened?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  if (is_virtual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    flags |= _intrinsic_virtual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  bool changed = (flags != oflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  if ((flags & _intrinsic_worked) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    juint count = (_intrinsic_hist_count[id] += 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    if (count == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
      changed = true;           // first time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    // increment the overall count also:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    _intrinsic_hist_count[vmIntrinsics::_none] += 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  if (changed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    if (((oflags ^ flags) & _intrinsic_virtual) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
      // Something changed about the intrinsic's virtuality.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
      if ((flags & _intrinsic_virtual) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
        // This is the first use of this intrinsic as a virtual call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
        if (oflags != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
          // We already saw it as a non-virtual, so note both cases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
          flags |= _intrinsic_both;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
      } else if ((oflags & _intrinsic_both) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
        // This is the first use of this intrinsic as a non-virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
        flags |= _intrinsic_both;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    _intrinsic_hist_flags[id] = (jubyte) (oflags | flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // update the overall flags also:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  _intrinsic_hist_flags[vmIntrinsics::_none] |= (jubyte) flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  return changed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
static char* format_flags(int flags, char* buf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  buf[0] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  if ((flags & Compile::_intrinsic_worked) != 0)    strcat(buf, ",worked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  if ((flags & Compile::_intrinsic_failed) != 0)    strcat(buf, ",failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  if ((flags & Compile::_intrinsic_disabled) != 0)  strcat(buf, ",disabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  if ((flags & Compile::_intrinsic_virtual) != 0)   strcat(buf, ",virtual");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  if ((flags & Compile::_intrinsic_both) != 0)      strcat(buf, ",nonvirtual");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  if (buf[0] == 0)  strcat(buf, ",");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  assert(buf[0] == ',', "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  return &buf[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
void Compile::print_intrinsic_statistics() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  char flagsbuf[100];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  if (xtty != NULL)  xtty->head("statistics type='intrinsic'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  tty->print_cr("Compiler intrinsic usage:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  juint total = _intrinsic_hist_count[vmIntrinsics::_none];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  if (total == 0)  total = 1;  // avoid div0 in case of no successes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  #define PRINT_STAT_LINE(name, c, f) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    tty->print_cr("  %4d (%4.1f%%) %s (%s)", (int)(c), ((c) * 100.0) / total, name, f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  for (int index = 1 + (int)vmIntrinsics::_none; index < (int)vmIntrinsics::ID_LIMIT; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    vmIntrinsics::ID id = (vmIntrinsics::ID) index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    int   flags = _intrinsic_hist_flags[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    juint count = _intrinsic_hist_count[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    if ((flags | count) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
      PRINT_STAT_LINE(vmIntrinsics::name_at(id), count, format_flags(flags, flagsbuf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  PRINT_STAT_LINE("total", total, format_flags(_intrinsic_hist_flags[vmIntrinsics::_none], flagsbuf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  if (xtty != NULL)  xtty->tail("statistics");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
void Compile::print_statistics() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  { ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    if (xtty != NULL)  xtty->head("statistics type='opto'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    Parse::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    PhaseCCP::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    PhaseRegAlloc::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    Scheduling::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    PhasePeephole::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    PhaseIdealLoop::print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    if (xtty != NULL)  xtty->tail("statistics");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  if (_intrinsic_hist_flags[vmIntrinsics::_none] != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    // put this under its own <statistics> element.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    print_intrinsic_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
#endif //PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
// Support for bundling info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
Bundle* Compile::node_bundling(const Node *n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  assert(valid_bundle_info(n), "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  return &_node_bundling_base[n->_idx];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
bool Compile::valid_bundle_info(const Node *n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  return (_node_bundling_limit > n->_idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   297
void Compile::gvn_replace_by(Node* n, Node* nn) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   298
  for (DUIterator_Last imin, i = n->last_outs(imin); i >= imin; ) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   299
    Node* use = n->last_out(i);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   300
    bool is_in_table = initial_gvn()->hash_delete(use);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   301
    uint uses_found = 0;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   302
    for (uint j = 0; j < use->len(); j++) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   303
      if (use->in(j) == n) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   304
        if (j < use->req())
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   305
          use->set_req(j, nn);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   306
        else
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   307
          use->set_prec(j, nn);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   308
        uses_found++;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   309
      }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   310
    }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   311
    if (is_in_table) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   312
      // reinsert into table
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   313
      initial_gvn()->hash_find_insert(use);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   314
    }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   315
    record_for_igvn(use);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   316
    i -= uses_found;    // we deleted 1 or more copies of this edge
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   317
  }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   318
}
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   319
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   320
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   321
static inline bool not_a_node(const Node* n) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   322
  if (n == NULL)                   return true;
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   323
  if (((intptr_t)n & 1) != 0)      return true;  // uninitialized, etc.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   324
  if (*(address*)n == badAddress)  return true;  // kill by Node::destruct
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   325
  return false;
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   326
}
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   327
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
// Identify all nodes that are reachable from below, useful.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
// Use breadth-first pass that records state in a Unique_Node_List,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
// recursive traversal is slower.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
void Compile::identify_useful_nodes(Unique_Node_List &useful) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  int estimated_worklist_size = unique();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  useful.map( estimated_worklist_size, NULL );  // preallocate space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  // Initialize worklist
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  if (root() != NULL)     { useful.push(root()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // If 'top' is cached, declare it useful to preserve cached node
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  if( cached_top_node() ) { useful.push(cached_top_node()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // Push all useful nodes onto the list, breadthfirst
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  for( uint next = 0; next < useful.size(); ++next ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    assert( next < unique(), "Unique useful nodes < total nodes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    Node *n  = useful.at(next);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    uint max = n->len();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    for( uint i = 0; i < max; ++i ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      Node *m = n->in(i);
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   347
      if (not_a_node(m))  continue;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
      useful.push(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   353
// Update dead_node_list with any missing dead nodes using useful
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   354
// list. Consider all non-useful nodes to be useless i.e., dead nodes.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   355
void Compile::update_dead_node_list(Unique_Node_List &useful) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   356
  uint max_idx = unique();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   357
  VectorSet& useful_node_set = useful.member_set();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   358
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   359
  for (uint node_idx = 0; node_idx < max_idx; node_idx++) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   360
    // If node with index node_idx is not in useful set,
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   361
    // mark it as dead in dead node list.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   362
    if (! useful_node_set.test(node_idx) ) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   363
      record_dead_node(node_idx);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   364
    }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   365
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   366
}
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   367
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
// Disconnect all useless nodes by disconnecting those at the boundary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
void Compile::remove_useless_nodes(Unique_Node_List &useful) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  uint next = 0;
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   371
  while (next < useful.size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    Node *n = useful.at(next++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    // Use raw traversal of out edges since this code removes out edges
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    int max = n->outcnt();
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   375
    for (int j = 0; j < max; ++j) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
      Node* child = n->raw_out(j);
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   377
      if (! useful.member(child)) {
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   378
        assert(!child->is_top() || child != top(),
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   379
               "If top is cached in Compile object it is in useful list");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
        // Only need to remove this out-edge to the useless node
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
        n->raw_del_out(j);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
        --j;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
        --max;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    if (n->outcnt() == 1 && n->has_special_unique_user()) {
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   387
      record_for_igvn(n->unique_out());
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   388
    }
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   389
  }
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   390
  // Remove useless macro and predicate opaq nodes
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   391
  for (int i = C->macro_count()-1; i >= 0; i--) {
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   392
    Node* n = C->macro_node(i);
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   393
    if (!useful.member(n)) {
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   394
      remove_macro_node(n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  debug_only(verify_graph_edges(true/*check for no_dead_code*/);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
//------------------------------frame_size_in_words-----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
// frame_slots in units of words
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
int Compile::frame_size_in_words() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  // shift is 0 in LP32 and 1 in LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  const int shift = (LogBytesPerWord - LogBytesPerInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  int words = _frame_slots >> shift;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  assert( words << shift == _frame_slots, "frame size must be properly aligned in LP64" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  return words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
// ============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
//------------------------------CompileWrapper---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
class CompileWrapper : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  Compile *const _compile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  CompileWrapper(Compile* compile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  ~CompileWrapper();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
CompileWrapper::CompileWrapper(Compile* compile) : _compile(compile) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // the Compile* pointer is stored in the current ciEnv:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  ciEnv* env = compile->env();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  assert(env == ciEnv::current(), "must already be a ciEnv active");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  assert(env->compiler_data() == NULL, "compile already active?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  env->set_compiler_data(compile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  assert(compile == Compile::current(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  compile->set_type_dict(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  compile->set_type_hwm(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  compile->set_type_last_size(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  compile->set_last_tf(NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  compile->set_indexSet_arena(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  compile->set_indexSet_free_block_list(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  compile->init_type_arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  Type::Initialize(compile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  _compile->set_scratch_buffer_blob(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  _compile->begin_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
CompileWrapper::~CompileWrapper() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  _compile->end_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  if (_compile->scratch_buffer_blob() != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    BufferBlob::free(_compile->scratch_buffer_blob());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  _compile->env()->set_compiler_data(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
//----------------------------print_compile_messages---------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
void Compile::print_compile_messages() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // Check if recompiling
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  if (_subsume_loads == false && PrintOpto) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    // Recompiling without allowing machine instructions to subsume loads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    tty->print_cr("*********************************************************");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    tty->print_cr("** Bailout: Recompile without subsuming loads          **");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
    tty->print_cr("*********************************************************");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  }
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   457
  if (_do_escape_analysis != DoEscapeAnalysis && PrintOpto) {
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   458
    // Recompiling without escape analysis
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   459
    tty->print_cr("*********************************************************");
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   460
    tty->print_cr("** Bailout: Recompile without escape analysis          **");
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   461
    tty->print_cr("*********************************************************");
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   462
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  if (env()->break_at_compile()) {
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 2022
diff changeset
   464
    // Open the debugger when compiling this method.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    tty->print("### Breaking when compiling: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    method()->print_short_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    BREAKPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  if( PrintOpto ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    if (is_osr_compilation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
      tty->print("[OSR]%3d", _compile_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
      tty->print("%3d", _compile_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
7715
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   482
//-----------------------init_scratch_buffer_blob------------------------------
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   483
// Construct a temporary BufferBlob and cache it for this compile.
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   484
void Compile::init_scratch_buffer_blob(int const_size) {
7715
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   485
  // If there is already a scratch buffer blob allocated and the
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   486
  // constant section is big enough, use it.  Otherwise free the
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   487
  // current and allocate a new one.
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   488
  BufferBlob* blob = scratch_buffer_blob();
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   489
  if ((blob != NULL) && (const_size <= _scratch_const_size)) {
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   490
    // Use the current blob.
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   491
  } else {
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   492
    if (blob != NULL) {
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   493
      BufferBlob::free(blob);
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   494
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
7715
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   496
    ResourceMark rm;
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   497
    _scratch_const_size = const_size;
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   498
    int size = (MAX_inst_size + MAX_stubs_size + _scratch_const_size);
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   499
    blob = BufferBlob::create("Compile::scratch_buffer", size);
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   500
    // Record the buffer blob for next time.
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   501
    set_scratch_buffer_blob(blob);
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   502
    // Have we run out of code space?
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   503
    if (scratch_buffer_blob() == NULL) {
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   504
      // Let CompilerBroker disable further compilations.
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   505
      record_failure("Not enough space for scratch buffer in CodeCache");
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   506
      return;
12998f95a334 7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents: 7433
diff changeset
   507
    }
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 374
diff changeset
   508
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  // Initialize the relocation buffers
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6180
diff changeset
   511
  relocInfo* locs_buf = (relocInfo*) blob->content_end() - MAX_locs_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  set_scratch_locs_memory(locs_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
//-----------------------scratch_emit_size-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
// Helper function that computes size by emitting code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
uint Compile::scratch_emit_size(const Node* n) {
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   519
  // Start scratch_emit_size section.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   520
  set_in_scratch_emit_size(true);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   521
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  // Emit into a trash buffer and count bytes emitted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // This is a pretty expensive way to compute a size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  // but it works well enough if seldom used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  // All common fixed-size instructions are given a size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  // method by the AD file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // Note that the scratch buffer blob and locs memory are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // allocated at the beginning of the compile task, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  // may be shared by several calls to scratch_emit_size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // The allocation of the scratch buffer blob is particularly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // expensive, since it has to grab the code cache lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  BufferBlob* blob = this->scratch_buffer_blob();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  assert(blob != NULL, "Initialize BufferBlob at start");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  assert(blob->size() > MAX_inst_size, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  relocInfo* locs_buf = scratch_locs_memory();
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6180
diff changeset
   536
  address blob_begin = blob->content_begin();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  address blob_end   = (address)locs_buf;
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6180
diff changeset
   538
  assert(blob->content_contains(blob_end), "sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  CodeBuffer buf(blob_begin, blob_end - blob_begin);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   540
  buf.initialize_consts_size(_scratch_const_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  buf.initialize_stubs_size(MAX_stubs_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  assert(locs_buf != NULL, "sanity");
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   543
  int lsize = MAX_locs_size / 3;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   544
  buf.consts()->initialize_shared_locs(&locs_buf[lsize * 0], lsize);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   545
  buf.insts()->initialize_shared_locs( &locs_buf[lsize * 1], lsize);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   546
  buf.stubs()->initialize_shared_locs( &locs_buf[lsize * 2], lsize);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   547
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   548
  // Do the emission.
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   549
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   550
  Label fakeL; // Fake label for branch instructions.
10266
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   551
  Label*   saveL = NULL;
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   552
  uint save_bnum = 0;
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   553
  bool is_branch = n->is_MachBranch();
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   554
  if (is_branch) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   555
    MacroAssembler masm(&buf);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   556
    masm.bind(fakeL);
10266
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   557
    n->as_MachBranch()->save_label(&saveL, &save_bnum);
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   558
    n->as_MachBranch()->label_set(&fakeL, 0);
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10012
diff changeset
   559
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  n->emit(buf, this->regalloc());
10266
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   561
  if (is_branch) // Restore label.
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   562
    n->as_MachBranch()->label_set(saveL, save_bnum);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   563
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   564
  // End scratch_emit_size section.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   565
  set_in_scratch_emit_size(false);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   566
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6180
diff changeset
   567
  return buf.insts_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
// ============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
//------------------------------Compile standard-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
debug_only( int Compile::_debug_idx = 100000; )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
// Compile a method.  entry_bci is -1 for normal compilations and indicates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
// the continuation bci for on stack replacement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   579
Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci, bool subsume_loads, bool do_escape_analysis )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
                : Phase(Compiler),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
                  _env(ci_env),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
                  _log(ci_env->log()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
                  _compile_id(ci_env->compile_id()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
                  _save_argument_registers(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
                  _stub_name(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
                  _stub_function(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
                  _stub_entry_point(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
                  _method(target),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
                  _entry_bci(osr_bci),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
                  _initial_gvn(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
                  _for_igvn(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
                  _warm_calls(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
                  _subsume_loads(subsume_loads),
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   594
                  _do_escape_analysis(do_escape_analysis),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
                  _failure_reason(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
                  _code_buffer("Compile::Fill_buffer"),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
                  _orig_pc_slot(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
                  _orig_pc_slot_offset_in_bytes(0),
4906
90640ad2d401 6926782: CodeBuffer size too small after 6921352
twisti
parents: 4643
diff changeset
   599
                  _has_method_handle_invokes(false),
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   600
                  _mach_constant_base_node(NULL),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
                  _node_bundling_limit(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
                  _node_bundling_base(NULL),
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
   603
                  _java_calls(0),
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
   604
                  _inner_loops(0),
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   605
                  _scratch_const_size(-1),
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   606
                  _in_scratch_emit_size(false),
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   607
                  _dead_node_list(comp_arena()),
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   608
                  _dead_node_count(0),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
                  _trace_opto_output(TraceOptoOutput || method()->has_option("TraceOptoOutput")),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
                  _printer(IdealGraphPrinter::printer()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
#endif
14828
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   613
                  _congraph(NULL),
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   614
                  _print_inlining_list(NULL),
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   615
                  _print_inlining(0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  C = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  CompileWrapper cw(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  if (TimeCompiler2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    tty->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    target->holder()->name()->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    tty->print(".");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    target->print_short_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    tty->print("  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  TraceTime t1("Total compilation time", &_t_totalCompilation, TimeCompiler, TimeCompiler2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  TraceTime t2(NULL, &_t_methodCompilation, TimeCompiler, false);
347
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   629
  bool print_opto_assembly = PrintOptoAssembly || _method->has_option("PrintOptoAssembly");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   630
  if (!print_opto_assembly) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   631
    bool print_assembly = (PrintAssembly || _method->should_print_assembly());
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   632
    if (print_assembly && !Disassembler::can_decode()) {
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   633
      tty->print_cr("PrintAssembly request changed to PrintOptoAssembly");
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   634
      print_opto_assembly = true;
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   635
    }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   636
  }
df859fcca515 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 238
diff changeset
   637
  set_print_assembly(print_opto_assembly);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1137
diff changeset
   638
  set_parsed_irreducible_loop(false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  if (ProfileTraps) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    // Make sure the method being compiled gets its own MDO,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
    // so we can at least track the decompile_count().
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   644
    method()->ensure_method_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  Init(::AliasLevel);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  print_compile_messages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  if (UseOldInlining || PrintCompilation NOT_PRODUCT( || PrintOpto) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    _ilt = InlineTree::build_inline_tree_root();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
    _ilt = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  // Even if NO memory addresses are used, MergeMem nodes must have at least 1 slice
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  assert(num_alias_types() >= AliasIdxRaw, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
#define MINIMUM_NODE_HASH  1023
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  // Node list that Iterative GVN will start with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  Unique_Node_List for_igvn(comp_arena());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  set_for_igvn(&for_igvn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // GVN that will be run immediately on new nodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  uint estimated_size = method()->code_size()*4+64;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  estimated_size = (estimated_size < MINIMUM_NODE_HASH ? MINIMUM_NODE_HASH : estimated_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  PhaseGVN gvn(node_arena(), estimated_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  set_initial_gvn(&gvn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
14828
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   671
  if (PrintInlining) {
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   672
    _print_inlining_list = new (comp_arena())GrowableArray<PrintInliningBuffer>(comp_arena(), 1, 1, PrintInliningBuffer());
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   673
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  { // Scope for timing the parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
    TracePhase t3("parse", &_t_parser, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
    // Put top into the hash table ASAP.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    initial_gvn()->transform_no_reclaim(top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    // Set up tf(), start(), and find a CallGenerator.
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   681
    CallGenerator* cg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
    if (is_osr_compilation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
      const TypeTuple *domain = StartOSRNode::osr_domain();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
      const TypeTuple *range = TypeTuple::make_range(method()->signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
      init_tf(TypeFunc::make(domain, range));
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13886
diff changeset
   686
      StartNode* s = new (this) StartOSRNode(root(), domain);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
      initial_gvn()->set_type_bottom(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
      init_start(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
      cg = CallGenerator::for_osr(method(), entry_bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
      // Normal case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
      init_tf(TypeFunc::make(method()));
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13886
diff changeset
   693
      StartNode* s = new (this) StartNode(root(), tf()->domain());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
      initial_gvn()->set_type_bottom(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
      init_start(s);
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   696
      if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   697
        // With java.lang.ref.reference.get() we must go through the
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   698
        // intrinsic when G1 is enabled - even when get() is the root
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   699
        // method of the compile - so that, if necessary, the value in
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   700
        // the referent field of the reference object gets recorded by
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   701
        // the pre-barrier code.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   702
        // Specifically, if G1 is enabled, the value in the referent
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   703
        // field is recorded by the G1 SATB pre barrier. This will
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   704
        // result in the referent being marked live and the reference
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   705
        // object removed from the list of discovered references during
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   706
        // reference processing.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   707
        cg = find_intrinsic(method(), false);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   708
      }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   709
      if (cg == NULL) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   710
        float past_uses = method()->interpreter_invocation_count();
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   711
        float expected_uses = past_uses;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   712
        cg = CallGenerator::for_inline(method(), expected_uses);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 9175
diff changeset
   713
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    if (cg == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
      record_method_not_compilable_all_tiers("cannot parse method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
    JVMState* jvms = build_start_state(start(), tf());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    if ((jvms = cg->generate(jvms)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
      record_method_not_compilable("method parse failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    GraphKit kit(jvms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    if (!kit.stopped()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
      // Accept return values, and transfer control we know not where.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
      // This is done by a special, unique ReturnNode bound to root.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
      return_values(kit.jvms());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    if (kit.has_exceptions()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
      // Any exceptions that escape from this call must be rethrown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
      // to whatever caller is dynamically above us on the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      // This is done by a special, unique RethrowNode bound to root.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
      rethrow_exceptions(kit.transfer_exceptions_into_jvms());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   740
    if (!failing() && has_stringbuilder()) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   741
      {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   742
        // remove useless nodes to make the usage analysis simpler
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   743
        ResourceMark rm;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   744
        PhaseRemoveUseless pru(initial_gvn(), &for_igvn);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   745
      }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   746
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   747
      {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   748
        ResourceMark rm;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   749
        print_method("Before StringOpts", 3);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   750
        PhaseStringOpts pso(initial_gvn(), &for_igvn);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   751
        print_method("After StringOpts", 3);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   752
      }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   753
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   754
      // now inline anything that we skipped the first time around
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   755
      while (_late_inlines.length() > 0) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   756
        CallGenerator* cg = _late_inlines.pop();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   757
        cg->do_late_inline();
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
   758
        if (failing())  return;
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   759
      }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   760
    }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   761
    assert(_late_inlines.length() == 0, "should have been processed");
14828
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   762
    dump_inlining();
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
   763
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 1400
diff changeset
   764
    print_method("Before RemoveUseless", 3);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1137
diff changeset
   765
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
    // Remove clutter produced by parsing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    if (!failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
      PhaseRemoveUseless pru(initial_gvn(), &for_igvn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  // Note:  Large methods are capped off in do_one_bytecode().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  // After parsing, node notes are no longer automagic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  // They must be propagated by register_new_node_with_optimizer(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  // clone(), or the like.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  set_default_node_notes(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
    int successes = Inline_Warm();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
    if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    if (successes == 0)  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  // Drain the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  Finish_Warm();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  if (_printer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    _printer->print_inlining(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  // Now optimize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  Optimize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  if (PrintIdeal) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
    ttyLocker ttyl;  // keep the following output all in one block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    // This output goes directly to the tty, not the compiler log.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    // To enable tools to match it up with the compilation activity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
    // be sure to tag this tty output with the compile ID.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    if (xtty != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
      xtty->head("ideal compile_id='%d'%s", compile_id(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
                 is_osr_compilation()    ? " compile_kind='osr'" :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
                 "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    root()->dump(9999);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
    if (xtty != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
      xtty->tail("ideal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  // Now that we know the size of all the monitors we can add a fixed slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  // for the original deopt pc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  _orig_pc_slot =  fixed_slots();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  int next_slot = _orig_pc_slot + (sizeof(address) / VMRegImpl::stack_slot_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  set_fixed_slots(next_slot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  // Now generate code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  Code_Gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  // Check if we want to skip execution of all compiled code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    if (OptoNoExecute) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
      record_method_not_compilable("+OptoNoExecute");  // Flag as failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
    TracePhase t2("install_code", &_t_registerMethod, TimeCompiler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
    if (is_osr_compilation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
      _code_offsets.set_value(CodeOffsets::Verified_Entry, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
      _code_offsets.set_value(CodeOffsets::OSR_Entry, _first_block_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
      _code_offsets.set_value(CodeOffsets::Verified_Entry, _first_block_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      _code_offsets.set_value(CodeOffsets::OSR_Entry, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    env()->register_method(_method, _entry_bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
                           &_code_offsets,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
                           _orig_pc_slot_offset_in_bytes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
                           code_buffer(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
                           frame_size_in_words(), _oop_map_set,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
                           &_handler_table, &_inc_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
                           compiler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
                           env()->comp_level(),
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   858
                           has_unsafe_access(),
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   859
                           SharedRuntime::is_wide_vector(max_vector_size())
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
                           );
13964
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13895
diff changeset
   861
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13895
diff changeset
   862
    if (log() != NULL) // Print code cache state into compiler log
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13895
diff changeset
   863
      log()->code_cache_state();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
//------------------------------Compile----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
// Compile a runtime stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
Compile::Compile( ciEnv* ci_env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
                  TypeFunc_generator generator,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
                  address stub_function,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
                  const char *stub_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
                  int is_fancy_jump,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
                  bool pass_tls,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
                  bool save_arg_registers,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
                  bool return_pc )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  : Phase(Compiler),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
    _env(ci_env),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    _log(ci_env->log()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
    _compile_id(-1),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
    _save_argument_registers(save_arg_registers),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    _method(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
    _stub_name(stub_name),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
    _stub_function(stub_function),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
    _stub_entry_point(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
    _entry_bci(InvocationEntryBci),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
    _initial_gvn(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
    _for_igvn(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    _warm_calls(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
    _orig_pc_slot(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    _orig_pc_slot_offset_in_bytes(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    _subsume_loads(true),
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
   893
    _do_escape_analysis(false),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
    _failure_reason(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
    _code_buffer("Compile::Fill_buffer"),
4906
90640ad2d401 6926782: CodeBuffer size too small after 6921352
twisti
parents: 4643
diff changeset
   896
    _has_method_handle_invokes(false),
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
   897
    _mach_constant_base_node(NULL),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
    _node_bundling_limit(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
    _node_bundling_base(NULL),
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
   900
    _java_calls(0),
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
   901
    _inner_loops(0),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
    _trace_opto_output(TraceOptoOutput),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
    _printer(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
#endif
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   906
    _dead_node_list(comp_arena()),
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
   907
    _dead_node_count(0),
14828
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   908
    _congraph(NULL),
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   909
    _print_inlining_list(NULL),
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
   910
    _print_inlining(0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  C = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  TraceTime t1(NULL, &_t_totalCompilation, TimeCompiler, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  TraceTime t2(NULL, &_t_stubCompilation, TimeCompiler, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  set_print_assembly(PrintFrameConverterAssembly);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1137
diff changeset
   917
  set_parsed_irreducible_loop(false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  CompileWrapper cw(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  Init(/*AliasLevel=*/ 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  init_tf((*generator)());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
    // The following is a dummy for the sake of GraphKit::gen_stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
    Unique_Node_List for_igvn(comp_arena());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
    set_for_igvn(&for_igvn);  // not used, but some GraphKit guys push on this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    PhaseGVN gvn(Thread::current()->resource_area(),255);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    set_initial_gvn(&gvn);    // not significant, but GraphKit guys use it pervasively
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
    gvn.transform_no_reclaim(top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    GraphKit kit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
    kit.gen_stub(stub_function, stub_name, is_fancy_jump, pass_tls, return_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  Code_Gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  // Entry point will be accessed using compile->stub_entry_point();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  if (code_buffer() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
    Matcher::soft_match_failure();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
    if (PrintAssembly && (WizardMode || Verbose))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
      tty->print_cr("### Stub::%s", stub_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    if (!failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
      assert(_fixed_slots == 0, "no fixed slots used for runtime stubs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
      // Make the NMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
      // For now we mark the frame as never safe for profile stackwalking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
      RuntimeStub *rs = RuntimeStub::new_runtime_stub(stub_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
                                                      code_buffer(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
                                                      CodeOffsets::frame_never_safe,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
                                                      // _code_offsets.value(CodeOffsets::Frame_Complete),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
                                                      frame_size_in_words(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
                                                      _oop_map_set,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
                                                      save_arg_registers);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
      assert(rs != NULL && rs->is_runtime_stub(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
      _stub_entry_point = rs->entry_point();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
//------------------------------Init-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
// Prepare for a single compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
void Compile::Init(int aliaslevel) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  _unique  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  _regalloc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  _tf      = NULL;  // filled in later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  _top     = NULL;  // cached later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  _matcher = NULL;  // filled in later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  _cfg     = NULL;  // filled in later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  set_24_bit_selection_and_mode(Use24BitFP, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  _node_note_array = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  _default_node_notes = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  _immutable_memory = NULL; // filled in at first inquiry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  // Globally visible Nodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  // First set TOP to NULL to give safe behavior during creation of RootNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  set_cached_top_node(NULL);
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13886
diff changeset
   987
  set_root(new (this) RootNode());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  // Now that you have a Root to point to, create the real TOP
13895
f6dfe4123709 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 13886
diff changeset
   989
  set_cached_top_node( new (this) ConNode(Type::TOP) );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  set_recent_alloc(NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // Create Debug Information Recorder to record scopes, oopmaps, etc.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
   993
  env()->set_oop_recorder(new OopRecorder(env()->arena()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  env()->set_dependencies(new Dependencies(env()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  _fixed_slots = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  set_has_split_ifs(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  set_has_loops(has_method() && method()->has_loops()); // first approximation
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  1000
  set_has_stringbuilder(false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  _trap_can_recompile = false;  // no traps emitted yet
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  _major_progress = true; // start out assuming good things will happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  set_has_unsafe_access(false);
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
  1004
  set_max_vector_size(0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  Copy::zero_to_bytes(_trap_hist, sizeof(_trap_hist));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  set_decompile_count(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
1498
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  1008
  set_do_freq_based_layout(BlockLayoutByFrequency || method_has_option("BlockLayoutByFrequency"));
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1009
  set_num_loop_opts(LoopOptsCount);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1010
  set_do_inlining(Inline);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1011
  set_max_inline_size(MaxInlineSize);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1012
  set_freq_inline_size(FreqInlineSize);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1013
  set_do_scheduling(OptoScheduling);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1014
  set_do_count_invocations(false);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1015
  set_do_method_data_update(false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  if (debug_info()->recording_non_safepoints()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
    set_node_note_array(new(comp_arena()) GrowableArray<Node_Notes*>
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
                        (comp_arena(), 8, 0, NULL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
    set_default_node_notes(Node_Notes::make(this));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  // // -- Initialize types before each compile --
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  // // Update cached type information
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  // if( _method && _method->constants() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  //   Type::update_loaded_types(_method, _method->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  // Init alias_type map.
211
e2b60448c234 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 1
diff changeset
  1029
  if (!_do_escape_analysis && aliaslevel == 3)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
    aliaslevel = 2;  // No unique types without escape analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  _AliasLevel = aliaslevel;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  const int grow_ats = 16;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  _max_alias_types = grow_ats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  _alias_types   = NEW_ARENA_ARRAY(comp_arena(), AliasType*, grow_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  AliasType* ats = NEW_ARENA_ARRAY(comp_arena(), AliasType,  grow_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  Copy::zero_to_bytes(ats, sizeof(AliasType)*grow_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
    for (int i = 0; i < grow_ats; i++)  _alias_types[i] = &ats[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  // Initialize the first few types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  _alias_types[AliasIdxTop]->Init(AliasIdxTop, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  _alias_types[AliasIdxBot]->Init(AliasIdxBot, TypePtr::BOTTOM);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  _alias_types[AliasIdxRaw]->Init(AliasIdxRaw, TypeRawPtr::BOTTOM);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  _num_alias_types = AliasIdxRaw+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  // Zero out the alias type cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  Copy::zero_to_bytes(_alias_cache, sizeof(_alias_cache));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  // A NULL adr_type hits in the cache right away.  Preload the right answer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  probe_alias_cache(NULL)->_index = AliasIdxTop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  _intrinsics = NULL;
6180
53c1bf468c81 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 5914
diff changeset
  1051
  _macro_nodes = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8,  0, NULL);
53c1bf468c81 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 5914
diff changeset
  1052
  _predicate_opaqs = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8,  0, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  register_library_intrinsics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
//---------------------------init_start----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
// Install the StartNode on this compile object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
void Compile::init_start(StartNode* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  if (failing())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
    return; // already failing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  assert(s == start(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
StartNode* Compile::start() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  assert(!failing(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  for (DUIterator_Fast imax, i = root()->fast_outs(imax); i < imax; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    Node* start = root()->fast_out(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    if( start->is_Start() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      return start->as_Start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
//-------------------------------immutable_memory-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
// Access immutable memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
Node* Compile::immutable_memory() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  if (_immutable_memory != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
    return _immutable_memory;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  StartNode* s = start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  for (DUIterator_Fast imax, i = s->fast_outs(imax); true; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
    Node *p = s->fast_out(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
    if (p != s && p->as_Proj()->_con == TypeFunc::Memory) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
      _immutable_memory = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
      return _immutable_memory;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
//----------------------set_cached_top_node------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
// Install the cached top node, and make sure Node::is_top works correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
void Compile::set_cached_top_node(Node* tn) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  if (tn != NULL)  verify_top(tn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  Node* old_top = _top;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  _top = tn;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  // Calling Node::setup_is_top allows the nodes the chance to adjust
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  // their _out arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  if (_top != NULL)     _top->setup_is_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  if (old_top != NULL)  old_top->setup_is_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  assert(_top == NULL || top()->is_top(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1106
#ifdef ASSERT
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1107
uint Compile::count_live_nodes_by_graph_walk() {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1108
  Unique_Node_List useful(comp_arena());
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1109
  // Get useful node list by walking the graph.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1110
  identify_useful_nodes(useful);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1111
  return useful.size();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1112
}
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1113
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1114
void Compile::print_missing_nodes() {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1115
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1116
  // Return if CompileLog is NULL and PrintIdealNodeCount is false.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1117
  if ((_log == NULL) && (! PrintIdealNodeCount)) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1118
    return;
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1119
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1120
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1121
  // This is an expensive function. It is executed only when the user
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1122
  // specifies VerifyIdealNodeCount option or otherwise knows the
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1123
  // additional work that needs to be done to identify reachable nodes
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1124
  // by walking the flow graph and find the missing ones using
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1125
  // _dead_node_list.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1126
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1127
  Unique_Node_List useful(comp_arena());
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1128
  // Get useful node list by walking the graph.
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1129
  identify_useful_nodes(useful);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1130
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1131
  uint l_nodes = C->live_nodes();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1132
  uint l_nodes_by_walk = useful.size();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1133
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1134
  if (l_nodes != l_nodes_by_walk) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1135
    if (_log != NULL) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1136
      _log->begin_head("mismatched_nodes count='%d'", abs((int) (l_nodes - l_nodes_by_walk)));
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1137
      _log->stamp();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1138
      _log->end_head();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1139
    }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1140
    VectorSet& useful_member_set = useful.member_set();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1141
    int last_idx = l_nodes_by_walk;
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1142
    for (int i = 0; i < last_idx; i++) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1143
      if (useful_member_set.test(i)) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1144
        if (_dead_node_list.test(i)) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1145
          if (_log != NULL) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1146
            _log->elem("mismatched_node_info node_idx='%d' type='both live and dead'", i);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1147
          }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1148
          if (PrintIdealNodeCount) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1149
            // Print the log message to tty
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1150
              tty->print_cr("mismatched_node idx='%d' both live and dead'", i);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1151
              useful.at(i)->dump();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1152
          }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1153
        }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1154
      }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1155
      else if (! _dead_node_list.test(i)) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1156
        if (_log != NULL) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1157
          _log->elem("mismatched_node_info node_idx='%d' type='neither live nor dead'", i);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1158
        }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1159
        if (PrintIdealNodeCount) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1160
          // Print the log message to tty
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1161
          tty->print_cr("mismatched_node idx='%d' type='neither live nor dead'", i);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1162
        }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1163
      }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1164
    }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1165
    if (_log != NULL) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1166
      _log->tail("mismatched_nodes");
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1167
    }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1168
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1169
}
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1170
#endif
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  1171
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
void Compile::verify_top(Node* tn) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  if (tn != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
    assert(tn->is_Con(), "top node must be a constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
    assert(((ConNode*)tn)->type() == Type::TOP, "top node must have correct type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
    assert(tn->in(0) != NULL, "must have live top node");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
///-------------------Managing Per-Node Debug & Profile Info-------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
void Compile::grow_node_notes(GrowableArray<Node_Notes*>* arr, int grow_by) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  guarantee(arr != NULL, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  int num_blocks = arr->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  if (grow_by < num_blocks)  grow_by = num_blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  int num_notes = grow_by * _node_notes_block_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  Node_Notes* notes = NEW_ARENA_ARRAY(node_arena(), Node_Notes, num_notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  Copy::zero_to_bytes(notes, num_notes * sizeof(Node_Notes));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  while (num_notes > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
    arr->append(notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
    notes     += _node_notes_block_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
    num_notes -= _node_notes_block_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  assert(num_notes == 0, "exact multiple, please");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
bool Compile::copy_node_notes_to(Node* dest, Node* source) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  if (source == NULL || dest == NULL)  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  if (dest->is_Con())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
    return false;               // Do not push debug info onto constants.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  // Leave a bread crumb trail pointing to the original node:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  if (dest != NULL && dest != source && dest->debug_orig() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
    dest->set_debug_orig(source);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  if (node_note_array() == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
    return false;               // Not collecting any notes now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  // This is a copy onto a pre-existing node, which may already have notes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  // If both nodes have notes, do not overwrite any pre-existing notes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  Node_Notes* source_notes = node_notes_at(source->_idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  if (source_notes == NULL || source_notes->is_clear())  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  Node_Notes* dest_notes   = node_notes_at(dest->_idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  if (dest_notes == NULL || dest_notes->is_clear()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
    return set_node_notes_at(dest->_idx, source_notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  Node_Notes merged_notes = (*source_notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
  // The order of operations here ensures that dest notes will win...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  merged_notes.update_from(dest_notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  return set_node_notes_at(dest->_idx, &merged_notes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
//--------------------------allow_range_check_smearing-------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
// Gating condition for coalescing similar range checks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
// Sometimes we try 'speculatively' replacing a series of a range checks by a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
// single covering check that is at least as strong as any of them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
// If the optimization succeeds, the simplified (strengthened) range check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
// will always succeed.  If it fails, we will deopt, and then give up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
// on the optimization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
bool Compile::allow_range_check_smearing() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  // If this method has already thrown a range-check,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  // assume it was because we already tried range smearing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  // and it failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  uint already_trapped = trap_count(Deoptimization::Reason_range_check);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  return !already_trapped;
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
//------------------------------flatten_alias_type-----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  int offset = tj->offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  TypePtr::PTR ptr = tj->ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1253
  // Known instance (scalarizable allocation) alias only with itself.
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1254
  bool is_known_inst = tj->isa_oopptr() != NULL &&
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1255
                       tj->is_oopptr()->is_known_instance();
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1256
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  // Process weird unsafe references.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
  if (offset == Type::OffsetBot && (tj->isa_instptr() /*|| tj->isa_klassptr()*/)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
    assert(InlineUnsafeOps, "indeterminate pointers come only from unsafe ops");
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1260
    assert(!is_known_inst, "scalarizable allocation should not have unsafe references");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
    tj = TypeOopPtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
    ptr = tj->ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
    offset = tj->offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  // Array pointers need some flattening
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
  const TypeAryPtr *ta = tj->isa_aryptr();
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1268
  if( ta && is_known_inst ) {
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1269
    if ( offset != Type::OffsetBot &&
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1270
         offset > arrayOopDesc::length_offset_in_bytes() ) {
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1271
      offset = Type::OffsetBot; // Flatten constant access into array body only
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1272
      tj = ta = TypeAryPtr::make(ptr, ta->ary(), ta->klass(), true, offset, ta->instance_id());
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1273
    }
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1274
  } else if( ta && _AliasLevel >= 2 ) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
    // For arrays indexed by constant indices, we flatten the alias
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
    // space to include all of the array body.  Only the header, klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
    // and array length can be accessed un-aliased.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
    if( offset != Type::OffsetBot ) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  1279
      if( ta->const_oop() ) { // MethodData* or Method*
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
        offset = Type::OffsetBot;   // Flatten constant access into array body
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1281
        tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),ta->ary(),ta->klass(),false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
      } else if( offset == arrayOopDesc::length_offset_in_bytes() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
        // range is OK as-is.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
        tj = ta = TypeAryPtr::RANGE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
      } else if( offset == oopDesc::klass_offset_in_bytes() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
        tj = TypeInstPtr::KLASS; // all klass loads look alike
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
        ta = TypeAryPtr::RANGE; // generic ignored junk
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
        ptr = TypePtr::BotPTR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
      } else if( offset == oopDesc::mark_offset_in_bytes() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
        tj = TypeInstPtr::MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
        ta = TypeAryPtr::RANGE; // generic ignored junk
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
        ptr = TypePtr::BotPTR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
      } else {                  // Random constant offset into array body
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
        offset = Type::OffsetBot;   // Flatten constant access into array body
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1295
        tj = ta = TypeAryPtr::make(ptr,ta->ary(),ta->klass(),false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
    // Arrays of fixed size alias with arrays of unknown size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
    if (ta->size() != TypeInt::POS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
      const TypeAry *tary = TypeAry::make(ta->elem(), TypeInt::POS);
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1301
      tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,ta->klass(),false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    // Arrays of known objects become arrays of unknown objects.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  1304
    if (ta->elem()->isa_narrowoop() && ta->elem() != TypeNarrowOop::BOTTOM) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  1305
      const TypeAry *tary = TypeAry::make(TypeNarrowOop::BOTTOM, ta->size());
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1306
      tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  1307
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    if (ta->elem()->isa_oopptr() && ta->elem() != TypeInstPtr::BOTTOM) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
      const TypeAry *tary = TypeAry::make(TypeInstPtr::BOTTOM, ta->size());
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1310
      tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,NULL,false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
    // Arrays of bytes and of booleans both use 'bastore' and 'baload' so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
    // cannot be distinguished by bytecode alone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
    if (ta->elem() == TypeInt::BOOL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
      const TypeAry *tary = TypeAry::make(TypeInt::BYTE, ta->size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
      ciKlass* aklass = ciTypeArrayKlass::make(T_BYTE);
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1317
      tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),tary,aklass,false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
    // During the 2nd round of IterGVN, NotNull castings are removed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
    // Make sure the Bottom and NotNull variants alias the same.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
    // Also, make sure exact and non-exact variants alias the same.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
    if( ptr == TypePtr::NotNull || ta->klass_is_exact() ) {
10012
31d52b0abd0b 7047954: VM crashes with assert(is_Mem()) failed
kvn
parents: 9182
diff changeset
  1323
      tj = ta = TypeAryPtr::make(TypePtr::BotPTR,ta->ary(),ta->klass(),false,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
  // Oop pointers need some flattening
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  const TypeInstPtr *to = tj->isa_instptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  if( to && _AliasLevel >= 2 && to != TypeOopPtr::BOTTOM ) {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1330
    ciInstanceKlass *k = to->klass()->as_instance_klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
    if( ptr == TypePtr::Constant ) {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1332
      if (to->klass() != ciEnv::current()->Class_klass() ||
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1333
          offset < k->size_helper() * wordSize) {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1334
        // No constant oop pointers (such as Strings); they alias with
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1335
        // unknown strings.
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1336
        assert(!is_known_inst, "not scalarizable allocation");
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1337
        tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1338
      }
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1339
    } else if( is_known_inst ) {
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 374
diff changeset
  1340
      tj = to; // Keep NotNull and klass_is_exact for instance type
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
    } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
      // During the 2nd round of IterGVN, NotNull castings are removed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
      // Make sure the Bottom and NotNull variants alias the same.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
      // Also, make sure exact and non-exact variants alias the same.
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1345
      tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
    // Canonicalize the holder of this field
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  1348
    if (offset >= 0 && offset < instanceOopDesc::base_offset_in_bytes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
      // First handle header references such as a LoadKlassNode, even if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
      // object's klass is unloaded at compile time (4965979).
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1351
      if (!is_known_inst) { // Do it only for non-instance types
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1352
        tj = to = TypeInstPtr::make(TypePtr::BotPTR, env()->Object_klass(), false, NULL, offset);
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1353
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
    } else if (offset < 0 || offset >= k->size_helper() * wordSize) {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1355
      // Static fields are in the space above the normal instance
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1356
      // fields in the java.lang.Class instance.
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1357
      if (to->klass() != ciEnv::current()->Class_klass()) {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1358
        to = NULL;
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1359
        tj = TypeOopPtr::BOTTOM;
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1360
        offset = tj->offset();
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1361
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
      ciInstanceKlass *canonical_holder = k->get_canonical_holder(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
      if (!k->equals(canonical_holder) || tj->offset() != offset) {
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1365
        if( is_known_inst ) {
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1366
          tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, true, NULL, offset, to->instance_id());
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1367
        } else {
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1368
          tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, false, NULL, offset);
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1369
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
  // Klass pointers to object array klasses need some flattening
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  const TypeKlassPtr *tk = tj->isa_klassptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
  if( tk ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
    // If we are referencing a field within a Klass, we need
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
    // to assume the worst case of an Object.  Both exact and
11428
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1379
    // inexact types must flatten to the same alias class so
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1380
    // use NotNull as the PTR.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
    if ( offset == Type::OffsetBot || (offset >= 0 && (size_t)offset < sizeof(Klass)) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
11428
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1383
      tj = tk = TypeKlassPtr::make(TypePtr::NotNull,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
                                   TypeKlassPtr::OBJECT->klass(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
                                   offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
    ciKlass* klass = tk->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
    if( klass->is_obj_array_klass() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
      ciKlass* k = TypeAryPtr::OOPS->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
      if( !k || !k->is_loaded() )                  // Only fails for some -Xcomp runs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
        k = TypeInstPtr::BOTTOM->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
      tj = tk = TypeKlassPtr::make( TypePtr::NotNull, k, offset );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
    // Check for precise loads from the primary supertype array and force them
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
    // to the supertype cache alias index.  Check for generic array loads from
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
    // the primary supertype array and also force them to the supertype cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
    // alias index.  Since the same load can reach both, we need to merge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
    // these 2 disparate memories into the same alias class.  Since the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
    // primary supertype array is read-only, there's no chance of confusion
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
    // where we bypass an array load and an array store.
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1403
    int primary_supers_offset = in_bytes(Klass::primary_supers_offset());
11428
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1404
    if (offset == Type::OffsetBot ||
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1405
        (offset >= primary_supers_offset &&
7496cc6cc1a9 7121073: secondary_super_cache memory slice has incorrect bounds in flatten_alias_type
never
parents: 11191
diff changeset
  1406
         offset < (int)(primary_supers_offset + Klass::primary_super_limit() * wordSize)) ||
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1407
        offset == (int)in_bytes(Klass::secondary_super_cache_offset())) {
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1408
      offset = in_bytes(Klass::secondary_super_cache_offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
      tj = tk = TypeKlassPtr::make( TypePtr::NotNull, tk->klass(), offset );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  // Flatten all Raw pointers together.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  if (tj->base() == Type::RawPtr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
    tj = TypeRawPtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  if (tj->base() == Type::AnyPtr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
    tj = TypePtr::BOTTOM;      // An error, which the caller must check for.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  // Flatten all to bottom for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
  switch( _AliasLevel ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
  case 0:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
    tj = TypePtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  case 1:                       // Flatten to: oop, static, field or array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    switch (tj->base()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
    //case Type::AryPtr: tj = TypeAryPtr::RANGE;    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
    case Type::RawPtr:   tj = TypeRawPtr::BOTTOM;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    case Type::AryPtr:   // do not distinguish arrays at all
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
    case Type::InstPtr:  tj = TypeInstPtr::BOTTOM;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
    case Type::KlassPtr: tj = TypeKlassPtr::OBJECT; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    case Type::AnyPtr:   tj = TypePtr::BOTTOM;      break;  // caller checks it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
    default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
    break;
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 2022
diff changeset
  1436
  case 2:                       // No collapsing at level 2; keep all splits
98f9cef66a34 6810672: Comment typos
twisti
parents: 2022
diff changeset
  1437
  case 3:                       // No collapsing at level 3; keep all splits
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  offset = tj->offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  assert( offset != Type::OffsetTop, "Offset has fallen from constant" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  assert( (offset != Type::OffsetBot && tj->base() != Type::AryPtr) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
          (offset == Type::OffsetBot && tj->base() == Type::AryPtr) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
          (offset == Type::OffsetBot && tj == TypeOopPtr::BOTTOM) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
          (offset == Type::OffsetBot && tj == TypePtr::BOTTOM) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
          (offset == oopDesc::mark_offset_in_bytes() && tj->base() == Type::AryPtr) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
          (offset == oopDesc::klass_offset_in_bytes() && tj->base() == Type::AryPtr) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
          (offset == arrayOopDesc::length_offset_in_bytes() && tj->base() == Type::AryPtr)  ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
          "For oops, klasses, raw offset must be constant; for arrays the offset is never known" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  assert( tj->ptr() != TypePtr::TopPTR &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
          tj->ptr() != TypePtr::AnyNull &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
          tj->ptr() != TypePtr::Null, "No imprecise addresses" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
//    assert( tj->ptr() != TypePtr::Constant ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
//            tj->base() == Type::RawPtr ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
//            tj->base() == Type::KlassPtr, "No constant oop addresses" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  return tj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
void Compile::AliasType::Init(int i, const TypePtr* at) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  _index = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  _adr_type = at;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  _field = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  _is_rewritable = true; // default
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL;
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 768
diff changeset
  1470
  if (atoop != NULL && atoop->is_known_instance()) {
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 768
diff changeset
  1471
    const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    _general_index = Compile::current()->get_alias_index(gt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
    _general_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
//---------------------------------print_on------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
void Compile::AliasType::print_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
  if (index() < 10)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
        st->print("@ <%d> ", index());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  else  st->print("@ <%d>",  index());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  st->print(is_rewritable() ? "   " : " RO");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  int offset = adr_type()->offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  if (offset == Type::OffsetBot)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
        st->print(" +any");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  else  st->print(" +%-3d", offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  st->print(" in ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  adr_type()->dump_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  const TypeOopPtr* tjp = adr_type()->isa_oopptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  if (field() != NULL && tjp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
    if (tjp->klass()  != field()->holder() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
        tjp->offset() != field()->offset_in_bytes()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
      st->print(" != ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
      field()->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
      st->print(" ***");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
void print_alias_types() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
  Compile* C = Compile::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  tty->print_cr("--- Alias types, AliasIdxBot .. %d", C->num_alias_types()-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  for (int idx = Compile::AliasIdxBot; idx < C->num_alias_types(); idx++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
    C->alias_type(idx)->print_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
//----------------------------probe_alias_cache--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
Compile::AliasCacheEntry* Compile::probe_alias_cache(const TypePtr* adr_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
  intptr_t key = (intptr_t) adr_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
  key ^= key >> logAliasCacheSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  return &_alias_cache[key & right_n_bits(logAliasCacheSize)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
//-----------------------------grow_alias_types--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
void Compile::grow_alias_types() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  const int old_ats  = _max_alias_types; // how many before?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  const int new_ats  = old_ats;          // how many more?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  const int grow_ats = old_ats+new_ats;  // how many now?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  _max_alias_types = grow_ats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  _alias_types =  REALLOC_ARENA_ARRAY(comp_arena(), AliasType*, _alias_types, old_ats, grow_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  AliasType* ats =    NEW_ARENA_ARRAY(comp_arena(), AliasType, new_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  Copy::zero_to_bytes(ats, sizeof(AliasType)*new_ats);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  for (int i = 0; i < new_ats; i++)  _alias_types[old_ats+i] = &ats[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
//--------------------------------find_alias_type------------------------------
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1535
Compile::AliasType* Compile::find_alias_type(const TypePtr* adr_type, bool no_create, ciField* original_field) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
  if (_AliasLevel == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
    return alias_type(AliasIdxBot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
  AliasCacheEntry* ace = probe_alias_cache(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  if (ace->_adr_type == adr_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
    return alias_type(ace->_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
  // Handle special cases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
  if (adr_type == NULL)             return alias_type(AliasIdxTop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
  if (adr_type == TypePtr::BOTTOM)  return alias_type(AliasIdxBot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
  // Do it the slow way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
  const TypePtr* flat = flatten_alias_type(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  assert(flat == flatten_alias_type(flat), "idempotent");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
  assert(flat != TypePtr::BOTTOM,     "cannot alias-analyze an untyped ptr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
  if (flat->isa_oopptr() && !flat->isa_klassptr()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
    const TypeOopPtr* foop = flat->is_oopptr();
955
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1556
    // Scalarizable allocations have exact klass always.
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1557
    bool exact = !foop->klass_is_exact() || foop->is_known_instance();
723d7b577fba 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 953
diff changeset
  1558
    const TypePtr* xoop = foop->cast_to_exactness(exact)->is_ptr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
    assert(foop == flatten_alias_type(xoop), "exactness must not affect alias type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  assert(flat == flatten_alias_type(flat), "exact bit doesn't matter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  int idx = AliasIdxTop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
  for (int i = 0; i < num_alias_types(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
    if (alias_type(i)->adr_type() == flat) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
      idx = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
  if (idx == AliasIdxTop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
    if (no_create)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
    // Grow the array if necessary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
    if (_num_alias_types == _max_alias_types)  grow_alias_types();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
    // Add a new alias type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
    idx = _num_alias_types++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
    _alias_types[idx]->Init(idx, flat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
    if (flat == TypeInstPtr::KLASS)  alias_type(idx)->set_rewritable(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
    if (flat == TypeAryPtr::RANGE)   alias_type(idx)->set_rewritable(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
    if (flat->isa_instptr()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
      if (flat->offset() == java_lang_Class::klass_offset_in_bytes()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
          && flat->is_instptr()->klass() == env()->Class_klass())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
        alias_type(idx)->set_rewritable(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
    if (flat->isa_klassptr()) {
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1587
      if (flat->offset() == in_bytes(Klass::super_check_offset_offset()))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
        alias_type(idx)->set_rewritable(false);
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1589
      if (flat->offset() == in_bytes(Klass::modifier_flags_offset()))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
        alias_type(idx)->set_rewritable(false);
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1591
      if (flat->offset() == in_bytes(Klass::access_flags_offset()))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
        alias_type(idx)->set_rewritable(false);
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 11428
diff changeset
  1593
      if (flat->offset() == in_bytes(Klass::java_mirror_offset()))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
        alias_type(idx)->set_rewritable(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
    // %%% (We would like to finalize JavaThread::threadObj_offset(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
    // but the base pointer type is not distinctive enough to identify
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
    // references into JavaThread.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1600
    // Check for final fields.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
    const TypeInstPtr* tinst = flat->isa_instptr();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  1602
    if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1603
      ciField* field;
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1604
      if (tinst->const_oop() != NULL &&
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1605
          tinst->klass() == ciEnv::current()->Class_klass() &&
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1606
          tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1607
        // static field
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1608
        ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1609
        field = k->get_field_by_offset(tinst->offset(), true);
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1610
      } else {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1611
        ciInstanceKlass *k = tinst->klass()->as_instance_klass();
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1612
        field = k->get_field_by_offset(tinst->offset(), false);
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1613
      }
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1614
      assert(field == NULL ||
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1615
             original_field == NULL ||
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1616
             (field->holder() == original_field->holder() &&
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1617
              field->offset() == original_field->offset() &&
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1618
              field->is_static() == original_field->is_static()), "wrong field?");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
      // Set field() and is_rewritable() attributes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
      if (field != NULL)  alias_type(idx)->set_field(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
  // Fill the cache for next time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
  ace->_adr_type = adr_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
  ace->_index    = idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
  assert(alias_type(adr_type) == alias_type(idx),  "type must be installed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  // Might as well try to fill the cache for the flattened version, too.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  AliasCacheEntry* face = probe_alias_cache(flat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
  if (face->_adr_type == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
    face->_adr_type = flat;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
    face->_index    = idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
    assert(alias_type(flat) == alias_type(idx), "flat type must work too");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  return alias_type(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
Compile::AliasType* Compile::alias_type(ciField* field) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
  const TypeOopPtr* t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
  if (field->is_static())
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1644
    t = TypeInstPtr::make(field->holder()->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
    t = TypeOopPtr::make_from_klass_raw(field->holder());
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1647
  AliasType* atp = alias_type(t->add_offset(field->offset_in_bytes()), field);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
  assert(field->is_final() == !atp->is_rewritable(), "must get the rewritable bits correct");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  return atp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
//------------------------------have_alias_type--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
bool Compile::have_alias_type(const TypePtr* adr_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
  AliasCacheEntry* ace = probe_alias_cache(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
  if (ace->_adr_type == adr_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  // Handle special cases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
  if (adr_type == NULL)             return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  if (adr_type == TypePtr::BOTTOM)  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8107
diff changeset
  1664
  return find_alias_type(adr_type, true, NULL) != NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
//-----------------------------must_alias--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
// True if all values of the given address type are in the given alias category.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
bool Compile::must_alias(const TypePtr* adr_type, int alias_idx) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
  if (alias_idx == AliasIdxBot)         return true;  // the universal category
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  if (adr_type == NULL)                 return true;  // NULL serves as TypePtr::TOP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
  if (alias_idx == AliasIdxTop)         return false; // the empty category
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  if (adr_type->base() == Type::AnyPtr) return false; // TypePtr::BOTTOM or its twins
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
  // the only remaining possible overlap is identity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
  int adr_idx = get_alias_index(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
  assert(adr_idx != AliasIdxBot && adr_idx != AliasIdxTop, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
  assert(adr_idx == alias_idx ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
         (alias_type(alias_idx)->adr_type() != TypeOopPtr::BOTTOM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
          && adr_type                       != TypeOopPtr::BOTTOM),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
         "should not be testing for overlap with an unsafe pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
  return adr_idx == alias_idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
//------------------------------can_alias--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
// True if any values of the given address type are in the given alias category.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
bool Compile::can_alias(const TypePtr* adr_type, int alias_idx) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
  if (alias_idx == AliasIdxTop)         return false; // the empty category
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
  if (adr_type == NULL)                 return false; // NULL serves as TypePtr::TOP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
  if (alias_idx == AliasIdxBot)         return true;  // the universal category
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
  if (adr_type->base() == Type::AnyPtr) return true;  // TypePtr::BOTTOM or its twins
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
  // the only remaining possible overlap is identity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
  int adr_idx = get_alias_index(adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
  assert(adr_idx != AliasIdxBot && adr_idx != AliasIdxTop, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
  return adr_idx == alias_idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
//---------------------------pop_warm_call-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
WarmCallInfo* Compile::pop_warm_call() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
  WarmCallInfo* wci = _warm_calls;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
  if (wci != NULL)  _warm_calls = wci->remove_from(wci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
  return wci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
//----------------------------Inline_Warm--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
int Compile::Inline_Warm() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
  // If there is room, try to inline some more warm call sites.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  // %%% Do a graph index compaction pass when we think we're out of space?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  if (!InlineWarmCalls)  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  int calls_made_hot = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  int room_to_grow   = NodeCountInliningCutoff - unique();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
  int amount_to_grow = MIN2(room_to_grow, (int)NodeCountInliningStep);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
  int amount_grown   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
  WarmCallInfo* call;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  while (amount_to_grow > 0 && (call = pop_warm_call()) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
    int est_size = (int)call->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
    if (est_size > (room_to_grow - amount_grown)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
      // This one won't fit anyway.  Get rid of it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
      call->make_cold();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
      continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
    call->make_hot();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
    calls_made_hot++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
    amount_grown   += est_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
    amount_to_grow -= est_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
  if (calls_made_hot > 0)  set_major_progress();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  return calls_made_hot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
//----------------------------Finish_Warm--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
void Compile::Finish_Warm() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  if (!InlineWarmCalls)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  if (warm_calls() == NULL)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  // Clean up loose ends, if we are out of space for inlining.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  WarmCallInfo* call;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  while ((call = pop_warm_call()) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
    call->make_cold();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
4643
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1750
//---------------------cleanup_loop_predicates-----------------------
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1751
// Remove the opaque nodes that protect the predicates so that all unused
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1752
// checks and uncommon_traps will be eliminated from the ideal graph
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1753
void Compile::cleanup_loop_predicates(PhaseIterGVN &igvn) {
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1754
  if (predicate_count()==0) return;
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1755
  for (int i = predicate_count(); i > 0; i--) {
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1756
    Node * n = predicate_opaque1_node(i-1);
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1757
    assert(n->Opcode() == Op_Opaque1, "must be");
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1758
    igvn.replace_node(n, n->in(1));
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1759
  }
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1760
  assert(predicate_count()==0, "should be clean!");
61c659c91c57 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 4470
diff changeset
  1761
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
//------------------------------Optimize---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
// Given a graph, optimize it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
void Compile::Optimize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  TracePhase t1("optimizer", &_t_optimizer, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  if (env()->break_at_compile()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
    BREAKPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
  int          loop_opts_cnt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 767
diff changeset
  1780
  print_method("After Parsing");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
 {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  // Iterative Global Value Numbering, including ideal transforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
  // Initialize IterGVN with types and values from parse-time GVN
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  PhaseIterGVN igvn(initial_gvn());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
    NOT_PRODUCT( TracePhase t2("iterGVN", &_t_iterGVN, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
    igvn.optimize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  print_method("Iter GVN 1", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
5914
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1795
  // Perform escape analysis
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1796
  if (_do_escape_analysis && ConnectionGraph::has_candidates(this)) {
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1797
    if (has_loops()) {
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1798
      // Cleanup graph (remove dead nodes).
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1799
      TracePhase t2("idealLoop", &_t_idealLoop, true);
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1800
      PhaseIdealLoop ideal_loop( igvn, false, true );
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1801
      if (major_progress()) print_method("PhaseIdealLoop before EA", 2);
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1802
      if (failing())  return;
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1803
    }
5914
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1804
    ConnectionGraph::do_analysis(this, &igvn);
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1805
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1806
    if (failing())  return;
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1807
11191
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1808
    // Optimize out fields loads from scalar replaceable allocations.
5914
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1809
    igvn.optimize();
10988
a3b2bd43ef4f 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 10508
diff changeset
  1810
    print_method("Iter GVN after EA", 2);
5914
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1811
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1812
    if (failing())  return;
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1813
11191
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1814
    if (congraph() != NULL && macro_count() > 0) {
12158
f24f2560da32 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 11435
diff changeset
  1815
      NOT_PRODUCT( TracePhase t2("macroEliminate", &_t_macroEliminate, TimeCompiler); )
11191
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1816
      PhaseMacroExpand mexp(igvn);
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1817
      mexp.eliminate_macro_nodes();
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1818
      igvn.set_delay_transform(false);
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1819
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1820
      igvn.optimize();
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1821
      print_method("Iter GVN after eliminating allocations and locks", 2);
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1822
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1823
      if (failing())  return;
d54ab5dcba83 6890673: Eliminate allocations immediately after EA
kvn
parents: 11190
diff changeset
  1824
    }
5914
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1825
  }
8363e7e6915a 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 5889
diff changeset
  1826
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  // Loop transforms on the ideal graph.  Range Check Elimination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  // peeling, unrolling, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  // Set loop opts counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  loop_opts_cnt = num_loop_opts();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
      TracePhase t2("idealLoop", &_t_idealLoop, true);
9101
ff58f9a8e31c 7004535: Clone loop predicate during loop unswitch
kvn
parents: 8868
diff changeset
  1835
      PhaseIdealLoop ideal_loop( igvn, true );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
      loop_opts_cnt--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
      if (major_progress()) print_method("PhaseIdealLoop 1", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
      if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
    // Loop opts pass if partial peeling occurred in previous pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
    if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
      TracePhase t3("idealLoop", &_t_idealLoop, true);
9101
ff58f9a8e31c 7004535: Clone loop predicate during loop unswitch
kvn
parents: 8868
diff changeset
  1843
      PhaseIdealLoop ideal_loop( igvn, false );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
      loop_opts_cnt--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
      if (major_progress()) print_method("PhaseIdealLoop 2", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
      if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
    // Loop opts pass for loop-unrolling before CCP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
    if(major_progress() && (loop_opts_cnt > 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
      TracePhase t4("idealLoop", &_t_idealLoop, true);
9101
ff58f9a8e31c 7004535: Clone loop predicate during loop unswitch
kvn
parents: 8868
diff changeset
  1851
      PhaseIdealLoop ideal_loop( igvn, false );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
      loop_opts_cnt--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
      if (major_progress()) print_method("PhaseIdealLoop 3", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
    }
3676
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1855
    if (!failing()) {
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1856
      // Verify that last round of loop opts produced a valid graph
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1857
      NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1858
      PhaseIdealLoop::verify(igvn);
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1859
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
  // Conditional Constant Propagation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
  PhaseCCP ccp( &igvn );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  assert( true, "Break here to ccp.dump_nodes_and_types(_root,999,1)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
    TracePhase t2("ccp", &_t_ccp, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
    ccp.do_transform();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  print_method("PhaseCPP 1", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
  assert( true, "Break here to ccp.dump_old2new_map()");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  // Iterative Global Value Numbering, including ideal transforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
    NOT_PRODUCT( TracePhase t2("iterGVN2", &_t_iterGVN2, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
    igvn = ccp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
    igvn.optimize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
  print_method("Iter GVN 2", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
  // Loop transforms on the ideal graph.  Range Check Elimination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  // peeling, unrolling, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  if(loop_opts_cnt > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
    debug_only( int cnt = 0; );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
    while(major_progress() && (loop_opts_cnt > 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
      TracePhase t2("idealLoop", &_t_idealLoop, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
      assert( cnt++ < 40, "infinite cycle in loop optimization" );
9101
ff58f9a8e31c 7004535: Clone loop predicate during loop unswitch
kvn
parents: 8868
diff changeset
  1892
      PhaseIdealLoop ideal_loop( igvn, true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
      loop_opts_cnt--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
      if (major_progress()) print_method("PhaseIdealLoop iterations", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
      if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  }
3676
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1898
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1899
  {
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1900
    // Verify that all previous optimizations produced a valid graph
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1901
    // at least to this point, even if no loop optimizations were done.
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1902
    NOT_PRODUCT( TracePhase t2("idealLoopVerify", &_t_idealLoopVerify, TimeCompiler); )
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1903
    PhaseIdealLoop::verify(igvn);
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1904
  }
3bac3e882cd3 6862956: PhaseIdealLoop should have a CFG verification mode
never
parents: 3276
diff changeset
  1905
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
    NOT_PRODUCT( TracePhase t2("macroExpand", &_t_macroExpand, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
    PhaseMacroExpand  mex(igvn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
    if (mex.expand_macro_nodes()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
      assert(failing(), "must bail out w/ explicit message");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
 } // (End scope of igvn; run destructor if necessary for asserts.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  // A method with only infinite loops has no edges entering loops from root
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
    NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
    if (final_graph_reshaping()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
      assert(failing(), "must bail out w/ explicit message");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
  print_method("Optimize finished", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
//------------------------------Code_Gen---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
// Given a graph, generate code for it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
void Compile::Code_Gen() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
  // Perform instruction selection.  You might think we could reclaim Matcher
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
  // memory PDQ, but actually the Matcher is used in generating spill code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  // Internals of the Matcher (including some VectorSets) must remain live
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
  // for awhile - thus I cannot reclaim Matcher memory lest a VectorSet usage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
  // set a bit in reclaimed memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
  // In debug mode can dump m._nodes.dump() for mapping of ideal to machine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
  // nodes.  Mapping is only valid at the root of each matched subtree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
  Node_List proj_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
  Matcher m(proj_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  _matcher = &m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
    TracePhase t2("matcher", &_t_matcher, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
    m.match();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
  // In debug mode can dump m._nodes.dump() for mapping of ideal to machine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
  // nodes.  Mapping is only valid at the root of each matched subtree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
  // If you have too many nodes, or if matching has failed, bail out
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
  check_node_count(0, "out of nodes matching instructions");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
  if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
  // Build a proper-looking CFG
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
  PhaseCFG cfg(node_arena(), root(), m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
  _cfg = &cfg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
    NOT_PRODUCT( TracePhase t2("scheduler", &_t_scheduler, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
    cfg.Dominators();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
    if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
    NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
    cfg.Estimate_Block_Frequency();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
    cfg.GlobalCodeMotion(m,unique(),proj_list);
12161
081f2b3f1823 7152955: print_method crashes with null root
never
parents: 12158
diff changeset
  1972
    if (failing())  return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
    print_method("Global code motion", 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
    NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
    debug_only( cfg.verify(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
  NOT_PRODUCT( verify_graph_edges(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
  PhaseChaitin regalloc(unique(),cfg,m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  _regalloc = &regalloc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
    TracePhase t2("regalloc", &_t_registerAllocation, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
    // Perform any platform dependent preallocation actions.  This is used,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
    // for example, to avoid taking an implicit null pointer exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
    // using the frame pointer on win95.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
    _regalloc->pd_preallocate_hook();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
    // Perform register allocation.  After Chaitin, use-def chains are
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
    // no longer accurate (at spill code) and so must be ignored.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
    // Node->LRG->reg mappings are still accurate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
    _regalloc->Register_Allocate();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
    // Bail out if the allocator builds too many nodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
    if (failing())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  // Prior to register allocation we kept empty basic blocks in case the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  // the allocator needed a place to spill.  After register allocation we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  // are not adding any new instructions.  If any basic block is empty, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  // can now safely remove it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
  {
1498
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2005
    NOT_PRODUCT( TracePhase t2("blockOrdering", &_t_blockOrdering, TimeCompiler); )
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2006
    cfg.remove_empty();
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2007
    if (do_freq_based_layout()) {
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2008
      PhaseBlockLayout layout(cfg);
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2009
    } else {
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2010
      cfg.set_loop_alignment();
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2011
    }
346bf226078e 6743900: frequency based block layout
rasbold
parents: 1497
diff changeset
  2012
    cfg.fixup_flow();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
  // Perform any platform dependent postallocation verifications.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  debug_only( _regalloc->pd_postallocate_verify_hook(); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
  // Apply peephole optimizations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
  if( OptoPeephole ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
    NOT_PRODUCT( TracePhase t2("peephole", &_t_peephole, TimeCompiler); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
    PhasePeephole peep( _regalloc, cfg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
    peep.do_transform();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
  // Convert Nodes to instruction bits in a buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
    // %%%% workspace merge brought two timers together for one job
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
    TracePhase t2a("output", &_t_output, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
    NOT_PRODUCT( TraceTime t2b(NULL, &_t_codeGeneration, TimeCompiler, false); )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
    Output();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 767
diff changeset
  2033
  print_method("Final Code");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  // He's dead, Jim.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  _cfg     = (PhaseCFG*)0xdeadbeef;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
  _regalloc = (PhaseChaitin*)0xdeadbeef;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
//------------------------------dump_asm---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
// Dump formatted assembly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
void Compile::dump_asm(int *pcs, uint pc_limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
  bool cut_short = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
  tty->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
  tty->print("#  ");  _tf->dump();  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  tty->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
  // For all blocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  int pc = 0x0;                 // Program counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
  char starts_bundle = ' ';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  _regalloc->dump_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  Node *n = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  for( uint i=0; i<_cfg->_num_blocks; i++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
    if (VMThread::should_terminate()) { cut_short = true; break; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
    Block *b = _cfg->_blocks[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
    if (b->is_connector() && !Verbose) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
    n = b->_nodes[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
    if (pcs && n->_idx < pc_limit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
      tty->print("%3.3x   ", pcs[n->_idx]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
    else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
      tty->print("      ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
    b->dump_head( &_cfg->_bbs );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
    if (b->is_connector()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
      tty->print_cr("        # Empty connector block");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
    } else if (b->num_preds() == 2 && b->pred(1)->is_CatchProj() && b->pred(1)->as_CatchProj()->_con == CatchProjNode::fall_through_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
      tty->print_cr("        # Block is sole successor of call");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
    // For all instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
    Node *delay = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
    for( uint j = 0; j<b->_nodes.size(); j++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
      if (VMThread::should_terminate()) { cut_short = true; break; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
      n = b->_nodes[j];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
      if (valid_bundle_info(n)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
        Bundle *bundle = node_bundling(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
        if (bundle->used_in_unconditional_delay()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
          delay = n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
        if (bundle->starts_bundle())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
          starts_bundle = '+';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2087
      if (WizardMode) n->dump();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2088
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
      if( !n->is_Region() &&    // Dont print in the Assembly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
          !n->is_Phi() &&       // a few noisely useless nodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
          !n->is_Proj() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
          !n->is_MachTemp() &&
4470
1e6edcab3109 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 4450
diff changeset
  2093
          !n->is_SafePointScalarObject() &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
          !n->is_Catch() &&     // Would be nice to print exception table targets
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
          !n->is_MergeMem() &&  // Not very interesting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
          !n->is_top() &&       // Debug info table constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
          !(n->is_Con() && !n->is_Mach())// Debug info table constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
          ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
        if (pcs && n->_idx < pc_limit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
          tty->print("%3.3x", pcs[n->_idx]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
        else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
          tty->print("   ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
        tty->print(" %c ", starts_bundle);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
        starts_bundle = ' ';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
        tty->print("\t");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
        n->format(_regalloc, tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
        tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
      // If we have an instruction with a delay slot, and have seen a delay,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
      // then back up and print it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
      if (valid_bundle_info(n) && node_bundling(n)->use_unconditional_delay()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
        assert(delay != NULL, "no unconditional delay instruction");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2114
        if (WizardMode) delay->dump();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2115
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
        if (node_bundling(delay)->starts_bundle())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
          starts_bundle = '+';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
        if (pcs && n->_idx < pc_limit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
          tty->print("%3.3x", pcs[n->_idx]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
        else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
          tty->print("   ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
        tty->print(" %c ", starts_bundle);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
        starts_bundle = ' ';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
        tty->print("\t");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
        delay->format(_regalloc, tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
        tty->print_cr("");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
        delay = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
      // Dump the exception table as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      if( n->is_Catch() && (Verbose || WizardMode) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
        // Print the exception table for this offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
        _handler_table.print_subtable_for(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
    if (pcs && n->_idx < pc_limit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
      tty->print_cr("%3.3x", pcs[n->_idx]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
    else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
      tty->print_cr("");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
    assert(cut_short || delay == NULL, "no unconditional delay branch");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
  } // End of per-block dump
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
  tty->print_cr("");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  if (cut_short)  tty->print_cr("*** disassembly is cut short ***");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
//------------------------------Final_Reshape_Counts---------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
// This class defines counters to help identify when a method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
// may/must be executed using hardware with only 24-bit precision.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
struct Final_Reshape_Counts : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
  int  _call_count;             // count non-inlined 'common' calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
  int  _float_count;            // count float ops requiring 24-bit precision
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
  int  _double_count;           // count double ops requiring more precision
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
  int  _java_call_count;        // count non-inlined 'java' calls
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2159
  int  _inner_loop_count;       // count loops which need alignment
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
  VectorSet _visited;           // Visitation flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
  Node_List _tests;             // Set of IfNodes & PCTableNodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  Final_Reshape_Counts() :
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2164
    _call_count(0), _float_count(0), _double_count(0),
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2165
    _java_call_count(0), _inner_loop_count(0),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
    _visited( Thread::current()->resource_area() ) { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
  void inc_call_count  () { _call_count  ++; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
  void inc_float_count () { _float_count ++; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
  void inc_double_count() { _double_count++; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
  void inc_java_call_count() { _java_call_count++; }
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2172
  void inc_inner_loop_count() { _inner_loop_count++; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
  int  get_call_count  () const { return _call_count  ; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  int  get_float_count () const { return _float_count ; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
  int  get_double_count() const { return _double_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
  int  get_java_call_count() const { return _java_call_count; }
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2178
  int  get_inner_loop_count() const { return _inner_loop_count; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
static bool oop_offset_is_sane(const TypeInstPtr* tp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
  ciInstanceKlass *k = tp->klass()->as_instance_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
  // Make sure the offset goes inside the instance layout.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2184
  return k->contains_field_offset(tp->offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
  // Note that OffsetBot and OffsetTop are very negative.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
9175
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2188
// Eliminate trivially redundant StoreCMs and accumulate their
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2189
// precedence edges.
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2190
void Compile::eliminate_redundant_card_marks(Node* n) {
9175
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2191
  assert(n->Opcode() == Op_StoreCM, "expected StoreCM");
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2192
  if (n->in(MemNode::Address)->outcnt() > 1) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2193
    // There are multiple users of the same address so it might be
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2194
    // possible to eliminate some of the StoreCMs
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2195
    Node* mem = n->in(MemNode::Memory);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2196
    Node* adr = n->in(MemNode::Address);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2197
    Node* val = n->in(MemNode::ValueIn);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2198
    Node* prev = n;
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2199
    bool done = false;
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2200
    // Walk the chain of StoreCMs eliminating ones that match.  As
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2201
    // long as it's a chain of single users then the optimization is
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2202
    // safe.  Eliminating partially redundant StoreCMs would require
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2203
    // cloning copies down the other paths.
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2204
    while (mem->Opcode() == Op_StoreCM && mem->outcnt() == 1 && !done) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2205
      if (adr == mem->in(MemNode::Address) &&
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2206
          val == mem->in(MemNode::ValueIn)) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2207
        // redundant StoreCM
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2208
        if (mem->req() > MemNode::OopStore) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2209
          // Hasn't been processed by this code yet.
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2210
          n->add_prec(mem->in(MemNode::OopStore));
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2211
        } else {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2212
          // Already converted to precedence edge
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2213
          for (uint i = mem->req(); i < mem->len(); i++) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2214
            // Accumulate any precedence edges
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2215
            if (mem->in(i) != NULL) {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2216
              n->add_prec(mem->in(i));
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2217
            }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2218
          }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2219
          // Everything above this point has been processed.
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2220
          done = true;
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2221
        }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2222
        // Eliminate the previous StoreCM
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2223
        prev->set_req(MemNode::Memory, mem->in(MemNode::Memory));
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2224
        assert(mem->outcnt() == 0, "should be dead");
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2225
        mem->disconnect_inputs(NULL, this);
9175
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2226
      } else {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2227
        prev = mem;
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2228
      }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2229
      mem = prev->in(MemNode::Memory);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2230
    }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2231
  }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2232
}
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2233
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
//------------------------------final_graph_reshaping_impl----------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
// Implement items 1-5 from final_graph_reshaping below.
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2236
void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
594
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 590
diff changeset
  2238
  if ( n->outcnt() == 0 ) return; // dead node
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
  uint nop = n->Opcode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
  // Check for 2-input instruction with "last use" on right input.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
  // Swap to left input.  Implements item (2).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
  if( n->req() == 3 &&          // two-input instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
      n->in(1)->outcnt() > 1 && // left use is NOT a last use
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
      (!n->in(1)->is_Phi() || n->in(1)->in(2) != n) && // it is not data loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
      n->in(2)->outcnt() == 1 &&// right use IS a last use
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
      !n->in(2)->is_Con() ) {   // right use is not a constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
    // Check for commutative opcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
    switch( nop ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
    case Op_AddI:  case Op_AddF:  case Op_AddD:  case Op_AddL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
    case Op_MaxI:  case Op_MinI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
    case Op_MulI:  case Op_MulF:  case Op_MulD:  case Op_MulL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
    case Op_AndL:  case Op_XorL:  case Op_OrL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
    case Op_AndI:  case Op_XorI:  case Op_OrI: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
      // Move "last use" input to left by swapping inputs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
      n->swap_edges(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
5889
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2264
#ifdef ASSERT
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2265
  if( n->is_Mem() ) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2266
    int alias_idx = get_alias_index(n->as_Mem()->adr_type());
5889
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2267
    assert( n->in(0) != NULL || alias_idx != Compile::AliasIdxRaw ||
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2268
            // oop will be recorded in oop map if load crosses safepoint
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2269
            n->is_Load() && (n->as_Load()->bottom_type()->isa_oopptr() ||
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2270
                             LoadNode::is_immutable_value(n->in(MemNode::Address))),
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2271
            "raw memory operations should have control edge");
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2272
  }
13152be884e5 6959430: Make sure raw loads have control edge
kvn
parents: 5702
diff changeset
  2273
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
  // Count FPU ops and common calls, implements item (3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  switch( nop ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  // Count all float operations that may use FPU
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
  case Op_AddF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
  case Op_SubF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  case Op_MulF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  case Op_DivF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  case Op_NegF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  case Op_ModF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  case Op_ConvI2F:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  case Op_ConF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
  case Op_CmpF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
  case Op_CmpF3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
  // case Op_ConvL2F: // longs are split into 32-bit halves
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2288
    frc.inc_float_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  case Op_ConvF2D:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
  case Op_ConvD2F:
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2293
    frc.inc_float_count();
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2294
    frc.inc_double_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  // Count all double operations that may use FPU
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
  case Op_AddD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
  case Op_SubD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  case Op_MulD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  case Op_DivD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  case Op_NegD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  case Op_ModD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  case Op_ConvI2D:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
  case Op_ConvD2I:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
  // case Op_ConvL2D: // handled by leaf call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  // case Op_ConvD2L: // handled by leaf call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
  case Op_ConD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
  case Op_CmpD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
  case Op_CmpD3:
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2311
    frc.inc_double_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
  case Op_Opaque1:              // Remove Opaque Nodes before matching
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
  case Op_Opaque2:              // Remove Opaque Nodes before matching
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2315
    n->subsume_by(n->in(1), this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
  case Op_CallStaticJava:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  case Op_CallJava:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
  case Op_CallDynamicJava:
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2320
    frc.inc_java_call_count(); // Count java call site;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  case Op_CallRuntime:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
  case Op_CallLeaf:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  case Op_CallLeafNoFP: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
    assert( n->is_Call(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
    CallNode *call = n->as_Call();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
    // Count call sites where the FP mode bit would have to be flipped.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
    // Do not count uncommon runtime calls:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
    // uncommon_trap, _complete_monitor_locking, _complete_monitor_unlocking,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
    // _new_Java, _new_typeArray, _new_objArray, _rethrow_Java, ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
    if( !call->is_CallStaticJava() || !call->as_CallStaticJava()->_name ) {
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2331
      frc.inc_call_count();   // Count the call site
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
    } else {                  // See if uncommon argument is shared
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
      Node *n = call->in(TypeFunc::Parms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
      int nop = n->Opcode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
      // Clone shared simple arguments to uncommon calls, item (1).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
      if( n->outcnt() > 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
          !n->is_Proj() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
          nop != Op_CreateEx &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
          nop != Op_CheckCastPP &&
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2340
          nop != Op_DecodeN &&
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2341
          nop != Op_DecodeNKlass &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
          !n->is_Mem() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
        Node *x = n->clone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
        call->set_req( TypeFunc::Parms, x );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
  case Op_StoreD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
  case Op_LoadD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
  case Op_LoadD_unaligned:
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2353
    frc.inc_double_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
    goto handle_mem;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
  case Op_StoreF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
  case Op_LoadF:
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2357
    frc.inc_float_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    goto handle_mem;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
9175
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2360
  case Op_StoreCM:
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2361
    {
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2362
      // Convert OopStore dependence into precedence edge
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2363
      Node* prec = n->in(MemNode::OopStore);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2364
      n->del_req(MemNode::OopStore);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2365
      n->add_prec(prec);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2366
      eliminate_redundant_card_marks(n);
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2367
    }
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2368
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2369
    // fall through
80221fe09772 7032963: StoreCM shouldn't participate in store elimination
never
parents: 8725
diff changeset
  2370
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
  case Op_StoreB:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
  case Op_StoreC:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
  case Op_StorePConditional:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
  case Op_StoreI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
  case Op_StoreL:
1500
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1498
diff changeset
  2376
  case Op_StoreIConditional:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
  case Op_StoreLConditional:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
  case Op_CompareAndSwapI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
  case Op_CompareAndSwapL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
  case Op_CompareAndSwapP:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2381
  case Op_CompareAndSwapN:
13886
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2382
  case Op_GetAndAddI:
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2383
  case Op_GetAndAddL:
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2384
  case Op_GetAndSetI:
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2385
  case Op_GetAndSetL:
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2386
  case Op_GetAndSetP:
8d82c4dfa722 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 13883
diff changeset
  2387
  case Op_GetAndSetN:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
  case Op_StoreP:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2389
  case Op_StoreN:
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2390
  case Op_StoreNKlass:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
  case Op_LoadB:
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2131
diff changeset
  2392
  case Op_LoadUB:
2022
28ce8115a91d 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 1679
diff changeset
  2393
  case Op_LoadUS:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
  case Op_LoadI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
  case Op_LoadKlass:
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2396
  case Op_LoadNKlass:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
  case Op_LoadL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
  case Op_LoadL_unaligned:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
  case Op_LoadPLocked:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
  case Op_LoadP:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 347
diff changeset
  2401
  case Op_LoadN:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
  case Op_LoadRange:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
  case Op_LoadS: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
  handle_mem:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
    if( VerifyOptoOopOffsets ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
      assert( n->is_Mem(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
      MemNode *mem  = (MemNode*)n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
      // Check to see if address types have grounded out somehow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
      const TypeInstPtr *tp = mem->in(MemNode::Address)->bottom_type()->isa_instptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
      assert( !tp || oop_offset_is_sane(tp), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
  case Op_AddP: {               // Assert sane base pointers
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2418
    Node *addp = n->in(AddPNode::Address);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
    assert( !addp->is_AddP() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
            addp->in(AddPNode::Base)->is_top() || // Top OK for allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
            addp->in(AddPNode::Base) == n->in(AddPNode::Base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
            "Base pointers must match" );
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2423
#ifdef _LP64
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2424
    if ((UseCompressedOops || UseCompressedKlassPointers) &&
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2425
        addp->Opcode() == Op_ConP &&
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2426
        addp == n->in(AddPNode::Base) &&
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2427
        n->in(AddPNode::Offset)->is_Con()) {
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2428
      // Use addressing with narrow klass to load with offset on x86.
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2429
      // On sparc loading 32-bits constant and decoding it have less
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2430
      // instructions (4) then load 64-bits constant (7).
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2431
      // Do this transformation here since IGVN will convert ConN back to ConP.
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2432
      const Type* t = addp->bottom_type();
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2433
      if (t->isa_oopptr() || t->isa_klassptr()) {
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2434
        Node* nn = NULL;
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2435
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2436
        int op = t->isa_oopptr() ? Op_ConN : Op_ConNKlass;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2437
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2438
        // Look for existing ConN node of the same exact type.
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2439
        Node* r  = root();
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2440
        uint cnt = r->outcnt();
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2441
        for (uint i = 0; i < cnt; i++) {
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2442
          Node* m = r->raw_out(i);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2443
          if (m!= NULL && m->Opcode() == op &&
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 608
diff changeset
  2444
              m->bottom_type()->make_ptr() == t) {
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2445
            nn = m;
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2446
            break;
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2447
          }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2448
        }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2449
        if (nn != NULL) {
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2450
          // Decode a narrow oop to match address
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2451
          // [R12 + narrow_oop_reg<<3 + offset]
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2452
          if (t->isa_oopptr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2453
            nn = new (this) DecodeNNode(nn, t);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2454
          } else {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2455
            nn = new (this) DecodeNKlassNode(nn, t);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2456
          }
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2457
          n->set_req(AddPNode::Base, nn);
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2458
          n->set_req(AddPNode::Address, nn);
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2459
          if (addp->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2460
            addp->disconnect_inputs(NULL, this);
608
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2461
          }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2462
        }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2463
      }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2464
    }
fe8c5fbbc54e 6709093: Compressed Oops: reduce size of compiled methods
kvn
parents: 594
diff changeset
  2465
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2469
#ifdef _LP64
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2470
  case Op_CastPP:
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2471
    if (n->in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks()) {
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2472
      Node* in1 = n->in(1);
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2473
      const Type* t = n->bottom_type();
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2474
      Node* new_in1 = in1->clone();
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2475
      new_in1->as_DecodeN()->set_type(t);
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2476
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2477
      if (!Matcher::narrow_oop_use_complex_address()) {
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2478
        //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2479
        // x86, ARM and friends can handle 2 adds in addressing mode
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2480
        // and Matcher can fold a DecodeN node into address by using
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2481
        // a narrow oop directly and do implicit NULL check in address:
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2482
        //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2483
        // [R12 + narrow_oop_reg<<3 + offset]
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2484
        // NullCheck narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2485
        //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2486
        // On other platforms (Sparc) we have to keep new DecodeN node and
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2487
        // use it to do implicit NULL check in address:
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2488
        //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2489
        // decode_not_null narrow_oop_reg, base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2490
        // [base_reg + offset]
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2491
        // NullCheck base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2492
        //
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 2022
diff changeset
  2493
        // Pin the new DecodeN node to non-null path on these platform (Sparc)
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2494
        // to keep the information to which NULL check the new DecodeN node
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2495
        // corresponds to use it as value in implicit_null_check().
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2496
        //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2497
        new_in1->set_req(0, n->in(0));
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2498
      }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2499
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2500
      n->subsume_by(new_in1, this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2501
      if (in1->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2502
        in1->disconnect_inputs(NULL, this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2503
      }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2504
    }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2505
    break;
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2506
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2507
  case Op_CmpP:
594
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 590
diff changeset
  2508
    // Do this transformation here to preserve CmpPNode::sub() and
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 590
diff changeset
  2509
    // other TypePtr related Ideal optimizations (for example, ptr nullness).
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2510
    if (n->in(1)->is_DecodeNarrowPtr() || n->in(2)->is_DecodeNarrowPtr()) {
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2511
      Node* in1 = n->in(1);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2512
      Node* in2 = n->in(2);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2513
      if (!in1->is_DecodeNarrowPtr()) {
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2514
        in2 = in1;
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2515
        in1 = n->in(2);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2516
      }
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2517
      assert(in1->is_DecodeNarrowPtr(), "sanity");
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2518
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2519
      Node* new_in2 = NULL;
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2520
      if (in2->is_DecodeNarrowPtr()) {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2521
        assert(in2->Opcode() == in1->Opcode(), "must be same node type");
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2522
        new_in2 = in2->in(1);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2523
      } else if (in2->Opcode() == Op_ConP) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2524
        const Type* t = in2->bottom_type();
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2525
        if (t == TypePtr::NULL_PTR) {
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2526
          assert(in1->is_DecodeN(), "compare klass to null?");
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2527
          // Don't convert CmpP null check into CmpN if compressed
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2528
          // oops implicit null check is not generated.
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2529
          // This will allow to generate normal oop implicit null check.
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2530
          if (Matcher::gen_narrow_oop_implicit_null_checks())
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2531
            new_in2 = ConNode::make(this, TypeNarrowOop::NULL_PTR);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2532
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2533
          // This transformation together with CastPP transformation above
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2534
          // will generated code for implicit NULL checks for compressed oops.
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2535
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2536
          // The original code after Optimize()
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2537
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2538
          //    LoadN memory, narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2539
          //    decode narrow_oop_reg, base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2540
          //    CmpP base_reg, NULL
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2541
          //    CastPP base_reg // NotNull
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2542
          //    Load [base_reg + offset], val_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2543
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2544
          // after these transformations will be
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2545
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2546
          //    LoadN memory, narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2547
          //    CmpN narrow_oop_reg, NULL
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2548
          //    decode_not_null narrow_oop_reg, base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2549
          //    Load [base_reg + offset], val_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2550
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2551
          // and the uncommon path (== NULL) will use narrow_oop_reg directly
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2552
          // since narrow oops can be used in debug info now (see the code in
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2553
          // final_graph_reshaping_walk()).
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2554
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2555
          // At the end the code will be matched to
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2556
          // on x86:
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2557
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2558
          //    Load_narrow_oop memory, narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2559
          //    Load [R12 + narrow_oop_reg<<3 + offset], val_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2560
          //    NullCheck narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2561
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2562
          // and on sparc:
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2563
          //
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2564
          //    Load_narrow_oop memory, narrow_oop_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2565
          //    decode_not_null narrow_oop_reg, base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2566
          //    Load [base_reg + offset], val_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2567
          //    NullCheck base_reg
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2568
          //
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2569
        } else if (t->isa_oopptr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2570
          new_in2 = ConNode::make(this, t->make_narrowoop());
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2571
        } else if (t->isa_klassptr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2572
          new_in2 = ConNode::make(this, t->make_narrowklass());
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2573
        }
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2574
      }
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2575
      if (new_in2 != NULL) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2576
        Node* cmpN = new (this) CmpNNode(in1->in(1), new_in2);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2577
        n->subsume_by(cmpN, this);
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2578
        if (in1->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2579
          in1->disconnect_inputs(NULL, this);
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2580
        }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2581
        if (in2->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2582
          in2->disconnect_inputs(NULL, this);
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2583
        }
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2584
      }
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2585
    }
1055
f4fb9fb08038 6731641: assert(m->adr_type() == mach->adr_type(),"matcher should not change adr type")
kvn
parents: 961
diff changeset
  2586
    break;
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2587
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2588
  case Op_DecodeN:
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2589
  case Op_DecodeNKlass:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2590
    assert(!n->in(1)->is_EncodeNarrowPtr(), "should be optimized out");
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2591
    // DecodeN could be pinned when it can't be fold into
1679
07b65f7cd0aa 6787050: assert(n->in(0) == 0L,"no control") with UseCompressedOops on sparcv9
kvn
parents: 1677
diff changeset
  2592
    // an address expression, see the code for Op_CastPP above.
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2593
    assert(n->in(0) == NULL || (UseCompressedOops && !Matcher::narrow_oop_use_complex_address()), "no control");
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2594
    break;
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2595
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2596
  case Op_EncodeP:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2597
  case Op_EncodePKlass: {
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2598
    Node* in1 = n->in(1);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2599
    if (in1->is_DecodeNarrowPtr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2600
      n->subsume_by(in1->in(1), this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2601
    } else if (in1->Opcode() == Op_ConP) {
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2602
      const Type* t = in1->bottom_type();
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2603
      if (t == TypePtr::NULL_PTR) {
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2604
        assert(t->isa_oopptr(), "null klass?");
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2605
        n->subsume_by(ConNode::make(this, TypeNarrowOop::NULL_PTR), this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2606
      } else if (t->isa_oopptr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2607
        n->subsume_by(ConNode::make(this, t->make_narrowoop()), this);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2608
      } else if (t->isa_klassptr()) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2609
        n->subsume_by(ConNode::make(this, t->make_narrowklass()), this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2610
      }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2611
    }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2612
    if (in1->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2613
      in1->disconnect_inputs(NULL, this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2614
    }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2615
    break;
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2616
  }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2617
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2618
  case Op_Proj: {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2619
    if (OptimizeStringConcat) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2620
      ProjNode* p = n->as_Proj();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2621
      if (p->_is_io_use) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2622
        // Separate projections were used for the exception path which
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2623
        // are normally removed by a late inline.  If it wasn't inlined
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2624
        // then they will hang around and should just be replaced with
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2625
        // the original one.
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2626
        Node* proj = NULL;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2627
        // Replace with just one
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2628
        for (SimpleDUIterator i(p->in(0)); i.has_next(); i.next()) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2629
          Node *use = i.get();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2630
          if (use->is_Proj() && p != use && use->as_Proj()->_con == p->_con) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2631
            proj = use;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2632
            break;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2633
          }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2634
        }
11435
3fde349bcbcf 7123954: Some CTW test crash with SIGSEGV
kvn
parents: 11430
diff changeset
  2635
        assert(proj != NULL, "must be found");
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2636
        p->subsume_by(proj, this);
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2637
      }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2638
    }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2639
    break;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2640
  }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3684
diff changeset
  2641
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2642
  case Op_Phi:
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2643
    if (n->as_Phi()->bottom_type()->isa_narrowoop() || n->as_Phi()->bottom_type()->isa_narrowklass()) {
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2644
      // The EncodeP optimization may create Phi with the same edges
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2645
      // for all paths. It is not handled well by Register Allocator.
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2646
      Node* unique_in = n->in(1);
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2647
      assert(unique_in != NULL, "");
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2648
      uint cnt = n->req();
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2649
      for (uint i = 2; i < cnt; i++) {
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2650
        Node* m = n->in(i);
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2651
        assert(m != NULL, "");
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2652
        if (unique_in != m)
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2653
          unique_in = NULL;
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2654
      }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2655
      if (unique_in != NULL) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2656
        n->subsume_by(unique_in, this);
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2657
      }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2658
    }
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2659
    break;
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 1399
diff changeset
  2660
590
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2661
#endif
2954744d7bba 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 589
diff changeset
  2662
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
  case Op_ModI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    if (UseDivMod) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
      // Check if a%b and a/b both exist
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
      Node* d = n->find_similar(Op_DivI);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
      if (d) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
        // Replace them with a fused divmod if supported
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
        if (Matcher::has_match_rule(Op_DivModI)) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2670
          DivModINode* divmod = DivModINode::make(this, n);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2671
          d->subsume_by(divmod->div_proj(), this);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2672
          n->subsume_by(divmod->mod_proj(), this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
          // replace a%b with a-((a/b)*b)
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2675
          Node* mult = new (this) MulINode(d, d->in(2));
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2676
          Node* sub  = new (this) SubINode(d->in(1), mult);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2677
          n->subsume_by(sub, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
  case Op_ModL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
    if (UseDivMod) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
      // Check if a%b and a/b both exist
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
      Node* d = n->find_similar(Op_DivL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
      if (d) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
        // Replace them with a fused divmod if supported
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
        if (Matcher::has_match_rule(Op_DivModL)) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2690
          DivModLNode* divmod = DivModLNode::make(this, n);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2691
          d->subsume_by(divmod->div_proj(), this);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2692
          n->subsume_by(divmod->mod_proj(), this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
          // replace a%b with a-((a/b)*b)
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2695
          Node* mult = new (this) MulLNode(d, d->in(2));
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2696
          Node* sub  = new (this) SubLNode(d->in(1), mult);
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2697
          n->subsume_by(sub, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 12957
diff changeset
  2703
  case Op_LoadVector:
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 12957
diff changeset
  2704
  case Op_StoreVector:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
  case Op_PackB:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
  case Op_PackS:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
  case Op_PackI:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
  case Op_PackF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
  case Op_PackL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
  case Op_PackD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
    if (n->req()-1 > 2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
      // Replace many operand PackNodes with a binary tree for matching
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
      PackNode* p = (PackNode*) n;
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2716
      Node* btp = p->binary_tree_pack(this, 1, n->req());
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2717
      n->subsume_by(btp, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
    break;
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2720
  case Op_Loop:
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2721
  case Op_CountedLoop:
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2722
    if (n->as_Loop()->is_inner_loop()) {
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2723
      frc.inc_inner_loop_count();
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2724
    }
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2725
    break;
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2726
  case Op_LShiftI:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2727
  case Op_RShiftI:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2728
  case Op_URShiftI:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2729
  case Op_LShiftL:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2730
  case Op_RShiftL:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2731
  case Op_URShiftL:
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2732
    if (Matcher::need_masked_shift_count) {
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2733
      // The cpu's shift instructions don't restrict the count to the
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2734
      // lower 5/6 bits. We need to do the masking ourselves.
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2735
      Node* in2 = n->in(2);
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2736
      juint mask = (n->bottom_type() == TypeInt::INT) ? (BitsPerInt - 1) : (BitsPerLong - 1);
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2737
      const TypeInt* t = in2->find_int_type();
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2738
      if (t != NULL && t->is_con()) {
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2739
        juint shift = t->get_con();
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2740
        if (shift > mask) { // Unsigned cmp
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2741
          n->set_req(2, ConNode::make(this, TypeInt::make(shift & mask)));
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2742
        }
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2743
      } else {
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2744
        if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2745
          Node* shift = new (this) AndINode(in2, ConNode::make(this, TypeInt::make(mask)));
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2746
          n->set_req(2, shift);
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2747
        }
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2748
      }
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2749
      if (in2->outcnt() == 0) { // Remove dead node
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2750
        in2->disconnect_inputs(NULL, this);
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2751
      }
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2752
    }
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 8725
diff changeset
  2753
    break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
    assert( !n->is_Call(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
    assert( !n->is_Mem(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
  }
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2759
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2760
  // Collect CFG split points
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2761
  if (n->is_MultiBranch())
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2762
    frc._tests.push(n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
//------------------------------final_graph_reshaping_walk---------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
// Replacing Opaque nodes with their input in final_graph_reshaping_impl(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
// requires that the walk visits a node's inputs before visiting the node.
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2768
void Compile::final_graph_reshaping_walk( Node_Stack &nstack, Node *root, Final_Reshape_Counts &frc ) {
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2769
  ResourceArea *area = Thread::current()->resource_area();
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2770
  Unique_Node_List sfpt(area);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2771
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2772
  frc._visited.set(root->_idx); // first, mark node as visited
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
  uint cnt = root->req();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
  Node *n = root;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
  uint  i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
  while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
    if (i < cnt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
      // Place all non-visited non-null inputs onto stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
      Node* m = n->in(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
      ++i;
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2781
      if (m != NULL && !frc._visited.test_set(m->_idx)) {
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2782
        if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL)
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2783
          sfpt.push(m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
        cnt = m->req();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
        nstack.push(n, i); // put on stack parent and next input's index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
        n = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
        i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
      // Now do post-visit work
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2791
      final_graph_reshaping_impl( n, frc );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
      if (nstack.is_empty())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
        break;             // finished
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
      n = nstack.node();   // Get node from stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
      cnt = n->req();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
      i = nstack.index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
      nstack.pop();        // Shift to the next node on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
  }
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2800
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2801
  // Skip next transformation if compressed oops are not used.
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2802
  if ((UseCompressedOops && !Matcher::gen_narrow_oop_implicit_null_checks()) ||
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2803
      (!UseCompressedOops && !UseCompressedKlassPointers))
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2804
    return;
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5353
diff changeset
  2805
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2806
  // Go over safepoints nodes to skip DecodeN/DecodeNKlass nodes for debug edges.
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2807
  // It could be done for an uncommon traps or any safepoints/calls
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2808
  // if the DecodeN/DecodeNKlass node is referenced only in a debug info.
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2809
  while (sfpt.size() > 0) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2810
    n = sfpt.pop();
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2811
    JVMState *jvms = n->as_SafePoint()->jvms();
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2812
    assert(jvms != NULL, "sanity");
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2813
    int start = jvms->debug_start();
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2814
    int end   = n->req();
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2815
    bool is_uncommon = (n->is_CallStaticJava() &&
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2816
                        n->as_CallStaticJava()->uncommon_trap_request() != 0);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2817
    for (int j = start; j < end; j++) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2818
      Node* in = n->in(j);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13964
diff changeset
  2819
      if (in->is_DecodeNarrowPtr()) {
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2820
        bool safe_to_skip = true;
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2821
        if (!is_uncommon ) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2822
          // Is it safe to skip?
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2823
          for (uint i = 0; i < in->outcnt(); i++) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2824
            Node* u = in->raw_out(i);
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2825
            if (!u->is_SafePoint() ||
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2826
                 u->is_Call() && u->as_Call()->has_non_debug_use(n)) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2827
              safe_to_skip = false;
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2828
            }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2829
          }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2830
        }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2831
        if (safe_to_skip) {
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2832
          n->set_req(j, in->in(1));
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2833
        }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2834
        if (in->outcnt() == 0) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  2835
          in->disconnect_inputs(NULL, this);
1135
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2836
        }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2837
      }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2838
    }
9487203e5789 6706829: Compressed Oops: add debug info for narrow oops
kvn
parents: 1055
diff changeset
  2839
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
//------------------------------final_graph_reshaping--------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
// Final Graph Reshaping.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
// (1) Clone simple inputs to uncommon calls, so they can be scheduled late
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
//     and not commoned up and forced early.  Must come after regular
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
//     optimizations to avoid GVN undoing the cloning.  Clone constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
//     inputs to Loop Phis; these will be split by the allocator anyways.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
//     Remove Opaque nodes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
// (2) Move last-uses by commutative operations to the left input to encourage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
//     Intel update-in-place two-address operations and better register usage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
//     on RISCs.  Must come after regular optimizations to avoid GVN Ideal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
//     calls canonicalizing them back.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
// (3) Count the number of double-precision FP ops, single-precision FP ops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
//     and call sites.  On Intel, we can get correct rounding either by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
//     forcing singles to memory (requires extra stores and loads after each
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
//     FP bytecode) or we can set a rounding mode bit (requires setting and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
//     clearing the mode bit around call sites).  The mode bit is only used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
//     if the relative frequency of single FP ops to calls is low enough.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
//     This is a key transform for SPEC mpeg_audio.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
// (4) Detect infinite loops; blobs of code reachable from above but not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
//     below.  Several of the Code_Gen algorithms fail on such code shapes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
//     so we simply bail out.  Happens a lot in ZKM.jar, but also happens
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
//     from time to time in other codes (such as -Xcomp finalizer loops, etc).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
//     Detection is by looking for IfNodes where only 1 projection is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
//     reachable from below or CatchNodes missing some targets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
// (5) Assert for insane oop offsets in debug mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
bool Compile::final_graph_reshaping() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
  // an infinite loop may have been eliminated by the optimizer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
  // in which case the graph will be empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
  if (root()->req() == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
    record_method_not_compilable("trivial infinite loop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2877
  Final_Reshape_Counts frc;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
  // Visit everybody reachable!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
  // Allocate stack of size C->unique()/2 to avoid frequent realloc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
  Node_Stack nstack(unique() >> 1);
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2882
  final_graph_reshaping_walk(nstack, root(), frc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
  // Check for unreachable (from below) code (i.e., infinite loops).
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2885
  for( uint i = 0; i < frc._tests.size(); i++ ) {
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2886
    MultiBranchNode *n = frc._tests[i]->as_MultiBranch();
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2887
    // Get number of CFG targets.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
    // Note that PCTables include exception targets after calls.
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2889
    uint required_outcnt = n->required_outcnt();
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2890
    if (n->outcnt() != required_outcnt) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
      // Check for a few special cases.  Rethrow Nodes never take the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
      // 'fall-thru' path, so expected kids is 1 less.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
      if (n->is_PCTable() && n->in(0) && n->in(0)->in(0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
        if (n->in(0)->in(0)->is_Call()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
          CallNode *call = n->in(0)->in(0)->as_Call();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
          if (call->entry_point() == OptoRuntime::rethrow_stub()) {
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2897
            required_outcnt--;      // Rethrow always has 1 less kid
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
          } else if (call->req() > TypeFunc::Parms &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
                     call->is_CallDynamicJava()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
            // Check for null receiver. In such case, the optimizer has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
            // detected that the virtual call will always result in a null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
            // pointer exception. The fall-through projection of this CatchNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
            // will not be populated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
            Node *arg0 = call->in(TypeFunc::Parms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
            if (arg0->is_Type() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
                arg0->as_Type()->type()->higher_equal(TypePtr::NULL_PTR)) {
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2907
              required_outcnt--;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
          } else if (call->entry_point() == OptoRuntime::new_array_Java() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
                     call->req() > TypeFunc::Parms+1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
                     call->is_CallStaticJava()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
            // Check for negative array length. In such case, the optimizer has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
            // detected that the allocation attempt will always result in an
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
            // exception. There is no fall-through projection of this CatchNode .
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
            Node *arg1 = call->in(TypeFunc::Parms+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
            if (arg1->is_Type() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
                arg1->as_Type()->type()->join(TypeInt::POS)->empty()) {
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2918
              required_outcnt--;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
      }
374
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2923
      // Recheck with a better notion of 'required_outcnt'
585c671c9c0e 6663848: assert(i < Max(),"oob") in C2 with -Xcomp
never
parents: 360
diff changeset
  2924
      if (n->outcnt() != required_outcnt) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
        record_method_not_compilable("malformed control flow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
        return true;            // Not all targets reachable!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
    // Check that I actually visited all kids.  Unreached kids
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
    // must be infinite loops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
    for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++)
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2932
      if (!frc._visited.test(n->fast_out(j)->_idx)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
        record_method_not_compilable("infinite loop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
        return true;            // Found unvisited kid; must be unreach
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
  // If original bytecodes contained a mixture of floats and doubles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
  // check if the optimizer has made it homogenous, item (3).
3684
0b6d63791583 6873777: FPU control word optimization still performed with SSE
never
parents: 3676
diff changeset
  2940
  if( Use24BitFPMode && Use24BitFP && UseSSE == 0 &&
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2941
      frc.get_float_count() > 32 &&
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2942
      frc.get_double_count() == 0 &&
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2943
      (10 * frc.get_call_count() < frc.get_float_count()) ) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
    set_24_bit_selection_and_mode( false,  true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
3276
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2947
  set_java_calls(frc.get_java_call_count());
bda7d4532054 6860599: nodes limit could be reached during Output phase
kvn
parents: 3273
diff changeset
  2948
  set_inner_loops(frc.get_inner_loop_count());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
  // No infinite loops, no reason to bail out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
//-----------------------------too_many_traps----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
// Report if there are too many traps at the current method and bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
// Return true if there was a trap, and/or PerMethodTrapLimit is exceeded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
bool Compile::too_many_traps(ciMethod* method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
                             int bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
                             Deoptimization::DeoptReason reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
  ciMethodData* md = method->method_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
  if (md->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
    // Assume the trap has not occurred, or that it occurred only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
    // because of a transient condition during start-up in the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  if (md->has_trap_at(bci, reason) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
    // Assume PerBytecodeTrapLimit==0, for a more conservative heuristic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
    // Also, if there are multiple reasons, or if there is no per-BCI record,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
    // assume the worst.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
    if (log())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
      log()->elem("observe trap='%s' count='%d'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
                  Deoptimization::trap_reason_name(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
                  md->trap_count(reason));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
    // Ignore method/bci and see if there have been too many globally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
    return too_many_traps(reason, md);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
// Less-accurate variant which does not require a method and bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
bool Compile::too_many_traps(Deoptimization::DeoptReason reason,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
                             ciMethodData* logmd) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
 if (trap_count(reason) >= (uint)PerMethodTrapLimit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
    // Too many traps globally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
    // Note that we use cumulative trap_count, not just md->trap_count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
    if (log()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
      int mcount = (logmd == NULL)? -1: (int)logmd->trap_count(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
      log()->elem("observe trap='%s' count='0' mcount='%d' ccount='%d'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
                  Deoptimization::trap_reason_name(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
                  mcount, trap_count(reason));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
    // The coast is clear.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
//--------------------------too_many_recompiles--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
// Report if there are too many recompiles at the current method and bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
// Consults PerBytecodeRecompilationCutoff and PerMethodRecompilationCutoff.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
// Is not eager to return true, since this will cause the compiler to use
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
// Action_none for a trap point, to avoid too many recompilations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
bool Compile::too_many_recompiles(ciMethod* method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
                                  int bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
                                  Deoptimization::DeoptReason reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
  ciMethodData* md = method->method_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
  if (md->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
    // Assume the trap has not occurred, or that it occurred only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
    // because of a transient condition during start-up in the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  // Pick a cutoff point well within PerBytecodeRecompilationCutoff.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
  uint bc_cutoff = (uint) PerBytecodeRecompilationCutoff / 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  uint m_cutoff  = (uint) PerMethodRecompilationCutoff / 2 + 1;  // not zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
  Deoptimization::DeoptReason per_bc_reason
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
    = Deoptimization::reason_recorded_per_bytecode_if_any(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
  if ((per_bc_reason == Deoptimization::Reason_none
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
       || md->has_trap_at(bci, reason) != 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
      // The trap frequency measure we care about is the recompile count:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
      && md->trap_recompiled_at(bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
      && md->overflow_recompile_count() >= bc_cutoff) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
    // Do not emit a trap here if it has already caused recompilations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
    // Also, if there are multiple reasons, or if there is no per-BCI record,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
    // assume the worst.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
    if (log())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
      log()->elem("observe trap='%s recompiled' count='%d' recompiles2='%d'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
                  Deoptimization::trap_reason_name(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
                  md->trap_count(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
                  md->overflow_recompile_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  } else if (trap_count(reason) != 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
             && decompile_count() >= m_cutoff) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
    // Too many recompiles globally, and we have seen this sort of trap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
    // Use cumulative decompile_count, not just md->decompile_count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
    if (log())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
      log()->elem("observe trap='%s' count='%d' mcount='%d' decompiles='%d' mdecompiles='%d'",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
                  Deoptimization::trap_reason_name(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
                  md->trap_count(reason), trap_count(reason),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
                  md->decompile_count(), decompile_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
    // The coast is clear.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
//------------------------------verify_graph_edges---------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
// Walk the Graph and verify that there is a one-to-one correspondence
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
// between Use-Def edges and Def-Use edges in the graph.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
void Compile::verify_graph_edges(bool no_dead_code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
  if (VerifyGraphEdges) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
    ResourceArea *area = Thread::current()->resource_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
    Unique_Node_List visited(area);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
    // Call recursive graph walk to check edges
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
    _root->verify_edges(visited);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
    if (no_dead_code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
      // Now make sure that no visited node is used by an unvisited node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
      bool dead_nodes = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
      Unique_Node_List checked(area);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
      while (visited.size() > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
        Node* n = visited.pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
        checked.push(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
        for (uint i = 0; i < n->outcnt(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
          Node* use = n->raw_out(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
          if (checked.member(use))  continue;  // already checked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
          if (visited.member(use))  continue;  // already in the graph
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
          if (use->is_Con())        continue;  // a dead ConNode is OK
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
          // At this point, we have found a dead node which is DU-reachable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
          if (dead_nodes++ == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
            tty->print_cr("*** Dead nodes reachable via DU edges:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
          use->dump(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
          tty->print_cr("---");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
          checked.push(use);  // No repeats; pretend it is now checked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3080
      assert(dead_nodes == 0, "using nodes must be reachable from root");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
// The Compile object keeps track of failure reasons separately from the ciEnv.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
// This is required because there is not quite a 1-1 relation between the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
// ciEnv and its compilation task and the Compile object.  Note that one
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
// ciEnv might use two Compile objects, if C2Compiler::compile_method decides
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
// to backtrack and retry without subsuming loads.  Other than this backtracking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
// behavior, the Compile's failure reason is quietly copied up to the ciEnv
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
// by the logic in C2Compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
void Compile::record_failure(const char* reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
  if (log() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
    log()->elem("failure reason='%s' phase='compile'", reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
  if (_failure_reason == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
    // Record the first failure reason.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
    _failure_reason = reason;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
  }
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 767
diff changeset
  3101
  if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 767
diff changeset
  3102
    C->print_method(_failure_reason);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 767
diff changeset
  3103
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
  _root = NULL;  // flush the graph, too
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator, bool dolog)
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3108
  : TraceTime(NULL, accumulator, false NOT_PRODUCT( || TimeCompiler ), false),
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3109
    _phase_name(name), _dolog(dolog)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
  if (dolog) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
    C = Compile::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
    _log = C->log();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
    C = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
    _log = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
  if (_log != NULL) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3119
    _log->begin_head("phase name='%s' nodes='%d' live='%d'", _phase_name, C->unique(), C->live_nodes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
    _log->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
    _log->end_head();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
Compile::TracePhase::~TracePhase() {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3126
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3127
  C = Compile::current();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3128
  if (_dolog) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3129
    _log = C->log();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3130
  } else {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3131
    _log = NULL;
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3132
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3133
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3134
#ifdef ASSERT
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3135
  if (PrintIdealNodeCount) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3136
    tty->print_cr("phase name='%s' nodes='%d' live='%d' live_graph_walk='%d'",
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3137
                  _phase_name, C->unique(), C->live_nodes(), C->count_live_nodes_by_graph_walk());
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3138
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3139
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3140
  if (VerifyIdealNodeCount) {
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3141
    Compile::current()->print_missing_nodes();
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3142
  }
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3143
#endif
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3144
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
  if (_log != NULL) {
14623
70c4c1be0a14 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 14126
diff changeset
  3146
    _log->done("phase name='%s' nodes='%d' live='%d'", _phase_name, C->unique(), C->live_nodes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
}
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3149
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3150
//=============================================================================
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3151
// Two Constant's are equal when the type and the value are equal.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3152
bool Compile::Constant::operator==(const Constant& other) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3153
  if (type()          != other.type()         )  return false;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3154
  if (can_be_reused() != other.can_be_reused())  return false;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3155
  // For floating point values we compare the bit pattern.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3156
  switch (type()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3157
  case T_FLOAT:   return (_v._value.i == other._v._value.i);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3158
  case T_LONG:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3159
  case T_DOUBLE:  return (_v._value.j == other._v._value.j);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3160
  case T_OBJECT:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3161
  case T_ADDRESS: return (_v._value.l == other._v._value.l);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3162
  case T_VOID:    return (_v._value.l == other._v._value.l);  // jump-table entries
14126
afb8a3a86f1f 8000623: tools/javac/Diagnostics/6769027/T6769027.java crashes in PSPromotionManager::copy_to_survivor_space
kvn
parents: 13970
diff changeset
  3163
  case T_METADATA: return (_v._metadata == other._v._metadata);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3164
  default: ShouldNotReachHere();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3165
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3166
  return false;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3167
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3168
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3169
static int type_to_size_in_bytes(BasicType t) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3170
  switch (t) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3171
  case T_LONG:    return sizeof(jlong  );
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3172
  case T_FLOAT:   return sizeof(jfloat );
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3173
  case T_DOUBLE:  return sizeof(jdouble);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3174
  case T_METADATA: return sizeof(Metadata*);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3175
    // We use T_VOID as marker for jump-table entries (labels) which
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3176
    // need an internal word relocation.
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3177
  case T_VOID:
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3178
  case T_ADDRESS:
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3179
  case T_OBJECT:  return sizeof(jobject);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3180
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3181
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3182
  ShouldNotReachHere();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3183
  return -1;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3184
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3185
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3186
int Compile::ConstantTable::qsort_comparator(Constant* a, Constant* b) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3187
  // sort descending
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3188
  if (a->freq() > b->freq())  return -1;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3189
  if (a->freq() < b->freq())  return  1;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3190
  return 0;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3191
}
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3192
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3193
void Compile::ConstantTable::calculate_offsets_and_size() {
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3194
  // First, sort the array by frequencies.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3195
  _constants.sort(qsort_comparator);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3196
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3197
#ifdef ASSERT
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3198
  // Make sure all jump-table entries were sorted to the end of the
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3199
  // array (they have a negative frequency).
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3200
  bool found_void = false;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3201
  for (int i = 0; i < _constants.length(); i++) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3202
    Constant con = _constants.at(i);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3203
    if (con.type() == T_VOID)
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3204
      found_void = true;  // jump-tables
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3205
    else
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3206
      assert(!found_void, "wrong sorting");
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3207
  }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3208
#endif
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3209
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3210
  int offset = 0;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3211
  for (int i = 0; i < _constants.length(); i++) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3212
    Constant* con = _constants.adr_at(i);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3213
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3214
    // Align offset for type.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3215
    int typesize = type_to_size_in_bytes(con->type());
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3216
    offset = align_size_up(offset, typesize);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3217
    con->set_offset(offset);   // set constant's offset
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3218
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3219
    if (con->type() == T_VOID) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3220
      MachConstantNode* n = (MachConstantNode*) con->get_jobject();
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3221
      offset = offset + typesize * n->outcnt();  // expand jump-table
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3222
    } else {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3223
      offset = offset + typesize;
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3224
    }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3225
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3226
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3227
  // Align size up to the next section start (which is insts; see
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3228
  // CodeBuffer::align_at_start).
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3229
  assert(_size == -1, "already set?");
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3230
  _size = align_size_up(offset, CodeEntryAlignment);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3231
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3232
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3233
void Compile::ConstantTable::emit(CodeBuffer& cb) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3234
  MacroAssembler _masm(&cb);
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3235
  for (int i = 0; i < _constants.length(); i++) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3236
    Constant con = _constants.at(i);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3237
    address constant_addr;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3238
    switch (con.type()) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3239
    case T_LONG:   constant_addr = _masm.long_constant(  con.get_jlong()  ); break;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3240
    case T_FLOAT:  constant_addr = _masm.float_constant( con.get_jfloat() ); break;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3241
    case T_DOUBLE: constant_addr = _masm.double_constant(con.get_jdouble()); break;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3242
    case T_OBJECT: {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3243
      jobject obj = con.get_jobject();
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3244
      int oop_index = _masm.oop_recorder()->find_index(obj);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3245
      constant_addr = _masm.address_constant((address) obj, oop_Relocation::spec(oop_index));
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3246
      break;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3247
    }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3248
    case T_ADDRESS: {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3249
      address addr = (address) con.get_jobject();
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3250
      constant_addr = _masm.address_constant(addr);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3251
      break;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3252
    }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3253
    // We use T_VOID as marker for jump-table entries (labels) which
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3254
    // need an internal word relocation.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3255
    case T_VOID: {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3256
      MachConstantNode* n = (MachConstantNode*) con.get_jobject();
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3257
      // Fill the jump-table with a dummy word.  The real value is
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3258
      // filled in later in fill_jump_table.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3259
      address dummy = (address) n;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3260
      constant_addr = _masm.address_constant(dummy);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3261
      // Expand jump-table
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3262
      for (uint i = 1; i < n->outcnt(); i++) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3263
        address temp_addr = _masm.address_constant(dummy + i);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3264
        assert(temp_addr, "consts section too small");
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3265
      }
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3266
      break;
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3267
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3268
    case T_METADATA: {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3269
      Metadata* obj = con.get_metadata();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3270
      int metadata_index = _masm.oop_recorder()->find_index(obj);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3271
      constant_addr = _masm.address_constant((address) obj, metadata_Relocation::spec(metadata_index));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3272
      break;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3273
    }
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3274
    default: ShouldNotReachHere();
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3275
    }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3276
    assert(constant_addr, "consts section too small");
13393
f0344cc50a90 7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents: 13104
diff changeset
  3277
    assert((constant_addr - _masm.code()->consts()->start()) == con.offset(), err_msg_res("must be: %d == %d", constant_addr - _masm.code()->consts()->start(), con.offset()));
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3278
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3279
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3280
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3281
int Compile::ConstantTable::find_offset(Constant& con) const {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3282
  int idx = _constants.find(con);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3283
  assert(idx != -1, "constant must be in constant table");
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3284
  int offset = _constants.at(idx).offset();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3285
  assert(offset != -1, "constant table not emitted yet?");
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3286
  return offset;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3287
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3288
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3289
void Compile::ConstantTable::add(Constant& con) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3290
  if (con.can_be_reused()) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3291
    int idx = _constants.find(con);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3292
    if (idx != -1 && _constants.at(idx).can_be_reused()) {
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3293
      _constants.adr_at(idx)->inc_freq(con.freq());  // increase the frequency by the current value
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3294
      return;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3295
    }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3296
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3297
  (void) _constants.append(con);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3298
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3299
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3300
Compile::Constant Compile::ConstantTable::add(MachConstantNode* n, BasicType type, jvalue value) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3301
  Block* b = Compile::current()->cfg()->_bbs[n->_idx];
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3302
  Constant con(type, value, b->_freq);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3303
  add(con);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3304
  return con;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3305
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3306
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3307
Compile::Constant Compile::ConstantTable::add(Metadata* metadata) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3308
  Constant con(metadata);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3309
  add(con);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3310
  return con;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3311
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3312
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3313
Compile::Constant Compile::ConstantTable::add(MachConstantNode* n, MachOper* oper) {
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3314
  jvalue value;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3315
  BasicType type = oper->type()->basic_type();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3316
  switch (type) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3317
  case T_LONG:    value.j = oper->constantL(); break;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3318
  case T_FLOAT:   value.f = oper->constantF(); break;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3319
  case T_DOUBLE:  value.d = oper->constantD(); break;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3320
  case T_OBJECT:
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3321
  case T_ADDRESS: value.l = (jobject) oper->constant(); break;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3322
  case T_METADATA: return add((Metadata*)oper->constant()); break;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13490
diff changeset
  3323
  default: guarantee(false, err_msg_res("unhandled type: %s", type2name(type)));
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3324
  }
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3325
  return add(n, type, value);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3326
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3327
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3328
Compile::Constant Compile::ConstantTable::add_jump_table(MachConstantNode* n) {
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3329
  jvalue value;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3330
  // We can use the node pointer here to identify the right jump-table
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3331
  // as this method is called from Compile::Fill_buffer right before
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3332
  // the MachNodes are emitted and the jump-table is filled (means the
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3333
  // MachNode pointers do not change anymore).
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3334
  value.l = (jobject) n;
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3335
  Constant con(T_VOID, value, next_jump_table_freq(), false);  // Labels of a jump-table cannot be reused.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3336
  add(con);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3337
  return con;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3338
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3339
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3340
void Compile::ConstantTable::fill_jump_table(CodeBuffer& cb, MachConstantNode* n, GrowableArray<Label*> labels) const {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3341
  // If called from Compile::scratch_emit_size do nothing.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3342
  if (Compile::current()->in_scratch_emit_size())  return;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3343
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3344
  assert(labels.is_nonempty(), "must be");
13393
f0344cc50a90 7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents: 13104
diff changeset
  3345
  assert((uint) labels.length() == n->outcnt(), err_msg_res("must be equal: %d == %d", labels.length(), n->outcnt()));
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3346
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3347
  // Since MachConstantNode::constant_offset() also contains
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3348
  // table_base_offset() we need to subtract the table_base_offset()
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3349
  // to get the plain offset into the constant table.
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3350
  int offset = n->constant_offset() - table_base_offset();
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3351
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3352
  MacroAssembler _masm(&cb);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3353
  address* jump_table_base = (address*) (_masm.code()->consts()->start() + offset);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3354
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10988
diff changeset
  3355
  for (uint i = 0; i < n->outcnt(); i++) {
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3356
    address* constant_addr = &jump_table_base[i];
13393
f0344cc50a90 7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents: 13104
diff changeset
  3357
    assert(*constant_addr == (((address) n) + i), err_msg_res("all jump-table entries must contain adjusted node pointer: " INTPTR_FORMAT " == " INTPTR_FORMAT, *constant_addr, (((address) n) + i)));
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3358
    *constant_addr = cb.consts()->target(*labels.at(i), (address) constant_addr);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3359
    cb.consts()->relocate((address) constant_addr, relocInfo::internal_word_type);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3360
  }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7432
diff changeset
  3361
}
14828
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3362
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3363
void Compile::dump_inlining() {
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3364
  if (PrintInlining) {
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3365
    for (int i = 0; i < _print_inlining_list->length(); i++) {
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3366
      tty->print(_print_inlining_list->at(i).ss()->as_string());
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3367
    }
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3368
  }
bb9dffedf46c 8005031: Some cleanup in c2 to prepare for incremental inlining support
roland
parents: 14626
diff changeset
  3369
}