Patchwork [PR51144] Partially revert patch to speed up integer output

login
register
mail settings
Submitter Steve Ellcey
Date Nov. 17, 2011, 7:29 p.m.
Message ID <201111171929.pAHJT8P17559@adlwrk05.cce.hp.com>
Download mbox | patch
Permalink /patch/126300/
State New
Headers show

Comments

Steve Ellcey - Nov. 17, 2011, 7:29 p.m.
The checkin r181279 which speeds up the printing of integer constants
caused PR 51144 and broke the IA64 and s390 bootstraps.

The problem is with fprint_w which takes a HOST_WIDE_INT value argument
and uses sprint_ul_rev to process it.  But sprint_ul_rev takes a long
argument so if the argument to fprint_w is 'long long' and is larger
then can fit into a long argument the function winds up truncating the
value.  This happens on IA64 HP-UX in 32 bit mode where 'long' is 32
bits and HOST_WIDE_INT (long long) is 64 bits.

Rather then try to fix fprint_w I would like to just go back to using
fprintf for this particular output.

Testing on IA64 HP-UX shows that this fixes the bootstrap failure and
it found no regressions.  Presumably it does slow down the compilation
slightly since the point of fprint_w was to be faster then fprintf.

If someone (Dimitrios?) wants to fix fprint_w instead of removing it
that is fine with me but if no one does that I would like to have
this patch approved to fix the bootstrap failure.

Steve Ellcey
sje@cup.hp.com


2011-11-17  Steve Ellcey  <sje@cup.hp.com>

	PR middle-end/51144
	* output.h (fprint_w): Remove.
	* final.c (fprint_w): Remove.
	(output_addr_const): Change fprint_w back to fprintf.
Jason Merrill - Nov. 17, 2011, 7:46 p.m.
On 11/17/2011 02:29 PM, Steve Ellcey wrote:
> Testing on IA64 HP-UX shows that this fixes the bootstrap failure and
> it found no regressions.  Presumably it does slow down the compilation
> slightly since the point of fprint_w was to be faster then fprintf.
>
> If someone (Dimitrios?) wants to fix fprint_w instead of removing it
> that is fine with me but if no one does that I would like to have
> this patch approved to fix the bootstrap failure.

OK.  We can always put a fixed version back later.

Jason

Patch

Index: output.h
===================================================================
--- output.h	(revision 181435)
+++ output.h	(working copy)
@@ -129,7 +129,6 @@  typedef HOST_WIDE_INT __gcc_host_wide_in
 #define ATTRIBUTE_ASM_FPRINTF(m, n) ATTRIBUTE_NONNULL(m)
 #endif
 
-extern void fprint_w (FILE *, HOST_WIDE_INT);
 extern void fprint_whex (FILE *, unsigned HOST_WIDE_INT);
 extern void fprint_ul (FILE *, unsigned long);
 extern int sprint_ul (char *, unsigned long);
Index: final.c
===================================================================
--- final.c	(revision 181435)
+++ final.c	(working copy)
@@ -3585,7 +3585,7 @@  output_addr_const (FILE *file, rtx x)
       break;
 
     case CONST_INT:
-      fprint_w (file, INTVAL (x));
+      fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
       break;
 
     case CONST:
@@ -3741,33 +3741,6 @@  sprint_ul_rev (char *s, unsigned long va
   return i;
 }
 
-/* Write a signed HOST_WIDE_INT as decimal to a file, fast. */
-
-void
-fprint_w (FILE *f, HOST_WIDE_INT value)
-{
-  /* python says: len(str(2**64)) == 20 */
-  char s[20];
-  int i;
-
-  if (value >= 0)
-    i = sprint_ul_rev (s, (unsigned long) value);
-  else
-    {
-      /* Cast to long long to output max negative correctly! */
-      i = sprint_ul_rev (s, ((unsigned long long) value) * -1);
-      putc('-', f);
-    }
-
-  /* It's probably too small to bother with string reversal and fputs. */
-  do
-    {
-      i--;
-      putc (s[i], f);
-    }
-  while (i != 0);
-}
-
 /* Write an unsigned long as decimal to a file, fast. */
 
 void