00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef CBZ_DEAD_H
00038 #define CBZ_DEAD_H
00039
00040
00041
00042
00043
00044
00045
00046 class deadCodeEliminationChanger : public Changer {
00047 private:
00048
00049 map <declNode *, bool> is_local;
00050 map <declNode *, bool> is_live;
00051
00052 bool has_side_effects (exprNode *);
00053 void mark_as_live (exprNode *);
00054 exprNode * handle_expr (exprNode *);
00055 void local_dce (basicblockNode *);
00056 void tick_local (declNode *);
00057 void find_address_taken (exprNode *);
00058
00059 public:
00060 deadCodeEliminationChanger (void) : Changer (Preorder, Subtree, false) { }
00061 Node * at_proc (procNode *, Order);
00062 };
00063
00064 class has_struct_walker : public Walker {
00065 public:
00066 bool has_struct;
00067
00068 has_struct_walker (void) :
00069 Walker (Preorder, Subtree), has_struct(false) { }
00070
00071 void at_decl (declNode *d, Order) {
00072 has_struct = d->storage_class() == declNode::TYPEDEF;
00073 }
00074
00075 void at_sue (sueNode *, Order) {
00076 has_struct = true;
00077 }
00078
00079 void at_func (funcNode *, Order) {
00080 has_struct = true;
00081 }
00082 };
00083
00084 class unusedVariableCleanupChanger : public Changer {
00085 public:
00086
00087 map <declNode *, bool> used;
00088
00089 unusedVariableCleanupChanger (void) : Changer (Both, Subtree, false) { }
00090
00091 Node * at_proc (procNode *p, Order ord) {
00092 if (ord == Preorder)
00093 used.clear();
00094 else {
00095 blockNode *b = p->body();
00096 for (decl_list_p i=b->decls().begin();
00097 i!=b->decls().end(); ) {
00098 has_struct_walker w;
00099 (*i)->walk (w);
00100 if (w.has_struct || used[*i] || (*i)->storage_class() == declNode::TYPEDEF)
00101 i++;
00102 else
00103 i = b->decls().erase (i);
00104 }
00105 }
00106 return p;
00107 }
00108
00109 Node * at_id (idNode *i, Order ord) {
00110 used[i->decl()] = true;
00111 return i;
00112 }
00113 };
00114
00115 #endif // CBZ_DEAD_H