Related articles |
---|
Are C logical operators beging lowered too soon? cdg@nullstone.com (1995-02-13) |
Optimizing Across && And || bart@cs.uoregon.edu (1995-02-15) |
Re: Optimizing Across && And || preston@tera.com (1995-02-18) |
Re: Optimizing Across && And || bill@amber.ssd.csd.harris.com (1995-02-19) |
Re: Optimizing Across && And || bart@cs.uoregon.edu (1995-02-21) |
Re: Optimizing Across && And || whalley@fork.cs.fsu.edu (David Whalley) (1995-02-22) |
Re: Optimizing Across && And || bart@cs.uoregon.edu (1995-02-23) |
Re: Optimizing Across && And || bill@amber.ssd.csd.harris.com (1995-02-24) |
Re: Optimizing Across && And || glew@ichips.intel.com (1995-02-27) |
Re: Optimizing Across && And || bill@amber.ssd.csd.harris.com (1995-02-28) |
[10 later articles] |
Newsgroups: | comp.compilers |
From: | bill@amber.ssd.csd.harris.com (Bill Leonard) |
Keywords: | C, optimize |
Organization: | Harris Computer Systems, Ft. Lauderdale FL |
References: | 95-02-110 95-02-123 |
Date: | Sun, 19 Feb 1995 20:10:27 GMT |
bart@cs.uoregon.edu (Barton C. Massey) writes:
> I was curious: unfortunately, even in a truth-value context
> inside an if(), the compilers I just tried mostly lose. I put
> together a sequence of simple benchmarks that I expected the
> compilers would all optimize perfectly, as a starting point to
> see how bad the problem was. I'll publish something more
> formal if there's interest, but here's a sketch of my (very)
> preliminary results. (Compiler 1 is a popular free C compiler
> running on a popular RISC architecture, compilers 2 and 3 are
> vendor's proprietary compilers for two RISC architectures. All
> were run with the best optimization flags I could figure out
> without extensive meditation.)
>
> benchmark:
> if(x && y)
> n++;
> if(x && y)
> n++;
How likely is this to occur in real code? I could always construct some
benchmark that tests for a particular (perhaps obscure) optimization that
would show lots of compilers to be "deficient", but unless that benchmark
represents a real application, it a completely artificial measure of a
compiler's effectiveness. However, you can be sure that if such a
benchmark becomes widely used to measure compilers, lots of compilers will
start implementing that optimization, regardless of whether it does any
users any real good or not. :-)
> benchmark:
> if( x && y || x && z )
> n++;
> result:
> Compiler 1: Loses a value propagation, but OK.
> Compiler 2: Tests x twice!
> Compiler 3: Tests x twice!
>
> This last result suggests I must be doing something wrong.
> Surely value propagation across basic blocks will clean this
> one up?? Comments?
Value propagation? No. Value propagation generally replaces a variable
reference with a constant that was *assigned* to the variable previously.
In this case, no constant was assigned to x. Now let's analyze the "usual"
way this code is translated:
if (x) {
if (y) {
goto incr;
}
}
if (x) {
if (z) {
goto incr;
}
}
goto skipit;
incr: n++;
skipit:
Note that the test of (x && z) is done only if (x && y) is false, but this
doesn't tell you much about the value of x, so x must be tested again. One
can only avoid the test of x on the paths where x's value is known. Now
assuming x, y, and z are free of side-effects, we *can* make the following
transformation:
if (x) {
if (y) goto incr;
goto testz; /* x is known to be non-zero here */
} else {
/* x is known to be zero here. No need to test z. */
goto skipit;
}
testz:
if (z) {
incr:
n++;
}
skipit:
Notice that this is not really just an elimination of the second test of x,
because we must also adjust the branches of preceding blocks. I wouldn't
expect many compilers to do this, though, because of the low likelihood of
an opportunity for it.
--
Bill Leonard
Harris Computer Systems Corporation
2101 W. Cypress Creek Road
Fort Lauderdale, FL 33309
Bill.Leonard@mail.hcsc.com
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.