1 /*
   2  * Copyright (c) 1999, 2006, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  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)
  32 
  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   }
  37 
  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   }
  42 
  43   // helper routine
  44   static void apply(Values list, void f(Value*));
  45 
  46  public:
  47   // creation
  48   ValueStack(IRScope* scope, int locals_size, int max_stack_size);
  49 
  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)
  59 
  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;
  70 
  71   // locals access
  72   void clear_locals();                           // sets all locals to NULL;
  73 
  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   }
  83 
  84 
  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   }
  92 
  93   Value local_at(int i) const { return _locals.at(i); }
  94 
  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);
 100 
 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       }
 108 
 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   }
 124 
 125   void replace_locals(ValueStack* with);
 126 
 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   }
 135 
 136   Value stack_at_inc(int& i) const {
 137     Value x = stack_at(i);
 138     i += x->type()->size();
 139     return x;
 140   }
 141 
 142   // pinning support
 143   void pin_stack_for_linear_scan();
 144 
 145   // iteration
 146   void values_do(void f(Value*));
 147 
 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(); }
 153 
 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
 168 
 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   }
 180 
 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
 194 
 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   }
 207 
 208   Values* pop_arguments(int argument_size);
 209 
 210   // locks access
 211   int lock  (IRScope* scope, Value obj);
 212   int unlock();
 213   Value lock_at(int i) const                     { return _locks.at(i); }
 214 
 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
 220 
 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);
 224 
 225   // debugging
 226   void print()  PRODUCT_RETURN;
 227   void verify() PRODUCT_RETURN;
 228 };
 229 
 230 
 231 
 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
 254 
 255 
 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__)
 260 
 261 #define for_each_state(state)  \
 262   for (; state != NULL; state = state->caller_state())
 263 
 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)
 270 
 271 
 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())
 277 
 278 
 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)
 285 
 286 
 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 // );
 296 
 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 }
 313 
 314 
 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 // );
 323 
 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 }