[PATCH][fortran] Use build_function_call_expr. (2nd try)

Richard Guenther rguenther@suse.de
Mon Dec 12 15:58:00 GMT 2005


On Wed, 7 Dec 2005, Richard Guenther wrote:

> 
> This patch removes gfc_build_function_call and #defines it to
> use build_function_call_expr instead, which doesnt set
> TREE_SIDE_EFFECTS on the CALL_EXPR (what was this supposed to do?)
> and calls fold_build3 instead of build3 and not folding the
> function call.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> Ok for mainline?

Here's the variant requested that replaces all gfc_build_function_call
by build_function_call_expr (and strips fold() where possible).

Build tested, will give it a bootstrap & regtest with other related
changes later.

Ok for mainline?

Thanks,
Richard.

2005-12-12  Richard Guenther  <rguenther@suse.de>

	* trans.h (tree): Remove declaration of gfc_build_function_call.
	* trans.c (gfc_build_function_call): Remove.
	(gfc_build_array_ref): Use build_function_call_expr.
	(gfc_trans_runtime_check): Likewise.
	* trans-array.c (gfc_trans_allocate_array_storage): Likewise.
	(gfc_grow_array): Likewise.
	(gfc_trans_array_ctor_element): Likewise.
	(gfc_trans_array_constructor_value): Likewise.
	(gfc_array_allocate): Likewise.
	(gfc_array_deallocate): Likewise.
	(gfc_trans_auto_array_allocation): Likewise.
	(gfc_trans_dummy_array_bias): Likewise.
	(gfc_conv_array_parameter): Likewise.
	* trans-expr.c (gfc_conv_power_op): Likewise.
	(gfc_conv_string_tmp): Likewise.
	(gfc_conv_concat_op): Likewise.
	(gfc_conv_expr_op): Likewise.
	(gfc_trans_string_copy): Likewise.
	* trans-decl.c (build_entry_thunks): Likewise.
	(gfc_generate_function_code): Likewise.
	(gfc_generate_constructors): Likewise.
	* trans-io.c (gfc_trans_open): Likewise.
	(gfc_trans_close): Likewise.
	(build_filepos): Likewise.
	(gfc_trans_inquire): Likewise.
	(transfer_namelist_element): Likewise.
	(build_dt): Likewise.
	(gfc_trans_dt_end): Likewise.
	(transfer_expr): Likewise.
	(transfer_array_desc): Likewise.
	* trans-stmt.c (gfc_trans_pause): Likewise.
	(gfc_trans_stop): Likewise.
	(gfc_trans_character_select): Likewise.
	(gfc_do_allocate): Likewise.
	(gfc_trans_assign_need_temp): Likewise.
	(gfc_trans_pointer_assign_need_temp): Likewise.
	(gfc_trans_forall_1): Likewise.
	(gfc_trans_where): Likewise.
	(gfc_trans_allocate): Likewise.
	(gfc_trans_deallocate): Likewise.
	* trans-intrinsic.c (gfc_conv_intrinsic_aint): Likewise.
	(gfc_conv_intrinsic_lib_function): Likewise.
	(gfc_conv_intrinsic_exponent): Likewise.
	(gfc_conv_intrinsic_abs): Likewise.
	(gfc_conv_intrinsic_sign): Likewise.
	(gfc_conv_intrinsic_ctime): Likewise.
	(gfc_conv_intrinsic_fdate): Likewise.
	(gfc_conv_intrinsic_ttynam): Likewise.
	(gfc_conv_intrinsic_ishftc): Likewise.
	(gfc_conv_intrinsic_len_trim): Likewise.
	(gfc_conv_intrinsic_index): Likewise.
	(gfc_conv_intrinsic_size): Likewise.
	(gfc_conv_intrinsic_strcmp): Likewise.
	(gfc_conv_intrinsic_adjust): Likewise.
	(gfc_conv_associated): Likewise.
	(gfc_conv_intrinsic_scan): Likewise.
	(gfc_conv_intrinsic_verify): Likewise.
	(call_builtin_clz): Likewise.
	(gfc_conv_intrinsic_si_kind): Likewise.
	(gfc_conv_intrinsic_sr_kind): Likewise.
	(gfc_conv_intrinsic_trim): Likewise.
	(gfc_conv_intrinsic_repeat): Likewise.
	(gfc_conv_intrinsic_iargc): Likewise.

Index: trans-array.c
===================================================================
*** trans-array.c	(revision 108411)
--- trans-array.c	(working copy)
*************** gfc_trans_allocate_array_storage (stmtbl
*** 533,539 ****
  	    tmp = gfor_fndecl_internal_malloc64;
  	  else
  	    gcc_unreachable ();
! 	  tmp = gfc_build_function_call (tmp, args);
  	  tmp = gfc_evaluate_now (tmp, pre);
  	  gfc_conv_descriptor_data_set (pre, desc, tmp);
  	}
--- 533,539 ----
  	    tmp = gfor_fndecl_internal_malloc64;
  	  else
  	    gcc_unreachable ();
! 	  tmp = build_function_call_expr (tmp, args);
  	  tmp = gfc_evaluate_now (tmp, pre);
  	  gfc_conv_descriptor_data_set (pre, desc, tmp);
  	}
*************** gfc_trans_allocate_array_storage (stmtbl
*** 551,557 ****
        tmp = gfc_conv_descriptor_data_get (desc);
        tmp = fold_convert (pvoid_type_node, tmp);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (post, tmp);
      }
  }
--- 551,557 ----
        tmp = gfc_conv_descriptor_data_get (desc);
        tmp = fold_convert (pvoid_type_node, tmp);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (post, tmp);
      }
  }
*************** gfc_grow_array (stmtblock_t * pblock, tr
*** 729,735 ****
      gcc_unreachable ();
  
    /* Set the new data pointer.  */
!   tmp = gfc_build_function_call (tmp, args);
    gfc_conv_descriptor_data_set (pblock, desc, tmp);
  }
  
--- 729,735 ----
      gcc_unreachable ();
  
    /* Set the new data pointer.  */
!   tmp = build_function_call_expr (tmp, args);
    gfc_conv_descriptor_data_set (pblock, desc, tmp);
  }
  
*************** gfc_trans_array_ctor_element (stmtblock_
*** 864,870 ****
  	  args = gfc_chainon_list (args, se->expr);
  	  args = gfc_chainon_list (args, se->string_length);
  	  tmp = built_in_decls[BUILT_IN_MEMCPY];
! 	  tmp = gfc_build_function_call (tmp, args);
  	  gfc_add_expr_to_block (&se->pre, tmp);
  	}
      }
--- 864,870 ----
  	  args = gfc_chainon_list (args, se->expr);
  	  args = gfc_chainon_list (args, se->string_length);
  	  tmp = built_in_decls[BUILT_IN_MEMCPY];
! 	  tmp = build_function_call_expr (tmp, args);
  	  gfc_add_expr_to_block (&se->pre, tmp);
  	}
      }
*************** gfc_trans_array_constructor_value (stmtb
*** 1078,1084 ****
  	      tmp = gfc_chainon_list (NULL_TREE, tmp);
  	      tmp = gfc_chainon_list (tmp, init);
  	      tmp = gfc_chainon_list (tmp, bound);
! 	      tmp = gfc_build_function_call (built_in_decls[BUILT_IN_MEMCPY],
  					     tmp);
  	      gfc_add_expr_to_block (&body, tmp);
  
--- 1078,1084 ----
  	      tmp = gfc_chainon_list (NULL_TREE, tmp);
  	      tmp = gfc_chainon_list (tmp, init);
  	      tmp = gfc_chainon_list (tmp, bound);
! 	      tmp = build_function_call_expr (built_in_decls[BUILT_IN_MEMCPY],
  					     tmp);
  	      gfc_add_expr_to_block (&body, tmp);
  
*************** gfc_array_allocate (gfc_se * se, gfc_ref
*** 2960,2966 ****
    tmp = gfc_chainon_list (NULL_TREE, pointer);
    tmp = gfc_chainon_list (tmp, size);
    tmp = gfc_chainon_list (tmp, pstat);
!   tmp = gfc_build_function_call (allocate, tmp);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    tmp = gfc_conv_descriptor_offset (se->expr);
--- 2960,2966 ----
    tmp = gfc_chainon_list (NULL_TREE, pointer);
    tmp = gfc_chainon_list (tmp, size);
    tmp = gfc_chainon_list (tmp, pstat);
!   tmp = build_function_call_expr (allocate, tmp);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    tmp = gfc_conv_descriptor_offset (se->expr);
*************** gfc_array_deallocate (tree descriptor, t
*** 2987,2993 ****
    /* Parameter is the address of the data component.  */
    tmp = gfc_chainon_list (NULL_TREE, var);
    tmp = gfc_chainon_list (tmp, pstat);
!   tmp = gfc_build_function_call (gfor_fndecl_deallocate, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    return gfc_finish_block (&block);
--- 2987,2993 ----
    /* Parameter is the address of the data component.  */
    tmp = gfc_chainon_list (NULL_TREE, var);
    tmp = gfc_chainon_list (tmp, pstat);
!   tmp = build_function_call_expr (gfor_fndecl_deallocate, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    return gfc_finish_block (&block);
*************** gfc_trans_auto_array_allocation (tree de
*** 3266,3272 ****
      fndecl = gfor_fndecl_internal_malloc64;
    else
      gcc_unreachable ();
!   tmp = gfc_build_function_call (fndecl, tmp);
    tmp = fold (convert (TREE_TYPE (decl), tmp));
    gfc_add_modify_expr (&block, decl, tmp);
  
--- 3266,3272 ----
      fndecl = gfor_fndecl_internal_malloc64;
    else
      gcc_unreachable ();
!   tmp = build_function_call_expr (fndecl, tmp);
    tmp = fold (convert (TREE_TYPE (decl), tmp));
    gfc_add_modify_expr (&block, decl, tmp);
  
*************** gfc_trans_auto_array_allocation (tree de
*** 3283,3289 ****
    /* Free the temporary.  */
    tmp = convert (pvoid_type_node, decl);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    return gfc_finish_block (&block);
--- 3283,3289 ----
    /* Free the temporary.  */
    tmp = convert (pvoid_type_node, decl);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    return gfc_finish_block (&block);
*************** gfc_trans_dummy_array_bias (gfc_symbol *
*** 3444,3450 ****
        /* A library call to repack the array if necessary.  */
        tmp = GFC_DECL_SAVED_DESCRIPTOR (tmpdesc);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       stmt_unpacked = gfc_build_function_call (gfor_fndecl_in_pack, tmp);
  
        stride = gfc_index_one_node;
      }
--- 3444,3450 ----
        /* A library call to repack the array if necessary.  */
        tmp = GFC_DECL_SAVED_DESCRIPTOR (tmpdesc);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       stmt_unpacked = build_function_call_expr (gfor_fndecl_in_pack, tmp);
  
        stride = gfc_index_one_node;
      }
*************** gfc_trans_dummy_array_bias (gfc_symbol *
*** 3606,3618 ****
  	  /* Copy the data back.  */
  	  tmp = gfc_chainon_list (NULL_TREE, dumdesc);
  	  tmp = gfc_chainon_list (tmp, tmpdesc);
! 	  tmp = gfc_build_function_call (gfor_fndecl_in_unpack, tmp);
  	  gfc_add_expr_to_block (&cleanup, tmp);
  	}
  
        /* Free the temporary.  */
        tmp = gfc_chainon_list (NULL_TREE, tmpdesc);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&cleanup, tmp);
  
        stmt = gfc_finish_block (&cleanup);
--- 3606,3618 ----
  	  /* Copy the data back.  */
  	  tmp = gfc_chainon_list (NULL_TREE, dumdesc);
  	  tmp = gfc_chainon_list (tmp, tmpdesc);
! 	  tmp = build_function_call_expr (gfor_fndecl_in_unpack, tmp);
  	  gfc_add_expr_to_block (&cleanup, tmp);
  	}
  
        /* Free the temporary.  */
        tmp = gfc_chainon_list (NULL_TREE, tmpdesc);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&cleanup, tmp);
  
        stmt = gfc_finish_block (&cleanup);
*************** gfc_conv_array_parameter (gfc_se * se, g
*** 4116,4122 ****
        desc = se->expr;
        /* Repack the array.  */
        tmp = gfc_chainon_list (NULL_TREE, desc);
!       ptr = gfc_build_function_call (gfor_fndecl_in_pack, tmp);
        ptr = gfc_evaluate_now (ptr, &se->pre);
        se->expr = ptr;
  
--- 4116,4122 ----
        desc = se->expr;
        /* Repack the array.  */
        tmp = gfc_chainon_list (NULL_TREE, desc);
!       ptr = build_function_call_expr (gfor_fndecl_in_pack, tmp);
        ptr = gfc_evaluate_now (ptr, &se->pre);
        se->expr = ptr;
  
*************** gfc_conv_array_parameter (gfc_se * se, g
*** 4125,4137 ****
        /* Copy the data back.  */
        tmp = gfc_chainon_list (NULL_TREE, desc);
        tmp = gfc_chainon_list (tmp, ptr);
!       tmp = gfc_build_function_call (gfor_fndecl_in_unpack, tmp);
        gfc_add_expr_to_block (&block, tmp);
  
        /* Free the temporary.  */
        tmp = convert (pvoid_type_node, ptr);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&block, tmp);
  
        stmt = gfc_finish_block (&block);
--- 4125,4137 ----
        /* Copy the data back.  */
        tmp = gfc_chainon_list (NULL_TREE, desc);
        tmp = gfc_chainon_list (tmp, ptr);
!       tmp = build_function_call_expr (gfor_fndecl_in_unpack, tmp);
        gfc_add_expr_to_block (&block, tmp);
  
        /* Free the temporary.  */
        tmp = convert (pvoid_type_node, ptr);
        tmp = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&block, tmp);
  
        stmt = gfc_finish_block (&block);
Index: trans-expr.c
===================================================================
*** trans-expr.c	(revision 108411)
--- trans-expr.c	(working copy)
*************** gfc_conv_power_op (gfc_se * se, gfc_expr
*** 799,805 ****
  
    tmp = gfc_chainon_list (NULL_TREE, lse.expr);
    tmp = gfc_chainon_list (tmp, rse.expr);
!   se->expr = fold (gfc_build_function_call (fndecl, tmp));
  }
  
  
--- 799,805 ----
  
    tmp = gfc_chainon_list (NULL_TREE, lse.expr);
    tmp = gfc_chainon_list (tmp, rse.expr);
!   se->expr = build_function_call_expr (fndecl, tmp);
  }
  
  
*************** gfc_conv_string_tmp (gfc_se * se, tree t
*** 829,842 ****
        /* Allocate a temporary to hold the result.  */
        var = gfc_create_var (type, "pstr");
        args = gfc_chainon_list (NULL_TREE, len);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_malloc, args);
        tmp = convert (type, tmp);
        gfc_add_modify_expr (&se->pre, var, tmp);
  
        /* Free the temporary afterwards.  */
        tmp = convert (pvoid_type_node, var);
        args = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, args);
        gfc_add_expr_to_block (&se->post, tmp);
      }
  
