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 ); |