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

Public Member Functions | |
| void | process () |
| Eliminates a uselesss code. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_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_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< useless_code_eliminator > | create (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_list > | reflection = reflection |
Definition at line 41 of file useless_code_eliminator.g.hh.
| 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.
Definition at line 37 of file useless_code_eliminator.g.cc.
Referenced by create().
00038 : worker_base(a__worker_base__data) 00039 {}
| 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.
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.
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 }
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().
1.5.1-20070107