+2018-04-13 Martin Liska <mliska@suse.cz>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/81657
+ * expr.h (enum block_op_methods): Add BLOCK_OP_NO_LIBCALL_RET.
+ * expr.c (emit_block_move_hints): Handle BLOCK_OP_NO_LIBCALL_RET.
+ * builtins.c (expand_builtin_memory_copy_args): Use
+ BLOCK_OP_NO_LIBCALL_RET method for mempcpy with non-ignored target,
+ handle dest_addr == pc_rtx.
+
2018-04-12 Segher Boessenkool <segher@kernel.crashing.org>
PR target/85291
set_mem_align (src_mem, src_align);
/* Copy word part most expediently. */
- dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx,
- CALL_EXPR_TAILCALL (exp)
- && (endp == 0 || target == const0_rtx)
- ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
+ enum block_op_methods method = BLOCK_OP_NORMAL;
+ if (CALL_EXPR_TAILCALL (exp) && (endp == 0 || target == const0_rtx))
+ method = BLOCK_OP_TAILCALL;
+ if (endp == 1 && target != const0_rtx)
+ method = BLOCK_OP_NO_LIBCALL_RET;
+ dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx, method,
expected_align, expected_size,
min_size, max_size, probable_max_size);
+ if (dest_addr == pc_rtx)
+ return NULL_RTX;
if (dest_addr == 0)
{
unsigned HOST_WIDE_INT max_size,
unsigned HOST_WIDE_INT probable_max_size)
{
- bool may_use_call;
+ int may_use_call;
rtx retval = 0;
unsigned int align;
{
case BLOCK_OP_NORMAL:
case BLOCK_OP_TAILCALL:
- may_use_call = true;
+ may_use_call = 1;
break;
case BLOCK_OP_CALL_PARM:
break;
case BLOCK_OP_NO_LIBCALL:
- may_use_call = false;
+ may_use_call = 0;
+ break;
+
+ case BLOCK_OP_NO_LIBCALL_RET:
+ may_use_call = -1;
break;
default:
&& ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (x))
&& ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (y)))
{
+ if (may_use_call < 0)
+ return pc_rtx;
+
/* Since x and y are passed to a libcall, mark the corresponding
tree EXPR as addressable. */
tree y_expr = MEM_EXPR (y);
BLOCK_OP_NO_LIBCALL,
BLOCK_OP_CALL_PARM,
/* Like BLOCK_OP_NORMAL, but the libcall can be tail call optimized. */
- BLOCK_OP_TAILCALL
+ BLOCK_OP_TAILCALL,
+ /* Like BLOCK_OP_NO_LIBCALL, but instead of emitting a libcall return
+ pc_rtx to indicate nothing has been emitted and let the caller handle
+ it. */
+ BLOCK_OP_NO_LIBCALL_RET
};
typedef rtx (*by_pieces_constfn) (void *, HOST_WIDE_INT, scalar_int_mode);
+2018-04-13 Martin Liska <mliska@suse.cz>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/81657
+ * gcc.dg/string-opt-1.c: Remove bogus comment. Expect a mempcpy
+ call.
+
2018-04-12 David Malcolm <dmalcolm@redhat.com>
PR c++/85385
-/* Ensure mempcpy is "optimized" into memcpy followed by addition. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
return 0;
}
-/* { dg-final { scan-assembler-not "\<mempcpy\>" } } */
+/* { dg-final { scan-assembler "mempcpy" } } */
/* { dg-final { scan-assembler "memcpy" } } */