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

Public Member Functions | |
| void | process () |
| Eliminates a dead code. | |
| ptr< ::lestes::backend_v2::structs::func_data > | get_result () |
| Returns function body without any dead code. | |
| 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< dead_code_eliminator > | create (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) |
| First generated factory method for class dead_code_eliminator. | |
Protected Member Functions | |
| dead_code_eliminator (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data) | |
| Generated constructor for class dead_code_eliminator. | |
| virtual void | gc_mark () |
| Marking routine for class dead_code_eliminator. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
It only eliminates pseudoinstructions whose output operands are not used by any other psedoinstruction. It performs only single pass through body therefore it removes only last pseudoinstruction of any chain of dead code. The eliminator is used mainly to eliminate dead code generated by the compiler during ge-level pseudoinstruction generation process.
Definition at line 45 of file dead_code_eliminator.g.hh.
| lestes::backend_v2::workers::dead_code_eliminator::dead_code_eliminator | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [protected] |
Generated constructor for class dead_code_eliminator.
Generated constructor for class dead_code_eliminator.
Definition at line 37 of file dead_code_eliminator.g.cc.
Referenced by create().
00038 : worker_base(a__worker_base__data) 00039 {}
| void lestes::backend_v2::workers::dead_code_eliminator::process | ( | ) | [virtual] |
Eliminates a dead code.
It removes any pseudoinstruction whose output operands are not used by another pseudoinstruction.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 34 of file dead_code_eliminator.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00034 { 00035 00036 ptr<ge_op_set__type> used_operands = ge_op_set__type::create(); 00037 00038 //Sweep used operands. 00039 ptr<ge_pi_list__type> body = data_get()->ge_body_get(); 00040 00041 for(ge_pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) { 00042 ptr<ge_pi> ge = *it; 00043 00044 ptr<ge_op_vector__type> operands = ge->operands_input_get(); 00045 for(ge_op_vector__type::iterator it_op = operands->begin(); it_op!=operands->end(); ++it_op) { 00046 used_operands->insert(*it_op); 00047 } 00048 } 00049 00050 //Operand that represents return value from the function. 00051 ptr<pi_mem_factory> ret_val = function_parameter_accessor::instance(data_get()->function_decl_get())->get_ret_val(); 00052 00053 //Delete instructions that product unused operands. 00054 for(ge_pi_list__type::iterator it = body->begin(); it!=body->end();) { 00055 ptr<ge_pi> ge = *it; 00056 00057 if ( ge->kind_get()!=ge_pi::PI ) { 00058 ++it; 00059 continue; 00060 } 00061 00062 ptr<tm_instr_base> tm = ge->instruction_get(); 00063 00064 if ( !tm || tm->is_store() || tm->is_jump() || tm->is_system() ) { 00065 ++it; 00066 continue; 00067 } 00068 00069 bool b_delete = true; 00070 00071 ptr<ge_op_vector__type> operands = ge->operands_output_get(); 00072 for(ge_op_vector__type::iterator it_op = operands->begin(); it_op!=operands->end();++it_op) { 00073 ptr<ge_operand> op = *it_op; 00074 00075 if ( used_operands->find(op)!=used_operands->end() || 00076 (op->pi_source_get() 00077 && op->pi_source_get()->kind_get()!=pi_operand::PREG 00078 && op->pi_source_get()->kind_get()!=pi_operand::LIT 00079 && op->pi_source_get().dncast<pi_mem>()->factory_get()==ret_val) 00080 ) { 00081 /* 00082 This instruction isn't to be deleted because of an output operand is used by another instruction 00083 or an output operand is return value from the function. 00084 */ 00085 b_delete = false; 00086 break; 00087 } 00088 } 00089 00090 if ( b_delete ) { 00091 it = body->erase(it); 00092 } else { 00093 ++it; 00094 } 00095 00096 } 00097 }
| ptr< func_data > lestes::backend_v2::workers::dead_code_eliminator::get_result | ( | ) | [virtual] |
Returns function body without any dead code.
Implements lestes::backend_v2::workers::worker_base.
Definition at line 102 of file dead_code_eliminator.cc.
References lestes::backend_v2::workers::worker_base::data_get().
00102 { 00103 return data_get(); 00104 }
| ptr< dead_code_eliminator > lestes::backend_v2::workers::dead_code_eliminator::create | ( | ptr< ::lestes::backend_v2::structs::func_data > | a__worker_base__data | ) | [static] |
First generated factory method for class dead_code_eliminator.
This factory method for class dead_code_eliminator takes values of all fields as arguments.
Definition at line 28 of file dead_code_eliminator.g.cc.
References dead_code_eliminator().
00029 { 00030 return ptr< dead_code_eliminator > ( new dead_code_eliminator(a__worker_base__data) ); 00031 }
| ptr< object::reflection_list > lestes::backend_v2::workers::dead_code_eliminator::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 41 of file dead_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( "dead_code_eliminator", mdl ) ); 00049 } 00050 return reflection; 00051 }
| ptr< object::field_list_list > lestes::backend_v2::workers::dead_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 dead_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::dead_code_eliminator::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class dead_code_eliminator.
Marking routine is used for garbage collection.
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 64 of file dead_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::dead_code_eliminator::reflection = reflection [static, private] |
Reimplemented from lestes::backend_v2::workers::worker_base.
Definition at line 72 of file dead_code_eliminator.g.hh.
Referenced by reflection_get().
1.5.1-20070107