Introduction to the LLVM Compiler System

zionsaint 4,249 views 55 slides Jan 25, 2012
Slide 1
Slide 1 of 55
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55

About This Presentation

2008-10-04-ACAT-LLVM-Intro.pdf


Slide Content

Introduction to the LLVM
Compiler System
Chris Lattner
llvm.org Architect
November 4, 2008
ACAT’08 - Erice, Sicily

http://llvm.org
What is the LLVM Project?
•Collection of industrial strength compiler technology
■Optimizer and Code Generator
■llvm-gcc and Clang Front-ends
■MSIL and .NET Virtual Machines

http://llvm.org
What is the LLVM Project?
•Collection of industrial strength compiler technology
■Optimizer and Code Generator
■llvm-gcc and Clang Front-ends
■MSIL and .NET Virtual Machines
•Open Source Project with many contributors
■Industry, Research Groups, Individuals
http://llvm.org/

http://llvm.org
Why New Compilers?

http://llvm.org
Why New Compilers?
•Existing Open Source C Compilers have Stagnated!

http://llvm.org
Why New Compilers?
•Existing Open Source C Compilers have Stagnated!
•How?
■Based on decades old code generation technology
■No modern techniques like cross-file optimization and JIT codegen
■Aging code bases: difficult to learn, hard to change substantially
■Can’t be reused in other applications
■Keep getting slower with every release

http://llvm.org
What I want!

http://llvm.org
What I want!
•A set of production-quality reusable libraries:
■... which implement the best known techniques drawing from
modern literature
■... which focus on compile time
■... and performance of the generated code
•Ideally support many different languages and applications!

http://llvm.org
LLVM Vision and Approach
•Primary mission: build a set of modular compiler components:
■Reduces the time & cost to construct a particular compiler
■Components are shared across different compilers
■Allows choice of the right component for the job
Core
Optzn
xforms
X86
Support
Code
gen
Target
PPC
DWARF
analysis
LTO
linker
LL IOBC IO System
CBE
GC
IPO
GCC
JIT
clang
...
...
...

http://llvm.org
LLVM Vision and Approach
•Primary mission: build a set of modular compiler components:
■Reduces the time & cost to construct a particular compiler
■Components are shared across different compilers
■Allows choice of the right component for the job
•Secondary mission: Build compilers out of these components
■... for example, a truly great C compiler
■... for example, a runtime specialization engine
Core
Optzn
xforms
X86
Support
Code
gen
Target
PPC
DWARF
analysis
LTO
linker
LL IOBC IO System
CBE
GC
IPO
GCC
JIT
clang
...
...
...

http://llvm.org
Talk Overview
•Intro and Motivation
•LLVM as a C and C++ Compiler
•Other LLVM Capabilities
•Going Forward

http://llvm.org
LLVM-GCC 4.2
•C, C++, Objective C, Ada and Fortran
•Standard GCC command line options
•Supports almost all GCC language features and extensions
•Supports many targets, including X86, X86-64, PowerPC, etc.
•Extremely compatible with GCC 4.2

http://llvm.org
LLVM-GCC 4.2
•C, C++, Objective C, Ada and Fortran
•Standard GCC command line options
•Supports almost all GCC language features and extensions
•Supports many targets, including X86, X86-64, PowerPC, etc.
•Extremely compatible with GCC 4.2
What does it mean to be both LLVM and GCC?

http://llvm.org
LLVM GCC 4.2 Design
•Replace GCC optimizer and code generator with LLVM
■Reuses GCC parser and runtime libraries
.s fileGCC 4.2
Front-end GCC Optimizer GCC Code
Generator
GCC 4.2
C
C++
. . .

http://llvm.org
LLVM GCC 4.2 Design
•Replace GCC optimizer and code generator with LLVM
■Reuses GCC parser and runtime libraries
LLVM GCC 4.2
LLVM Optimizer
LLVM Code
GeneratorGCC 4.2
Front-end
C
C++
. . .
.s file
.s fileGCC 4.2
Front-end GCC Optimizer GCC Code
Generator
GCC 4.2
C
C++
. . .

