1/*
2 * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_C1_C1_LINEARSCAN_HPP
26#define SHARE_C1_C1_LINEARSCAN_HPP
27
28#include "c1/c1_FpuStackSim.hpp"
29#include "c1/c1_FrameMap.hpp"
30#include "c1/c1_IR.hpp"
31#include "c1/c1_Instruction.hpp"
32#include "c1/c1_LIR.hpp"
33#include "c1/c1_LIRGenerator.hpp"
34#include "utilities/align.hpp"
35#include "utilities/macros.hpp"
36
37class FpuStackAllocator;
38class IRScopeDebugInfo;
39class Interval;
40class IntervalWalker;
41class LIRGenerator;
42class LinearScan;
43class MoveResolver;
44class Range;
45
46typedef GrowableArray<Interval*> IntervalArray;
47typedef GrowableArray<Interval*> IntervalList;
48typedef GrowableArray<IntervalList*> IntervalsList;
49typedef GrowableArray<ScopeValue*> ScopeValueArray;
50typedef GrowableArray<LIR_OpList*> LIR_OpListStack;
51
52enum IntervalUseKind {
53 // priority of use kinds must be ascending
54 noUse = 0,
55 loopEndMarker = 1,
56 shouldHaveRegister = 2,
57 mustHaveRegister = 3,
58
59 firstValidKind = 1,
60 lastValidKind = 3
61};
62
63enum IntervalKind {
64 fixedKind = 0, // interval pre-colored by LIR_Generator
65 anyKind = 1, // no register/memory allocated by LIR_Generator
66 nofKinds,
67 firstKind = fixedKind
68};
69
70
71// during linear scan an interval is in one of four states in
72enum IntervalState {
73 unhandledState = 0, // unhandled state (not processed yet)
74 activeState = 1, // life and is in a physical register
75 inactiveState = 2, // in a life time hole and is in a physical register
76 handledState = 3, // spilled or not life again
77 invalidState = -1
78};
79
80
81enum IntervalSpillState {
82 noDefinitionFound, // starting state of calculation: no definition found yet
83 oneDefinitionFound, // one definition has already been found.
84 // Note: two consecutive definitions are treated as one (e.g. consecutive move and add because of two-operand LIR form)
85 // the position of this definition is stored in _definition_pos
86 oneMoveInserted, // one spill move has already been inserted.
87 storeAtDefinition, // the interval should be stored immediately after its definition because otherwise
88 // there would be multiple redundant stores
89 startInMemory, // the interval starts in memory (e.g. method parameter), so a store is never necessary
90 noOptimization // the interval has more then one definition (e.g. resulting from phi moves), so stores to memory are not optimized
91};
92
93
94#define for_each_interval_kind(kind) \
95 for (IntervalKind kind = firstKind; kind < nofKinds; kind = (IntervalKind)(kind + 1))
96
97#define for_each_visitor_mode(mode) \
98 for (LIR_OpVisitState::OprMode mode = LIR_OpVisitState::firstMode; mode < LIR_OpVisitState::numModes; mode = (LIR_OpVisitState::OprMode)(mode + 1))
99
100
101class LinearScan : public CompilationResourceObj {
102 // declare classes used by LinearScan as friends because they
103 // need a wide variety of functions declared here
104 //
105 // Only the small interface to the rest of the compiler is public
106 friend class Interval;
107 friend class IntervalWalker;
108 friend class LinearScanWalker;
109 friend class FpuStackAllocator;
110 friend class MoveResolver;
111 friend class LinearScanStatistic;
112 friend class LinearScanTimers;
113 friend class RegisterVerifier;
114
115 public:
116 enum {
117 any_reg = -1,
118 nof_cpu_regs = pd_nof_cpu_regs_linearscan,
119 nof_fpu_regs = pd_nof_fpu_regs_linearscan,
120 nof_xmm_regs = pd_nof_xmm_regs_linearscan,
121 nof_regs = nof_cpu_regs + nof_fpu_regs + nof_xmm_regs
122 };
123
124 private:
125 Compilation* _compilation;
126 IR* _ir;
127 LIRGenerator* _gen;
128 FrameMap* _frame_map;
129
130 BlockList _cached_blocks; // cached list with all blocks in linear-scan order (only correct if original list keeps unchanged)
131 int _num_virtual_regs; // number of virtual registers (without new registers introduced because of splitting intervals)
132 bool _has_fpu_registers; // true if this method uses any floating point registers (and so fpu stack allocation is necessary)
133 int _num_calls; // total number of calls in this method
134 int _max_spills; // number of stack slots used for intervals allocated to memory
135 int _unused_spill_slot; // unused spill slot for a single-word value because of alignment of a double-word value
136
137 IntervalList _intervals; // mapping from register number to interval
138 IntervalList* _new_intervals_from_allocation; // list with all intervals created during allocation when an existing interval is split
139 IntervalArray* _sorted_intervals; // intervals sorted by Interval::from()
140 bool _needs_full_resort; // set to true if an Interval::from() is changed and _sorted_intervals must be resorted
141
142 LIR_OpArray _lir_ops; // mapping from LIR_Op id to LIR_Op node
143 BlockBeginArray _block_of_op; // mapping from LIR_Op id to the BlockBegin containing this instruction
144 ResourceBitMap _has_info; // bit set for each LIR_Op id that has a CodeEmitInfo
145 ResourceBitMap _has_call; // bit set for each LIR_Op id that destroys all caller save registers
146 BitMap2D _interval_in_loop; // bit set for each virtual register that is contained in each loop
147
148 // cached debug info to prevent multiple creation of same object
149 // TODO: cached scope values for registers could be static
150 ScopeValueArray _scope_value_cache;
151
152 static ConstantOopWriteValue* _oop_null_scope_value;
153 static ConstantIntValue* _int_m1_scope_value;
154 static ConstantIntValue* _int_0_scope_value;
155 static ConstantIntValue* _int_1_scope_value;
156 static ConstantIntValue* _int_2_scope_value;
157
158 // accessors
159 IR* ir() const { return _ir; }
160 Compilation* compilation() const { return _compilation; }
161 LIRGenerator* gen() const { return _gen; }
162 FrameMap* frame_map() const { return _frame_map; }
163
164 // unified bailout support
165 void bailout(const char* msg) const { compilation()->bailout(msg); }
166 bool bailed_out() const { return compilation()->bailed_out(); }
167
168 // access to block list (sorted in linear scan order)
169 int block_count() const { assert(_cached_blocks.length() == ir()->linear_scan_order()->length(), "invalid cached block list"); return _cached_blocks.length(); }
170 BlockBegin* block_at(int idx) const { assert(_cached_blocks.at(idx) == ir()->linear_scan_order()->at(idx), "invalid cached block list"); return _cached_blocks.at(idx); }
171
172 int num_virtual_regs() const { return _num_virtual_regs; }
173 // size of live_in and live_out sets of BasicBlocks (BitMap needs rounded size for iteration)
174 int live_set_size() const { return align_up(_num_virtual_regs, BitsPerWord); }
175 bool has_fpu_registers() const { return _has_fpu_registers; }
176 int num_loops() const { return ir()->num_loops(); }
177 bool is_interval_in_loop(int interval, int loop) const { return _interval_in_loop.at(interval, loop); }
178
179 // handling of fpu stack allocation (platform dependent, needed for debug information generation)
180#ifdef X86
181 FpuStackAllocator* _fpu_stack_allocator;
182 bool use_fpu_stack_allocation() const { return UseSSE < 2 && has_fpu_registers(); }
183#else
184 bool use_fpu_stack_allocation() const { return false; }
185#endif
186
187
188 // access to interval list
189 int interval_count() const { return _intervals.length(); }
190 Interval* interval_at(int reg_num) const { return _intervals.at(reg_num); }
191
192 // access to LIR_Ops and Blocks indexed by op_id
193 int max_lir_op_id() const { assert(_lir_ops.length() > 0, "no operations"); return (_lir_ops.length() - 1) << 1; }
194 LIR_Op* lir_op_with_id(int op_id) const { assert(op_id >= 0 && op_id <= max_lir_op_id() && op_id % 2 == 0, "op_id out of range or not even"); return _lir_ops.at(op_id >> 1); }
195 BlockBegin* block_of_op_with_id(int op_id) const { assert(_block_of_op.length() > 0 && op_id >= 0 && op_id <= max_lir_op_id() + 1, "op_id out of range"); return _block_of_op.at(op_id >> 1); }
196
197 bool is_block_begin(int op_id) { return op_id == 0 || block_of_op_with_id(op_id) != block_of_op_with_id(op_id - 1); }
198
199 bool has_call(int op_id) { assert(op_id % 2 == 0, "must be even"); return _has_call.at(op_id >> 1); }
200 bool has_info(int op_id) { assert(op_id % 2 == 0, "must be even"); return _has_info.at(op_id >> 1); }
201
202
203 // functions for converting LIR-Operands to register numbers
204 static bool is_valid_reg_num(int reg_num) { return reg_num >= 0; }
205 static int reg_num(LIR_Opr opr);
206 static int reg_numHi(LIR_Opr opr);
207
208 // functions for classification of intervals
209 static bool is_precolored_interval(const Interval* i);
210 static bool is_virtual_interval(const Interval* i);
211
212 static bool is_precolored_cpu_interval(const Interval* i);
213 static bool is_virtual_cpu_interval(const Interval* i);
214 static bool is_precolored_fpu_interval(const Interval* i);
215 static bool is_virtual_fpu_interval(const Interval* i);
216
217 static bool is_in_fpu_register(const Interval* i);
218 static bool is_oop_interval(const Interval* i);
219
220
221 // General helper functions
222 int allocate_spill_slot(bool double_word);
223 void assign_spill_slot(Interval* it);
224 void propagate_spill_slots();
225
226 Interval* create_interval(int reg_num);
227 void append_interval(Interval* it);
228 void copy_register_flags(Interval* from, Interval* to);
229
230 // platform dependent functions
231 static bool is_processed_reg_num(int reg_num);
232 static int num_physical_regs(BasicType type);
233 static bool requires_adjacent_regs(BasicType type);
234 static bool is_caller_save(int assigned_reg);
235
236 // spill move optimization: eliminate moves from register to stack if
237 // stack slot is known to be correct
238 void change_spill_definition_pos(Interval* interval, int def_pos);
239 void change_spill_state(Interval* interval, int spill_pos);
240 static bool must_store_at_definition(const Interval* i);
241 void eliminate_spill_moves();
242
243 // Phase 1: number all instructions in all blocks
244 void number_instructions();
245
246 // Phase 2: compute local live sets separately for each block
247 // (sets live_gen and live_kill for each block)
248 //
249 // helper methods used by compute_local_live_sets()
250 void set_live_gen_kill(Value value, LIR_Op* op, BitMap& live_gen, BitMap& live_kill);
251
252 void compute_local_live_sets();
253
254 // Phase 3: perform a backward dataflow analysis to compute global live sets
255 // (sets live_in and live_out for each block)
256 void compute_global_live_sets();
257
258
259 // Phase 4: build intervals
260 // (fills the list _intervals)
261 //
262 // helper methods used by build_intervals()
263 void add_use (Value value, int from, int to, IntervalUseKind use_kind);
264
265 void add_def (LIR_Opr opr, int def_pos, IntervalUseKind use_kind);
266 void add_use (LIR_Opr opr, int from, int to, IntervalUseKind use_kind);
267 void add_temp(LIR_Opr opr, int temp_pos, IntervalUseKind use_kind);
268
269 void add_def (int reg_num, int def_pos, IntervalUseKind use_kind, BasicType type);
270 void add_use (int reg_num, int from, int to, IntervalUseKind use_kind, BasicType type);
271 void add_temp(int reg_num, int temp_pos, IntervalUseKind use_kind, BasicType type);
272
273 // Add platform dependent kills for particular LIR ops. Can be used
274 // to add platform dependent behaviour for some operations.
275 void pd_add_temps(LIR_Op* op);
276
277 IntervalUseKind use_kind_of_output_operand(LIR_Op* op, LIR_Opr opr);
278 IntervalUseKind use_kind_of_input_operand(LIR_Op* op, LIR_Opr opr);
279 void handle_method_arguments(LIR_Op* op);
280 void handle_doubleword_moves(LIR_Op* op);
281 void add_register_hints(LIR_Op* op);
282
283 void build_intervals();
284
285
286 // Phase 5: actual register allocation
287 // (Uses LinearScanWalker)
288 //
289 // helper functions for building a sorted list of intervals
290 NOT_PRODUCT(bool is_sorted(IntervalArray* intervals);)
291 static int interval_cmp(Interval** a, Interval** b);
292 void add_to_list(Interval** first, Interval** prev, Interval* interval);
293 void create_unhandled_lists(Interval** list1, Interval** list2, bool (is_list1)(const Interval* i), bool (is_list2)(const Interval* i));
294
295 void sort_intervals_before_allocation();
296 void sort_intervals_after_allocation();
297 void allocate_registers();
298
299
300 // Phase 6: resolve data flow
301 // (insert moves at edges between blocks if intervals have been split)
302 //
303 // helper functions for resolve_data_flow()
304 Interval* split_child_at_op_id(Interval* interval, int op_id, LIR_OpVisitState::OprMode mode);
305 Interval* interval_at_block_begin(BlockBegin* block, int reg_num);
306 Interval* interval_at_block_end(BlockBegin* block, int reg_num);
307 Interval* interval_at_op_id(int reg_num, int op_id);
308 void resolve_collect_mappings(BlockBegin* from_block, BlockBegin* to_block, MoveResolver &move_resolver);
309 void resolve_find_insert_pos(BlockBegin* from_block, BlockBegin* to_block, MoveResolver &move_resolver);
310 void resolve_data_flow();
311
312 void resolve_exception_entry(BlockBegin* block, int reg_num, MoveResolver &move_resolver);
313 void resolve_exception_entry(BlockBegin* block, MoveResolver &move_resolver);
314 void resolve_exception_edge(XHandler* handler, int throwing_op_id, int reg_num, Phi* phi, MoveResolver &move_resolver);
315 void resolve_exception_edge(XHandler* handler, int throwing_op_id, MoveResolver &move_resolver);
316 void resolve_exception_handlers();
317
318 // Phase 7: assign register numbers back to LIR
319 // (includes computation of debug information and oop maps)
320 //
321 // helper functions for assign_reg_num()
322 VMReg vm_reg_for_interval(Interval* interval);
323 VMReg vm_reg_for_operand(LIR_Opr opr);
324
325 static LIR_Opr operand_for_interval(Interval* interval);
326 static LIR_Opr calc_operand_for_interval(const Interval* interval);
327 LIR_Opr canonical_spill_opr(Interval* interval);
328
329 LIR_Opr color_lir_opr(LIR_Opr opr, int id, LIR_OpVisitState::OprMode);
330
331 // methods used for oop map computation
332 IntervalWalker* init_compute_oop_maps();
333 OopMap* compute_oop_map(IntervalWalker* iw, LIR_Op* op, CodeEmitInfo* info, bool is_call_site);
334 void compute_oop_map(IntervalWalker* iw, const LIR_OpVisitState &visitor, LIR_Op* op);
335
336 // methods used for debug information computation
337 void init_compute_debug_info();
338
339 MonitorValue* location_for_monitor_index(int monitor_index);
340 LocationValue* location_for_name(int name, Location::Type loc_type);
341 void set_oop(OopMap* map, VMReg name) {
342 if (map->legal_vm_reg_name(name)) {
343 map->set_oop(name);
344 } else {
345 bailout("illegal oopMap register name");
346 }
347 }
348
349 int append_scope_value_for_constant(LIR_Opr opr, GrowableArray<ScopeValue*>* scope_values);
350 int append_scope_value_for_operand(LIR_Opr opr, GrowableArray<ScopeValue*>* scope_values);
351 int append_scope_value(int op_id, Value value, GrowableArray<ScopeValue*>* scope_values);
352
353 IRScopeDebugInfo* compute_debug_info_for_scope(int op_id, IRScope* cur_scope, ValueStack* cur_state, ValueStack* innermost_state);
354 void compute_debug_info(CodeEmitInfo* info, int op_id);
355
356 void assign_reg_num(LIR_OpList* instructions, IntervalWalker* iw);
357 void assign_reg_num();
358
359
360 // Phase 8: fpu stack allocation
361 // (Used only on x86 when fpu operands are present)
362 void allocate_fpu_stack();
363
364
365 // helper functions for printing state
366#ifndef PRODUCT
367 static void print_bitmap(BitMap& bitmap);
368 void print_intervals(const char* label);
369 void print_lir(int level, const char* label, bool hir_valid = true);
370#endif
371
372#ifdef ASSERT
373 // verification functions for allocation
374 // (check that all intervals have a correct register and that no registers are overwritten)
375 void verify();
376 void verify_intervals();
377 void verify_no_oops_in_fixed_intervals();
378 void verify_constants();
379 void verify_registers();
380#endif
381
382 public:
383 // creation
384 LinearScan(IR* ir, LIRGenerator* gen, FrameMap* frame_map);
385
386 // main entry function: perform linear scan register allocation
387 void do_linear_scan();
388
389 // accessors used by Compilation
390 int max_spills() const { return _max_spills; }
391 int num_calls() const { assert(_num_calls >= 0, "not set"); return _num_calls; }
392
393 // entry functions for printing
394#ifndef PRODUCT
395 static void print_statistics();
396 static void print_timers(double total);
397#endif
398};
399
400
401// Helper class for ordering moves that are inserted at the same position in the LIR
402// When moves between registers are inserted, it is important that the moves are
403// ordered such that no register is overwritten. So moves from register to stack
404// are processed prior to moves from stack to register. When moves have circular
405// dependencies, a temporary stack slot is used to break the circle.
406// The same logic is used in the LinearScanWalker and in LinearScan during resolve_data_flow
407// and therefore factored out in a separate class
408class MoveResolver: public StackObj {
409 private:
410 LinearScan* _allocator;
411
412 LIR_List* _insert_list;
413 int _insert_idx;
414 LIR_InsertionBuffer _insertion_buffer; // buffer where moves are inserted
415
416 IntervalList _mapping_from;
417 LIR_OprList _mapping_from_opr;
418 IntervalList _mapping_to;
419 bool _multiple_reads_allowed;
420 int _register_blocked[LinearScan::nof_regs];
421
422 int register_blocked(int reg) { assert(reg >= 0 && reg < LinearScan::nof_regs, "out of bounds"); return _register_blocked[reg]; }
423 void set_register_blocked(int reg, int direction) { assert(reg >= 0 && reg < LinearScan::nof_regs, "out of bounds"); assert(direction == 1 || direction == -1, "out of bounds"); _register_blocked[reg] += direction; }
424
425 void block_registers(Interval* it);
426 void unblock_registers(Interval* it);
427 bool save_to_process_move(Interval* from, Interval* to);
428
429 void create_insertion_buffer(LIR_List* list);
430 void append_insertion_buffer();
431 void insert_move(Interval* from_interval, Interval* to_interval);
432 void insert_move(LIR_Opr from_opr, Interval* to_interval);
433
434 DEBUG_ONLY(void verify_before_resolve();)
435 void resolve_mappings();
436 public:
437 MoveResolver(LinearScan* allocator);
438
439 DEBUG_ONLY(void check_empty();)
440 void set_multiple_reads_allowed() { _multiple_reads_allowed = true; }
441 void set_insert_position(LIR_List* insert_list, int insert_idx);
442 void move_insert_position(LIR_List* insert_list, int insert_idx);
443 void add_mapping(Interval* from, Interval* to);
444 void add_mapping(LIR_Opr from, Interval* to);
445 void resolve_and_append_moves();
446
447 LinearScan* allocator() { return _allocator; }
448 bool has_mappings() { return _mapping_from.length() > 0; }
449};
450
451
452class Range : public CompilationResourceObj {
453 friend class Interval;
454
455 private:
456 static Range* _end; // sentinel (from == to == max_jint)
457
458 int _from; // from (inclusive)
459 int _to; // to (exclusive)
460 Range* _next; // linear list of Ranges
461
462 // used only by class Interval, so hide them
463 bool intersects(Range* r) const { return intersects_at(r) != -1; }
464 int intersects_at(Range* r) const;
465
466 public:
467 Range(int from, int to, Range* next);
468
469 static void initialize(Arena* arena);
470 static Range* end() { return _end; }
471
472 int from() const { return _from; }
473 int to() const { return _to; }
474 Range* next() const { return _next; }
475 void set_from(int from) { _from = from; }
476 void set_to(int to) { _to = to; }
477 void set_next(Range* next) { _next = next; }
478
479 // for testing
480 void print(outputStream* out = tty) const PRODUCT_RETURN;
481};
482
483
484// Interval is an ordered list of disjoint ranges.
485
486// For pre-colored double word LIR_Oprs, one interval is created for
487// the low word register and one is created for the hi word register.
488// On Intel for FPU double registers only one interval is created. At
489// all times assigned_reg contains the reg. number of the physical
490// register.
491
492// For LIR_Opr in virtual registers a single interval can represent
493// single and double word values. When a physical register is
494// assigned to the interval, assigned_reg contains the
495// phys. reg. number and for double word values assigned_regHi the
496// phys. reg. number of the hi word if there is any. For spilled
497// intervals assigned_reg contains the stack index. assigned_regHi is
498// always -1.
499
500class Interval : public CompilationResourceObj {
501 private:
502 static Interval* _end; // sentinel (interval with only range Range::end())
503
504 int _reg_num;
505 BasicType _type; // valid only for virtual registers
506 Range* _first; // sorted list of Ranges
507 intStack _use_pos_and_kinds; // sorted list of use-positions and their according use-kinds
508
509 Range* _current; // interval iteration: the current Range
510 Interval* _next; // interval iteration: sorted list of Intervals (ends with sentinel)
511 IntervalState _state; // interval iteration: to which set belongs this interval
512
513
514 int _assigned_reg;
515 int _assigned_regHi;
516
517 int _cached_to; // cached value: to of last range (-1: not cached)
518 LIR_Opr _cached_opr;
519 VMReg _cached_vm_reg;
520
521 Interval* _split_parent; // the original interval where this interval is derived from
522 IntervalList* _split_children; // list of all intervals that are split off from this interval (only available for split parents)
523 Interval* _current_split_child; // the current split child that has been active or inactive last (always stored in split parents)
524
525 int _canonical_spill_slot; // the stack slot where all split parts of this interval are spilled to (always stored in split parents)
526 bool _insert_move_when_activated; // true if move is inserted between _current_split_child and this interval when interval gets active the first time
527 IntervalSpillState _spill_state; // for spill move optimization
528 int _spill_definition_pos; // position where the interval is defined (if defined only once)
529 Interval* _register_hint; // this interval should be in the same register as the hint interval
530
531 int calc_to();
532 Interval* new_split_child();
533 public:
534 Interval(int reg_num);
535
536 static void initialize(Arena* arena);
537 static Interval* end() { return _end; }
538
539 // accessors
540 int reg_num() const { return _reg_num; }
541 void set_reg_num(int r) { assert(_reg_num == -1, "cannot change reg_num"); _reg_num = r; }
542 BasicType type() const { assert(_reg_num == -1 || _reg_num >= LIR_OprDesc::vreg_base, "cannot access type for fixed interval"); return _type; }
543 void set_type(BasicType type) { assert(_reg_num < LIR_OprDesc::vreg_base || _type == T_ILLEGAL || _type == type, "overwriting existing type"); _type = type; }
544
545 Range* first() const { return _first; }
546 int from() const { return _first->from(); }
547 int to() { if (_cached_to == -1) _cached_to = calc_to(); assert(_cached_to == calc_to(), "invalid cached value"); return _cached_to; }
548
549#ifndef PRODUCT
550 int num_use_positions() const { return _use_pos_and_kinds.length() / 2; }
551#endif
552
553 Interval* next() const { return _next; }
554 Interval** next_addr() { return &_next; }
555 void set_next(Interval* next) { _next = next; }
556
557 int assigned_reg() const { return _assigned_reg; }
558 int assigned_regHi() const { return _assigned_regHi; }
559 void assign_reg(int reg) { _assigned_reg = reg; _assigned_regHi = LinearScan::any_reg; }
560 void assign_reg(int reg,int regHi) { _assigned_reg = reg; _assigned_regHi = regHi; }
561
562 Interval* register_hint(bool search_split_child = true) const; // calculation needed
563 void set_register_hint(Interval* i) { _register_hint = i; }
564
565 int state() const { return _state; }
566 void set_state(IntervalState s) { _state = s; }
567
568 // access to split parent and split children
569 bool is_split_parent() const { return _split_parent == this; }
570 bool is_split_child() const { return _split_parent != this; }
571 Interval* split_parent() const { assert(_split_parent->is_split_parent(), "must be"); return _split_parent; }
572 Interval* split_child_at_op_id(int op_id, LIR_OpVisitState::OprMode mode);
573 Interval* split_child_before_op_id(int op_id);
574 DEBUG_ONLY(void check_split_children();)
575
576 // information stored in split parent, but available for all children
577 int canonical_spill_slot() const { return split_parent()->_canonical_spill_slot; }
578 void set_canonical_spill_slot(int slot) { assert(split_parent()->_canonical_spill_slot == -1, "overwriting existing value"); split_parent()->_canonical_spill_slot = slot; }
579 Interval* current_split_child() const { return split_parent()->_current_split_child; }
580 void make_current_split_child() { split_parent()->_current_split_child = this; }
581
582 bool insert_move_when_activated() const { return _insert_move_when_activated; }
583 void set_insert_move_when_activated(bool b) { _insert_move_when_activated = b; }
584
585 // for spill optimization
586 IntervalSpillState spill_state() const { return split_parent()->_spill_state; }
587 int spill_definition_pos() const { return split_parent()->_spill_definition_pos; }
588 void set_spill_state(IntervalSpillState state) { assert(state >= spill_state(), "state cannot decrease"); split_parent()->_spill_state = state; }
589 void set_spill_definition_pos(int pos) { assert(spill_definition_pos() == -1, "cannot set the position twice"); split_parent()->_spill_definition_pos = pos; }
590 // returns true if this interval has a shadow copy on the stack that is always correct
591 bool always_in_memory() const { return split_parent()->_spill_state == storeAtDefinition || split_parent()->_spill_state == startInMemory; }
592
593 // caching of values that take time to compute and are used multiple times
594 LIR_Opr cached_opr() const { return _cached_opr; }
595 VMReg cached_vm_reg() const { return _cached_vm_reg; }
596 void set_cached_opr(LIR_Opr opr) { _cached_opr = opr; }
597 void set_cached_vm_reg(VMReg reg) { _cached_vm_reg = reg; }
598
599 // access to use positions
600 int first_usage(IntervalUseKind min_use_kind) const; // id of the first operation requiring this interval in a register
601 int next_usage(IntervalUseKind min_use_kind, int from) const; // id of next usage seen from the given position
602 int next_usage_exact(IntervalUseKind exact_use_kind, int from) const;
603 int previous_usage(IntervalUseKind min_use_kind, int from) const;
604
605 // manipulating intervals
606 void add_use_pos(int pos, IntervalUseKind use_kind);
607 void add_range(int from, int to);
608 Interval* split(int split_pos);
609 Interval* split_from_start(int split_pos);
610 void remove_first_use_pos() { _use_pos_and_kinds.trunc_to(_use_pos_and_kinds.length() - 2); }
611
612 // test intersection
613 bool covers(int op_id, LIR_OpVisitState::OprMode mode) const;
614 bool has_hole_between(int from, int to);
615 bool intersects(Interval* i) const { return _first->intersects(i->_first); }
616 int intersects_at(Interval* i) const { return _first->intersects_at(i->_first); }
617
618 // range iteration
619 void rewind_range() { _current = _first; }
620 void next_range() { assert(this != _end, "not allowed on sentinel"); _current = _current->next(); }
621 int current_from() const { return _current->from(); }
622 int current_to() const { return _current->to(); }
623 bool current_at_end() const { return _current == Range::end(); }
624 bool current_intersects(Interval* it) { return _current->intersects(it->_current); };
625 int current_intersects_at(Interval* it) { return _current->intersects_at(it->_current); };
626
627 // printing
628 void print(outputStream* out = tty) const PRODUCT_RETURN;
629};
630
631
632class IntervalWalker : public CompilationResourceObj {
633 protected:
634 Compilation* _compilation;
635 LinearScan* _allocator;
636
637 Interval* _unhandled_first[nofKinds]; // sorted list of intervals, not life before the current position
638 Interval* _active_first [nofKinds]; // sorted list of intervals, life at the current position
639 Interval* _inactive_first [nofKinds]; // sorted list of intervals, intervals in a life time hole at the current position
640
641 Interval* _current; // the current interval coming from unhandled list
642 int _current_position; // the current position (intercept point through the intervals)
643 IntervalKind _current_kind; // and whether it is fixed_kind or any_kind.
644
645
646 Compilation* compilation() const { return _compilation; }
647 LinearScan* allocator() const { return _allocator; }
648
649 // unified bailout support
650 void bailout(const char* msg) const { compilation()->bailout(msg); }
651 bool bailed_out() const { return compilation()->bailed_out(); }
652
653 void check_bounds(IntervalKind kind) { assert(kind >= fixedKind && kind <= anyKind, "invalid interval_kind"); }
654
655 Interval** unhandled_first_addr(IntervalKind kind) { check_bounds(kind); return &_unhandled_first[kind]; }
656 Interval** active_first_addr(IntervalKind kind) { check_bounds(kind); return &_active_first[kind]; }
657 Interval** inactive_first_addr(IntervalKind kind) { check_bounds(kind); return &_inactive_first[kind]; }
658
659 void append_sorted(Interval** first, Interval* interval);
660 void append_to_unhandled(Interval** list, Interval* interval);
661
662 bool remove_from_list(Interval** list, Interval* i);
663 void remove_from_list(Interval* i);
664
665 void next_interval();
666 Interval* current() const { return _current; }
667 IntervalKind current_kind() const { return _current_kind; }
668
669 void walk_to(IntervalState state, int from);
670
671 // activate_current() is called when an unhandled interval becomes active (in current(), current_kind()).
672 // Return false if current() should not be moved the the active interval list.
673 // It is safe to append current to any interval list but the unhandled list.
674 virtual bool activate_current() { return true; }
675
676 // interval_moved() is called whenever an interval moves from one interval list to another.
677 // In the implementation of this method it is prohibited to move the interval to any list.
678 virtual void interval_moved(Interval* interval, IntervalKind kind, IntervalState from, IntervalState to);
679
680 public:
681 IntervalWalker(LinearScan* allocator, Interval* unhandled_fixed_first, Interval* unhandled_any_first);
682
683 Interval* unhandled_first(IntervalKind kind) { check_bounds(kind); return _unhandled_first[kind]; }
684 Interval* active_first(IntervalKind kind) { check_bounds(kind); return _active_first[kind]; }
685 Interval* inactive_first(IntervalKind kind) { check_bounds(kind); return _inactive_first[kind]; }
686
687 // active contains the intervals that are live after the lir_op
688 void walk_to(int lir_op_id);
689 // active contains the intervals that are live before the lir_op
690 void walk_before(int lir_op_id) { walk_to(lir_op_id-1); }
691 // walk through all intervals
692 void walk() { walk_to(max_jint); }
693
694 int current_position() { return _current_position; }
695};
696
697
698// The actual linear scan register allocator
699class LinearScanWalker : public IntervalWalker {
700 enum {
701 any_reg = LinearScan::any_reg
702 };
703
704 private:
705 int _first_reg; // the reg. number of the first phys. register
706 int _last_reg; // the reg. nmber of the last phys. register
707 int _num_phys_regs; // required by current interval
708 bool _adjacent_regs; // have lo/hi words of phys. regs be adjacent
709
710 int _use_pos[LinearScan::nof_regs];
711 int _block_pos[LinearScan::nof_regs];
712 IntervalList* _spill_intervals[LinearScan::nof_regs];
713
714 MoveResolver _move_resolver; // for ordering spill moves
715
716 // accessors mapped to same functions in class LinearScan
717 int block_count() const { return allocator()->block_count(); }
718 BlockBegin* block_at(int idx) const { return allocator()->block_at(idx); }
719 BlockBegin* block_of_op_with_id(int op_id) const { return allocator()->block_of_op_with_id(op_id); }
720
721 void init_use_lists(bool only_process_use_pos);
722 void exclude_from_use(int reg);
723 void exclude_from_use(Interval* i);
724 void set_use_pos(int reg, Interval* i, int use_pos, bool only_process_use_pos);
725 void set_use_pos(Interval* i, int use_pos, bool only_process_use_pos);
726 void set_block_pos(int reg, Interval* i, int block_pos);
727 void set_block_pos(Interval* i, int block_pos);
728
729 void free_exclude_active_fixed();
730 void free_exclude_active_any();
731 void free_collect_inactive_fixed(Interval* cur);
732 void free_collect_inactive_any(Interval* cur);
733 void spill_exclude_active_fixed();
734 void spill_block_inactive_fixed(Interval* cur);
735 void spill_collect_active_any();
736 void spill_collect_inactive_any(Interval* cur);
737
738 void insert_move(int op_id, Interval* src_it, Interval* dst_it);
739 int find_optimal_split_pos(BlockBegin* min_block, BlockBegin* max_block, int max_split_pos);
740 int find_optimal_split_pos(Interval* it, int min_split_pos, int max_split_pos, bool do_loop_optimization);
741 void split_before_usage(Interval* it, int min_split_pos, int max_split_pos);
742 void split_for_spilling(Interval* it);
743 void split_stack_interval(Interval* it);
744 void split_when_partial_register_available(Interval* it, int register_available_until);
745 void split_and_spill_interval(Interval* it);
746
747 int find_free_reg(int reg_needed_until, int interval_to, int hint_reg, int ignore_reg, bool* need_split);
748 int find_free_double_reg(int reg_needed_until, int interval_to, int hint_reg, bool* need_split);
749 bool alloc_free_reg(Interval* cur);
750
751 int find_locked_reg(int reg_needed_until, int interval_to, int ignore_reg, bool* need_split);
752 int find_locked_double_reg(int reg_needed_until, int interval_to, bool* need_split);
753 void split_and_spill_intersecting_intervals(int reg, int regHi);
754 void alloc_locked_reg(Interval* cur);
755
756 bool no_allocation_possible(Interval* cur);
757 void init_vars_for_alloc(Interval* cur);
758 bool pd_init_regs_for_alloc(Interval* cur);
759
760 void combine_spilled_intervals(Interval* cur);
761 bool is_move(LIR_Op* op, Interval* from, Interval* to);
762
763 bool activate_current();
764
765 public:
766 LinearScanWalker(LinearScan* allocator, Interval* unhandled_fixed_first, Interval* unhandled_any_first);
767
768 // must be called when all intervals are allocated
769 void finish_allocation() { _move_resolver.resolve_and_append_moves(); }
770};
771
772
773
774/*
775When a block has more than one predecessor, and all predecessors end with
776the same sequence of move-instructions, than this moves can be placed once
777at the beginning of the block instead of multiple times in the predecessors.
778
779Similarly, when a block has more than one successor, then equal sequences of
780moves at the beginning of the successors can be placed once at the end of
781the block. But because the moves must be inserted before all branch
782instructions, this works only when there is exactly one conditional branch
783at the end of the block (because the moves must be inserted before all
784branches, but after all compares).
785
786This optimization affects all kind of moves (reg->reg, reg->stack and
787stack->reg). Because this optimization works best when a block contains only
788few moves, it has a huge impact on the number of blocks that are totally
789empty.
790*/
791class EdgeMoveOptimizer : public StackObj {
792 private:
793 // the class maintains a list with all lir-instruction-list of the
794 // successors (predecessors) and the current index into the lir-lists
795 LIR_OpListStack _edge_instructions;
796 intStack _edge_instructions_idx;
797
798 void init_instructions();
799 void append_instructions(LIR_OpList* instructions, int instructions_idx);
800 LIR_Op* instruction_at(int edge);
801 void remove_cur_instruction(int edge, bool decrement_index);
802
803 bool operations_different(LIR_Op* op1, LIR_Op* op2);
804
805 void optimize_moves_at_block_end(BlockBegin* cur);
806 void optimize_moves_at_block_begin(BlockBegin* cur);
807
808 EdgeMoveOptimizer();
809
810 public:
811 static void optimize(BlockList* code);
812};
813
814
815
816class ControlFlowOptimizer : public StackObj {
817 private:
818 BlockList _original_preds;
819
820 enum {
821 ShortLoopSize = 5
822 };
823 void reorder_short_loop(BlockList* code, BlockBegin* header_block, int header_idx);
824 void reorder_short_loops(BlockList* code);
825
826 bool can_delete_block(BlockBegin* cur);
827 void substitute_branch_target(BlockBegin* cur, BlockBegin* target_from, BlockBegin* target_to);
828 void delete_empty_blocks(BlockList* code);
829
830 void delete_unnecessary_jumps(BlockList* code);
831 void delete_jumps_to_return(BlockList* code);
832
833 DEBUG_ONLY(void verify(BlockList* code);)
834
835 ControlFlowOptimizer();
836 public:
837 static void optimize(BlockList* code);
838};
839
840
841#ifndef PRODUCT
842
843// Helper class for collecting statistics of LinearScan
844class LinearScanStatistic : public StackObj {
845 public:
846 enum Counter {
847 // general counters
848 counter_method,
849 counter_fpu_method,
850 counter_loop_method,
851 counter_exception_method,
852 counter_loop,
853 counter_block,
854 counter_loop_block,
855 counter_exception_block,
856 counter_interval,
857 counter_fixed_interval,
858 counter_range,
859 counter_fixed_range,
860 counter_use_pos,
861 counter_fixed_use_pos,
862 counter_spill_slots,
863 blank_line_1,
864
865 // counter for classes of lir instructions
866 counter_instruction,
867 counter_label,
868 counter_entry,
869 counter_return,
870 counter_call,
871 counter_move,
872 counter_cmp,
873 counter_cond_branch,
874 counter_uncond_branch,
875 counter_stub_branch,
876 counter_alu,
877 counter_alloc,
878 counter_sync,
879 counter_throw,
880 counter_unwind,
881 counter_typecheck,
882 counter_fpu_stack,
883 counter_misc_inst,
884 counter_other_inst,
885 blank_line_2,
886
887 // counter for different types of moves
888 counter_move_total,
889 counter_move_reg_reg,
890 counter_move_reg_stack,
891 counter_move_stack_reg,
892 counter_move_stack_stack,
893 counter_move_reg_mem,
894 counter_move_mem_reg,
895 counter_move_const_any,
896
897 number_of_counters,
898 invalid_counter = -1
899 };
900
901 private:
902 int _counters_sum[number_of_counters];
903 int _counters_max[number_of_counters];
904
905 void inc_counter(Counter idx, int value = 1) { _counters_sum[idx] += value; }
906
907 const char* counter_name(int counter_idx);
908 Counter base_counter(int counter_idx);
909
910 void sum_up(LinearScanStatistic &method_statistic);
911 void collect(LinearScan* allocator);
912
913 public:
914 LinearScanStatistic();
915 void print(const char* title);
916 static void compute(LinearScan* allocator, LinearScanStatistic &global_statistic);
917};
918
919
920// Helper class for collecting compilation time of LinearScan
921class LinearScanTimers : public StackObj {
922 public:
923 enum Timer {
924 timer_do_nothing,
925 timer_number_instructions,
926 timer_compute_local_live_sets,
927 timer_compute_global_live_sets,
928 timer_build_intervals,
929 timer_sort_intervals_before,
930 timer_allocate_registers,
931 timer_resolve_data_flow,
932 timer_sort_intervals_after,
933 timer_eliminate_spill_moves,
934 timer_assign_reg_num,
935 timer_allocate_fpu_stack,
936 timer_optimize_lir,
937
938 number_of_timers
939 };
940
941 private:
942 elapsedTimer _timers[number_of_timers];
943 const char* timer_name(int idx);
944
945 public:
946 LinearScanTimers();
947
948 void begin_method(); // called for each method when register allocation starts
949 void end_method(LinearScan* allocator); // called for each method when register allocation completed
950 void print(double total_time); // called before termination of VM to print global summary
951
952 elapsedTimer* timer(int idx) { return &(_timers[idx]); }
953};
954
955
956#endif // ifndef PRODUCT
957
958// Pick up platform-dependent implementation details
959#include CPU_HEADER(c1_LinearScan)
960
961#endif // SHARE_C1_C1_LINEARSCAN_HPP
962