Old fork of llvm-mirror, used on older RPCS3 builds
Go to file
Juergen Ributzka fb282c68b7 Add Constant Hoisting Pass
This pass identifies expensive constants to hoist and coalesces them to
better prepare it for SelectionDAG-based code generation. This works around the
limitations of the basic-block-at-a-time approach.

First it scans all instructions for integer constants and calculates its
cost. If the constant can be folded into the instruction (the cost is
TCC_Free) or the cost is just a simple operation (TCC_BASIC), then we don't
consider it expensive and leave it alone. This is the default behavior and
the default implementation of getIntImmCost will always return TCC_Free.

If the cost is more than TCC_BASIC, then the integer constant can't be folded
into the instruction and it might be beneficial to hoist the constant.
Similar constants are coalesced to reduce register pressure and
materialization code.

When a constant is hoisted, it is also hidden behind a bitcast to force it to
be live-out of the basic block. Otherwise the constant would be just
duplicated and each basic block would have its own copy in the SelectionDAG.
The SelectionDAG recognizes such constants as opaque and doesn't perform
certain transformations on them, which would create a new expensive constant.

This optimization is only applied to integer constants in instructions and
simple (this means not nested) constant cast experessions. For example:
%0 = load i64* inttoptr (i64 big_constant to i64*)

Reviewed by Eric

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200022 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-24 18:23:08 +00:00
autoconf Use a heavier hammer when --enable-libcpp is passed to bypass the tests 2014-01-15 21:21:48 +00:00
bindings Makefile.ocaml: Tweak to use --system-libs. 2013-12-20 00:36:59 +00:00
cmake Don't clobber CMAKE_REQUIRED_FLAGS, it ends up being used in 2014-01-21 18:09:19 +00:00
docs Updating the getting started guide for Visual Studio a smidge. 2014-01-23 20:46:44 +00:00
examples [cleanup] Re-sort the examples #include lines with my sort_includes 2014-01-13 09:58:03 +00:00
include Add Constant Hoisting Pass 2014-01-24 18:23:08 +00:00
lib Add Constant Hoisting Pass 2014-01-24 18:23:08 +00:00
projects llvm/projects/CMakeLists.txt: Add dragonegg. 2014-01-24 12:53:08 +00:00
test Add Constant Hoisting Pass 2014-01-24 18:23:08 +00:00
tools Fix known typos 2014-01-24 17:20:08 +00:00
unittests Fix known typos 2014-01-24 17:20:08 +00:00
utils Fix known typos 2014-01-24 17:20:08 +00:00
.arcconfig
.clang-format
.gitignore
CMakeLists.txt [CMake] Introduce new scheme of LLVM_TOOLS_BINARY_DIR and LLVM_LIBRARY_DIR 2014-01-19 12:52:10 +00:00
CODE_OWNERS.TXT
configure Use a heavier hammer when --enable-libcpp is passed to bypass the tests 2014-01-15 21:21:48 +00:00
CREDITS.TXT
LICENSE.TXT Update the copyright credits -- Happy new year 2014! 2014-01-01 08:27:31 +00:00
llvm.spec.in
LLVMBuild.txt
Makefile Fix bad variable syntax in r199413 2014-01-17 00:40:39 +00:00
Makefile.common
Makefile.config.in
Makefile.rules [Mips]Work around MIPS linker issues exposed by commit r198087 until bug 18360 is resolved 2014-01-03 22:18:43 +00:00
README.txt

Low Level Virtual Machine (LLVM)
================================

This directory and its subdirectories contain source code for the Low Level
Virtual Machine, a toolkit for the construction of highly optimized compilers,
optimizers, and runtime environments.

LLVM is open source software. You may freely distribute it under the terms of
the license agreement found in LICENSE.txt.

Please see the documentation provided in docs/ for further
assistance with LLVM, and in particular docs/GettingStarted.rst for getting
started with LLVM and docs/README.txt for an overview of LLVM's
documentation setup.

If you're writing a package for LLVM, see docs/Packaging.rst for our
suggestions.