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,
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;
197 virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
198 virtual Node* step_over_gc_barrier(Node* c) const;
199 // If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
200 // expanded later, then now is the time to do so.
201 virtual bool expand_macro_nodes(PhaseMacroExpand* macro) const;
202
203 static void find_dominating_barriers(PhaseIterGVN& igvn);
204 static void loop_optimize_gc_barrier(PhaseIdealLoop* phase, Node* node, bool last_round);
205
206 #ifdef ASSERT
207 virtual void verify_gc_barriers(bool post_parse) const;
208 #endif
209 };
210
211 #endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
|
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 #ifdef ASSERT
167 void verify_gc_barriers(bool post_parse) const;
168 #endif
169
170 protected:
171 virtual Node* load_at_resolved(C2Access& access, const Type* val_type) const;
172 virtual Node* atomic_cmpxchg_val_at_resolved(C2AtomicAccess& access,
173 Node* expected_val,
174 Node* new_val,
175 const Type* val_type) const;
176 virtual Node* atomic_cmpxchg_bool_at_resolved(C2AtomicAccess& access,
177 Node* expected_val,
178 Node* new_val,
179 const Type* value_type) const;
180 virtual Node* atomic_xchg_at_resolved(C2AtomicAccess& access,
181 Node* new_val,
182 const Type* val_type) const;
183
184 public:
185 Node* load_barrier(GraphKit* kit,
186 Node* val,
187 Node* adr,
188 bool weak = false,
189 bool writeback = true,
191
192 virtual void* create_barrier_state(Arena* comp_arena) const;
193 virtual bool has_load_barriers() const { return true; }
194 virtual bool is_gc_barrier_node(Node* node) const;
195 virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { }
196 virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const;
197 virtual void add_users_to_worklist(Unique_Node_List* worklist) const;
198 virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const;
199 virtual void register_potential_barrier_node(Node* node) const;
200 virtual void unregister_potential_barrier_node(Node* node) const;
201 virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
202 virtual Node* step_over_gc_barrier(Node* c) const;
203 // If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
204 // expanded later, then now is the time to do so.
205 virtual bool expand_macro_nodes(PhaseMacroExpand* macro) const;
206
207 static void find_dominating_barriers(PhaseIterGVN& igvn);
208 static void loop_optimize_gc_barrier(PhaseIdealLoop* phase, Node* node, bool last_round);
209
210 #ifdef ASSERT
211 virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
212 #endif
213 };
214
215 #endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
|