OSDN Git Service

* expr.c (java_truthvalue_conversion, flush_quick_stack,
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Jul 2004 01:05:28 +0000 (01:05 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Jul 2004 01:05:28 +0000 (01:05 +0000)
java_stack_swap, java_stack_dup, build_java_athrow, build_java_jsr,
build_java_ret, build_java_throw_out_of_bounds_exception,
build_java_array_length_access, java_check_reference,
build_java_arrayaccess, build_java_arraystore_check, build_newarray,
build_anewarray, expand_java_multianewarray, expand_java_arraystore,
expand_java_arrayload, build_java_monitor, expand_java_return,
expand_load_internal, expand_java_NEW, build_get_class,
build_instanceof, expand_java_CHECKCAST, expand_iinc,
build_java_soft_divmod, build_java_binop, build_field_ref,
expand_compare, expand_java_goto, expand_java_switch,
expand_java_add_case, build_class_init, build_known_method_ref,
invoke_build_dtable, build_invokevirtual, build_invokeinterface,
expand_invoke, build_jni_stub, expand_java_field_op,
java_expand_expr, expand_byte_code, STORE_INTERNAL,
force_evaluation_order, emit_init_test_initialization): Convert
calls to "build" into calls to the prefered "buildN" functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84541 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/expr.c

index c6966eb..d73e68d 100644 (file)
@@ -1,3 +1,23 @@
+2004-07-11  Roger Sayle  <roger@eyesopen.com>
+
+       * expr.c (java_truthvalue_conversion, flush_quick_stack,
+       java_stack_swap, java_stack_dup, build_java_athrow, build_java_jsr,
+       build_java_ret, build_java_throw_out_of_bounds_exception,
+       build_java_array_length_access, java_check_reference,
+       build_java_arrayaccess, build_java_arraystore_check, build_newarray,
+       build_anewarray, expand_java_multianewarray, expand_java_arraystore,
+       expand_java_arrayload, build_java_monitor, expand_java_return,
+       expand_load_internal, expand_java_NEW, build_get_class,
+       build_instanceof, expand_java_CHECKCAST, expand_iinc,
+       build_java_soft_divmod, build_java_binop, build_field_ref,
+       expand_compare, expand_java_goto, expand_java_switch,
+       expand_java_add_case, build_class_init, build_known_method_ref,
+       invoke_build_dtable, build_invokevirtual, build_invokeinterface,
+       expand_invoke, build_jni_stub, expand_java_field_op,
+       java_expand_expr, expand_byte_code, STORE_INTERNAL,
+       force_evaluation_order, emit_init_test_initialization): Convert
+       calls to "build" into calls to the prefered "buildN" functions.
+
 2004-07-11  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * java-tree.h (set_block): Remove.
index 81dfde6..a6bc575 100644 (file)
@@ -186,9 +186,10 @@ java_truthvalue_conversion (tree expr)
 
     case COND_EXPR:
       /* Distribute the conversion into the arms of a COND_EXPR.  */
-      return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
-                          java_truthvalue_conversion (TREE_OPERAND (expr, 1)),
-                          java_truthvalue_conversion (TREE_OPERAND (expr, 2))));
+      return fold
+              (build3 (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
+                       java_truthvalue_conversion (TREE_OPERAND (expr, 1)),
+                       java_truthvalue_conversion (TREE_OPERAND (expr, 2))));
 
     case NOP_EXPR:
       /* If this is widening the argument, we can ignore it.  */
@@ -198,7 +199,8 @@ java_truthvalue_conversion (tree expr)
       /* fall through to default */
 
     default:
-      return fold (build (NE_EXPR, boolean_type_node, expr, boolean_false_node));
+      return fold (build2 (NE_EXPR, boolean_type_node,
+                          expr, boolean_false_node));
     }
 }
 
@@ -237,7 +239,7 @@ flush_quick_stack (void)
 
       decl = find_stack_slot (stack_index, type);
       if (decl != node)
-       java_add_stmt (build (MODIFY_EXPR, TREE_TYPE (node), decl, node));
+       java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (node), decl, node));
       stack_index += 1 + TYPE_IS_WIDE (type);
     }
 }
@@ -512,13 +514,13 @@ java_stack_swap (void)
   decl2 = find_stack_slot (stack_pointer - 2, type2);
   temp = build_decl (VAR_DECL, NULL_TREE, type1);
   java_add_local_var (temp);
-  java_add_stmt (build (MODIFY_EXPR, type1, temp, decl1));
-  java_add_stmt (build (MODIFY_EXPR, type2, 
-                       find_stack_slot (stack_pointer - 1, type2),
-                       decl2));
-  java_add_stmt (build (MODIFY_EXPR, type1, 
-                       find_stack_slot (stack_pointer - 2, type1),
-                       temp));
+  java_add_stmt (build2 (MODIFY_EXPR, type1, temp, decl1));
+  java_add_stmt (build2 (MODIFY_EXPR, type2, 
+                        find_stack_slot (stack_pointer - 1, type2),
+                        decl2));
+  java_add_stmt (build2 (MODIFY_EXPR, type1, 
+                        find_stack_slot (stack_pointer - 2, type1),
+                        temp));
   stack_type_map[stack_pointer - 1] = type2;
   stack_type_map[stack_pointer - 2] = type1;
 }
@@ -564,7 +566,7 @@ java_stack_dup (int size, int offset)
          tree dst_decl = find_stack_slot (dst_index, type);
 
          java_add_stmt 
-           (build (MODIFY_EXPR, TREE_TYPE (dst_decl), dst_decl, src_decl));
+           (build2 (MODIFY_EXPR, TREE_TYPE (dst_decl), dst_decl, src_decl));
          stack_type_map[dst_index] = type;
        }
     }
