Related articles |
---|
Does Duff Device break C compilers Lambert.Lum@eng.efi.com (Lambert Lum) (1996-05-06) |
Re: Does Duff Device break C compilers preston@tera.com (1996-05-07) |
Re: Does Duff Device break C compilers krste@ICSI.Berkeley.EDU (1996-05-08) |
Re: Does Duff Device break C compilers jeremy@floyd.sw.oz.au (1996-05-10) |
Re: Does Duff Device break C compilers rankin@eql.caltech.edu (1996-05-10) |
Re: Does Duff Device break C compilers msb@sq.com (1996-05-10) |
Re: Does Duff Device break C compilers preston@tera.com (1996-05-13) |
Re: Does Duff Device break C compilers baynes@ukpsshp1.serigate.philips.nl (1996-05-19) |
From: | preston@tera.com (Preston Briggs) |
Newsgroups: | comp.compilers |
Date: | 7 May 1996 00:48:07 -0400 |
Organization: | /etc/organization |
References: | 96-05-050 |
Keywords: | C, optimize |
>item called Duff's Device. I showed to a couple of guys here at my
>work place and they never seen it before. Then they declared that such
>an unorthodox technique could potential break some C compilers.
I agree with the moderator. It's not obvious, but it's not that hard
to compile. I'd expect everyone to get it right. On the other hand,
I wouldn't be surprised if the resulting code wasn't that great. Why?
It makes an irreducible loop and lots of optimizers don't do much with
irreducible loops. Also hard to software pipeline, etc.
> n = (count + 7) / 8; /* count > 0 assumed */
> switch (count % 8)
> {
> case 0: do { *to = *from++;
> case 7: *to = *from++;
> case 6: *to = *from++;
> case 5: *to = *from++;
> case 4: *to = *from++;
> case 3: *to = *from++;
> case 2: *to = *from++;
> case 1: *to = *from++;
> } while (--n > 0);
> }
Better is to rewrite it, like this
/* no assumptions made about count */
for (n = 0; n < count; n++)
to[n] = from[n];
which is correct, obvious, maintainable, parallelizable, vectorizable,
software pipelinable, and in all other ways superior. Well, I guess
it doesn't have a fancy name. You may call it "Preston's Ploy" if
that helps.
Preston Briggs
[Duff's device generated truly wonderful code on the PDP-11 because it
exactly matched its auto-increment addressing modes and loop control
instructions. It's hard to think of a modern machine where it'd be of
any practical use. Great hacks are like that. (See HAKMEM for many
fine PDP-6/10 examples.) -John]
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.