[Bug target/57536] Inconsistent behavior of strlen inline and unroll

hjl.tools at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Jun 5 20:52:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57536

--- Comment #2 from H.J. Lu <hjl.tools at gmail dot com> ---
Something like this:

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 8b28b61..6d11323 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -23101,21 +23101,32 @@ bool
 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
 {
   rtx addr, scratch1, scratch2, scratch3, scratch4;
+  bool unroll;
+  
+  if (optimize_function_for_size_p (cfun))
+    return false;
+
+  unroll = (TARGET_UNROLL_STRLEN
+        && eoschar == const0_rtx
+        && optimize > 1
+        && !optimize_insn_for_size_p ());

   /* The generic case of strlen expander is long.  Avoid it's
      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */

-  if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
-      && !TARGET_INLINE_ALL_STRINGOPS
-      && !optimize_insn_for_size_p ()
-      && (!CONST_INT_P (align) || INTVAL (align) < 4))
+  if (unroll)
+    {
+      if (!TARGET_INLINE_ALL_STRINGOPS
+      && (!CONST_INT_P (align) || INTVAL (align) < 4))
+    return false;
+    }
+  else if (!TARGET_INLINE_ALL_STRINGOPS)
     return false;

   addr = force_reg (Pmode, XEXP (src, 0));
   scratch1 = gen_reg_rtx (Pmode);

-  if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
-      && !optimize_insn_for_size_p ())
+  if (unroll)
     {
       /* Well it seems that some optimizer does not combine a call like
          foo(strlen(bar), strlen(bar));



More information about the Gcc-bugs mailing list