http://llvm.org
Linking LLVM and GCC compiled code
•Safe to mix and match .o files between compilers
•Safe to call into libraries built with other compilers Disk Storage
b.c
llvm-gcc -O3gcc -O2
a.c .o files

http://llvm.org
Linking LLVM and GCC compiled code
•Safe to mix and match .o files between compilers
•Safe to call into libraries built with other compilers Disk Storage
b.c
llvm-gcc -O3gcc -O2
a.c .o files

http://llvm.org
Linking LLVM and GCC compiled code
•Safe to mix and match .o files between compilers
•Safe to call into libraries built with other compilers Disk Storage
b.c
llvm-gcc -O3gcc -O2
a.c Linker
exe.o files

http://llvm.org
Potential Impact of LLVM Optimizer
•Generated Code
■How fast does the code run?

http://llvm.org
Potential Impact of LLVM Optimizer
•Generated Code
■How fast does the code run?
•Compile Times
■How fast can we get code from the compiler?

http://llvm.org
Potential Impact of LLVM Optimizer
•Generated Code
■How fast does the code run?
•Compile Times
■How fast can we get code from the compiler?
•New Features

http://llvm.org
Potential Impact of LLVM Optimizer
•Generated Code
■How fast does the code run?
•Compile Times
■How fast can we get code from the compiler?
•New Features
Link Time Optimization

http://llvm.org
New Feature: Link Time Optimization
•Optimize (e.g. inline, constant fold, etc) across files with -O4
•Optimize across language boundaries too! Disk Storage
b.c
llvm-gcc -O4gcc -O3
a.c Linker .o files
exe

http://llvm.org
New Feature: Link Time Optimization
•Optimize (e.g. inline, constant fold, etc) across files with -O4
•Optimize across language boundaries too! Disk Storage
b.c
c.c
llvm-gcc -O4
llvm-gcc -O4gcc -O3
a.c Linker .o files
exe

http://llvm.orgLLVM Link
Time Optimizer
New Feature: Link Time Optimization
•Optimize (e.g. inline, constant fold, etc) across files with -O4
•Optimize across language boundaries too! Disk Storage
b.c
c.c
llvm-gcc -O4
llvm-gcc -O4gcc -O3
a.c Linker .o files
exe

http://llvm.orgLLVM Link
Time Optimizer
New Feature: Link Time Optimization
•Optimize (e.g. inline, constant fold, etc) across files with -O4
•Optimize across language boundaries too! Disk Storage
b.c
d.cpp
llvm-g++ -O4
c.c
llvm-gcc -O4
llvm-gcc -O4gcc -O3
a.c Linker .o files
exe

http://llvm.org
SPEC INT 2000 Compile Time
Optimization Level
In seconds: Lower is Better

http://llvm.org
SPEC INT 2000 Compile Time
-O0 -O0 -g -O1 -O2 -O3 -O4: LTO
0s
40s
80s
120s
160s
200s
187s
164s
133s
90s
79s
Optimization Level
In seconds: Lower is Better
GCC 4.2
LLVM GCC 4.2

http://llvm.org
SPEC INT 2000 Compile Time
-O0 -O0 -g -O1 -O2 -O3 -O4: LTO
0s
40s
80s
120s
160s
200s
187s
164s
133s
90s
79s
144s
131s
126s
112s
97s
74s
Optimization Level
In seconds: Lower is Better
GCC 4.2
LLVM GCC 4.2

http://llvm.org
SPEC INT 2000 Compile Time
-O0 -O0 -g -O1 -O2 -O3 -O4: LTO
0s
40s
80s
120s
160s
200s
187s
164s
133s
90s
79s
144s
131s
126s
112s
97s
74s
Optimization Level
In seconds: Lower is Better
GCC 4.2
LLVM GCC 4.2
18% Faster
at -O1!
30% Faster
at -O2!
42% Faster
at -O3!
Faster than
GCC at -O2!

http://llvm.org
SPEC 2000 Execution Time
Optimization Level
Relative to GCC -O2: Lower is Faster
GCC 4.2
LLVM GCC 4.2

