src/share/vm/c1/c1_ValueStack.hpp

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

Initial load

     1 /*
     2  * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 class ValueStack: public CompilationResourceObj {
    26  private:
    27   IRScope* _scope;                               // the enclosing scope
    28   bool     _lock_stack;                          // indicates that this ValueStack is for an exception site
    29   Values   _locals;                              // the locals
    30   Values   _stack;                               // the expression stack
    31   Values   _locks;                               // the monitor stack (holding the locked values)
    33   Value check(ValueTag tag, Value t) {
    34     assert(tag == t->type()->tag() || tag == objectTag && t->type()->tag() == addressTag, "types must correspond");
    35     return t;
    36   }
    38   Value check(ValueTag tag, Value t, Value h) {
    39     assert(h->as_HiWord()->lo_word() == t, "incorrect stack pair");
    40     return check(tag, t);
    41   }
    43   // helper routine
    44   static void apply(Values list, void f(Value*));
    46  public:
    47   // creation
    48   ValueStack(IRScope* scope, int locals_size, int max_stack_size);
    50   // merging
    51   ValueStack* copy();                            // returns a copy of this w/ cleared locals
    52   ValueStack* copy_locks();                      // returns a copy of this w/ cleared locals and stack
    53                                                  // Note that when inlining of methods with exception
    54                                                  // handlers is enabled, this stack may have a
    55                                                  // non-empty expression stack (size defined by
    56                                                  // scope()->lock_stack_size())
    57   bool is_same(ValueStack* s);                   // returns true if this & s's types match (w/o checking locals)
    58   bool is_same_across_scopes(ValueStack* s);     // same as is_same but returns true even if stacks are in different scopes (used for block merging w/inlining)
    60   // accessors
    61   IRScope* scope() const                         { return _scope; }
    62   bool is_lock_stack() const                     { return _lock_stack; }
    63   int locals_size() const                        { return _locals.length(); }
    64   int stack_size() const                         { return _stack.length(); }
    65   int locks_size() const                         { return _locks.length(); }
    66   int max_stack_size() const                     { return _stack.capacity(); }
    67   bool stack_is_empty() const                    { return _stack.is_empty(); }
    68   bool no_active_locks() const                   { return _locks.is_empty(); }
    69   ValueStack* caller_state() const;
    71   // locals access
    72   void clear_locals();                           // sets all locals to NULL;
    74   // Kill local i.  Also kill local i+1 if i was a long or double.
    75   void invalidate_local(int i) {
    76     Value x = _locals.at(i);
    77     if (x != NULL && x->type()->is_double_word()) {
    78       assert(_locals.at(i + 1)->as_HiWord()->lo_word() == x, "locals inconsistent");
    79       _locals.at_put(i + 1, NULL);
    80     }
    81     _locals.at_put(i, NULL);
    82   }
    85   Value load_local(int i) const {
    86     Value x = _locals.at(i);
    87     if (x != NULL && x->type()->is_illegal()) return NULL;
    88     assert(x == NULL || x->as_HiWord() == NULL, "index points to hi word");
    89     assert(x == NULL || x->type()->is_illegal() || x->type()->is_single_word() || x == _locals.at(i+1)->as_HiWord()->lo_word(), "locals inconsistent");
    90     return x;
    91   }
    93   Value local_at(int i) const { return _locals.at(i); }
    95   // Store x into local i.
    96   void store_local(int i, Value x) {
    97     // Kill the old value
    98     invalidate_local(i);
    99     _locals.at_put(i, x);
   101     // Writing a double word can kill other locals
   102     if (x != NULL && x->type()->is_double_word()) {
   103       // If x + i was the start of a double word local then kill i + 2.
   104       Value x2 = _locals.at(i + 1);
   105       if (x2 != NULL && x2->type()->is_double_word()) {
   106         _locals.at_put(i + 2, NULL);
   107       }
   109       // If x is a double word local, also update i + 1.
   110 #ifdef ASSERT
   111       _locals.at_put(i + 1, x->hi_word());
   112 #else
   113       _locals.at_put(i + 1, NULL);
   114 #endif
   115     }
   116     // If x - 1 was the start of a double word local then kill i - 1.
   117     if (i > 0) {
   118       Value prev = _locals.at(i - 1);
   119       if (prev != NULL && prev->type()->is_double_word()) {
   120         _locals.at_put(i - 1, NULL);
   121       }
   122     }
   123   }
   125   void replace_locals(ValueStack* with);
   127   // stack access
   128   Value stack_at(int i) const {
   129     Value x = _stack.at(i);
   130     assert(x->as_HiWord() == NULL, "index points to hi word");
   131     assert(x->type()->is_single_word() ||
   132            x->subst() == _stack.at(i+1)->as_HiWord()->lo_word(), "stack inconsistent");
   133     return x;
   134   }
   136   Value stack_at_inc(int& i) const {
   137     Value x = stack_at(i);
   138     i += x->type()->size();
   139     return x;
   140   }
   142   // pinning support
   143   void pin_stack_for_linear_scan();
   145   // iteration
   146   void values_do(void f(Value*));
   148   // untyped manipulation (for dup_x1, etc.)
   149   void clear_stack()                             { _stack.clear(); }
   150   void truncate_stack(int size)                  { _stack.trunc_to(size); }
   151   void raw_push(Value t)                         { _stack.push(t); }
   152   Value raw_pop()                                { return _stack.pop(); }
   154   // typed manipulation
   155   void ipush(Value t)                            { _stack.push(check(intTag    , t)); }
   156   void fpush(Value t)                            { _stack.push(check(floatTag  , t)); }
   157   void apush(Value t)                            { _stack.push(check(objectTag , t)); }
   158   void rpush(Value t)                            { _stack.push(check(addressTag, t)); }
   159 #ifdef ASSERT
   160   // in debug mode, use HiWord for 2-word values
   161   void lpush(Value t)                            { _stack.push(check(longTag   , t)); _stack.push(new HiWord(t)); }
   162   void dpush(Value t)                            { _stack.push(check(doubleTag , t)); _stack.push(new HiWord(t)); }
   163 #else
   164   // in optimized mode, use NULL for 2-word values
   165   void lpush(Value t)                            { _stack.push(check(longTag   , t)); _stack.push(NULL); }
   166   void dpush(Value t)                            { _stack.push(check(doubleTag , t)); _stack.push(NULL); }
   167 #endif // ASSERT
   169   void push(ValueType* type, Value t) {
   170     switch (type->tag()) {
   171       case intTag    : ipush(t); return;
   172       case longTag   : lpush(t); return;
   173       case floatTag  : fpush(t); return;
   174       case doubleTag : dpush(t); return;
   175       case objectTag : apush(t); return;
   176       case addressTag: rpush(t); return;
   177     }
   178     ShouldNotReachHere();
   179   }
   181   Value ipop()                                   { return check(intTag    , _stack.pop()); }
   182   Value fpop()                                   { return check(floatTag  , _stack.pop()); }
   183   Value apop()                                   { return check(objectTag , _stack.pop()); }
   184   Value rpop()                                   { return check(addressTag, _stack.pop()); }
   185 #ifdef ASSERT
   186   // in debug mode, check for HiWord consistency
   187   Value lpop()                                   { Value h = _stack.pop(); return check(longTag  , _stack.pop(), h); }
   188   Value dpop()                                   { Value h = _stack.pop(); return check(doubleTag, _stack.pop(), h); }
   189 #else
   190   // in optimized mode, ignore HiWord since it is NULL
   191   Value lpop()                                   { _stack.pop(); return check(longTag  , _stack.pop()); }
   192   Value dpop()                                   { _stack.pop(); return check(doubleTag, _stack.pop()); }
   193 #endif // ASSERT
   195   Value pop(ValueType* type) {
   196     switch (type->tag()) {
   197       case intTag    : return ipop();
   198       case longTag   : return lpop();
   199       case floatTag  : return fpop();
   200       case doubleTag : return dpop();
   201       case objectTag : return apop();
   202       case addressTag: return rpop();
   203     }
   204     ShouldNotReachHere();
   205     return NULL;
   206   }
   208   Values* pop_arguments(int argument_size);
   210   // locks access
   211   int lock  (IRScope* scope, Value obj);
   212   int unlock();
   213   Value lock_at(int i) const                     { return _locks.at(i); }
   215   // Inlining support
   216   ValueStack* push_scope(IRScope* scope);         // "Push" new scope, returning new resulting stack
   217                                                   // Preserves stack and locks, destroys locals
   218   ValueStack* pop_scope();                        // "Pop" topmost scope, returning new resulting stack
   219                                                   // Preserves stack and locks, destroys locals
   221   // SSA form IR support
   222   void setup_phi_for_stack(BlockBegin* b, int index);
   223   void setup_phi_for_local(BlockBegin* b, int index);
   225   // debugging
   226   void print()  PRODUCT_RETURN;
   227   void verify() PRODUCT_RETURN;
   228 };
   232 // Macro definitions for simple iteration of stack and local values of a ValueStack
   233 // The macros can be used like a for-loop. All variables (state, index and value)
   234 // must be defined before the loop.
   235 // When states are nested because of inlining, the stack of the innermost state
   236 // cumulates also the stack of the nested states. In contrast, the locals of all
   237 // states must be iterated each.
   238 // Use the following code pattern to iterate all stack values and all nested local values:
   239 //
   240 // ValueStack* state = ...   // state that is iterated
   241 // int index;                // current loop index (overwritten in loop)
   242 // Value value;              // value at current loop index (overwritten in loop)
   243 //
   244 // for_each_stack_value(state, index, value {
   245 //   do something with value and index
   246 // }
   247 //
   248 // for_each_state(state) {
   249 //   for_each_local_value(state, index, value) {
   250 //     do something with value and index
   251 //   }
   252 // }
   253 // as an invariant, state is NULL now
   256 // construct a unique variable name with the line number where the macro is used
   257 #define temp_var3(x) temp__ ## x
   258 #define temp_var2(x) temp_var3(x)
   259 #define temp_var     temp_var2(__LINE__)
   261 #define for_each_state(state)  \
   262   for (; state != NULL; state = state->caller_state())
   264 #define for_each_local_value(state, index, value)                                              \
   265   int temp_var = state->locals_size();                                                         \
   266   for (index = 0;                                                                              \
   267        index < temp_var && (value = state->local_at(index), true);                             \
   268        index += (value == NULL || value->type()->is_illegal() ? 1 : value->type()->size()))    \
   269     if (value != NULL)
   272 #define for_each_stack_value(state, index, value)                                              \
   273   int temp_var = state->stack_size();                                                          \
   274   for (index = 0;                                                                              \
   275        index < temp_var && (value = state->stack_at(index), true);                             \
   276        index += value->type()->size())
   279 #define for_each_lock_value(state, index, value)                                               \
   280   int temp_var = state->locks_size();                                                          \
   281   for (index = 0;                                                                              \
   282        index < temp_var && (value = state->lock_at(index), true);                              \
   283        index++)                                                                                \
   284     if (value != NULL)
   287 // Macro definition for simple iteration of all state values of a ValueStack
   288 // Because the code cannot be executed in a single loop, the code must be passed
   289 // as a macro parameter.
   290 // Use the following code pattern to iterate all stack values and all nested local values:
   291 //
   292 // ValueStack* state = ...   // state that is iterated
   293 // for_each_state_value(state, value,
   294 //   do something with value (note that this is a macro parameter)
   295 // );
   297 #define for_each_state_value(v_state, v_value, v_code)                                         \
   298 {                                                                                              \
   299   int cur_index;                                                                               \
   300   ValueStack* cur_state = v_state;                                                             \
   301   Value v_value;                                                                                 \
   302   {                                                                                            \
   303     for_each_stack_value(cur_state, cur_index, v_value) {                                      \
   304       v_code;                                                                                  \
   305     }                                                                                          \
   306   }                                                                                            \
   307   for_each_state(cur_state) {                                                                  \
   308     for_each_local_value(cur_state, cur_index, v_value) {                                      \
   309       v_code;                                                                                  \
   310     }                                                                                          \
   311   }                                                                                            \
   312 }
   315 // Macro definition for simple iteration of all phif functions of a block, i.e all
   316 // phi functions of the ValueStack where the block matches.
   317 // Use the following code pattern to iterate all phi functions of a block:
   318 //
   319 // BlockBegin* block = ...   // block that is iterated
   320 // for_each_phi_function(block, phi,
   321 //   do something with the phi function phi (note that this is a macro parameter)
   322 // );
   324 #define for_each_phi_fun(v_block, v_phi, v_code)                                               \
   325 {                                                                                              \
   326   int cur_index;                                                                               \
   327   ValueStack* cur_state = v_block->state();                                                    \
   328   Value value;                                                                                 \
   329   {                                                                                            \
   330     for_each_stack_value(cur_state, cur_index, value) {                                        \
   331       Phi* v_phi = value->as_Phi();                                                      \
   332       if (v_phi != NULL && v_phi->block() == v_block) {                                        \
   333         v_code;                                                                                \
   334       }                                                                                        \
   335     }                                                                                          \
   336   }                                                                                            \
   337   {                                                                                            \
   338     for_each_local_value(cur_state, cur_index, value) {                                        \
   339       Phi* v_phi = value->as_Phi();                                                      \
   340       if (v_phi != NULL && v_phi->block() == v_block) {                                        \
   341         v_code;                                                                                \
   342       }                                                                                        \
   343     }                                                                                          \
   344   }                                                                                            \
   345 }

mercurial