src/share/vm/opto/callnode.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/opto/callnode.hpp

src/share/vm/opto/callnode.hpp

Print this page
rev 8568 : 8086046: escape analysis generates incorrect code as of B67
Summary: load bypasses arraycopy that sets the value after the ArrayCopyNode is expanded
Reviewed-by:

*** 563,579 **** public: const TypeFunc *_tf; // Function type address _entry_point; // Address of method being called float _cnt; // Estimate of number of times called CallGenerator* _generator; // corresponding CallGenerator for some late inline calls CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type) : SafePointNode(tf->domain()->cnt(), NULL, adr_type), _tf(tf), _entry_point(addr), _cnt(COUNT_UNKNOWN), ! _generator(NULL) { init_class_id(Class_Call); } const TypeFunc* tf() const { return _tf; } --- 563,581 ---- public: const TypeFunc *_tf; // Function type address _entry_point; // Address of method being called float _cnt; // Estimate of number of times called CallGenerator* _generator; // corresponding CallGenerator for some late inline calls + const char *_name; // Printable name, if _method is NULL CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type) : SafePointNode(tf->domain()->cnt(), NULL, adr_type), _tf(tf), _entry_point(addr), _cnt(COUNT_UNKNOWN), ! _generator(NULL), ! _name(NULL) { init_class_id(Class_Call); } const TypeFunc* tf() const { return _tf; }
*** 628,637 **** --- 630,641 ---- // and the late inlining support. void extract_projections(CallProjections* projs, bool separate_io_proj); virtual uint match_edge(uint idx) const; + bool is_call_to_arraycopystub() const; + #ifndef PRODUCT virtual void dump_req(outputStream *st = tty) const; virtual void dump_spec(outputStream *st) const; #endif };
*** 681,709 **** class CallStaticJavaNode : public CallJavaNode { virtual uint cmp( const Node &n ) const; virtual uint size_of() const; // Size is bigger public: CallStaticJavaNode(Compile* C, const TypeFunc* tf, address addr, ciMethod* method, int bci) ! : CallJavaNode(tf, addr, method, bci), _name(NULL) { init_class_id(Class_CallStaticJava); if (C->eliminate_boxing() && (method != NULL) && method->is_boxing_method()) { init_flags(Flag_is_macro); C->add_macro_node(this); } _is_scalar_replaceable = false; _is_non_escaping = false; } CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci, const TypePtr* adr_type) ! : CallJavaNode(tf, addr, NULL, bci), _name(name) { init_class_id(Class_CallStaticJava); // This node calls a runtime stub, which often has narrow memory effects. _adr_type = adr_type; _is_scalar_replaceable = false; _is_non_escaping = false; } - const char *_name; // Runtime wrapper name // Result of Escape Analysis bool _is_scalar_replaceable; bool _is_non_escaping; --- 685,713 ---- class CallStaticJavaNode : public CallJavaNode { virtual uint cmp( const Node &n ) const; virtual uint size_of() const; // Size is bigger public: CallStaticJavaNode(Compile* C, const TypeFunc* tf, address addr, ciMethod* method, int bci) ! : CallJavaNode(tf, addr, method, bci) { init_class_id(Class_CallStaticJava); if (C->eliminate_boxing() && (method != NULL) && method->is_boxing_method()) { init_flags(Flag_is_macro); C->add_macro_node(this); } _is_scalar_replaceable = false; _is_non_escaping = false; } CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci, const TypePtr* adr_type) ! : CallJavaNode(tf, addr, NULL, bci) { init_class_id(Class_CallStaticJava); // This node calls a runtime stub, which often has narrow memory effects. _adr_type = adr_type; _is_scalar_replaceable = false; _is_non_escaping = false; + _name = name; } // Result of Escape Analysis bool _is_scalar_replaceable; bool _is_non_escaping;
*** 752,768 **** virtual uint cmp( const Node &n ) const; virtual uint size_of() const; // Size is bigger public: CallRuntimeNode(const TypeFunc* tf, address addr, const char* name, const TypePtr* adr_type) ! : CallNode(tf, addr, adr_type), ! _name(name) { init_class_id(Class_CallRuntime); } - const char *_name; // Printable name, if _method is NULL virtual int Opcode() const; virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const; #ifndef PRODUCT virtual void dump_spec(outputStream *st) const; --- 756,771 ---- virtual uint cmp( const Node &n ) const; virtual uint size_of() const; // Size is bigger public: CallRuntimeNode(const TypeFunc* tf, address addr, const char* name, const TypePtr* adr_type) ! : CallNode(tf, addr, adr_type) { init_class_id(Class_CallRuntime); + _name = name; } virtual int Opcode() const; virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const; #ifndef PRODUCT virtual void dump_spec(outputStream *st) const;
*** 783,794 **** virtual int Opcode() const; virtual bool guaranteed_safepoint() { return false; } #ifndef PRODUCT virtual void dump_spec(outputStream *st) const; #endif - bool is_call_to_arraycopystub() const; - virtual bool may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase); }; //------------------------------CallLeafNoFPNode------------------------------- // CallLeafNode, not using floating point or using it in the same manner as // the generated code --- 786,795 ----
src/share/vm/opto/callnode.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File