http://llvm.org
SPEC 2000 Execution Time
-O2 -O3 -O4 (LTO)
75%
80%
85%
90%
95%
100%
96.3%
0.0%
Optimization Level
Relative to GCC -O2: Lower is Faster
GCC 4.2
LLVM GCC 4.2

http://llvm.org
SPEC 2000 Execution Time
-O2 -O3 -O4 (LTO)
75%
80%
85%
90%
95%
100%
96.3%
0.0%
95.1%
92.5%
Optimization Level
Relative to GCC -O2: Lower is Faster
GCC 4.2
LLVM GCC 4.2
5% Faster
at -O2!
4% Faster
at -O3!

http://llvm.org
SPEC 2000 Execution Time
-O2 -O3 -O4 (LTO)
75%
80%
85%
90%
95%
100%
96.3%
0.0%
95.1%
92.5%
80.3%
Optimization Level
Relative to GCC -O2: Lower is Faster
GCC 4.2
LLVM GCC 4.2
5% Faster
at -O2!
4% Faster
at -O3!
20% Faster
than -O3!

http://llvm.org
llvm-gcc 4.2 Summary
•Drop in replacement for GCC 4.2
■Compatible with GCC command line options and languages
■Works with existing makefiles (e.g. “make CC=llvm-gcc”)
•Benefits of LLVM Optimizer and Code Generator
■Much faster optimizer: ~30-40% at -O3 in most cases
■Slightly better codegen at a given level: ~5-10% on x86/x86-64
■Link-Time Optimization at -O4: optimize across source files

http://llvm.org
Talk Overview
•Intro and Motivation
•LLVM as a C and C++ Compiler
•Other LLVM Capabilities
•LLVM Going Forward

http://llvm.org
LLVM For Compiler Hackers
•LLVM is a great target for new languages
■Well defined, simple to program for
■Easy to retarget existing compiler to use LLVM backend
•LLVM supports Just-In-Time optimization and compilation
■Optimize code at runtime based on dynamic information
■Easy to retarget existing bytecode interpreter to LLVM JIT
■Great for performance, not just for traditional “compilers”

http://llvm.org
Colorspace Conversion JIT Optimization
•Code to convert from one color format to another:
■e.g. BGRA 444R -> RGBA 8888
■Hundreds of combinations, importance depends on input
for each pixel {
switch (infmt) {
case RGBA 5551:
R = (*in >> 11) & C
G = (*in >> 6) & C
B = (*in >> 1) & C
... }
switch (outfmt) {
case RGB888:
*outptr = R << 16 |
G << 8 ...
}
}

http://llvm.org
Colorspace Conversion JIT Optimization
•Code to convert from one color format to another:
■e.g. BGRA 444R -> RGBA 8888
■Hundreds of combinations, importance depends on input
for each pixel {
switch (infmt) {
case RGBA 5551:
R = (*in >> 11) & C
G = (*in >> 6) & C
B = (*in >> 1) & C
... }
switch (outfmt) {
case RGB888:
*outptr = R << 16 |
G << 8 ...
}
}
for each pixel {
R = (*in >> 11) & C;
G = (*in >> 6) & C;
B = (*in >> 1) & C;
*outptr = R << 16 |
G << 8 ...
}
Run-time
specialize
Compiler optimizes
shifts and masking

http://llvm.org
Colorspace Conversion JIT Optimization
•Code to convert from one color format to another:
■e.g. BGRA 444R -> RGBA 8888
■Hundreds of combinations, importance depends on input
for each pixel {
switch (infmt) {
case RGBA 5551:
R = (*in >> 11) & C
G = (*in >> 6) & C
B = (*in >> 1) & C
... }
switch (outfmt) {
case RGB888:
*outptr = R << 16 |
G << 8 ...
}
}
for each pixel {
R = (*in >> 11) & C;
G = (*in >> 6) & C;
B = (*in >> 1) & C;
*outptr = R << 16 |
G << 8 ...
}
Run-time
specialize
Compiler optimizes
shifts and masking
Speedup depends on src/dest format:
5.4x speedup on average, 19.3x max speedup: (13.3MB/s to 257.7MB/s)