--- 829,842 ----
        /* Allocate a temporary to hold the result.  */
        var = gfc_create_var (type, "pstr");
        args = gfc_chainon_list (NULL_TREE, len);
!       tmp = build_function_call_expr (gfor_fndecl_internal_malloc, args);
        tmp = convert (type, tmp);
        gfc_add_modify_expr (&se->pre, var, tmp);
  
        /* Free the temporary afterwards.  */
        tmp = convert (pvoid_type_node, var);
        args = gfc_chainon_list (NULL_TREE, tmp);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
        gfc_add_expr_to_block (&se->post, tmp);
      }
  
*************** gfc_conv_concat_op (gfc_se * se, gfc_exp
*** 891,897 ****
    args = gfc_chainon_list (args, lse.expr);
    args = gfc_chainon_list (args, rse.string_length);
    args = gfc_chainon_list (args, rse.expr);
!   tmp = gfc_build_function_call (gfor_fndecl_concat_string, args);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Add the cleanup for the operands.  */
--- 891,897 ----
    args = gfc_chainon_list (args, lse.expr);
    args = gfc_chainon_list (args, rse.string_length);
    args = gfc_chainon_list (args, rse.expr);
!   tmp = build_function_call_expr (gfor_fndecl_concat_string, args);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Add the cleanup for the operands.  */
*************** gfc_conv_expr_op (gfc_se * se, gfc_expr 
*** 1057,1063 ****
        tmp = gfc_chainon_list (tmp, rse.expr);
  
        /* Build a call for the comparison.  */
!       lse.expr = gfc_build_function_call (gfor_fndecl_compare_string, tmp);
        gfc_add_block_to_block (&lse.post, &rse.post);
  
        rse.expr = integer_zero_node;
--- 1057,1063 ----
        tmp = gfc_chainon_list (tmp, rse.expr);
  
        /* Build a call for the comparison.  */
!       lse.expr = build_function_call_expr (gfor_fndecl_compare_string, tmp);
        gfc_add_block_to_block (&lse.post, &rse.post);
  
        rse.expr = integer_zero_node;
*************** gfc_trans_string_copy (stmtblock_t * blo
*** 1825,1831 ****
    tmp = gfc_chainon_list (tmp, dest);
    tmp = gfc_chainon_list (tmp, slen);
    tmp = gfc_chainon_list (tmp, src);
!   tmp = gfc_build_function_call (gfor_fndecl_copy_string, tmp);
    gfc_add_expr_to_block (block, tmp);
  }
  
--- 1825,1831 ----
    tmp = gfc_chainon_list (tmp, dest);
    tmp = gfc_chainon_list (tmp, slen);
    tmp = gfc_chainon_list (tmp, src);
!   tmp = build_function_call_expr (gfor_fndecl_copy_string, tmp);
    gfc_add_expr_to_block (block, tmp);
  }
  
Index: trans-decl.c
===================================================================
*** trans-decl.c	(revision 108411)
--- trans-decl.c	(working copy)
*************** build_entry_thunks (gfc_namespace * ns)
*** 1545,1551 ****
        args = nreverse (args);
        args = chainon (args, nreverse (string_args));
        tmp = ns->proc_name->backend_decl;
!       tmp = gfc_build_function_call (tmp, args);
        if (ns->proc_name->attr.mixed_entry_master)
  	{
  	  tree union_decl, field;
--- 1545,1551 ----
        args = nreverse (args);
        args = chainon (args, nreverse (string_args));
        tmp = ns->proc_name->backend_decl;
!       tmp = build_function_call_expr (tmp, args);
        if (ns->proc_name->attr.mixed_entry_master)
  	{
  	  tree union_decl, field;
*************** gfc_generate_function_code (gfc_namespac
*** 2602,2608 ****
        arglist = gfc_chainon_list (arglist,
  				  build_int_cst (gfc_int4_type_node,
  						 gfc_option.allow_std));
!       tmp = gfc_build_function_call (gfor_fndecl_set_std, arglist);
        gfc_add_expr_to_block (&body, tmp);
      }
  
--- 2602,2608 ----
        arglist = gfc_chainon_list (arglist,
  				  build_int_cst (gfc_int4_type_node,
  						 gfc_option.allow_std));
!       tmp = build_function_call_expr (gfor_fndecl_set_std, arglist);
        gfc_add_expr_to_block (&body, tmp);
      }
  
*************** gfc_generate_function_code (gfc_namespac
*** 2617,2623 ****
        arglist = gfc_chainon_list (NULL_TREE,
  				  build_int_cst (gfc_c_int_type_node,
  						 gfc_option.fpe));
!       tmp = gfc_build_function_call (gfor_fndecl_set_fpe, arglist);
        gfc_add_expr_to_block (&body, tmp);
      }
  
--- 2617,2623 ----
        arglist = gfc_chainon_list (NULL_TREE,
  				  build_int_cst (gfc_c_int_type_node,
  						 gfc_option.fpe));
!       tmp = build_function_call_expr (gfor_fndecl_set_fpe, arglist);
        gfc_add_expr_to_block (&body, tmp);
      }
  
*************** gfc_generate_constructors (void)
*** 2764,2770 ****
    for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
      {
        tmp =
! 	gfc_build_function_call (TREE_VALUE (gfc_static_ctors), NULL_TREE);
        DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
      }
  
--- 2764,2770 ----
    for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
      {
        tmp =
! 	build_function_call_expr (TREE_VALUE (gfc_static_ctors), NULL_TREE);
        DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
      }
  
Index: trans-io.c
===================================================================
*** trans-io.c	(revision 108411)
--- trans-io.c	(working copy)
*************** gfc_trans_open (gfc_code * code)
*** 799,805 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (iocall[IOCALL_OPEN], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
--- 799,805 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (iocall[IOCALL_OPEN], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
*************** gfc_trans_close (gfc_code * code)
*** 852,858 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (iocall[IOCALL_CLOSE], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
--- 852,858 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (iocall[IOCALL_CLOSE], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
*************** build_filepos (tree function, gfc_code *
*** 903,909 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
--- 903,909 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
*************** gfc_trans_inquire (gfc_code * code)
*** 1085,1091 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (iocall[IOCALL_INQUIRE], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
--- 1085,1091 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (iocall[IOCALL_INQUIRE], tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
*************** transfer_namelist_element (stmtblock_t *
*** 1299,1305 ****
      NML_ADD_ARG (convert (gfc_charlen_type_node, integer_zero_node));
  
    NML_ADD_ARG (dtype);
!   tmp = gfc_build_function_call (iocall[IOCALL_SET_NML_VAL], args);
    gfc_add_expr_to_block (block, tmp);
  
    /* If the object is an array, transfer rank times:
--- 1299,1305 ----
      NML_ADD_ARG (convert (gfc_charlen_type_node, integer_zero_node));
  
    NML_ADD_ARG (dtype);
!   tmp = build_function_call_expr (iocall[IOCALL_SET_NML_VAL], args);
    gfc_add_expr_to_block (block, tmp);
  
    /* If the object is an array, transfer rank times:
*************** transfer_namelist_element (stmtblock_t *
*** 1312,1318 ****
        NML_ADD_ARG (GFC_TYPE_ARRAY_STRIDE (dt, n_dim));
        NML_ADD_ARG (GFC_TYPE_ARRAY_LBOUND (dt, n_dim));
        NML_ADD_ARG (GFC_TYPE_ARRAY_UBOUND (dt, n_dim));
!       tmp = gfc_build_function_call (iocall[IOCALL_SET_NML_VAL_DIM], args);
        gfc_add_expr_to_block (block, tmp);
      }
  
--- 1312,1318 ----
        NML_ADD_ARG (GFC_TYPE_ARRAY_STRIDE (dt, n_dim));
        NML_ADD_ARG (GFC_TYPE_ARRAY_LBOUND (dt, n_dim));
        NML_ADD_ARG (GFC_TYPE_ARRAY_UBOUND (dt, n_dim));
!       tmp = build_function_call_expr (iocall[IOCALL_SET_NML_VAL_DIM], args);
        gfc_add_expr_to_block (block, tmp);
      }
  
*************** build_dt (tree function, gfc_code * code
*** 1467,1473 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
--- 1467,1473 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, var);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
    gfc_add_block_to_block (&block, &post_block);
*************** gfc_trans_dt_end (gfc_code * code)
*** 1546,1552 ****
  
    tmp = gfc_build_addr_expr (NULL_TREE, dt_parm);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = gfc_build_function_call (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
    gfc_add_block_to_block (&block, dt_post_end_block);
    gfc_init_block (dt_post_end_block);
--- 1546,1552 ----
  
    tmp = gfc_build_addr_expr (NULL_TREE, dt_parm);
    tmp = gfc_chainon_list (NULL_TREE, tmp);
!   tmp = build_function_call_expr (function, tmp);
    gfc_add_expr_to_block (&block, tmp);
    gfc_add_block_to_block (&block, dt_post_end_block);
    gfc_init_block (dt_post_end_block);
*************** transfer_expr (gfc_se * se, gfc_typespec
*** 1735,1741 ****
    args = gfc_chainon_list (args, addr_expr);
    args = gfc_chainon_list (args, arg2);
  
!   tmp = gfc_build_function_call (function, args);
    gfc_add_expr_to_block (&se->pre, tmp);
    gfc_add_block_to_block (&se->pre, &se->post);
  
--- 1735,1741 ----
    args = gfc_chainon_list (args, addr_expr);
    args = gfc_chainon_list (args, arg2);
  
!   tmp = build_function_call_expr (function, args);
    gfc_add_expr_to_block (&se->pre, tmp);
    gfc_add_block_to_block (&se->pre, &se->post);
  
*************** transfer_array_desc (gfc_se * se, gfc_ty
*** 1762,1768 ****
    args = gfc_chainon_list (args, addr_expr);
    args = gfc_chainon_list (args, kind_arg);
    args = gfc_chainon_list (args, charlen_arg);
!   tmp = gfc_build_function_call (iocall[IOCALL_X_ARRAY], args);
    gfc_add_expr_to_block (&se->pre, tmp);
    gfc_add_block_to_block (&se->pre, &se->post);
  }
--- 1762,1768 ----
    args = gfc_chainon_list (args, addr_expr);
    args = gfc_chainon_list (args, kind_arg);
    args = gfc_chainon_list (args, charlen_arg);
!   tmp = build_function_call_expr (iocall[IOCALL_X_ARRAY], args);
    gfc_add_expr_to_block (&se->pre, tmp);
    gfc_add_block_to_block (&se->pre, &se->post);
  }
Index: trans-stmt.c
===================================================================
*** trans-stmt.c	(revision 108411)
--- trans-stmt.c	(working copy)
*************** gfc_trans_pause (gfc_code * code)
*** 317,323 ****
        fndecl = gfor_fndecl_pause_string;
      }
  
!   tmp = gfc_build_function_call (fndecl, args);
    gfc_add_expr_to_block (&se.pre, tmp);
  
    gfc_add_block_to_block (&se.pre, &se.post);
--- 317,323 ----
        fndecl = gfor_fndecl_pause_string;
      }
  
!   tmp = build_function_call_expr (fndecl, args);
    gfc_add_expr_to_block (&se.pre, tmp);
  
    gfc_add_block_to_block (&se.pre, &se.post);
*************** gfc_trans_stop (gfc_code * code)
*** 357,363 ****
        fndecl = gfor_fndecl_stop_string;
      }
  
!   tmp = gfc_build_function_call (fndecl, args);
    gfc_add_expr_to_block (&se.pre, tmp);
  
    gfc_add_block_to_block (&se.pre, &se.post);
--- 357,363 ----
        fndecl = gfor_fndecl_stop_string;
      }
  
!   tmp = build_function_call_expr (fndecl, args);
    gfc_add_expr_to_block (&se.pre, tmp);
  
    gfc_add_block_to_block (&se.pre, &se.post);
*************** gfc_trans_character_select (gfc_code *co
*** 1283,1289 ****
  
    gfc_add_block_to_block (&block, &se.pre);
  
!   tmp = gfc_build_function_call (gfor_fndecl_select_string, args);
    tmp = build1 (GOTO_EXPR, void_type_node, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
--- 1283,1289 ----
  
    gfc_add_block_to_block (&block, &se.pre);
  
!   tmp = build_function_call_expr (gfor_fndecl_select_string, args);
    tmp = build1 (GOTO_EXPR, void_type_node, tmp);
    gfc_add_expr_to_block (&block, tmp);
  
*************** gfc_do_allocate (tree bytesize, tree siz
*** 1534,1540 ****
  	tmp = gfor_fndecl_internal_malloc64;
        else
  	gcc_unreachable ();
!       tmp = gfc_build_function_call (tmp, args);
        tmp = convert (TREE_TYPE (tmpvar), tmp);
        gfc_add_modify_expr (pblock, tmpvar, tmp);
      }
--- 1534,1540 ----
  	tmp = gfor_fndecl_internal_malloc64;
        else
  	gcc_unreachable ();
!       tmp = build_function_call_expr (tmp, args);
        tmp = convert (TREE_TYPE (tmpvar), tmp);
        gfc_add_modify_expr (pblock, tmpvar, tmp);
      }
*************** gfc_trans_assign_need_temp (gfc_expr * e
*** 2019,2025 ****
      {
        /* Free the temporary.  */
        tmp = gfc_chainon_list (NULL_TREE, ptemp1);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (block, tmp);
      }
  }
--- 2019,2025 ----
      {
        /* Free the temporary.  */
        tmp = gfc_chainon_list (NULL_TREE, ptemp1);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (block, tmp);
      }
  }
*************** gfc_trans_pointer_assign_need_temp (gfc_
*** 2177,2183 ****
    if (ptemp1)
      {
        tmp = gfc_chainon_list (NULL_TREE, ptemp1);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (block, tmp);
      }
  }
--- 2177,2183 ----
    if (ptemp1)
      {
        tmp = gfc_chainon_list (NULL_TREE, ptemp1);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (block, tmp);
      }
  }
*************** gfc_trans_forall_1 (gfc_code * code, for
*** 2468,2474 ****
  
                /* Free the temporary.  */
                args = gfc_chainon_list (NULL_TREE, temp->temporary);
!               tmp = gfc_build_function_call (gfor_fndecl_internal_free, args);
                gfc_add_expr_to_block (&block, tmp);
  
                p = temp;
--- 2468,2474 ----
  
                /* Free the temporary.  */
                args = gfc_chainon_list (NULL_TREE, temp->temporary);
!               tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
                gfc_add_expr_to_block (&block, tmp);
  
                p = temp;
*************** gfc_trans_forall_1 (gfc_code * code, for
*** 2524,2530 ****
      {
        /* Free the temporary for the mask.  */
        tmp = gfc_chainon_list (NULL_TREE, pmask);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&block, tmp);
      }
    if (maskindex)
--- 2524,2530 ----
      {
        /* Free the temporary for the mask.  */
        tmp = gfc_chainon_list (NULL_TREE, pmask);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, tmp);
        gfc_add_expr_to_block (&block, tmp);
      }
    if (maskindex)
*************** gfc_trans_where (gfc_code * code)
*** 3068,3074 ****
    while (temp)
      {
        args = gfc_chainon_list (NULL_TREE, temp->temporary);
!       tmp = gfc_build_function_call (gfor_fndecl_internal_free, args);
        gfc_add_expr_to_block (&block, tmp);
  
        p = temp;
--- 3068,3074 ----
    while (temp)
      {
        args = gfc_chainon_list (NULL_TREE, temp->temporary);
!       tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
        gfc_add_expr_to_block (&block, tmp);
  
        p = temp;
*************** gfc_trans_allocate (gfc_code * code)
*** 3185,3191 ****
  	  parm = gfc_chainon_list (NULL_TREE, val);
  	  parm = gfc_chainon_list (parm, tmp);
  	  parm = gfc_chainon_list (parm, pstat);
! 	  tmp = gfc_build_function_call (gfor_fndecl_allocate, parm);
  	  gfc_add_expr_to_block (&se.pre, tmp);
  
  	  if (code->expr)
--- 3185,3191 ----
  	  parm = gfc_chainon_list (NULL_TREE, val);
  	  parm = gfc_chainon_list (parm, tmp);
  	  parm = gfc_chainon_list (parm, pstat);
! 	  tmp = build_function_call_expr (gfor_fndecl_allocate, parm);
  	  gfc_add_expr_to_block (&se.pre, tmp);
  
  	  if (code->expr)
*************** gfc_trans_deallocate (gfc_code * code)
*** 3291,3297 ****
  
  	  parm = gfc_chainon_list (NULL_TREE, var);
  	  parm = gfc_chainon_list (parm, pstat);
! 	  tmp = gfc_build_function_call (gfor_fndecl_deallocate, parm);
  	}
  
        gfc_add_expr_to_block (&se.pre, tmp);
--- 3291,3297 ----
  
  	  parm = gfc_chainon_list (NULL_TREE, var);
  	  parm = gfc_chainon_list (parm, pstat);
! 	  tmp = build_function_call_expr (gfor_fndecl_deallocate, parm);
  	}
  
        gfc_add_expr_to_block (&se.pre, tmp);
Index: trans-intrinsic.c
===================================================================
*** trans-intrinsic.c	(revision 108411)
--- trans-intrinsic.c	(working copy)
*************** gfc_conv_intrinsic_aint (gfc_se * se, gf
*** 387,393 ****
    if (n != END_BUILTINS)
      {
        tmp = built_in_decls[n];
!       se->expr = gfc_build_function_call (tmp, arg);
        return;
      }
  
--- 387,393 ----
    if (n != END_BUILTINS)
      {
        tmp = built_in_decls[n];
!       se->expr = build_function_call_expr (tmp, arg);
        return;
      }
  
*************** gfc_conv_intrinsic_lib_function (gfc_se 
*** 641,647 ****
    /* Get the decl and generate the call.  */
    args = gfc_conv_intrinsic_function_args (se, expr);
    fndecl = gfc_get_intrinsic_lib_fndecl (m, expr);
!   se->expr = gfc_build_function_call (fndecl, args);
  }
  
  /* Generate code for EXPONENT(X) intrinsic function.  */
--- 641,647 ----
    /* Get the decl and generate the call.  */
    args = gfc_conv_intrinsic_function_args (se, expr);
    fndecl = gfc_get_intrinsic_lib_fndecl (m, expr);
!   se->expr = build_function_call_expr (fndecl, args);
  }
  
  /* Generate code for EXPONENT(X) intrinsic function.  */
*************** gfc_conv_intrinsic_exponent (gfc_se * se
*** 673,679 ****
        gcc_unreachable ();
      }
  
!   se->expr = gfc_build_function_call (fndecl, args);
  }
  
  /* Evaluate a single upper or lower bound.  */
--- 673,679 ----
        gcc_unreachable ();
      }
  
!   se->expr = build_function_call_expr (fndecl, args);
  }
  
  /* Evaluate a single upper or lower bound.  */
*************** gfc_conv_intrinsic_abs (gfc_se * se, gfc
*** 795,801 ****
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = fold (gfc_build_function_call (built_in_decls[n], args));
        break;
  
      default:
--- 795,801 ----
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = build_function_call_expr (built_in_decls[n], args);
        break;
  
      default:
*************** gfc_conv_intrinsic_sign (gfc_se * se, gf
*** 961,967 ****
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = fold (gfc_build_function_call (tmp, arg));
        return;
      }
  
--- 961,967 ----
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = build_function_call_expr (tmp, arg);
        return;
      }
  
*************** gfc_conv_intrinsic_ctime (gfc_se * se, g
*** 1057,1070 ****
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = gfc_build_function_call (gfor_fndecl_ctime, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = gfc_build_function_call (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
--- 1057,1070 ----
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = build_function_call_expr (gfor_fndecl_ctime, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = build_function_call_expr (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
*************** gfc_conv_intrinsic_fdate (gfc_se * se, g
*** 1093,1106 ****
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = gfc_build_function_call (gfor_fndecl_fdate, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = gfc_build_function_call (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
--- 1093,1106 ----
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = build_function_call_expr (gfor_fndecl_fdate, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = build_function_call_expr (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
*************** gfc_conv_intrinsic_ttynam (gfc_se * se, 
*** 1131,1144 ****
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = gfc_build_function_call (gfor_fndecl_ttynam, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = gfc_build_function_call (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
--- 1131,1144 ----
    arglist = gfc_chainon_list (arglist, gfc_build_addr_expr (NULL, len));
    arglist = chainon (arglist, tmp);
  
!   tmp = build_function_call_expr (gfor_fndecl_ttynam, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = build_function_call_expr (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
*************** gfc_conv_intrinsic_ishftc (gfc_se * se, 
*** 2039,2045 ****
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = gfc_build_function_call (tmp, arg);
        /* Convert the result back to the original type, if we extended
  	 the first argument's width above.  */
        if (expr->ts.kind < 4)
--- 2039,2045 ----
  	default:
  	  gcc_unreachable ();
  	}
!       se->expr = build_function_call_expr (tmp, arg);
        /* Convert the result back to the original type, if we extended
  	 the first argument's width above.  */
        if (expr->ts.kind < 4)
*************** gfc_conv_intrinsic_len_trim (gfc_se * se
*** 2129,2135 ****
  
    args = gfc_conv_intrinsic_function_args (se, expr);
    type = gfc_typenode_for_spec (&expr->ts);
!   se->expr = gfc_build_function_call (gfor_fndecl_string_len_trim, args);
    se->expr = convert (type, se->expr);
  }
  
--- 2129,2135 ----
  
    args = gfc_conv_intrinsic_function_args (se, expr);
    type = gfc_typenode_for_spec (&expr->ts);
!   se->expr = build_function_call_expr (gfor_fndecl_string_len_trim, args);
    se->expr = convert (type, se->expr);
  }
  
*************** gfc_conv_intrinsic_index (gfc_se * se, g
*** 2160,2166 ****
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = gfc_build_function_call (gfor_fndecl_string_index, args);
    se->expr = convert (type, se->expr);
  }
  
--- 2160,2166 ----
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = build_function_call_expr (gfor_fndecl_string_index, args);
    se->expr = convert (type, se->expr);
  }
  
*************** gfc_conv_intrinsic_size (gfc_se * se, gf
*** 2254,2260 ****
    else
      fndecl = gfor_fndecl_size0;
  
!   se->expr = gfc_build_function_call (fndecl, args);
    type = gfc_typenode_for_spec (&expr->ts);
    se->expr = convert (type, se->expr);
  }
--- 2254,2260 ----
    else
      fndecl = gfor_fndecl_size0;
  
!   se->expr = build_function_call_expr (fndecl, args);
    type = gfc_typenode_for_spec (&expr->ts);
    se->expr = convert (type, se->expr);
  }
*************** gfc_conv_intrinsic_strcmp (gfc_se * se, 
*** 2270,2276 ****
  
    args = gfc_conv_intrinsic_function_args (se, expr);
    /* Build a call for the comparison.  */
!   se->expr = gfc_build_function_call (gfor_fndecl_compare_string, args);
  
    type = gfc_typenode_for_spec (&expr->ts);
    se->expr = build2 (op, type, se->expr,
--- 2270,2276 ----
  
    args = gfc_conv_intrinsic_function_args (se, expr);
    /* Build a call for the comparison.  */
!   se->expr = build_function_call_expr (gfor_fndecl_compare_string, args);
  
    type = gfc_typenode_for_spec (&expr->ts);
    se->expr = build2 (op, type, se->expr,
*************** gfc_conv_intrinsic_adjust (gfc_se * se, 
*** 2294,2300 ****
    var = gfc_conv_string_tmp (se, type, len);
    args = tree_cons (NULL_TREE, var, args);
  
!   tmp = gfc_build_function_call (fndecl, args);
    gfc_add_expr_to_block (&se->pre, tmp);
    se->expr = var;
    se->string_length = len;
--- 2294,2300 ----
    var = gfc_conv_string_tmp (se, type, len);
    args = tree_cons (NULL_TREE, var, args);
  
!   tmp = build_function_call_expr (fndecl, args);
    gfc_add_expr_to_block (&se->pre, tmp);
    se->expr = var;
    se->string_length = len;
*************** gfc_conv_associated (gfc_se *se, gfc_exp
*** 2444,2450 ****
            gfc_add_block_to_block (&se->post, &arg2se.post);
            args = gfc_chainon_list (args, arg2se.expr);
            fndecl = gfor_fndecl_associated;
!           se->expr = gfc_build_function_call (fndecl, args);
          }
       }
    se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr);
--- 2444,2450 ----
            gfc_add_block_to_block (&se->post, &arg2se.post);
            args = gfc_chainon_list (args, arg2se.expr);
            fndecl = gfor_fndecl_associated;
!           se->expr = build_function_call_expr (fndecl, args);
          }
       }
    se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr);
*************** gfc_conv_intrinsic_scan (gfc_se * se, gf
*** 2477,2483 ****
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = gfc_build_function_call (gfor_fndecl_string_scan, args);
    se->expr = convert (type, se->expr);
  }
  
--- 2477,2483 ----
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = build_function_call_expr (gfor_fndecl_string_scan, args);
    se->expr = convert (type, se->expr);
  }
  
*************** gfc_conv_intrinsic_verify (gfc_se * se, 
*** 2510,2516 ****
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = gfc_build_function_call (gfor_fndecl_string_verify, args);
    se->expr = convert (type, se->expr);
  }
  
--- 2510,2516 ----
        TREE_VALUE (back) = convert (logical4_type_node, TREE_VALUE (back));
      }
  
!   se->expr = build_function_call_expr (gfor_fndecl_string_verify, args);
    se->expr = convert (type, se->expr);
  }
  
*************** call_builtin_clz (tree result_type, tree
*** 2601,2607 ****
      gcc_unreachable ();
  
    parms = tree_cons (NULL, op0, NULL);
!   call = gfc_build_function_call (fn, parms);
  
    return convert (result_type, call);
  }
--- 2601,2607 ----
      gcc_unreachable ();
  
    parms = tree_cons (NULL, op0, NULL);
!   call = build_function_call_expr (fn, parms);
  
    return convert (result_type, call);
  }
*************** gfc_conv_intrinsic_si_kind (gfc_se * se,
*** 2723,2729 ****
    args = TREE_VALUE (args);
    args = gfc_build_addr_expr (NULL, args);
    args = tree_cons (NULL_TREE, args, NULL_TREE);
!   se->expr = gfc_build_function_call (gfor_fndecl_si_kind, args);
  }
  
  /* Generate code for SELECTED_REAL_KIND (P, R) intrinsic function.  */
--- 2723,2729 ----
    args = TREE_VALUE (args);
    args = gfc_build_addr_expr (NULL, args);
    args = tree_cons (NULL_TREE, args, NULL_TREE);
!   se->expr = build_function_call_expr (gfor_fndecl_si_kind, args);
  }
  
  /* Generate code for SELECTED_REAL_KIND (P, R) intrinsic function.  */
*************** gfc_conv_intrinsic_sr_kind (gfc_se * se,
*** 2750,2756 ****
        gfc_add_block_to_block (&se->post, &argse.post);
        args = gfc_chainon_list (args, argse.expr);
      }
!   se->expr = gfc_build_function_call (gfor_fndecl_sr_kind, args);
  }
  
  
--- 2750,2756 ----
        gfc_add_block_to_block (&se->post, &argse.post);
        args = gfc_chainon_list (args, argse.expr);
      }
!   se->expr = build_function_call_expr (gfor_fndecl_sr_kind, args);
  }
  
  
*************** gfc_conv_intrinsic_trim (gfc_se * se, gf
*** 2780,2793 ****
    arglist = gfc_chainon_list (arglist, addr);
    arglist = chainon (arglist, tmp);
  
!   tmp = gfc_build_function_call (gfor_fndecl_string_trim, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = gfc_build_function_call (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
--- 2780,2793 ----
    arglist = gfc_chainon_list (arglist, addr);
    arglist = chainon (arglist, tmp);
  
!   tmp = build_function_call_expr (gfor_fndecl_string_trim, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    /* Free the temporary afterwards, if necessary.  */
    cond = build2 (GT_EXPR, boolean_type_node, len,
  		 build_int_cst (TREE_TYPE (len), 0));
    arglist = gfc_chainon_list (NULL_TREE, var);
!   tmp = build_function_call_expr (gfor_fndecl_internal_free, arglist);
    tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
    gfc_add_expr_to_block (&se->post, tmp);
  
*************** gfc_conv_intrinsic_repeat (gfc_se * se, 
*** 2821,2827 ****
    arglist = NULL_TREE;
    arglist = gfc_chainon_list (arglist, var);
    arglist = chainon (arglist, args);
!   tmp = gfc_build_function_call (gfor_fndecl_string_repeat, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    se->expr = var;
--- 2821,2827 ----
    arglist = NULL_TREE;
    arglist = gfc_chainon_list (arglist, var);
    arglist = chainon (arglist, args);
!   tmp = build_function_call_expr (gfor_fndecl_string_repeat, arglist);
    gfc_add_expr_to_block (&se->pre, tmp);
  
    se->expr = var;
*************** gfc_conv_intrinsic_iargc (gfc_se * se, g
*** 2840,2846 ****
  
    /* Call the library function.  This always returns an INTEGER(4).  */
    fndecl = gfor_fndecl_iargc;
!   tmp = gfc_build_function_call (fndecl, NULL_TREE);
  
    /* Convert it to the required type.  */
    type = gfc_typenode_for_spec (&expr->ts);
--- 2840,2846 ----
  
    /* Call the library function.  This always returns an INTEGER(4).  */
    fndecl = gfor_fndecl_iargc;
!   tmp = build_function_call_expr (fndecl, NULL_TREE);
  
    /* Convert it to the required type.  */
    type = gfc_typenode_for_spec (&expr->ts);
Index: trans.c
===================================================================
*** trans.c	(revision 108411)
--- trans.c	(working copy)
*************** gfc_build_array_ref (tree base, tree off
*** 314,337 ****
  }
  
  
- /* Given a function declaration FNDECL and an argument list ARGLIST,
-    build a CALL_EXPR.  */
- 
- tree
- gfc_build_function_call (tree fndecl, tree arglist)
- {
-   tree fn;
-   tree call;
- 
-   fn = gfc_build_addr_expr (NULL, fndecl);
-   call = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fndecl)), 
- 		 fn, arglist, NULL);
-   TREE_SIDE_EFFECTS (call) = 1;
- 
-   return call;
- }
- 
- 
  /* Generate a runtime error if COND is true.  */
  
  void
--- 314,319 ----
*************** gfc_trans_runtime_check (tree cond, tree
*** 363,369 ****
    tmp = build_int_cst (NULL_TREE, input_line);
    args = gfc_chainon_list (args, tmp);
  
!   tmp = gfc_build_function_call (gfor_fndecl_runtime_error, args);
    gfc_add_expr_to_block (&block, tmp);
  
    body = gfc_finish_block (&block);
--- 345,351 ----
    tmp = build_int_cst (NULL_TREE, input_line);
    args = gfc_chainon_list (args, tmp);
  
!   tmp = build_function_call_expr (gfor_fndecl_runtime_error, args);
    gfc_add_expr_to_block (&block, tmp);
  
    body = gfc_finish_block (&block);
*************** gfc_trans_runtime_check (tree cond, tree
*** 377,383 ****
        /* Tell the compiler that this isn't likely.  */
        tmp = gfc_chainon_list (NULL_TREE, cond);
        tmp = gfc_chainon_list (tmp, integer_zero_node);
!       cond = gfc_build_function_call (built_in_decls[BUILT_IN_EXPECT], tmp);
  
        tmp = build3_v (COND_EXPR, cond, body, build_empty_stmt ());
        gfc_add_expr_to_block (pblock, tmp);
--- 359,365 ----
        /* Tell the compiler that this isn't likely.  */
        tmp = gfc_chainon_list (NULL_TREE, cond);
        tmp = gfc_chainon_list (tmp, integer_zero_node);
!       cond = build_function_call_expr (built_in_decls[BUILT_IN_EXPECT], tmp);
  
        tmp = build3_v (COND_EXPR, cond, body, build_empty_stmt ());
        gfc_add_expr_to_block (pblock, tmp);
Index: trans.h
===================================================================
*** trans.h	(revision 108411)
--- trans.h	(working copy)
*************** tree gfc_get_extern_function_decl (gfc_s
*** 345,353 ****
  /* Return the decl for a function.  */
  tree gfc_get_function_decl (gfc_symbol *);
  
- /* Build a CALL_EXPR.  */
- tree gfc_build_function_call (tree, tree);
- 
  /* Build an ADDR_EXPR.  */
  tree gfc_build_addr_expr (tree, tree);
  
--- 345,350 ----



More information about the Gcc-patches mailing list