===================================================================
@@ -2184,7 +2184,7 @@ expand_assign_tm (struct tm_region *regi
/* ??? Figure out if there's any possible overlap between the LHS
and the RHS and if not, use MEMCPY. */
- if (load_p && is_gimple_non_addressable (lhs))
+ if (load_p && is_gimple_reg (lhs))
{
tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
lhs_addr = build_fold_addr_expr (tmp);
===================================================================
@@ -4411,16 +4411,27 @@ gimplify_modify_expr_rhs (tree *expr_p,
/* It's OK to use the target directly if it's being
initialized. */
use_target = true;
- else if (!is_gimple_non_addressable (*to_p))
- /* Don't use the original target if it's already addressable;
- if its address escapes, and the called function uses the
- NRV optimization, a conforming program could see *to_p
- change before the called function returns; see c++/19317.
- When optimizing, the return_slot pass marks more functions
- as safe after we have escape info. */
- use_target = false;
else
- use_target = true;
+ {
+ tree t;
+
+ if (TREE_CODE (*to_p) == SSA_NAME)
+ t = SSA_NAME_VAR (*to_p);
+ else
+ t = *to_p;
+ if (!is_gimple_variable (t) || needs_to_live_in_memory (t))
+ /* Don't use the original target if it's already
+ addressable; if its address escapes, and the
+ called function uses the NRV optimization, a
+ conforming program could see *to_p change
+ before the called function returns; see
+ c++/19317. When optimizing, the return_slot
+ pass marks more functions as safe after we have
+ escape info. */
+ use_target = false;
+ else
+ use_target = true;
+ }
if (use_target)
{
===================================================================
@@ -2963,17 +2963,6 @@ is_gimple_reg (tree t)
}
-/* Return true if T is a GIMPLE variable whose address is not needed. */
-
-bool
-is_gimple_non_addressable (tree t)
-{
- if (TREE_CODE (t) == SSA_NAME)
- t = SSA_NAME_VAR (t);
-
- return (is_gimple_variable (t) && ! needs_to_live_in_memory (t));
-}
-
/* Return true if T is a GIMPLE rvalue, i.e. an identifier or a constant. */
bool
===================================================================
@@ -1006,9 +1006,6 @@ extern bool is_gimple_mem_rhs (tree);
/* Returns true iff T is a valid if-statement condition. */
extern bool is_gimple_condexpr (tree);
-/* Returns true iff T is a variable that does not need to live in memory. */
-extern bool is_gimple_non_addressable (tree t);
-
/* Returns true iff T is a valid call address expression. */
extern bool is_gimple_call_addr (tree);