Home             Optimization levels              Benchmarks             Comparative

In this project we are running some experiments to probe the complexity of the LLVM optimizations.

We used two sets of applications in this experiment. The first is a set of random C programs and the second is a set of the Test-suite's benchmarks and applications (Multi-Source).

To generate random C programs, we used the Csmith tool.

The passes were divided intro three sets: Analysis, Transform and Utility.
You may see the description of these passes on the page : http://llvm.org/docs/Passes.html.
To see the otimizations organized into optimization levels, such as -O1, click here.

Test-suite's benchmarks
Random C programs
Side by side

In this experiments we have used the LLVM 3.6, and to measure the runtime we collected the CPU time using the pass -time-passes.
Also, to avoid collecting wrong data we used -disable-output and disable-verify. Thus the -time-passes only shows the runtime that we want to collect.

Analysis Passes:

(aa-eval, basicaa, basiccg, block-freq, branch-prob, count-aa, da, debug-aa, domfrontier, domtree, dot-callgraph, dot-cfg, dot-cfg-only, dot-dom, dot-dom-only, dot-postdom, dot-postdom-only, dot-regions, dot-regions-only, globalsmodref-aa, inline-cost, instcount, intervals, iv-users, lazy-value-info, libcall-aa, lint, loops, memdep, module-debuginfo, no-aa, postdomtree, print-alias-sets, print-callgraph, print-callgraph-sccs, print-cfg-sccs, print-dom-info, print-externalfnconstants, print-function, print-module, print-used-types, print-bb, print-memdeps, regions, scalar-evolution, scev-aa, tbaa)

Transform Passes:

(adce, add-discriminators, alloca-hoisting, always-inline, argpromotion, atomic-ll-sc, bb-vectorize, bounds-checking, break-crit-edges, codegenprepare, consthoist, constmerge, constprop, correlated-propagation, cost-model, datalayout, dce, deadargelim, debug-ir, delinearize, dfsan, die, domfrontier, dse, early-cse, functionattrs, generic-to-nvvm, globaldce, globalopt, gvn, indvars, inline, insert-gcov-profiling, instcombine, instsimplify, internalize, ipconstprop, ipsccp, jump-instr-table-info, jump-threading, lcssa, licm, load-combine, loop-deletion, loop-extract, loop-extract-single, loop-idiom, loop-instsimplify, loop-reduce, loop-reroll, loop-rotate, loop-simplify, loop-unroll, loop-unswitch, loop-vectorize, loweratomic, lower-expect, lowerinvoke, lowerswitch, mem2reg, memcpyopt, mergefunc, mergereturn, metarenamer, mldst-motion, msan, nvptx-assign-valid-global-names, nvptx-favor-non-generic, nvvm-reflect, objc-arc, objc-arc-aa, objc-arc-apelim, objc-arc-contract, objc-arc-expand, partial-inliner, partially-inline-libcalls, prune-eh, reassociate, reg2mem, sample-profile, scalarizer, scalarrepl, scalarrepl-ssa, sccp, separate-const-offset-from-gep, simplifycfg, sink, slp-vectorizer, sroa, strip, strip-dead-debug-info, strip-dead-prototypes, strip-debug-declare, strip-nondebug, structurizecfg, tailcallelim , tsan)

Utility Passes:

(deadarghaX0r, extract-blocks, instnamer, notti, targetlibinfo, verify, view-cfg, view-dom, view-postdom, view-callgraph, view-regions)