

                                  Optimization


A popular technique for experimenting with compiler passes is to produce bitcode
with "clang -emit-llvm" and run the pass on the resulting bitcode with opt. Note
that this approach does not mix well with optimization: simply running "opt -O3"
on the instrumented bitcode yields inferior results. Why? In principle, the
instrumentation that adds symbolic execution capabilities does not interfere
with the compiler's regular optimization. However, while "opt -O3" runs the same
middle-end optimizations as clang does internally, "clang -O3" performs
additional analysis before invoking the middle end. In particular, type-based
alias analysis (TBAA) adds metadata to the bitcode that enables the SROA pass to
promote a lot of stack-allocated variables into SSA values.

In order to produce bitcode that can later be properly optimized with opt, pass
the desired optimization flag at each stage of the workflow:

$ clang -O3 -Xclang -disable-llvm-passes -emit-llvm -S test.c -o test.ll
$ opt -load ./libSymbolize.so -symbolize < test.ll > test_instrumented.bc
$ opt -O3 < test_instrumented.bc > test_instrumented_optimized.bc
$ clang -O3 test_instrumented_optimized.bc -o test
$ ./test