http://llvm.org
Another example: RegEx Compilation
•Many regex’s are matched millions of times:
■Match time is critical
•Common regex engines ‘compile’ to ‘bytecode’ and interpret:
■regcomp/regexec
•Why not compile to native code? Partial Evaluation!
■regcomp compiles regex to a native function
■Much faster matching, could even vectorize common idioms
•Excellent way to handle multiple different Unicode encodings

http://llvm.org
Talk Overview
•Intro and Motivation
•LLVM as a C and C++ Compiler
•Other LLVM Capabilities
•LLVM Going Forward

http://llvm.org
LLVM Going Forward
•More of the same...

http://llvm.org
LLVM Going Forward
•More of the same...
■Even faster optimizer
■Even better optimizations
■More features for non-C languages
■Debug Info Improvements
■Many others...

http://llvm.org
LLVM Going Forward
•More of the same...
■Even faster optimizer
■Even better optimizations
■More features for non-C languages
■Debug Info Improvements
■Many others...
Better tools for source level analysis
of C/C++ programs!

http://llvm.org
Clang Frontend: What is it?
•C, Objective-C, and C++ front-end
•Aggressive project with many goals...
■Compatibility with GCC
■Fast compilation
■Expressive error messages
•Host for a broad range of source-level tools

http://llvm.org
Clang Frontend: What is it?
•C, Objective-C, and C++ front-end
•Aggressive project with many goals...
■Compatibility with GCC
■Fast compilation
■Expressive error messages
•Host for a broad range of source-level tools
t.c:6:49: error: invalid operands to binary expression ('int' and 'struct A')
return intArg + func(intArg ? ((someA.X+40) + someA) / 42 : someA.X));
~~~~~~~~~~~~ ^ ~~~~~

http://llvm.org
Clang Frontend: What is it?
•C, Objective-C, and C++ front-end
•Aggressive project with many goals...
■Compatibility with GCC
■Fast compilation
■Expressive error messages
•Host for a broad range of source-level tools
t.c:6:49: error: invalid operands to binary expression ('int' and 'struct A')
return intArg + func(intArg ? ((someA.X+40) + someA) / 42 : someA.X));
~~~~~~~~~~~~ ^ ~~~~~

http://llvm.org
Clang Compile Time
PostgreSQL -fsyntax-only Time: 665K lines of C code in 619 files

http://llvm.org
Clang Compile Time
49s
PostgreSQL -fsyntax-only Time: 665K lines of C code in 619 files
GCC 4.2 clang

http://llvm.org
Clang Compile Time
49s
21s
PostgreSQL -fsyntax-only Time: 665K lines of C code in 619 files
GCC 4.2 clang
2.3x faster

http://llvm.org
LLVM Overview
•New compiler architecture built with reusable components
■Retarget existing languages to JIT or static compilation
■Many optimizations and supported targets

http://llvm.org
LLVM Overview
•New compiler architecture built with reusable components
■Retarget existing languages to JIT or static compilation
■Many optimizations and supported targets
•llvm-gcc: drop in GCC-compatible compiler
■Better & faster optimizer
■Production quality

http://llvm.org
LLVM Overview
•New compiler architecture built with reusable components
■Retarget existing languages to JIT or static compilation
■Many optimizations and supported targets
•llvm-gcc: drop in GCC-compatible compiler
■Better & faster optimizer
■Production quality
•Clang front-end: C/ObjC/C++ front-end
■Several times faster than GCC
■Much better end-user features (warnings/errors)

http://llvm.org
LLVM Overview
•New compiler architecture built with reusable components
■Retarget existing languages to JIT or static compilation
■Many optimizations and supported targets
•llvm-gcc: drop in GCC-compatible compiler
■Better & faster optimizer
■Production quality
•Clang front-end: C/ObjC/C++ front-end
■Several times faster than GCC
■Much better end-user features (warnings/errors)
•LLVM 2.4 release this week!http://llvm.org http://clang.llvm.org
Come join us at: