464
465 // Perform a Depth First Search (DFS).
466 // Setup 'vertex' as DFS to vertex mapping.
467 // Setup 'semi' as vertex to DFS mapping.
468 // Set 'parent' to DFS parent.
469 uint do_DFS(Tarjan* tarjan, uint rpo_counter);
470
471 // Helper function to insert a node into a block
472 void schedule_node_into_block( Node *n, Block *b );
473
474 void replace_block_proj_ctrl( Node *n );
475
476 // Set the basic block for pinned Nodes
477 void schedule_pinned_nodes( VectorSet &visited );
478
479 // I'll need a few machine-specific GotoNodes. Clone from this one.
480 // Used when building the CFG and creating end nodes for blocks.
481 MachNode* _goto;
482
483 Block* insert_anti_dependences(Block* LCA, Node* load, bool verify = false);
484 void verify_anti_dependences(Block* LCA, Node* load) {
485 assert(LCA == get_block_for_node(load), "should already be scheduled");
486 insert_anti_dependences(LCA, load, true);
487 }
488
489 bool move_to_next(Block* bx, uint b_index);
490 void move_to_end(Block* bx, uint b_index);
491
492 void insert_goto_at(uint block_no, uint succ_no);
493
494 // Check for NeverBranch at block end. This needs to become a GOTO to the
495 // true target. NeverBranch are treated as a conditional branch that always
496 // goes the same direction for most of the optimizer and are used to give a
497 // fake exit path to infinite loops. At this late stage they need to turn
498 // into Goto's so that when you enter the infinite loop you indeed hang.
499 void convert_NeverBranch_to_Goto(Block *b);
500
501 CFGLoop* create_loop_tree();
502 bool is_dominator(Node* dom_node, Node* node);
503
504 #ifndef PRODUCT
505 bool _trace_opto_pipelining; // tracing flag
506 #endif
|
464
465 // Perform a Depth First Search (DFS).
466 // Setup 'vertex' as DFS to vertex mapping.
467 // Setup 'semi' as vertex to DFS mapping.
468 // Set 'parent' to DFS parent.
469 uint do_DFS(Tarjan* tarjan, uint rpo_counter);
470
471 // Helper function to insert a node into a block
472 void schedule_node_into_block( Node *n, Block *b );
473
474 void replace_block_proj_ctrl( Node *n );
475
476 // Set the basic block for pinned Nodes
477 void schedule_pinned_nodes( VectorSet &visited );
478
479 // I'll need a few machine-specific GotoNodes. Clone from this one.
480 // Used when building the CFG and creating end nodes for blocks.
481 MachNode* _goto;
482
483 Block* insert_anti_dependences(Block* LCA, Node* load, bool verify = false);
484 void verify_anti_dependences(Block* LCA, Node* load) const {
485 assert(LCA == get_block_for_node(load), "should already be scheduled");
486 const_cast<PhaseCFG*>(this)->insert_anti_dependences(LCA, load, true);
487 }
488
489 bool move_to_next(Block* bx, uint b_index);
490 void move_to_end(Block* bx, uint b_index);
491
492 void insert_goto_at(uint block_no, uint succ_no);
493
494 // Check for NeverBranch at block end. This needs to become a GOTO to the
495 // true target. NeverBranch are treated as a conditional branch that always
496 // goes the same direction for most of the optimizer and are used to give a
497 // fake exit path to infinite loops. At this late stage they need to turn
498 // into Goto's so that when you enter the infinite loop you indeed hang.
499 void convert_NeverBranch_to_Goto(Block *b);
500
501 CFGLoop* create_loop_tree();
502 bool is_dominator(Node* dom_node, Node* node);
503
504 #ifndef PRODUCT
505 bool _trace_opto_pipelining; // tracing flag
506 #endif
|