On Apr 15, 2006, at 8:29 AM, Andrew Talbot wrote:
Dear gcc-help,
A newbie question: does gcc have a facility to emit its source-
level optimised
source code?
Well, you can get some idea of it with -fdump-tree-optimized
That will give you the dump of what the IR looks like (which is a
simplified C-like IR) after optimization.
For C++ and large C functions, it may or may not be helpful :)
You can also get the dumps after each optimization pass using -fdump-
tree-<something> (the list of passes and what to use there is in the
documentation).
Taking the example in the "changes" for version 4.1:
int foo (int *, int *);
int
bar (int d)
{
int a, b, c;
b = d + 1;
c = d + 2;
a = b + c;
if (d)
{
foo (&b, &c);
a = b + c;
}
printf ("%d\n", a);
}
"The a = b + c can be sunk to right before the printf."
If I were notified of that duplication, I would be inclined to
alter the
source code, even though the compiler would optimise the
duplication out for
me if I left it alone. One reason is that its pleasing to remove the
superfluity, another is that if it turned out that the expression
should be
a = b + 2 * c, I might alter one instance of it but miss the other.
For example, the after-sink dump looks like:
;; Function bar (bar)
Sinking a_11 = D.1519_6 + D.1518_3 from bb 2 to bb 5
bar (d)
{
int c;
int b;
int a;
int c.1;
int b.0;
int D.1519;
int D.1518;
<bb 2>:
D.1518_3 = d_2 + 1;
b = D.1518_3;
D.1519_6 = d_2 + 2;
c = D.1519_6;
if (d_2 != 0) goto <L0>; else goto <L2>;
<L2>:;
a_11 = D.1519_6 + D.1518_3;
goto <bb 4> (<L1>);
<L0>:;
foo (&b, &c);
b.0_12 = b;
c.1_13 = c;
a_14 = c.1_13 + b.0_12;
# a_1 = PHI <a_11(5), a_14(3)>;
<L1>:;
printf (&"%d\n"[0], a_1);
return;
}
(the optimized dump won't have PHI's).
However, be aware that a lot of this stuff *is* best left to the
compiler, particularly because not every optimization is always
profitable, etc.