public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* a strange infelicity of register allocation
@ 1999-01-23 22:42 Zack Weinberg
  1999-01-25  4:56 ` Joern Rennecke
  1999-01-31 23:58 ` Zack Weinberg
  0 siblings, 2 replies; 54+ messages in thread
From: Zack Weinberg @ 1999-01-23 22:42 UTC (permalink / raw)
  To: egcs

Consider this loop:

char *p = buffer, *op = out_buffer;
for (;;)
{
    char c = *p++;
    switch (c)
    {
	case '\0':
	   goto out;
	case '\n':
	   /* stuff... */
	   break;
	case '\r':
	    /* similar stuff... */
	    break;
	case '?':
	   /* other stuff... */
	   break;
	default:
	   *op++ = c;
    }
}
out:

Where each special case is long and complicated.  Some of them re-use
the variable c for their own purposes, but the initial store to c is
dead at the beginning of each special case.

The code generated copies c = *p into a register, then out to a stack
slot.  It then does the switch based on the contents of the register.
Down in the default case, c is copied back in from the stack slot and
then written to memory.

If I move the default case to the top of the switch, so it begins like

switch (c)
{
    default:
	*op++ = c;
	break;

then c gets to stay in a register all the time, and the code runs
about twice as fast.  It seems to me we should be generating identical
code for both cases.

Platform is x86; problem was seen with both egcs 1.1.1 and the current
snapshot.  The actual code I'm talking about is the function
read_and_prescan in the patch for newline handling in cpplib which I
just posted.

zw

^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~1999-01-31 23:58 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-01-23 22:42 a strange infelicity of register allocation Zack Weinberg
1999-01-25  4:56 ` Joern Rennecke
1999-01-25 11:47   ` Zack Weinberg
1999-01-25 11:50     ` Joern Rennecke
1999-01-31 23:58       ` Joern Rennecke
1999-01-25 12:00     ` Jeffrey A Law
1999-01-25 13:14       ` John S. Dyson
1999-01-31 23:58         ` John S. Dyson
1999-01-25 13:31       ` Zack Weinberg
1999-01-25 13:36         ` Jeffrey A Law
1999-01-25 19:56           ` Zack Weinberg
1999-01-25 20:33             ` Jeffrey A Law
1999-01-25 20:41               ` Zack Weinberg
1999-01-25 20:53                 ` Jeffrey A Law
1999-01-25 21:18                   ` Zack Weinberg
1999-01-25 21:30                     ` Jeffrey A Law
1999-01-25 21:38                       ` Zack Weinberg
1999-01-26  4:59                         ` Jeffrey A Law
1999-01-27  9:26                           ` Zack Weinberg
1999-01-28  5:26                             ` Jeffrey A Law
1999-01-28 17:20                               ` Zack Weinberg
1999-01-28 17:33                                 ` Joern Rennecke
1999-01-28 18:01                                 ` Jeffrey A Law
1999-01-28 18:27                                   ` Zack Weinberg
1999-01-28 19:58                                     ` Jeffrey A Law
1999-01-31 23:58                               ` Jeffrey A Law
1999-01-31 23:58                             ` Zack Weinberg
1999-01-31 23:58                           ` Jeffrey A Law
1999-01-31 23:58                         ` Zack Weinberg
1999-01-31 23:58                       ` Jeffrey A Law
1999-01-31 23:58                     ` Zack Weinberg
1999-01-31 23:58                   ` Jeffrey A Law
1999-01-31 23:58                 ` Zack Weinberg
1999-01-31 23:58               ` Jeffrey A Law
1999-01-31 23:58             ` Zack Weinberg
1999-01-31 23:58           ` Jeffrey A Law
1999-01-26  7:44         ` Joern Rennecke
1999-01-27  8:35           ` Zack Weinberg
1999-01-27  9:08             ` Joern Rennecke
1999-01-27  9:52               ` Zack Weinberg
1999-01-27 11:49                 ` Marc Espie
1999-01-31 23:58                   ` Marc Espie
1999-01-31 23:58                 ` Zack Weinberg
1999-01-31 23:58               ` Joern Rennecke
1999-01-28  8:11             ` Jeffrey A Law
1999-01-28 11:40               ` Zack Weinberg
1999-01-31 23:58               ` Jeffrey A Law
1999-01-31 23:58             ` Zack Weinberg
1999-01-31 23:58           ` Joern Rennecke
1999-01-31 23:58         ` Zack Weinberg
1999-01-31 23:58       ` Jeffrey A Law
1999-01-31 23:58     ` Zack Weinberg
1999-01-31 23:58   ` Joern Rennecke
1999-01-31 23:58 ` Zack Weinberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).