hotspot/src/share/vm/ci/ciTypeFlow.hpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13963 e5b53c306fb5
child 34151 8e0bebdbc29e
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13963
e5b53c306fb5 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 11445
diff changeset
     2
 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1412
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1412
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1412
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_CI_CITYPEFLOW_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_CI_CITYPEFLOW_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#ifdef COMPILER2
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "ci/ciEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "ci/ciKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "ci/ciMethodBlocks.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#ifdef SHARK
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "ci/ciEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "ci/ciKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "ci/ciMethodBlocks.hpp"
9103
535a93f494f6 7032458: Zero and Shark fixes
twisti
parents: 7397
diff changeset
    37
#include "shark/shark_globals.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class ciTypeFlow : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  ciEnv*    _env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  ciMethod* _method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  ciMethodBlocks* _methodBlocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  int       _osr_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  // information cached from the method:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  int _max_locals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  int _max_stack;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  int _code_size;
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
    52
  bool      _has_irreducible_entry;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  const char* _failure_reason;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  class StateVector;
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
    58
  class Loop;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  class Block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  // Build a type flow analyzer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  // Do an OSR analysis if osr_bci >= 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  ciTypeFlow(ciEnv* env, ciMethod* method, int osr_bci = InvocationEntryBci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  ciMethod* method() const     { return _method; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  ciEnv*    env()              { return _env; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  Arena*    arena()            { return _env->arena(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  bool      is_osr_flow() const{ return _osr_bci != InvocationEntryBci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  int       start_bci() const  { return is_osr_flow()? _osr_bci: 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  int       max_locals() const { return _max_locals; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  int       max_stack() const  { return _max_stack; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  int       max_cells() const  { return _max_locals + _max_stack; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  int       code_size() const  { return _code_size; }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
    75
  bool      has_irreducible_entry() const { return _has_irreducible_entry; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // Represents information about an "active" jsr call.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // class represents a call to the routine at some entry address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // with some distinct return address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  class JsrRecord : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    int _entry_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    int _return_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    JsrRecord(int entry_address, int return_address) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
      _entry_address = entry_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
      _return_address = return_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    int entry_address() const  { return _entry_address; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    int return_address() const { return _return_address; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    void print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
      st->print("%d->%d", entry_address(), return_address());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // A JsrSet represents some set of JsrRecords.  This class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  // is used to record a set of all jsr routines which we permit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // execution to return (ret) from.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // During abstract interpretation, JsrSets are used to determine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // whether two paths which reach a given block are unique, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // should be cloned apart, or are compatible, and should merge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // together.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Note that different amounts of effort can be expended determining
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  // if paths are compatible.  <DISCUSSION>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  class JsrSet : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    GrowableArray<JsrRecord*>* _set;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    JsrRecord* record_at(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
      return _set->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    // Insert the given JsrRecord into the JsrSet, maintaining the order
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    // of the set and replacing any element with the same entry address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    void insert_jsr_record(JsrRecord* record);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    // Remove the JsrRecord with the given return address from the JsrSet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    void remove_jsr_record(int return_address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    JsrSet(Arena* arena, int default_len = 4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    // Copy this JsrSet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    void copy_into(JsrSet* jsrs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    // Is this JsrSet compatible with some other JsrSet?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    bool is_compatible_with(JsrSet* other);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    // Apply the effect of a single bytecode to the JsrSet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    void apply_control(ciTypeFlow* analyzer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
                       ciBytecodeStream* str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
                       StateVector* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    // What is the cardinality of this set?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    int size() const { return _set->length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    void print_on(outputStream* st) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   146
  class LocalSet VALUE_OBJ_CLASS_SPEC {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   147
  private:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   148
    enum Constants { max = 63 };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   149
    uint64_t _bits;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   150
  public:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   151
    LocalSet() : _bits(0) {}
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   152
    void add(uint32_t i)        { if (i < (uint32_t)max) _bits |=  (1LL << i); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   153
    void add(LocalSet* ls)      { _bits |= ls->_bits; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   154
    bool test(uint32_t i) const { return i < (uint32_t)max ? (_bits>>i)&1U : true; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   155
    void clear()                { _bits = 0; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   156
    void print_on(outputStream* st, int limit) const  PRODUCT_RETURN;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   157
  };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   158
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Used as a combined index for locals and temps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  enum Cell {
1065
dbeb68f8a0ee 6741642: bad enum definition in ciTypeFlow.hpp
never
parents: 1
diff changeset
   161
    Cell_0, Cell_max = INT_MAX
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // A StateVector summarizes the type information at some
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // point in the program
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  class StateVector : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    ciType**    _types;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    int         _stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    int         _monitor_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    ciTypeFlow* _outer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    int         _trap_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    int         _trap_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   176
    LocalSet    _def_locals;  // For entire block
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   177
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    static ciType* type_meet_internal(ciType* t1, ciType* t2, ciTypeFlow* analyzer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    // Special elements in our type lattice.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
      T_TOP     = T_VOID,      // why not?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
      T_BOTTOM  = T_CONFLICT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
      T_LONG2   = T_SHORT,     // 2nd word of T_LONG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
      T_DOUBLE2 = T_CHAR,      // 2nd word of T_DOUBLE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
      T_NULL    = T_BYTE       // for now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    static ciType* top_type()    { return ciType::make((BasicType)T_TOP); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    static ciType* bottom_type() { return ciType::make((BasicType)T_BOTTOM); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    static ciType* long2_type()  { return ciType::make((BasicType)T_LONG2); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    static ciType* double2_type(){ return ciType::make((BasicType)T_DOUBLE2); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    static ciType* null_type()   { return ciType::make((BasicType)T_NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    static ciType* half_type(ciType* t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
      switch (t->basic_type()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
      case T_LONG:    return long2_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
      case T_DOUBLE:  return double2_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      default:        ShouldNotReachHere(); return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    // The meet operation for our type lattice.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    ciType* type_meet(ciType* t1, ciType* t2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
      return type_meet_internal(t1, t2, outer());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    ciTypeFlow* outer() const          { return _outer; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    int         stack_size() const     { return _stack_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    void    set_stack_size(int ss)     { _stack_size = ss; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    int         monitor_count() const  { return _monitor_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    void    set_monitor_count(int mc)  { _monitor_count = mc; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   217
    LocalSet* def_locals() { return &_def_locals; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   218
    const LocalSet* def_locals() const { return &_def_locals; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   219
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    static Cell start_cell()           { return (Cell)0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    static Cell next_cell(Cell c)      { return (Cell)(((int)c) + 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    Cell        limit_cell() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
      return (Cell)(outer()->max_locals() + stack_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    // Cell creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    Cell      local(int lnum) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
      assert(lnum < outer()->max_locals(), "index check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
      return (Cell)(lnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    Cell      stack(int snum) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
      assert(snum < stack_size(), "index check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
      return (Cell)(outer()->max_locals() + snum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    Cell      tos() const { return stack(stack_size()-1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    // For external use only:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    ciType* local_type_at(int i) const { return type_at(local(i)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    ciType* stack_type_at(int i) const { return type_at(stack(i)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    // Accessors for the type of some Cell c
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    ciType*   type_at(Cell c) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
      assert(start_cell() <= c && c < limit_cell(), "out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
      return _types[c];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    void      set_type_at(Cell c, ciType* type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
      assert(start_cell() <= c && c < limit_cell(), "out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
      _types[c] = type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    // Top-of-stack operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    void      set_type_at_tos(ciType* type) { set_type_at(tos(), type); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
    ciType*   type_at_tos() const           { return type_at(tos()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    void      push(ciType* type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
      _stack_size++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
      set_type_at_tos(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    void      pop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
      debug_only(set_type_at_tos(bottom_type()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
      _stack_size--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    ciType*   pop_value() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
      ciType* t = type_at_tos();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
      return t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    // Convenience operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    bool      is_reference(ciType* type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
      return type == null_type() || !type->is_primitive_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    bool      is_int(ciType* type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
      return type->basic_type() == T_INT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    bool      is_long(ciType* type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
      return type->basic_type() == T_LONG;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    bool      is_float(ciType* type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      return type->basic_type() == T_FLOAT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    bool      is_double(ciType* type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
      return type->basic_type() == T_DOUBLE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   289
    void store_to_local(int lnum) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   290
      _def_locals.add((uint) lnum);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   291
    }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   292
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    void      push_translate(ciType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    void      push_int() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
      push(ciType::make(T_INT));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    void      pop_int() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
      assert(is_int(type_at_tos()), "must be integer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    void      check_int(Cell c) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
      assert(is_int(type_at(c)), "must be integer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    void      push_double() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
      push(ciType::make(T_DOUBLE));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
      push(double2_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    void      pop_double() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
      assert(type_at_tos() == double2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      assert(is_double(type_at_tos()), "must be double");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
    void      push_float() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
      push(ciType::make(T_FLOAT));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    void      pop_float() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
      assert(is_float(type_at_tos()), "must be float");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    void      push_long() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
      push(ciType::make(T_LONG));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
      push(long2_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    void      pop_long() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
      assert(type_at_tos() == long2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
      assert(is_long(type_at_tos()), "must be long");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    void      push_object(ciKlass* klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
      push(klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    void      pop_object() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
      assert(is_reference(type_at_tos()), "must be reference type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    void      pop_array() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
      assert(type_at_tos() == null_type() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
             type_at_tos()->is_array_klass(), "must be array type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
      pop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    // pop_objArray and pop_typeArray narrow the tos to ciObjArrayKlass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    // or ciTypeArrayKlass (resp.).  In the rare case that an explicit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    // null is popped from the stack, we return NULL.  Caller beware.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
    ciObjArrayKlass* pop_objArray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
      ciType* array = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      if (array == null_type())  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      assert(array->is_obj_array_klass(), "must be object array type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      return array->as_obj_array_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    ciTypeArrayKlass* pop_typeArray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
      ciType* array = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
      if (array == null_type())  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
      assert(array->is_type_array_klass(), "must be prim array type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
      return array->as_type_array_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    void      push_null() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
      push(null_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    void      do_null_assert(ciKlass* unloaded_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    // Helper convenience routines.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
    void do_aaload(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    void do_checkcast(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    void do_getfield(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    void do_getstatic(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    void do_invoke(ciBytecodeStream* str, bool has_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    void do_jsr(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    void do_ldc(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    void do_multianewarray(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    void do_new(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    void do_newarray(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    void do_putfield(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    void do_putstatic(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    void do_ret(ciBytecodeStream* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    void overwrite_local_double_long(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
      // Invalidate the previous local if it contains first half of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
      // a double or long value since it's seconf half is being overwritten.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
      int prev_index = index - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
      if (prev_index >= 0 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
          (is_double(type_at(local(prev_index))) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
           is_long(type_at(local(prev_index))))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
        set_type_at(local(prev_index), bottom_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    void load_local_object(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
      ciType* type = type_at(local(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      assert(is_reference(type), "must be reference type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
      push(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    void store_local_object(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
      ciType* type = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
      assert(is_reference(type) || type->is_return_address(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
             "must be reference type or return address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      overwrite_local_double_long(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
      set_type_at(local(index), type);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   401
      store_to_local(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    void load_local_double(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
      ciType* type = type_at(local(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
      ciType* type2 = type_at(local(index+1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
      assert(is_double(type), "must be double type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
      assert(type2 == double2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
      push(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
      push(double2_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    void store_local_double(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
      ciType* type2 = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      ciType* type = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
      assert(is_double(type), "must be double");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
      assert(type2 == double2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
      overwrite_local_double_long(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
      set_type_at(local(index), type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
      set_type_at(local(index+1), type2);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   420
      store_to_local(index);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   421
      store_to_local(index+1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
    void load_local_float(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
      ciType* type = type_at(local(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
      assert(is_float(type), "must be float type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
      push(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    void store_local_float(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
      ciType* type = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
      assert(is_float(type), "must be float type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
      overwrite_local_double_long(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
      set_type_at(local(index), type);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   434
      store_to_local(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    void load_local_int(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
      ciType* type = type_at(local(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
      assert(is_int(type), "must be int type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
      push(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    void store_local_int(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
      ciType* type = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
      assert(is_int(type), "must be int type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
      overwrite_local_double_long(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
      set_type_at(local(index), type);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   447
      store_to_local(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    void load_local_long(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
      ciType* type = type_at(local(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
      ciType* type2 = type_at(local(index+1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
      assert(is_long(type), "must be long type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
      assert(type2 == long2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      push(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
      push(long2_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    void store_local_long(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
      ciType* type2 = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
      ciType* type = pop_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
      assert(is_long(type), "must be long");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
      assert(type2 == long2_type(), "must be 2nd half");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
      overwrite_local_double_long(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
      set_type_at(local(index), type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
      set_type_at(local(index+1), type2);
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   466
      store_to_local(index);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   467
      store_to_local(index+1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    // Stop interpretation of this path with a trap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    void trap(ciBytecodeStream* str, ciKlass* klass, int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    StateVector(ciTypeFlow* outer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    // Copy our value into some other StateVector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    void copy_into(StateVector* copy) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    // Meets this StateVector with another, destructively modifying this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    // one.  Returns true if any modification takes place.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    bool meet(const StateVector* incoming);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    // Ditto, except that the incoming state is coming from an exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    bool meet_exception(ciInstanceKlass* exc, const StateVector* incoming);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    // Apply the effect of one bytecode to this StateVector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    bool apply_one_bytecode(ciBytecodeStream* stream);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
    // What is the bci of the trap?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    int  trap_bci() { return _trap_bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    // What is the index associated with the trap?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    int  trap_index() { return _trap_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    void print_cell_on(outputStream* st, Cell c) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    void print_on(outputStream* st) const              PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  // Parameter for "find_block" calls:
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   500
  // Describes the difference between a public and backedge copy.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  enum CreateOption {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    create_public_copy,
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   503
    create_backedge_copy,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    no_create
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   507
  // Successor iterator
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   508
  class SuccIter : public StackObj {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   509
  private:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   510
    Block* _pred;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   511
    int    _index;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   512
    Block* _succ;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   513
  public:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   514
    SuccIter()                        : _pred(NULL), _index(-1), _succ(NULL) {}
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   515
    SuccIter(Block* pred)             : _pred(pred), _index(-1), _succ(NULL) { next(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   516
    int    index()     { return _index; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   517
    Block* pred()      { return _pred; }           // Return predecessor
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   518
    bool   done()      { return _index < 0; }      // Finished?
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   519
    Block* succ()      { return _succ; }           // Return current successor
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   520
    void   next();                                 // Advance
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   521
    void   set_succ(Block* succ);                  // Update current successor
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   522
    bool   is_normal_ctrl() { return index() < _pred->successors()->length(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   523
  };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   524
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  // A basic block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  class Block : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
    ciBlock*                          _ciblock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    GrowableArray<Block*>*           _exceptions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    GrowableArray<ciInstanceKlass*>* _exc_klasses;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    GrowableArray<Block*>*           _successors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    StateVector*                     _state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    JsrSet*                          _jsrs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    int                              _trap_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
    int                              _trap_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   538
    // pre_order, assigned at first visit. Used as block ID and "visited" tag
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    int                              _pre_order;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   541
    // A post-order, used to compute the reverse post order (RPO) provided to the client
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   542
    int                              _post_order;  // used to compute rpo
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   543
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   544
    // Has this block been cloned for a loop backedge?
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   545
    bool                             _backedge_copy;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
11445
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   547
    // This block is entry to irreducible loop.
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   548
    bool                             _irreducible_entry;
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   549
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   550
    // This block has monitor entry point.
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   551
    bool                             _has_monitorenter;
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   552
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    // A pointer used for our internal work list
11445
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   554
    bool                             _on_work_list;      // on the work list
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   555
    Block*                           _next;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   556
    Block*                           _rpo_next;          // Reverse post order list
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   557
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   558
    // Loop info
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   559
    Loop*                            _loop;              // nearest loop
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    ciBlock*     ciblock() const     { return _ciblock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    StateVector* state() const     { return _state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    // Compute the exceptional successors and types for this Block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    void compute_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    // constructors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    Block(ciTypeFlow* outer, ciBlock* ciblk, JsrSet* jsrs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    void set_trap(int trap_bci, int trap_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
      _trap_bci = trap_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
      _trap_index = trap_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
      assert(has_trap(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    bool has_trap()   const  { return _trap_bci != -1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    int  trap_bci()   const  { assert(has_trap(), ""); return _trap_bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    int  trap_index() const  { assert(has_trap(), ""); return _trap_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    ciTypeFlow* outer() const { return state()->outer(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    int start() const         { return _ciblock->start_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    int limit() const         { return _ciblock->limit_bci(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    int control() const       { return _ciblock->control_bci(); }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   585
    JsrSet* jsrs() const      { return _jsrs; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   587
    bool    is_backedge_copy() const       { return _backedge_copy; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   588
    void   set_backedge_copy(bool z);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   589
    int        backedge_copy_count() const { return outer()->backedge_copy_count(ciblock()->index(), _jsrs); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    // access to entry state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    int     stack_size() const         { return _state->stack_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    int     monitor_count() const      { return _state->monitor_count(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    ciType* local_type_at(int i) const { return _state->local_type_at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    ciType* stack_type_at(int i) const { return _state->stack_type_at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   597
    // Data flow on locals
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   598
    bool is_invariant_local(uint v) const {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   599
      assert(is_loop_head(), "only loop heads");
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   600
      // Find outermost loop with same loop head
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   601
      Loop* lp = loop();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   602
      while (lp->parent() != NULL) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   603
        if (lp->parent()->head() != lp->head()) break;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   604
        lp = lp->parent();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   605
      }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   606
      return !lp->def_locals()->test(v);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   607
    }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   608
    LocalSet* def_locals() { return _state->def_locals(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   609
    const LocalSet* def_locals() const { return _state->def_locals(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   610
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
    // Get the successors for this Block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
    GrowableArray<Block*>* successors(ciBytecodeStream* str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
                                      StateVector* state,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
                                      JsrSet* jsrs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    GrowableArray<Block*>* successors() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      assert(_successors != NULL, "must be filled in");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
      return _successors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    // Get the exceptional successors for this Block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    GrowableArray<Block*>* exceptions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
      if (_exceptions == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
        compute_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      return _exceptions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    // Get the exception klasses corresponding to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    // exceptional successors for this Block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    GrowableArray<ciInstanceKlass*>* exc_klasses() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
      if (_exc_klasses == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
        compute_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
      return _exc_klasses;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    // Is this Block compatible with a given JsrSet?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
    bool is_compatible_with(JsrSet* other) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
      return _jsrs->is_compatible_with(other);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    // Copy the value of our state vector into another.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
    void copy_state_into(StateVector* copy) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
      _state->copy_into(copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    // Copy the value of our JsrSet into another
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
    void copy_jsrs_into(JsrSet* copy) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
      _jsrs->copy_into(copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    // Meets the start state of this block with another state, destructively
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    // modifying this one.  Returns true if any modification takes place.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    bool meet(const StateVector* incoming) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
      return state()->meet(incoming);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
    // Ditto, except that the incoming state is coming from an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
    // exception path.  This means the stack is replaced by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
    // appropriate exception type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    bool meet_exception(ciInstanceKlass* exc, const StateVector* incoming) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
      return state()->meet_exception(exc, incoming);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
    // Work list manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
    void   set_next(Block* block) { _next = block; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    Block* next() const           { return _next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
    void   set_on_work_list(bool c) { _on_work_list = c; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    bool   is_on_work_list() const  { return _on_work_list; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
    bool   has_pre_order() const  { return _pre_order >= 0; }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   673
    void   set_pre_order(int po)  { assert(!has_pre_order(), ""); _pre_order = po; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    int    pre_order() const      { assert(has_pre_order(), ""); return _pre_order; }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   675
    void   set_next_pre_order()   { set_pre_order(outer()->inc_next_pre_order()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    bool   is_start() const       { return _pre_order == outer()->start_block_num(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   678
    // Reverse post order
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   679
    void   df_init();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   680
    bool   has_post_order() const { return _post_order >= 0; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   681
    void   set_post_order(int po) { assert(!has_post_order() && po >= 0, ""); _post_order = po; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   682
    void   reset_post_order(int o){ _post_order = o; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   683
    int    post_order() const     { assert(has_post_order(), ""); return _post_order; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   684
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   685
    bool   has_rpo() const        { return has_post_order() && outer()->have_block_count(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   686
    int    rpo() const            { assert(has_rpo(), ""); return outer()->block_count() - post_order() - 1; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   687
    void   set_rpo_next(Block* b) { _rpo_next = b; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   688
    Block* rpo_next()             { return _rpo_next; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   689
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   690
    // Loops
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   691
    Loop*  loop() const                  { return _loop; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   692
    void   set_loop(Loop* lp)            { _loop = lp; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   693
    bool   is_loop_head() const          { return _loop && _loop->head() == this; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   694
    void   set_irreducible_entry(bool c) { _irreducible_entry = c; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   695
    bool   is_irreducible_entry() const  { return _irreducible_entry; }
11445
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   696
    void   set_has_monitorenter()        { _has_monitorenter = true; }
3c768dca60f5 7125896: Eliminate nested locks
kvn
parents: 9103
diff changeset
   697
    bool   has_monitorenter() const      { return _has_monitorenter; }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   698
    bool   is_visited() const            { return has_pre_order(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   699
    bool   is_post_visited() const       { return has_post_order(); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   700
    bool   is_clonable_exit(Loop* lp);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   701
    Block* looping_succ(Loop* lp);       // Successor inside of loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   702
    bool   is_single_entry_loop_head() const {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   703
      if (!is_loop_head()) return false;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   704
      for (Loop* lp = loop(); lp != NULL && lp->head() == this; lp = lp->parent())
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   705
        if (lp->is_irreducible()) return false;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   706
      return true;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   707
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    void   print_value_on(outputStream* st) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    void   print_on(outputStream* st) const       PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   713
  // Loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   714
  class Loop : public ResourceObj {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   715
  private:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   716
    Loop* _parent;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   717
    Loop* _sibling;  // List of siblings, null terminated
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   718
    Loop* _child;    // Head of child list threaded thru sibling pointer
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   719
    Block* _head;    // Head of loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   720
    Block* _tail;    // Tail of loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   721
    bool   _irreducible;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   722
    LocalSet _def_locals;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   723
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   724
  public:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   725
    Loop(Block* head, Block* tail) :
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   726
      _head(head),   _tail(tail),
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   727
      _parent(NULL), _sibling(NULL), _child(NULL),
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   728
      _irreducible(false), _def_locals() {}
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   729
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   730
    Loop* parent()  const { return _parent; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   731
    Loop* sibling() const { return _sibling; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   732
    Loop* child()   const { return _child; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   733
    Block* head()   const { return _head; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   734
    Block* tail()   const { return _tail; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   735
    void set_parent(Loop* p)  { _parent = p; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   736
    void set_sibling(Loop* s) { _sibling = s; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   737
    void set_child(Loop* c)   { _child = c; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   738
    void set_head(Block* hd)  { _head = hd; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   739
    void set_tail(Block* tl)  { _tail = tl; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   740
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   741
    int depth() const;              // nesting depth
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   742
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   743
    // Returns true if lp is a nested loop or us.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   744
    bool contains(Loop* lp) const;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   745
    bool contains(Block* blk) const { return contains(blk->loop()); }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   746
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   747
    // Data flow on locals
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   748
    LocalSet* def_locals() { return &_def_locals; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   749
    const LocalSet* def_locals() const { return &_def_locals; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   750
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   751
    // Merge the branch lp into this branch, sorting on the loop head
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   752
    // pre_orders. Returns the new branch.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   753
    Loop* sorted_merge(Loop* lp);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   754
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   755
    // Mark non-single entry to loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   756
    void set_irreducible(Block* entry) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   757
      _irreducible = true;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   758
      entry->set_irreducible_entry(true);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   759
    }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   760
    bool is_irreducible() const { return _irreducible; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   761
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   762
    bool is_root() const { return _tail->pre_order() == max_jint; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   763
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   764
    void print(outputStream* st = tty, int indent = 0) const PRODUCT_RETURN;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   765
  };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   766
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   767
  // Postorder iteration over the loop tree.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   768
  class PostorderLoops : public StackObj {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   769
  private:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   770
    Loop* _root;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   771
    Loop* _current;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   772
  public:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   773
    PostorderLoops(Loop* root) : _root(root), _current(root) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   774
      while (_current->child() != NULL) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   775
        _current = _current->child();
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   776
      }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   777
    }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   778
    bool done() { return _current == NULL; }  // Finished iterating?
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   779
    void next();                            // Advance to next loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   780
    Loop* current() { return _current; }      // Return current loop.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   781
  };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   782
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   783
  // Preorder iteration over the loop tree.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   784
  class PreorderLoops : public StackObj {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   785
  private:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   786
    Loop* _root;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   787
    Loop* _current;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   788
  public:
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   789
    PreorderLoops(Loop* root) : _root(root), _current(root) {}
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   790
    bool done() { return _current == NULL; }  // Finished iterating?
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   791
    void next();                            // Advance to next loop
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   792
    Loop* current() { return _current; }      // Return current loop.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   793
  };
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   794
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  // Standard indexes of successors, for various bytecodes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    FALL_THROUGH   = 0,  // normal control
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
    IF_NOT_TAKEN   = 0,  // the not-taken branch of an if (i.e., fall-through)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
    IF_TAKEN       = 1,  // the taken branch of an if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    GOTO_TARGET    = 0,  // unique successor for goto, jsr, or ret
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
    SWITCH_DEFAULT = 0,  // default branch of a switch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
    SWITCH_CASES   = 1   // first index for any non-default switch branches
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    // Unlike in other blocks, the successors of a switch are listed uniquely.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  // A mapping from pre_order to Blocks.  This array is created
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  // only at the end of the flow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  Block** _block_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  // For each ciBlock index, a list of Blocks which share this ciBlock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  GrowableArray<Block*>** _idx_to_blocklist;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  // count of ciBlocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  int _ciblock_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  // Tells if a given instruction is able to generate an exception edge.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  bool can_trap(ciBytecodeStream& str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   819
  // Clone the loop heads. Returns true if any cloning occurred.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   820
  bool clone_loop_heads(Loop* lp, StateVector* temp_vector, JsrSet* temp_set);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   821
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   822
  // Clone lp's head and replace tail's successors with clone.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   823
  Block* clone_loop_head(Loop* lp, StateVector* temp_vector, JsrSet* temp_set);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   824
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  // Return the block beginning at bci which has a JsrSet compatible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // with jsrs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  Block* block_at(int bci, JsrSet* set, CreateOption option = create_public_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  // block factory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  Block* get_block_for(int ciBlockIndex, JsrSet* jsrs, CreateOption option = create_public_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   833
  // How many of the blocks have the backedge_copy bit set?
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   834
  int backedge_copy_count(int ciBlockIndex, JsrSet* jsrs) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  // Return an existing block containing bci which has a JsrSet compatible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  // with jsrs, or NULL if there is none.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  Block* existing_block_at(int bci, JsrSet* set) { return block_at(bci, set, no_create); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  // Tell whether the flow analysis has encountered an error of some sort.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  bool failing() { return env()->failing() || _failure_reason != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  // Reason this compilation is failing, such as "too many basic blocks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  const char* failure_reason() { return _failure_reason; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  // Note a failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  void record_failure(const char* reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  // Return the block of a given pre-order number.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  int have_block_count() const      { return _block_map != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  int block_count() const           { assert(have_block_count(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
                                      return _next_pre_order; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  Block* pre_order_at(int po) const { assert(0 <= po && po < block_count(), "out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
                                      return _block_map[po]; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  Block* start_block() const        { return pre_order_at(start_block_num()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  int start_block_num() const       { return 0; }
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   857
  Block* rpo_at(int rpo) const      { assert(0 <= rpo && rpo < block_count(), "out of bounds");
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   858
                                      return _block_map[rpo]; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   859
  int next_pre_order()              { return _next_pre_order; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   860
  int inc_next_pre_order()          { return _next_pre_order++; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  // A work list used during flow analysis.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  Block* _work_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   866
  // List of blocks in reverse post order
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   867
  Block* _rpo_list;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   868
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  // Next Block::_pre_order.  After mapping, doubles as block_count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  int _next_pre_order;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  // Are there more blocks on the work list?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  bool work_list_empty() { return _work_list == NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  // Get the next basic block from our work list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  Block* work_list_next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
  // Add a basic block to our work list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  void add_to_work_list(Block* block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   881
  // Prepend a basic block to rpo list.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   882
  void prepend_to_rpo_list(Block* blk) {
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   883
    blk->set_rpo_next(_rpo_list);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   884
    _rpo_list = blk;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   885
  }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   886
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   887
  // Root of the loop tree
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   888
  Loop* _loop_tree_root;
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   889
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  // State used for make_jsr_record
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  int _jsr_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  GrowableArray<JsrRecord*>* _jsr_records;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  // Make a JsrRecord for a given (entry, return) pair, if such a record
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  // does not already exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  JsrRecord* make_jsr_record(int entry_address, int return_address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   899
  void  set_loop_tree_root(Loop* ltr) { _loop_tree_root = ltr; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   900
  Loop* loop_tree_root()              { return _loop_tree_root; }
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   901
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // Get the initial state for start_bci:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  const StateVector* get_start_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  // Merge the current state into all exceptional successors at the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  // current point in the code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  void flow_exceptions(GrowableArray<Block*>* exceptions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
                       GrowableArray<ciInstanceKlass*>* exc_klasses,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
                       StateVector* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  // Merge the current state into all successors at the current point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  // in the code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  void flow_successors(GrowableArray<Block*>* successors,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
                       StateVector* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  // Interpret the effects of the bytecodes on the incoming state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  // vector of a basic block.  Push the changed state to succeeding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  // basic blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  void flow_block(Block* block,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
                  StateVector* scratch_state,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
                  JsrSet* scratch_jsrs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  // Perform the type flow analysis, creating and cloning Blocks as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  // necessary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  void flow_types();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   928
  // Perform the depth first type flow analysis. Helper for flow_types.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   929
  void df_flow_types(Block* start,
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   930
                     bool do_flow,
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   931
                     StateVector* temp_vector,
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   932
                     JsrSet* temp_set);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   933
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   934
  // Incrementally build loop tree.
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   935
  void build_loop_tree(Block* blk);
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   936
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  // Create the block map, which indexes blocks in pre_order.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  void map_blocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  // Perform type inference flow analysis.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  void do_flow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  void print_on(outputStream* st) const PRODUCT_RETURN;
1399
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   945
9648dfd4ce09 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 1065
diff changeset
   946
  void rpo_print_on(outputStream* st) const PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   948
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   949
#endif // SHARE_VM_CI_CITYPEFLOW_HPP