runtime optimizations in LLVM

Hello,

(im new to LLVM , so pl excuse if this is a naive q).

  Can someone provide info on what runtime
optimizations are done in LLVM? do you have something
along lines of JVM's hotspot feature?

How efficient is the optimized code vis-a-vis native
code?

thanks
-kamal

Hi Kamal,

(im new to LLVM , so pl excuse if this is a naive q).

Welcome!

Can someone provide info on what runtime optimizations are done in LLVM?

You can use any of LLVM's optimizing transformations in a JIT context. There's a list here:

http://llvm.org/docs/Passes.html

Unlike Java, you're in the driver's seat. You can determine which optimizations are applied to your code, and when.

do you have something along lines of JVM's hotspot feature?

You can recompile a function in the JIT at any time.

http://llvm.org/doxygen/classllvm_1_1ExecutionEngine.html#a18

However, LLVM does not yet have support frame rewriting; you cannot re-optimize and resume a function that is on the call stack.

How efficient is the optimized code vis-a-vis native code?

It is native code! :slight_smile: LLVM is also an excellent static compiler (see llvm-gcc, clang).

— Gordon

> (im new to LLVM , so pl excuse if this is a naive q).

Welcome!

thanks

> Can someone provide info on what runtime optimizations
are done in
> LLVM?

You can use any of LLVM's optimizing transformations in
a JIT context.
There's a list here:

LLVM’s Analysis and Transform Passes — LLVM 18.0.0git documentation

Unlike Java, you're in the driver's seat. You can
determine which
optimizations are applied to your code, and when.

yes -but can you tell me which optimizations have been proven to be more effective when applied at run time i.e. when input data is available?

> do you have something along lines of JVM's hotspot
feature?

You can recompile a function in the JIT at any time.

I am interested in optimizing code that was compiled using a C/C++ compiler. So, I will have binaries but probably not the source code.

LLVM: llvm::ExecutionEngine Class Reference

However, LLVM does not yet have support frame rewriting;
you cannot re-
optimize and resume a function that is on the call stack.

> How efficient is the optimized code vis-a-vis native
code?

It is native code! :slight_smile: LLVM is also an excellent static
compiler (see
llvm-gcc, clang).

can I pull out the backend part which is used for runtime optimization?

thanks
kamal

Can someone provide info on what runtime optimizations are done in LLVM?

You can use any of LLVM's optimizing transformations in a JIT context. There's a list here:

LLVM’s Analysis and Transform Passes — LLVM 18.0.0git documentation

Unlike Java, you're in the driver's seat. You can determine which optimizations are applied to your code, and when.

yes -but can you tell me which optimizations have been proven to be more effective when applied at run time i.e. when input data is available?

LLVM's 'opt' tool supports a -std-compile-opts flag which runs a generic list of optimizations; this is a good starting point for aggressive optimizations, and you can access the same list programmatically. The problem of pass ordering is a nontrivial one, however, and only you can decide what is the best tradeoff for your application. Luckily, experimentation with passes is not especially difficult.

do you have something along lines of JVM's hotspot feature?

You can recompile a function in the JIT at any time.

I am interested in optimizing code that was compiled using a C/C++ compiler. So, I will have binaries but probably not the source code.

You must have LLVM IR (possibly in the form of bitcode files) to optimize using LLVM; LLVM cannot re-optimize native binaries. Search the archives for llvm-qemu to find information on the topic of binary translation/optimization using LLVM.

However, you can certainly reoptimize bitcode files without access to the source code.

How efficient is the optimized code vis-a-vis native code?

It is native code! :slight_smile: LLVM is also an excellent static compiler (see llvm-gcc, clang).

can I pull out the backend part which is used for runtime optimization?

These are the exact same components used for static optimization. Certainly, however, you can link with subsets of LLVM in order to reduce the size of your binary.

— Gordon