32 #include "opto/live.hpp" |
32 #include "opto/live.hpp" |
33 #include "opto/matcher.hpp" |
33 #include "opto/matcher.hpp" |
34 #include "opto/phase.hpp" |
34 #include "opto/phase.hpp" |
35 #include "opto/regalloc.hpp" |
35 #include "opto/regalloc.hpp" |
36 #include "opto/regmask.hpp" |
36 #include "opto/regmask.hpp" |
|
37 #include "opto/machnode.hpp" |
37 |
38 |
38 class LoopTree; |
39 class LoopTree; |
39 class MachCallNode; |
|
40 class MachSafePointNode; |
|
41 class Matcher; |
40 class Matcher; |
42 class PhaseCFG; |
41 class PhaseCFG; |
43 class PhaseLive; |
42 class PhaseLive; |
44 class PhaseRegAlloc; |
43 class PhaseRegAlloc; |
45 class PhaseChaitin; |
44 class PhaseChaitin; |
422 uint _lo_stk_degree; // Head of lo-stk-degree LRGs list |
421 uint _lo_stk_degree; // Head of lo-stk-degree LRGs list |
423 uint _hi_degree; // Head of hi-degree LRGs list |
422 uint _hi_degree; // Head of hi-degree LRGs list |
424 uint _simplified; // Linked list head of simplified LRGs |
423 uint _simplified; // Linked list head of simplified LRGs |
425 |
424 |
426 // Helper functions for Split() |
425 // Helper functions for Split() |
427 uint split_DEF( Node *def, Block *b, int loc, uint max, Node **Reachblock, Node **debug_defs, GrowableArray<uint> splits, int slidx ); |
426 uint split_DEF(Node *def, Block *b, int loc, uint max, Node **Reachblock, Node **debug_defs, GrowableArray<uint> splits, int slidx ); |
428 uint split_USE( Node *def, Block *b, Node *use, uint useidx, uint max, bool def_down, bool cisc_sp, GrowableArray<uint> splits, int slidx ); |
427 uint split_USE(MachSpillCopyNode::SpillType spill_type, Node *def, Block *b, Node *use, uint useidx, uint max, bool def_down, bool cisc_sp, GrowableArray<uint> splits, int slidx ); |
429 |
428 |
430 //------------------------------clone_projs------------------------------------ |
429 //------------------------------clone_projs------------------------------------ |
431 // After cloning some rematerialized instruction, clone any MachProj's that |
430 // After cloning some rematerialized instruction, clone any MachProj's that |
432 // follow it. Example: Intel zero is XOR, kills flags. Sparc FP constants |
431 // follow it. Example: Intel zero is XOR, kills flags. Sparc FP constants |
433 // use G3 as an address temp. |
432 // use G3 as an address temp. |
445 |
444 |
446 Node *split_Rematerialize(Node *def, Block *b, uint insidx, uint &maxlrg, GrowableArray<uint> splits, |
445 Node *split_Rematerialize(Node *def, Block *b, uint insidx, uint &maxlrg, GrowableArray<uint> splits, |
447 int slidx, uint *lrg2reach, Node **Reachblock, bool walkThru); |
446 int slidx, uint *lrg2reach, Node **Reachblock, bool walkThru); |
448 // True if lidx is used before any real register is def'd in the block |
447 // True if lidx is used before any real register is def'd in the block |
449 bool prompt_use( Block *b, uint lidx ); |
448 bool prompt_use( Block *b, uint lidx ); |
450 Node *get_spillcopy_wide( Node *def, Node *use, uint uidx ); |
449 Node *get_spillcopy_wide(MachSpillCopyNode::SpillType spill_type, Node *def, Node *use, uint uidx ); |
451 // Insert the spill at chosen location. Skip over any intervening Proj's or |
450 // Insert the spill at chosen location. Skip over any intervening Proj's or |
452 // Phis. Skip over a CatchNode and projs, inserting in the fall-through block |
451 // Phis. Skip over a CatchNode and projs, inserting in the fall-through block |
453 // instead. Update high-pressure indices. Create a new live range. |
452 // instead. Update high-pressure indices. Create a new live range. |
454 void insert_proj( Block *b, uint i, Node *spill, uint maxlrg ); |
453 void insert_proj( Block *b, uint i, Node *spill, uint maxlrg ); |
455 |
454 |