aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2018-06-25 20:44:15 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2018-06-25 20:44:15 +0300
commit21925ac173495dad58a5ed0293ceb0203f849a51 (patch)
tree25b3a681fd1312bb19653cc5cb8ca07617b43932
parent3685dcd7fb618b8dc7c7352a76a55efa959aae84 (diff)
downloadgcc-21925ac173495dad58a5ed0293ceb0203f849a51.zip
gcc-21925ac173495dad58a5ed0293ceb0203f849a51.tar.gz
gcc-21925ac173495dad58a5ed0293ceb0203f849a51.tar.bz2
gcc_qsort: avoid overlapping memcpy (PR 86311)
PR middle-end/86311 * sort.cc (REORDER_23): Avoid memcpy with same destination and source. (REORDER_45): Likewise. From-SVN: r262092
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/sort.cc4
2 files changed, 8 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ceec833..a837cae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-25 Alexander Monakov <amonakov@ispras.ru>
+
+ PR middle-end/86311
+ * sort.cc (REORDER_23): Avoid memcpy with same destination and source.
+ (REORDER_45): Likewise.
+
2018-06-25 Jeff Law <law@redhat.com>
* config/v850/v850.md (divmodhi4): Make sure to sign extend the
diff --git a/gcc/sort.cc b/gcc/sort.cc
index a48a477..293e205 100644
--- a/gcc/sort.cc
+++ b/gcc/sort.cc
@@ -69,7 +69,7 @@ do { \
memcpy (&t1, e1 + OFFSET, sizeof (TYPE)); \
char *out = c->out + OFFSET; \
if (likely (c->n == 3)) \
- memcpy (out + 2*STRIDE, e2 + OFFSET, sizeof (TYPE)); \
+ memmove (out + 2*STRIDE, e2 + OFFSET, sizeof (TYPE));\
memcpy (out, &t0, sizeof (TYPE)); out += STRIDE; \
memcpy (out, &t1, sizeof (TYPE)); \
} while (0)
@@ -101,7 +101,7 @@ do { \
memcpy (&t3, e3 + OFFSET, sizeof (TYPE)); \
char *out = c->out + OFFSET; \
if (likely (c->n == 5)) \
- memcpy (out + 4*STRIDE, e4 + OFFSET, sizeof (TYPE)); \
+ memmove (out + 4*STRIDE, e4 + OFFSET, sizeof (TYPE));\
memcpy (out, &t0, sizeof (TYPE)); out += STRIDE; \
memcpy (out, &t1, sizeof (TYPE)); out += STRIDE; \
memcpy (out, &t2, sizeof (TYPE)); out += STRIDE; \