Commit 5699b9d1 by Alan Modra Committed by Alan Modra

[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
parent 8e416011
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> 2017-01-19 Uros Bizjak <ubizjak@gmail.com>
* config.gcc (x86_64-*-rtems*): Use i386/rtemself.h * config.gcc (x86_64-*-rtems*): Use i386/rtemself.h
......
...@@ -19869,10 +19869,13 @@ expand_strn_compare (rtx operands[], int no_length) ...@@ -19869,10 +19869,13 @@ expand_strn_compare (rtx operands[], int no_length)
} }
if (no_length) if (no_length)
emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"), {
target, LCT_NORMAL, GET_MODE (target), 2, tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
force_reg (Pmode, XEXP (src1, 0)), Pmode, emit_library_call_value (XEXP (DECL_RTL (fun), 0),
force_reg (Pmode, XEXP (src2, 0)), Pmode); target, LCT_NORMAL, GET_MODE (target), 2,
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
else else
{ {
/* -m32 -mpowerpc64 results in word_mode being DImode even /* -m32 -mpowerpc64 results in word_mode being DImode even
...@@ -19886,7 +19889,8 @@ expand_strn_compare (rtx operands[], int no_length) ...@@ -19886,7 +19889,8 @@ expand_strn_compare (rtx operands[], int no_length)
emit_move_insn (len_rtx, bytes_rtx); 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, target, LCT_NORMAL, GET_MODE (target), 3,
force_reg (Pmode, XEXP (src1, 0)), Pmode, force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode, force_reg (Pmode, XEXP (src2, 0)), Pmode,
...@@ -20131,10 +20135,13 @@ expand_strn_compare (rtx operands[], int no_length) ...@@ -20131,10 +20135,13 @@ expand_strn_compare (rtx operands[], int no_length)
/* Construct call to strcmp/strncmp to compare the rest of the string. */ /* Construct call to strcmp/strncmp to compare the rest of the string. */
if (no_length) if (no_length)
emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"), {
target, LCT_NORMAL, GET_MODE (target), 2, tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
force_reg (Pmode, XEXP (src1, 0)), Pmode, emit_library_call_value (XEXP (DECL_RTL (fun), 0),
force_reg (Pmode, XEXP (src2, 0)), Pmode); target, LCT_NORMAL, GET_MODE (target), 2,
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
else else
{ {
rtx len_rtx; rtx len_rtx;
...@@ -20144,7 +20151,8 @@ expand_strn_compare (rtx operands[], int no_length) ...@@ -20144,7 +20151,8 @@ expand_strn_compare (rtx operands[], int no_length)
len_rtx = gen_reg_rtx (SImode); len_rtx = gen_reg_rtx (SImode);
emit_move_insn (len_rtx, GEN_INT (bytes - compare_length)); 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, target, LCT_NORMAL, GET_MODE (target), 3,
force_reg (Pmode, XEXP (src1, 0)), Pmode, force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode, force_reg (Pmode, XEXP (src2, 0)), Pmode,
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment