re PR target/59605 (error: wrong number of branch edges after unconditional jump...
authorH.J. Lu <hongjiu.lu@intel.com>
Mon, 30 Dec 2013 08:48:25 +0000 (08:48 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 30 Dec 2013 08:48:25 +0000 (09:48 +0100)
PR target/59605
* config/i386/i386.c (ix86_expand_set_or_movmem): Create
jump_around_label only if it doesn't exist.

* gcc.dg/pr59605.c: New test.

From-SVN: r206242

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr59605.c [new file with mode: 0644]

index 5834df2d7c3ee8a33aa62122b5e252efd8afc2ad..290a978f8bdeddba8204bae185cb9961c8428340 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-30   H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/59605
+       * config/i386/i386.c (ix86_expand_set_or_movmem): Create
+       jump_around_label only if it doesn't exist.
+
 2013-12-28  Eric Botcazou  <ebotcazou@adacore.com>
 
        * doc/invoke.texi (output file options): Document -fada-spec-parent.
index 2fc9b802993ad9d7b3d7b3774f5ccea4a166ddf5..6e6b2617f92e6cd0e28abae5f27470b8d3c4d8fb 100644 (file)
@@ -24047,7 +24047,8 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp,
       else
        {
          rtx hot_label = gen_label_rtx ();
-         jump_around_label = gen_label_rtx ();
+         if (jump_around_label == NULL_RTX)
+           jump_around_label = gen_label_rtx ();
          emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
                                   LEU, 0, GET_MODE (count_exp), 1, hot_label);
          predict_jump (REG_BR_PROB_BASE * 90 / 100);
index bd46fa64ab2c2f6f892e437530e941a6ac341b4d..b7f12f5b9b57deb6feeed12bb89cf7acce697dc8 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-30   H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/59605
+       * gcc.dg/pr59605.c: New test.
+
 2013-12-27  Yury Gribov  <y.gribov@samsung.com>
 
        PR target/59585
diff --git a/gcc/testsuite/gcc.dg/pr59605.c b/gcc/testsuite/gcc.dg/pr59605.c
new file mode 100644 (file)
index 0000000..4556843
--- /dev/null
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-minline-stringops-dynamically" { target { i?86-*-* x86_64-*-* } } } */
+
+extern void abort (void);
+
+#define MAX_OFFSET (sizeof (long long))
+#define MAX_COPY (1024 + 8192)
+#define MAX_EXTRA (sizeof (long long))
+
+#define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
+
+static union {
+  char buf[MAX_LENGTH];
+  long long align_int;
+  long double align_fp;
+} u;
+
+char A[MAX_LENGTH];
+
+int
+main ()
+{
+  int off, len, i;
+  char *p, *q;
+
+  for (i = 0; i < MAX_LENGTH; i++)
+    A[i] = 'A';
+
+  for (off = 0; off < MAX_OFFSET; off++)
+    for (len = 1; len < MAX_COPY; len++)
+      {
+       for (i = 0; i < MAX_LENGTH; i++)
+         u.buf[i] = 'a';
+
+       p = __builtin_memcpy (u.buf + off, A, len);
+       if (p != u.buf + off)
+         abort ();
+
+       q = u.buf;
+       for (i = 0; i < off; i++, q++)
+         if (*q != 'a')
+           abort ();
+
+       for (i = 0; i < len; i++, q++)
+         if (*q != 'A')
+           abort ();
+
+       for (i = 0; i < MAX_EXTRA; i++, q++)
+         if (*q != 'a')
+           abort ();
+      }
+
+  return 0;
+}