From: ceriel Date: Wed, 22 Feb 1989 16:16:08 +0000 (+0000) Subject: try to move side effects as much as possible to the left of the X-Git-Tag: release-5-5~2559 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=b1626ca8950303b725804d6f045bea7bc13cb862;p=ack.git try to move side effects as much as possible to the left of the expression tree, to avoid stacking. This is not good enough yet! --- diff --git a/lang/cem/cemcom/ch7bin.c b/lang/cem/cemcom/ch7bin.c index c26a89ebd..0225351ee 100644 --- a/lang/cem/cemcom/ch7bin.c +++ b/lang/cem/cemcom/ch7bin.c @@ -108,6 +108,9 @@ ch7bin(expp, oper, expr) case TIMESAB: arithbalance(expp, oper, &expr); non_commutative_binop(expp, oper, expr); + if (oper != '/' && oper != '%') { + (*expp)->ex_flags |= EX_SIDEEFFECTS; + } break; case '&': @@ -144,6 +147,9 @@ ch7bin(expp, oper, expr) else non_commutative_binop(expp, oper, expr); } + if (oper != '+') { + (*expp)->ex_flags |= EX_SIDEEFFECTS; + } break; case '-': @@ -162,6 +168,9 @@ ch7bin(expp, oper, expr) arithbalance(expp, oper, &expr); non_commutative_binop(expp, oper, expr); } + if (oper != '-') { + (*expp)->ex_flags |= EX_SIDEEFFECTS; + } break; case LEFT: @@ -173,6 +182,9 @@ ch7bin(expp, oper, expr) arithbalance(expp, oper, &expr); /* ch. 7.5 */ ch7cast(&expr, oper, int_type); /* cvt. rightop to int */ non_commutative_binop(expp, oper, expr); + if (oper != LEFT && oper != RIGHT) { + (*expp)->ex_flags |= EX_SIDEEFFECTS; + } break; case '<': @@ -182,7 +194,10 @@ ch7bin(expp, oper, expr) case EQUAL: case NOTEQUAL: relbalance(expp, oper, &expr); - non_commutative_binop(expp, oper, expr); + if (oper == EQUAL || oper == NOTEQUAL) { + commutative_binop(expp, oper, expr); + } + else non_commutative_binop(expp, oper, expr); (*expp)->ex_type = int_type; break; @@ -311,7 +326,10 @@ mk_binop(expp, oper, expr, commutative) if (is_cp_cst(expr) && is_cp_cst(ex)) cstbin(expp, oper, expr); else { - *expp = (commutative && expr->ex_depth >= ex->ex_depth) ? + *expp = (commutative && + ( expr->ex_depth > ex->ex_depth || + (expr->ex_flags & EX_SIDEEFFECTS) || + is_cp_cst(ex))) ? new_oper(ex->ex_type, expr, oper, ex) : new_oper(ex->ex_type, ex, oper, expr); }