[PATCH] MEM = "abcd" expansion improvements
Richard Guenther
richard.guenther@gmail.com
Tue Oct 12 10:10:00 GMT 2010
On Mon, Oct 11, 2010 at 10:41 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> This patch slightly cleans up MEM = STRING_CST and MEM = MEM_REF<&STRING_CST, 0>
> expansion by sharing the code for STRING_CST and MEM_REF<&STRING_CST, 0>
> and allows it even for non-BLKmode mode - e.g. for "abcd" the mode
> is SImode, but as long as target is MEM it is desirable to optimize it
> using store_by_pieces.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok.
Thanks,
Richard.
> 2010-10-11 Jakub Jelinek <jakub@redhat.com>
>
> * expr.c (store_expr): Share code for STRING_CST and
> MEM_REF of &STRING_CST cases. Don't require BLKmode, instead
> check if target is a MEM.
>
> --- gcc/expr.c.jj 2010-10-11 07:51:09.000000000 +0200
> +++ gcc/expr.c 2010-10-11 13:46:05.000000000 +0200
> @@ -4636,62 +4636,26 @@ store_expr (tree exp, rtx target, int ca
>
> return NULL_RTX;
> }
> - else if (TREE_CODE (exp) == STRING_CST
> + else if ((TREE_CODE (exp) == STRING_CST
> + || (TREE_CODE (exp) == MEM_REF
> + && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
> + && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
> + == STRING_CST
> + && integer_zerop (TREE_OPERAND (exp, 1))))
> && !nontemporal && !call_param_p
> - && TREE_STRING_LENGTH (exp) > 0
> - && TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
> + && MEM_P (target))
> {
> /* Optimize initialization of an array with a STRING_CST. */
> HOST_WIDE_INT exp_len, str_copy_len;
> rtx dest_mem;
> + tree str = TREE_CODE (exp) == STRING_CST
> + ? exp : TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
>
> exp_len = int_expr_size (exp);
> if (exp_len <= 0)
> goto normal_expr;
>
> - str_copy_len = strlen (TREE_STRING_POINTER (exp));
> - if (str_copy_len < TREE_STRING_LENGTH (exp) - 1)
> - goto normal_expr;
> -
> - str_copy_len = TREE_STRING_LENGTH (exp);
> - if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
> - {
> - str_copy_len += STORE_MAX_PIECES - 1;
> - str_copy_len &= ~(STORE_MAX_PIECES - 1);
> - }
> - str_copy_len = MIN (str_copy_len, exp_len);
> - if (!can_store_by_pieces (str_copy_len, builtin_strncpy_read_str,
> - CONST_CAST(char *, TREE_STRING_POINTER (exp)),
> - MEM_ALIGN (target), false))
> - goto normal_expr;
> -
> - dest_mem = target;
> -
> - dest_mem = store_by_pieces (dest_mem,
> - str_copy_len, builtin_strncpy_read_str,
> - CONST_CAST(char *, TREE_STRING_POINTER (exp)),
> - MEM_ALIGN (target), false,
> - exp_len > str_copy_len ? 1 : 0);
> - if (exp_len > str_copy_len)
> - clear_storage (adjust_address (dest_mem, BLKmode, 0),
> - GEN_INT (exp_len - str_copy_len),
> - BLOCK_OP_NORMAL);
> - return NULL_RTX;
> - }
> - else if (TREE_CODE (exp) == MEM_REF
> - && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
> - && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == STRING_CST
> - && integer_zerop (TREE_OPERAND (exp, 1))
> - && !nontemporal && !call_param_p
> - && TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
> - {
> - /* Optimize initialization of an array with a STRING_CST. */
> - HOST_WIDE_INT exp_len, str_copy_len;
> - rtx dest_mem;
> - tree str = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
> -
> - exp_len = int_expr_size (exp);
> - if (exp_len <= 0)
> + if (TREE_STRING_LENGTH (str) <= 0)
> goto normal_expr;
>
> str_copy_len = strlen (TREE_STRING_POINTER (str));
> @@ -4699,14 +4663,15 @@ store_expr (tree exp, rtx target, int ca
> goto normal_expr;
>
> str_copy_len = TREE_STRING_LENGTH (str);
> - if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
> + if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0
> + && TREE_STRING_POINTER (str)[TREE_STRING_LENGTH (str) - 1] == '\0')
> {
> str_copy_len += STORE_MAX_PIECES - 1;
> str_copy_len &= ~(STORE_MAX_PIECES - 1);
> }
> str_copy_len = MIN (str_copy_len, exp_len);
> if (!can_store_by_pieces (str_copy_len, builtin_strncpy_read_str,
> - CONST_CAST(char *, TREE_STRING_POINTER (str)),
> + CONST_CAST (char *, TREE_STRING_POINTER (str)),
> MEM_ALIGN (target), false))
> goto normal_expr;
>
> @@ -4714,7 +4679,8 @@ store_expr (tree exp, rtx target, int ca
>
> dest_mem = store_by_pieces (dest_mem,
> str_copy_len, builtin_strncpy_read_str,
> - CONST_CAST(char *, TREE_STRING_POINTER (str)),
> + CONST_CAST (char *,
> + TREE_STRING_POINTER (str)),
> MEM_ALIGN (target), false,
> exp_len > str_copy_len ? 1 : 0);
> if (exp_len > str_copy_len)
>
> Jakub
>
More information about the Gcc-patches
mailing list