--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp Mon Jun 10 05:09:52 2019 +0200
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp Thu Feb 14 14:54:05 2019 +0100
@@ -29,15 +29,33 @@
#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
- 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;
@@ -57,9 +75,7 @@
Node* mem,
Node* val,
Node* adr,
- bool weak,
- bool writeback,
- bool oop_reload_allowed);
+ bool weak);
virtual int Opcode() const;
virtual uint size_of() const;
@@ -86,17 +102,11 @@
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 {
+private:
+ bool _is_weak;
public:
LoadBarrierSlowRegNode(Node *c,
Node *mem,
@@ -104,8 +114,9 @@
const TypePtr *at,
const TypePtr* t,
MemOrd mo,
+ bool weak = false,
ControlDependency control_dependency = DependsOnlyOnTest) :
- LoadPNode(c, mem, adr, at, t, mo, control_dependency) {
+ LoadPNode(c, mem, adr, at, t, mo, control_dependency), _is_weak(weak) {
init_class_id(Class_LoadBarrierSlowReg);
}
@@ -118,30 +129,8 @@
}
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;
+ bool is_weak() { return _is_weak; }
};
class ZBarrierSetC2State : public ResourceObj {
@@ -157,15 +146,17 @@
LoadBarrierNode* load_barrier_node(int idx) const;
};
+enum BarrierInfo {
+ NoBarrier = 0,
+ RequireBarrier = 1,
+ WeakBarrier = 3, // Inclusive with RequireBarrier
+ ExpandedBarrier = 4
+};
+
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;
@@ -186,41 +177,42 @@
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 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 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 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 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
- 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;
+ // Load barrier insertion and expansion external
+ virtual void barrier_insertion_phase(Compile* C, PhaseIterGVN &igvn) const;
+ virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const;
+ virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return (mode == LoopOptsZBarrierInsertion); }
+
+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