March 10, 1999
We are pleased to announce that Cygnus has donated improvements to the global constant propagation optimization.
Previously the global constant/copy propagation optimizer would never propagate a constant or copy into a conditional jump. As a result the compiler often missed important optimizations. This is best illustrated with a simple example:
int length, width, radius;
enum figure {RECTANGLE, CIRCLE};
main()
{
int area = 0, volume = 0, height;
enum figure kind = RECTANGLE;
for (height = 0; height < 10; height++) {
if (kind == RECTANGLE) {
area += length * width;
volume += length * width * height;
} else
if (kind == CIRCLE) {
area += 3.14 * radius * radius;
volume += 3.14 * radius * radius * height;
}
}
process(area, volume);
}
Careful examination of that function shows that the two if statements are known to be true and false respectively.
The left column shows the loop from the example generated by GCC before these improvements. The right column shows the loop after the global cprop improvements (-O2 hppa1.1-hp-hpux10 target).
L$0006 L$0006
comib,<>,n 0,%r22,L$0007
addl %r26,%r20,%r26 addl %r25,%r21,%r25
bl L$0005,0
addl %r25,%r21,%r25
L$0007
comib,<>,n 1,%r22,L$0005
stw %r19,-16(0,%r30)
fcnvxf,sgl,dbl %fr27L,%fr26
fldws -16(0,%r30),%fr22L
stw %r26,-16(0,%r30)
fcnvxf,sgl,dbl %fr22L,%fr25
fldws -16(0,%r30),%fr23L
fmpy,dbl %fr26,%fr28,%fr22
stw %r25,-16(0,%r30)
fcnvxf,sgl,dbl %fr23L,%fr24
fmpy,dbl %fr22,%fr26,%fr22
fldws -16(0,%r30),%fr26L
fmpyadd,dbl %fr22,%fr25,%fr25,%fr22,%fr24
fcnvxf,sgl,dbl %fr26L,%fr23
fcnvfxt,dbl,sgl %fr24,%fr24L
fstws %fr24L,-16(0,%r30)
fadd,dbl %fr23,%fr25,%fr23
ldw -16(0,%r30),%r26
fcnvfxt,dbl,sgl %fr23,%fr23L
fstws %fr23L,-16(0,%r30)
ldw -16(0,%r30),%r25
L$0005
ldo 1(%r19),%r19
comib,>= 9,%r19,L$0006 addib,>= -1,%r20,L$0006
addl %r21,%r20,%r21 addl %r21,%r19,%r21
The code in the left hand column has two conditional branches which are compile-time computable, but which were not optimized by the compiler. The right column shows the code after the compiler has been improved to identify the compile-time computable conditional branches.
Note this optimization does not currently work on "cc0" machines such as the x86 or m68k. We hope someone will enhance the code further to support "cc0" machines.
Please send FSF & GNU inquiries & questions to gnu@gnu.org. There are also other ways to contact the FSF.
These pages are maintained by the GCC team.
For questions related to the use of GCC, please consult these web pages and the GCC manuals. If that fails, the gcc-help@gcc.gnu.org mailing list might help.Copyright (C) Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
| Last modified 2006-06-21 |
|