GCC 4.0, which introduced the SSA-based GIMPLE, was released in 2004, which is roughly around the same time you mentioned that the optimization quality started to diverge. This is not an accident. At the time, lots of compilers thought that they could continue to compete with GCC without doing SSA-based optimizations. GCC crushed them all one by one.
https://github.com/DigitalMars/Compiler/blob/master/dm/src/d...
I've also written a loop unroller, but it can be improved:
https://github.com/DigitalMars/Compiler/blob/master/dm/src/d...
My evaluation was based on comparing the code gen output of the various compilers, not looking at how they were achieved.
As for SSA, DMD's optimizer is based on an intermediate representation that is a binary tree. A binary tree is a form of SSA - each operator node is a value assigned once and never modified.
> Respectfully
No worries. I'm used to people telling me I can't do things :-)
https://github.com/DigitalMars/Compiler/blob/master/dm/src/d...
DMD does all the usual data flow analysis optimizations - strength reduction, copy propagation, loop unrolling, dead store elimination, live range analysis, etc.
https://github.com/DigitalMars/Compiler/blob/master/dm/src/d...
The optimizer / code generator is the same one that Digital Mars C++ uses, which was developed in the 1980's (!). Up until 2000 or so, the code generated was about the same as gcc, though DMC++ ran several times faster.
Since 2000, all my attention has been on the D front end, and so the optimizer wasn't getting the devoted attention it had earlier.
Just recently I finished converting the DMD optimizer from C to D, and am doing the code generator. This should make the code much more tractable.