+ All Categories
Home > Documents > ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code...

ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code...

Date post: 26-Jun-2020
Category:
Upload: others
View: 3 times
Download: 0 times
Share this document with a friend
25
. . ErLLVM: An LLVM Backend for Erlang Kostis Sagonas 1,2 Chris Stavrakakis 2 Yiannis Tsiouris 2 [email protected] 1 Programming Language Group, Uppsala University 2 Software Engineering Laboratory, National Technical University of Athens http://erllvm.softlab.ntua.gr/ September 14, 2012
Transcript
Page 1: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

.

. ErLLVM: An LLVM Backend for Erlang

Kostis Sagonas1,2 Chris Stavrakakis2 Yiannis [email protected]

1Programming Language Group, Uppsala University2Software Engineering Laboratory, National Technical University of Athens

http://erllvm.softlab.ntua.gr/

September 14, 2012

Page 2: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

High Performance Erlang (HiPE)

The native code compiler of ErlangIs mature and robust

◦ Integrated in Erlang/OTP since 2001

Produces reasonably efficient codeProvides backends for:

◦ ARM◦ SPARC V8+◦ x86 and x86_64 (AMD64)◦ PowerPC 32/64

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 2/16

Page 3: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

LLVM Compiler Infrastructure

A state-of-the-art compiler libraryOpen-source with a BSD-like licenseProduces very efficient codeProvides backends for:

◦ ARMv8 32/64 and Thumb◦ SPARC V9◦ x86 and x86_64◦ PowerPC 32/64

◦ Alpha◦ MIPS 32/64◦ STI CBEA Cell SPU◦ ...

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 3/16

Page 4: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

ErLLVM

.

......A project aiming at incorporating the LLVM into the HiPE pipeline

Why use LLVM?CuriosityEasier maintenance of HiPE’s code base

◦ One instead of six backends◦ Parts of implementation and further optimization are

“outsourced” to a community with many contributors(industry, research groups, individuals)

More supported architectures “for free”Better performance

◦ Target-related optimizations

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 4/16

Page 5: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

LLVM backend in Erlang/OTP

BEAM

Emulator

Memory

BEAMBytecode

OtherData

Native

Code

BEAM

Dissassembler

HiPELoader

SPARC X86

LLVM

Erlang Run-Time System HiPE Compiler

SymbolicBEAM

Icode

RTL

PowerPC...

Takes as input RTL (exactly as the other HiPE backends)◦ RTL is “low-level” Erlang, yet target-independent◦ Erlang’s high-level characteristics have been lowered

Produces ERTS ABI-compatible code

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 5/16

Page 6: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Calling Convention

HiPEUses specific registers for arguments and return valuesPlaces N arguments in registersSpecifies its caller-/callee-save registersExpects the callee to always pop the arguments (for propertail-call support)

LLVMSupports several calling conventions but not HiPE’s

ErLLVMImplements a new calling convention in LLVM (cc11)(submitted a patch to LLVM team)

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 6/16

Page 7: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Calling Convention

HiPEUses specific registers for arguments and return valuesPlaces N arguments in registersSpecifies its caller-/callee-save registersExpects the callee to always pop the arguments (for propertail-call support)

LLVMSupports several calling conventions but not HiPE’s

ErLLVMImplements a new calling convention in LLVM (cc11)(submitted a patch to LLVM team)

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 6/16

Page 8: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Precoloured Registers

VM x86 x86_64Native Stack Pointer %esp %nspHeap Pointer %ebp %r15Process Pointer %esi %rbp

HiPEDefines registers with “special”use, pinned to hardwareregisters (unallocatable)

LLVMDoes not provide hooks for register allocation

ErLLVMTranslates each function definition to a new onedefine f (%arg1) {

...res = call g (%arg1, %tmp);...return 0;

}

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 7/16

Page 9: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Precoloured Registers

VM x86 x86_64Native Stack Pointer %esp %nspHeap Pointer %ebp %r15Process Pointer %esi %rbp

HiPEDefines registers with “special”use, pinned to hardwareregisters (unallocatable)

LLVMDoes not provide hooks for register allocation