@@ -578,11 +580,11 @@ build_java_athrow (tree node)
 {
   tree call;
 
-  call = build (CALL_EXPR,
-               void_type_node,
-               build_address_of (throw_node),
-               build_tree_list (NULL_TREE, node),
-               NULL_TREE);
+  call = build3 (CALL_EXPR,
+                void_type_node,
+                build_address_of (throw_node),
+                build_tree_list (NULL_TREE, node),
+                NULL_TREE);
   TREE_SIDE_EFFECTS (call) = 1;
   java_add_stmt (call);
   java_stack_pop (stack_pointer);
@@ -598,7 +600,7 @@ build_java_jsr (int target_pc, int return_pc)
   tree ret_label = fold (build1 (ADDR_EXPR, return_address_type_node, ret));
   push_value (ret_label);
   flush_quick_stack ();
-  java_add_stmt (build (GOTO_EXPR, void_type_node, where));
+  java_add_stmt (build1 (GOTO_EXPR, void_type_node, where));
 
   /* Do not need to emit the label here.  We noted the existance of the
      label as a jump target in note_instructions; we'll emit the label
@@ -608,7 +610,7 @@ build_java_jsr (int target_pc, int return_pc)
 static void
 build_java_ret (tree location)
 {
-  java_add_stmt (build (GOTO_EXPR, void_type_node, location));
+  java_add_stmt (build1 (GOTO_EXPR, void_type_node, location));
 }
  
 /* Implementation of operations on array: new, load, store, length */
@@ -661,9 +663,9 @@ encode_newarray_type (tree type)
 static tree
 build_java_throw_out_of_bounds_exception (tree index)
 {
-  tree node = build (CALL_EXPR, int_type_node,
-                    build_address_of (soft_badarrayindex_node), 
-                    build_tree_list (NULL_TREE, index), NULL_TREE);
+  tree node = build3 (CALL_EXPR, int_type_node,
+                     build_address_of (soft_badarrayindex_node), 
+                     build_tree_list (NULL_TREE, index), NULL_TREE);
   TREE_SIDE_EFFECTS (node) = 1;        /* Allows expansion within ANDIF */
   return (node);
 }
@@ -683,9 +685,9 @@ build_java_array_length_access (tree node)
      of type ptr_type_node at this point is `aconst_null; arraylength'
      or something equivalent.  */
   if (type == ptr_type_node)
-    return build (CALL_EXPR, int_type_node, 
-                 build_address_of (soft_nullpointer_node),
-                 NULL_TREE, NULL_TREE);
+    return build3 (CALL_EXPR, int_type_node, 
+                  build_address_of (soft_nullpointer_node),
+                  NULL_TREE, NULL_TREE);
 
   if (!is_array_type_p (type))
     abort ();
@@ -694,11 +696,11 @@ build_java_array_length_access (tree node)
   if (length >= 0)
     return build_int_2 (length, 0);
 
-  node = build (COMPONENT_REF, int_type_node,
-               build_java_indirect_ref (array_type, node,
-                                        flag_check_references),
-               lookup_field (&array_type, get_identifier ("length")),
-               NULL_TREE);
+  node = build3 (COMPONENT_REF, int_type_node,
+                build_java_indirect_ref (array_type, node,
+                                         flag_check_references),
+                lookup_field (&array_type, get_identifier ("length")),
+                NULL_TREE);
   IS_ARRAY_LENGTH_ACCESS (node) = 1;
   return node;
 }
@@ -713,12 +715,13 @@ java_check_reference (tree expr, int check)
   if (!flag_syntax_only && check)
     {
       expr = save_expr (expr);
-      expr = build (COND_EXPR, TREE_TYPE (expr),
-                   build (EQ_EXPR, boolean_type_node, expr, null_pointer_node),
-                   build (CALL_EXPR, void_type_node, 
-                          build_address_of (soft_nullpointer_node),
-                          NULL_TREE, NULL_TREE),
-                   expr);
+      expr = build3 (COND_EXPR, TREE_TYPE (expr),
+                    build2 (EQ_EXPR, boolean_type_node,
+                            expr, null_pointer_node),
+                    build3 (CALL_EXPR, void_type_node, 
+                            build_address_of (soft_nullpointer_node),
+                            NULL_TREE, NULL_TREE),
+                    expr);
     }
 
   return expr;
@@ -758,13 +761,13 @@ build_java_arrayaccess (tree array, tree type, tree index)
       tree test;
       tree len = build_java_array_length_access (array);
       TREE_TYPE (len) = unsigned_int_type_node;
-      test = fold (build (GE_EXPR, boolean_type_node, 
-                              convert (unsigned_int_type_node, index),
-                              len));
+      test = fold (build2 (GE_EXPR, boolean_type_node, 
+                          convert (unsigned_int_type_node, index),
+                          len));
       if (! integer_zerop (test))
        {
-         throw = build (TRUTH_ANDIF_EXPR, int_type_node, test,
-                        build_java_throw_out_of_bounds_exception (index));
+         throw = build2 (TRUTH_ANDIF_EXPR, int_type_node, test,
+                         build_java_throw_out_of_bounds_exception (index));
          /* allows expansion within COMPOUND */
          TREE_SIDE_EFFECTS( throw ) = 1;
        }
@@ -773,16 +776,16 @@ build_java_arrayaccess (tree array, tree type, tree index)
   /* If checking bounds, wrap the index expr with a COMPOUND_EXPR in order
      to have the bounds check evaluated first. */
   if (throw != NULL_TREE)
-    index = build (COMPOUND_EXPR, int_type_node, throw, index);
+    index = build2 (COMPOUND_EXPR, int_type_node, throw, index);
  
   data_field = lookup_field (&array_type, get_identifier ("data"));
 
-  ref = build (COMPONENT_REF, TREE_TYPE (data_field),    
-              build_java_indirect_ref (array_type, array, 
-                                       flag_check_references),
-              data_field, NULL_TREE);
+  ref = build3 (COMPONENT_REF, TREE_TYPE (data_field),    
+               build_java_indirect_ref (array_type, array, 
+                                        flag_check_references),
+               data_field, NULL_TREE);
   
-  node = build (ARRAY_REF, type, ref, index, NULL_TREE, NULL_TREE);
+  node = build4 (ARRAY_REF, type, ref, index, NULL_TREE, NULL_TREE);
   return node;
 }
 
@@ -844,11 +847,11 @@ build_java_arraystore_check (tree array, tree object)
     }
 
   /* Build an invocation of _Jv_CheckArrayStore */
-  check = build (CALL_EXPR, void_type_node,
-                build_address_of (soft_checkarraystore_node),
-                tree_cons (NULL_TREE, array,
-                           build_tree_list (NULL_TREE, object)),
-                NULL_TREE);
+  check = build3 (CALL_EXPR, void_type_node,
+                 build_address_of (soft_checkarraystore_node),
+                 tree_cons (NULL_TREE, array,
+                            build_tree_list (NULL_TREE, object)),
+                 NULL_TREE);
   TREE_SIDE_EFFECTS (check) = 1;
 
   return check;
@@ -907,12 +910,12 @@ build_newarray (int atype_value, tree length)
   else
     type_arg = build_class_ref (prim_type);
 
-  return build (CALL_EXPR, promote_type (type),
-               build_address_of (soft_newarray_node),
-               tree_cons (NULL_TREE, 
-                          type_arg,
-                          build_tree_list (NULL_TREE, length)),
-               NULL_TREE);
+  return build3 (CALL_EXPR, promote_type (type),
+                build_address_of (soft_newarray_node),
+                tree_cons (NULL_TREE, 
+                           type_arg,
+                           build_tree_list (NULL_TREE, length)),
+                NULL_TREE);
 }
 
 /* Generates anewarray from a given CLASS_TYPE. Gets from the stack the size
@@ -926,13 +929,13 @@ build_anewarray (tree class_type, tree length)
                             host_integerp (length, 0)
                             ? tree_low_cst (length, 0) : -1);
 
-  return build (CALL_EXPR, promote_type (type),
-               build_address_of (soft_anewarray_node),
-               tree_cons (NULL_TREE, length,
-                          tree_cons (NULL_TREE, build_class_ref (class_type),
-                                     build_tree_list (NULL_TREE,
-                                                      null_pointer_node))),
-               NULL_TREE);
+  return build3 (CALL_EXPR, promote_type (type),
+                build_address_of (soft_anewarray_node),
+                tree_cons (NULL_TREE, length,
+                           tree_cons (NULL_TREE, build_class_ref (class_type),
+                                      build_tree_list (NULL_TREE,
+                                                       null_pointer_node))),
+                NULL_TREE);
 }
 
 /* Return a node the evaluates 'new TYPE[LENGTH]'. */
@@ -959,13 +962,13 @@ expand_java_multianewarray (tree class_type, int ndim)
   for( i = 0; i < ndim; i++ )
     args = tree_cons (NULL_TREE, pop_value (int_type_node), args);
 
-  push_value (build (CALL_EXPR,
-                    promote_type (class_type),
-                    build_address_of (soft_multianewarray_node),
-                    tree_cons (NULL_TREE, build_class_ref (class_type),
-                               tree_cons (NULL_TREE, 
-                                          build_int_2 (ndim, 0), args )),
-                    NULL_TREE));
+  push_value (build3 (CALL_EXPR,
+                     promote_type (class_type),
+                     build_address_of (soft_multianewarray_node),
+                     tree_cons (NULL_TREE, build_class_ref (class_type),
+                                tree_cons (NULL_TREE, 
+                                           build_int_2 (ndim, 0), args)),
+                     NULL_TREE));
 }
 
 /*  ARRAY[INDEX] <- RHS. build_java_check_indexed_type makes sure that
@@ -1001,7 +1004,7 @@ expand_java_arraystore (tree rhs_type_node)
     }
   
   array = build_java_arrayaccess (array, rhs_type_node, index);
-  java_add_stmt (build (MODIFY_EXPR, TREE_TYPE (array), array, rhs_node));  
+  java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (array), array, rhs_node));  
 }
 
 /* Expand the evaluation of ARRAY[INDEX]. build_java_check_indexed_type makes 
@@ -1025,9 +1028,9 @@ expand_java_arrayload (tree lhs_type_node )
     /* The only way we could get a node of type ptr_type_node at this
        point is `aconst_null; arraylength' or something equivalent, so
        unconditionally throw NullPointerException.  */    
-    load_node = build (CALL_EXPR, lhs_type_node, 
-                      build_address_of (soft_nullpointer_node),
-                      NULL_TREE, NULL_TREE);
+    load_node = build3 (CALL_EXPR, lhs_type_node, 
+                       build_address_of (soft_nullpointer_node),
+                       NULL_TREE, NULL_TREE);
   else
     {
       lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
@@ -1058,11 +1061,11 @@ expand_java_array_length (void)
 static tree
 build_java_monitor (tree call, tree object)
 {
-  return (build (CALL_EXPR,
+  return build3 (CALL_EXPR,
                 void_type_node,
                 build_address_of (call),
                 build_tree_list (NULL_TREE, object),
-                NULL_TREE));
+                NULL_TREE);
 }
 
 /* Emit code for one of the PUSHC instructions. */
@@ -1094,12 +1097,12 @@ static void
 expand_java_return (tree type)
 {
   if (type == void_type_node)
-    java_add_stmt (build (RETURN_EXPR, void_type_node, NULL));   
+    java_add_stmt (build1 (RETURN_EXPR, void_type_node, NULL));   
   else
     {
       tree retval = pop_value (type);
       tree res = DECL_RESULT (current_function_decl);
-      retval = build (MODIFY_EXPR, TREE_TYPE (res), res, retval);
+      retval = build2 (MODIFY_EXPR, TREE_TYPE (res), res, retval);
 
       /* Handle the situation where the native integer type is smaller
         than the JVM integer. It can happen for many cross compilers.
@@ -1111,7 +1114,7 @@ expand_java_return (tree type)
        retval = build1(NOP_EXPR, TREE_TYPE(res), retval);
       
       TREE_SIDE_EFFECTS (retval) = 1;
-      java_add_stmt (build (RETURN_EXPR, TREE_TYPE (retval), retval));
+      java_add_stmt (build1 (RETURN_EXPR, TREE_TYPE (retval), retval));
     }
 }
 
@@ -1129,7 +1132,7 @@ expand_load_internal (int index, tree type, int pc)
      Hopefully this all gets optimized out.  */
   copy = build_decl (VAR_DECL, NULL_TREE, type);
   java_add_local_var (copy);
-  java_add_stmt (build (MODIFY_EXPR, TREE_TYPE (var), copy, var));
+  java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (var), copy, var));
   
   push_value (copy);
 }
@@ -1162,10 +1165,10 @@ expand_java_NEW (tree type)
   if (! CLASS_LOADED_P (type))
     load_class (type, 1);
   safe_layout_class (type);
-  push_value (build (CALL_EXPR, promote_type (type),
-                    build_address_of (alloc_node),
-                    build_tree_list (NULL_TREE, build_class_ref (type)),
-                    NULL_TREE));
+  push_value (build3 (CALL_EXPR, promote_type (type),
+                     build_address_of (alloc_node),
+                     build_tree_list (NULL_TREE, build_class_ref (type)),
+                     NULL_TREE));
 }
 
 /* This returns an expression which will extract the class of an
@@ -1177,13 +1180,13 @@ build_get_class (tree value)
   tree class_field = lookup_field (&dtable_type, get_identifier ("class"));
   tree vtable_field = lookup_field (&object_type_node,
                                    get_identifier ("vtable"));
-  return build (COMPONENT_REF, class_ptr_type,
-               build1 (INDIRECT_REF, dtable_type,
-                       build (COMPONENT_REF, dtable_ptr_type,
-                              build_java_indirect_ref (object_type_node, value,
-                                                       flag_check_references),
-                              vtable_field, NULL_TREE)),
-               class_field, NULL_TREE);
+  tree tmp = build3 (COMPONENT_REF, dtable_ptr_type,
+                    build_java_indirect_ref (object_type_node, value,
+                                             flag_check_references),
+                    vtable_field, NULL_TREE);
+  return build3 (COMPONENT_REF, class_ptr_type,
+                build1 (INDIRECT_REF, dtable_type, tmp),
+                class_field, NULL_TREE);
 }
 
 /* This builds the tree representation of the `instanceof' operator.
@@ -1215,7 +1218,7 @@ build_instanceof (tree value, tree type)
       /* Anything except `null' is an instance of Object.  Likewise,
         if the object is known to be an instance of the class, then
         we only need to check for `null'.  */
-      expr = build (NE_EXPR, itype, value, null_pointer_node);
+      expr = build2 (NE_EXPR, itype, value, null_pointer_node);
     }
   else if (! TYPE_ARRAY_P (type)
           && ! TYPE_ARRAY_P (valtype)
@@ -1233,22 +1236,22 @@ build_instanceof (tree value, tree type)
   else if (DECL_P (klass) && CLASS_FINAL (klass))
     {
       tree save = save_expr (value);
-      expr = build (COND_EXPR, itype,
-                   build (NE_EXPR, boolean_type_node,
-                          save, null_pointer_node),
-                   build (EQ_EXPR, itype,
-                          build_get_class (save),
-                          build_class_ref (type)),
-                   boolean_false_node);
+      expr = build3 (COND_EXPR, itype,
+                    build2 (NE_EXPR, boolean_type_node,
+                            save, null_pointer_node),
+                    build2 (EQ_EXPR, itype,
+                            build_get_class (save),
+                            build_class_ref (type)),
+                    boolean_false_node);
     }
   else
     {
-      expr = build (CALL_EXPR, itype,
-                   build_address_of (soft_instanceof_node),
-                   tree_cons (NULL_TREE, value,
-                              build_tree_list (NULL_TREE,
-                                               build_class_ref (type))),
-                   NULL_TREE);
+      expr = build3 (CALL_EXPR, itype,
+                    build_address_of (soft_instanceof_node),
+                    tree_cons (NULL_TREE, value,
+                               build_tree_list (NULL_TREE,
+                                                build_class_ref (type))),
+                    NULL_TREE);
     }
   TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (value);
   return expr;
@@ -1266,26 +1269,26 @@ static void
 expand_java_CHECKCAST (tree type)
 {
   tree value = pop_value (ptr_type_node);
-  value = build (CALL_EXPR, promote_type (type),
-                build_address_of (soft_checkcast_node),
-                tree_cons (NULL_TREE, build_class_ref (type),
-                           build_tree_list (NULL_TREE, value)),
-                NULL_TREE);
+  value = build3 (CALL_EXPR, promote_type (type),
+                 build_address_of (soft_checkcast_node),
+                 tree_cons (NULL_TREE, build_class_ref (type),
+                            build_tree_list (NULL_TREE, value)),
+                 NULL_TREE);
   push_value (value);
 }
 
 static void
 expand_iinc (unsigned int local_var_index, int ival, int pc)
 {
-    tree local_var, res;
-    tree constant_value;
+  tree local_var, res;
+  tree constant_value;
 
-    flush_quick_stack ();
-    local_var = find_local_variable (local_var_index, int_type_node, pc);
-    constant_value = build_int_2 (ival, ival < 0 ? -1 : 0);
-    res = fold (build (PLUS_EXPR, int_type_node, local_var, constant_value));
-    java_add_stmt (build (MODIFY_EXPR, TREE_TYPE (local_var), local_var, res));
-    update_aliases (local_var, local_var_index);
+  flush_quick_stack ();
+  local_var = find_local_variable (local_var_index, int_type_node, pc);
+  constant_value = build_int_2 (ival, ival < 0 ? -1 : 0);
+  res = fold (build2 (PLUS_EXPR, int_type_node, local_var, constant_value));
+  java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (local_var), local_var, res));
+  update_aliases (local_var, local_var_index);
 }
 
       
