< prev index next >

src/hotspot/share/ci/bcEscapeAnalyzer.cpp

Print this page
@@ -553,10 +553,13 @@
        case Bytecodes::_aastore:
        {
          set_global_escape(state.apop());
          state.spop();
          ArgumentMap arr = state.apop();
+         // If the array is a flat array, a larger part of it is modified than
+         // the size of a reference. However, if OFFSET_ANY is given as
+         // parameter to set_modified(), size is not taken into account.
          set_modified(arr, OFFSET_ANY, type2size[T_OBJECT]*HeapWordSize);
          break;
        }
        case Bytecodes::_pop:
          state.raw_pop();

@@ -937,12 +940,28 @@
              state.lpush();
            }
          }
          break;
        case Bytecodes::_new:
+       case Bytecodes::_aconst_init:
          state.apush(allocated_obj);
          break;
+       case Bytecodes::_withfield: {
+         bool will_link;
+         ciField* field = s.get_field(will_link);
+         BasicType field_type = field->type()->basic_type();
+         if (field_type == T_OBJECT || field_type == T_ARRAY) {
+           set_global_escape(state.apop());
+         } else if (type2size[field_type] == 1) {
+           state.spop();
+         } else {
+           state.lpop();
+         }
+         set_method_escape(state.apop());
+         state.apush(allocated_obj);
+         break;
+       }
        case Bytecodes::_newarray:
        case Bytecodes::_anewarray:
          state.spop();
          state.apush(allocated_obj);
          break;
< prev index next >