# HG changeset patch # User Manuele Conti # Date 1339356501 -7200 # Node ID f578f14cb97f68d5c2fd61de9321b37d409fd216 # Parent 8368ec909825a4cd511679f2412e2f952bee7edf Fix compare expression in constat folding class. diff -r 8368ec909825 -r f578f14cb97f stage3/constant_folding.cc --- a/stage3/constant_folding.cc Sun Jun 10 21:47:15 2012 +0100 +++ b/stage3/constant_folding.cc Sun Jun 10 21:28:21 2012 +0200 @@ -178,10 +178,10 @@ #define VALID_CVALUE(dtype, symbol) ((NULL != (symbol)->const_value_##dtype) && (symbol_c::cs_const_value == (symbol)->const_value_##dtype->status)) #define ISZERO_CVALUE(dtype, symbol) ((VALID_CVALUE(dtype, symbol)) && (GET_CVALUE(dtype, symbol) == 0)) -#define DO_BINARY_OPER(dtype, oper)\ +#define DO_BINARY_OPER(dtype, oper, otype)\ if (VALID_CVALUE(dtype, symbol->r_exp) && VALID_CVALUE(dtype, symbol->l_exp)) { \ NEW_CVALUE(dtype, symbol); \ - SET_CVALUE(dtype, symbol, GET_CVALUE(dtype, symbol->l_exp) oper GET_CVALUE(dtype, symbol->r_exp)); \ + SET_CVALUE(otype, symbol, GET_CVALUE(dtype, symbol->l_exp) oper GET_CVALUE(dtype, symbol->r_exp)); \ } #define DO_UNARY_OPER(dtype, oper, arg)\ @@ -496,8 +496,8 @@ void *constant_folding_c::visit(or_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, ||); - DO_BINARY_OPER(uint64, | ); + DO_BINARY_OPER( bool, ||, bool); + DO_BINARY_OPER(uint64, | , bool); return NULL; } @@ -505,8 +505,8 @@ void *constant_folding_c::visit(xor_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, ^); - DO_BINARY_OPER(uint64, ^); + DO_BINARY_OPER( bool, ^, bool); + DO_BINARY_OPER(uint64, ^, uint64); return NULL; } @@ -514,8 +514,8 @@ void *constant_folding_c::visit(and_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, &&); - DO_BINARY_OPER(uint64, & ); + DO_BINARY_OPER( bool, &&, bool); + DO_BINARY_OPER(uint64, & , uint64); return NULL; } @@ -523,10 +523,10 @@ void *constant_folding_c::visit(equ_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, ==); - DO_BINARY_OPER(uint64, ==); - DO_BINARY_OPER( int64, ==); - DO_BINARY_OPER(real64, ==); + DO_BINARY_OPER( bool, ==, bool); + DO_BINARY_OPER(uint64, ==, bool); + DO_BINARY_OPER( int64, ==, bool); + DO_BINARY_OPER(real64, ==, bool); return NULL; } @@ -534,10 +534,10 @@ void *constant_folding_c::visit(notequ_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, !=); - DO_BINARY_OPER(uint64, !=); - DO_BINARY_OPER( int64, !=); - DO_BINARY_OPER(real64, !=); + DO_BINARY_OPER( bool, !=, bool); + DO_BINARY_OPER(uint64, !=, bool); + DO_BINARY_OPER( int64, !=, bool); + DO_BINARY_OPER(real64, !=, bool); return NULL; } @@ -545,10 +545,10 @@ void *constant_folding_c::visit(lt_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, <); - DO_BINARY_OPER(uint64, <); - DO_BINARY_OPER( int64, <); - DO_BINARY_OPER(real64, <); + DO_BINARY_OPER( bool, <, bool); + DO_BINARY_OPER(uint64, <, bool); + DO_BINARY_OPER( int64, <, bool); + DO_BINARY_OPER(real64, <, bool); return NULL; } @@ -556,10 +556,10 @@ void *constant_folding_c::visit(gt_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, >); - DO_BINARY_OPER(uint64, >); - DO_BINARY_OPER( int64, >); - DO_BINARY_OPER(real64, >); + DO_BINARY_OPER( bool, >, bool); + DO_BINARY_OPER(uint64, >, bool); + DO_BINARY_OPER( int64, >, bool); + DO_BINARY_OPER(real64, >, bool); return NULL; } @@ -567,10 +567,10 @@ void *constant_folding_c::visit(le_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, <=); - DO_BINARY_OPER(uint64, <=); - DO_BINARY_OPER( int64, <=); - DO_BINARY_OPER(real64, <=); + DO_BINARY_OPER( bool, <=, bool); + DO_BINARY_OPER(uint64, <=, bool); + DO_BINARY_OPER( int64, <=, bool); + DO_BINARY_OPER(real64, <=, bool); return NULL; } @@ -578,10 +578,10 @@ void *constant_folding_c::visit(ge_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(bool, >=); - DO_BINARY_OPER(uint64, >=); - DO_BINARY_OPER( int64, >=); - DO_BINARY_OPER(real64, >=); + DO_BINARY_OPER( bool, >=, bool); + DO_BINARY_OPER(uint64, >=, bool); + DO_BINARY_OPER( int64, >=, bool); + DO_BINARY_OPER(real64, >=, bool); return NULL; } @@ -589,9 +589,9 @@ void *constant_folding_c::visit(add_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(uint64, +); CHECK_OVERFLOW_uint64_SUM(symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER( int64, +); CHECK_OVERFLOW_int64_SUM (symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER(real64, +); CHECK_OVERFLOW_real64 (symbol); + DO_BINARY_OPER(uint64, +, uint64); CHECK_OVERFLOW_uint64_SUM(symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER( int64, +, int64); CHECK_OVERFLOW_int64_SUM (symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER(real64, +, real64); CHECK_OVERFLOW_real64 (symbol); return NULL; } @@ -599,9 +599,9 @@ void *constant_folding_c::visit(sub_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(uint64, -); CHECK_OVERFLOW_uint64_SUB(symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER( int64, -); CHECK_OVERFLOW_int64_SUB (symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER(real64, -); CHECK_OVERFLOW_real64 (symbol); + DO_BINARY_OPER(uint64, -, uint64); CHECK_OVERFLOW_uint64_SUB(symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER( int64, -, int64); CHECK_OVERFLOW_int64_SUB (symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER(real64, -, real64); CHECK_OVERFLOW_real64 (symbol); return NULL; } @@ -609,9 +609,9 @@ void *constant_folding_c::visit(mul_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - DO_BINARY_OPER(uint64, *); CHECK_OVERFLOW_uint64_MUL(symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER( int64, *); CHECK_OVERFLOW_int64_MUL (symbol, symbol->l_exp, symbol->r_exp); - DO_BINARY_OPER(real64, *); CHECK_OVERFLOW_real64 (symbol); + DO_BINARY_OPER(uint64, *, uint64); CHECK_OVERFLOW_uint64_MUL(symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER( int64, *, int64); CHECK_OVERFLOW_int64_MUL (symbol, symbol->l_exp, symbol->r_exp); + DO_BINARY_OPER(real64, *, real64); CHECK_OVERFLOW_real64 (symbol); return NULL; } @@ -620,9 +620,9 @@ void *constant_folding_c::visit(div_expression_c *symbol) { symbol->l_exp->accept(*this); symbol->r_exp->accept(*this); - if (ISZERO_CVALUE(uint64, symbol->r_exp)) {NEW_CVALUE(uint64, symbol); SET_OVFLOW(uint64, symbol);} else {DO_BINARY_OPER(uint64, /); CHECK_OVERFLOW_uint64_DIV(symbol, symbol->l_exp, symbol->r_exp);}; - if (ISZERO_CVALUE( int64, symbol->r_exp)) {NEW_CVALUE( int64, symbol); SET_OVFLOW( int64, symbol);} else {DO_BINARY_OPER( int64, /); CHECK_OVERFLOW_int64_DIV(symbol, symbol->l_exp, symbol->r_exp);}; - if (ISZERO_CVALUE(real64, symbol->r_exp)) {NEW_CVALUE(real64, symbol); SET_OVFLOW(real64, symbol);} else {DO_BINARY_OPER(real64, /); CHECK_OVERFLOW_real64(symbol);}; + if (ISZERO_CVALUE(uint64, symbol->r_exp)) {NEW_CVALUE(uint64, symbol); SET_OVFLOW(uint64, symbol);} else {DO_BINARY_OPER(uint64, /, uint64); CHECK_OVERFLOW_uint64_DIV(symbol, symbol->l_exp, symbol->r_exp);}; + if (ISZERO_CVALUE( int64, symbol->r_exp)) {NEW_CVALUE( int64, symbol); SET_OVFLOW( int64, symbol);} else {DO_BINARY_OPER( int64, /, int64); CHECK_OVERFLOW_int64_DIV(symbol, symbol->l_exp, symbol->r_exp);}; + if (ISZERO_CVALUE(real64, symbol->r_exp)) {NEW_CVALUE(real64, symbol); SET_OVFLOW(real64, symbol);} else {DO_BINARY_OPER(real64, /, real64); CHECK_OVERFLOW_real64(symbol);}; return NULL; } @@ -636,8 +636,8 @@ * Note that, when IN1 = INT64_MIN, and IN2 = -1, an overflow occurs in the division, * so although the MOD operation should be OK, acording to the above definition, we actually have an overflow!! */ - if (ISZERO_CVALUE(uint64, symbol->r_exp)) {NEW_CVALUE(uint64, symbol); SET_CVALUE(uint64, symbol, 0);} else {DO_BINARY_OPER(uint64, %); CHECK_OVERFLOW_uint64_MOD(symbol, symbol->l_exp, symbol->r_exp);}; - if (ISZERO_CVALUE( int64, symbol->r_exp)) {NEW_CVALUE( int64, symbol); SET_CVALUE( int64, symbol, 0);} else {DO_BINARY_OPER( int64, %); CHECK_OVERFLOW_int64_MOD(symbol, symbol->l_exp, symbol->r_exp);}; + if (ISZERO_CVALUE(uint64, symbol->r_exp)) {NEW_CVALUE(uint64, symbol); SET_CVALUE(uint64, symbol, 0);} else {DO_BINARY_OPER(uint64, %, uint64); CHECK_OVERFLOW_uint64_MOD(symbol, symbol->l_exp, symbol->r_exp);}; + if (ISZERO_CVALUE( int64, symbol->r_exp)) {NEW_CVALUE( int64, symbol); SET_CVALUE( int64, symbol, 0);} else {DO_BINARY_OPER( int64, %, int64); CHECK_OVERFLOW_int64_MOD(symbol, symbol->l_exp, symbol->r_exp);}; return NULL; }