lestes::backend_v2::workers::alloc_int_finder Class Reference

Splits liveranges to a set of intervals with nonempty intersection of sets of allowed register. More...

#include <alloc_int_finder.g.hh>

Inheritance diagram for lestes::backend_v2::workers::alloc_int_finder:

lestes::backend_v2::workers::worker_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

void process ()
 Splits live ranges to regalloc intervals.
ptr< ::lestes::backend_v2::structs::func_dataget_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_basege_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_listreflection_get () const
 for purposes of dumping
virtual ptr< field_list_listfield_values_get () const
 for purposes of dumping

Static Public Member Functions

static ptr< alloc_int_findercreate (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_listreflection = reflection

Detailed Description

Splits liveranges to a set of intervals with nonempty intersection of sets of allowed register.

Definition at line 99 of file alloc_int_finder.g.hh.


Constructor & Destructor Documentation

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.

Author:
lsg

Definition at line 40 of file alloc_int_finder.g.cc.

Referenced by create().

00041         : worker_base(a__worker_base__data)
00042 {}


Member Function Documentation

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.

Returns:
Data of a processed function.

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:24:09 2007 for lestes by doxygen 1.5.1-20070107