diff -r c40600e85311 -r f02a8bbe6ed4 src/share/vm/c1/c1_GraphBuilder.hpp --- a/src/share/vm/c1/c1_GraphBuilder.hpp Wed Sep 22 23:51:03 2010 -0700 +++ b/src/share/vm/c1/c1_GraphBuilder.hpp Tue Dec 29 19:08:54 2009 +0100 @@ -58,9 +58,6 @@ // BlockEnds. BlockBegin* _continuation; - // Without return value of inlined method on stack - ValueStack* _continuation_state; - // Was this ScopeData created only for the parsing and inlining of // a jsr? bool _parsing_jsr; @@ -125,14 +122,10 @@ void set_stream(ciBytecodeStream* stream) { _stream = stream; } intx max_inline_size() const { return _max_inline_size; } - int caller_stack_size() const; BlockBegin* continuation() const { return _continuation; } void set_continuation(BlockBegin* cont) { _continuation = cont; } - ValueStack* continuation_state() const { return _continuation_state; } - void set_continuation_state(ValueStack* s) { _continuation_state = s; } - // Indicates whether this ScopeData was pushed only for the // parsing and inlining of a jsr bool parsing_jsr() const { return _parsing_jsr; } @@ -163,7 +156,6 @@ // for all GraphBuilders static bool _can_trap[Bytecodes::number_of_java_codes]; - static bool _is_async[Bytecodes::number_of_java_codes]; // for each instance of GraphBuilder ScopeData* _scope_data; // Per-scope data; used for inlining @@ -179,7 +171,6 @@ // for each call to connect_to_end; can also be set by inliner BlockBegin* _block; // the current block ValueStack* _state; // the current execution state - ValueStack* _exception_state; // state that will be used by handle_exception Instruction* _last; // the last instruction added bool _skip_block; // skip processing of the rest of this block @@ -194,8 +185,6 @@ ValueStack* state() const { return _state; } void set_state(ValueStack* state) { _state = state; } IRScope* scope() const { return scope_data()->scope(); } - ValueStack* exception_state() const { return _exception_state; } - void set_exception_state(ValueStack* s) { _exception_state = s; } ciMethod* method() const { return scope()->method(); } ciBytecodeStream* stream() const { return scope_data()->stream(); } Instruction* last() const { return _last; } @@ -230,7 +219,7 @@ void load_indexed (BasicType type); void store_indexed(BasicType type); void stack_op(Bytecodes::Code code); - void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* lock_stack = NULL); + void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* state_before = NULL); void negate_op(ValueType* type); void shift_op(ValueType* type, Bytecodes::Code code); void logic_op(ValueType* type, Bytecodes::Code code); @@ -267,12 +256,8 @@ Instruction* append_split(StateSplit* instr); // other helpers - static bool is_async(Bytecodes::Code code) { - assert(0 <= code && code < Bytecodes::number_of_java_codes, "illegal bytecode"); - return _is_async[code]; - } BlockBegin* block_at(int bci) { return scope_data()->block_at(bci); } - XHandlers* handle_exception(int bci); + XHandlers* handle_exception(Instruction* instruction); void connect_to_end(BlockBegin* beg); void null_check(Value value); void eliminate_redundant_phis(BlockBegin* start); @@ -283,7 +268,28 @@ void kill_all(); - ValueStack* lock_stack(); + // use of state copy routines (try to minimize unnecessary state + // object allocations): + + // - if the instruction unconditionally needs a full copy of the + // state (for patching for example), then use copy_state_before* + + // - if the instruction needs a full copy of the state only for + // handler generation (Instruction::needs_exception_state() returns + // false) then use copy_state_exhandling* + + // - if the instruction needs either a full copy of the state for + // handler generation and a least a minimal copy of the state (as + // returned by Instruction::exception_state()) for debug info + // generation (that is when Instruction::needs_exception_state() + // returns true) then use copy_state_for_exception* + + ValueStack* copy_state_before_with_bci(int bci); + ValueStack* copy_state_before(); + ValueStack* copy_state_exhandling_with_bci(int bci); + ValueStack* copy_state_exhandling(); + ValueStack* copy_state_for_exception_with_bci(int bci); + ValueStack* copy_state_for_exception(); // // Inlining support @@ -292,9 +298,7 @@ // accessors bool parsing_jsr() const { return scope_data()->parsing_jsr(); } BlockBegin* continuation() const { return scope_data()->continuation(); } - ValueStack* continuation_state() const { return scope_data()->continuation_state(); } BlockBegin* jsr_continuation() const { return scope_data()->jsr_continuation(); } - int caller_stack_size() const { return scope_data()->caller_stack_size(); } void set_continuation(BlockBegin* continuation) { scope_data()->set_continuation(continuation); } void set_inline_cleanup_info(BlockBegin* block, Instruction* return_prev,