Optimizing out unnecessary allocations
David Nadlinger
see at klickverbot.at
Wed Oct 17 11:10:25 PDT 2012
I recently revived an LDC optimization pass (originally written
by Frits van Bommel) that can remove dead allocations and promote
small GC allocations to stack memory by recognizing the related
druntime calls.
However, I didn't commit it to the main branch yet because it
causes a test case in the DMD test suite to fail:
https://github.com/D-Programming-Language/dmd/blob/eaa03fefeb1a698f586d5f5a09068f3433bf4b29/test/runnable/testgc2.d
The test is intended to make sure that the garbage collector
properly handles out-of-memory situations, but in doing so
assumes that the compiler can't touch the array allocations.
However, when building with optimizations on, LDC recognizes the
fact that the allocations are unused and subsequently removes
them, causing the "assert(0)"s to be hit:
———
try {
long[] l = new long[ptrdiff_t.max];
assert(0);
}
catch (OutOfMemoryError o){}
———
Thus, my question: Is it legal for a D compiler to eliminate dead
GC allocations (given that there are no side effects due to
constructors, …)?
I'd strongly argue in favor of such optimizations to be legal,
because not allowing them would eliminate quite a few
optimization possibilities. There is also precedent for such
behavior; many C compilers treat malloc() in a similar fashion.
David
More information about the Digitalmars-d
mailing list