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>
* config.gcc (x86_64-*-rtems*): Use i386/rtemself.h
......
......@@ -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,
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