3

I am trying to reproduce the results of applying opt -O3 to a source file in the form of LLVM IR. I want to get the same IR by manually ordering the passes used by O3 and passing them to opt.

To illustrate what I am doing on an example, as an input I use linpack benchmark from the LLVM test suite[1]:

1. First I produce the intermediate representation using clang:

clang -O3 -Xclang -disable-llvm-optzns -emit-llvm -S linpack-pc.c -o linpack-pc.ll

2. Then I use opt to optimize the IR:

opt -S -O3 -o linpack-pc-3.ll linpack-pc.ll

Now my goal is to produce the IR identical to linpack-pc-3.ll by passing a sequence of optimizations to opt. To get the list of optimizations used by opt for O3, I run this:

opt -O3 -disable-output -debug-pass=Arguments linpack-pc.ll

Which produces (shortened to avoid wasting space):

Pass Arguments:  -tti -targetlibinfo -tbaa ...
Pass Arguments:  -targetlibinfo -tti -tbaa ...
Pass Arguments:  -domtree

So apparently there are three sequences of passes applied to IR as part of O3. I wasn't able to reproduce the same IR as linpack-pc-3.ll using these passes, I tried applying passes sequentially or concatenating them and passing as a single sequence to opt. Neither produced the needed output. Moreover the performance of the final executable downgraded by about 35%. I'm using LLVM 3.8 and my OS is Ubuntu 16.04.

[1] https://github.com/llvm/llvm-test-suite/blob/master/SingleSource/Benchmarks/Linpack/linpack-pc.c

Rahim Mammadli
  • 183
  • 1
  • 9
  • 1
    3.8 is on the old side, I'n not sure whether `-mllvm -print-after-all` is that old. But if it exists, then it sounds as if it might help you with whatever your final goal is. – arnt May 10 '19 at 09:15
  • 2
    This is a duplicate/similar to, see my answer there :) https://stackoverflow.com/questions/53738883/run-default-optimization-pipeline-using-modern-llvm/53739108#53739108 – JKRT May 13 '19 at 13:17

0 Answers0