src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
changeset 55307 ed12027517c0
parent 54327 a4d19817609c
child 55536 8313c42345d5
--- 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