]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR other/69432 (ICE in connect_traces, at dwarf2cfi.c with -O3 -m32...
authorJakub Jelinek <jakub@redhat.com>
Thu, 11 Feb 2016 09:26:31 +0000 (10:26 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 11 Feb 2016 09:26:31 +0000 (10:26 +0100)
Backported from mainline
2016-01-22  Jakub Jelinek  <jakub@redhat.com>

PR target/69432
* config/i386/i386.c (expand_small_movmem_or_setmem,
expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Spelling
fixes.
(ix86_expand_set_or_movmem): Call do_pending_stack_adjust () early
if dynamic_check != -1.

* g++.dg/opt/pr69432.C: New test.

From-SVN: r233334

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr69432.C [new file with mode: 0644]

index f32e2e74a4c2a383c7689a5ef3480a639d89ce31..2ae4cb90f0cc256a5bdf8d964295bc98ba21799b 100644 (file)
@@ -1,6 +1,15 @@
 2016-02-11  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2016-01-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/69432
+       * config/i386/i386.c (expand_small_movmem_or_setmem,
+       expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Spelling
+       fixes.
+       (ix86_expand_set_or_movmem): Call do_pending_stack_adjust () early
+       if dynamic_check != -1.
+
        2016-01-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/67653
index c20c32c4826a43ce0232199639bc07fa1e1dd10f..a41efa4d97ca4f7c59444789a8a51511325f9fc5 100644 (file)
@@ -23605,7 +23605,7 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem,
        if (DYNAMIC_CHECK)
         Round COUNT down to multiple of SIZE
        << optional caller supplied zero size guard is here >>
-       << optional caller suppplied dynamic check is here >>
+       << optional caller supplied dynamic check is here >>
        << caller supplied main copy loop is here >>
      }
    done_label:
@@ -23779,8 +23779,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src
       else
        *min_size = 0;
 
-      /* Our loops always round down the bock size, but for dispatch to library
-        we need precise value.  */
+      /* Our loops always round down the block size, but for dispatch to
+         library we need precise value.  */
       if (dynamic_check)
        *count = expand_simple_binop (GET_MODE (*count), AND, *count,
                                      GEN_INT (-size), *count, 1, OPTAB_DIRECT);
@@ -24358,6 +24358,13 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp,
   size_needed = GET_MODE_SIZE (move_mode) * unroll_factor;
   epilogue_size_needed = size_needed;
 
+  /* If we are going to call any library calls conditionally, make sure any
+     pending stack adjustment happen before the first conditional branch,
+     otherwise they will be emitted before the library call only and won't
+     happen from the other branches.  */
+  if (dynamic_check != -1)
+    do_pending_stack_adjust ();
+
   desired_align = decide_alignment (align, alg, expected_size, move_mode);
   if (!TARGET_ALIGN_STRINGOPS || noalign)
     align = desired_align;
index 138f7460c787f95badad118e6b8dc0bcb0fe6227..65e4b56d50869ca28effdaae9dd90539d8b50606 100644 (file)
@@ -1,6 +1,11 @@
 2016-02-11  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2016-01-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/69432
+       * g++.dg/opt/pr69432.C: New test.
+
        2016-01-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/67653
diff --git a/gcc/testsuite/g++.dg/opt/pr69432.C b/gcc/testsuite/g++.dg/opt/pr69432.C
new file mode 100644 (file)
index 0000000..1f23f2c
--- /dev/null
@@ -0,0 +1,62 @@
+// PR target/69432
+// { dg-do compile }
+// { dg-options "-O3" }
+// { dg-additional-options "-minline-stringops-dynamically" { target i?86-*-* x86_64-*-* } }
+
+template <typename S, typename T, typename U>
+void
+f1 (S x, T y, U z)
+{
+  for (; y; --y, ++x)
+    *x = z;
+}
+
+template <typename S, typename T, typename U>
+void f2 (S x, T y, U z)
+{
+  f1 (x, y, z);
+}
+
+struct A {};
+struct B { static char f3 (A, unsigned); };
+
+template <typename S, typename U>
+void f4 (S, U);
+
+struct C
+{
+  template <typename S, typename T, typename U>
+  static S f5 (S x, T y, U z) { f2 (x, y, z); }
+};
+
+template <typename S, typename T, typename U>
+void f6 (S x, T y, U z) { C::f5 (x, y, z); }
+
+template <typename S, typename T, typename U, typename V>
+void f7 (S x, T y, U z, V) { f6 (x, y, z); }
+
+struct E
+{
+  struct D : A { char e; D (A); };
+  A f;
+  E (int x) : g(f) { f8 (x); }
+  ~E ();
+  D g;
+  void f9 (int x) { x ? B::f3 (g, x) : char (); }
+  void f8 (int x) { f9 (x); }
+};
+
+struct F : E
+{
+  F (int x) : E(x) { f10 (x); f4 (this, 0); }
+  char h;
+  void f10 (int x) { f7 (&g.e, x, h, 0); }
+};
+
+long a;
+
+void
+test ()
+{
+  F b(a);
+}