@@ -1328,11 +1331,11 @@ build_java_soft_divmod (enum tree_code op, tree type, tree op1, tree op2)
   if (! call)
     abort ();
                  
-  call = build (CALL_EXPR, type,
-               build_address_of (call),
-               tree_cons (NULL_TREE, arg1,
-                          build_tree_list (NULL_TREE, arg2)),
-               NULL_TREE);
+  call = build3 (CALL_EXPR, type,
+                build_address_of (call),
+                tree_cons (NULL_TREE, arg1,
+                           build_tree_list (NULL_TREE, arg2)),
+                NULL_TREE);
          
   return call;
 }
@@ -1353,36 +1356,36 @@ build_java_binop (enum tree_code op, tree type, tree arg1, tree arg2)
     case LSHIFT_EXPR:
     case RSHIFT_EXPR:
       mask = build_int_2 (TYPE_PRECISION (TREE_TYPE (arg1)) - 1, 0);
-      arg2 = fold (build (BIT_AND_EXPR, int_type_node, arg2, mask));
+      arg2 = fold (build2 (BIT_AND_EXPR, int_type_node, arg2, mask));
       break;
 
     case COMPARE_L_EXPR:  /* arg1 > arg2 ?  1 : arg1 == arg2 ? 0 : -1 */
     case COMPARE_G_EXPR:  /* arg1 < arg2 ? -1 : arg1 == arg2 ? 0 :  1 */
       arg1 = save_expr (arg1);  arg2 = save_expr (arg2);
       {
-       tree ifexp1 = fold ( build (op == COMPARE_L_EXPR ? GT_EXPR : LT_EXPR,
+       tree ifexp1 = fold (build2 (op == COMPARE_L_EXPR ? GT_EXPR : LT_EXPR,
                                    boolean_type_node, arg1, arg2));
-       tree ifexp2 = fold ( build (EQ_EXPR, boolean_type_node, arg1, arg2));
-       tree second_compare = fold (build (COND_EXPR, int_type_node,
-                                          ifexp2, integer_zero_node,
-                                          op == COMPARE_L_EXPR
-                                          ? integer_minus_one_node
-                                          : integer_one_node));
-       return fold (build (COND_EXPR, int_type_node, ifexp1,
-                           op == COMPARE_L_EXPR ? integer_one_node
-                           : integer_minus_one_node,
-                           second_compare));
+       tree ifexp2 = fold (build2 (EQ_EXPR, boolean_type_node, arg1, arg2));
+       tree second_compare = fold (build3 (COND_EXPR, int_type_node,
+                                           ifexp2, integer_zero_node,
+                                           op == COMPARE_L_EXPR
+                                           ? integer_minus_one_node
+                                           : integer_one_node));
+       return fold (build3 (COND_EXPR, int_type_node, ifexp1,
+                            op == COMPARE_L_EXPR ? integer_one_node
+                            : integer_minus_one_node,
+                            second_compare));
       }
     case COMPARE_EXPR:
       arg1 = save_expr (arg1);  arg2 = save_expr (arg2);
       {
-       tree ifexp1 = fold ( build (LT_EXPR, boolean_type_node, arg1, arg2));
-       tree ifexp2 = fold ( build (GT_EXPR, boolean_type_node, arg1, arg2));
-       tree second_compare = fold ( build (COND_EXPR, int_type_node,
+       tree ifexp1 = fold (build2 (LT_EXPR, boolean_type_node, arg1, arg2));
+       tree ifexp2 = fold (build2 (GT_EXPR, boolean_type_node, arg1, arg2));
+       tree second_compare = fold (build3 (COND_EXPR, int_type_node,
                                            ifexp2, integer_one_node,
                                            integer_zero_node));
-       return fold (build (COND_EXPR, int_type_node,
-                           ifexp1, integer_minus_one_node, second_compare));
+       return fold (build3 (COND_EXPR, int_type_node,
+                            ifexp1, integer_minus_one_node, second_compare));
       }      
     case TRUNC_DIV_EXPR:
     case TRUNC_MOD_EXPR:
@@ -1395,11 +1398,11 @@ build_java_binop (enum tree_code op, tree type, tree arg1, tree arg2)
              arg1 = convert (double_type_node, arg1);
              arg2 = convert (double_type_node, arg2);
            }
-         call = build (CALL_EXPR, double_type_node,
-                       build_address_of (soft_fmod_node),
-                       tree_cons (NULL_TREE, arg1,
-                                  build_tree_list (NULL_TREE, arg2)),
-                       NULL_TREE);
+         call = build3 (CALL_EXPR, double_type_node,
+                        build_address_of (soft_fmod_node),
+                        tree_cons (NULL_TREE, arg1,
+                                   build_tree_list (NULL_TREE, arg2)),
+                        NULL_TREE);
          if (type != double_type_node)
            call = convert (type, call);
          return call;
@@ -1413,7 +1416,7 @@ build_java_binop (enum tree_code op, tree type, tree arg1, tree arg2)
       break;
     default:  ;
     }
-  return fold (build (op, type, arg1, arg2));
+  return fold (build2 (op, type, arg1, arg2));
 }
 
 static void
@@ -1537,23 +1540,23 @@ build_field_ref (tree self_value, tree self_class, tree name)
                           (field_decl, &TYPE_OTABLE_METHODS (output_class)),
                           0);
          tree field_offset
