|| is_gimple_min_invariant (rvalue)
|| TYPE_VOLATILE (TREE_TYPE (rvalue)))
return;
+
+ /* `return <retval>;` is already the best it could be.
+ Likewise `return *<retval>_N(D)`. */
+ if (TREE_CODE (rvalue) == RESULT_DECL
+ || (TREE_CODE (rvalue) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (rvalue, 0)) == SSA_NAME
+ && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (rvalue, 0)))
+ == RESULT_DECL))
+ return;
tree newsrc = new_src_based_on_copy (rvalue, dest, src);
if (!newsrc)
return;
- /* Currently only support decls, could support VCEs too? */
- if (!DECL_P (newsrc))
+ /* Currently only support non-global vars.
+ See PR 124099 on enumtls not supporting expanding for GIMPLE_RETURN.
+ FIXME: could support VCEs too? */
+ if (!VAR_P (newsrc) || is_global_var (newsrc))
return;
if (dump_file && (dump_flags & TDF_DETAILS))
{