http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58981
--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> --- The bug is in *count = expand_simple_binop (GET_MODE (*count), PLUS, *count, saveddest, *count, 1, OPTAB_DIRECT); (gdb) call debug_rtx (saveddest) (reg:SI 101) (gdb) call debug_rtx (*count) (reg:DI 100) (gdb) Add SImode address to DImode count to update count leads to count overflow. Instead, we should use mode of address here: diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 902e169..b27bfb6 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -23139,7 +23139,7 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src if (!issetmem) *srcptr = expand_simple_binop (GET_MODE (*srcptr), MINUS, *srcptr, saveddest, *srcptr, 1, OPTAB_DIRECT); - *count = expand_simple_binop (GET_MODE (*count), PLUS, *count, + *count = expand_simple_binop (GET_MODE (saveddest), PLUS, *count, saveddest, *count, 1, OPTAB_DIRECT); /* We copied at most size + prolog_size. */ if (*min_size > (unsigned HOST_WIDE_INT)(size + prolog_size))