8232165: Reduce allocations in ValueStack copying constructor

Reviewed-by: neliasso, kvn
This commit is contained in:
Claes Redestad 2019-10-14 20:58:08 +02:00
parent 76d7e33569
commit 35fb2da425
3 changed files with 23 additions and 13 deletions

View File

@ -42,31 +42,21 @@ ValueStack::ValueStack(IRScope* scope, ValueStack* caller_state)
verify();
}
ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci)
: _scope(copy_from->scope())
, _caller_state(copy_from->caller_state())
, _bci(bci)
, _kind(kind)
, _locals()
, _stack()
, _locals(copy_from->locals_size_for_copy(kind))
, _stack(copy_from->stack_size_for_copy(kind))
, _locks(copy_from->locks_size() == 0 ? NULL : new Values(copy_from->locks_size()))
{
assert(kind != EmptyExceptionState || !Compilation::current()->env()->should_retain_local_variables(), "need locals");
if (kind != EmptyExceptionState) {
// only allocate space if we need to copy the locals-array
_locals = Values(copy_from->locals_size());
_locals.appendAll(&copy_from->_locals);
}
if (kind != ExceptionState && kind != EmptyExceptionState) {
if (kind == Parsing) {
// stack will be modified, so reserve enough space to avoid resizing
_stack = Values(scope()->method()->max_stack());
} else {
// stack will not be modified, so do not waste space
_stack = Values(copy_from->stack_size());
}
_stack.appendAll(&copy_from->_stack);
}
@ -77,6 +67,25 @@ ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci)
verify();
}
int ValueStack::locals_size_for_copy(Kind kind) const {
if (kind != EmptyExceptionState) {
return locals_size();
}
return 0;
}
int ValueStack::stack_size_for_copy(Kind kind) const {
if (kind != ExceptionState && kind != EmptyExceptionState) {
if (kind == Parsing) {
// stack will be modified, so reserve enough space to avoid resizing
return scope()->method()->max_stack();
} else {
// stack will not be modified, so do not waste space
return stack_size();
}
}
return 0;
}
bool ValueStack::is_same(ValueStack* s) {
if (scope() != s->scope()) return false;

View File

@ -65,6 +65,8 @@ class ValueStack: public CompilationResourceObj {
// for simplified copying
ValueStack(ValueStack* copy_from, Kind kind, int bci);
int locals_size_for_copy(Kind kind) const;
int stack_size_for_copy(Kind kind) const;
public:
// creation
ValueStack(IRScope* scope, ValueStack* caller_state);

View File

@ -51,7 +51,6 @@ class ciMetadata: public ciBaseObject {
virtual bool is_metadata() const { return true; }
virtual bool is_type() const { return false; }
virtual bool is_cpcache() const { return false; }
virtual bool is_return_address() const { return false; }
virtual bool is_method() const { return false; }
virtual bool is_method_data() const { return false; }