-           = build (ARRAY_REF, integer_type_node,
-                    TYPE_OTABLE_DECL (output_class), otable_index,
-                    NULL_TREE, NULL_TREE);
+           = build4 (ARRAY_REF, integer_type_node,
+                     TYPE_OTABLE_DECL (output_class), otable_index,
+                     NULL_TREE, NULL_TREE);
          tree address;
 
          field_offset = fold (convert (sizetype, field_offset));
          address 
-           = fold (build (PLUS_EXPR, 
-                          build_pointer_type (TREE_TYPE (field_decl)),
-                          self_value, field_offset));
+           = fold (build2 (PLUS_EXPR, 
+                           build_pointer_type (TREE_TYPE (field_decl)),
+                           self_value, field_offset));
          return fold (build1 (INDIRECT_REF, TREE_TYPE (field_decl), address));
        }
 
       self_value = build_java_indirect_ref (TREE_TYPE (TREE_TYPE (self_value)),
                                            self_value, check);
-      return fold (build (COMPONENT_REF, TREE_TYPE (field_decl),
-                         self_value, field_decl, NULL_TREE));
+      return fold (build3 (COMPONENT_REF, TREE_TYPE (field_decl),
+                          self_value, field_decl, NULL_TREE));
     }
 }
 
@@ -1617,11 +1620,11 @@ expand_compare (enum tree_code condition, tree value1, tree value2,
                int target_pc)
 {
   tree target = lookup_label (target_pc);
-  tree cond = fold (build (condition, boolean_type_node, value1, value2));
+  tree cond = fold (build2 (condition, boolean_type_node, value1, value2));
   java_add_stmt 
-    (build (COND_EXPR, void_type_node, java_truthvalue_conversion (cond),
-           build (GOTO_EXPR, void_type_node, target), 
-           build_java_empty_stmt ()));
+    (build3 (COND_EXPR, void_type_node, java_truthvalue_conversion (cond),
+            build1 (GOTO_EXPR, void_type_node, target), 
+            build_java_empty_stmt ()));
 }
 
 /* Emit code for a TEST-type opcode. */
