-O2
or -xO2
) or higher, Sun Studio C/C++ compilers recognize loop-invariant code and re-arranges it in such a way that it is executed less often (mostly it may get executed only once) than it would be within the loop.Loop-invariant code consists of statements which could be moved to before or after the loop, without affecting the semantics of the program. In simple words, loop-invariant code is the set of instructions inside a loop whose results do not change; and hence can safely be moved out of the loop.
Consider the following simple example.
% cat loopinvariant.c
#include <stdio.h>
int main()
{
long i = 0, max = 5000000;
int count = 20;
const float pi = 3.14;
while (i < (max + 100))
{
i = i + (count + 1) * (int) pi + 2;
printf("\ni = %ld", i);
}
return (0);
}
% cc -o loopinvariant loopinvariant.c
% timex loopinvariant
...
...
i = 5000060
i = 5000125
real 10.56
user 0.11
sys 0.39
In the above example, the following instructions are loop-invariant:
-
(max + 100)
inwhile (i < (max + 100))
, and -
(count + 1) * (int) pi + 2
ini = i + (count + 1) * (int) pi + 2;
cc -S loopinvariant.c
):#include <stdio.h>So, when the original code is compiled with
int main()
{
long i = 0, max = 5000000;
int count = 20;
const float pi = 3.14;
long maxvalue = (max + 100);
int tempval = (count + 1) * (int) pi + 2;
while (i < maxvalue)
{
i = i + tempval;
printf("\ni = %ld", i);
}
return (0);
}
-xO2
optimization (or higher), it runs a little faster.% cc -xO2 -o loopinvariant2 loopinvariant.c
% timex loopinvariant2
...
...
i = 5000060
i = 5000125
real 9.87
user 0.10
sys 0.38
Note:
When
-xprofile=use
option is used, Sun Studio C/C++ compilers make sure that the loop-invariant code will not be moved from low to high execution places.___________________
Technorati tags: C | C++ | Sun Studio | Programming
No comments:
Post a Comment