SplitKit.h revision cfa7134a9c33c0c7f8dda359c89dc6763a258e07
114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===-------- SplitKit.cpp - Toolkit for splitting live ranges --*- C++ -*-===//
28ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//
38ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
48ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//
58ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
68ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen// License. See LICENSE.TXT for details.
78ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//
88ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//===----------------------------------------------------------------------===//
98ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//
108ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen// This file contains the SplitAnalysis class as well as mutator functions for
118ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen// live range splitting.
128ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//
138ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen//===----------------------------------------------------------------------===//
148ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
158ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen#include "llvm/ADT/SmallPtrSet.h"
168ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen#include "llvm/ADT/DenseMap.h"
17f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen#include "llvm/CodeGen/SlotIndexes.h"
188ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
198ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesennamespace llvm {
208ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
218ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass LiveInterval;
228ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass LiveIntervals;
23a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesenclass LiveRangeEdit;
248ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass MachineInstr;
258ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass MachineLoop;
268ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass MachineLoopInfo;
27f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenclass MachineRegisterInfo;
286a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesenclass TargetInstrInfo;
29cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesenclass TargetRegisterInfo;
30f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenclass VirtRegMap;
31f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenclass VNInfo;
32532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesenclass raw_ostream;
338ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
34e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen/// At some point we should just include MachineDominators.h:
35e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesenclass MachineDominatorTree;
36e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesentemplate <class NodeT> class DomTreeNodeBase;
37e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesentypedef DomTreeNodeBase<MachineBasicBlock> MachineDomTreeNode;
38e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen
39f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen/// SplitAnalysis - Analyze a LiveInterval, looking for live range splitting
40f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen/// opportunities.
418ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenclass SplitAnalysis {
4208e93b14c37277ab40b835de340f89ba357d3332Jakob Stoklund Olesenpublic:
438ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  const MachineFunction &mf_;
448ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  const LiveIntervals &lis_;
458ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  const MachineLoopInfo &loops_;
466a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  const TargetInstrInfo &tii_;
478ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
488ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  // Instructions using the the current register.
498ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  typedef SmallPtrSet<const MachineInstr*, 16> InstrPtrSet;
508ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  InstrPtrSet usingInstrs_;
518ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
528ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  // The number of instructions using curli in each basic block.
538ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  typedef DenseMap<const MachineBasicBlock*, unsigned> BlockCountMap;
548ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  BlockCountMap usingBlocks_;
558ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
562dee7a527b083e259f9e826c57c1e5dab9540798Jakob Stoklund Olesen  // The number of basic block using curli in each loop.
572dee7a527b083e259f9e826c57c1e5dab9540798Jakob Stoklund Olesen  typedef DenseMap<const MachineLoop*, unsigned> LoopCountMap;
582dee7a527b083e259f9e826c57c1e5dab9540798Jakob Stoklund Olesen  LoopCountMap usingLoops_;
598ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
60f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesenprivate:
61f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  // Current live interval.
62f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  const LiveInterval *curli_;
63f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen
648ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  // Sumarize statistics by counting instructions using curli_.
65abff28087fd6be8150ff0e69def7de7312b2f76bJakob Stoklund Olesen  void analyzeUses();
668ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
676a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// canAnalyzeBranch - Return true if MBB ends in a branch that can be
686a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// analyzed.
696a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  bool canAnalyzeBranch(const MachineBasicBlock *MBB);
706a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
718ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenpublic:
72f2c6e367c1c0d8797e62e58a3ccdb8cceee27987Jakob Stoklund Olesen  SplitAnalysis(const MachineFunction &mf, const LiveIntervals &lis,
73f2c6e367c1c0d8797e62e58a3ccdb8cceee27987Jakob Stoklund Olesen                const MachineLoopInfo &mli);
748ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
758ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// analyze - set curli to the specified interval, and analyze how it may be
768ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// split.
778ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  void analyze(const LiveInterval *li);
788ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
798ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// clear - clear all data structures so SplitAnalysis is ready to analyze a
808ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// new interval.
818ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  void clear();
828ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
836a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  typedef SmallPtrSet<const MachineBasicBlock*, 16> BlockPtrSet;
842dee7a527b083e259f9e826c57c1e5dab9540798Jakob Stoklund Olesen  typedef SmallPtrSet<const MachineLoop*, 16> LoopPtrSet;
856a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
86532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen  // Print a set of blocks with use counts.
87532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen  void print(const BlockPtrSet&, raw_ostream&) const;
88532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen
896a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  // Sets of basic blocks surrounding a machine loop.
906a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  struct LoopBlocks {
916a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen    BlockPtrSet Loop;  // Blocks in the loop.
926a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen    BlockPtrSet Preds; // Loop predecessor blocks.
936a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen    BlockPtrSet Exits; // Loop exit blocks.
946a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
956a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen    void clear() {
966a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen      Loop.clear();
976a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen      Preds.clear();
986a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen      Exits.clear();
996a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen    }
1006a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  };
1016a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
102532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen  // Print loop blocks with use counts.
103532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen  void print(const LoopBlocks&, raw_ostream&) const;
104532de3dc6ea98387368954c0ac0e07b0adca8b62Jakob Stoklund Olesen
1056a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  // Calculate the block sets surrounding the loop.
1066a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  void getLoopBlocks(const MachineLoop *Loop, LoopBlocks &Blocks);
1076a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
1088ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// LoopPeripheralUse - how is a variable used in and around a loop?
1098ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// Peripheral blocks are the loop predecessors and exit blocks.
1108ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  enum LoopPeripheralUse {
1118ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen    ContainedInLoop,  // All uses are inside the loop.
1128ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen    SinglePeripheral, // At most one instruction per peripheral block.
1138ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen    MultiPeripheral,  // Multiple instructions in some peripheral blocks.
1148ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen    OutsideLoop       // Uses outside loop periphery.
1158ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  };
1168ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
1178ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// analyzeLoopPeripheralUse - Return an enum describing how curli_ is used in
1188ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// and around the Loop.
1196a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  LoopPeripheralUse analyzeLoopPeripheralUse(const LoopBlocks&);
1206a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
1216a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// getCriticalExits - It may be necessary to partially break critical edges
1226a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// leaving the loop if an exit block has phi uses of curli. Collect the exit
1236a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// blocks that need special treatment into CriticalExits.
1246a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  void getCriticalExits(const LoopBlocks &Blocks, BlockPtrSet &CriticalExits);
1256a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen
1266a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// canSplitCriticalExits - Return true if it is possible to insert new exit
1276a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  /// blocks before the blocks in CriticalExits.
1286a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen  bool canSplitCriticalExits(const LoopBlocks &Blocks,
1296a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen                             BlockPtrSet &CriticalExits);
1308ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
1310960a650b7047373da25bee6ec2eb73889c3b7bbJakob Stoklund Olesen  /// getCriticalPreds - Get the set of loop predecessors with critical edges to
1320960a650b7047373da25bee6ec2eb73889c3b7bbJakob Stoklund Olesen  /// blocks outside the loop that have curli live in. We don't have to break
1330960a650b7047373da25bee6ec2eb73889c3b7bbJakob Stoklund Olesen  /// these edges, but they do require special treatment.
1340960a650b7047373da25bee6ec2eb73889c3b7bbJakob Stoklund Olesen  void getCriticalPreds(const LoopBlocks &Blocks, BlockPtrSet &CriticalPreds);
1350960a650b7047373da25bee6ec2eb73889c3b7bbJakob Stoklund Olesen
1368ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// getBestSplitLoop - Return the loop where curli may best be split to a
1378ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  /// separate register, or NULL.
1388ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen  const MachineLoop *getBestSplitLoop();
139f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen
140f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// getMultiUseBlocks - Add basic blocks to Blocks that may benefit from
141f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// having curli split to a new live interval. Return true if Blocks can be
142f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// passed to SplitEditor::splitSingleBlocks.
143f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  bool getMultiUseBlocks(BlockPtrSet &Blocks);
144fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen
145fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen  /// getBlockForInsideSplit - If curli is contained inside a single basic block,
146fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen  /// and it wou pay to subdivide the interval inside that block, return it.
147fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen  /// Otherwise return NULL. The returned block can be passed to
148fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen  /// SplitEditor::splitInsideBlock.
149fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen  const MachineBasicBlock *getBlockForInsideSplit();
1508ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen};
1518ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
1521407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
1531407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// LiveIntervalMap - Map values from a large LiveInterval into a small
1541407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// interval that is a subset. Insert phi-def values as needed. This class is
1551407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// used by SplitEditor to create new smaller LiveIntervals.
1561407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen///
1571407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// parentli_ is the larger interval, li_ is the subset interval. Every value
1581407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// in li_ corresponds to exactly one value in parentli_, and the live range
1591407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// of the value is contained within the live range of the parentli_ value.
1601407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen/// Values in parentli_ may map to any number of openli_ values, including 0.
1611407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesenclass LiveIntervalMap {
1621407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  LiveIntervals &lis_;
163d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen  MachineDominatorTree &mdt_;
1641407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
1651407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // The parent interval is never changed.
1661407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  const LiveInterval &parentli_;
1671407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
1681407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // The child interval's values are fully contained inside parentli_ values.
1699ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen  LiveInterval *li_;
1701407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
1711407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  typedef DenseMap<const VNInfo*, VNInfo*> ValueMap;
1721407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
1731407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // Map parentli_ values to simple values in li_ that are defined at the same
1741407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // SlotIndex, or NULL for parentli_ values that have complex li_ defs.
1751407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // Note there is a difference between values mapping to NULL (complex), and
1761407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  // values not present (unknown/unmapped).
1771407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  ValueMap valueMap_;
1781407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
179e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  typedef std::pair<VNInfo*, MachineDomTreeNode*> LiveOutPair;
180e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  typedef DenseMap<MachineBasicBlock*,LiveOutPair> LiveOutMap;
181e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen
182e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  // liveOutCache_ - Map each basic block where li_ is live out to the live-out
183e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  // value and its defining block. One of these conditions shall be true:
184e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //
185e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //  1. !liveOutCache_.count(MBB)
186e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //  2. liveOutCache_[MBB].second.getNode() == MBB
187e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //  3. forall P in preds(MBB): liveOutCache_[P] == liveOutCache_[MBB]
188e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //
189e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  // This is only a cache, the values can be computed as:
190e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //
191e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //  VNI = li_->getVNInfoAt(lis_.getMBBEndIdx(MBB))
192e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //  Node = mbt_[lis_.getMBBFromIndex(VNI->def)]
193e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  //
194e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  // The cache is also used as a visiteed set by mapValue().
195e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen  LiveOutMap liveOutCache_;
196e1dde7b05a83438eeba4bd83f8cf080f56d22c5bJakob Stoklund Olesen
1971407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesenpublic:
1981407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  LiveIntervalMap(LiveIntervals &lis,
199d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen                  MachineDominatorTree &mdt,
2009ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen                  const LiveInterval &parentli)
201d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen    : lis_(lis), mdt_(mdt), parentli_(parentli), li_(0) {}
2029ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen
2039ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen  /// reset - clear all data structures and start a new live interval.
2049ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen  void reset(LiveInterval *);
2059ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen
2069ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen  /// getLI - return the current live interval.
2079ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen  LiveInterval *getLI() const { return li_; }
2081407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
2091407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// defValue - define a value in li_ from the parentli_ value VNI and Idx.
2101407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// Idx does not have to be ParentVNI->def, but it must be contained within
2111407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// ParentVNI's live range in parentli_.
2121407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// Return the new li_ value.
2131407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  VNInfo *defValue(const VNInfo *ParentVNI, SlotIndex Idx);
2141407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
2151407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// mapValue - map ParentVNI to the corresponding li_ value at Idx. It is
2161407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// assumed that ParentVNI is live at Idx.
2171407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// If ParentVNI has not been defined by defValue, it is assumed that
2181407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// ParentVNI->def dominates Idx.
2191407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// If ParentVNI has been defined by defValue one or more times, a value that
2201407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// dominates Idx will be returned. This may require creating extra phi-def
2211407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// values and adding live ranges to li_.
2225fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// If simple is not NULL, *simple will indicate if ParentVNI is a simply
2235fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// mapped value.
2245fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  VNInfo *mapValue(const VNInfo *ParentVNI, SlotIndex Idx, bool *simple = 0);
2255fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen
226fc60d7729bb5b63b7d61e370e51bd05e9a18b8bcJakob Stoklund Olesen  // extendTo - Find the last li_ value defined in MBB at or before Idx. The
227fc60d7729bb5b63b7d61e370e51bd05e9a18b8bcJakob Stoklund Olesen  // parentli is assumed to be live at Idx. Extend the live range to include
228fc60d7729bb5b63b7d61e370e51bd05e9a18b8bcJakob Stoklund Olesen  // Idx. Return the found VNInfo, or NULL.
229c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen  VNInfo *extendTo(const MachineBasicBlock *MBB, SlotIndex Idx);
230fc60d7729bb5b63b7d61e370e51bd05e9a18b8bcJakob Stoklund Olesen
2315fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// isMapped - Return true is ParentVNI is a known mapped value. It may be a
2325fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// simple 1-1 mapping or a complex mapping to later defs.
2335fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  bool isMapped(const VNInfo *ParentVNI) const {
2345fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen    return valueMap_.count(ParentVNI);
2355fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  }
2365fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen
2375fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// isComplexMapped - Return true if ParentVNI has received new definitions
2385fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// with defValue.
2395fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  bool isComplexMapped(const VNInfo *ParentVNI) const;
2405fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen
2415fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  // addSimpleRange - Add a simple range from parentli_ to li_.
2425fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  // ParentVNI must be live in the [Start;End) interval.
2435fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  void addSimpleRange(SlotIndex Start, SlotIndex End, const VNInfo *ParentVNI);
2441407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
2451407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// addRange - Add live ranges to li_ where [Start;End) intersects parentli_.
2461407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// All needed values whose def is not inside [Start;End) must be defined
2471407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  /// beforehand so mapValue will work.
2481407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen  void addRange(SlotIndex Start, SlotIndex End);
2491407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen};
2501407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
2511407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen
252f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen/// SplitEditor - Edit machine code and LiveIntervals for live range
253f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen/// splitting.
254f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen///
2555eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen/// - Create a SplitEditor from a SplitAnalysis.
2567536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen/// - Start a new live interval with openIntv.
2577536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen/// - Mark the places where the new interval is entered using enterIntv*
2587536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen/// - Mark the ranges where the new interval is used with useIntv*
2597536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen/// - Mark the places where the interval is exited with exitIntv*.
2607536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen/// - Finish the current interval with closeIntv and repeat from 2.
2617466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen/// - Rewrite instructions with finish().
262f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen///
263f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenclass SplitEditor {
264f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  SplitAnalysis &sa_;
265f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  LiveIntervals &lis_;
266f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  VirtRegMap &vrm_;
267f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  MachineRegisterInfo &mri_;
268f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  const TargetInstrInfo &tii_;
269cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen  const TargetRegisterInfo &tri_;
270f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
271a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  /// edit_ - The current parent register and new intervals created.
272a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen  LiveRangeEdit &edit_;
273a17768f5822ab62bc18608e5ba473187bf726b84Jakob Stoklund Olesen
2745eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen  /// dupli_ - Created as a copy of curli_, ranges are carved out as new
2755eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen  /// intervals get added through openIntv / closeIntv. This is used to avoid
2765eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen  /// editing curli_.
277dd9f3fdc77b77b10710c27050d508d7c7fb40c25Jakob Stoklund Olesen  LiveIntervalMap dupli_;
278f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
279f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  /// Currently open LiveInterval.
280dd9f3fdc77b77b10710c27050d508d7c7fb40c25Jakob Stoklund Olesen  LiveIntervalMap openli_;
281f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
282cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen  /// defFromParent - Define Reg from ParentVNI at UseIdx using either
283cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen  /// rematerialization or a COPY from parent. Return the new value.
284cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen  VNInfo *defFromParent(LiveIntervalMap &Reg,
285cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen                        VNInfo *ParentVNI,
286cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen                        SlotIndex UseIdx,
287cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen                        MachineBasicBlock &MBB,
288cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen                        MachineBasicBlock::iterator I);
289cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen
2905fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// intervalsLiveAt - Return true if any member of intervals_ is live at Idx.
2915fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  bool intervalsLiveAt(SlotIndex Idx) const;
2925fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen
2935fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// Values in curli whose live range has been truncated when entering an open
2945fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// li.
2955fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  SmallPtrSet<const VNInfo*, 8> truncatedValues;
2965fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen
2975fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// addTruncSimpleRange - Add the given simple range to dupli_ after
2985fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  /// truncating any overlap with intervals_.
2995fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen  void addTruncSimpleRange(SlotIndex Start, SlotIndex End, VNInfo *VNI);
300f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
301c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen  /// criticalPreds_ - Set of basic blocks where both dupli and openli should be
302c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen  /// live out because of a critical edge.
303c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen  SplitAnalysis::BlockPtrSet criticalPreds_;
304c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen
3057466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  /// computeRemainder - Compute the dupli liveness as the complement of all the
3067466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  /// new intervals.
3077466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  void computeRemainder();
3087466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen
3097466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  /// rewrite - Rewrite all uses of reg to use the new registers.
3107466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  void rewrite(unsigned reg);
3117466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen
312f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenpublic:
313f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
3147536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// Newly created intervals will be appended to newIntervals.
315d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen  SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&,
316d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen              MachineDominatorTree&, LiveRangeEdit&);
317f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3185eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen  /// getAnalysis - Get the corresponding analysis.
3195eb308b9448ee5b14fac26c0533eac481bc28471Jakob Stoklund Olesen  SplitAnalysis &getAnalysis() { return sa_; }
320f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3217536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// Create a new virtual register and live interval.
3227536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  void openIntv();
323f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
324f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// enterIntvBefore - Enter openli before the instruction at Idx. If curli is
325f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// not live before Idx, a COPY is not inserted.
326f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  void enterIntvBefore(SlotIndex Idx);
327f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen
3287536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// enterIntvAtEnd - Enter openli at the end of MBB.
329f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen  void enterIntvAtEnd(MachineBasicBlock &MBB);
330f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3317536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// useIntv - indicate that all instructions in MBB should use openli.
3327536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  void useIntv(const MachineBasicBlock &MBB);
333f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3347536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// useIntv - indicate that all instructions in range should use openli.
3357536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  void useIntv(SlotIndex Start, SlotIndex End);
336f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
337f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// leaveIntvAfter - Leave openli after the instruction at Idx.
338f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  void leaveIntvAfter(SlotIndex Idx);
339f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen
3407536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// leaveIntvAtTop - Leave the interval at the top of MBB.
3417536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// Currently, only one value can leave the interval.
3427536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  void leaveIntvAtTop(MachineBasicBlock &MBB);
343f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3447536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  /// closeIntv - Indicate that we are done editing the currently open
345f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  /// LiveInterval, and ranges can be trimmed.
3467536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen  void closeIntv();
347f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
3487466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  /// finish - after all the new live ranges have been created, compute the
3497466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  /// remaining live range, and rewrite instructions to use the new registers.
3507466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen  void finish();
351f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
352f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  // ===--- High level methods ---===
353f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
354f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen  /// splitAroundLoop - Split curli into a separate live interval inside
35557d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  /// the loop.
35657d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  void splitAroundLoop(const MachineLoop*);
357f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen
358f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen  /// splitSingleBlocks - Split curli into a separate live interval inside each
35957d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  /// basic block in Blocks.
36057d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  void splitSingleBlocks(const SplitAnalysis::BlockPtrSet &Blocks);
36157d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen
36257d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  /// splitInsideBlock - Split curli into multiple intervals inside MBB.
36357d0f2deb0afefe69770a28937a4363e7b1f9753Jakob Stoklund Olesen  void splitInsideBlock(const MachineBasicBlock *);
364fc412d85c46a8656361fe1e9197ea85922e2cd61Jakob Stoklund Olesen};
3658ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen
3668ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen}
367