ErLLVMTranslates each function definition to a new onedefine f (%arg1) {

...res = call g (%arg1, %tmp);...return 0;

}

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 7/16

Page 10: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Precoloured Registers

VM x86 x86_64Native Stack Pointer %esp %nspHeap Pointer %ebp %r15Process Pointer %esi %rbp

HiPEDefines registers with “special”use, pinned to hardwareregisters (unallocatable)

LLVMDoes not provide hooks for register allocation

ErLLVMTranslates each function definition to a new onedefine cc11 f (%HP, %P, %arg1) {

...{%HP', %P', res} = call cc11 g (%HP, %P, %arg1, %tmp);...return {%HP', %P', 0};

}

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 7/16

Page 11: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Stack Management

HiPEPrepends code to each function to handle stack overflows

LLVMHas a fixed Prologue/Epilogue Insertion (PEI) pass

ErLLVMSlightly modifies PEI pass to add HiPE-specific code tofunction prologue when needed (submitted a patch toLLVM team)

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 8/16

Page 12: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Stack Management

HiPEPrepends code to each function to handle stack overflows

LLVMHas a fixed Prologue/Epilogue Insertion (PEI) pass

ErLLVMSlightly modifies PEI pass to add HiPE-specific code tofunction prologue when needed (submitted a patch toLLVM team)

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 8/16

Page 13: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Exception Handling & Garbage CollectionHiPE

Provides information about the caller’s frame at call sites◦ Exception handler◦ Frame size◦ Stack arity◦ Live words in frame◦ Return address of call site

LLVMProvides first-class support for exception handlingProvides garbage collection intrinsics and a framework forcompile-time code generation plugins

ErLLVMExports information about exception handlers in the object fileExports garbage collection information in the object file(submitted a patch to LLVM team)Extracts all necessary information from the generated objectfile and creates a loadable Erlang term

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 9/16

Page 14: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Exception Handling & Garbage CollectionHiPE

Provides information about the caller’s frame at call sites◦ Exception handler◦ Frame size◦ Stack arity◦ Live words in frame◦ Return address of call site

LLVMProvides first-class support for exception handlingProvides garbage collection intrinsics and a framework forcompile-time code generation plugins

ErLLVMExports information about exception handlers in the object fileExports garbage collection information in the object file(submitted a patch to LLVM team)Extracts all necessary information from the generated objectfile and creates a loadable Erlang term

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 9/16

Page 15: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

LLVM and Garbage Collection

“Accurate Garbage Collection with LLVM” by providing...a framework to generate code consistent with thecorresponding runtimeGC intrinsics to mark all places that hold live pointer variablesat run-time

But....llvm.gcroot..

......

“The llvm.gcroot intrinsic is used to inform LLVM that a stackvariable references an object on the heap and is to be tracked forgarbage collection.”

Big problem!Every root has to be placed on the stackExtra liveness analysis is needed for reducing stack usage

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 10/16

Page 16: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

LLVM and Garbage Collection

“Accurate Garbage Collection with LLVM” by providing...a framework to generate code consistent with thecorresponding runtimeGC intrinsics to mark all places that hold live pointer variablesat run-time

But....llvm.gcroot..

......

“The llvm.gcroot intrinsic is used to inform LLVM that a stackvariable references an object on the heap and is to be tracked forgarbage collection.”

Big problem!Every root has to be placed on the stackExtra liveness analysis is needed for reducing stack usage

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 10/16

Page 17: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Code Size

Backend Size (LOC)Code Blank Comments Total

ARM 3886 636 830 (17.6%) 5352SPARC 3616 643 878 (19.5%) 5137x86/x86_64 7424 1056 1983 (21.1%) 10463PPC32/PPC64 5001 792 891 (15.1%) 6684LLVM (x86/x86_64) 3441 439 944 (21.5%) 4824

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 11/16

Page 18: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Runtime Performance - x86_64

0

1

2

3

4

5

6

binarytrees

chameneosredux

fannkuchredux

fastamandelbrot

nbody

pidigits

spectralnorm

threadring

barnes

decode

hufflength

length_u

lifenrev

orbit_seq

prettypr

qsort

smith

yaws_htm

l

takA

verage

8.30

8.76

BEAM

