diff -r 96a1199d0739 -r 9fbdf8a7430e stage3/constant_folding.cc --- a/stage3/constant_folding.cc Mon Dec 24 16:56:08 2012 +0100 +++ b/stage3/constant_folding.cc Thu Dec 27 00:17:08 2012 +0100 @@ -1249,6 +1249,7 @@ symbol->l_exp->const_value = symbol->r_exp->const_value; varName = convert.toString(symbol->l_exp); values[varName] = symbol->l_exp->const_value; + return NULL; } @@ -1260,8 +1261,13 @@ std::map values_statement_result; std::map values_elsestatement_result; std::map ::iterator itr; + + /* Optimize dead code */ + symbol->expression->accept(*this); + if (VALID_CVALUE(bool, symbol->expression) && GET_CVALUE(bool, symbol->expression) == false) + return NULL; + values_incoming = values; /* save incoming status */ - symbol->statement_list->accept(*this); values_statement_result = values; if (NULL != symbol->else_statement_list) { @@ -1287,8 +1293,111 @@ value = values_statement_result[name]; values[name] = value; } - return NULL; -} - - - + + return NULL; +} + +/********************************/ +/* B 3.2.4 Iteration Statements */ +/********************************/ +void *constant_folding_c::visit(for_statement_c *symbol) { + std::map values_incoming; + std::map values_statement_result; + std::map ::iterator itr; + + values_incoming = values; /* save incoming status */ + symbol->statement_list->accept(*this); + values_statement_result = values; + values.clear(); + itr = values_statement_result.begin(); + for ( ; itr != values_statement_result.end(); ++itr) { + std::string name = itr->first; + symbol_c::const_value_t value; + + if (values_incoming.count(name) > 0) { + symbol_c::const_value_t c1 = itr->second; + symbol_c::const_value_t c2 = values_incoming[name]; + COMPUTE_MEET_SEMILATTICE (real64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE (uint64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( int64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( bool, c1, c2, value); + } else + value = values_statement_result[name]; + values[name] = value; + } + + return NULL; +} + +void *constant_folding_c::visit(while_statement_c *symbol) { + std::map values_incoming; + std::map values_statement_result; + std::map ::iterator itr; + + /* Optimize dead code */ + symbol->expression->accept(*this); + if (VALID_CVALUE(bool, symbol->expression) && GET_CVALUE(bool, symbol->expression) == false) + return NULL; + + values_incoming = values; /* save incoming status */ + symbol->statement_list->accept(*this); + values_statement_result = values; + values.clear(); + itr = values_statement_result.begin(); + for ( ; itr != values_statement_result.end(); ++itr) { + std::string name = itr->first; + symbol_c::const_value_t value; + + if (values_incoming.count(name) > 0) { + symbol_c::const_value_t c1 = itr->second; + symbol_c::const_value_t c2 = values_incoming[name]; + COMPUTE_MEET_SEMILATTICE (real64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE (uint64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( int64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( bool, c1, c2, value); + } else + value = values_statement_result[name]; + values[name] = value; + } + + + return NULL; +} + +void *constant_folding_c::visit(repeat_statement_c *symbol) { + std::map values_incoming; + std::map values_statement_result; + std::map ::iterator itr; + + /* Optimize dead code */ + symbol->expression->accept(*this); + if (VALID_CVALUE(bool, symbol->expression) && GET_CVALUE(bool, symbol->expression) == false) + return NULL; + + values_incoming = values; /* save incoming status */ + symbol->statement_list->accept(*this); + values_statement_result = values; + values.clear(); + itr = values_statement_result.begin(); + for ( ; itr != values_statement_result.end(); ++itr) { + std::string name = itr->first; + symbol_c::const_value_t value; + + if (values_incoming.count(name) > 0) { + symbol_c::const_value_t c1 = itr->second; + symbol_c::const_value_t c2 = values_incoming[name]; + COMPUTE_MEET_SEMILATTICE (real64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE (uint64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( int64, c1, c2, value); + COMPUTE_MEET_SEMILATTICE ( bool, c1, c2, value); + } else + value = values_statement_result[name]; + values[name] = value; + } + + + return NULL; +} + + +