@@ -1655,7 +1658,7 @@ expand_java_goto (int target_pc)
 {
   tree target_label = lookup_label (target_pc);
   flush_quick_stack ();
-  java_add_stmt (build  (GOTO_EXPR, void_type_node, target_label));
+  java_add_stmt (build1 (GOTO_EXPR, void_type_node, target_label));
 }
 
 static tree
@@ -1664,15 +1667,15 @@ expand_java_switch (tree selector, int default_pc)
   tree switch_expr, x;
 
   flush_quick_stack ();
-  switch_expr = build (SWITCH_EXPR, TREE_TYPE (selector), selector,
-                      NULL_TREE, NULL_TREE);
+  switch_expr = build3 (SWITCH_EXPR, TREE_TYPE (selector), selector,
+                       NULL_TREE, NULL_TREE);
   java_add_stmt (switch_expr);
 
-  x = build (CASE_LABEL_EXPR, void_type_node, NULL_TREE, NULL_TREE,
-            create_artificial_label ());
+  x = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE, NULL_TREE,
+             create_artificial_label ());
   append_to_statement_list (x, &SWITCH_BODY (switch_expr));
 
-  x = build (GOTO_EXPR, void_type_node, lookup_label (default_pc));
+  x = build1 (GOTO_EXPR, void_type_node, lookup_label (default_pc));
   append_to_statement_list (x, &SWITCH_BODY (switch_expr));
 
   return switch_expr;
@@ -1686,11 +1689,11 @@ expand_java_add_case (tree switch_expr, int match, int target_pc)
   value = build_int_2 (match, match < 0 ? -1 : 0);
   TREE_TYPE (value) = TREE_TYPE (switch_expr);
   
-  x = build (CASE_LABEL_EXPR, void_type_node, value, NULL_TREE,
-            create_artificial_label ());
+  x = build3 (CASE_LABEL_EXPR, void_type_node, value, NULL_TREE,
+             create_artificial_label ());
   append_to_statement_list (x, &SWITCH_BODY (switch_expr));
 
-  x = build (GOTO_EXPR, void_type_node, lookup_label (target_pc));
+  x = build1 (GOTO_EXPR, void_type_node, lookup_label (target_pc));
   append_to_statement_list (x, &SWITCH_BODY (switch_expr));
 }
 
@@ -1756,10 +1759,10 @@ build_class_init (tree clas, tree expr)
 
   if (always_initialize_class_p)
     {
-      init = build (CALL_EXPR, void_type_node,
-                   build_address_of (soft_initclass_node),
-                   build_tree_list (NULL_TREE, build_class_ref (clas)),
-                   NULL_TREE);
+      init = build3 (CALL_EXPR, void_type_node,
+                    build_address_of (soft_initclass_node),
+                    build_tree_list (NULL_TREE, build_class_ref (clas)),
+                    NULL_TREE);
       TREE_SIDE_EFFECTS (init) = 1;
     }
   else
@@ -1787,25 +1790,25 @@ build_class_init (tree clas, tree expr)
          DECL_IGNORED_P (*init_test_decl) = 1;
        }
 
-      init = build (CALL_EXPR, void_type_node,
-                   build_address_of (soft_initclass_node),
-                   build_tree_list (NULL_TREE, build_class_ref (clas)),
-                   NULL_TREE);
+      init = build3 (CALL_EXPR, void_type_node,
+                    build_address_of (soft_initclass_node),
+                    build_tree_list (NULL_TREE, build_class_ref (clas)),
+                    NULL_TREE);
       TREE_SIDE_EFFECTS (init) = 1;
-      init = build (COND_EXPR, void_type_node,
-                   build (EQ_EXPR, boolean_type_node, 
-                          *init_test_decl, boolean_false_node),
-                   init, integer_zero_node);
+      init = build3 (COND_EXPR, void_type_node,
+                    build2 (EQ_EXPR, boolean_type_node, 
+                            *init_test_decl, boolean_false_node),
+                    init, integer_zero_node);
       TREE_SIDE_EFFECTS (init) = 1;
-      init = build (COMPOUND_EXPR, TREE_TYPE (expr), init, 
-                   build (MODIFY_EXPR, boolean_type_node,
-                          *init_test_decl, boolean_true_node));
+      init = build2 (COMPOUND_EXPR, TREE_TYPE (expr), init, 
+                    build2 (MODIFY_EXPR, boolean_type_node,
+                            *init_test_decl, boolean_true_node));
       TREE_SIDE_EFFECTS (init) = 1;
     }
 
   if (expr != NULL_TREE)
     {
-      expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);
+      expr = build2 (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);
       TREE_SIDE_EFFECTS (expr) = 1;
       return expr;
     }
@@ -1832,9 +1835,9 @@ build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
          tree table_index
            = build_int_2 (get_symbol_table_index 
                           (method, &TYPE_ATABLE_METHODS (output_class)), 0);
-         func = build (ARRAY_REF,  method_ptr_type_node, 
-                       TYPE_ATABLE_DECL (output_class), table_index,
-                       NULL_TREE, NULL_TREE);
+         func = build4 (ARRAY_REF,  method_ptr_type_node, 
+                        TYPE_ATABLE_DECL (output_class), table_index,
+                        NULL_TREE, NULL_TREE);
        }
       func = convert (method_ptr_type_node, func);
     }
@@ -1860,8 +1863,9 @@ build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
        ncode_ident = get_identifier ("ncode");
       if (methods_ident == NULL_TREE)
        methods_ident = get_identifier ("methods");
