57 lines
2.6 KiB
Plaintext
57 lines
2.6 KiB
Plaintext
|
Date: Tue, 18 Sep 2001 00:38:37 -0500 (CDT)
|
||
|
From: Chris Lattner <sabre@nondot.org>
|
||
|
To: Vikram S. Adve <vadve@cs.uiuc.edu>
|
||
|
Subject: Idea for a simple, useful link time optimization
|
||
|
|
||
|
|
||
|
In C++ programs, exceptions suck, and here's why:
|
||
|
|
||
|
1. In virtually all function calls, you must assume that the function
|
||
|
throws an exception, unless it is defined as 'nothrow'. This means
|
||
|
that every function call has to have code to invoke dtors on objects
|
||
|
locally if one is thrown by the function. Most functions don't throw
|
||
|
exceptions, so this code is dead [with all the bad effects of dead
|
||
|
code, including icache pollution].
|
||
|
2. Declaring a function nothrow causes catch blocks to be added to every
|
||
|
call that isnot provably nothrow. This makes them very slow.
|
||
|
3. Extra extraneous exception edges reduce the opportunity for code
|
||
|
motion.
|
||
|
4. EH is typically implemented with large lookup tables. Ours is going to
|
||
|
be much smaller (than the "standard" way of doing it) to start with,
|
||
|
but eliminating it entirely would be nice. :)
|
||
|
5. It is physically impossible to correctly put (accurate, correct)
|
||
|
exception specifications on generic, templated code. But it is trivial
|
||
|
to analyze instantiations of said code.
|
||
|
6. Most large C++ programs throw few exceptions. Most well designed
|
||
|
programs only throw exceptions in specific planned portions of the
|
||
|
code.
|
||
|
|
||
|
Given our _planned_ model of handling exceptions, all of this would be
|
||
|
pretty trivial to eliminate through some pretty simplistic interprocedural
|
||
|
analysis. The DCE factor alone could probably be pretty significant. The
|
||
|
extra code motion opportunities could also be exploited though...
|
||
|
|
||
|
Additionally, this optimization can be implemented in a straight forward
|
||
|
conservative manner, allowing libraries to be optimized or individual
|
||
|
files even (if there are leaf functions visible in the translation unit
|
||
|
that are called).
|
||
|
|
||
|
I think it's a reasonable optimization that hasn't really been addressed
|
||
|
(because assembly is way too low level for this), and could have decent
|
||
|
payoffs... without being a overly complex optimization.
|
||
|
|
||
|
After I wrote all of that, I found this page that is talking about
|
||
|
basically the same thing I just wrote, except that it is translation unit
|
||
|
at a time, tree based approach:
|
||
|
http://www.ocston.org/~jls/ehopt.html
|
||
|
|
||
|
but is very useful from "expected gain" and references perspective. Note
|
||
|
that their compiler is apparently unable to inline functions that use
|
||
|
exceptions, so there numbers are pretty worthless... also our results
|
||
|
would (hopefully) be better because it's interprocedural...
|
||
|
|
||
|
What do you think?
|
||
|
|
||
|
-Chris
|
||
|
|