139 140 virtual int Opcode() const; 141 }; 142 143 class ZBarrierSetC2State : public ResourceObj { 144 private: 145 // List of load barrier nodes which need to be expanded before matching 146 GrowableArray<LoadBarrierNode*>* _load_barrier_nodes; 147 148 public: 149 ZBarrierSetC2State(Arena* comp_arena); 150 int load_barrier_count() const; 151 void add_load_barrier_node(LoadBarrierNode* n); 152 void remove_load_barrier_node(LoadBarrierNode* n); 153 LoadBarrierNode* load_barrier_node(int idx) const; 154 }; 155 156 class ZBarrierSetC2 : public BarrierSetC2 { 157 private: 158 ZBarrierSetC2State* state() const; 159 Node* make_cas_loadbarrier(C2AtomicAccess& access) const; 160 Node* make_cmpx_loadbarrier(C2AtomicAccess& access) const; 161 void expand_loadbarrier_basic(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; 162 void expand_loadbarrier_node(PhaseMacroExpand* phase, LoadBarrierNode* barrier) const; 163 void expand_loadbarrier_optimized(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; 164 const TypeFunc* load_barrier_Type() const; 165 166 protected: 167 virtual Node* load_at_resolved(C2Access& access, const Type* val_type) const; 168 virtual Node* atomic_cmpxchg_val_at_resolved(C2AtomicAccess& access, 169 Node* expected_val, 170 Node* new_val, 171 const Type* val_type) const; 172 virtual Node* atomic_cmpxchg_bool_at_resolved(C2AtomicAccess& access, 173 Node* expected_val, 174 Node* new_val, 175 const Type* value_type) const; 176 virtual Node* atomic_xchg_at_resolved(C2AtomicAccess& access, 177 Node* new_val, 178 const Type* val_type) const; 179 180 public: 181 Node* load_barrier(GraphKit* kit, 182 Node* val, 183 Node* adr, 184 bool weak = false, 185 bool writeback = true, 186 bool oop_reload_allowed = true) const; 187 188 virtual void* create_barrier_state(Arena* comp_arena) const; 189 virtual bool has_load_barriers() const { return true; } 190 virtual bool is_gc_barrier_node(Node* node) const; 191 virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { } 192 virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const; 193 virtual void add_users_to_worklist(Unique_Node_List* worklist) const; 194 virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const; 195 virtual void register_potential_barrier_node(Node* node) const; 196 virtual void unregister_potential_barrier_node(Node* node) const; | 139 140 virtual int Opcode() const; 141 }; 142 143 class ZBarrierSetC2State : public ResourceObj { 144 private: 145 // List of load barrier nodes which need to be expanded before matching 146 GrowableArray<LoadBarrierNode*>* _load_barrier_nodes; 147 148 public: 149 ZBarrierSetC2State(Arena* comp_arena); 150 int load_barrier_count() const; 151 void add_load_barrier_node(LoadBarrierNode* n); 152 void remove_load_barrier_node(LoadBarrierNode* n); 153 LoadBarrierNode* load_barrier_node(int idx) const; 154 }; 155 156 class ZBarrierSetC2 : public BarrierSetC2 { 157 private: 158 ZBarrierSetC2State* state() const; 159 Node* make_cas_loadbarrier(C2AtomicParseAccess& access) const; 160 Node* make_cmpx_loadbarrier(C2AtomicParseAccess& access) const; 161 void expand_loadbarrier_basic(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; 162 void expand_loadbarrier_node(PhaseMacroExpand* phase, LoadBarrierNode* barrier) const; 163 void expand_loadbarrier_optimized(PhaseMacroExpand* phase, LoadBarrierNode *barrier) const; 164 const TypeFunc* load_barrier_Type() const; 165 166 protected: 167 virtual Node* load_at_resolved(C2Access& access, const Type* val_type) const; 168 virtual Node* atomic_cmpxchg_val_at_resolved(C2AtomicParseAccess& access, 169 Node* expected_val, 170 Node* new_val, 171 const Type* val_type) const; 172 virtual Node* atomic_cmpxchg_bool_at_resolved(C2AtomicParseAccess& access, 173 Node* expected_val, 174 Node* new_val, 175 const Type* value_type) const; 176 virtual Node* atomic_xchg_at_resolved(C2AtomicParseAccess& access, 177 Node* new_val, 178 const Type* val_type) const; 179 180 public: 181 Node* load_barrier(GraphKit* kit, 182 Node* val, 183 Node* adr, 184 bool weak = false, 185 bool writeback = true, 186 bool oop_reload_allowed = true) const; 187 188 virtual void* create_barrier_state(Arena* comp_arena) const; 189 virtual bool has_load_barriers() const { return true; } 190 virtual bool is_gc_barrier_node(Node* node) const; 191 virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { } 192 virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const; 193 virtual void add_users_to_worklist(Unique_Node_List* worklist) const; 194 virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const; 195 virtual void register_potential_barrier_node(Node* node) const; 196 virtual void unregister_potential_barrier_node(Node* node) const; |