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