diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 03:57:00 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 03:57:00 +0000 |
commit | db529a8a5d071610f3a8b467693bc40b073e68ef (patch) | |
tree | 6015bdec65b29b3a63176e18ac2838e0079b3bc3 /lib/CodeGen/SplitKit.h | |
parent | 6a1220eeca1f3511bcf6ffed43a9ae77624eb8a8 (diff) |
Analyze blocks with uses separately from live-through blocks without uses.
About 90% of the relevant blocks are live-through without uses, and the only
information required about them is their number. This saves memory and enables
later optimizations that need to look at only the use-blocks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128985 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SplitKit.h')
-rw-r--r-- | lib/CodeGen/SplitKit.h | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 793989f7e3..20ac8a1fdc 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IndexedMap.h" @@ -69,16 +70,11 @@ public: SlotIndex LastUse; ///< Last instr using current reg. SlotIndex Kill; ///< Interval end point inside block. SlotIndex Def; ///< Interval start point inside block. - bool Uses; ///< Current reg has uses or defs in block. bool LiveThrough; ///< Live in whole block (Templ 5. or 6. above). bool LiveIn; ///< Current reg is live in. bool LiveOut; ///< Current reg is live out. }; - /// Basic blocks where var is live. This array is parallel to - /// SpillConstraints. - SmallVector<BlockInfo, 8> LiveBlocks; - private: // Current live interval. const LiveInterval *CurLI; @@ -89,6 +85,12 @@ private: /// successor. SmallVector<std::pair<SlotIndex, SlotIndex>, 8> LastSplitPoint; + /// UseBlocks - Blocks where CurLI has uses. + SmallVector<BlockInfo, 8> UseBlocks; + + /// ThroughBlocks - Block numbers where CurLI is live through without uses. + SmallVector<unsigned, 8> ThroughBlocks; + SlotIndex computeLastSplitPoint(unsigned Num); // Sumarize statistics by counting instructions using CurLI. @@ -129,6 +131,14 @@ public: /// splitting. bool isOriginalEndpoint(SlotIndex Idx) const; + /// getUseBlocks - Return an array of BlockInfo objects for the basic blocks + /// where CurLI has uses. + ArrayRef<BlockInfo> getUseBlocks() { return UseBlocks; } + + /// getThroughBlocks - Return an array of block numbers where CurLI is live + /// through without uses. + ArrayRef<unsigned> getThroughBlocks() { return ThroughBlocks; } + typedef SmallPtrSet<const MachineBasicBlock*, 16> BlockPtrSet; /// getMultiUseBlocks - Add basic blocks to Blocks that may benefit from |