<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta encoding="utf8">
<link rel="stylesheet" href="llvm.css" type="text/css">
- <title>LLVM 2.4 Release Notes</title>
+ <title>LLVM 2.8 Release Notes</title>
</head>
<body>
-<div class="doc_title">LLVM 2.4 Release Notes</div>
+<div class="doc_title">LLVM 2.8 Release Notes</div>
+
+<img align=right src="http://llvm.org/img/DragonSmall.png"
+ width="136" height="136" alt="LLVM Dragon Logo">
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#subproj">Sub-project Status Update</a></li>
- <li><a href="#whatsnew">What's New in LLVM?</a></li>
+ <li><a href="#externalproj">External Projects Using LLVM 2.8</a></li>
+ <li><a href="#whatsnew">What's New in LLVM 2.8?</a></li>
<li><a href="GettingStarted.html">Installation Instructions</a></li>
- <li><a href="#portability">Portability and Supported Platforms</a></li>
<li><a href="#knownproblems">Known Problems</a></li>
<li><a href="#additionalinfo">Additional Information</a></li>
</ol>
<p>Written by the <a href="http://llvm.org">LLVM Team</a></p>
</div>
+<!--
+<h1 style="color:red">These are in-progress notes for the upcoming LLVM 2.8
+release.<br>
+You may prefer the
+<a href="http://llvm.org/releases/2.7/docs/ReleaseNotes.html">LLVM 2.7
+Release Notes</a>.</h1>
+-->
+
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="intro">Introduction</a>
<div class="doc_text">
<p>This document contains the release notes for the LLVM Compiler
-Infrastructure, release 2.4. Here we describe the status of LLVM, including
+Infrastructure, release 2.8. Here we describe the status of LLVM, including
major improvements from the previous release and significant known problems.
-All LLVM releases may be downloaded from the <a
+All LLVM releases may be downloaded from the <a
href="http://llvm.org/releases/">LLVM releases web site</a>.</p>
<p>For more information about LLVM, including information about the latest
release, please check out the <a href="http://llvm.org/">main LLVM
web site</a>. If you have questions or comments, the <a
-href="http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVM Developer's Mailing
-List</a> is a good place to send them.</p>
+href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVM Developer's
+Mailing List</a> is a good place to send them.</p>
<p>Note that if you are reading this file from a Subversion checkout or the
main LLVM web page, this document applies to the <i>next</i> release, not the
<a href="http://llvm.org/releases/">releases page</a>.</p>
</div>
-
-<!-- Unfinished features in 2.4:
- Machine LICM
- Machine Sinking
- LegalizeDAGTypes
- llc -enable-value-prop, propagation of value info (sign/zero ext info) from
- one MBB to another
+
+
+<!--
+Almost dead code.
+ include/llvm/Analysis/LiveValues.h => Dan
+ lib/Transforms/IPO/MergeFunctions.cpp => consider for 2.8.
+ GEPSplitterPass
+-->
+
+
+<!-- Features that need text if they're finished for 2.9:
+ combiner-aa?
+ strong phi elim
+ loop dependence analysis
+ TBAA
+ CorrelatedValuePropagation
-->
-
- <!-- for announcement email:
- mention dev mtg
- Xcode 3.1 and 3.1.1.
- -->
+
+ <!-- Announcement, lldb, libc++ -->
+
<!-- *********************************************************************** -->
<div class="doc_section">
<div class="doc_text">
<p>
-The LLVM 2.4 distribution currently consists of code from the core LLVM
-repository (which roughly includes the LLVM optimizers, code generators and
-supporting tools) and the llvm-gcc repository. In addition to this code, the
-LLVM Project includes other sub-projects that are in development. The two which
-are the most actively developed are the <a href="#clang">Clang Project</a> and
-the <a href="#vmkit">VMKit Project</a>.
+The LLVM 2.8 distribution currently consists of code from the core LLVM
+repository (which roughly includes the LLVM optimizers, code generators
+and supporting tools), the Clang repository and the llvm-gcc repository. In
+addition to this code, the LLVM Project includes other sub-projects that are in
+development. Here we include updates on these subprojects.
</p>
</div>
<div class="doc_text">
-<p>The <a href="http://clang.llvm.org/">Clang project</a> is an effort to build
-a set of new 'LLVM native' front-end technologies for the LLVM optimizer
-and code generator. Clang is continuing to make major strides forward in all
-areas. Its C and Objective-C parsing support is very solid, and the code
-generation support is far enough along to build many C applications. While not
-yet production quality, it is progressing very nicely. In addition, C++
-front-end work has started to make significant progress.</p>
+<p><a href="http://clang.llvm.org/">Clang</a> is an LLVM front end for the C,
+C++, and Objective-C languages. Clang aims to provide a better user experience
+through expressive diagnostics, a high level of conformance to language
+standards, fast compilation, and low memory use. Like LLVM, Clang provides a
+modular, library-based architecture that makes it suitable for creating or
+integrating with other development tools. Clang is considered a
+production-quality compiler for C, Objective-C, C++ and Objective-C++ on x86
+(32- and 64-bit), and for darwin-arm targets.</p>
+
+<p>In the LLVM 2.8 time-frame, the Clang team has made many improvements:</p>
+
+ <ul>
+ <li>Clang C++ is now feature-complete with respect to the ISO C++ 1998 and 2003 standards.</li>
+ <li>Added support for Objective-C++.</li>
+ <li>Clang now uses LLVM-MC to directly generate object code and to parse inline assembly (on Darwin).</li>
+ <li>Introduced many new warnings, including <code>-Wmissing-field-initializers</code>, <code>-Wshadow</code>, <code>-Wno-protocol</code>, <code>-Wtautological-compare</code>, <code>-Wstrict-selector-match</code>, <code>-Wcast-align</code>, <code>-Wunused</code> improvements, and greatly improved format-string checking.</li>
+ <li>Introduced the "libclang" library, a C interface to Clang intended to support IDE clients.</li>
+ <li>Added support for <code>#pragma GCC visibility</code>, <code>#pragma align</code>, and others.</li>
+ <li>Added support for SSE, AVX, ARM NEON, and AltiVec.</li>
+ <li>Improved support for many Microsoft extensions.</li>
+ <li>Implemented support for blocks in C++.</li>
+ <li>Implemented precompiled headers for C++.</li>
+ <li>Improved abstract syntax trees to retain more accurate source information.</li>
+ <li>Added driver support for handling LLVM IR and bitcode files directly.</li>
+ <li>Major improvements to compiler correctness for exception handling.</li>
+ <li>Improved generated code quality in some areas:
+ <ul>
+ <li>Good code generation for X86-32 and X86-64 ABI handling.</li>
+ <li>Improved code generation for bit-fields, although important work remains.</li>
+ </ul>
+ </li>
+ </ul>
+</div>
-<p>Clang, in conjunction with the <tt>ccc</tt> driver, is now usable as a
-replacement for gcc for building some small- to medium-sized C applications.
-Additionally, Clang now has code generation support for Objective-C on Mac OS X
-platform. Major highlights include:</p>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="clangsa">Clang Static Analyzer</a>
+</div>
-<ul>
- <li> Clang/ccc pass almost all of the LLVM test suite on Mac OS X and Linux
-on the 32-bit x86 architecture. This includes significant C
-applications such as <a href="http://www.sqlite.org">sqlite3</a>,
-<a href="http://www.lua.org">lua</a>, and
-<a href="http://www.clamav.net">Clam AntiVirus</a>. </li>
-
- <li> Clang can build the majority of Objective-C examples shipped with the
-Mac OS X Developer Tools. </li>
-</ul>
+<div class="doc_text">
-<p>Clang code generation still needs considerable testing and development,
-however. Some areas under active development include:</p>
+<p>The <a href="http://clang-analyzer.llvm.org/">Clang Static Analyzer</a>
+ project is an effort to use static source code analysis techniques to
+ automatically find bugs in C and Objective-C programs (and hopefully <a
+ href="http://clang-analyzer.llvm.org/dev_cxx.html">C++ in the
+ future</a>!). The tool is very good at finding bugs that occur on specific
+ paths through code, such as on error conditions.</p>
+
+<p>The LLVM 2.8 release fixes a number of bugs and slightly improves precision
+ over 2.7, but there are no major new features in the release.
+</p>
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="dragonegg">DragonEgg: llvm-gcc ported to gcc-4.5</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://dragonegg.llvm.org/">DragonEgg</a> is a port of llvm-gcc to
+gcc-4.5. Unlike llvm-gcc, dragonegg in theory does not require any gcc-4.5
+modifications whatsoever (currently one small patch is needed) thanks to the
+new <a href="http://gcc.gnu.org/wiki/plugins">gcc plugin architecture</a>.
+DragonEgg is a gcc plugin that makes gcc-4.5 use the LLVM optimizers and code
+generators instead of gcc's, just like with llvm-gcc.
+</p>
+
+<p>
+DragonEgg is still a work in progress, but it is able to compile a lot of code,
+for example all of gcc, LLVM and clang. Currently Ada, C, C++ and Fortran work
+well, while all other languages either don't work at all or only work poorly.
+For the moment only the x86-32 and x86-64 targets are supported, and only on
+linux and darwin (darwin may need additional gcc patches).
+</p>
+
+<p>
+The 2.8 release has the following notable changes:
<ul>
- <li> Improved support for C and Objective-C features, for example
- variable-length arrays, va_arg, exception handling (Obj-C), and garbage
- collection (Obj-C). </li>
- <li> ABI compatibility, especially for platforms other than 32-bit
- x86. </li>
+<li>The plugin loads faster due to exporting fewer symbols.</li>
+<li>Additional vector operations such as addps256 are now supported.</li>
+<li>Ada global variables with no initial value are no longer zero initialized,
+resulting in better optimization.</li>
+<li>The '-fplugin-arg-dragonegg-enable-gcc-optzns' flag now runs all gcc
+optimizers, rather than just a handful.</li>
+<li>Fortran programs using common variables now link correctly.</li>
+<li>GNU OMP constructs no longer crash the compiler.</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="clangsa">Clang Static Analyzer</a>
+<a name="vmkit">VMKit: JVM/CLI Virtual Machine Implementation</a>
+</div>
+
+<div class="doc_text">
+<p>
+The <a href="http://vmkit.llvm.org/">VMKit project</a> is an implementation of
+a Java Virtual Machine (Java VM or JVM) that uses LLVM for static and
+just-in-time compilation. As of LLVM 2.8, VMKit now supports copying garbage
+collectors, and can be configured to use MMTk's copy mark-sweep garbage
+collector. In LLVM 2.8, the VMKit .NET VM is no longer being maintained.
+</p>
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="compiler-rt">compiler-rt: Compiler Runtime Library</a>
</div>
<div class="doc_text">
+<p>
+The new LLVM <a href="http://compiler-rt.llvm.org/">compiler-rt project</a>
+is a simple library that provides an implementation of the low-level
+target-specific hooks required by code generation and other runtime components.
+For example, when compiling for a 32-bit target, converting a double to a 64-bit
+unsigned integer is compiled into a runtime call to the "__fixunsdfdi"
+function. The compiler-rt library provides highly optimized implementations of
+this and other low-level routines (some are 3x faster than the equivalent
+libgcc routines).</p>
-<p>The Clang project also includes an early stage static source code analysis
-tool for <a href="http://clang.llvm.org/StaticAnalysis.html">automatically
-finding bugs</a> in C and Objective-C programs. The tool performs a growing set
-of checks to find bugs that occur on a specific path within a program. Examples
-of bugs the tool finds include logic errors such as null dereferences,
-violations of various API rules, dead code, and potential memory leaks in
-Objective-C programs. Since its inception, public feedback on the tool has been
-extremely positive, and conservative estimates put the number of real bugs it
-has found in industrial-quality software on the order of thousands.</p>
+<p>
+All of the code in the compiler-rt project is available under the standard LLVM
+License, a "BSD-style" license. New in LLVM 2.8, compiler_rt now supports
+soft floating point (for targets that don't have a real floating point unit),
+and includes an extensive testsuite for the "blocks" language feature and the
+blocks runtime included in compiler_rt.</p>
-<p>The tool also provides a simple web GUI to inspect potential bugs found by
-the tool. While still early in development, the GUI illustrates some of the key
-features of Clang: accurate source location information, which is used by the
-GUI to highlight specific code expressions that relate to a bug (including those
-that span multiple lines); and built-in knowledge of macros, which is used to
-perform inline expansion of macros within the GUI itself.</p>
+</div>
-<p>The set of checks performed by the static analyzer is gradually expanding,
-and future plans for the tool include full source-level inter-procedural
-analysis and deeper checks such as buffer overrun detection. There are many
-opportunities to extend and enhance the static analyzer, and anyone interested
-in working on this project is encouraged to get involved!</p>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="lldb">LLDB: Low Level Debugger</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://lldb.llvm.org/">LLDB</a> is a brand new member of the LLVM
+umbrella of projects. LLDB is a next generation, high-performance debugger. It
+is built as a set of reusable components which highly leverage existing
+libraries in the larger LLVM Project, such as the Clang expression parser, the
+LLVM disassembler and the LLVM JIT.</p>
+
+<p>
+LLDB is in early development and not included as part of the LLVM 2.8 release,
+but is mature enough to support basic debugging scenarios on Mac OS X in C,
+Objective-C and C++. We'd really like help extending and expanding LLDB to
+support new platforms, new languages, new architectures, and new features.
+</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="vmkit">VMKit: JVM/CLI Virtual Machine Implementation</a>
+<a name="libc++">libc++: C++ Standard Library</a>
</div>
<div class="doc_text">
<p>
-The <a href="http://vmkit.llvm.org/">VMKit project</a> is an implementation of
-a JVM and a CLI Virtual Machines (Microsoft .NET is an
-implementation of the CLI) using the Just-In-Time compiler of LLVM.</p>
+<a href="http://libcxx.llvm.org/">libc++</a> is another new member of the LLVM
+family. It is an implementation of the C++ standard library, written from the
+ground up to specifically target the forthcoming C++'0X standard and focus on
+delivering great performance.</p>
-<p>Following LLVM 2.4, VMKit has its first release 0.24 that you can find on its
-<a href="http://vmkit.llvm.org/releases/">webpage</a>. The release includes
-bug fixes, cleanup and new features. The major changes are:</p>
+<p>
+As of the LLVM 2.8 release, libc++ is virtually feature complete, but would
+benefit from more testing and better integration with Clang++. It is also
+looking forward to the C++ committee finalizing the C++'0x standard.
+</p>
-<ul>
+</div>
+
+
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="klee">KLEE: A Symbolic Execution Virtual Machine</a>
+</div>
-<li> Support for generics in the .Net virtual machine.</li>
-<li> Initial support for the Mono class libraries. </li>
-<li> Support for MacOSX/x86, following LLVM's support for exceptions in
-JIT on MacOSX/x86. </li>
-<li> A new vmkit driver: a program to run java or .net applications. The driver
-supports llvm command line arguments including the new "-fast" option. </li>
-<li> A new memory allocation scheme in the JVM that makes unloading a
-class loader very fast. </li>
-<li> VMKit now follows the LLVM Makefile machinery. </li>
+<div class="doc_text">
+<p>
+<a href="http://klee.llvm.org/">KLEE</a> is a symbolic execution framework for
+programs in LLVM bitcode form. KLEE tries to symbolically evaluate "all" paths
+through the application and records state transitions that lead to fault
+states. This allows it to construct testcases that lead to faults and can even
+be used to verify some algorithms.
+</p>
+<p>Although KLEE does not have any major new features as of 2.8, we have made
+various minor improvements, particular to ease development:</p>
+<ul>
+ <li>Added support for LLVM 2.8. KLEE currently maintains compatibility with
+ LLVM 2.6, 2.7, and 2.8.</li>
+ <li>Added a buildbot for 2.6, 2.7, and trunk. A 2.8 buildbot will be coming
+ soon following release.</li>
+ <li>Fixed many C++ code issues to allow building with Clang++. Mostly
+ complete, except for the version of MiniSAT which is inside the KLEE STP
+ version.</li>
+ <li>Improved support for building with separate source and build
+ directories.</li>
+ <li>Added support for "long double" on x86.</li>
+ <li>Initial work on KLEE support for using 'lit' test runner instead of
+ DejaGNU.</li>
+ <li>Added <tt>configure</tt> support for using an external version of
+ STP.</li>
</ul>
+
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
- <a name="whatsnew">What's New in LLVM?</a>
+ <a name="externalproj">External Open Source Projects Using LLVM 2.8</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
-<p>This release includes a huge number of bug fixes, performance tweaks, and
-minor improvements. Some of the major improvements and new features are listed
-in this section.
+<p>An exciting aspect of LLVM is that it is used as an enabling technology for
+ a lot of other language and tools projects. This section lists some of the
+ projects that have already been updated to work with LLVM 2.8.</p>
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="tce">TTA-based Codesign Environment (TCE)</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://tce.cs.tut.fi/">TCE</a> is a toolset for designing
+application-specific processors (ASP) based on the Transport triggered
+architecture (TTA). The toolset provides a complete co-design flow from C/C++
+programs down to synthesizable VHDL and parallel program binaries. Processor
+customization points include the register files, function units, supported
+operations, and the interconnection network.</p>
+
+<p>TCE uses llvm-gcc/Clang and LLVM for C/C++ language support, target
+independent optimizations and also for parts of code generation. It generates
+new LLVM-based code generators "on the fly" for the designed TTA processors and
+loads them in to the compiler backend as runtime libraries to avoid per-target
+recompilation of larger parts of the compiler chain.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="Horizon">Horizon Bytecode Compiler</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://www.quokforge.org/projects/horizon">Horizon</a> is a bytecode
+language and compiler written on top of LLVM, intended for producing
+single-address-space managed code operating systems that
+run faster than the equivalent multiple-address-space C systems.
+More in-depth blurb is available on the <a
+href="http://www.quokforge.org/projects/horizon/wiki/Wiki">wiki</a>.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="clamav">Clam AntiVirus</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://www.clamav.net">Clam AntiVirus</a> is an open source (GPL)
+anti-virus toolkit for UNIX, designed especially for e-mail scanning on mail
+gateways. Since version 0.96 it has <a
+href="http://vrt-sourcefire.blogspot.com/2010/09/introduction-to-clamavs-low-level.html">bytecode
+signatures</a> that allow writing detections for complex malware. It
+uses LLVM's JIT to speed up the execution of bytecode on
+X86, X86-64, PPC32/64, falling back to its own interpreter otherwise.
+The git version was updated to work with LLVM 2.8.
</p>
+
+<p>The <a
+href="http://git.clamav.net/gitweb?p=clamav-bytecode-compiler.git;a=blob_plain;f=docs/user/clambc-user.pdf">
+ClamAV bytecode compiler</a> uses Clang and LLVM to compile a C-like
+language, insert runtime checks, and generate ClamAV bytecode.</p>
+
</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="majorfeatures">Major New Features</a>
+<a name="pure">Pure</a>
</div>
<div class="doc_text">
+<p>
+<a href="http://pure-lang.googlecode.com/">Pure</a>
+is an algebraic/functional
+programming language based on term rewriting. Programs are collections
+of equations which are used to evaluate expressions in a symbolic
+fashion. Pure offers dynamic typing, eager and lazy evaluation, lexical
+closures, a hygienic macro system (also based on term rewriting),
+built-in list and matrix support (including list and matrix
+comprehensions) and an easy-to-use C interface. The interpreter uses
+LLVM as a backend to JIT-compile Pure programs to fast native code.</p>
+
+<p>Pure versions 0.44 and later have been tested and are known to work with
+LLVM 2.8 (and continue to work with older LLVM releases >= 2.5).</p>
-<p>LLVM 2.4 includes several major new capabilities:</p>
+</div>
-<ul>
-<li><p>The most visible end-user change in LLVM 2.4 is that it includes many
-optimizations and changes to make -O0 compile times much faster. You should see
-improvements in speed on the order of 30% (or more) than in LLVM 2.3. There are
-many pieces to this change described in more detail below. The speedups and new
-components can also be used for JIT compilers that want fast
-compilation.</p></li>
-
-<li><p>The biggest change to the LLVM IR is that Multiple Return Values (which
-were introduced in LLVM 2.3) have been generalized to full support for "First
-Class Aggregate" values in LLVM 2.4. This means that LLVM IR supports using
-structs and arrays as values in a function. This capability is mostly useful
-for front-end authors, who prefer to treat things like complex numbers, simple
-tuples, dope vectors, etc., as Value*'s instead of as a tuple of Value*'s or as
-memory values. Bitcode files from LLVM 2.3 will automatically migrate to the
-general representation.</p></li>
-
-<li><p>LLVM 2.4 also includes an initial port for the PIC16 microprocessor. This
-target only has support for 8 bit registers, and a number of other crazy
-constraints. While the port is still in early development stages, it shows some
-interesting things you can do with LLVM.</p></li>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="GHC">Glasgow Haskell Compiler (GHC)</a>
+</div>
-</ul>
+<div class="doc_text">
+<p>
+<a href="http://www.haskell.org/ghc/">GHC</a> is an open source,
+state-of-the-art programming suite for
+Haskell, a standard lazy functional programming language. It includes
+an optimizing static compiler generating good code for a variety of
+platforms, together with an interactive system for convenient, quick
+development.</p>
+
+<p>In addition to the existing C and native code generators, GHC 7.0 now
+supports an <a
+href="http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/Backends/LLVM">LLVM
+code generator</a>. GHC supports LLVM 2.7 and later.</p>
+
+</div>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="Clay">Clay Programming Language</a>
</div>
+<div class="doc_text">
+<p>
+<a href="http://tachyon.in/clay/">Clay</a> is a new systems programming
+language that is specifically designed for generic programming. It makes
+generic programming very concise thanks to whole program type propagation. It
+uses LLVM as its backend.</p>
+
+</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="llvm-gcc">llvm-gcc 4.2 Improvements</a>
+<a name="llvm-py">llvm-py Python Bindings for LLVM</a>
</div>
<div class="doc_text">
+<p>
+<a href="http://www.mdevan.org/llvm-py/">llvm-py</a> has been updated to work
+with LLVM 2.8. llvm-py provides Python bindings for LLVM, allowing you to write a
+compiler backend or a VM in Python.</p>
-<p>LLVM fully supports the llvm-gcc 4.2 front-end, which marries the GCC
-front-ends and driver with the LLVM optimizer and code generator. It currently
-includes support for the C, C++, Objective-C, Ada, and Fortran front-ends.</p>
+</div>
+
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="FAUST">FAUST Real-Time Audio Signal Processing Language</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://faust.grame.fr">FAUST</a> is a compiled language for real-time
+audio signal processing. The name FAUST stands for Functional AUdio STream. Its
+programming model combines two approaches: functional programming and block
+diagram composition. In addition with the C, C++, JAVA output formats, the
+Faust compiler can now generate LLVM bitcode, and works with LLVM 2.7 and
+2.8.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="jade">Jade Just-in-time Adaptive Decoder Engine</a>
+</div>
+
+<div class="doc_text">
+<p><a
+href="http://sourceforge.net/apps/trac/orcc/wiki/JadeDocumentation">Jade</a>
+(Just-in-time Adaptive Decoder Engine) is a generic video decoder engine using
+LLVM for just-in-time compilation of video decoder configurations. Those
+configurations are designed by MPEG Reconfigurable Video Coding (RVC) committee.
+MPEG RVC standard is built on a stream-based dataflow representation of
+decoders. It is composed of a standard library of coding tools written in
+RVC-CAL language and a dataflow configuration — block diagram —
+of a decoder.</p>
+
+<p>Jade project is hosted as part of the <a href="http://orcc.sf.net">Open
+RVC-CAL Compiler</a> and requires it to translate the RVC-CAL standard library
+of video coding tools into an LLVM assembly code.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="neko_llvm_jit">LLVM JIT for Neko VM</a>
+</div>
+
+<div class="doc_text">
+<p><a href="http://github.com/vava/neko_llvm_jit">Neko LLVM JIT</a>
+replaces the standard Neko JIT with an LLVM-based implementation. While not
+fully complete, it is already providing a 1.5x speedup on 64-bit systems.
+Neko LLVM JIT requires LLVM 2.8 or later.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="crack">Crack Scripting Language</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://code.google.com/p/crack-language/">Crack</a> aims to provide
+the ease of development of a scripting language with the performance of a
+compiled language. The language derives concepts from C++, Java and Python,
+incorporating object-oriented programming, operator overloading and strong
+typing. Crack 0.2 works with LLVM 2.7, and the forthcoming Crack 0.2.1 release
+builds on LLVM 2.8.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="DresdenTM">Dresden TM Compiler (DTMC)</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://tm.inf.tu-dresden.de">DTMC</a> provides support for
+Transactional Memory, which is an easy-to-use and efficient way to synchronize
+accesses to shared memory. Transactions can contain normal C/C++ code (e.g.,
+<code>__transaction { list.remove(x); x.refCount--; }</code>) and will be executed
+virtually atomically and isolated from other transactions.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="Kai">Kai Programming Language</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://www.oriontransfer.co.nz/research/kai">Kai</a> (Japanese 会 for
+meeting/gathering) is an experimental interpreter that provides a highly
+extensible runtime environment and explicit control over the compilation
+process. Programs are defined using nested symbolic expressions, which are all
+parsed into first-class values with minimal intrinsic semantics. Kai can
+generate optimised code at run-time (using LLVM) in order to exploit the nature
+of the underlying hardware and to integrate with external software libraries.
+It is a unique exploration into world of dynamic code compilation, and the
+interaction between high level and low level semantics.</p>
+
+</div>
+
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="OSL">OSL: Open Shading Language</a>
+</div>
+
+<div class="doc_text">
+<p>
+<a href="http://code.google.com/p/openshadinglanguage/">OSL</a> is a shading
+language designed for use in physically based renderers and in particular
+production rendering. By using LLVM instead of the interpreter, it was able to
+meet its performance goals (>= C-code) while retaining the benefits of
+runtime specialization and a portable high-level language.
+</p>
+
+</div>
-<ul>
-<li>LLVM 2.4 supports the full set of atomic <tt>__sync_*</tt> builtins. LLVM
-2.3 only supported those used by OpenMP, but 2.4 supports them all. Note that
-while llvm-gcc supports all of these builtins, not all targets do. X86 support
-them all in both 32-bit and 64-bit mode and PowerPC supports them all except for
-the 64-bit operations when in 32-bit mode.</li>
-
-<li>llvm-gcc now supports an <tt>-flimited-precision</tt> option, which tells
-the compiler that it is okay to use low-precision approximations of certain libm
-functions (like <tt>exp</tt>, <tt>log</tt>, etc). This allows you to get high
-performance if you only need (say) 12-bits of precision.</li>
-
-<li>llvm-gcc now supports a C language extension known as "<a
-href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html">Blocks</a>".
-This feature is similar to nested functions and closures, but does not
-require stack trampolines (with most ABIs), and supports returning closures
-from functions that define them. Note that actually <em>using</em> Blocks
-requires a small runtime that is not included with llvm-gcc.</li>
-
-<li>llvm-gcc now supports a new <tt>-flto</tt> option. On systems that support
-transparent Link Time Optimization (currently Darwin systems with Xcode 3.1 and
-later) this allows the use of LTO with other optimization levels like -Os.
-Previously, LTO could only be used with -O4, which implied optimizations in
--O3 that can increase code size.</li>
-</ul>
+
+<!-- *********************************************************************** -->
+<div class="doc_section">
+ <a name="whatsnew">What's New in LLVM 2.8?</a>
</div>
+<!-- *********************************************************************** -->
+
+<div class="doc_text">
+<p>This release includes a huge number of bug fixes, performance tweaks and
+minor improvements. Some of the major improvements and new features are listed
+in this section.
+</p>
+
+</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="coreimprovements">LLVM Core Improvements</a>
+<a name="majorfeatures">Major New Features</a>
</div>
<div class="doc_text">
-<p>New features include:</p>
+
+<p>LLVM 2.8 includes several major new capabilities:</p>
<ul>
-<li>A major change to the <tt>Use</tt> class landed, which shrank it by 25%. Since
-this is a pervasive part of the LLVM, it ended up reducing the memory use of
-LLVM IR in general by 15% for most programs.</li>
+<li>As mentioned above, <a href="#libc++">libc++</a> and <a
+ href="#lldb">LLDB</a> are major new additions to the LLVM collective.</li>
+<li>LLVM 2.8 now has pretty decent support for debugging optimized code. You
+ should be able to reliably get debug info for function arguments, assuming
+ that the value is actually available where you have stopped.</li>
+<li>A new 'llvm-diff' tool is available that does a semantic diff of .ll
+ files.</li>
+<li>The <a href="#mc">MC subproject</a> has made major progress in this release.
+ Direct .o file writing support for darwin/x86[-64] is now reliable and
+ support for other targets and object file formats are in progress.</li>
+</ul>
-<li>Values with no names are now pretty printed by <tt>llvm-dis</tt> more
-nicely. They now print as "<tt>%3 = add i32 %A, 4</tt>" instead of
-"<tt>add i32 %A, 4 ; <i32>:3</tt>", which makes it much easier to read.
-</li>
+</div>
-<li>LLVM 2.4 includes some changes for better vector support. First, the shift
-operations (<tt>shl</tt>, <tt>ashr</tt>, and <tt>lshr</tt>) now all support
-vectors and do an element-by-element shift (shifts of the whole vector can be
-accomplished by bitcasting the vector to <1 x i128>, for example). Second,
-there is initial support in development for vector comparisons with the
-<tt><a href="LangRef.html#i_fcmp">fcmp</a>/<a href="LangRef.html#i_icmp">icmp</a></tt>
-instructions. These instructions compare two vectors and return a vector of
-<tt>i1</tt>'s for each result. Note that there is very little codegen support
-available for any of these IR features though.</li>
-
-<li>A new <tt>DebugInfoBuilder</tt> class is available, which makes it much
-easier for front-ends to create debug info descriptors, similar to the way that
-<tt>IRBuilder</tt> makes it easier to create LLVM IR.</li>
-
-<li>The <tt>IRBuilder</tt> class is now parameterized by a class responsible
-for constant folding. The default <tt>ConstantFolder</tt> class does target independent
-constant folding. The <tt>NoFolder</tt> class does no constant folding at all, which is
-useful when learning how LLVM works. The <tt>TargetFolder</tt> class folds the most,
-doing target dependent constant folding.</li>
-
-<li>LLVM now supports "function attributes", which allow us to separate return
-value attributes from function attributes. LLVM now supports attributes on a
-function itself, a return value, and its parameters. New supported function
-attributes include <tt>noinline/alwaysinline</tt> and the <tt>opt-size</tt> flag,
-which says the function should be optimized for code size.</li>
-
-<li>LLVM IR now directly represents "common" linkage, instead of
- representing it as a form of weak linkage.</li>
-
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="coreimprovements">LLVM IR and Core Improvements</a>
+</div>
+
+<div class="doc_text">
+<p>LLVM IR has several new features for better support of new targets and that
+expose new optimization opportunities:</p>
+
+<ul>
+<li>The <a href="LangRef.html#int_libc">memcpy, memmove, and memset</a>
+ intrinsics now take address space qualified pointers and a bit to indicate
+ whether the transfer is "<a href="LangRef.html#volatile">volatile</a>" or not.
+</li>
+<li>Per-instruction debug info metadata is much faster and uses less memory by
+ using the new DebugLoc class.</li>
+<li>LLVM IR now has a more formalized concept of "<a
+ href="LangRef.html#trapvalues">trap values</a>", which allow the optimizer
+ to optimize more aggressively in the presence of undefined behavior, while
+ still producing predictable results.</li>
+<li>LLVM IR now supports two new <a href="LangRef.html#linkage">linkage
+ types</a> (linker_private_weak and linker_private_weak_def_auto) which map
+ onto some obscure MachO concepts.</li>
</ul>
</div>
<div class="doc_text">
-<p>In addition to a huge array of bug fixes and minor performance tweaks, this
+<p>In addition to a large array of minor performance tweaks and bug fixes, this
release includes a few major enhancements and additions to the optimizers:</p>
<ul>
+<li>As mentioned above, the optimizer now has support for updating debug
+ information as it goes. A key aspect of this is the new <a
+ href="SourceLevelDebugging.html#format_common_value">llvm.dbg.value</a>
+ intrinsic. This intrinsic represents debug info for variables that are
+ promoted to SSA values (typically by mem2reg or the -scalarrepl passes).</li>
+
+<li>The JumpThreading pass is now much more aggressive about implied value
+ relations, allowing it to thread conditions like "a == 4" when a is known to
+ be 13 in one of the predecessors of a block. It does this in conjunction
+ with the new LazyValueInfo analysis pass.</li>
+<li>The new RegionInfo analysis pass identifies single-entry single-exit regions
+ in the CFG. You can play with it with the "opt -regions -analyze" or
+ "opt -view-regions" commands.</li>
+<li>The loop optimizer has significantly improved strength reduction and analysis
+ capabilities. Notably it is able to build on the trap value and signed
+ integer overflow information to optimize <= and >= loops.</li>
+<li>The CallGraphSCCPassManager now has some basic support for iterating within
+ an SCC when a optimizer devirtualizes a function call. This allows inlining
+ through indirect call sites that are devirtualized by store-load forwarding
+ and other optimizations.</li>
+<li>The new <A href="Passes.html#loweratomic">-loweratomic</a> pass is available
+ to lower atomic instructions into their non-atomic form. This can be useful
+ to optimize generic code that expects to run in a single-threaded
+ environment.</li>
+</ul>
-<li>The Global Value Numbering (GVN) pass now does local Partial Redundancy
-Elimination (PRE) to eliminate some partially redundant expressions in cases
-where doing so won't grow code size.</li>
+<!--
+<p>In addition to these features that are done in 2.8, there is preliminary
+ support in the release for Type Based Alias Analysis
+ Preliminary work on TBAA but not usable in 2.8.
+ New CorrelatedValuePropagation pass, not on by default in 2.8 yet.
+-->
-<li>LLVM 2.4 includes a new loop deletion pass (which removes output-free
-provably-finite loops) and a rewritten Aggressive Dead Code Elimination (ADCE)
-pass that no longer uses control dependence information. These changes speed up
-the optimizer and also prevent it from deleting output-free infinite
-loops.</li>
+</div>
-<li>The new AddReadAttrs pass works out which functions are read-only or
-read-none (these correspond to 'pure' and 'const' in GCC) and marks them
-with the appropriate attribute.</li>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="mc">MC Level Improvements</a>
+</div>
-<li>LLVM 2.4 now includes a new SparsePropagation framework, which makes it
-trivial to build lattice-based dataflow solvers that operate over LLVM IR. Using
-this interface means that you just define objects to represent your lattice
-values and the transfer functions that operate on them. It handles the
-mechanics of worklist processing, liveness tracking, handling PHI nodes,
-etc.</li>
+<div class="doc_text">
+<p>
+The LLVM Machine Code (aka MC) subsystem was created to solve a number
+of problems in the realm of assembly, disassembly, object file format handling,
+and a number of other related areas that CPU instruction-set level tools work
+in.</p>
-<li>The Loop Strength Reduction and induction variable optimization passes have
-several improvements to avoid inserting MAX expressions, to optimize simple
-floating point induction variables and to analyze trip counts of more
-loops.</li>
+<p>The MC subproject has made great leaps in LLVM 2.8. For example, support for
+ directly writing .o files from LLC (and clang) now works reliably for
+ darwin/x86[-64] (including inline assembly support) and the integrated
+ assembler is turned on by default in Clang for these targets. This provides
+ improved compile times among other things.</p>
-<li>Various helper functions (ComputeMaskedBits, ComputeNumSignBits, etc) were
-pulled out of the Instruction Combining pass and put into a new
-<tt>ValueTracking.h</tt> header, where they can be reused by other passes.</li>
+<ul>
+<li>The entire compiler has converted over to using the MCStreamer assembler API
+ instead of writing out a .s file textually.</li>
+<li>The "assembler parser" is far more mature than in 2.7, supporting a full
+ complement of directives, now supports assembler macros, etc.</li>
+<li>The "assembler backend" has been completed, including support for relaxation
+ relocation processing and all the other things that an assembler does.</li>
+<li>The MachO file format support is now fully functional and works.</li>
+<li>The MC disassembler now fully supports ARM and Thumb. ARM assembler support
+ is still in early development though.</li>
+<li>The X86 MC assembler now supports the X86 AES and AVX instruction set.</li>
+<li>Work on ELF and COFF object files and ARM target support is well underway,
+ but isn't useful yet in LLVM 2.8. Please contact the llvmdev mailing list
+ if you're interested in this.</li>
+</ul>
-<li>The tail duplication pass has been removed from the standard optimizer
-sequence used by llvm-gcc. This pass still exists, but the benefits it once
-provided are now achieved by other passes.</li>
+<p>For more information, please see the <a
+href="http://blog.llvm.org/2010/04/intro-to-llvm-mc-project.html">Intro to the
+LLVM MC Project Blog Post</a>.
+</p>
-</ul>
+</div>
-</div>
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="codegen">Code Generator Improvements</a>
+<a name="codegen">Target Independent Code Generator Improvements</a>
</div>
<div class="doc_text">
-<p>We have put a significant amount of work into the code generator infrastructure,
-which allows us to implement more aggressive algorithms and make it run
-faster:</p>
+<p>We have put a significant amount of work into the code generator
+infrastructure, which allows us to implement more aggressive algorithms and make
+it run faster:</p>
<ul>
-<li>The target-independent code generator supports (and the X86 backend
- currently implements) a new interface for "fast" instruction selection. This
- interface is optimized to produce code as quickly as possible, sacrificing
- code quality to do it. This is used by default at -O0 or when using
- "llc -fast" on X86. It is straight-forward to add support for
- other targets if faster -O0 compilation is desired.</li>
-
-<li>In addition to the new 'fast' instruction selection path, many existing
- pieces of the code generator have been optimized in significant ways.
- SelectionDAG's are now pool allocated and use better algorithms in many
- places, the ".s" file printers now use <tt>raw_ostream</tt> to emit text much faster,
- etc. The end result of these improvements is that the compiler also takes
- substantially less time to generate code that is just as good (and often
- better) than before.</li>
-
-<li>Each target has been split to separate the ".s" file printing logic from the
- rest of the target. This enables JIT compilers that don't link in the
- (somewhat large) code and data tables used for printing a ".s" file.</li>
-
-<li>The code generator now includes a "stack slot coloring" pass, which packs
- together individual spilled values into common stack slots. This reduces
- the size of stack frames with many spills, which tends to increase L1 cache
- effectiveness.</li>
-
-<li>Various pieces of the register allocator (e.g. the coalescer and two-address
- operation elimination pass) now know how to rematerialize trivial operations
- to avoid copies and include several other optimizations.</li>
-
-<li>The <a href="CodeGenerator.html#selectiondag_process">graphs</a> produced by
- the <tt>llc -view-*-dags</tt> options are now significantly prettier and
- easier to read.</li>
-
-<li>LLVM 2.4 includes a new register allocator based on Partitioned Boolean
- Quadratic Programming (PBQP). This register allocator is still in
- development, but is very simple and clean.</li>
+<li>The clang/gcc -momit-leaf-frame-pointer argument is now supported.</li>
+<li>The clang/gcc -ffunction-sections and -fdata-sections arguments are now
+ supported on ELF targets (like GCC).</li>
+<li>The MachineCSE pass is now tuned and on by default. It eliminates common
+ subexpressions that are exposed when lowering to machine instructions.</li>
+<li>The "local" register allocator was replaced by a new "fast" register
+ allocator. This new allocator (which is often used at -O0) is substantially
+ faster and produces better code than the old local register allocator.</li>
+<li>A new LLC "-regalloc=default" option is available, which automatically
+ chooses a register allocator based on the -O optimization level.</li>
+<li>The common code generator code was modified to promote illegal argument and
+ return value vectors to wider ones when possible instead of scalarizing
+ them. For example, <3 x float> will now pass in one SSE register
+ instead of 3 on X86. This generates substantially better code since the
+ rest of the code generator was already expecting this.</li>
+<li>The code generator uses a new "COPY" machine instruction. This speeds up
+ the code generator and eliminates the need for targets to implement the
+ isMoveInstr hook. Also, the copyRegToReg hook was renamed to copyPhysReg
+ and simplified.</li>
+<li>The code generator now has a "LocalStackSlotPass", which optimizes stack
+ slot access for targets (like ARM) that have limited stack displacement
+ addressing.</li>
+<li>A new "PeepholeOptimizer" is available, which eliminates sign and zero
+ extends, and optimizes away compare instructions when the condition result
+ is available from a previous instruction.</li>
+<li>Atomic operations now get legalized into simpler atomic operations if not
+ natively supported, easing the implementation burden on targets.</li>
+<li>We have added two new bottom-up pre-allocation register pressure aware schedulers:
+<ol>
+<li>The hybrid scheduler schedules aggressively to minimize schedule length when registers are available and avoid overscheduling in high pressure situations.</li>
+<li>The instruction-level-parallelism scheduler schedules for maximum ILP when registers are available and avoid overscheduling in high pressure situations.</li>
+</ol></li>
+<li>The tblgen type inference algorithm was rewritten to be more consistent and
+ diagnose more target bugs. If you have an out-of-tree backend, you may
+ find that it finds bugs in your target description. This support also
+ allows limited support for writing patterns for instructions that return
+ multiple results (e.g. a virtual register and a flag result). The
+ 'parallel' modifier in tblgen was removed, you should use the new support
+ for multiple results instead.</li>
+<li>A new (experimental) "-rendermf" pass is available which renders a
+ MachineFunction into HTML, showing live ranges and other useful
+ details.</li>
+<li>The new SubRegIndex tablegen class allows subregisters to be indexed
+ symbolically instead of numerically. If your target uses subregisters you
+ will need to adapt to use SubRegIndex when you upgrade to 2.8.</li>
+<!-- SplitKit -->
+
+<li>The -fast-isel instruction selection path (used at -O0 on X86) was rewritten
+ to work bottom-up on basic blocks instead of top down. This makes it
+ slightly faster (because the MachineDCE pass is not needed any longer) and
+ allows it to generate better code in some cases.</li>
</ul>
-
</div>
-
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="targetspecific">Target Specific Improvements</a>
+<a name="x86">X86-32 and X86-64 Target Improvements</a>
</div>
<div class="doc_text">
-<p>New target-specific features include:
+<p>New features and major changes in the X86 target include:
</p>
<ul>
-<li>Exception handling is supported by default on Linux/x86-64.</li>
-<li>Position Independent Code (PIC) is now supported on Linux/x86-64.</li>
-<li><tt>@llvm.frameaddress</tt> now supports getting the frame address of stack frames
- > 0 on x86/x86-64.</li>
-<li>MIPS has improved a lot since last release, the most important changes
- are: Little endian support, floating point support, allegrex core and
- intrinsics support. O32 ABI is improved but isn't complete. The EABI
- was implemented and is fully supported. We also have support for small
- sections and gp_rel relocation for its access, a threshold in bytes can be
- specified through command line.</li>
-<li>The PowerPC backend now supports trampolines.</li>
+<li>The X86 backend now supports holding X87 floating point stack values
+ in registers across basic blocks, dramatically improving performance of code
+ that uses long double, and when targeting CPUs that don't support SSE.</li>
+
+<li>The X86 backend now uses a SSEDomainFix pass to optimize SSE operations. On
+ Nehalem ("Core i7") and newer CPUs there is a 2 cycle latency penalty on
+ using a register in a different domain than where it was defined. This pass
+ optimizes away these stalls.</li>
+
+<li>The X86 backend now promotes 16-bit integer operations to 32-bits when
+ possible. This avoids 0x66 prefixes, which are slow on some
+ microarchitectures and bloat the code on all of them.</li>
+
+<li>The X86 backend now supports the Microsoft "thiscall" calling convention,
+ and a <a href="LangRef.html#callingconv">calling convention</a> to support
+ <a href="#GHC">ghc</a>.</li>
+
+<li>The X86 backend supports a new "llvm.x86.int" intrinsic, which maps onto
+ the X86 "int $42" and "int3" instructions.</li>
+
+<li>At the IR level, the <2 x float> datatype is now promoted and passed
+ around as a <4 x float> instead of being passed and returned as an MMX
+ vector. If you have a frontend that uses this, please pass and return a
+ <2 x i32> instead (using bitcasts).</li>
+
+<li>When printing .s files in verbose assembly mode (the default for clang -S),
+ the X86 backend now decodes X86 shuffle instructions and prints human
+ readable comments after the most inscrutable of them, e.g.:
+
+<pre>
+ insertps $113, %xmm3, %xmm0 <i># xmm0 = zero,xmm0[1,2],xmm3[1]</i>
+ unpcklps %xmm1, %xmm0 <i># xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]</i>
+ pshufd $1, %xmm1, %xmm1 <i># xmm1 = xmm1[1,0,0,0]</i>
+</pre>
+</li>
+
</ul>
</div>
-
<!--=========================================================================-->
<div class="doc_subsection">
-<a name="otherimprovements">Other Improvements</a>
+<a name="ARM">ARM Target Improvements</a>
</div>
<div class="doc_text">
-<p>New features include:
+<p>New features of the ARM target include:
</p>
<ul>
-<li><tt>llvmc2</tt> (the generic compiler driver) gained plugin
- support. It is now easier to experiment with <tt>llvmc2</tt> and
- build your own tools based on it.</li>
-
-<li>LLVM 2.4 includes a number of new generic algorithms and data structures,
- include a scoped hash table, 'immutable' data structures, a simple
- free-list manager, and a <tt>raw_ostream</tt> class.
- The <tt>raw_ostream</tt> class and
- <tt>format</tt> allow for efficient file output, and various pieces of LLVM
- have switched over to use it. The eventual goal is to eliminate
- std::ostream in favor of it.</li>
+<li>The ARM backend now optimizes tail calls into jumps.</li>
+<li>Scheduling is improved through the new list-hybrid scheduler as well
+ as through better modeling of structural hazards.</li>
+<li><a href="LangRef.html#int_fp16">Half float</a> instructions are now
+ supported.</li>
+<li>NEON support has been improved to model instructions which operate onto
+ multiple consecutive registers more aggressively. This avoids lots of
+ extraneous register copies.</li>
+<li>The ARM backend now uses a new "ARMGlobalMerge" pass, which merges several
+ global variables into one, saving extra address computation (all the global
+ variables can be accessed via same base address) and potentially reducing
+ register pressure.</li>
+
+<li>The ARM backend has received many minor improvements and tweaks which lead
+ to substantially better performance in a wide range of different scenarios.
+</li>
-</ul>
+<li>The ARM NEON intrinsics have been substantially reworked to reduce
+ redundancy and improve code generation. Some of the major changes are:
+ <ol>
+ <li>
+ All of the NEON load and store intrinsics (llvm.arm.neon.vld* and
+ llvm.arm.neon.vst*) take an extra parameter to specify the alignment in bytes
+ of the memory being accessed.
+ </li>
+ <li>
+ The llvm.arm.neon.vaba intrinsic (vector absolute difference and
+ accumulate) has been removed. This operation is now represented using
+ the llvm.arm.neon.vabd intrinsic (vector absolute difference) followed by a
+ vector add.
+ </li>
+ <li>
+ The llvm.arm.neon.vabdl and llvm.arm.neon.vabal intrinsics (lengthening
+ vector absolute difference with and without accumulation) have been removed.
+ They are represented using the llvm.arm.neon.vabd intrinsic (vector absolute
+ difference) followed by a vector zero-extend operation, and for vabal,
+ a vector add.
+ </li>
+ <li>
+ The llvm.arm.neon.vmovn intrinsic has been removed. Calls of this intrinsic
+ are now replaced by vector truncate operations.
+ </li>
+ <li>
+ The llvm.arm.neon.vmovls and llvm.arm.neon.vmovlu intrinsics have been
+ removed. They are now represented as vector sign-extend (vmovls) and
+ zero-extend (vmovlu) operations.
+ </li>
+ <li>
+ The llvm.arm.neon.vaddl*, llvm.arm.neon.vaddw*, llvm.arm.neon.vsubl*, and
+ llvm.arm.neon.vsubw* intrinsics (lengthening vector add and subtract) have
+ been removed. They are replaced by vector add and vector subtract operations
+ where one (vaddw, vsubw) or both (vaddl, vsubl) of the operands are either
+ sign-extended or zero-extended.
+ </li>
+ <li>
+ The llvm.arm.neon.vmulls, llvm.arm.neon.vmullu, llvm.arm.neon.vmlal*, and
+ llvm.arm.neon.vmlsl* intrinsics (lengthening vector multiply with and without
+ accumulation and subtraction) have been removed. These operations are now
+ represented as vector multiplications where the operands are either
+ sign-extended or zero-extended, followed by a vector add for vmlal or a
+ vector subtract for vmlsl. Note that the polynomial vector multiply
+ intrinsic, llvm.arm.neon.vmullp, remains unchanged.
+ </li>
+ </ol>
+</li>
+</ul>
</div>
+
<!--=========================================================================-->
<div class="doc_subsection">
<a name="changes">Major Changes and Removed Features</a>
<div class="doc_text">
<p>If you're already an LLVM user or developer with out-of-tree changes based
-on LLVM 2.3, this section lists some "gotchas" that you may run into upgrading
+on LLVM 2.7, this section lists some "gotchas" that you may run into upgrading
from the previous release.</p>
<ul>
-
-<li>The LLVM IR generated by llvm-gcc no longer names all instructions. This
- makes it run faster, but may be more confusing to some people. If you
- prefer to have names, the '<tt>opt -instnamer</tt>' pass will add names to
- all instructions.</li>
-
-<li>The LoadVN and GCSE passes have been removed from the tree. They are
- obsolete and have been replaced with the GVN and MemoryDependence passes.
- </li>
+<li>The build configuration machinery changed the output directory names. It
+ wasn't clear to many people that a "Release-Asserts" build was a release build
+ without asserts. To make this more clear, "Release" does not include
+ assertions and "Release+Asserts" does (likewise, "Debug" and
+ "Debug+Asserts").</li>
+<li>The MSIL Backend was removed, it was unsupported and broken.</li>
+<li>The ABCD, SSI, and SCCVN passes were removed. These were not fully
+ functional and their behavior has been or will be subsumed by the
+ LazyValueInfo pass.</li>
+<li>The LLVM IR 'Union' feature was removed. While this is a desirable feature
+ for LLVM IR to support, the existing implementation was half baked and
+ barely useful. We'd really like anyone interested to resurrect the work and
+ finish it for a future release.</li>
+<li>If you're used to reading .ll files, you'll probably notice that .ll file
+ dumps don't produce #uses comments anymore. To get them, run a .bc file
+ through "llvm-dis --show-annotations".</li>
+<li>Target triples are now stored in a normalized form, and all inputs from
+ humans are expected to be normalized by Triple::normalize before being
+ stored in a module triple or passed to another library.</li>
</ul>
+
<p>In addition, many APIs have changed in this release. Some of the major LLVM
API changes are:</p>
-
-<ul>
-
-<li>Now, function attributes and return value attributes are managed
-separately. Interface exported by <tt>ParameterAttributes.h</tt> header is now
-experted by <tt>Attributes.h</tt> header. The new attributes interface changes are:
<ul>
-<li><tt>getParamAttrs</tt> method is now replaced by
-<tt>getParamAttributes</tt>, <tt>getRetAttributes</tt> and
-<tt>getFnAttributes</tt> methods.</li>
-<li> Return value attributes are stored at index 0. Function attributes are
-stored at index ~0U. Parameter attributes are stored at index that matches
-parameter number.</li>
-<li> <tt>ParamAttr</tt> namespace is now renamed as <tt>Attribute</tt>.</li>
-<li> The name of the class that manages reference count of opaque
-attributes is changed from <tt>PAListPtr</tt> to <tt>AttrListPtr</tt>.</li>
-<li> <tt>ParamAttrsWithIndex</tt> is now renamed as <tt>AttributeWithIndex</tt>.
+<li>LLVM 2.8 changes the internal order of operands in <a
+ href="http://llvm.org/doxygen/classllvm_1_1InvokeInst.html"><tt>InvokeInst</tt></a>
+ and <a href="http://llvm.org/doxygen/classllvm_1_1CallInst.html"><tt>CallInst</tt></a>.
+ To be portable across releases, please use the <tt>CallSite</tt> class and the
+ high-level accessors, such as <tt>getCalledValue</tt> and
+ <tt>setUnwindDest</tt>.
</li>
-</ul>
+<li>
+ You can no longer pass use_iterators directly to cast<> (and similar),
+ because these routines tend to perform costly dereference operations more
+ than once. You have to dereference the iterators yourself and pass them in.
+</li>
+<li>
+ llvm.memcpy.*, llvm.memset.*, llvm.memmove.* intrinsics take an extra
+ parameter now ("i1 isVolatile"), totaling 5 parameters, and the pointer
+ operands are now address-space qualified.
+ If you were creating these intrinsic calls and prototypes yourself (as opposed
+ to using Intrinsic::getDeclaration), you can use
+ UpgradeIntrinsicFunction/UpgradeIntrinsicCall to be portable across releases.
+</li>
+<li>
+ SetCurrentDebugLocation takes a DebugLoc now instead of a MDNode.
+ Change your code to use
+ SetCurrentDebugLocation(DebugLoc::getFromDILocation(...)).
+</li>
+<li>
+ The <tt>RegisterPass</tt> and <tt>RegisterAnalysisGroup</tt> templates are
+ considered deprecated, but continue to function in LLVM 2.8. Clients are
+ strongly advised to use the upcoming <tt>INITIALIZE_PASS()</tt> and
+ <tt>INITIALIZE_AG_PASS()</tt> macros instead.
+</li>
+<li>
+ The constructor for the Triple class no longer tries to understand odd triple
+ specifications. Frontends should ensure that they only pass valid triples to
+ LLVM. The Triple::normalize utility method has been added to help front-ends
+ deal with funky triples.
+</li>
+<li>
+ The signature of the <tt>GCMetadataPrinter::finishAssembly</tt> virtual
+ function changed: the <tt>raw_ostream</tt> and <tt>MCAsmInfo</tt> arguments
+ were dropped. GC plugins which compute stack maps must be updated to avoid
+ having the old definition overload the new signature.
+</li>
+<li>
+ The signature of <tt>MemoryBuffer::getMemBuffer</tt> changed. Unfortunately
+ calls intended for the old version still compile, but will not work correctly,
+ leading to a confusing error about an invalid header in the bitcode.
+</li>
+
+<li>
+ Some APIs were renamed:
+ <ul>
+ <li>llvm_report_error -> report_fatal_error</li>
+ <li>llvm_install_error_handler -> install_fatal_error_handler</li>
+ <li>llvm::DwarfExceptionHandling -> llvm::JITExceptionHandling</li>
+ <li>VISIBILITY_HIDDEN -> LLVM_LIBRARY_VISIBILITY</li>
+ </ul>
</li>
-<li>The <tt>DbgStopPointInst</tt> methods <tt>getDirectory</tt> and
-<tt>getFileName</tt> now return <tt>Value*</tt> instead of strings. These can be
-converted to strings using <tt>llvm::GetConstantStringInfo</tt> defined via
-"<tt>llvm/Analysis/ValueTracking.h</tt>".</li>
-
-<li>The APIs to create various instructions have changed from lower case
- "create" methods to upper case "Create" methods (e.g.
- <tt>BinaryOperator::create</tt>). LLVM 2.4 includes both cases, but the
- lower case ones are removed in mainline, please migrate.</li>
-
-<li>Various header files like "<tt>llvm/ADT/iterator</tt>" were given a ".h" suffix.
- Change your code to #include "<tt>llvm/ADT/iterator.h</tt>" instead.</li>
-
-<li>The <tt>getresult</tt> instruction has been removed and replaced with the
- <tt>extractvalue</tt> instruction. This is part of support for first class
- aggregates.</li>
-
-<li>In the code generator, many <tt>MachineOperand</tt> predicates were renamed to be
- shorter (e.g. <tt>isFrameIndex()</tt> -> <tt>isFI()</tt>),
- <tt>SDOperand</tt> was renamed to <tt>SDValue</tt> (and the "<tt>Val</tt>"
- member was changed to be the <tt>getNode()</tt> accessor), and the
- <tt>MVT::ValueType</tt> enum has been replaced with an "<tt>MVT</tt>"
- struct. The <tt>getSignExtended</tt> and <tt>getValue</tt> methods in the
- ConstantSDNode class were renamed to <tt>getSExtValue</tt> and
- <tt>getZExtValue</tt> respectively, to be more consistent with
- the <tt>ConstantInt</tt> class.</li>
+<li>
+ Some public headers were renamed:
+ <ul>
+ <li><tt>llvm/Assembly/AsmAnnotationWriter.h</tt> was renamed
+ to <tt>llvm/Assembly/AssemblyAnnotationWriter.h</tt>
+ </li>
+ </ul>
</ul>
</div>
-
-
-<!-- *********************************************************************** -->
-<div class="doc_section">
- <a name="portability">Portability and Supported Platforms</a>
+<!--=========================================================================-->
+<div class="doc_subsection">
+<a name="devtree_changes">Development Infrastructure Changes</a>
</div>
-<!-- *********************************************************************** -->
<div class="doc_text">
-<p>LLVM is known to work on the following platforms:</p>
+<p>This section lists changes to the LLVM development infrastructure. This
+mostly impacts users who actively work on LLVM or follow development on
+mainline, but may also impact users who leverage the LLVM build infrastructure
+or are interested in LLVM qualification.</p>
<ul>
-<li>Intel and AMD machines (IA32) running Red Hat Linux, Fedora Core and FreeBSD
- (and probably other unix-like systems).</li>
-<li>PowerPC and X86-based Mac OS X systems, running 10.3 and above in 32-bit and
- 64-bit modes.</li>
-<li>Intel and AMD machines running on Win32 using MinGW libraries (native).</li>
-<li>Intel and AMD machines running on Win32 with the Cygwin libraries (limited
- support is available for native builds with Visual C++).</li>
-<li>Sun UltraSPARC workstations running Solaris 10.</li>
-<li>Alpha-based machines running Debian GNU/Linux.</li>
-<li>Itanium-based (IA64) machines running Linux and HP-UX.</li>
+ <li>The default for <tt>make check</tt> is now to use
+ the <a href="http://llvm.org/cmds/lit.html">lit</a> testing tool, which is
+ part of LLVM itself. You can use <tt>lit</tt> directly as well, or use
+ the <tt>llvm-lit</tt> tool which is created as part of a Makefile or CMake
+ build (and knows how to find the appropriate tools). See the <tt>lit</tt>
+ documentation and the <a href="http://blog.llvm.org/2009/12/lit-it.html">blog
+ post</a>, and <a href="http://llvm.org/bugs/show_bug.cgi?id=5217">PR5217</a>
+ for more information.</li>
+
+ <li>The LLVM <tt>test-suite</tt> infrastructure has a new "simple" test format
+ (<tt>make TEST=simple</tt>). The new format is intended to require only a
+ compiler and not a full set of LLVM tools. This makes it useful for testing
+ released compilers, for running the test suite with other compilers (for
+ performance comparisons), and makes sure that we are testing the compiler as
+ users would see it. The new format is also designed to work using reference
+ outputs instead of comparison to a baseline compiler, which makes it run much
+ faster and makes it less system dependent.</li>
+
+ <li>Significant progress has been made on a new interface to running the
+ LLVM <tt>test-suite</tt> (aka the LLVM "nightly tests") using
+ the <a href="http://llvm.org/docs/lnt">LNT</a> infrastructure. The LNT
+ interface to the <tt>test-suite</tt> brings significantly improved reporting
+ capabilities for monitoring the correctness and generated code quality
+ produced by LLVM over time.</li>
</ul>
-
-<p>The core LLVM infrastructure uses GNU autoconf to adapt itself
-to the machine and operating system on which it is built. However, minor
-porting may be required to get LLVM to work on new platforms. We welcome your
-portability patches and reports of successful builds or error messages.</p>
-
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
-<p>This section contains all known problems with the LLVM system, listed by
-component. As new problems are discovered, they will be added to these
-sections. If you run into a problem, please check the <a
+<p>This section contains significant known problems with the LLVM system,
+listed by component. If you run into a problem, please check the <a
href="http://llvm.org/bugs/">LLVM bug database</a> and submit a bug if
there isn't already one.</p>
href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVMdev list</a>.</p>
<ul>
-<li>The MSIL, IA64, Alpha, SPU, MIPS, and PIC16 backends are experimental.</li>
-<li>The llc "<tt>-filetype=asm</tt>" (the default) is the only supported
- value for this option.</li>
+<li>The Alpha, Blackfin, CellSPU, MicroBlaze, MSP430, MIPS, SystemZ
+ and XCore backends are experimental.</li>
+<li><tt>llc</tt> "<tt>-filetype=obj</tt>" is experimental on all targets
+ other than darwin-i386 and darwin-x86_64.</li>
</ul>
</div>
all <a href="http://llvm.org/PR879">inline assembly that uses the X86
floating point stack</a>. It supports the 'f' and 't' constraints, but not
'u'.</li>
- <li>The X86 backend generates inefficient floating point code when configured
- to generate code for systems that don't have SSE2.</li>
<li>Win64 code generation wasn't widely tested. Everything should work, but we
- expect small issues to happen. Also, llvm-gcc cannot build mingw64 runtime
- currently due
- to <a href="http://llvm.org/PR2255">several</a>
- <a href="http://llvm.org/PR2257">bugs</a> due to lack of support for the
- 'u' inline assembly constraint and X87 floating point inline assembly.</li>
+ expect small issues to happen. Also, llvm-gcc cannot build the mingw64
+ runtime currently due to lack of support for the 'u' inline assembly
+ constraint and for X87 floating point inline assembly.</li>
<li>The X86-64 backend does not yet support the LLVM IR instruction
- <tt>va_arg</tt>. Currently, the llvm-gcc front-end supports variadic
+ <tt>va_arg</tt>. Currently, front-ends support variadic
argument constructs on X86-64 by lowering them manually.</li>
</ul>
<li>Thumb mode works only on ARMv6 or higher processors. On sub-ARMv6
processors, thumb programs can crash or produce wrong
results (<a href="http://llvm.org/PR1388">PR1388</a>).</li>
-<li>Compilation for ARM Linux OABI (old ABI) is supported, but not fully tested.
+<li>Compilation for ARM Linux OABI (old ABI) is supported but not fully tested.
</li>
-<li>There is a bug in QEMU-ARM (<= 0.9.0) which causes it to incorrectly
- execute
-programs compiled with LLVM. Please use more recent versions of QEMU.</li>
</ul>
</div>
<div class="doc_text">
<ul>
-<li>The SPARC backend only supports the 32-bit SPARC ABI (-m32), it does not
+<li>The SPARC backend only supports the 32-bit SPARC ABI (-m32); it does not
support the 64-bit SPARC ABI (-m64).</li>
</ul>
<div class="doc_text">
<ul>
-<li>The O32 ABI is not fully supported.</li>
<li>64-bit MIPS targets are not supported yet.</li>
</ul>
</ul>
</div>
-<!-- ======================================================================= -->
-<div class="doc_subsection">
- <a name="ia64-be">Known problems with the IA64 back-end</a>
-</div>
-
-<div class="doc_text">
-
-<ul>
-<li>The Itanium backend is highly experimental, and has a number of known
- issues. We are looking for a maintainer for the Itanium backend. If you
- are interested, please contact the LLVMdev mailing list.</li>
-</ul>
-
-</div>
-
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="c-be">Known problems with the C back-end</a>
<div class="doc_text">
+<p>The C backend has numerous problems and is not being actively maintained.
+Depending on it for anything serious is not advised.</p>
+
<ul>
<li><a href="http://llvm.org/PR802">The C backend has only basic support for
inline assembly code</a>.</li>
<li><a href="http://llvm.org/PR1658">The C backend violates the ABI of common
C++ programs</a>, preventing intermixing between C++ compiled by the CBE and
- C++ code compiled with llc or native compilers.</li>
+ C++ code compiled with <tt>llc</tt> or native compilers.</li>
<li>The C backend does not support all exception handling constructs.</li>
+<li>The C backend does not support arbitrary precision integers.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
- <a name="c-fe">Known problems with the llvm-gcc C front-end</a>
+ <a name="llvm-gcc">Known problems with the llvm-gcc front-end</a>
</div>
<div class="doc_text">
-<p>llvm-gcc does not currently support <a href="http://llvm.org/PR869">Link-Time
-Optimization</a> on most platforms "out-of-the-box". Please inquire on the
-LLVMdev mailing list if you are interested.</p>
-
-<p>The only major language feature of GCC not supported by llvm-gcc is
- the <tt>__builtin_apply</tt> family of builtins. However, some extensions
- are only supported on some targets. For example, trampolines are only
- supported on some targets (these are used when you take the address of a
- nested function).</p>
-
-<p>If you run into GCC extensions which are not supported, please let us know.
-</p>
-
-</div>
-
-<!-- ======================================================================= -->
-<div class="doc_subsection">
- <a name="c++-fe">Known problems with the llvm-gcc C++ front-end</a>
-</div>
-
-<div class="doc_text">
-
-<p>The C++ front-end is considered to be fully
-tested and works for a number of non-trivial programs, including LLVM
-itself, Qt, Mozilla, etc.</p>
-
-<ul>
-<li>Exception handling works well on the X86 and PowerPC targets. Currently
- only linux and darwin targets are supported (both 32 and 64 bit).</li>
-</ul>
-
-</div>
-
-
-<!-- ======================================================================= -->
-<div class="doc_subsection">
- <a name="ada-fe">Known problems with the llvm-gcc Ada front-end</a>
-</div>
-
-<div class="doc_text">
-The llvm-gcc 4.2 Ada compiler works fairly well, however this is not a mature
-technology and problems should be expected.
-<ul>
-<li>The Ada front-end currently only builds on X86-32. This is mainly due
-to lack of trampoline support (pointers to nested functions) on other platforms,
-however it <a href="http://llvm.org/PR2006">also fails to build on X86-64</a>
-which does support trampolines.</li>
-<li>The Ada front-end <a href="http://llvm.org/PR2007">fails to bootstrap</a>.
-Workaround: configure with --disable-bootstrap.</li>
-<li>The c380004, <a href="http://llvm.org/PR2010">c393010</a>
-and <a href="http://llvm.org/PR2421">cxg2021</a> ACATS tests fail
-(c380004 also fails with gcc-4.2 mainline).</li>
-<li>Some gcc specific Ada tests continue to crash the compiler.</li>
-<li>The -E binder option (exception backtraces)
-<a href="http://llvm.org/PR1982">does not work</a> and will result in programs
-crashing if an exception is raised. Workaround: do not use -E.</li>
-<li>Only discrete types <a href="http://llvm.org/PR1981">are allowed to start
-or finish at a non-byte offset</a> in a record. Workaround: do not pack records
-or use representation clauses that result in a field of a non-discrete type
-starting or finishing in the middle of a byte.</li>
-<li>The <tt>lli</tt> interpreter <a href="http://llvm.org/PR2009">considers
-'main' as generated by the Ada binder to be invalid</a>.
-Workaround: hand edit the file to use pointers for <tt>argv</tt> and
-<tt>envp</tt> rather than integers.</li>
-<li>The <tt>-fstack-check</tt> option <a href="http://llvm.org/PR2008">is
-ignored</a>.</li>
-</ul>
+<p>llvm-gcc is generally very stable for the C family of languages. The only
+ major language feature of GCC not supported by llvm-gcc is the
+ <tt>__builtin_apply</tt> family of builtins. However, some extensions
+ are only supported on some targets. For example, trampolines are only
+ supported on some targets (these are used when you take the address of a
+ nested function).</p>
+
+<p>Fortran support generally works, but there are still several unresolved bugs
+ in <a href="http://llvm.org/bugs/">Bugzilla</a>. Please see the
+ tools/gfortran component for details. Note that llvm-gcc is missing major
+ Fortran performance work in the frontend and library that went into GCC after
+ 4.2. If you are interested in Fortran, we recommend that you consider using
+ <a href="#dragonegg">dragonegg</a> instead.</p>
+
+<p>The llvm-gcc 4.2 Ada compiler has basic functionality, but is no longer being
+actively maintained. If you are interested in Ada, we recommend that you
+consider using <a href="#dragonegg">dragonegg</a> instead.</p>
</div>
<!-- *********************************************************************** -->
<hr>
<address>
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img
- src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
+ src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
<a href="http://validator.w3.org/check/referer"><img
- src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+ src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
<a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br>
Last modified: $Date$