You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
#include "private.h"
struct composite_node *n = &node->composite;
assert (is_composite (node->type));
+ /* If you add to these optimizations, please also add a
+ correctness test in tests/expressions/expressions.sh. */
+
/* x+0, x-0, 0+x => x. */
if ((n->type == OP_ADD || n->type == OP_SUB) && eq_double (n->args[1], 0.))
return n->args[0];
else if (n->type == OP_MUL && eq_double (n->args[0], 1.))
return n->args[1];
- /* 0*x, 0/x, x*0, MOD(0,x) => x. */
+ /* 0*x, 0/x, x*0, MOD(0,x) => 0. */
else if (((n->type == OP_MUL || n->type == OP_DIV || n->type == OP_MOD_nn)
&& eq_double (n->args[0], 0.))
|| (n->type == OP_MUL && eq_double (n->args[1], 0.)))
return n->args[0];
/* x**2 => SQUARE(x). */
- else if (n->type == OP_POW && eq_double (n->args[2], 2))
- return expr_allocate_unary (e,OP_SQUARE, node);
+ else if (n->type == OP_POW && eq_double (n->args[1], 2))
+ return expr_allocate_unary (e, OP_SQUARE, n->args[0]);
/* Otherwise, nothing to do. */
else