#include <alloc_int_finder.g.hh>
Inheritance diagram for lestes::backend_v2::workers::alloc_int_finder:

Public Member Functions | |
| void | process () |
| Splits live ranges to regalloc intervals. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_result () |
| Returns data of a processed function with result of the worker included. | |
| ptr< set< ulint > > | ge_pi__get_allowed_regs_for_op (ptr< ::lestes::backend_v2::intercode::ge_pi > ge, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op) |
| ptr< ::lestes::md::instructions::tm_instr_op_reg_base > | ge_pi__find_tm_op_by_ge_op (ptr< ::lestes::backend_v2::intercode::ge_pi > ge, ptr< ::lestes::backend_v2::intercode::ge_operand_reg > op) |
| virtual ptr< reflection_list > | reflection_get () const |
| for purposes of dumping | |
| virtual ptr< field_list_list > | field_values_get () const |
| for purposes of dumping | |
Static Public Member Functions | |
| static ptr< alloc_int_finder > | create (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) |
| First generated factory method for class alloc_int_finder. | |
Protected Member Functions | |
| alloc_int_finder (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) | |
| Generated constructor for class alloc_int_finder. | |
| virtual void | gc_mark () |
| Marking routine for class alloc_int_finder. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
Definition at line 99 of file alloc_int_finder.g.hh.
| lestes::backend_v2::workers::alloc_int_finder::alloc_int_finder | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [protected] |
Generated constructor for class alloc_int_finder.
Generated constructor for class alloc_int_finder.
Definition at line 40 of file alloc_int_finder.g.cc.
Referenced by create().
00041 : worker_base(a__worker_base__data) 00042 {}
| void lestes::backend_v2::workers::alloc_int_finder::process | ( | ) | [virtual] |
Splits live ranges to regalloc intervals.
It traverses list of live ranges and splits every range to intervals that have nonempty intersection of allowed register sets.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 30 of file alloc_int_finder.cc.
References lestes::backend_v2::workers::alloc_interval::create(), lestes::backend_v2::workers::liveness_analysis::create(), lestes::backend_v2::workers::worker_base::data_get(), ge_pi__get_allowed_regs_for_op(), and lassert.
00030 { 00031 00032 //Find liveness ranges. 00033 ptr<liveness_analysis> liveness = liveness_analysis::create(data_get()); 00034 liveness->process(); 00035 ptr<liveness_rng_vector__type> liveness_rngs = liveness->get_result(); 00036 00037 00038 ptr<alloc_int_vector__type> ints = data_get()->alloc_ints_get(); 00039 00040 /* 00041 Go through liveness ranges and try split them to intervals with nonempty intersections 00042 of allowed registers. 00043 */ 00044 for(liveness_rng_vector__type::iterator it1 = liveness_rngs->begin(); it1!=liveness_rngs->end(); ++it1) { 00045 ptr<liveness_range> rng = *it1; 00046 ptr<ge_operand_reg> operand = rng->operand_get(); 00047 00048 ptr<alloc_interval> prev_inter = NULL; 00049 00050 ptr<alloc_interval> inter = NULL; 00051 ptr<id_set__type> int_allowed_regs = NULL; 00052 ptr<ge_pi_vector__type> int_instrs = NULL; 00053 00054 ptr<ge_pi_vector__type> rng_instrs = rng->instructions_get(); 00055 00056 /* 00057 Create intervals of the range's instructions with non-empty intersection 00058 of allowed registers. 00059 */ 00060 for(ge_pi_vector__type::iterator it2 = rng_instrs->begin(); it2!=rng_instrs->end();) { 00061 ptr<ge_pi> ge = *it2; 00062 00063 if ( !inter ) { 00064 inter = alloc_interval::create(operand,rng); 00065 ints->push_back(inter); 00066 00067 int_allowed_regs = NULL; 00068 int_instrs = inter->instructions_get(); 00069 00070 00071 if ( !prev_inter ) { 00072 /* 00073 Insert operand's origin to the first interval. 00074 00075 NOTE: This is ok, because of the register allocator does old interval expiration 00076 before searching for free registers. So if live range of an operand ends as input 00077 operand of a ge_pi, register that is allocated for the operand is emediatly free 00078 for any output operand of the ge_pi. 00079 */ 00080 if ( operand->origin_get() ) { 00081 if ( operand->origin_get()->kind_get()!=ge_pi::SP ) { //origin can be a ge_sp instruction. 00082 int_allowed_regs = ge_pi__get_allowed_regs_for_op(operand->origin_get(),operand); 00083 } 00084 00085 int_instrs->push_back(operand->origin_get()); 00086 } 00087 } 00088 } 00089 00090 if ( ge==operand->origin_get() ) { 00091 //The ge_pi is already in interval. 00092 ++it2; 00093 continue; 00094 } 00095 00096 if ( ge->kind_get()==ge_pi::SP ) { 00097 ++it2; 00098 int_instrs->push_back(ge); 00099 continue; 00100 } 00101 00102 ptr<id_set__type> int_allowed_regs_tmp = id_set__type::create(); 00103 00104 ptr<id_set__type> op_allowed_regs = ge_pi__get_allowed_regs_for_op(ge,operand); 00105 00106 if ( !int_allowed_regs ) { 00107 //The first instruction in the set 00108 int_allowed_regs_tmp->insert(op_allowed_regs->begin(),op_allowed_regs->end()); 00109 int_allowed_regs = int_allowed_regs_tmp; 00110 } else { 00111 /* 00112 N'th instruction in the set. Compute allowed intersection of allowed registers for interval and 00113 instruction. 00114 */ 00115 set_intersection( 00116 int_allowed_regs->begin(), 00117 int_allowed_regs->end(), 00118 op_allowed_regs->begin(), 00119 op_allowed_regs->end(), 00120 ::std::insert_iterator<id_set__type>(*int_allowed_regs_tmp,int_allowed_regs_tmp->begin())); 00121 } 00122 00123 if ( int_allowed_regs_tmp->size()==0 ) { 00124 //Intersection is empty. Split intervals. 00125 lassert(int_instrs->size()!=0); 00126 00127 inter->allowed_registers_set(int_allowed_regs); 00128 00129 if ( prev_inter ) { 00130 inter->start_set(prev_inter->instructions_get()->back()->schedule_pos_get()); 00131 prev_inter->end_set(int_instrs->front()->schedule_pos_get()); 00132 } else { 00133 inter->start_set(int_instrs->front()->schedule_pos_get()); 00134 } 00135 00136 inter->end_set(int_instrs->back()->schedule_pos_get()); 00137 00138 if ( prev_inter ) { 00139 inter->prev_set(prev_inter); 00140 prev_inter->next_set(inter); 00141 } 00142 00143 prev_inter = inter; 00144 00145 inter = NULL; 00146 } else { 00147 //Intersection is non-empty. 00148 int_allowed_regs = int_allowed_regs_tmp; 00149 int_instrs->push_back(ge); 00150 ++it2; 00151 } 00152 00153 00154 } 00155 00156 if ( inter ) { 00157 //Finish the last interval. 00158 lassert(int_instrs->size()!=0); 00159 00160 inter->allowed_registers_set(int_allowed_regs); 00161 00162 if ( prev_inter ) { 00163 inter->start_set(prev_inter->instructions_get()->back()->schedule_pos_get()); 00164 prev_inter->end_set(int_instrs->front()->schedule_pos_get()); 00165 } else { 00166 inter->start_set(int_instrs->front()->schedule_pos_get()); 00167 } 00168 00169 inter->end_set(int_instrs->back()->schedule_pos_get()); 00170 00171 if ( prev_inter ) { 00172 inter->prev_set(prev_inter); 00173 prev_inter->next_set(inter); 00174 } 00175 } 00176 00177 } 00178 00179 }
| ptr< func_data > lestes::backend_v2::workers::alloc_int_finder::get_result | ( | ) | [virtual] |
Returns data of a processed function with result of the worker included.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 251 of file alloc_int_finder.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00251 { 00252 return data_get(); 00253 }
| ptr<set<ulint> > lestes::backend_v2::workers::alloc_int_finder::ge_pi__get_allowed_regs_for_op | ( | ptr< ::lestes::backend_v2::intercode::ge_pi > | ge, | |
| ptr< ::lestes::backend_v2::intercode::ge_operand_reg > | op | |||
| ) |
Referenced by process().
| ptr< ::lestes::md::instructions::tm_instr_op_reg_base > lestes::backend_v2::workers::alloc_int_finder::ge_pi__find_tm_op_by_ge_op | ( | ptr< ::lestes::backend_v2::intercode::ge_pi > | ge, | |
| ptr< ::lestes::backend_v2::intercode::ge_operand_reg > | op | |||
| ) |
| ptr< alloc_int_finder > lestes::backend_v2::workers::alloc_int_finder::create | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [static] |
First generated factory method for class alloc_int_finder.
This factory method for class alloc_int_finder takes values of all fields as arguments.
Definition at line 31 of file alloc_int_finder.g.cc.
References alloc_int_finder().
00032 { 00033 return ptr< alloc_int_finder > ( new alloc_int_finder(a__worker_base__data) ); 00034 }
| ptr< object::reflection_list > lestes::backend_v2::workers::alloc_int_finder::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 44 of file alloc_int_finder.g.cc.
References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().
00045 { 00046 if (!reflection) { 00047 typedef class_reflection::field_metadata md; 00048 typedef class_reflection::field_metadata_list mdlist; 00049 ptr<mdlist> mdl = mdlist::create(); 00050 reflection = reflection_list::create( worker_base::reflection_get() ); 00051 reflection->push_back( class_reflection::create( "alloc_int_finder", mdl ) ); 00052 } 00053 return reflection; 00054 }
| ptr< object::field_list_list > lestes::backend_v2::workers::alloc_int_finder::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 56 of file alloc_int_finder.g.cc.
References lestes::backend_v2::workers::worker_base::field_values_get().
00057 { 00058 ptr < field_list_list > result = worker_base::field_values_get(); 00059 return result; 00060 }
| void lestes::backend_v2::workers::alloc_int_finder::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class alloc_int_finder.
Marking routine is used for garbage collection.
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 67 of file alloc_int_finder.g.cc.
References lestes::backend_v2::workers::worker_base::gc_mark().
00068 { 00069 worker_base::gc_mark(); 00070 }
ptr< object::reflection_list > lestes::backend_v2::workers::alloc_int_finder::reflection = reflection [static, private] |
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 130 of file alloc_int_finder.g.hh.
Referenced by reflection_get().
1.5.1-20070107