-      ref = build (COMPONENT_REF, method_ptr_type_node, ref,
-                  lookup_field (&class_type_node, methods_ident), NULL_TREE);
+      ref = build3 (COMPONENT_REF, method_ptr_type_node, ref,
+                   lookup_field (&class_type_node, methods_ident),
+                   NULL_TREE);
       for (meth = TYPE_METHODS (self_type);
           ; meth = TREE_CHAIN (meth))
        {
@@ -1873,12 +1877,12 @@ build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
          method_index++;
        }
       method_index *= int_size_in_bytes (method_type_node);
-      ref = fold (build (PLUS_EXPR, method_ptr_type_node,
-                        ref, build_int_2 (method_index, 0)));
+      ref = fold (build2 (PLUS_EXPR, method_ptr_type_node,
+                         ref, build_int_2 (method_index, 0)));
       ref = build1 (INDIRECT_REF, method_type_node, ref);
-      func = build (COMPONENT_REF, nativecode_ptr_type_node,
-                   ref, lookup_field (&method_type_node, ncode_ident),
-                   NULL_TREE);
+      func = build3 (COMPONENT_REF, nativecode_ptr_type_node,
+                    ref, lookup_field (&method_type_node, ncode_ident),
+                    NULL_TREE);
     }
   return func;
 }
@@ -1901,8 +1905,8 @@ invoke_build_dtable (int is_invoke_interface, tree arg_list)
     dtable_ident = get_identifier ("vtable");
   dtable = build_java_indirect_ref (object_type_node, objectref, 
                                    flag_check_references);
-  dtable = build (COMPONENT_REF, dtable_ptr_type, dtable,
-                 lookup_field (&object_type_node, dtable_ident), NULL_TREE);
+  dtable = build3 (COMPONENT_REF, dtable_ptr_type, dtable,
+                  lookup_field (&object_type_node, dtable_ident), NULL_TREE);
 
   return dtable;
 }
@@ -1956,9 +1960,9 @@ build_invokevirtual (tree dtable, tree method)
       otable_index 
        = build_int_2 (get_symbol_table_index 
                       (method, &TYPE_OTABLE_METHODS (output_class)), 0);
-      method_index = build (ARRAY_REF, integer_type_node, 
-                           TYPE_OTABLE_DECL (output_class), 
-                           otable_index, NULL_TREE, NULL_TREE);
+      method_index = build4 (ARRAY_REF, integer_type_node, 
+                            TYPE_OTABLE_DECL (output_class), 
+                            otable_index, NULL_TREE, NULL_TREE);
     }
   else
     {
@@ -1974,8 +1978,8 @@ build_invokevirtual (tree dtable, tree method)
                                   size_int (TARGET_VTABLE_USES_DESCRIPTORS));
     }
 
-  func = fold (build (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable,
-                     convert (nativecode_ptr_ptr_type_node, method_index)));
+  func = fold (build2 (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable,
+                      convert (nativecode_ptr_ptr_type_node, method_index)));
 
   if (TARGET_VTABLE_USES_DESCRIPTORS)
     func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
@@ -2003,8 +2007,8 @@ build_invokeinterface (tree dtable, tree method)
 
   dtable = build_java_indirect_ref (dtable_type, dtable,
                                    flag_check_references);
-  dtable = build (COMPONENT_REF, class_ptr_type, dtable,
-                 lookup_field (&dtable_type, class_ident), NULL_TREE);
+  dtable = build3 (COMPONENT_REF, class_ptr_type, dtable,
+                  lookup_field (&dtable_type, class_ident), NULL_TREE);
 
   interface = DECL_CONTEXT (method);
   if (! CLASS_INTERFACE (TYPE_NAME (interface)))
@@ -2016,9 +2020,9 @@ build_invokeinterface (tree dtable, tree method)
       otable_index
        = build_int_2 (get_symbol_table_index 
                       (method, &TYPE_OTABLE_METHODS (output_class)), 0);
-      idx = build (ARRAY_REF, integer_type_node,
-                  TYPE_OTABLE_DECL (output_class), otable_index,
-                  NULL_TREE, NULL_TREE);
+      idx = build4 (ARRAY_REF, integer_type_node,
+                   TYPE_OTABLE_DECL (output_class), otable_index,
+                   NULL_TREE, NULL_TREE);
     }
   else
     idx = build_int_2 (get_interface_method_index (method, interface), 0);
@@ -2027,9 +2031,9 @@ build_invokeinterface (tree dtable, tree method)
                           tree_cons (NULL_TREE, build_class_ref (interface),
                                     build_tree_list (NULL_TREE, idx)));
                                                          
-  return build (CALL_EXPR, ptr_type_node, 
-               build_address_of (soft_lookupinterfacemethod_node),
-               lookup_arg, NULL_TREE);
+  return build3 (CALL_EXPR, ptr_type_node, 
+                build_address_of (soft_lookupinterfacemethod_node),
+                lookup_arg, NULL_TREE);
 }
   
 /* Expand one of the invoke_* opcodes.
@@ -2150,13 +2154,14 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
   else
     func = build1 (NOP_EXPR, build_pointer_type (method_type), func);
 
-  call = build (CALL_EXPR, TREE_TYPE (method_type), func, arg_list, NULL_TREE);
+  call = build3 (CALL_EXPR, TREE_TYPE (method_type),
+                func, arg_list, NULL_TREE);
   TREE_SIDE_EFFECTS (call) = 1;
   call = check_for_builtin (method, call);
 
   if (check != NULL_TREE)
     {
-      call = build (COMPOUND_EXPR, TREE_TYPE (call), check, call);
+      call = build2 (COMPOUND_EXPR, TREE_TYPE (call), check, call);
       TREE_SIDE_EFFECTS (call) = 1;
     }
 
@@ -2231,11 +2236,11 @@ build_jni_stub (tree method)
     TREE_TYPE (block) = TREE_TYPE (TREE_TYPE (method));
 
   /* Compute the local `env' by calling _Jv_GetJNIEnvNewFrame.  */
