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))

Reply via email to