From: Alan Modra Date: Thu, 19 Jan 2017 23:19:19 +0000 (+1030) Subject: [RS6000] PR79144, cmpstrnsi optimization breaks glibc X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5699b9d11556148547b478d1b4591359c7b89ac5;p=gcc.git [RS6000] PR79144, cmpstrnsi optimization breaks glibc 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5cdcfa8398d..33eb1298100 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-01-20 Alan Modra + + 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 * config.gcc (x86_64-*-rtems*): Use i386/rtemself.h diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 44d18e97f6d..4c6badaaa2b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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,