-  body = build (MODIFY_EXPR, ptr_type_node, env_var,
-               build (CALL_EXPR, ptr_type_node,
-                      build_address_of (soft_getjnienvnewframe_node),
-                      build_tree_list (NULL_TREE, klass),
-                      NULL_TREE));
+  body = build2 (MODIFY_EXPR, ptr_type_node, env_var,
+                build3 (CALL_EXPR, ptr_type_node,
+                        build_address_of (soft_getjnienvnewframe_node),
+                        build_tree_list (NULL_TREE, klass),
+                        NULL_TREE));
   CAN_COMPLETE_NORMALLY (body) = 1;
 
   /* All the arguments to this method become arguments to the
@@ -2294,40 +2299,40 @@ build_jni_stub (tree method)
 
   jni_func_type = build_pointer_type (tem);
 
-  jnifunc = build (COND_EXPR, ptr_type_node,
-                  meth_var, meth_var,
-                  build (MODIFY_EXPR, ptr_type_node,
-                         meth_var,
-                         build (CALL_EXPR, ptr_type_node,
-                                build_address_of (soft_lookupjnimethod_node),
-                                lookup_arg, NULL_TREE)));
+  jnifunc = build3 (COND_EXPR, ptr_type_node,
+                   meth_var, meth_var,
+                   build2 (MODIFY_EXPR, ptr_type_node, meth_var,
+                           build3 (CALL_EXPR, ptr_type_node,
+                                   build_address_of
+                                     (soft_lookupjnimethod_node),
+                                   lookup_arg, NULL_TREE)));
 
   /* Now we make the actual JNI call via the resulting function
      pointer.    */
-  call = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)),
-               build1 (NOP_EXPR, jni_func_type, jnifunc),
-               args, NULL_TREE);
+  call = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)),
+                build1 (NOP_EXPR, jni_func_type, jnifunc),
+                args, NULL_TREE);
 
   /* If the JNI call returned a result, capture it here.  If we had to
      unwrap JNI object results, we would do that here.  */
   if (res_var != NULL_TREE)
-    call = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
-                 res_var, call);
+    call = build2 (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
+                  res_var, call);
 
   TREE_SIDE_EFFECTS (call) = 1;
   CAN_COMPLETE_NORMALLY (call) = 1;
 
-  body = build (COMPOUND_EXPR, void_type_node, body, call);
+  body = build2 (COMPOUND_EXPR, void_type_node, body, call);
   TREE_SIDE_EFFECTS (body) = 1;
 
   /* Now free the environment we allocated.  */
-  call = build (CALL_EXPR, ptr_type_node,
-               build_address_of (soft_jnipopsystemframe_node),
-               build_tree_list (NULL_TREE, env_var),
-               NULL_TREE);
+  call = build3 (CALL_EXPR, ptr_type_node,
+                build_address_of (soft_jnipopsystemframe_node),
+                build_tree_list (NULL_TREE, env_var),
+                NULL_TREE);
   TREE_SIDE_EFFECTS (call) = 1;
   CAN_COMPLETE_NORMALLY (call) = 1;
-  body = build (COMPOUND_EXPR, void_type_node, body, call);
+  body = build2 (COMPOUND_EXPR, void_type_node, body, call);
   TREE_SIDE_EFFECTS (body) = 1;
 
   /* Finally, do the return.  */
@@ -2344,16 +2349,16 @@ build_jni_stub (tree method)
       drt = TREE_TYPE (DECL_RESULT (method));
       if (drt != TREE_TYPE (res_var))
        res_var = build1 (CONVERT_EXPR, drt, res_var);
-      res_var = build (MODIFY_EXPR, drt, DECL_RESULT (method), res_var);
+      res_var = build2 (MODIFY_EXPR, drt, DECL_RESULT (method), res_var);
       TREE_SIDE_EFFECTS (res_var) = 1;
     }
 
-  body = build (COMPOUND_EXPR, void_type_node, body,
-               build1 (RETURN_EXPR, res_type, res_var));
+  body = build2 (COMPOUND_EXPR, void_type_node, body,
+                build1 (RETURN_EXPR, res_type, res_var));
   TREE_SIDE_EFFECTS (body) = 1;
   
-  bind = build (BIND_EXPR, void_type_node, BLOCK_VARS (block), 
-               body, block);
+  bind = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (block), 
+                body, block);
   return bind;
 }
 
@@ -2435,8 +2440,8 @@ expand_java_field_op (int is_static, int is_putting, int field_ref_index)
                         field_decl, field_decl);
            }
        }
-      java_add_stmt (build (MODIFY_EXPR, 
-                           TREE_TYPE (field_ref), field_ref, new_value));
+      java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (field_ref),
+                            field_ref, new_value));
     }
   else
     push_value (field_ref);
@@ -2642,7 +2647,7 @@ expand_byte_code (JCF *jcf, tree method)
          tree label = lookup_label (PC);
           flush_quick_stack ();
          if ((instruction_bits [PC] & BCODE_TARGET) != 0)
-           java_add_stmt (build (LABEL_EXPR, void_type_node, label));
+           java_add_stmt (build1 (LABEL_EXPR, void_type_node, label));
          if (LABEL_VERIFIED (label) || PC == 0)
            load_type_state (label);
        }
@@ -2931,7 +2936,7 @@ process_jvm_instruction (int PC, const unsigned char* byte_ops,
     type = TREE_TYPE (value);                                  \
     decl = find_local_variable (index, type, oldpc);           \
     set_local_type (index, type);                              \
-    java_add_stmt (build (MODIFY_EXPR, type, decl, value));    \
+    java_add_stmt (build2 (MODIFY_EXPR, type, decl, value));   \
     update_aliases (decl, index);                              \
   }
 
@@ -3191,7 +3196,7 @@ force_evaluation_order (tree node)
        {
          tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg)));
          cmp = (cmp == NULL_TREE ? saved :
-                build (COMPOUND_EXPR, void_type_node, cmp, saved));
+                build2 (COMPOUND_EXPR, void_type_node, cmp, saved));
          TREE_VALUE (arg) = saved;
        }
       
@@ -3200,7 +3205,7 @@ force_evaluation_order (tree node)
 
       if (cmp)
        {
-         cmp = build (COMPOUND_EXPR, TREE_TYPE (node), cmp, node);
+         cmp = build2 (COMPOUND_EXPR, TREE_TYPE (node), cmp, node);
          if (TREE_TYPE (cmp) != void_type_node)
            cmp = save_expr (cmp);
          CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);