lestes::backend_v2::workers::dead_code_eliminator Class Reference

Eliminates dead code. More...

#include <dead_code_eliminator.g.hh>

Inheritance diagram for lestes::backend_v2::workers::dead_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 dead code.
ptr< ::lestes::backend_v2::structs::func_dataget_result ()
 Returns function body without any dead code.
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< dead_code_eliminatorcreate (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_listreflection = reflection

Detailed Description

Eliminates dead code.

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.


Constructor & Destructor Documentation

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.

Author:
lsg

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

Referenced by create().

00038         : worker_base(a__worker_base__data)
00039 {}


Member Function Documentation

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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


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