[RS6000] PR79144, cmpstrnsi optimization breaks glibc
authorAlan Modra <amodra@gmail.com>
Thu, 19 Jan 2017 23:19:19 +0000 (09:49 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Thu, 19 Jan 2017 23:19:19 +0000 (09:49 +1030)
glibc compiled with current gcc-7 fails one test due to strcmp and
strncmp appearing in the PLT.  This is because the inline expansion of
those functions falls back to a function call, but doesn't use the asm
name for the call.

PR target/79144
* config/rs6000/rs6000.c (expand_strn_compare): Get the asm name
for strcmp and strncmp from corresponding builtin decl.

From-SVN: r244659

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 5cdcfa8398da0f0a83f2f734b7578315703ede40..33eb1298100781f01ab3eecd4eead9fdf593c2a5 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-20  Alan Modra  <amodra@gmail.com>
+
+       PR target/79144
+       * config/rs6000/rs6000.c (expand_strn_compare): Get the asm name
+       for strcmp and strncmp from corresponding builtin decl.
+
 2017-01-19  Uros Bizjak  <ubizjak@gmail.com>
 
        * config.gcc (x86_64-*-rtems*): Use i386/rtemself.h
index 44d18e97f6d3c5e9a9453d69c7e18f9f02ff9607..4c6badaaa2b1358c85c770e3e4a8c274af2f3779 100644 (file)
@@ -19869,10 +19869,13 @@ expand_strn_compare (rtx operands[], int no_length)
        }
 
       if (no_length)
-       emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"),
-                                target, LCT_NORMAL, GET_MODE (target), 2,
-                                force_reg (Pmode, XEXP (src1, 0)), Pmode,
-                                force_reg (Pmode, XEXP (src2, 0)), Pmode);
+       {
+         tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
+         emit_library_call_value (XEXP (DECL_RTL (fun), 0),
+                                  target, LCT_NORMAL, GET_MODE (target), 2,
+                                  force_reg (Pmode, XEXP (src1, 0)), Pmode,
+                                  force_reg (Pmode, XEXP (src2, 0)), Pmode);
+       }
       else
        {
          /* -m32 -mpowerpc64 results in word_mode being DImode even
@@ -19886,7 +19889,8 @@ expand_strn_compare (rtx operands[], int no_length)
 
          emit_move_insn (len_rtx, bytes_rtx);
 
-         emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strncmp"),
+         tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
+         emit_library_call_value (XEXP (DECL_RTL (fun), 0),
                                   target, LCT_NORMAL, GET_MODE (target), 3,
                                   force_reg (Pmode, XEXP (src1, 0)), Pmode,
                                   force_reg (Pmode, XEXP (src2, 0)), Pmode,
@@ -20131,10 +20135,13 @@ expand_strn_compare (rtx operands[], int no_length)
 
       /* Construct call to strcmp/strncmp to compare the rest of the string.  */
       if (no_length)
-       emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"),
-                                target, LCT_NORMAL, GET_MODE (target), 2,
-                                force_reg (Pmode, XEXP (src1, 0)), Pmode,
-                                force_reg (Pmode, XEXP (src2, 0)), Pmode);
+       {
+         tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
+         emit_library_call_value (XEXP (DECL_RTL (fun), 0),
+                                  target, LCT_NORMAL, GET_MODE (target), 2,
+                                  force_reg (Pmode, XEXP (src1, 0)), Pmode,
+                                  force_reg (Pmode, XEXP (src2, 0)), Pmode);
+       }
       else
        {
          rtx len_rtx;
@@ -20144,7 +20151,8 @@ expand_strn_compare (rtx operands[], int no_length)
            len_rtx = gen_reg_rtx (SImode);
 
          emit_move_insn (len_rtx, GEN_INT (bytes - compare_length));
-         emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strncmp"),
+         tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
+         emit_library_call_value (XEXP (DECL_RTL (fun), 0),
                                   target, LCT_NORMAL, GET_MODE (target), 3,
                                   force_reg (Pmode, XEXP (src1, 0)), Pmode,
                                   force_reg (Pmode, XEXP (src2, 0)), Pmode,