1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

distribute various bullets to different sections.

llvm-svn: 145196
This commit is contained in:
Chris Lattner 2011-11-27 20:51:47 +00:00
parent 9ab5855a19
commit e6841be524

View File

@ -743,210 +743,54 @@ be used to verify some algorithms.
loop dependence analysis
CorrelatedValuePropagation
lib/Transforms/IPO/MergeFunctions.cpp => consider for 3.1.
Integrated assembler on by default for arm/thumb?
-->
<p><b>llvm-gcc is gone</b>. LLVM's configure script doesn't depend on llvm-gcc anymore, clean layering.</p>
<p>LLVM 3.0 includes several major new capabilities:</p>
<!-- Near dead:
<!-- Near dead:
Analysis/RegionInfo.h + Dom Frontiers
SparseBitVector: used in LiveVar.
llvm/lib/Archive - replace with lib object?
-->
<!--
Type system rewrite: http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html
Better performance for Neon code in clang due to SRoA improvements.
New regalloc on by default. Lin scan going away in 3.1
PGO / builtin_expect improvements (summary needed)
Big EH rewrite.
AVX support, assembler, compiler and disassembler.
IndVar improvements: andy
PTX backend improvements: Justin
llvm-rtdyld & MC JIT: JimG
InstAliases now automatically used in the asmprinter where they are shorter.
Integrated assembler on by default for arm/thumb?
PostOrder Dominator frontiers were removed.
Line Profiling / gcov support
EH and debug information produced with CFI directives, yielding smaller executables: http://blog.mozilla.com/respindola/2011/05/12/cfi-directives/
X86-64 generates smaller and faster code at -O0 (fast isel improvements)
Better code generation for Cortex-A9
Many APIs take ArrayRef's now.
Pass manager extension API.
ARM inline asm constraints implemented.
LangRef.html#fnattrs uwtable attribute for asynch unwind tables.
better performance for indirect gotos.
llvm.prefetch now takes a 4th argument that specifies whether the prefetch happens to the icache or dcache.
New PackedVector, TinyPtrVector class (see Programmer's Manual)
New nonlazybind function attribute.
ARC language specific optimizer (Transforms/ObjCARC) a decent example of language-specific transformation.
LLVM 3.0 removes support for reading LLVM 2.8 and earlier files. Aim to maintain compatibility all the way back to 3.0 "forever".
-->
New llvm.expect intrinsic.
Table generated MC expansion logic for pseudo instructions that expand to multiple MC instructions through the PseudoInstExpansion class. (JimG)
New llvm.fma intrinsic.
Euro dev meeting and main one too.
New atomics instructions, "#i_fence" instruction, cmpxchg, atomicrmw too. What target support (X86/ARM)? Also 'atomic load/store'. See Atomics.html
X86: inline assembler supports .code32 and .code64.
Exception handling rewrite: new landingpad and resume instruction. Unwind gone.
LowerSetJmp pass removed, unused.
llvm-objdump / dwarf parser library / llvm-dwarfdump (d0k)
object file parsing stuff and llvm-size (mspencer)
llvm-cov (devang)
Old arm disassembler replaced with a new one based on autogenerated encoding information from ARM .td files.
Frontend tests removed from llvm/test/Frontend* (was this completed for 3.0?)
Segmented stack support (X86 only?) Rafael and Sanjoy Das: docs/SegmentedStacks.html should be in CodeGen.html status table?
X86 backend support for NaCl (David Meyer / Nick L)
Codegen now supports vector "select" operations on vector comparisons, turning
them into various optimized code sequences (e.g. using the SSE4/AVX "blend"
instructions).
#line directives in integrated assembler
SSE domain fixing code enabled for AVX (Bruno/Jakob). Domain fixing pass is
now target independent (ExecutionDepsFix pass). (Jakob)
X86 backend synthesizes horizontal add/sub instructions from generic code.
returns_twice attribute (rafael)
Tablegen has been split into a library, clang tblgen pieces now live in clang.
The llvm version is now named llvm-tblgen instead of tblgen.
X86: Tons of encoding improvements and new instructions (e.g. Atom, Ivy Bridge,
and BMI instructions)
added to assembler and disassembler (Craig Topper)
data layout string can encode the natural alignment of the target's stack for better optimization (LangRef.html#datalayout)
-->
<ul>
<!--
<li></li>
-->
</ul>
</div>
<!--=========================================================================-->
<!-- EH details: to be moved to a blog post:
<p>One of the biggest changes is that 3.0 has a new exception handling
system. The old system used LLVM intrinsics to convey the exception handling
information to the code generator. It worked in most cases, but not
all. Inlining was especially difficult to get right. Also, the intrinsics
could be moved away from the <code>invoke</code> instruction, making it hard
to recover that information.</p>
<p>The new EH system makes exception handling a first-class member of the IR. It
adds two new instructions:</p>
<p>LLVM 3.0 includes several major changes:</p>
<ul>
<li><a href="LangRef.html#i_landingpad"><code>landingpad</code></a> &mdash;
this instruction defines a landing pad basic block. It contains all of the
information that's needed by the code generator. It's also required to be
the first non-PHI instruction in the landing pad. In addition, a landing
pad may be jumped to only by the unwind edge of an <code>invoke</code>
instruction.</li>
<li>llvm-gcc is no longer supported, and not included in the release. We
recommend switching to <a
href="http://clang.llvm.org/">Clang</a> or <a
href="http://dragonegg.llvm.org/">DragonEgg</a>.</li>
<li><a href="LangRef.html#i_resume"><code>resume</code></a> &mdash; this
instruction causes the current exception to resume traveling up the
stack. It replaces the <code>@llvm.eh.resume</code> intrinsic.</li>
<li>The linear scan register allocator has been replaced with a new "greedy"
register allocator, enabling live range splitting and many other
optimizations that lead to better code quality. Please see its <a
href="http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html">blog post</a> or its talk at the <a
href="http://llvm.org/devmtg/2011-11/">Developer Meeting</a>
for more information.</li>
<li> New <a href="Atomics.html">atomics</a> instructions, "#i_fence" instruction, cmpxchg, atomicrmw too. What target support (X86/ARM)? Also 'atomic load/store'.
</li>
<li>The LLVM IR exception handling representation has been redesigned and
reimplemented, making it more elegant, fixing a huge number of bugs, and
enabling inlining and other optimizations. Please see its blog post (XXX
not yet) for more information.</li>
<li>The LLVM IR Type system has been redesigned and reimplemented, making it
faster and solving some long-standing problems.
Please see its <a
href="http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html">blog
post</a> for more information.</li>
<li>The MIPS backend has made major leaps in this release, going from an
experimental target to being virtually production quality that supports a
wide variety of MIPS subtargets. See the <a href="#MIPS">MIPS section</a>
below for more information.</li>
<li>The optimizer and code generator now supports gprof and gcov-style coverage
and profiling information, and includes a new llvm-cov tool. Clang exposes
this through GCC-compatible command line options.</li>
</ul>
<p>Converting from the old EH API to the new EH API is rather simple, because a
lot of complexity has been removed. The two intrinsics,
<code>@llvm.eh.exception</code> and <code>@llvm.eh.selector</code> have been
superseded by the <code>landingpad</code> instruction. Instead of generating
a call to <code>@llvm.eh.exception</code> and <code>@llvm.eh.selector</code>:
<div class="doc_code">
<pre>
Function *ExcIntr = Intrinsic::getDeclaration(TheModule,
Intrinsic::eh_exception);
Function *SlctrIntr = Intrinsic::getDeclaration(TheModule,
Intrinsic::eh_selector);
// The exception pointer.
Value *ExnPtr = Builder.CreateCall(ExcIntr, "exc_ptr");
std::vector&lt;Value*&gt; Args;
Args.push_back(ExnPtr);
Args.push_back(Builder.CreateBitCast(Personality,
Type::getInt8PtrTy(Context)));
<i>// Add selector clauses to Args.</i>
// The selector call.
Builder.CreateCall(SlctrIntr, Args, "exc_sel");
</pre>
</div>
<p>You should instead generate a <code>landingpad</code> instruction, that
returns an exception object and selector value:</p>
<div class="doc_code">
<pre>
LandingPadInst *LPadInst =
Builder.CreateLandingPad(StructType::get(Int8PtrTy, Int32Ty, NULL),
Personality, 0);
Value *LPadExn = Builder.CreateExtractValue(LPadInst, 0);
Builder.CreateStore(LPadExn, getExceptionSlot());
Value *LPadSel = Builder.CreateExtractValue(LPadInst, 1);
Builder.CreateStore(LPadSel, getEHSelectorSlot());
</pre>
</div>
<p>It's now trivial to add the individual clauses to the <code>landingpad</code>
instruction.</p>
<div class="doc_code">
<pre>
<i><b>// Adding a catch clause</b></i>
Constant *TypeInfo = getTypeInfo();
LPadInst-&gt;addClause(TypeInfo);
<i><b>// Adding a C++ catch-all</b></i>
LPadInst-&gt;addClause(Constant::getNullValue(Builder.getInt8PtrTy()));
<i><b>// Adding a cleanup</b></i>
LPadInst-&gt;setCleanup(true);
<i><b>// Adding a filter clause</b></i>
std::vector&lt;Constant*&gt; TypeInfos;
Constant *TypeInfo = getFilterTypeInfo();
TypeInfos.push_back(Builder.CreateBitCast(TypeInfo, Builder.getInt8PtrTy()));
ArrayType *FilterTy = ArrayType::get(Int8PtrTy, TypeInfos.size());
LPadInst-&gt;addClause(ConstantArray::get(FilterTy, TypeInfos));
</pre>
</div>
<p>Converting from using the <code>@llvm.eh.resume</code> intrinsic to
the <code>resume</code> instruction is trivial. It takes the exception
pointer and exception selector values returned by
the <code>landingpad</code> instruction:</p>
<div class="doc_code">
<pre>
Type *UnwindDataTy = StructType::get(Builder.getInt8PtrTy(),
Builder.getInt32Ty(), NULL);
Value *UnwindData = UndefValue::get(UnwindDataTy);
Value *ExcPtr = Builder.CreateLoad(getExceptionObjSlot());
Value *ExcSel = Builder.CreateLoad(getExceptionSelSlot());
UnwindData = Builder.CreateInsertValue(UnwindData, ExcPtr, 0, "exc_ptr");
UnwindData = Builder.CreateInsertValue(UnwindData, ExcSel, 1, "exc_sel");
Builder.CreateResume(UnwindData);
</pre>
</div>
-->
<!--=========================================================================-->
<h3>
@ -958,8 +802,15 @@ Builder.CreateResume(UnwindData);
<p>LLVM IR has several new features for better support of new targets and that
expose new optimization opportunities:</p>
New llvm.expect intrinsic.
New llvm.fma intrinsic.
LangRef.html#fnattrs uwtable attribute for asynch unwind tables.
llvm.prefetch now takes a 4th argument that specifies whether the prefetch happens to the icache or dcache.
New nonlazybind function attribute.
data layout string can encode the natural alignment of the target's stack for better optimization (LangRef.html#datalayout)
returns_twice attribute (rafael)
</div>
<!--=========================================================================-->
@ -997,6 +848,8 @@ Builder.CreateResume(UnwindData);
optimizers:</p>
<ul>
Pass manager extension API.
<li>Information about <a href="BranchWeightMetadata.html">branch probability</a>
and basic block frequency is now available within LLVM, based on a
combination of static branch prediction heuristics and
@ -1004,7 +857,9 @@ Builder.CreateResume(UnwindData);
register spill placement and if-conversion, with additional optimizations
planned for future releases. The same framework is intended for eventual
use with profile-guided optimization.</li>
</li>
ARC language specific optimizer (Transforms/ObjCARC) a decent example of language-specific transformation.
</ul>
@ -1038,6 +893,17 @@ compiler and provides better integration with the platform ABI as a result.</p>
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>
InstAliases now automatically used in the asmprinter where they are shorter.
Table generated MC expansion logic for pseudo instructions that expand to multiple MC instructions through the PseudoInstExpansion class. (JimG)
#line directives in integrated assembler
llvm-rtdyld: JimG
llvm-objdump / dwarf parser library / llvm-dwarfdump (d0k)
object file parsing stuff and llvm-size (mspencer)
</div>
<!--=========================================================================-->
@ -1052,6 +918,17 @@ compiler and provides better integration with the platform ABI as a result.</p>
make it run faster:</p>
<ul>
better performance for indirect gotos through new tail dup pass.
Codegen now supports vector "select" operations on vector comparisons, turning
them into various optimized code sequences (e.g. using the SSE4/AVX "blend"
instructions).
EH and debug information produced with CFI directives, yielding smaller executables: http://blog.mozilla.com/respindola/2011/05/12/cfi-directives/
Domain fixing pass is now target independent (ExecutionDepsFix pass). (Jakob)
<!--
<li></li>
-->
@ -1081,6 +958,16 @@ compiler and provides better integration with the platform ABI as a result.</p>
<code>@llvm.x86.sse42.crc32.32.[8|16|32]</code> and
<code>@llvm.x86.sse42.crc32.64.[8|64]</code>.</li>
X86: inline assembler supports .code32 and .code64.
AVX support, assembler, compiler and disassembler.
X86 backend support for NaCl (David Meyer / Nick L)
SSE domain fixing code enabled for AVX (Bruno/Jakob).
X86 backend synthesizes horizontal add/sub instructions from generic code.
X86: Tons of encoding improvements and new instructions (e.g. Atom, Ivy Bridge,
and BMI instructions)
added to assembler and disassembler (Craig Topper)
X86-64 generates smaller and faster code at -O0 (fast isel improvements)
</ul>
</div>
@ -1098,6 +985,12 @@ compiler and provides better integration with the platform ABI as a result.</p>
<li>Reworked Set Jump Long Jump EH Lowering,</li>
<li>improved support for Cortex-M series processors, and</li>
<li>beta quality integrated assembler support.</li>
Better code generation for Cortex-A9
ARM inline asm constraints implemented.
Old arm disassembler replaced with a new one based on autogenerated encoding information from ARM .td files.
Better performance for Neon code in clang due to SRoA improvements.
</ul>
</div>
@ -1181,6 +1074,15 @@ compiler and provides better integration with the platform ABI as a result.</p>
from the previous release.</p>
<ul>
<li>LLVM's configure script doesn't depend on llvm-gcc anymore, clean layering.</p>
LLVM 3.0 removes support for reading LLVM 2.8 and earlier files. Aim to maintain compatibility all the way back to 3.0 "forever".
Frontend tests removed from llvm/test/Frontend*
Tablegen has been split into a library, clang tblgen pieces now live in clang.
The llvm version is now named llvm-tblgen instead of tblgen.
PostOrder Dominator frontiers were removed.
LowerSetJmp pass removed, unused.
<li>The <code>LLVMC</code> meta compiler driver was removed.</li>
<li>The <code>LowerSetJmp</code> pass wasn't used effectively by any
target and has been removed.</li>
@ -1343,8 +1245,8 @@ compiler and provides better integration with the platform ABI as a result.</p>
<ul>
<li>The Alpha, Blackfin, CellSPU, MSP430, PTX, SystemZ and
XCore backends are experimental, and several of these have already been
removed from mainline.</li>
XCore backends are experimental, and the Alpha, Blackfin and SystemZ
targets have already been removed from mainline.</li>
<li>The integrated assembler, disassembler, and JIT is not supported by
several targets. If an integrated assembler is not supported, then a
@ -1381,6 +1283,130 @@ compiler and provides better integration with the platform ABI as a result.</p>
</div>
<!--=========================================================================-->
<!-- EH details: to be moved to a blog post:
<p>One of the biggest changes is that 3.0 has a new exception handling
system. The old system used LLVM intrinsics to convey the exception handling
information to the code generator. It worked in most cases, but not
all. Inlining was especially difficult to get right. Also, the intrinsics
could be moved away from the <code>invoke</code> instruction, making it hard
to recover that information.</p>
<p>The new EH system makes exception handling a first-class member of the IR. It
adds two new instructions:</p>
<ul>
<li><a href="LangRef.html#i_landingpad"><code>landingpad</code></a> &mdash;
this instruction defines a landing pad basic block. It contains all of the
information that's needed by the code generator. It's also required to be
the first non-PHI instruction in the landing pad. In addition, a landing
pad may be jumped to only by the unwind edge of an <code>invoke</code>
instruction.</li>
<li><a href="LangRef.html#i_resume"><code>resume</code></a> &mdash; this
instruction causes the current exception to resume traveling up the
stack. It replaces the <code>@llvm.eh.resume</code> intrinsic.</li>
</ul>
<p>Converting from the old EH API to the new EH API is rather simple, because a
lot of complexity has been removed. The two intrinsics,
<code>@llvm.eh.exception</code> and <code>@llvm.eh.selector</code> have been
superseded by the <code>landingpad</code> instruction. Instead of generating
a call to <code>@llvm.eh.exception</code> and <code>@llvm.eh.selector</code>:
<div class="doc_code">
<pre>
Function *ExcIntr = Intrinsic::getDeclaration(TheModule,
Intrinsic::eh_exception);
Function *SlctrIntr = Intrinsic::getDeclaration(TheModule,
Intrinsic::eh_selector);
// The exception pointer.
Value *ExnPtr = Builder.CreateCall(ExcIntr, "exc_ptr");
std::vector&lt;Value*&gt; Args;
Args.push_back(ExnPtr);
Args.push_back(Builder.CreateBitCast(Personality,
Type::getInt8PtrTy(Context)));
<i>// Add selector clauses to Args.</i>
// The selector call.
Builder.CreateCall(SlctrIntr, Args, "exc_sel");
</pre>
</div>
<p>You should instead generate a <code>landingpad</code> instruction, that
returns an exception object and selector value:</p>
<div class="doc_code">
<pre>
LandingPadInst *LPadInst =
Builder.CreateLandingPad(StructType::get(Int8PtrTy, Int32Ty, NULL),
Personality, 0);
Value *LPadExn = Builder.CreateExtractValue(LPadInst, 0);
Builder.CreateStore(LPadExn, getExceptionSlot());
Value *LPadSel = Builder.CreateExtractValue(LPadInst, 1);
Builder.CreateStore(LPadSel, getEHSelectorSlot());
</pre>
</div>
<p>It's now trivial to add the individual clauses to the <code>landingpad</code>
instruction.</p>
<div class="doc_code">
<pre>
<i><b>// Adding a catch clause</b></i>
Constant *TypeInfo = getTypeInfo();
LPadInst-&gt;addClause(TypeInfo);
<i><b>// Adding a C++ catch-all</b></i>
LPadInst-&gt;addClause(Constant::getNullValue(Builder.getInt8PtrTy()));
<i><b>// Adding a cleanup</b></i>
LPadInst-&gt;setCleanup(true);
<i><b>// Adding a filter clause</b></i>
std::vector&lt;Constant*&gt; TypeInfos;
Constant *TypeInfo = getFilterTypeInfo();
TypeInfos.push_back(Builder.CreateBitCast(TypeInfo, Builder.getInt8PtrTy()));
ArrayType *FilterTy = ArrayType::get(Int8PtrTy, TypeInfos.size());
LPadInst-&gt;addClause(ConstantArray::get(FilterTy, TypeInfos));
</pre>
</div>
<p>Converting from using the <code>@llvm.eh.resume</code> intrinsic to
the <code>resume</code> instruction is trivial. It takes the exception
pointer and exception selector values returned by
the <code>landingpad</code> instruction:</p>
<div class="doc_code">
<pre>
Type *UnwindDataTy = StructType::get(Builder.getInt8PtrTy(),
Builder.getInt32Ty(), NULL);
Value *UnwindData = UndefValue::get(UnwindDataTy);
Value *ExcPtr = Builder.CreateLoad(getExceptionObjSlot());
Value *ExcSel = Builder.CreateLoad(getExceptionSelSlot());
UnwindData = Builder.CreateInsertValue(UnwindData, ExcPtr, 0, "exc_ptr");
UnwindData = Builder.CreateInsertValue(UnwindData, ExcSel, 1, "exc_sel");
Builder.CreateResume(UnwindData);
</pre>
</div>
-->
<!-- *********************************************************************** -->
<hr>