hotspot/src/share/vm/c1/c1_Instruction.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7427 d7b79a367474
child 8065 7ca689ce3d32
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5334
diff changeset
     2
 * Copyright (c) 1999, 2010, 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: 5334
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5334
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: 5334
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: 7100
diff changeset
    25
#ifndef SHARE_VM_C1_C1_INSTRUCTION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    26
#define SHARE_VM_C1_C1_INSTRUCTION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    28
#include "c1/c1_Compilation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    29
#include "c1/c1_LIR.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    30
#include "c1/c1_ValueType.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    31
#include "ci/ciField.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Predefined classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class ciField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class ValueStack;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class InstructionPrinter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class IRScope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class LIR_OprDesc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
typedef LIR_OprDesc* LIR_Opr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// Instruction class hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// All leaf classes in the class hierarchy are concrete classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// (i.e., are instantiated). All other classes are abstract and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// serve factoring.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
class Instruction;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
class   Phi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class   Local;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
class   Constant;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
class   AccessField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class     LoadField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class     StoreField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class   AccessArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
class     ArrayLength;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
class     AccessIndexed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
class       LoadIndexed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
class       StoreIndexed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class   NegateOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
class   Op2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
class     ArithmeticOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
class     ShiftOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
class     LogicOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
class     CompareOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
class     IfOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
class   Convert;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
class   NullCheck;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
class   OsrEntry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
class   ExceptionObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
class   StateSplit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
class     Invoke;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
class     NewInstance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
class     NewArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
class       NewTypeArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
class       NewObjectArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
class       NewMultiArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
class     TypeCheck;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
class       CheckCast;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
class       InstanceOf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
class     AccessMonitor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
class       MonitorEnter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
class       MonitorExit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
class     Intrinsic;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
class     BlockBegin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
class     BlockEnd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
class       Goto;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
class       If;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
class       IfInstanceOf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
class       Switch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
class         TableSwitch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
class         LookupSwitch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
class       Return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
class       Throw;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
class       Base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
class   RoundFP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
class   UnsafeOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
class     UnsafeRawOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
class       UnsafeGetRaw;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
class       UnsafePutRaw;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
class     UnsafeObjectOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
class       UnsafeGetObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
class       UnsafePutObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
class       UnsafePrefetch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
class         UnsafePrefetchRead;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
class         UnsafePrefetchWrite;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
class   ProfileCall;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   108
class   ProfileInvoke;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// A Value is a reference to the instruction creating the value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
typedef Instruction* Value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
define_array(ValueArray, Value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
define_stack(Values, ValueArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
define_array(ValueStackArray, ValueStack*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
define_stack(ValueStackStack, ValueStackArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
// BlockClosure is the base class for block traversal/iteration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
class BlockClosure: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  virtual void block_do(BlockBegin* block)       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   126
// A simple closure class for visiting the values of an Instruction
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   127
class ValueVisitor: public StackObj {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   128
 public:
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   129
  virtual void visit(Value* v) = 0;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   130
};
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   131
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   132
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
// Some array and list classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
define_array(BlockBeginArray, BlockBegin*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
define_stack(_BlockList, BlockBeginArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
class BlockList: public _BlockList {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  BlockList(): _BlockList() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  BlockList(const int size): _BlockList(size) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  BlockList(const int size, BlockBegin* init): _BlockList(size, init) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  void iterate_forward(BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  void iterate_backward(BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  void blocks_do(void f(BlockBegin*));
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   146
  void values_do(ValueVisitor* f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  void print(bool cfg_only = false, bool live_only = false) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
// InstructionVisitors provide type-based dispatch for instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
// For each concrete Instruction class X, a virtual function do_X is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
// provided. Functionality that needs to be implemented for all classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
// (e.g., printing, code generation) is factored out into a specialised
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
// visitor instead of added to the Instruction classes itself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
class InstructionVisitor: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  virtual void do_Phi            (Phi*             x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  virtual void do_Local          (Local*           x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  virtual void do_Constant       (Constant*        x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  virtual void do_LoadField      (LoadField*       x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  virtual void do_StoreField     (StoreField*      x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  virtual void do_ArrayLength    (ArrayLength*     x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  virtual void do_LoadIndexed    (LoadIndexed*     x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  virtual void do_StoreIndexed   (StoreIndexed*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  virtual void do_NegateOp       (NegateOp*        x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  virtual void do_ArithmeticOp   (ArithmeticOp*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  virtual void do_ShiftOp        (ShiftOp*         x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  virtual void do_LogicOp        (LogicOp*         x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  virtual void do_CompareOp      (CompareOp*       x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  virtual void do_IfOp           (IfOp*            x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  virtual void do_Convert        (Convert*         x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  virtual void do_NullCheck      (NullCheck*       x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  virtual void do_Invoke         (Invoke*          x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  virtual void do_NewInstance    (NewInstance*     x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  virtual void do_NewTypeArray   (NewTypeArray*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  virtual void do_NewObjectArray (NewObjectArray*  x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  virtual void do_NewMultiArray  (NewMultiArray*   x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  virtual void do_CheckCast      (CheckCast*       x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  virtual void do_InstanceOf     (InstanceOf*      x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  virtual void do_MonitorEnter   (MonitorEnter*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  virtual void do_MonitorExit    (MonitorExit*     x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  virtual void do_Intrinsic      (Intrinsic*       x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  virtual void do_BlockBegin     (BlockBegin*      x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  virtual void do_Goto           (Goto*            x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  virtual void do_If             (If*              x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  virtual void do_IfInstanceOf   (IfInstanceOf*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  virtual void do_TableSwitch    (TableSwitch*     x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  virtual void do_LookupSwitch   (LookupSwitch*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  virtual void do_Return         (Return*          x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  virtual void do_Throw          (Throw*           x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  virtual void do_Base           (Base*            x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  virtual void do_OsrEntry       (OsrEntry*        x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  virtual void do_ExceptionObject(ExceptionObject* x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  virtual void do_RoundFP        (RoundFP*         x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  virtual void do_UnsafeGetRaw   (UnsafeGetRaw*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  virtual void do_UnsafePutRaw   (UnsafePutRaw*    x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  virtual void do_UnsafeGetObject(UnsafeGetObject* x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  virtual void do_UnsafePutObject(UnsafePutObject* x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  virtual void do_UnsafePrefetchRead (UnsafePrefetchRead*  x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  virtual void do_ProfileCall    (ProfileCall*     x) = 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
   204
  virtual void do_ProfileInvoke  (ProfileInvoke*   x) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// Hashing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
// Note: This hash functions affect the performance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
//       of ValueMap - make changes carefully!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
#define HASH1(x1            )                    ((intx)(x1))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
#define HASH2(x1, x2        )                    ((HASH1(x1        ) << 7) ^ HASH1(x2))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
#define HASH3(x1, x2, x3    )                    ((HASH2(x1, x2    ) << 7) ^ HASH1(x3))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
#define HASH4(x1, x2, x3, x4)                    ((HASH3(x1, x2, x3) << 7) ^ HASH1(x4))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
// The following macros are used to implement instruction-specific hashing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
// By default, each instruction implements hash() and is_equal(Value), used
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
// for value numbering/common subexpression elimination. The default imple-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
// mentation disables value numbering. Each instruction which can be value-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
// numbered, should define corresponding hash() and is_equal(Value) functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
// via the macros below. The f arguments specify all the values/op codes, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
// that need to be identical for two instructions to be identical.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
// Note: The default implementation of hash() returns 0 in order to indicate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
//       that the instruction should not be considered for value numbering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
//       The currently used hash functions do not guarantee that never a 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
//       is produced. While this is still correct, it may be a performance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
//       bug (no value numbering for that node). However, this situation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
//       so unlikely, that we are not going to handle it specially.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
#define HASHING1(class_name, enabled, f1)             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  virtual intx hash() const {                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    return (enabled) ? HASH2(name(), f1) : 0;         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  virtual bool is_equal(Value v) const {              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    if (!(enabled)  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    class_name* _v = v->as_##class_name();            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    if (_v == NULL  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    if (f1 != _v->f1) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    return true;                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
#define HASHING2(class_name, enabled, f1, f2)         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  virtual intx hash() const {                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    return (enabled) ? HASH3(name(), f1, f2) : 0;     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  virtual bool is_equal(Value v) const {              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    if (!(enabled)  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    class_name* _v = v->as_##class_name();            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    if (_v == NULL  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    if (f1 != _v->f1) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
    if (f2 != _v->f2) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    return true;                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
#define HASHING3(class_name, enabled, f1, f2, f3)     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  virtual intx hash() const {                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    return (enabled) ? HASH4(name(), f1, f2, f3) : 0; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  virtual bool is_equal(Value v) const {              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    if (!(enabled)  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    class_name* _v = v->as_##class_name();            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    if (_v == NULL  ) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    if (f1 != _v->f1) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    if (f2 != _v->f2) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    if (f3 != _v->f3) return false;                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    return true;                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  }                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
// The mother of all instructions...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
class Instruction: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  int          _id;                              // the unique instruction id
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   281
#ifndef PRODUCT
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   282
  int          _printable_bci;                   // the bci of the instruction for printing
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   283
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  int          _use_count;                       // the number of instructions refering to this value (w/o prev/next); only roots can have use count = 0 or > 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  int          _pin_state;                       // set of PinReason describing the reason for pinning
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  ValueType*   _type;                            // the instruction value type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  Instruction* _next;                            // the next instruction if any (NULL for BlockEnd instructions)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  Instruction* _subst;                           // the substitution instruction if any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  LIR_Opr      _operand;                         // LIR specific information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  unsigned int _flags;                           // Flag bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   292
  ValueStack*  _state_before;                    // Copy of state with input operands still on stack (or NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   293
  ValueStack*  _exception_state;                 // Copy of state for exception handling
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  XHandlers*   _exception_handlers;              // Flat list of exception handlers covering this instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  friend class UseCountComputer;
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   297
  friend class BlockBegin;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   299
  void update_exception_state(ValueStack* state);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   300
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   301
  bool has_printable_bci() const                 { return NOT_PRODUCT(_printable_bci != -99) PRODUCT_ONLY(false); }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   302
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  void set_type(ValueType* type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    assert(type != NULL, "type must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    _type = type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
 public:
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   310
  void* operator new(size_t size) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   311
    Compilation* c = Compilation::current();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   312
    void* res = c->arena()->Amalloc(size);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   313
    ((Instruction*)res)->_id = c->get_next_id();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   314
    return res;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   315
  }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   316
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  enum InstructionFlag {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    NeedsNullCheckFlag = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    CanTrapFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    DirectCompareFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    IsEliminatedFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    IsInitializedFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    IsLoadedFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    IsSafepointFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    IsStaticFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    IsStrictfpFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    NeedsStoreCheckFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    NeedsWriteBarrierFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    PreservesStateFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    TargetIsFinalFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    TargetIsLoadedFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    TargetIsStrictfpFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    UnorderedIsTrueFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    NeedsPatchingFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    ThrowIncompatibleClassChangeErrorFlag,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    ProfileMDOFlag,
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   337
    IsLinkedInBlockFlag,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    InstructionLastFlag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  bool check_flag(InstructionFlag id) const      { return (_flags & (1 << id)) != 0;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  void set_flag(InstructionFlag id, bool f)      { _flags = f ? (_flags | (1 << id)) : (_flags & ~(1 << id)); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // 'globally' used condition values
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  enum Condition {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
    eql, neq, lss, leq, gtr, geq
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // Instructions may be pinned for many reasons and under certain conditions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  // with enough knowledge it's possible to safely unpin them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  enum PinReason {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
      PinUnknown           = 1 << 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    , PinExplicitNullCheck = 1 << 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    , PinStackForStateSplit= 1 << 12
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    , PinStateSplitConstructor= 1 << 13
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    , PinGlobalValueNumbering= 1 << 14
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  static Condition mirror(Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  static Condition negate(Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // initialization
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   364
  static int number_of_instructions() {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   365
    return Compilation::current()->number_of_instructions();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   366
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // creation
6750
b84813b41757 6988303: 6986046 breaks build with recent gcc
roland
parents: 6745
diff changeset
   369
  Instruction(ValueType* type, ValueStack* state_before = NULL, bool type_is_constant = false)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   370
  : _use_count(0)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   371
#ifndef PRODUCT
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   372
  , _printable_bci(-99)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   373
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  , _pin_state(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  , _next(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  , _subst(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  , _flags(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  , _operand(LIR_OprFact::illegalOpr)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   380
  , _state_before(state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  , _exception_handlers(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  {
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   383
    check_state(state_before);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    assert(type != NULL && (!type->is_constant() || type_is_constant), "type must exist");
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   385
    update_exception_state(_state_before);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  int id() const                                 { return _id; }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   390
#ifndef PRODUCT
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   391
  int printable_bci() const                      { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   392
  void set_printable_bci(int bci)                { NOT_PRODUCT(_printable_bci = bci;) }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   393
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  int use_count() const                          { return _use_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  int pin_state() const                          { return _pin_state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  bool is_pinned() const                         { return _pin_state != 0 || PinAllInstructions; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  ValueType* type() const                        { return _type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  Instruction* prev(BlockBegin* block);          // use carefully, expensive operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  Instruction* next() const                      { return _next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  bool has_subst() const                         { return _subst != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  Instruction* subst()                           { return _subst == NULL ? this : _subst->subst(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  LIR_Opr operand() const                        { return _operand; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  void set_needs_null_check(bool f)              { set_flag(NeedsNullCheckFlag, f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  bool needs_null_check() const                  { return check_flag(NeedsNullCheckFlag); }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   406
  bool is_linked() const                         { return check_flag(IsLinkedInBlockFlag); }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   407
  bool can_be_linked()                           { return as_Local() == NULL && as_Phi() == NULL; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  bool has_uses() const                          { return use_count() > 0; }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   410
  ValueStack* state_before() const               { return _state_before; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   411
  ValueStack* exception_state() const            { return _exception_state; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   412
  virtual bool needs_exception_state() const     { return true; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  XHandlers* exception_handlers() const          { return _exception_handlers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  void pin(PinReason reason)                     { _pin_state |= reason; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  void pin()                                     { _pin_state |= PinUnknown; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // DANGEROUS: only used by EliminateStores
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  void unpin(PinReason reason)                   { assert((reason & PinUnknown) == 0, "can't unpin unknown state"); _pin_state &= ~reason; }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   420
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   421
  Instruction* set_next(Instruction* next) {
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   422
    assert(next->has_printable_bci(), "_printable_bci should have been set");
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   423
    assert(next != NULL, "must not be NULL");
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   424
    assert(as_BlockEnd() == NULL, "BlockEnd instructions must have no next");
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   425
    assert(next->can_be_linked(), "shouldn't link these instructions into list");
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   426
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   427
    next->set_flag(Instruction::IsLinkedInBlockFlag, true);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   428
    _next = next;
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   429
    return next;
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   430
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  Instruction* set_next(Instruction* next, int bci) {
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   433
#ifndef PRODUCT
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   434
    next->set_printable_bci(bci);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   435
#endif
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   436
    return set_next(next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  void set_subst(Instruction* subst)             {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    assert(subst == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
           type()->base() == subst->type()->base() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
           subst->type()->base() == illegalType, "type can't change");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
    _subst = subst;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  void set_exception_handlers(XHandlers *xhandlers) { _exception_handlers = xhandlers; }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   446
  void set_exception_state(ValueStack* s)        { check_state(s); _exception_state = s; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // machine-specifics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  void set_operand(LIR_Opr operand)              { assert(operand != LIR_OprFact::illegalOpr, "operand must exist"); _operand = operand; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  void clear_operand()                           { _operand = LIR_OprFact::illegalOpr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  virtual Instruction*      as_Instruction()     { return this; } // to satisfy HASHING1 macro
7100
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   454
  virtual Phi*              as_Phi()             { return NULL; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  virtual Local*            as_Local()           { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  virtual Constant*         as_Constant()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  virtual AccessField*      as_AccessField()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  virtual LoadField*        as_LoadField()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  virtual StoreField*       as_StoreField()      { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  virtual AccessArray*      as_AccessArray()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  virtual ArrayLength*      as_ArrayLength()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  virtual AccessIndexed*    as_AccessIndexed()   { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  virtual LoadIndexed*      as_LoadIndexed()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  virtual StoreIndexed*     as_StoreIndexed()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  virtual NegateOp*         as_NegateOp()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  virtual Op2*              as_Op2()             { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  virtual ArithmeticOp*     as_ArithmeticOp()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  virtual ShiftOp*          as_ShiftOp()         { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  virtual LogicOp*          as_LogicOp()         { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  virtual CompareOp*        as_CompareOp()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  virtual IfOp*             as_IfOp()            { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  virtual Convert*          as_Convert()         { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  virtual NullCheck*        as_NullCheck()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  virtual OsrEntry*         as_OsrEntry()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  virtual StateSplit*       as_StateSplit()      { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  virtual Invoke*           as_Invoke()          { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  virtual NewInstance*      as_NewInstance()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  virtual NewArray*         as_NewArray()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  virtual NewTypeArray*     as_NewTypeArray()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  virtual NewObjectArray*   as_NewObjectArray()  { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  virtual NewMultiArray*    as_NewMultiArray()   { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  virtual TypeCheck*        as_TypeCheck()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  virtual CheckCast*        as_CheckCast()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  virtual InstanceOf*       as_InstanceOf()      { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  virtual AccessMonitor*    as_AccessMonitor()   { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  virtual MonitorEnter*     as_MonitorEnter()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  virtual MonitorExit*      as_MonitorExit()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  virtual Intrinsic*        as_Intrinsic()       { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  virtual BlockBegin*       as_BlockBegin()      { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  virtual BlockEnd*         as_BlockEnd()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  virtual Goto*             as_Goto()            { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  virtual If*               as_If()              { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  virtual IfInstanceOf*     as_IfInstanceOf()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  virtual TableSwitch*      as_TableSwitch()     { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  virtual LookupSwitch*     as_LookupSwitch()    { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  virtual Return*           as_Return()          { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  virtual Throw*            as_Throw()           { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  virtual Base*             as_Base()            { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  virtual RoundFP*          as_RoundFP()         { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  virtual ExceptionObject*  as_ExceptionObject() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  virtual UnsafeOp*         as_UnsafeOp()        { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  virtual void visit(InstructionVisitor* v)      = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  virtual bool can_trap() const                  { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   507
  virtual void input_values_do(ValueVisitor* f)   = 0;
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   508
  virtual void state_values_do(ValueVisitor* f);
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   509
  virtual void other_values_do(ValueVisitor* f)   { /* usually no other - override on demand */ }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   510
          void       values_do(ValueVisitor* f)   { input_values_do(f); state_values_do(f); other_values_do(f); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  virtual ciType* exact_type() const             { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  virtual ciType* declared_type() const          { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  // hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  virtual const char* name() const               = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  HASHING1(Instruction, false, id())             // hashing disabled by default
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // debugging
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   520
  static void check_state(ValueStack* state)     PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  void print()                                   PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  void print_line()                              PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  void print(InstructionPrinter& ip)             PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
// The following macros are used to define base (i.e., non-leaf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
// and leaf instruction classes. They define class-name related
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
// generic functionality in one place.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
#define BASE(class_name, super_class_name)       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  class class_name: public super_class_name {    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
   public:                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    virtual class_name* as_##class_name()        { return this; }              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
#define LEAF(class_name, super_class_name)       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  BASE(class_name, super_class_name)             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
   public:                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    virtual const char* name() const             { return #class_name; }       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    virtual void visit(InstructionVisitor* v)    { v->do_##class_name(this); } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
// Debugging support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   546
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
#ifdef ASSERT
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   548
class AssertValues: public ValueVisitor {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   549
  void visit(Value* x)             { assert((*x) != NULL, "value must exist"); }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   550
};
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   551
  #define ASSERT_VALUES                          { AssertValues assert_value; values_do(&assert_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  #define ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
// A Phi is a phi function in the sense of SSA form. It stands for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
// the value of a local variable at the beginning of a join block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
// A Phi consists of n operands, one for every incoming branch.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
LEAF(Phi, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  BlockBegin* _block;    // the block to which the phi function belongs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  int         _pf_flags; // the flags of the phi function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  int         _index;    // to value on operand stack (index < 0) or to local
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  Phi(ValueType* type, BlockBegin* b, int index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  : Instruction(type->base())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  , _pf_flags(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  , _block(b)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    if (type->is_illegal()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
      make_illegal();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  // flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  enum Flag {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    no_flag         = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    visited         = 1 << 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    cannot_simplify = 1 << 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  bool  is_local() const          { return _index >= 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  bool  is_on_stack() const       { return !is_local(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  int   local_index() const       { assert(is_local(), ""); return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  int   stack_index() const       { assert(is_on_stack(), ""); return -(_index+1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  Value operand_at(int i) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  int   operand_count() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  BlockBegin* block() const       { return _block; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  void   set(Flag f)              { _pf_flags |=  f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  void   clear(Flag f)            { _pf_flags &= ~f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  bool   is_set(Flag f) const     { return (_pf_flags & f) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  // Invalidates phis corresponding to merges of locals of two different types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  // (these should never be referenced, otherwise the bytecodes are illegal)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  void   make_illegal() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
    set(cannot_simplify);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
    set_type(illegalType);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  bool is_illegal() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
    return type()->is_illegal();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   613
  virtual void input_values_do(ValueVisitor* f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
// A local is a placeholder for an incoming argument to a function call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
LEAF(Local, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  int      _java_index;                          // the local index within the method to which the local belongs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  Local(ValueType* type, int index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    : Instruction(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    , _java_index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  int java_index() const                         { return _java_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   633
  virtual void input_values_do(ValueVisitor* f)   { /* no values */ }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
LEAF(Constant, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  Constant(ValueType* type):
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   641
      Instruction(type, NULL, true)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   642
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
    assert(type->is_constant(), "must be a constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   646
  Constant(ValueType* type, ValueStack* state_before):
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   647
    Instruction(type, state_before, true)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   648
  {
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   649
    assert(state_before != NULL, "only used for constants which need patching");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
    assert(type->is_constant(), "must be a constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
    // since it's patching it needs to be pinned
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   655
  virtual bool can_trap() const                  { return state_before() != NULL; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   656
  virtual void input_values_do(ValueVisitor* f)   { /* no values */ }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  virtual intx hash() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  virtual bool is_equal(Value v) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
7100
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   661
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   662
  enum CompareResult { not_comparable = -1, cond_false, cond_true };
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   663
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   664
  virtual CompareResult compare(Instruction::Condition condition, Value right) const;
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   665
  BlockBegin* compare(Instruction::Condition cond, Value right,
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   666
                      BlockBegin* true_sux, BlockBegin* false_sux) const {
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   667
    switch (compare(cond, right)) {
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   668
    case not_comparable:
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   669
      return NULL;
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   670
    case cond_false:
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   671
      return false_sux;
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   672
    case cond_true:
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   673
      return true_sux;
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   674
    default:
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   675
      ShouldNotReachHere();
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   676
      return NULL;
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   677
    }
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6751
diff changeset
   678
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
BASE(AccessField, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  Value       _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  int         _offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  ciField*    _field;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  NullCheck*  _explicit_null_check;              // For explicit null check elimination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   691
  AccessField(Value obj, int offset, ciField* field, bool is_static,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
              ValueStack* state_before, bool is_loaded, bool is_initialized)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   693
  : Instruction(as_ValueType(field->type()->basic_type()), state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  , _obj(obj)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  , _offset(offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  , _field(field)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  , _explicit_null_check(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
    set_needs_null_check(!is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    set_flag(IsLoadedFlag, is_loaded);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    set_flag(IsInitializedFlag, is_initialized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
    set_flag(IsStaticFlag, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
      if (!is_loaded || (PatchALot && !field->is_volatile())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
      // need to patch if the holder wasn't loaded or we're testing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
      // using PatchALot.  Don't allow PatchALot for fields which are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
      // known to be volatile they aren't patchable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
      set_flag(NeedsPatchingFlag, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    // pin of all instructions with memory access
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  Value obj() const                              { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  int offset() const                             { return _offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  ciField* field() const                         { return _field; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  BasicType field_type() const                   { return _field->type()->basic_type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  bool is_static() const                         { return check_flag(IsStaticFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  bool is_loaded() const                         { return check_flag(IsLoadedFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  bool is_initialized() const                    { return check_flag(IsInitializedFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  NullCheck* explicit_null_check() const         { return _explicit_null_check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  bool needs_patching() const                    { return check_flag(NeedsPatchingFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  // manipulation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   726
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  // Under certain circumstances, if a previous NullCheck instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // proved the target object non-null, we can eliminate the explicit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // null check and do an implicit one, simply specifying the debug
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  // information from the NullCheck. This field should only be consulted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  // if needs_null_check() is true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  virtual bool can_trap() const                  { return needs_null_check() || needs_patching(); }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   736
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_obj); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
LEAF(LoadField, AccessField)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   743
  LoadField(Value obj, int offset, ciField* field, bool is_static,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
            ValueStack* state_before, bool is_loaded, bool is_initialized)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   745
  : AccessField(obj, offset, field, is_static, state_before, is_loaded, is_initialized)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  ciType* declared_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  HASHING2(LoadField, is_loaded() && !field()->is_volatile(), obj()->subst(), offset())  // cannot be eliminated if not yet loaded or if volatile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
LEAF(StoreField, AccessField)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  Value _value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   762
  StoreField(Value obj, int offset, ciField* field, Value value, bool is_static,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
             ValueStack* state_before, bool is_loaded, bool is_initialized)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   764
  : AccessField(obj, offset, field, is_static, state_before, is_loaded, is_initialized)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  , _value(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    set_flag(NeedsWriteBarrierFlag, as_ValueType(field_type())->is_object());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  Value value() const                            { return _value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  bool needs_write_barrier() const               { return check_flag(NeedsWriteBarrierFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   777
  virtual void input_values_do(ValueVisitor* f)   { AccessField::input_values_do(f); f->visit(&_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
BASE(AccessArray, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  Value       _array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   787
  AccessArray(ValueType* type, Value array, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   788
  : Instruction(type, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  , _array(array)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   790
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    set_needs_null_check(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
    pin(); // instruction with side effect (null exception or range check throwing)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  Value array() const                            { return _array; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  virtual bool can_trap() const                  { return needs_null_check(); }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   800
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_array); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
LEAF(ArrayLength, AccessArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  NullCheck*  _explicit_null_check;              // For explicit null check elimination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   810
  ArrayLength(Value array, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   811
  : AccessArray(intType, array, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  , _explicit_null_check(NULL) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  NullCheck* explicit_null_check() const         { return _explicit_null_check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // setters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  // See LoadField::set_explicit_null_check for documentation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  HASHING1(ArrayLength, true, array()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
BASE(AccessIndexed, AccessArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  Value     _index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  Value     _length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  BasicType _elt_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   834
  AccessIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   835
  : AccessArray(as_ValueType(elt_type), array, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  , _length(length)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  , _elt_type(elt_type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  Value index() const                            { return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  Value length() const                           { return _length; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  BasicType elt_type() const                     { return _elt_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // perform elimination of range checks involving constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  bool compute_needs_range_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   852
  virtual void input_values_do(ValueVisitor* f)   { AccessArray::input_values_do(f); f->visit(&_index); if (_length != NULL) f->visit(&_length); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
LEAF(LoadIndexed, AccessIndexed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  NullCheck*  _explicit_null_check;              // For explicit null check elimination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   862
  LoadIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   863
  : AccessIndexed(array, index, length, elt_type, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  , _explicit_null_check(NULL) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  NullCheck* explicit_null_check() const         { return _explicit_null_check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  // setters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  // See LoadField::set_explicit_null_check for documentation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  ciType* declared_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  HASHING2(LoadIndexed, true, array()->subst(), index()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
LEAF(StoreIndexed, AccessIndexed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  Value       _value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   885
  ciMethod* _profiled_method;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   886
  int       _profiled_bci;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   889
  StoreIndexed(Value array, Value index, Value length, BasicType elt_type, Value value, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   890
  : AccessIndexed(array, index, length, elt_type, state_before)
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   891
  , _value(value), _profiled_method(NULL), _profiled_bci(0)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
    set_flag(NeedsWriteBarrierFlag, (as_ValueType(elt_type)->is_object()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
    set_flag(NeedsStoreCheckFlag, (as_ValueType(elt_type)->is_object()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  Value value() const                            { return _value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  bool needs_write_barrier() const               { return check_flag(NeedsWriteBarrierFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  bool needs_store_check() const                 { return check_flag(NeedsStoreCheckFlag); }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   903
  // Helpers for methodDataOop profiling
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   904
  void set_should_profile(bool value)                { set_flag(ProfileMDOFlag, value); }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   905
  void set_profiled_method(ciMethod* method)         { _profiled_method = method;   }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   906
  void set_profiled_bci(int bci)                     { _profiled_bci = bci;         }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   907
  bool      should_profile() const                   { return check_flag(ProfileMDOFlag); }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   908
  ciMethod* profiled_method() const                  { return _profiled_method;     }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
   909
  int       profiled_bci() const                     { return _profiled_bci;        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   911
  virtual void input_values_do(ValueVisitor* f)   { AccessIndexed::input_values_do(f); f->visit(&_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
LEAF(NegateOp, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  Value _x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  NegateOp(Value x) : Instruction(x->type()->base()), _x(x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  Value x() const                                { return _x; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   929
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_x); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
BASE(Op2, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  Bytecodes::Code _op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  Value           _x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  Value           _y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   941
  Op2(ValueType* type, Bytecodes::Code op, Value x, Value y, ValueStack* state_before = NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   942
  : Instruction(type, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   943
  , _op(op)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   944
  , _x(x)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   945
  , _y(y)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   946
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  Bytecodes::Code op() const                     { return _op; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  Value x() const                                { return _x; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  Value y() const                                { return _y; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  // manipulators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  void swap_operands() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    assert(is_commutative(), "operation must be commutative");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
    Value t = _x; _x = _y; _y = t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  virtual bool is_commutative() const            { return false; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   963
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_x); f->visit(&_y); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
LEAF(ArithmeticOp, Op2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   970
  ArithmeticOp(Bytecodes::Code op, Value x, Value y, bool is_strictfp, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   971
  : Op2(x->type()->meet(y->type()), op, x, y, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
   972
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
    set_flag(IsStrictfpFlag, is_strictfp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
    if (can_trap()) pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  bool        is_strictfp() const                { return check_flag(IsStrictfpFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  virtual bool is_commutative() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  virtual bool can_trap() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  HASHING3(Op2, true, op(), x()->subst(), y()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
LEAF(ShiftOp, Op2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  ShiftOp(Bytecodes::Code op, Value x, Value s) : Op2(x->type()->base(), op, x, s) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  HASHING3(Op2, true, op(), x()->subst(), y()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
LEAF(LogicOp, Op2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  LogicOp(Bytecodes::Code op, Value x, Value y) : Op2(x->type()->meet(y->type()), op, x, y) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  virtual bool is_commutative() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  HASHING3(Op2, true, op(), x()->subst(), y()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
LEAF(CompareOp, Op2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  CompareOp(Bytecodes::Code op, Value x, Value y, ValueStack* state_before)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1012
  : Op2(intType, op, x, y, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
  HASHING3(Op2, true, op(), x()->subst(), y()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
LEAF(IfOp, Op2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  Value _tval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  Value _fval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  IfOp(Value x, Condition cond, Value y, Value tval, Value fval)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  : Op2(tval->type()->meet(fval->type()), (Bytecodes::Code)cond, x, y)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  , _tval(tval)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  , _fval(fval)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
    assert(tval->type()->tag() == fval->type()->tag(), "types must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  virtual bool is_commutative() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  Bytecodes::Code op() const                     { ShouldNotCallThis(); return Bytecodes::_illegal; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  Condition cond() const                         { return (Condition)Op2::op(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  Value tval() const                             { return _tval; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  Value fval() const                             { return _fval; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1044
  virtual void input_values_do(ValueVisitor* f)   { Op2::input_values_do(f); f->visit(&_tval); f->visit(&_fval); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
LEAF(Convert, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  Bytecodes::Code _op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  Value           _value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  Convert(Bytecodes::Code op, Value value, ValueType* to_type) : Instruction(to_type), _op(op), _value(value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  Bytecodes::Code op() const                     { return _op; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  Value value() const                            { return _value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1064
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  HASHING2(Convert, true, op(), value()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
LEAF(NullCheck, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  Value       _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1075
  NullCheck(Value obj, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1076
  : Instruction(obj->type()->base(), state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1077
  , _obj(obj)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1078
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
    set_can_trap(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
    assert(_obj->type()->is_object(), "null check must be applied to objects only");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
    pin(Instruction::PinExplicitNullCheck);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  Value obj() const                              { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  // setters
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  void set_can_trap(bool can_trap)               { set_flag(CanTrapFlag, can_trap); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  virtual bool can_trap() const                  { return check_flag(CanTrapFlag); /* null-check elimination sets to false */ }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1093
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_obj); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  HASHING1(NullCheck, true, obj()->subst())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
BASE(StateSplit, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  ValueStack* _state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  static void substitute(BlockList& list, BlockBegin* old_block, BlockBegin* new_block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1107
  StateSplit(ValueType* type, ValueStack* state_before = NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1108
  : Instruction(type, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1109
  , _state(NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1110
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    pin(PinStateSplitConstructor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  ValueStack* state() const                      { return _state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  IRScope* scope() const;                        // the state's scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  // manipulation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1119
  void set_state(ValueStack* state)              { assert(_state == NULL, "overwriting existing state"); check_state(state); _state = state; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1122
  virtual void input_values_do(ValueVisitor* f)   { /* no values */ }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1123
  virtual void state_values_do(ValueVisitor* f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
LEAF(Invoke, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
 private:
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1129
  Bytecodes::Code _code;
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1130
  Value           _recv;
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1131
  Values*         _args;
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1132
  BasicTypeList*  _signature;
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1133
  int             _vtable_index;
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1134
  ciMethod*       _target;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args,
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1139
         int vtable_index, ciMethod* target, ValueStack* state_before);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  Bytecodes::Code code() const                   { return _code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  Value receiver() const                         { return _recv; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  bool has_receiver() const                      { return receiver() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  int number_of_arguments() const                { return _args->length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  Value argument_at(int i) const                 { return _args->at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  int vtable_index() const                       { return _vtable_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  BasicTypeList* signature() const               { return _signature; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  ciMethod* target() const                       { return _target; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  // Returns false if target is not loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  bool target_is_final() const                   { return check_flag(TargetIsFinalFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  bool target_is_loaded() const                  { return check_flag(TargetIsLoadedFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  // Returns false if target is not loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  bool target_is_strictfp() const                { return check_flag(TargetIsStrictfpFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1157
  // JSR 292 support
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1158
  bool is_invokedynamic() const                  { return code() == Bytecodes::_invokedynamic; }
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1
diff changeset
  1159
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1160
  virtual bool needs_exception_state() const     { return false; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1161
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  virtual bool can_trap() const                  { return true; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1164
  virtual void input_values_do(ValueVisitor* f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    StateSplit::input_values_do(f);
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1166
    if (has_receiver()) f->visit(&_recv);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1167
    for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1169
  virtual void state_values_do(ValueVisitor *f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
LEAF(NewInstance, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  ciInstanceKlass* _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1179
  NewInstance(ciInstanceKlass* klass, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1180
  : StateSplit(instanceType, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1181
  , _klass(klass)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1182
  {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  ciInstanceKlass* klass() const                 { return _klass; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1187
  virtual bool needs_exception_state() const     { return false; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1188
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  virtual bool can_trap() const                  { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
BASE(NewArray, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  Value       _length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1201
  NewArray(Value length, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1202
  : StateSplit(objectType, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1203
  , _length(length)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1204
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    // Do not ASSERT_VALUES since length is NULL for NewMultiArray
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  Value length() const                           { return _length; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1211
  virtual bool needs_exception_state() const     { return false; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1212
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  virtual bool can_trap() const                  { return true; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1215
  virtual void input_values_do(ValueVisitor* f)   { StateSplit::input_values_do(f); f->visit(&_length); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
LEAF(NewTypeArray, NewArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  BasicType _elt_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1225
  NewTypeArray(Value length, BasicType elt_type, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1226
  : NewArray(length, state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1227
  , _elt_type(elt_type)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1228
  {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  BasicType elt_type() const                     { return _elt_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
LEAF(NewObjectArray, NewArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  ciKlass* _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  NewObjectArray(ciKlass* klass, Value length, ValueStack* state_before) : NewArray(length, state_before), _klass(klass) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  ciKlass* klass() const                         { return _klass; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
LEAF(NewMultiArray, NewArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  ciKlass* _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  Values*  _dims;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  NewMultiArray(ciKlass* klass, Values* dims, ValueStack* state_before) : NewArray(NULL, state_before), _klass(klass), _dims(dims) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
  ciKlass* klass() const                         { return _klass; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
  Values* dims() const                           { return _dims; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  int rank() const                               { return dims()->length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1267
  virtual void input_values_do(ValueVisitor* f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
    // NOTE: we do not call NewArray::input_values_do since "length"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
    // is meaningless for a multi-dimensional array; passing the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
    // zeroth element down to NewArray as its length is a bad idea
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
    // since there will be a copy in the "dims" array which doesn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
    // get updated, and the value must not be traversed twice. Was bug
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
    // - kbr 4/10/2001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    StateSplit::input_values_do(f);
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1275
    for (int i = 0; i < _dims->length(); i++) f->visit(_dims->adr_at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
BASE(TypeCheck, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
  ciKlass*    _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
  Value       _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1285
  ciMethod* _profiled_method;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1286
  int       _profiled_bci;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1287
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  // creation
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1290
  TypeCheck(ciKlass* klass, Value obj, ValueType* type, ValueStack* state_before)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1291
  : StateSplit(type, state_before), _klass(klass), _obj(obj),
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1292
    _profiled_method(NULL), _profiled_bci(0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
    set_direct_compare(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  ciKlass* klass() const                         { return _klass; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  Value obj() const                              { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
  bool is_loaded() const                         { return klass() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  bool direct_compare() const                    { return check_flag(DirectCompareFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  void set_direct_compare(bool flag)             { set_flag(DirectCompareFlag, flag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  virtual bool can_trap() const                  { return true; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1308
  virtual void input_values_do(ValueVisitor* f)   { StateSplit::input_values_do(f); f->visit(&_obj); }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1309
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1310
  // Helpers for methodDataOop profiling
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1311
  void set_should_profile(bool value)                { set_flag(ProfileMDOFlag, value); }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1312
  void set_profiled_method(ciMethod* method)         { _profiled_method = method;   }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1313
  void set_profiled_bci(int bci)                     { _profiled_bci = bci;         }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1314
  bool      should_profile() const                   { return check_flag(ProfileMDOFlag); }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1315
  ciMethod* profiled_method() const                  { return _profiled_method;     }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1316
  int       profiled_bci() const                     { return _profiled_bci;        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
LEAF(CheckCast, TypeCheck)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  CheckCast(ciKlass* klass, Value obj, ValueStack* state_before)
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  1324
  : TypeCheck(klass, obj, objectType, state_before) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  void set_incompatible_class_change_check() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
    set_flag(ThrowIncompatibleClassChangeErrorFlag, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  bool is_incompatible_class_change_check() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
    return check_flag(ThrowIncompatibleClassChangeErrorFlag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  ciType* declared_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  ciType* exact_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
LEAF(InstanceOf, TypeCheck)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {}
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1342
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1343
  virtual bool needs_exception_state() const     { return false; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
BASE(AccessMonitor, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  Value       _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
  int         _monitor_no;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1354
  AccessMonitor(Value obj, int monitor_no, ValueStack* state_before = NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1355
  : StateSplit(illegalType, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  , _obj(obj)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  , _monitor_no(monitor_no)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    set_needs_null_check(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  Value obj() const                              { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  int monitor_no() const                         { return _monitor_no; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1368
  virtual void input_values_do(ValueVisitor* f)   { StateSplit::input_values_do(f); f->visit(&_obj); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
LEAF(MonitorEnter, AccessMonitor)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1375
  MonitorEnter(Value obj, int monitor_no, ValueStack* state_before)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1376
  : AccessMonitor(obj, monitor_no, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
  virtual bool can_trap() const                  { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
LEAF(MonitorExit, AccessMonitor)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  // creation
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1389
  MonitorExit(Value obj, int monitor_no)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1390
  : AccessMonitor(obj, monitor_no, NULL)
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1391
  {
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1392
    ASSERT_VALUES
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1393
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
LEAF(Intrinsic, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
  vmIntrinsics::ID _id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  Values*          _args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
  Value            _recv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  // preserves_state can be set to true for Intrinsics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  // which are guaranteed to preserve register state across any slow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
  // cases; setting it to true does not mean that the Intrinsic can
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  // not trap, only that if we continue execution in the same basic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
  // block after the Intrinsic, all of the registers are intact. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  // allows load elimination and common expression elimination to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  // performed across the Intrinsic.  The default value is false.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  Intrinsic(ValueType* type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
            vmIntrinsics::ID id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
            Values* args,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
            bool has_receiver,
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1415
            ValueStack* state_before,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
            bool preserves_state,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
            bool cantrap = true)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1418
  : StateSplit(type, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
  , _id(id)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  , _args(args)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
  , _recv(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
    assert(args != NULL, "args must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
    set_flag(PreservesStateFlag, preserves_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    set_flag(CanTrapFlag,        cantrap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
    if (has_receiver) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
      _recv = argument_at(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
    set_needs_null_check(has_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    // some intrinsics can't trap, so don't force them to be pinned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
    if (!can_trap()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
      unpin(PinStateSplitConstructor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  vmIntrinsics::ID id() const                    { return _id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  int number_of_arguments() const                { return _args->length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  Value argument_at(int i) const                 { return _args->at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  bool has_receiver() const                      { return (_recv != NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  Value receiver() const                         { assert(has_receiver(), "must have receiver"); return _recv; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
  bool preserves_state() const                   { return check_flag(PreservesStateFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  virtual bool can_trap() const                  { return check_flag(CanTrapFlag); }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1449
  virtual void input_values_do(ValueVisitor* f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
    StateSplit::input_values_do(f);
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1451
    for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
class LIR_List;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
LEAF(BlockBegin, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  int        _block_id;                          // the unique block id
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1461
  int        _bci;                               // start-bci of block
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  int        _depth_first_number;                // number of this block in a depth-first ordering
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
  int        _linear_scan_number;                // number of this block in linear-scan ordering
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
  int        _loop_depth;                        // the loop nesting level of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  int        _loop_index;                        // number of the innermost loop of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  int        _flags;                             // the flags associated with this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  // fields used by BlockListBuilder
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  int        _total_preds;                       // number of predecessors found by BlockListBuilder
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  BitMap     _stores_to_locals;                  // bit is set when a local variable is stored in the block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  // SSA specific fields: (factor out later)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  BlockList   _successors;                       // the successors of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
  BlockList   _predecessors;                     // the predecessors of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  BlockBegin* _dominator;                        // the dominator of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  // SSA specific ends
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  BlockEnd*  _end;                               // the last instruction of this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  BlockList  _exception_handlers;                // the exception handlers potentially invoked by this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  ValueStackStack* _exception_states;            // only for xhandler entries: states of all instructions that have an edge to this xhandler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  int        _exception_handler_pco;             // if this block is the start of an exception handler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
                                                 // this records the PC offset in the assembly code of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
                                                 // first instruction in this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  Label      _label;                             // the label associated with this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  LIR_List*  _lir;                               // the low level intermediate representation for this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  BitMap      _live_in;                          // set of live LIR_Opr registers at entry to this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
  BitMap      _live_out;                         // set of live LIR_Opr registers at exit from this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  BitMap      _live_gen;                         // set of registers used before any redefinition in this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  BitMap      _live_kill;                        // set of registers defined in this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  BitMap      _fpu_register_usage;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  intArray*   _fpu_stack_state;                  // For x86 FPU code generation with UseLinearScan
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  int         _first_lir_instruction_id;         // ID of first LIR instruction in this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
  int         _last_lir_instruction_id;          // ID of last LIR instruction in this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
  void iterate_preorder (boolArray& mark, BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
  void iterate_postorder(boolArray& mark, BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  friend class SuxAndWeightAdjuster;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
 public:
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1502
   void* operator new(size_t size) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1503
    Compilation* c = Compilation::current();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1504
    void* res = c->arena()->Amalloc(size);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1505
    ((BlockBegin*)res)->_id = c->get_next_id();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1506
    ((BlockBegin*)res)->_block_id = c->get_next_block_id();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1507
    return res;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1508
  }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1509
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
  // initialization/counting
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1511
  static int  number_of_blocks() {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1512
    return Compilation::current()->number_of_blocks();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1513
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
  BlockBegin(int bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  : StateSplit(illegalType)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1518
  , _bci(bci)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  , _depth_first_number(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  , _linear_scan_number(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  , _loop_depth(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
  , _flags(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  , _dominator(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  , _end(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  , _predecessors(2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  , _successors(2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  , _exception_handlers(1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  , _exception_states(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  , _exception_handler_pco(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  , _lir(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  , _loop_index(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
  , _live_in()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
  , _live_out()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
  , _live_gen()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
  , _live_kill()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
  , _fpu_register_usage()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
  , _fpu_stack_state(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
  , _first_lir_instruction_id(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
  , _last_lir_instruction_id(-1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  , _total_preds(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
  , _stores_to_locals()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  {
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1543
#ifndef PRODUCT
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1544
    set_printable_bci(bci);
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1545
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
  int block_id() const                           { return _block_id; }
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1550
  int bci() const                                { return _bci; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  BlockList* successors()                        { return &_successors; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  BlockBegin* dominator() const                  { return _dominator; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
  int loop_depth() const                         { return _loop_depth; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
  int depth_first_number() const                 { return _depth_first_number; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
  int linear_scan_number() const                 { return _linear_scan_number; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
  BlockEnd* end() const                          { return _end; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  Label* label()                                 { return &_label; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
  LIR_List* lir() const                          { return _lir; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
  int exception_handler_pco() const              { return _exception_handler_pco; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  BitMap& live_in()                              { return _live_in;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  BitMap& live_out()                             { return _live_out;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
  BitMap& live_gen()                             { return _live_gen;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
  BitMap& live_kill()                            { return _live_kill;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  BitMap& fpu_register_usage()                   { return _fpu_register_usage; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
  intArray* fpu_stack_state() const              { return _fpu_stack_state;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
  int first_lir_instruction_id() const           { return _first_lir_instruction_id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
  int last_lir_instruction_id() const            { return _last_lir_instruction_id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
  int total_preds() const                        { return _total_preds; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
  BitMap& stores_to_locals()                     { return _stores_to_locals; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
  void set_dominator(BlockBegin* dom)            { _dominator = dom; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
  void set_loop_depth(int d)                     { _loop_depth = d; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
  void set_depth_first_number(int dfn)           { _depth_first_number = dfn; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  void set_linear_scan_number(int lsn)           { _linear_scan_number = lsn; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
  void set_end(BlockEnd* end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
  void disconnect_from_graph();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
  static void disconnect_edge(BlockBegin* from, BlockBegin* to);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
  BlockBegin* insert_block_between(BlockBegin* sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  void set_lir(LIR_List* lir)                    { _lir = lir; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  void set_exception_handler_pco(int pco)        { _exception_handler_pco = pco; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  void set_live_in       (BitMap map)            { _live_in = map;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  void set_live_out      (BitMap map)            { _live_out = map;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  void set_live_gen      (BitMap map)            { _live_gen = map;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  void set_live_kill     (BitMap map)            { _live_kill = map;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
  void set_fpu_register_usage(BitMap map)        { _fpu_register_usage = map; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  void set_fpu_stack_state(intArray* state)      { _fpu_stack_state = state;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  void set_first_lir_instruction_id(int id)      { _first_lir_instruction_id = id;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  void set_last_lir_instruction_id(int id)       { _last_lir_instruction_id = id;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  void increment_total_preds(int n = 1)          { _total_preds += n; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  void init_stores_to_locals(int locals_count)   { _stores_to_locals = BitMap(locals_count); _stores_to_locals.clear(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1595
  virtual void state_values_do(ValueVisitor* f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
  // successors and predecessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
  int number_of_sux() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
  BlockBegin* sux_at(int i) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
  void add_successor(BlockBegin* sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
  void remove_successor(BlockBegin* pred);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
  bool is_successor(BlockBegin* sux) const       { return _successors.contains(sux); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
  void add_predecessor(BlockBegin* pred);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
  void remove_predecessor(BlockBegin* pred);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  bool is_predecessor(BlockBegin* pred) const    { return _predecessors.contains(pred); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
  int number_of_preds() const                    { return _predecessors.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
  BlockBegin* pred_at(int i) const               { return _predecessors[i]; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
  // exception handlers potentially invoked by this block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
  void add_exception_handler(BlockBegin* b);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
  bool is_exception_handler(BlockBegin* b) const { return _exception_handlers.contains(b); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
  int  number_of_exception_handlers() const      { return _exception_handlers.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
  BlockBegin* exception_handler_at(int i) const  { return _exception_handlers.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
  // states of the instructions that have an edge to this exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
  int number_of_exception_states()               { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states == NULL ? 0 : _exception_states->length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
  ValueStack* exception_state_at(int idx) const  { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states->at(idx); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
  int add_exception_state(ValueStack* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
  // flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  enum Flag {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
    no_flag                       = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
    std_entry_flag                = 1 << 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
    osr_entry_flag                = 1 << 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
    exception_entry_flag          = 1 << 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
    subroutine_entry_flag         = 1 << 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
    backward_branch_target_flag   = 1 << 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
    is_on_work_list_flag          = 1 << 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
    was_visited_flag              = 1 << 6,
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5046
diff changeset
  1631
    parser_loop_header_flag       = 1 << 7,  // set by parser to identify blocks where phi functions can not be created on demand
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5046
diff changeset
  1632
    critical_edge_split_flag      = 1 << 8, // set for all blocks that are introduced when critical edges are split
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5046
diff changeset
  1633
    linear_scan_loop_header_flag  = 1 << 9, // set during loop-detection for LinearScan
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5046
diff changeset
  1634
    linear_scan_loop_end_flag     = 1 << 10  // set during loop-detection for LinearScan
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  void set(Flag f)                               { _flags |= f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
  void clear(Flag f)                             { _flags &= ~f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
  bool is_set(Flag f) const                      { return (_flags & f) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
  bool is_entry_block() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
    const int entry_mask = std_entry_flag | osr_entry_flag | exception_entry_flag;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
    return (_flags & entry_mask) != 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  // iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
  void iterate_preorder   (BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
  void iterate_postorder  (BlockClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1649
  void block_values_do(ValueVisitor* f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
  // loops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
  void set_loop_index(int ix)                    { _loop_index = ix;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
  int  loop_index() const                        { return _loop_index;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
  // merging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
  bool try_merge(ValueStack* state);             // try to merge states at block begin
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
  void merge(ValueStack* state)                  { bool b = try_merge(state); assert(b, "merge failed"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  // debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  void print_block()                             PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
  void print_block(InstructionPrinter& ip, bool live_only = false) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
BASE(BlockEnd, StateSplit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
  BlockBegin* _begin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  BlockList*  _sux;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  BlockList* sux() const                         { return _sux; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  void set_sux(BlockList* sux) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
    assert(sux != NULL, "sux must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
    for (int i = sux->length() - 1; i >= 0; i--) assert(sux->at(i) != NULL, "sux must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
    _sux = sux;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
  BlockEnd(ValueType* type, ValueStack* state_before, bool is_safepoint)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1684
  : StateSplit(type, state_before)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
  , _begin(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  , _sux(NULL)
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1687
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
    set_flag(IsSafepointFlag, is_safepoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
  bool is_safepoint() const                      { return check_flag(IsSafepointFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
  BlockBegin* begin() const                      { return _begin; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
  void set_begin(BlockBegin* begin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
  // successors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
  int number_of_sux() const                      { return _sux != NULL ? _sux->length() : 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
  BlockBegin* sux_at(int i) const                { return _sux->at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
  BlockBegin* default_sux() const                { return sux_at(number_of_sux() - 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
  BlockBegin** addr_sux_at(int i) const          { return _sux->adr_at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
  int sux_index(BlockBegin* sux) const           { return _sux->find(sux); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
  void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
LEAF(Goto, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
 public:
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1710
  enum Direction {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1711
    none,            // Just a regular goto
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1712
    taken, not_taken // Goto produced from If
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1713
  };
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1714
 private:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1715
  ciMethod*   _profiled_method;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1716
  int         _profiled_bci;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1717
  Direction   _direction;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1718
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  // creation
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1720
  Goto(BlockBegin* sux, ValueStack* state_before, bool is_safepoint = false)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1721
    : BlockEnd(illegalType, state_before, is_safepoint)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1722
    , _direction(none)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1723
    , _profiled_method(NULL)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1724
    , _profiled_bci(0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
    BlockList* s = new BlockList(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
    s->append(sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
    set_sux(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1730
  Goto(BlockBegin* sux, bool is_safepoint) : BlockEnd(illegalType, NULL, is_safepoint)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1731
                                           , _direction(none)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1732
                                           , _profiled_method(NULL)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1733
                                           , _profiled_bci(0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
    BlockList* s = new BlockList(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
    s->append(sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
    set_sux(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1739
  bool should_profile() const                    { return check_flag(ProfileMDOFlag); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1740
  ciMethod* profiled_method() const              { return _profiled_method; } // set only for profiled branches
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1741
  int profiled_bci() const                       { return _profiled_bci; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1742
  Direction direction() const                    { return _direction; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1743
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1744
  void set_should_profile(bool value)            { set_flag(ProfileMDOFlag, value); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1745
  void set_profiled_method(ciMethod* method)     { _profiled_method = method; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1746
  void set_profiled_bci(int bci)                 { _profiled_bci = bci; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1747
  void set_direction(Direction d)                { _direction = d; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
LEAF(If, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
  Value       _x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  Condition   _cond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
  Value       _y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
  ciMethod*   _profiled_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
  int         _profiled_bci; // Canonicalizer may alter bci of If node
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1758
  bool        _swapped;      // Is the order reversed with respect to the original If in the
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1759
                             // bytecode stream?
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  // unordered_is_true is valid for float/double compares only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  If(Value x, Condition cond, bool unordered_is_true, Value y, BlockBegin* tsux, BlockBegin* fsux, ValueStack* state_before, bool is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
    : BlockEnd(illegalType, state_before, is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
  , _x(x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  , _cond(cond)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
  , _y(y)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
  , _profiled_method(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  , _profiled_bci(0)
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1770
  , _swapped(false)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
    set_flag(UnorderedIsTrueFlag, unordered_is_true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
    assert(x->type()->tag() == y->type()->tag(), "types must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
    BlockList* s = new BlockList(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
    s->append(tsux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
    s->append(fsux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
    set_sux(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
  Value x() const                                { return _x; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  Condition cond() const                         { return _cond; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
  bool unordered_is_true() const                 { return check_flag(UnorderedIsTrueFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  Value y() const                                { return _y; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  BlockBegin* sux_for(bool is_true) const        { return sux_at(is_true ? 0 : 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
  BlockBegin* tsux() const                       { return sux_for(true); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  BlockBegin* fsux() const                       { return sux_for(false); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  BlockBegin* usux() const                       { return sux_for(unordered_is_true()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
  bool should_profile() const                    { return check_flag(ProfileMDOFlag); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  ciMethod* profiled_method() const              { return _profiled_method; } // set only for profiled branches
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1792
  int profiled_bci() const                       { return _profiled_bci; }    // set for profiled branches and tiered
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1793
  bool is_swapped() const                        { return _swapped; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  void swap_operands() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
    Value t = _x; _x = _y; _y = t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
    _cond = mirror(_cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
  void swap_sux() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
    assert(number_of_sux() == 2, "wrong number of successors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
    BlockList* s = sux();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
    BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
    _cond = negate(_cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
    set_flag(UnorderedIsTrueFlag, !check_flag(UnorderedIsTrueFlag));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  void set_should_profile(bool value)             { set_flag(ProfileMDOFlag, value); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  void set_profiled_method(ciMethod* method)      { _profiled_method = method; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  void set_profiled_bci(int bci)                  { _profiled_bci = bci;       }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  1812
  void set_swapped(bool value)                    { _swapped = value;         }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1814
  virtual void input_values_do(ValueVisitor* f)   { BlockEnd::input_values_do(f); f->visit(&_x); f->visit(&_y); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
LEAF(IfInstanceOf, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
  ciKlass* _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
  Value    _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
  bool     _test_is_instance;                    // jump if instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  int      _instanceof_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
  IfInstanceOf(ciKlass* klass, Value obj, bool test_is_instance, int instanceof_bci, BlockBegin* tsux, BlockBegin* fsux)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  : BlockEnd(illegalType, NULL, false) // temporary set to false
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  , _klass(klass)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  , _obj(obj)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  , _test_is_instance(test_is_instance)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  , _instanceof_bci(instanceof_bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
    assert(instanceof_bci >= 0, "illegal bci");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
    BlockList* s = new BlockList(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
    s->append(tsux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
    s->append(fsux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
    set_sux(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
  // Note 1: If test_is_instance() is true, IfInstanceOf tests if obj *is* an
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
  //         instance of klass; otherwise it tests if it is *not* and instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
  //         of klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
  // Note 2: IfInstanceOf instructions are created by combining an InstanceOf
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  //         and an If instruction. The IfInstanceOf bci() corresponds to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
  //         bci that the If would have had; the (this->) instanceof_bci() is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
  //         the bci of the original InstanceOf instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
  ciKlass* klass() const                         { return _klass; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
  Value obj() const                              { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  int instanceof_bci() const                     { return _instanceof_bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
  bool test_is_instance() const                  { return _test_is_instance; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  BlockBegin* sux_for(bool is_true) const        { return sux_at(is_true ? 0 : 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  BlockBegin* tsux() const                       { return sux_for(true); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  BlockBegin* fsux() const                       { return sux_for(false); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  // manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
  void swap_sux() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
    assert(number_of_sux() == 2, "wrong number of successors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
    BlockList* s = sux();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
    _test_is_instance = !_test_is_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1868
  virtual void input_values_do(ValueVisitor* f)   { BlockEnd::input_values_do(f); f->visit(&_obj); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
BASE(Switch, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  Value       _tag;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
  Switch(Value tag, BlockList* sux, ValueStack* state_before, bool is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  : BlockEnd(illegalType, state_before, is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
  , _tag(tag) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
    set_sux(sux);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  Value tag() const                              { return _tag; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  int length() const                             { return number_of_sux() - 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
6745
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1889
  virtual bool needs_exception_state() const     { return false; }
a34ef8968a84 6986046: C1 valuestack cleanup
roland
parents: 6461
diff changeset
  1890
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1892
  virtual void input_values_do(ValueVisitor* f)   { BlockEnd::input_values_do(f); f->visit(&_tag); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
LEAF(TableSwitch, Switch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
  int _lo_key;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
  TableSwitch(Value tag, BlockList* sux, int lo_key, ValueStack* state_before, bool is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
    : Switch(tag, sux, state_before, is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  , _lo_key(lo_key) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
  int lo_key() const                             { return _lo_key; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
  int hi_key() const                             { return _lo_key + length() - 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
LEAF(LookupSwitch, Switch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
  intArray* _keys;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  LookupSwitch(Value tag, BlockList* sux, intArray* keys, ValueStack* state_before, bool is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  : Switch(tag, sux, state_before, is_safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  , _keys(keys) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
    assert(keys != NULL, "keys must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
    assert(keys->length() == length(), "sux & keys have incompatible lengths");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
  int key_at(int i) const                        { return _keys->at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
LEAF(Return, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  Value _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
  Return(Value result) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
    BlockEnd(result == NULL ? voidType : result->type()->base(), NULL, true),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
    _result(result) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
  Value result() const                           { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
  bool has_result() const                        { return result() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1945
  virtual void input_values_do(ValueVisitor* f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
    BlockEnd::input_values_do(f);
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1947
    if (has_result()) f->visit(&_result);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
LEAF(Throw, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
  Value _exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
  Throw(Value exception, ValueStack* state_before) : BlockEnd(illegalType, state_before, true), _exception(exception) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
  Value exception() const                        { return _exception; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
  // generic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
  virtual bool can_trap() const                  { return true; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1967
  virtual void input_values_do(ValueVisitor* f)   { BlockEnd::input_values_do(f); f->visit(&_exception); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
LEAF(Base, BlockEnd)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  Base(BlockBegin* std_entry, BlockBegin* osr_entry) : BlockEnd(illegalType, NULL, false) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
    assert(std_entry->is_set(BlockBegin::std_entry_flag), "std entry must be flagged");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
    assert(osr_entry == NULL || osr_entry->is_set(BlockBegin::osr_entry_flag), "osr entry must be flagged");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
    BlockList* s = new BlockList(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
    if (osr_entry != NULL) s->append(osr_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
    s->append(std_entry); // must be default sux!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
    set_sux(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  BlockBegin* std_entry() const                  { return default_sux(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  BlockBegin* osr_entry() const                  { return number_of_sux() < 2 ? NULL : sux_at(0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
LEAF(OsrEntry, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
#ifdef _LP64
6750
b84813b41757 6988303: 6986046 breaks build with recent gcc
roland
parents: 6745
diff changeset
  1993
  OsrEntry() : Instruction(longType) { pin(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
#else
6750
b84813b41757 6988303: 6986046 breaks build with recent gcc
roland
parents: 6745
diff changeset
  1995
  OsrEntry() : Instruction(intType)  { pin(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  1999
  virtual void input_values_do(ValueVisitor* f)   { }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
// Models the incoming exception at a catch site
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
LEAF(ExceptionObject, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
  // creation
6750
b84813b41757 6988303: 6986046 breaks build with recent gcc
roland
parents: 6745
diff changeset
  2007
  ExceptionObject() : Instruction(objectType) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2012
  virtual void input_values_do(ValueVisitor* f)   { }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
// Models needed rounding for floating-point values on Intel.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
// Currently only used to represent rounding of double-precision
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
// values stored into local variables, but could be used to model
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
// intermediate rounding of single-precision values as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
LEAF(RoundFP, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
  Value _input;             // floating-point value to be rounded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
  RoundFP(Value input)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  : Instruction(input->type()) // Note: should not be used for constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
  , _input(input)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  Value input() const                            { return _input; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2036
  virtual void input_values_do(ValueVisitor* f)   { f->visit(&_input); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
BASE(UnsafeOp, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  BasicType _basic_type;    // ValueType can not express byte-sized integers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
  UnsafeOp(BasicType basic_type, bool is_put)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
  : Instruction(is_put ? voidType : as_ValueType(basic_type))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  , _basic_type(basic_type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
    //Note:  Unsafe ops are not not guaranteed to throw NPE.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
    // Convservatively, Unsafe operations must be pinned though we could be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
    // looser about this if we wanted to..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
  BasicType basic_type()                         { return _basic_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2061
  virtual void input_values_do(ValueVisitor* f)   { }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
BASE(UnsafeRawOp, UnsafeOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
  Value _base;                                   // Base address (a Java long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
  Value _index;                                  // Index if computed by optimizer; initialized to NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  int   _log2_scale;                             // Scale factor: 0, 1, 2, or 3.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
                                                 // Indicates log2 of number of bytes (1, 2, 4, or 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
                                                 // to scale index by.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
  UnsafeRawOp(BasicType basic_type, Value addr, bool is_put)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  : UnsafeOp(basic_type, is_put)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  , _base(addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
  , _index(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
  , _log2_scale(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
    // Can not use ASSERT_VALUES because index may be NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
    assert(addr != NULL && addr->type()->is_long(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
  UnsafeRawOp(BasicType basic_type, Value base, Value index, int log2_scale, bool is_put)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  : UnsafeOp(basic_type, is_put)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
  , _base(base)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
  , _log2_scale(log2_scale)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
  Value base()                                   { return _base; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  Value index()                                  { return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
  bool  has_index()                              { return (_index != NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
  int   log2_scale()                             { return _log2_scale; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
  // setters
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
  void set_base (Value base)                     { _base  = base; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
  void set_index(Value index)                    { _index = index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
  void set_log2_scale(int log2_scale)            { _log2_scale = log2_scale; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2105
  virtual void input_values_do(ValueVisitor* f)   { UnsafeOp::input_values_do(f);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2106
                                                   f->visit(&_base);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2107
                                                   if (has_index()) f->visit(&_index); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
LEAF(UnsafeGetRaw, UnsafeRawOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
 private:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2113
 bool _may_be_unaligned, _is_wide;  // For OSREntry
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
 public:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2116
 UnsafeGetRaw(BasicType basic_type, Value addr, bool may_be_unaligned, bool is_wide = false)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
  : UnsafeRawOp(basic_type, addr, false) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
    _may_be_unaligned = may_be_unaligned;
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2119
    _is_wide = is_wide;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2122
 UnsafeGetRaw(BasicType basic_type, Value base, Value index, int log2_scale, bool may_be_unaligned, bool is_wide = false)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
  : UnsafeRawOp(basic_type, base, index, log2_scale, false) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
    _may_be_unaligned = may_be_unaligned;
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2125
    _is_wide = is_wide;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2128
  bool may_be_unaligned()                         { return _may_be_unaligned; }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2129
  bool is_wide()                                  { return _is_wide; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
LEAF(UnsafePutRaw, UnsafeRawOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  Value _value;                                  // Value to be stored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
  UnsafePutRaw(BasicType basic_type, Value addr, Value value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
  : UnsafeRawOp(basic_type, addr, true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
  , _value(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
    assert(value != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
  UnsafePutRaw(BasicType basic_type, Value base, Value index, int log2_scale, Value value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  : UnsafeRawOp(basic_type, base, index, log2_scale, true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
  , _value(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
    assert(value != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
  Value value()                                  { return _value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2158
  virtual void input_values_do(ValueVisitor* f)   { UnsafeRawOp::input_values_do(f);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2159
                                                   f->visit(&_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
BASE(UnsafeObjectOp, UnsafeOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
  Value _object;                                 // Object to be fetched from or mutated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
  Value _offset;                                 // Offset within object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
  bool  _is_volatile;                            // true if volatile - dl/JSR166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
  UnsafeObjectOp(BasicType basic_type, Value object, Value offset, bool is_put, bool is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
    : UnsafeOp(basic_type, is_put), _object(object), _offset(offset), _is_volatile(is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  Value object()                                 { return _object; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
  Value offset()                                 { return _offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
  bool  is_volatile()                            { return _is_volatile; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2179
  virtual void input_values_do(ValueVisitor* f)   { UnsafeOp::input_values_do(f);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2180
                                                   f->visit(&_object);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2181
                                                   f->visit(&_offset); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
LEAF(UnsafeGetObject, UnsafeObjectOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
  UnsafeGetObject(BasicType basic_type, Value object, Value offset, bool is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
  : UnsafeObjectOp(basic_type, object, offset, false, is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
LEAF(UnsafePutObject, UnsafeObjectOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
  Value _value;                                  // Value to be stored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
  UnsafePutObject(BasicType basic_type, Value object, Value offset, Value value, bool is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
  : UnsafeObjectOp(basic_type, object, offset, true, is_volatile)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
    , _value(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
  Value value()                                  { return _value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
  // generic
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2210
  virtual void input_values_do(ValueVisitor* f)   { UnsafeObjectOp::input_values_do(f);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2211
                                                   f->visit(&_value); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
BASE(UnsafePrefetch, UnsafeObjectOp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
  UnsafePrefetch(Value object, Value offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
  : UnsafeObjectOp(T_VOID, object, offset, false, false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
LEAF(UnsafePrefetchRead, UnsafePrefetch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
  UnsafePrefetchRead(Value object, Value offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
  : UnsafePrefetch(object, offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
LEAF(UnsafePrefetchWrite, UnsafePrefetch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  UnsafePrefetchWrite(Value object, Value offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
  : UnsafePrefetch(object, offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
    ASSERT_VALUES
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
LEAF(ProfileCall, Instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
  ciMethod* _method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
  int       _bci_of_invoke;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
  Value     _recv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
  ciKlass*  _known_holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  ProfileCall(ciMethod* method, int bci, Value recv, ciKlass* known_holder)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
    : Instruction(voidType)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
    , _method(method)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
    , _bci_of_invoke(bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
    , _recv(recv)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
    , _known_holder(known_holder)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
    // The ProfileCall has side-effects and must occur precisely where located
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
  ciMethod* method()      { return _method; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
  int bci_of_invoke()     { return _bci_of_invoke; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  Value recv()            { return _recv; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  ciKlass* known_holder() { return _known_holder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2267
  virtual void input_values_do(ValueVisitor* f)   { if (_recv != NULL) f->visit(&_recv); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2270
// Use to trip invocation counter of an inlined method
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2272
LEAF(ProfileInvoke, Instruction)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
 private:
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2274
  ciMethod*   _inlinee;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2275
  ValueStack* _state;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
 public:
6751
b399fd234e47 6988346: 6986046 breaks tiered
iveresov
parents: 6750
diff changeset
  2278
  ProfileInvoke(ciMethod* inlinee,  ValueStack* state)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
    : Instruction(voidType)
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2280
    , _inlinee(inlinee)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2281
    , _state(state)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2283
    // The ProfileInvoke has side-effects and must occur precisely where located QQQ???
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
    pin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2287
  ciMethod* inlinee()      { return _inlinee; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2288
  ValueStack* state()      { return _state; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2289
  virtual void input_values_do(ValueVisitor*)   {}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5707
diff changeset
  2290
  virtual void state_values_do(ValueVisitor*);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
class BlockPair: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  BlockBegin* _from;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  BlockBegin* _to;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
  BlockPair(BlockBegin* from, BlockBegin* to): _from(from), _to(to) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
  BlockBegin* from() const { return _from; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  BlockBegin* to() const   { return _to;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  bool is_same(BlockBegin* from, BlockBegin* to) const { return  _from == from && _to == to; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  bool is_same(BlockPair* p) const { return  _from == p->from() && _to == p->to(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  void set_to(BlockBegin* b)   { _to = b; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  void set_from(BlockBegin* b) { _from = b; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
define_array(BlockPairArray, BlockPair*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
define_stack(BlockPairList, BlockPairArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
inline int         BlockBegin::number_of_sux() const            { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
inline BlockBegin* BlockBegin::sux_at(int i) const              { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch");          return _successors.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
inline void        BlockBegin::add_successor(BlockBegin* sux)   { assert(_end == NULL, "Would create mismatch with successors of BlockEnd");         _successors.append(sux); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
#undef ASSERT_VALUES
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
  2317
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
  2318
#endif // SHARE_VM_C1_C1_INSTRUCTION_HPP