HiPE

ErLLVM

Erjang − 1st

Erjang − 5th

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 12/16

Page 19: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Runtime Performance - x86

0

1

2

3

4

5

6

7

8

binarytrees

chameneosredux

fannkuchredux

fastamandelbrot

nbody

pidigits

spectralnorm

threadring

barnes

decode

hufflength

length_u

lifenrev

orbit_seq

prettypr

qsort

smith

yaws_htm

l

takA

verage

8.04 9.52

8.41

10.72

8.74

BEAM

HiPE

ErLLVM

Erjang − 1st

Erjang − 5th

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 13/16

Page 20: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Concluding Remarks

Pros:+ Complete & robust: Compiles all Erlang programs (currently

only on x86 and x86_64)+ Fully compatible with HiPE Application Binary Interface

(ABI) ⇒ Supports all Erlang features (e.g. hot-code loading,garbage collection, exception handling).

+ Smaller and simpler code base+ Almost as fast as HiPE+ LLVM developers now work for HiPE!

Cons:− Suboptimal code because of LLVM’s GC infrastructure− More complicated distribution and installation− Higher compilation times and bigger binaries

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 14/16

Page 21: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Future Work

Work on pushing LLVM and HiPE patches upstream!Take advantage of LLVM’s features, such as the Type-BasedAlias Analysis (TBAA) and the use of branch probabilities forbetter block placementExperiment with intra-module optimizations (e.g., inlining)Use LLVM bindings ⇒ faster compilationExtend the LLVM backend to support all six architectures thatHiPE currently supports (e.g., ARM)Push for a decent LLVM GC infrastructure

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 15/16

Page 22: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Thank you!

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 16/16

Page 23: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Spam #1: Extending ErLLVM

Extensions to support currently unsupported HiPE architecturesAdd HiPE’s calling convention in LLVMModify PEI pass to emit HiPE-specific prologue codeExtend hipe_rtl2llvm with target-specific details

Getting more backendsExtend Elang Run-Time System

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 1/3

Page 24: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Spam #2: Binary Code Sizes & Compilation Times

Benchmark suite: the Standard Library (stdlib) and the HiPEcompiler (hipe); comprised of 79 and 196 modules resp.

HiPE ErLLVM HiPE/ErLLVMCode Size (B) 5504880 6625368 0.83Compilation Time (sec) 427.29 547.89 0.78

(a) x86

HiPE ErLLVM HiPE/ErLLVMCode Size (B) 6607584 7915928 0.84Compilation Time (sec) 497.64 541.70 0.92

(b) x86_64

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 2/3

Page 25: ErLLVM: An LLVM Backend for Erlangerllvm.softlab.ntua.gr/files/ErLLVM.pdf · The native code compiler of Erlang Is mature and robust Integrated in Erlang/OTP since 2001 Produces reasonably

Spam #3: A GC example

LLVM code for handling a GC root:

1 fun foo (arg0) { ; ; arg0 i s root2 . . .3 x <− arg0+1; ; ; Last use of arg04 . . .5 }

1 Entry :2 ; ; In the entry block of the function ,3 ; ; a l locate stack space for v i r tua l r eg i s t e r %X.4 %X = al loca i64*56 ; ; Tel l LLVM that the stack space i s a stack root .7 %tmp = bitcast i64** %X to i8**8 ca l l void @llvm . gcroot ( i8** %X, i8* nu l l )9 ; ; Store the ’ n i l ’ value into i t , to indicate that10 ; ; the value i s not l i v e yet . ”−5” i s the tagged11 ; ; representation of ’ n i l ’ .12 store %i64 −5, %64** %X13 . . .14 ; ; ”CodeBlock” i s the block corresponding to the15 ; ; s tar t of the scope of the v i r tua l r eg i s t e r %X.16 CodeBlock :17 store i64 %some_value , i64** %X18 . . .19 ; ; As the pointer goes out of scope , store20 ; ; the ’ n i l ’ value into i t , to indicate that21 ; ; the value i s no longer l i v e .22 store %i64 −5, %64** %X

Y. Tsiouris (SoftLab, NTUA) ErLLVM Erlang Workshop ’12 3/3


Recommended