Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-nrv.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/tree-nrv.c Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/tree-nrv.c Mon May 24 12:47:05 2010 +0900 @@ -1,5 +1,6 @@ /* Language independent return value optimizations - Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -22,16 +23,18 @@ #include "coretypes.h" #include "tm.h" #include "tree.h" -#include "rtl.h" #include "function.h" #include "basic-block.h" -#include "expr.h" #include "diagnostic.h" +#include "tree-pretty-print.h" #include "tree-flow.h" #include "timevar.h" #include "tree-dump.h" #include "tree-pass.h" #include "langhooks.h" +#include "flags.h" /* For "optimize" in gate_pass_return_slot. + FIXME: That should be up to the pass manager, + but pass_nrv is not in pass_all_optimizations. */ /* This file implements return value optimizations for functions which return aggregate types. @@ -291,23 +294,21 @@ optimization, where DEST is expected to be the LHS of a modify expression where the RHS is a function returning an aggregate. - We search for a base VAR_DECL and look to see if it is call clobbered. - Note that we could do better, for example, by - attempting to doing points-to analysis on INDIRECT_REFs. */ + DEST is available if it is not clobbered by the call. */ static bool -dest_safe_for_nrv_p (tree dest) +dest_safe_for_nrv_p (gimple call) { - while (handled_component_p (dest)) - dest = TREE_OPERAND (dest, 0); + tree dest = gimple_call_lhs (call); - if (! SSA_VAR_P (dest)) + dest = get_base_address (dest); + if (! dest) return false; if (TREE_CODE (dest) == SSA_NAME) - dest = SSA_NAME_VAR (dest); + return true; - if (is_call_used (dest)) + if (call_may_clobber_ref_p (call, dest)) return false; return true; @@ -346,8 +347,8 @@ ) { /* Check if the location being assigned to is - call-clobbered. */ - slot_opt_p = dest_safe_for_nrv_p (gimple_call_lhs (stmt)); + clobbered by the call. */ + slot_opt_p = dest_safe_for_nrv_p (stmt); gimple_call_set_return_slot_opt (stmt, slot_opt_p); } }