schmidt@POMPE.ICS.UCI.EDU ("Douglas C. Schmidt") (03/21/89)
Consider the following C function:
----------------------------------------
void
foo (a, i)
int *a;
int i;
{
int t1, t2, t3;
if (a[i] >= 0)
{
t1 = a[i] + 1;
a[i] = t1 + 1;
}
else
{
t2 = -a[i];
t3 = t2 + 1;
a[i] = t3 + 1;
}
}
----------------------------------------
Here's the output from cc -O2
----------------------------------------
.globl _foo
_foo:
link a6,#-8
movl a6@(12),d1
movl a6@(8),a0
lea a0@(0,d1:l:4),a0
movl a0@,d1
jge LY00000
negl d1
LY00000:
addql #1,d1
addql #1,d1
movl d1,a0@
moveq #0,d0
unlk a6
rts
----------------------------------------
Notice how it determined that the conditional was actually computing
a[i] = abs (a[i]) + 2. This results in much better code than the
following produced by GCC.
----------------------------------------
gcc_compiled.:
.text
.even
.globl _foo
_foo:
link a6,#0
movel a6@(8),a0
movel a6@(12),d1
tstl a0@(d1:l:4)
jlt L2
addql #2,a0@(d1:l:4)
jra L3
L2:
moveq #1,d0
subl a0@(d1:l:4),d0
addql #1,d0
movel d0,a0@(d1:l:4)
L3:
unlk a6
rts
----------------------------------------
Is it possible to make GCC this smart?!
Dougbruce@heather.pooh.com (Bruce Robertson) (03/21/89)
How is it the Sun compiler is smart enough do to all that, and then generates code like this: addql #1,d1 | come on, this is just silly to miss! addql #1,d1 | movl d1,a0@ moveq #0,d0 | this is a "void" function, why return a value? unlk a6 rts I do agree that specifying "-fstrength-reduce" to gcc should optimize all those complex indexing addressing modes into a direct pointer to the address of "a[i]".