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