PR target/69888
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Feb 2016 21:34:07 +0000 (21:34 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Feb 2016 21:34:07 +0000 (21:34 +0000)
* config/i386/i386.c (decide_alg): Ensure we don't recurse with
identical arguments.  Formatting and spelling fixes.

* gcc.target/i386/pr69888.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233614 138bc75d-0d04-0410-961f-82ee72b054a4

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

index fea6798..1266d58 100644 (file)
@@ -1,5 +1,9 @@
 2016-02-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/69888
+       * config/i386/i386.c (decide_alg): Ensure we don't recurse with
+       identical arguments.  Formatting and spelling fixes.
+
        PR target/69885
        * doc/md.texi (ashl@var{m}3): Document that mode of operand 2 must
        be specified.
index a1c87ab..5c034f2 100644 (file)
@@ -26032,11 +26032,12 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size,
            bool memset, bool zero_memset, bool have_as,
            int *dynamic_check, bool *noalign)
 {
-  const struct stringop_algs * algs;
+  const struct stringop_algs *algs;
   bool optimize_for_speed;
   int max = 0;
   const struct processor_costs *cost;
   int i;
+  HOST_WIDE_INT orig_expected_size = expected_size;
   bool any_alg_usable_p = false;
 
   *noalign = false;
@@ -26066,7 +26067,7 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size,
       any_alg_usable_p |= usable;
 
       if (candidate != libcall && candidate && usable)
-         max = algs->size[i].max;
+       max = algs->size[i].max;
     }
 
   /* If expected size is not known but max size is small enough
@@ -26076,7 +26077,7 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size,
       && expected_size == -1)
     expected_size = min_size / 2 + max_size / 2;
 
-  /* If user specified the algorithm, honnor it if possible.  */
+  /* If user specified the algorithm, honor it if possible.  */
   if (ix86_stringop_alg != no_stringop
       && alg_usable_p (ix86_stringop_alg, memset, have_as))
     return ix86_stringop_alg;
@@ -26152,20 +26153,20 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size,
          || !alg_usable_p (algs->unknown_size, memset, have_as)))
     {
       enum stringop_alg alg;
+      HOST_WIDE_INT new_expected_size = max > 0 ? max / 2 : 2048;
 
-      /* If there aren't any usable algorithms, then recursing on
-         smaller sizes isn't going to find anything.  Just return the
-         simple byte-at-a-time copy loop.  */
-      if (!any_alg_usable_p)
+      /* If there aren't any usable algorithms or if recursing with the
+        same arguments as before, then recursing on smaller sizes or
+        same size isn't going to find anything.  Just return the simple
+        byte-at-a-time copy loop.  */
+      if (!any_alg_usable_p || orig_expected_size == new_expected_size)
         {
           /* Pick something reasonable.  */
           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
             *dynamic_check = 128;
           return loop_1_byte;
         }
-      if (max <= 0)
-       max = 4096;
-      alg = decide_alg (count, max / 2, min_size, max_size, memset,
+      alg = decide_alg (count, new_expected_size, min_size, max_size, memset,
                        zero_memset, have_as, dynamic_check, noalign);
       gcc_assert (*dynamic_check == -1);
       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
index 02a3b3e..a9529af 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/69888
+       * gcc.target/i386/pr69888.c: New test.
+
 2016-02-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/69882
diff --git a/gcc/testsuite/gcc.target/i386/pr69888.c b/gcc/testsuite/gcc.target/i386/pr69888.c
new file mode 100644 (file)
index 0000000..498fe5a
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR target/69888 */
+/* { dg-do compile } */
+/* { dg-options "-minline-all-stringops -mmemset-strategy=no_stringop:-1:noalign" } */
+/* { dg-additional-options "-march=geode" { target ia32 } } */
+
+void
+foo (char *p)
+{
+  __builtin_memset (p, 0, 32);
+}