< 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 >