This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH]: CALL_EXPR should set TREE_SIDE_EFFECTS


Hi,
this one sets TREE_SIDE_EFFECTS only for calls to non (pure|const) functions.

booted & tested on i686-pc-linux-gnu, ok?

nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::     CodeSourcery LLC
         The voices in my head said this was stupid too
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk

2003-08-21  Nathan Sidwell  <nathan@codesourcery.com>

	* builtins.c (build_function_call_expr): Don't set
	TREE_SIDE_EFFECTS here.
	* expr.c (emit_block_move_via_libcall): Likewise.
	(clear_storage_via_libcall): Likewise.
	* tree.c (build): Set TREE_SIDE_EFFECTS for non-const, non-pure
	CALL_EXPRs.

2003-08-21  Nathan Sidwell  <nathan@codesourcery.com>

	* call.c (build_call): Don't set TREE_SIDE_EFFECTS here.
	(build_new_method_call): Add goto finish.
	* semantics.c (simplify_aggr_init_exprs_r): Don't set
	TREE_SIDE_EFFECTS on a call.

Index: builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.240
diff -c -3 -p -r1.240 builtins.c
*** builtins.c	20 Aug 2003 19:27:49 -0000	1.240
--- builtins.c	25 Aug 2003 11:29:04 -0000
*************** build_function_call_expr (tree fn, tree 
*** 6198,6204 ****
    call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
    call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
  		     call_expr, arglist);
-   TREE_SIDE_EFFECTS (call_expr) = 1;
    return fold (call_expr);
  }
  
--- 6198,6203 ----
Index: expr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/expr.c,v
retrieving revision 1.577
diff -c -3 -p -r1.577 expr.c
*** expr.c	19 Aug 2003 23:21:57 -0000	1.577
--- expr.c	25 Aug 2003 11:29:27 -0000
*************** emit_block_move_via_libcall (rtx dst, rt
*** 1997,2003 ****
    call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
    call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
  		     call_expr, arg_list, NULL_TREE);
-   TREE_SIDE_EFFECTS (call_expr) = 1;
  
    retval = expand_expr (call_expr, NULL_RTX, VOIDmode, 0);
  
--- 1997,2002 ----
*************** clear_storage_via_libcall (rtx object, r
*** 3111,3117 ****
    call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
    call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
  		     call_expr, arg_list, NULL_TREE);
-   TREE_SIDE_EFFECTS (call_expr) = 1;
  
    retval = expand_expr (call_expr, NULL_RTX, VOIDmode, 0);
  
--- 3110,3115 ----
Index: tree.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.c,v
retrieving revision 1.325
diff -c -3 -p -r1.325 tree.c
*** tree.c	20 Aug 2003 21:46:46 -0000	1.325
--- tree.c	25 Aug 2003 11:29:53 -0000
*************** build (enum tree_code code, tree tt, ...
*** 2334,2339 ****
--- 2334,2354 ----
  	    TREE_READONLY (t) = 0;
  	  if (!TREE_CONSTANT (arg0))
  	    constant = 0;
+ 	  if (code == CALL_EXPR)
+ 	    {
+ 	      /* Calls have side-effects, except those to const or
+ 		 pure functions.  */
+ 	      if (TREE_CODE (arg0) != ADDR_EXPR)
+ 		TREE_SIDE_EFFECTS (t) = 1;
+ 	      else
+ 		{
+ 		  tree fn = TREE_OPERAND (arg0, 0);
+ 
+ 		  if (TREE_CODE (fn) != FUNCTION_DECL
+ 		      || (!DECL_IS_PURE (fn) && !TREE_READONLY (fn)))
+ 		    TREE_SIDE_EFFECTS (t) = 1;
+ 		}
+ 	    }
  	}
  
        if (arg1 && fro > 1)
Index: cp/call.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/call.c,v
retrieving revision 1.422
diff -c -3 -p -r1.422 call.c
*** cp/call.c	21 Aug 2003 17:44:15 -0000	1.422
--- cp/call.c	25 Aug 2003 11:31:05 -0000
*************** build_call (tree function, tree parms)
*** 303,312 ****
  				    TREE_VALUE (tmp), t);
  	}
  
!   function = build_nt (CALL_EXPR, function, parms, NULL_TREE);
    TREE_HAS_CONSTRUCTOR (function) = is_constructor;
-   TREE_TYPE (function) = result_type;
-   TREE_SIDE_EFFECTS (function) = 1;
    TREE_NOTHROW (function) = nothrow;
    
    return function;
--- 303,310 ----
  				    TREE_VALUE (tmp), t);
  	}
  
!   function = build (CALL_EXPR, result_type, function, parms);
    TREE_HAS_CONSTRUCTOR (function) = is_constructor;
    TREE_NOTHROW (function) = nothrow;
    
    return function;
*************** build_new_method_call (tree instance, tr
*** 4912,4918 ****
      {
        call = build_field_call (instance_ptr, fns, args);
        if (call)
! 	return call;
        error ("call to non-function `%D'", fns);
        return error_mark_node;
      }
--- 4910,4916 ----
      {
        call = build_field_call (instance_ptr, fns, args);
        if (call)
! 	goto finish;
        error ("call to non-function `%D'", fns);
        return error_mark_node;
      }
*************** build_new_method_call (tree instance, tr
*** 5073,5085 ****
        if (!is_dummy_object (instance_ptr) && TREE_SIDE_EFFECTS (instance))
  	call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call);
      }
! 
    if (processing_template_decl && call != error_mark_node)
!     return build_min (CALL_EXPR,
! 		      TREE_TYPE (call),
! 		      build_min_nt (COMPONENT_REF,
! 				    orig_instance, 
! 				    orig_fns),
  		      orig_args);
    return call;
  }
--- 5071,5081 ----
        if (!is_dummy_object (instance_ptr) && TREE_SIDE_EFFECTS (instance))
  	call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call);
      }
!  finish:;
!   
    if (processing_template_decl && call != error_mark_node)
!     return build_min (CALL_EXPR, TREE_TYPE (call),
! 		      build_min_nt (COMPONENT_REF, orig_instance, orig_fns),
  		      orig_args);
    return call;
  }
Index: cp/semantics.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/semantics.c,v
retrieving revision 1.350
diff -c -3 -p -r1.350 semantics.c
*** cp/semantics.c	21 Aug 2003 03:20:54 -0000	1.350
--- cp/semantics.c	25 Aug 2003 11:31:12 -0000
*************** simplify_aggr_init_expr (tree *tp)
*** 2796,2802 ****
    call_expr = build (CALL_EXPR, 
  		     TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
  		     fn, args, NULL_TREE);
-   TREE_SIDE_EFFECTS (call_expr) = 1;
  
    if (style == arg)
      /* Tell the backend that we've added our return slot to the argument
--- 2796,2801 ----
// { dg-do compile }
// { dg-options "-Wall" }

// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 25 Aug 2003 <nathan@codesourcery.com>

int f () __attribute__ ((const));
int g () __attribute__ ((pure));
int h ();

void foo ()
{
  h ();
  f (); // { dg-warning "no effect" "" }
  g (); // { dg-warning "no effect" "" }
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]