History log of /external/llvm/lib/CodeGen/SpillPlacement.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
1dc12aa148f0ecb4135fa3e47e7a2ac81ceac394 21-May-2012 Jakob Stoklund Olesen <stoklund@2pi.dk> Give a small negative bias to giant edge bundles.

This helps compile time when the greedy register allocator splits live
ranges in giant functions. Without the bias, we would try to grow
regions through the giant edge bundles, usually to find out that the
region became too big and expensive.

If a live range has many uses in blocks near the giant bundle, the small
negative bias doesn't make a big difference, and we still consider
regions including the giant edge bundle.

Giant edge bundles are usually connected to landing pads or indirect
branches.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157174 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
b87f91b063a0ac853735f2af3bd94fb8551a11ff 04-Aug-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Be more conservative when forming compact regions.

Apply twice the negative bias on transparent blocks when computing the
compact regions. This excludes loop backedges from the region when only
one of the loop blocks uses the register.

Previously, we would include the backedge in the region if the loop
preheader and the loop latch both used the register, but the loop header
didn't.

When both the header and latch blocks use the register, we still keep it
live on the backedge.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136832 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
0e0a8806d49038b60a0c20427d9f410b01cbb012 02-Aug-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Extend the SpillPlacement interface with two new features.

The PrefBoth constraint is used for blocks that ideally want a live-in
value both on the stack and in a register. This would be used by a block
that has a use before interference forces a spill.

Secondly, add the ChangesValue flag to BlockConstraint. This tells
SpillPlacement if a live-in value on the stack can be reused as a
live-out stack value for free. If the block redefines the virtual
register, a spill would be required for that.

This extra information will be used by SpillPlacement to more accurately
calculate spill costs when a value can exist both on the stack and in a
register.

The simplest example is a basic block that reads the virtual register,
but doesn't change its value. Spilling around such a block requires a
reload, but no spill in the block.

The spiller already knows this, but the spill placer doesn't. That can
sometimes lead to suboptimal regions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136731 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
e60f103d2d3541e57a6ca8d788e959e03b615e5f 23-Jul-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Add a simple method for marking blocks with interference in and out.

This method matches addLinks - All the listed blocks are considered to
have interference, so they add a negative bias to their bundles.

This could also be done by addConstraints, but that requires building a
separate BlockConstraint array.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135844 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0c 09-Apr-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Build the Hopfield network incrementally when splitting global live ranges.

It is common for large live ranges to have few basic blocks with register uses
and many live-through blocks without any uses. This approach grows the Hopfield
network incrementally around the use blocks, completely avoiding checking
interference for some through blocks.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129188 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
0bd2bd9ecc8abd3c3ed91a51aa8c51aaab401b5d 07-Apr-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Prefer multiplications to divisions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129080 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
7b41fbe87234f3ceef6ae11209730cbed4b69092 07-Apr-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Extract SpillPlacement::addLinks for handling the special transparent blocks.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129079 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
70d4370b47cdd375bbea98e50452789fe4f1af04 06-Apr-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Keep track of the number of positively biased nodes when adding constraints.

If there are no positive nodes, the algorithm can be aborted early.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129021 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
9efa2a263ea470caacef1c85f6ca45e32bf516d3 06-Apr-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Break the spill placement algorithm into three parts: prepare, addConstraints, and finish.

This will allow us to abort the algorithm early if it is determined to be futile.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129020 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
40a42a2ccaaa19a109667ed7abf224cc8733cd9c 04-Mar-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Precompute block frequencies, pow() isn't free.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126975 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
febb0bd0b9b75923dea4c34f22be7e4c7b6b501e 18-Feb-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Trim debugging output.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125802 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
9590c7fbca2a3c18d0000676b2a6336f6458ed42 03-Feb-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Silence an MSVC warning

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124798 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
fc7d775178aa890f8bb5e9b1be0bf675dc7d29f4 20-Jan-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Divert Hopfield network debug output. It is very noisy.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123859 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
b5fa9333431673aac2ced8dea80152349a85cf6f 18-Jan-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Add RAGreedy methods for splitting live ranges around regions.

Analyze the live range's behavior entering and leaving basic blocks. Compute an
interference pattern for each allocation candidate, and use SpillPlacement to
find an optimal region where that register can be live.

This code is still not enabled.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123774 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp
8bfe50871f9cb1b022483e0e1307ab5b8c9e5650 06-Jan-2011 Jakob Stoklund Olesen <stoklund@2pi.dk> Add the SpillPlacement analysis pass.

This pass precomputes CFG block frequency information that can be used by the
register allocator to find optimal spill code placement.

Given an interference pattern, placeSpills() will compute which basic blocks
should have the current variable enter or exit in a register, and which blocks
prefer the stack.

The algorithm is ready to consume block frequencies from profiling data, but for
now it gets by with the static estimates used for spill weights.

This is a work in progress and still not hooked up to RegAllocGreedy.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122938 91177308-0d34-0410-b5e6-96231b3b80d8
/external/llvm/lib/CodeGen/SpillPlacement.cpp