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