lestes::backend_v2::workers::useless_code_eliminator Class Reference

Removes useless code from a function body. More...

#include <useless_code_eliminator.g.hh>

Inheritance diagram for lestes::backend_v2::workers::useless_code_eliminator:

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

Public Member Functions

void process ()
 Eliminates a uselesss code.
ptr< ::lestes::backend_v2::structs::func_dataget_result ()
 Returns data of a currently processed function without a useless code.
void set_register_user (ulint reg_id, ptr< ::lestes::backend_v2::intercode::pi_mem_factory > user, ptr< map< ulint, srp< ::lestes::backend_v2::intercode::pi_mem_factory > > > reg2user)
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< useless_code_eliminatorcreate (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 First generated factory method for class useless_code_eliminator.

Protected Member Functions

 useless_code_eliminator (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 Generated constructor for class useless_code_eliminator.
virtual void gc_mark ()
 Marking routine for class useless_code_eliminator.

Static Private Attributes

static ptr< reflection_listreflection = reflection

Detailed Description

Removes useless code from a function body.

Definition at line 41 of file useless_code_eliminator.g.hh.


Constructor & Destructor Documentation

lestes::backend_v2::workers::useless_code_eliminator::useless_code_eliminator ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [protected]

Generated constructor for class useless_code_eliminator.

Generated constructor for class useless_code_eliminator.

Author:
lsg

Definition at line 37 of file useless_code_eliminator.g.cc.

Referenced by create().

00038         : worker_base(a__worker_base__data)
00039 {}


Member Function Documentation

void lestes::backend_v2::workers::useless_code_eliminator::process (  )  [virtual]

Eliminates a uselesss code.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 29 of file useless_code_eliminator.cc.

References lestes::backend_v2::workers::worker_base::data_get(), lassert, and set_register_user().

00029                                       {
00030         
00031         ptr<ge_pi_list__type> body = data_get()->ge_body_get();
00032 
00033         ptr<id2mf__type> reg2mem = id2mf__type::create();
00034                 
00035         for(ge_pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) {
00036                 
00037                 ptr<ge_pi> ge = *it;
00038                 
00039                 ptr<tm_instr_base> tm = ge->instruction_get();
00040                 
00041                 if ( ge->kind_get()==ge_pi::SP && ge.dncast<ge_sp>()->is_jmp_target_get() ) {
00042                         //Instruction invalidates reg2mem mapping.
00043                         reg2mem->clear();
00044                         continue;
00045                 }
00046                 
00047                 if ( !tm ) {
00048                         continue;
00049                 }
00050                 
00051                 if ( tm->is_system() ) {
00052                         //Instruction invalidates reg2mem mapping.
00053                         reg2mem->clear();
00054                 } else if ( tm->is_copy() ) {
00055                         ptr<ge_operand_reg> in = ge->operands_input_get()->front().dncast<ge_operand_reg>();
00056                         ptr<ge_operand_reg> out = ge->operands_output_get()->front().dncast<ge_operand_reg>();
00057                         ulint assigned_reg1 = (*in->assigned_registers_get())[ge];
00058                         ulint assigned_reg2 = (*out->assigned_registers_get())[ge];
00059                         
00060                         if ( assigned_reg1==assigned_reg2 ) {
00061                                  //Move eax,eax
00062                                  //Erase output.         
00063                                  ge->instruction_set(NULL);
00064                         }
00065                         
00066                         set_register_user(assigned_reg2,(*reg2mem)[assigned_reg1],reg2mem);
00067                 } else if ( tm->is_load() && ge->operands_input_get()->size()==1 ) {
00068                         //Instruction is load but it's not indirect load.
00069                         ptr<ge_operand> in = ge->operands_input_get()->front();
00070                         ptr<ge_operand> out = ge->operands_output_get()->front();
00071                         
00072                         if ( out->kind_get()==ge_operand::REGISTER ) {
00073                                 ptr<ge_operand_reg> reg = out.dncast<ge_operand_reg>();
00074                                 ulint assigned_reg = (*reg->assigned_registers_get())[ge];
00075                         
00076                                 if ( in->kind_get()==ge_operand::MEMORY ) {
00077                                         ptr<pi_mem_factory> mf = in.dncast<ge_operand_mem>()->factory_get();
00078                                 
00079                                         if ( mf && (*reg2mem)[assigned_reg]==mf ) {
00080                                                 //The register already contains the mem's value. No load needed.
00081                                                 ge->instruction_set(NULL);      
00082                                         } else {
00083                                                 //Set flag that the mem's value has been loaded to the reg.
00084                                                 set_register_user(assigned_reg,mf,reg2mem);
00085                                         }
00086                                 } else if ( in->kind_get()==ge_operand::IMMEDIATE ) {
00087                                         set_register_user(assigned_reg,NULL,reg2mem);
00088                                 } else lassert(false);
00089                         }
00090                         
00091                 } else if ( tm->is_store() && ge->operands_input_get()->size()==1 ) {
00092                         //Instruction is store but it's not indirect store.
00093                         ptr<ge_operand> in = ge->operands_input_get()->front();
00094                         ptr<ge_operand> out = ge->operands_output_get()->front();
00095                         
00096                         if ( out->kind_get()==ge_operand::MEMORY && in->kind_get()==ge_operand::REGISTER) {                     
00097                                 //Set flag that the the reg's value has been stored to the mem.
00098                                 set_register_user((*in.dncast<ge_operand_reg>()->assigned_registers_get())[ge],out.dncast<ge_operand_mem>()->factory_get(),reg2mem);
00099                         } else lassert(false);
00100                 } else {
00101                         ptr<ge_operand_vector__type> operands = ge->operands_output_get();
00102                         
00103                         for(ge_operand_vector__type::iterator it_operand = operands->begin(); it_operand!=operands->end(); ++it_operand) {
00104                                 if ( (*it_operand)->kind_get()!=ge_operand::REGISTER ) {
00105                                         continue;
00106                                 }
00107                                 
00108                                 ptr<ge_operand_reg> op = (*it_operand).dncast<ge_operand_reg>();
00109                                 ulint assigned_reg = (*op->assigned_registers_get())[ge];
00110                                 
00111                                 set_register_user(assigned_reg,NULL,reg2mem);
00112                         }
00113                 }
00114         }
00115 }

ptr< func_data > lestes::backend_v2::workers::useless_code_eliminator::get_result (  )  [virtual]

Returns data of a currently processed function without a useless code.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 136 of file useless_code_eliminator.cc.

References lestes::backend_v2::workers::worker_base::data_get().

00136                                                    {
00137         return data_get();
00138 }

void lestes::backend_v2::workers::useless_code_eliminator::set_register_user ( ulint  reg_id,
ptr< ::lestes::backend_v2::intercode::pi_mem_factory user,
ptr< map< ulint, srp< ::lestes::backend_v2::intercode::pi_mem_factory > > >  reg2user 
)

Referenced by process().

ptr< useless_code_eliminator > lestes::backend_v2::workers::useless_code_eliminator::create ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [static]

First generated factory method for class useless_code_eliminator.

This factory method for class useless_code_eliminator takes values of all fields as arguments.

Author:
lsg

Definition at line 28 of file useless_code_eliminator.g.cc.

References useless_code_eliminator().

00029 {
00030         return ptr< useless_code_eliminator > ( new useless_code_eliminator(a__worker_base__data) );
00031 }

ptr< object::reflection_list > lestes::backend_v2::workers::useless_code_eliminator::reflection_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 41 of file useless_code_eliminator.g.cc.

References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().

00042 {
00043         if (!reflection) {
00044                 typedef class_reflection::field_metadata md;
00045                 typedef class_reflection::field_metadata_list mdlist;
00046                 ptr<mdlist> mdl = mdlist::create();
00047                 reflection = reflection_list::create( worker_base::reflection_get() );
00048                 reflection->push_back( class_reflection::create( "useless_code_eliminator", mdl ) );
00049         }
00050         return reflection;
00051 }

ptr< object::field_list_list > lestes::backend_v2::workers::useless_code_eliminator::field_values_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 53 of file useless_code_eliminator.g.cc.

References lestes::backend_v2::workers::worker_base::field_values_get().

00054 {
00055         ptr < field_list_list > result = worker_base::field_values_get();
00056         return result;
00057 }

void lestes::backend_v2::workers::useless_code_eliminator::gc_mark ( void   )  [protected, virtual]

Marking routine for class useless_code_eliminator.

Marking routine is used for garbage collection.

Author:
lsg

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 64 of file useless_code_eliminator.g.cc.

References lestes::backend_v2::workers::worker_base::gc_mark().

00065 {
00066         worker_base::gc_mark();
00067 }


Member Data Documentation

ptr< object::reflection_list > lestes::backend_v2::workers::useless_code_eliminator::reflection = reflection [static, private]

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 70 of file useless_code_eliminator.g.hh.

Referenced by reflection_get().


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