I noticed that we fail to fold the source to a constant if possible. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2016-06-10 Richard Biener <rguent...@suse.de> * gimple-fold.c (gimple_fold_builtin_memory_op): Make sure to fold the RHS to a constant if possible. Index: gcc/gimple-fold.c =================================================================== *** gcc/gimple-fold.c (revision 237286) --- gcc/gimple-fold.c (working copy) *************** gimple_fold_builtin_memory_op (gimple_st *** 1020,1033 **** gimple *new_stmt; if (is_gimple_reg_type (TREE_TYPE (srcvar))) { ! new_stmt = gimple_build_assign (NULL_TREE, srcvar); ! if (gimple_in_ssa_p (cfun)) ! srcvar = make_ssa_name (TREE_TYPE (srcvar), new_stmt); ! else ! srcvar = create_tmp_reg (TREE_TYPE (srcvar)); ! gimple_assign_set_lhs (new_stmt, srcvar); ! gimple_set_vuse (new_stmt, gimple_vuse (stmt)); ! gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); } new_stmt = gimple_build_assign (destvar, srcvar); gimple_set_vuse (new_stmt, gimple_vuse (stmt)); --- 1020,1039 ---- gimple *new_stmt; if (is_gimple_reg_type (TREE_TYPE (srcvar))) { ! tree tem = fold_const_aggregate_ref (srcvar); ! if (tem) ! srcvar = tem; ! if (! is_gimple_min_invariant (srcvar)) ! { ! new_stmt = gimple_build_assign (NULL_TREE, srcvar); ! if (gimple_in_ssa_p (cfun)) ! srcvar = make_ssa_name (TREE_TYPE (srcvar), new_stmt); ! else ! srcvar = create_tmp_reg (TREE_TYPE (srcvar)); ! gimple_assign_set_lhs (new_stmt, srcvar); ! gimple_set_vuse (new_stmt, gimple_vuse (stmt)); ! gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT); ! } } new_stmt = gimple_build_assign (destvar, srcvar); gimple_set_vuse (new_stmt, gimple_vuse (stmt));