google / emboss

Emboss is a tool for generating code that reads and writes binary data structures.
Apache License 2.0
71 stars 21 forks source link

Implement simple common subexpression elimination. #9

Closed reventlov closed 4 years ago

reventlov commented 4 years ago

This change adds somewhat naive common subexpression elimination in a few places in the generated C++ code. This has little or no effect when C++ compiler optimizations are enabled, however, some users expect to be able to run some code (e.g., tests) with C++ optimizations disabled.

With this change, certain constructs are many orders of magnitude faster in unoptimized builds. The included test (complex_offset_test.cc) goes from >300s (timing out under Bazel) to <1s runtime.

Note that this does not perform any inlining, and the CSE is fairly naive (text-based), so unoptimized builds may still do a lot of repeated work. It also does not add CSE everywhere it could be added; only to places that are likely to have performance issues. Users who care even slightly about performance are still advised to compile with optimizations.