< prev index next >

src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp

Print this page
rev 54995 : 8224675: Late GC barrier insertion for ZGC
Reviewed-by:

*** 27,45 **** #include "gc/shared/c2/barrierSetC2.hpp" #include "memory/allocation.hpp" #include "opto/node.hpp" #include "utilities/growableArray.hpp" class LoadBarrierNode : public MultiNode { private: bool _weak; // On strong or weak oop reference - bool _writeback; // Controls if the barrier writes the healed oop back to memory - // A swap on a memory location must never write back the healed oop - bool _oop_reload_allowed; // Controls if the barrier are allowed to reload the oop from memory - // before healing, otherwise both the oop and the address must be - // passed to the barrier from the oop - static bool is_dominator(PhaseIdealLoop* phase, bool linear_only, Node *d, Node *n); void push_dominated_barriers(PhaseIterGVN* igvn) const; public: enum { --- 27,63 ---- #include "gc/shared/c2/barrierSetC2.hpp" #include "memory/allocation.hpp" #include "opto/node.hpp" #include "utilities/growableArray.hpp" + class ZCompareAndSwapPNode : public CompareAndSwapPNode { + public: + ZCompareAndSwapPNode(Node* c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord) : CompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { } + virtual int Opcode() const; + }; + + class ZWeakCompareAndSwapPNode : public WeakCompareAndSwapPNode { + public: + ZWeakCompareAndSwapPNode(Node* c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord) : WeakCompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { } + virtual int Opcode() const; + }; + + class ZCompareAndExchangePNode : public CompareAndExchangePNode { + public: + ZCompareAndExchangePNode(Node* c, Node *mem, Node *adr, Node *val, Node *ex, const TypePtr* at, const Type* t, MemNode::MemOrd mem_ord) : CompareAndExchangePNode(c, mem, adr, val, ex, at, t, mem_ord) { } + virtual int Opcode() const; + }; + + class ZGetAndSetPNode : public GetAndSetPNode { + public: + ZGetAndSetPNode(Node* c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t) : GetAndSetPNode(c, mem, adr, val, at, t) { } + virtual int Opcode() const; + }; + class LoadBarrierNode : public MultiNode { private: bool _weak; // On strong or weak oop reference static bool is_dominator(PhaseIdealLoop* phase, bool linear_only, Node *d, Node *n); void push_dominated_barriers(PhaseIterGVN* igvn) const; public: enum {
*** 55,67 **** LoadBarrierNode(Compile* C, Node* c, Node* mem, Node* val, Node* adr, ! bool weak, ! bool writeback, ! bool oop_reload_allowed); virtual int Opcode() const; virtual uint size_of() const; virtual bool cmp(const Node& n) const; virtual const Type *bottom_type() const; --- 73,83 ---- LoadBarrierNode(Compile* C, Node* c, Node* mem, Node* val, Node* adr, ! bool weak); virtual int Opcode() const; virtual uint size_of() const; virtual bool cmp(const Node& n) const; virtual const Type *bottom_type() const;
*** 84,113 **** } bool is_weak() const { return _weak; } - - bool is_writeback() const { - return _writeback; - } - - bool oop_reload_allowed() const { - return _oop_reload_allowed; - } }; class LoadBarrierSlowRegNode : public LoadPNode { public: LoadBarrierSlowRegNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest) : ! LoadPNode(c, mem, adr, at, t, mo, control_dependency) { init_class_id(Class_LoadBarrierSlowReg); } virtual const char * name() { return "LoadBarrierSlowRegNode"; --- 100,124 ---- } bool is_weak() const { return _weak; } }; class LoadBarrierSlowRegNode : public LoadPNode { + private: + bool _is_weak; public: LoadBarrierSlowRegNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo, + bool weak = false, ControlDependency control_dependency = DependsOnlyOnTest) : ! LoadPNode(c, mem, adr, at, t, mo, control_dependency), _is_weak(weak) { init_class_id(Class_LoadBarrierSlowReg); } virtual const char * name() { return "LoadBarrierSlowRegNode";
*** 116,149 **** virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) { return NULL; } virtual int Opcode() const; - }; - - class LoadBarrierWeakSlowRegNode : public LoadPNode { - public: - LoadBarrierWeakSlowRegNode(Node *c, - Node *mem, - Node *adr, - const TypePtr *at, - const TypePtr* t, - MemOrd mo, - ControlDependency control_dependency = DependsOnlyOnTest) : - LoadPNode(c, mem, adr, at, t, mo, control_dependency) { - init_class_id(Class_LoadBarrierWeakSlowReg); - } - - virtual const char * name() { - return "LoadBarrierWeakSlowRegNode"; - } - - virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) { - return NULL; - } ! virtual int Opcode() const; }; class ZBarrierSetC2State : public ResourceObj { private: // List of load barrier nodes which need to be expanded before matching --- 127,138 ---- virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) { return NULL; } virtual int Opcode() const; ! bool is_weak() { return _is_weak; } }; class ZBarrierSetC2State : public ResourceObj { private: // List of load barrier nodes which need to be expanded before matching
*** 158,173 **** }; class ZBarrierSetC2 : public BarrierSetC2 { private: ZBarrierSetC2State* state() const; - Node* make_cas_loadbarrier(C2AtomicParseAccess& access) const; - Node* make_cmpx_loadbarrier(C2AtomicParseAccess& access) const; - void expand_loadbarrier_basic(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; void expand_loadbarrier_node(PhaseMacroExpand* phase, LoadBarrierNode* barrier) const; - void expand_loadbarrier_optimized(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; - const TypeFunc* load_barrier_Type() const; #ifdef ASSERT void verify_gc_barriers(bool post_parse) const; #endif --- 147,157 ----
*** 184,226 **** virtual Node* atomic_xchg_at_resolved(C2AtomicParseAccess& access, Node* new_val, const Type* val_type) const; public: - Node* load_barrier(GraphKit* kit, - Node* val, - Node* adr, - bool weak = false, - bool writeback = true, - bool oop_reload_allowed = true) const; - virtual void* create_barrier_state(Arena* comp_arena) const; virtual bool has_load_barriers() const { return true; } virtual bool is_gc_barrier_node(Node* node) const; ! virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { } ! virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const; ! virtual void add_users_to_worklist(Unique_Node_List* worklist) const; ! virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const; virtual void register_potential_barrier_node(Node* node) const; virtual void unregister_potential_barrier_node(Node* node) const; ! virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const; ! virtual Node* step_over_gc_barrier(Node* c) const; ! // If the BarrierSetC2 state has kept barrier nodes in its compilation unit state to be ! // expanded later, then now is the time to do so. ! virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const; ! static void find_dominating_barriers(PhaseIterGVN& igvn); ! static void loop_optimize_gc_barrier(PhaseIdealLoop* phase, Node* node, bool last_round); virtual bool final_graph_reshaping(Compile* compile, Node* n, uint opcode) const; - virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const; #ifdef ASSERT virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const; #endif ! virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const; ! virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const; }; #endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP --- 168,210 ---- virtual Node* atomic_xchg_at_resolved(C2AtomicParseAccess& access, Node* new_val, const Type* val_type) const; public: virtual void* create_barrier_state(Arena* comp_arena) const; + virtual bool has_load_barriers() const { return true; } virtual bool is_gc_barrier_node(Node* node) const; ! virtual Node* step_over_gc_barrier(Node* c) const; ! virtual void register_potential_barrier_node(Node* node) const; virtual void unregister_potential_barrier_node(Node* node) const; ! virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { } ! virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const; ! virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const; ! virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const; + virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const; virtual bool final_graph_reshaping(Compile* compile, Node* n, uint opcode) const; virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const; + virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const; + virtual bool needs_anti_dependence_check(const Node* node) const; #ifdef ASSERT virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const; #endif ! // Load barrier insertion and expansion external ! virtual void barrier_insertion_phase(PhaseIterGVN &igvn) const; ! virtual void barrier_insertion(PhaseIdealLoop* phase) const; ! ! private: ! // Load barrier insertion and expansion internal ! void insert_barriers_on_unsafe(PhaseIdealLoop* phase) const; ! void clean_catch_blocks(PhaseIdealLoop* phase) const; ! void insert_load_barriers(PhaseIdealLoop* phase) const; ! LoadNode* insert_one_loadbarrier(PhaseIdealLoop* phase, LoadNode* load, Node* ctrl) const; ! void insert_one_loadbarrier_inner(PhaseIdealLoop* phase, LoadNode* load, Node* ctrl, VectorSet visited) const; }; #endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
< prev index next >