| 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 |
| |