diff --git a/src/treeopt.in b/src/treeopt.in
index 4db18b5a991f480170fff1333ebf52b29588496a..8e4a5fbd538f55f6649859478d17e5c902f78248 100644
--- a/src/treeopt.in
+++ b/src/treeopt.in
@@ -1,6 +1,6 @@
 // -*- c -*-
 //
-// $Id: treeopt.in,v 1.46 2000/10/01 18:08:48 grubba Exp $
+// $Id: treeopt.in,v 1.47 2000/10/02 13:52:04 grubba Exp $
 //
 // The tree optimizer
 //
@@ -88,6 +88,37 @@ F_APPLY(0 = F_CONSTANT
   }
   ;
 
+// `-(`-(a,b),c)  =>  `-(a, b, c)
+// NOTE: We do some ugly stuff here to avoid
+//	 resolving the resulting type multiple times.
+F_APPLY(0 = F_CONSTANT
+	[$$->u.sval.type == T_FUNCTION]
+	[$$->u.sval.subtype == FUNCTION_BUILTIN]
+	[$$->u.sval.u.efun->function == f_minus],
+	2 = F_ARG_LIST(F_APPLY($0, 1), 3)):
+  {
+    node *arglist = $2;
+#ifdef SHARED_NODES
+    sub_node(n);
+#endif /* SHARED_NODES */
+    ADD_NODE_REF2($1,
+    ADD_NODE_REF2($3,
+		  _CDR(n) = mknode(F_ARG_LIST, $1, $3)));
+#ifdef SHARED_NODES
+    n->hash = hash_node(n);
+    n->node_info |= OPT_DEFROSTED;
+#endif /* SHARED_NODES */
+    free_node(arglist);
+#ifdef PIKE_DEBUG
+    if (l_flag > 4) {
+      fprintf(stderr, "Result:    ");
+      print_tree(n);
+    }
+#endif /* PIKE_DEBUG */
+    continue;
+  }
+  ;
+
 // `*(`*(a,b),c)  =>  `*(a, b, c)
 // NOTE: We do some ugly stuff here to avoid
 //	 resolving the resulting type multiple times.