Autotuning parameters/heuristics within LLVM


I am planning to begin a project to explore the space of tuning LLVM
internals in an effort to increase performance. I am wondering if
anyone can point to me any parameterizations, heuristics, or
priorities functions within LLVM that can be tuned/adjusted. So far,
I'm considering BranchProbabilityInfo and InlineCost. Does anyone have
any other suggestions?


Dear Robert,

a while ago, we had this idea of using compiler optimizations to increase the performance of verifying an app, instead of the performance of executing it. We found that there were a number of settings that had an effect on verification performance:

  • The amount of loop unswitching -loop-unswitch-threshold=...
  • The amount of loop unrolling -unroll-threshold=...
  • The amount of function inlining -inline-threshold=...
  • The amount of jump threading -jump-threading-threshold=...
  • Whether to favor branches or select instructions -phi-node-folding-threshold=... -max-phi-to-fold-per-bb=...

The effect that these had on verification (in our case, exhaustive symbolic testing) was quite drastic, with speedups of 95x in some cases.

The core idea behind the work is that compilers use cost models that tell them how expensive an operation is. For verification, the costs are different. I’m writing you because these settings also have an impact en execution performance. If you find other parameters that have large effects, I’d be thrilled to hear about it.


PS: more details on our experiments:​

Dear Jonas,

Very cool.

I've added a link to your paper on the LLVM publications page. Please feel free to email the list about other papers you or your group at EPFL publish that use LLVM; we love adding to the links on the Publications page.


John Criswell