Rewrite RAGreedy::splitAroundRegion, now with cool ASCII art.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 29 Jun 2011 00:24:24 +0000 (00:24 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 29 Jun 2011 00:24:24 +0000 (00:24 +0000)
commit4d517e34e5c8431adb724c94a14b02362a9cfe67
treecdd35ccdacb6f165ac0b61492d4e32d5693fbe27
parentade490a8297f7d7c9763ef173ce8b7607355b4e7
Rewrite RAGreedy::splitAroundRegion, now with cool ASCII art.

This function has to deal with a lot of special cases, and the old
version got it wrong sometimes. In particular, it would sometimes leave
multiple uses in the stack interval in a single block. That causes bad
code with multiple reloads in the same basic block.

The new version handles block entry and exit in a single pass. It first
eliminates all the easy cases, and then goes on to create a local
interval for the blocks with difficult interference. Previously, we
would only create the local interval for completely isolated blocks.

It can happen that the stack interval becomes completely empty because
we could allocate a register in all edge bundles, and the new local
intervals deal with the interference. The empty stack interval is
harmless, but we need to remove a SplitKit assertion that checks for
empty intervals.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134047 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/RegAllocGreedy.cpp
lib/CodeGen/SplitKit.cpp
lib/CodeGen/SplitKit.h