When searching for an usable algorithm with -minline-all-stringops,
decide_alg stops when it sees libcall even if there is a usable
algorithm.  It goes into an infinite loop.  This patch changes
decide_alg to stop searching only if there aren't any usable algorithms.
Testd on Linux/x86-64.  OK for trunk.


H.J.
----
gcc/

2014-11-29  H.J. Lu  <hongjiu...@intel.com>

        PR target/64108
        * config/i386/i386.c (decide_alg): Stop only if there aren't
        any usable algorithms.

gcc/testsuite/

2014-11-29  H.J. Lu  <hongjiu...@intel.com>

        PR target/64108
        * gcc.target/i386/memset-strategy-2.c: New test.

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2493130..d789635 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -24464,7 +24464,9 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT 
expected_size,
                      *noalign = alg_noalign;
                      return alg;
                    }
-                 break;
+                 /* Stop only if there aren't any usable algorithms.  */
+                 if (!any_alg_usable_p)
+                   break;
                }
              else if (alg_usable_p (candidate, memset))
                {
diff --git a/gcc/testsuite/gcc.target/i386/memset-strategy-2.c 
b/gcc/testsuite/gcc.target/i386/memset-strategy-2.c
new file mode 100644
index 0000000..aafa54d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/memset-strategy-2.c
@@ -0,0 +1,10 @@
+/* PR target/64108 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=atom -mmemset-strategy=libcall:-1:align 
-minline-all-stringops" } */
+
+char a[2048];
+void t (void)
+{
+  __builtin_memset (a, 1, 2048);
+}
+

Reply via email to