1045 // Reorganize offset computations to lower register pressure.
1046 // Mostly prevent loop-fallout uses of the pre-incremented trip counter
1047 // (which are then alive with the post-incremented trip counter
1048 // forcing an extra register move)
1049 void reorg_offsets( IdealLoopTree *loop );
1050
1051 // Check for aggressive application of 'split-if' optimization,
1052 // using basic block level info.
1053 void split_if_with_blocks ( VectorSet &visited, Node_Stack &nstack );
1054 Node *split_if_with_blocks_pre ( Node *n );
1055 void split_if_with_blocks_post( Node *n );
1056 Node *has_local_phi_input( Node *n );
1057 // Mark an IfNode as being dominated by a prior test,
1058 // without actually altering the CFG (and hence IDOM info).
1059 void dominated_by( Node *prevdom, Node *iff, bool flip = false, bool exclude_loop_predicate = false );
1060
1061 // Split Node 'n' through merge point
1062 Node *split_thru_region( Node *n, Node *region );
1063 // Split Node 'n' through merge point if there is enough win.
1064 Node *split_thru_phi( Node *n, Node *region, int policy );
1065 // Found an If getting its condition-code input from a Phi in the
1066 // same block. Split thru the Region.
1067 void do_split_if( Node *iff );
1068
1069 // Conversion of fill/copy patterns into intrisic versions
1070 bool do_intrinsify_fill();
1071 bool intrinsify_fill(IdealLoopTree* lpt);
1072 bool match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& store_value,
1073 Node*& shift, Node*& offset);
1074
1075 private:
1076 // Return a type based on condition control flow
1077 const TypeInt* filtered_type( Node *n, Node* n_ctrl);
1078 const TypeInt* filtered_type( Node *n ) { return filtered_type(n, NULL); }
1079 // Helpers for filtered type
1080 const TypeInt* filtered_type_from_dominators( Node* val, Node *val_ctrl);
1081
1082 // Helper functions
1083 Node *spinup( Node *iff, Node *new_false, Node *new_true, Node *region, Node *phi, small_cache *cache );
1084 Node *find_use_block( Node *use, Node *def, Node *old_false, Node *new_false, Node *old_true, Node *new_true );
|
1045 // Reorganize offset computations to lower register pressure.
1046 // Mostly prevent loop-fallout uses of the pre-incremented trip counter
1047 // (which are then alive with the post-incremented trip counter
1048 // forcing an extra register move)
1049 void reorg_offsets( IdealLoopTree *loop );
1050
1051 // Check for aggressive application of 'split-if' optimization,
1052 // using basic block level info.
1053 void split_if_with_blocks ( VectorSet &visited, Node_Stack &nstack );
1054 Node *split_if_with_blocks_pre ( Node *n );
1055 void split_if_with_blocks_post( Node *n );
1056 Node *has_local_phi_input( Node *n );
1057 // Mark an IfNode as being dominated by a prior test,
1058 // without actually altering the CFG (and hence IDOM info).
1059 void dominated_by( Node *prevdom, Node *iff, bool flip = false, bool exclude_loop_predicate = false );
1060
1061 // Split Node 'n' through merge point
1062 Node *split_thru_region( Node *n, Node *region );
1063 // Split Node 'n' through merge point if there is enough win.
1064 Node *split_thru_phi( Node *n, Node *region, int policy );
1065 void split_mem_thru_phi(Node*, Node* r, Node* phi);
1066
1067 // Found an If getting its condition-code input from a Phi in the
1068 // same block. Split thru the Region.
1069 void do_split_if( Node *iff );
1070
1071 // Conversion of fill/copy patterns into intrisic versions
1072 bool do_intrinsify_fill();
1073 bool intrinsify_fill(IdealLoopTree* lpt);
1074 bool match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& store_value,
1075 Node*& shift, Node*& offset);
1076
1077 private:
1078 // Return a type based on condition control flow
1079 const TypeInt* filtered_type( Node *n, Node* n_ctrl);
1080 const TypeInt* filtered_type( Node *n ) { return filtered_type(n, NULL); }
1081 // Helpers for filtered type
1082 const TypeInt* filtered_type_from_dominators( Node* val, Node *val_ctrl);
1083
1084 // Helper functions
1085 Node *spinup( Node *iff, Node *new_false, Node *new_true, Node *region, Node *phi, small_cache *cache );
1086 Node *find_use_block( Node *use, Node *def, Node *old_false, Node *new_false, Node *old_true, Node *new_true );
|