00001 #ifndef SHOPTIMIZATIONS_HPP
00002 #define SHOPTIMIZATIONS_HPP
00003
00004 #include "ShProgram.hpp"
00005 #include "ShStatement.hpp"
00006 #include <vector>
00007 #include <set>
00008
00009
00010
00011
00012
00013 namespace SH {
00014
00016 SH_DLLEXPORT
00017 void optimize(ShProgram& p, int level);
00018 SH_DLLEXPORT
00019 void optimize(const ShProgramNodePtr& p, int level);
00020
00023 SH_DLLEXPORT
00024 void optimize(ShProgram& p);
00025 SH_DLLEXPORT
00026 void optimize(const ShProgramNodePtr& p);
00027
00028
00029
00030
00031
00032
00033 SH_DLLEXPORT
00034 void add_value_tracking(ShProgram& prg);
00035
00037 SH_DLLEXPORT
00038 void insert_branch_instructions(ShProgram& prg);
00039
00041 SH_DLLEXPORT
00042 void remove_branch_instructions(ShProgram& prg);
00043
00045 SH_DLLEXPORT
00046 void straighten(ShProgram& p, bool& changed);
00047
00049 SH_DLLEXPORT
00050 void remove_dead_code(ShProgram& p, bool& changed);
00051
00053 SH_DLLEXPORT
00054 void propagate_constants(ShProgram& p);
00055
00056 struct
00057 SH_DLLEXPORT
00058 ValueTracking : public ShStatementInfo {
00059 ValueTracking(ShStatement* stmt);
00060
00061 ShStatementInfo* clone() const;
00062
00063 struct Def {
00064 Def(ShStatement* stmt, int index)
00065 : stmt(stmt), index(index)
00066 {
00067 }
00068
00069 ShStatement* stmt;
00070 int index;
00071
00072 bool operator<(const Def& other) const
00073 {
00074 return stmt < other.stmt || (stmt == other.stmt && index < other.index);
00075 }
00076 };
00077 struct Use {
00078 Use(ShStatement* stmt, int source, int index)
00079 : stmt(stmt), source(source), index(index)
00080 {
00081 }
00082
00083 bool operator<(const Use& other) const
00084 {
00085 return stmt < other.stmt
00086 || (stmt == other.stmt && (source < other.source
00087 || (source == other.source && index < other.index)));
00088 }
00089
00090 ShStatement* stmt;
00091 int source;
00092 int index;
00093 };
00094
00095
00096 typedef std::set<Use> DefUseChain;
00097 typedef std::vector<DefUseChain> TupleDefUseChain;
00098 TupleDefUseChain uses;
00099
00100
00101
00102 typedef std::set<Def> UseDefChain;
00103 typedef std::vector<UseDefChain> TupleUseDefChain;
00104 TupleUseDefChain defs[3];
00105 };
00106
00107 }
00108
00109 #endif