diff mbox

[RS6000] PR79144, cmpstrnsi optimization breaks glibc

Message ID 20170119121427.GQ32333@bubble.grove.modra.org
State New
Headers show

Commit Message

Alan Modra Jan. 19, 2017, 12:14 p.m. UTC
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 not using the asm
name for the call.  Fixed by retrieving the asm name from the builtin
decl.  I used the builtin decl simply because it is in a handy table.

Bootstrapped and regression tested powerpc64le-linux.  OK to apply?

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

Comments

Segher Boessenkool Jan. 19, 2017, 10:31 p.m. UTC | #1
On Thu, Jan 19, 2017 at 10:44:27PM +1030, Alan Modra wrote:
> 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 not using the asm
> name for the call.  Fixed by retrieving the asm name from the builtin
> decl.  I used the builtin decl simply because it is in a handy table.
> 
> Bootstrapped and regression tested powerpc64le-linux.  OK to apply?

Okay for trunk.  Thanks!


Segher


> 	* config/rs6000/rs6000.c (expand_strn_compare): Get the asm name
> 	for strcmp and strncmp from corresponding builtin decl.
diff mbox

Patch

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 44d18e9..4c6bada 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,