diff --git a/src/treeopt.in b/src/treeopt.in index 0c166da0dba305a12c40bb20eb818116e81a20ee..6bdd54aae11559928e3a4dbd5ed8fdad98e4fba0 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1,6 +1,6 @@ // -*- c -*- // -// $Id: treeopt.in,v 1.40 2000/04/30 13:52:54 grubba Exp $ +// $Id: treeopt.in,v 1.41 2000/09/23 12:41:51 grubba Exp $ // // The tree optimizer // @@ -57,6 +57,17 @@ F_PUSH_ARRAY(0 = F_CONSTANT[$$->u.sval.type == T_ARRAY], *): } ; +// `+(`+(a,b),c) => `+(a, b, c) +F_APPLY(0 = F_CONSTANT + [$$->u.sval.type == T_FUNCTION] + [$$->u.sval.subtype == FUNCTION_BUILTIN] + [$$->u.sval.u.efun->function == f_add], + F_ARG_LIST(F_APPLY($0, 1), 2)): + F_APPLY($0, F_ARG_LIST($1, $2)); + +// Similar rule for `*() disabled, since the type for '*() isn't +// correct for all cases. + F_POP_VALUE(-, *): -;