Home | History | Annotate | Download | only in CodeGen
      1 //===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_CODEGEN_SPLITTER_H
     11 #define LLVM_CODEGEN_SPLITTER_H
     12 
     13 #include "llvm/CodeGen/MachineFunctionPass.h"
     14 #include "llvm/CodeGen/MachineLoopInfo.h"
     15 #include "llvm/CodeGen/SlotIndexes.h"
     16 
     17 #include <deque>
     18 #include <map>
     19 #include <string>
     20 #include <vector>
     21 
     22 namespace llvm {
     23 
     24   class LiveInterval;
     25   class LiveIntervals;
     26   struct LiveRange;
     27   class LoopSplit;
     28   class MachineDominatorTree;
     29   class MachineRegisterInfo;
     30   class SlotIndexes;
     31   class TargetInstrInfo;
     32   class VNInfo;
     33 
     34   class LoopSplitter : public MachineFunctionPass {
     35     friend class LoopSplit;
     36   public:
     37     static char ID;
     38 
     39     LoopSplitter() : MachineFunctionPass(ID) {
     40       initializeLoopSplitterPass(*PassRegistry::getPassRegistry());
     41     }
     42 
     43     virtual void getAnalysisUsage(AnalysisUsage &au) const;
     44 
     45     virtual bool runOnMachineFunction(MachineFunction &fn);
     46 
     47     virtual void releaseMemory();
     48 
     49 
     50   private:
     51 
     52     MachineFunction *mf;
     53     LiveIntervals *lis;
     54     MachineLoopInfo *mli;
     55     MachineRegisterInfo *mri;
     56     MachineDominatorTree *mdt;
     57     SlotIndexes *sis;
     58     const TargetInstrInfo *tii;
     59     const TargetRegisterInfo *tri;
     60 
     61     std::string fqn;
     62     std::deque<LiveInterval*> intervals;
     63 
     64     typedef std::pair<SlotIndex, SlotIndex> SlotPair;
     65     typedef std::vector<SlotPair> LoopRanges;
     66     typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap;
     67     LoopRangeMap loopRangeMap;
     68 
     69     void dumpLoopInfo(MachineLoop &loop);
     70 
     71     void dumpOddTerminators();
     72 
     73     void updateTerminators(MachineBasicBlock &mbb);
     74 
     75     bool canInsertPreHeader(MachineLoop &loop);
     76     MachineBasicBlock& insertPreHeader(MachineLoop &loop);
     77 
     78     bool isCriticalEdge(MachineLoop::Edge &edge);
     79     bool canSplitEdge(MachineLoop::Edge &edge);
     80     MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop);
     81 
     82     LoopRanges& getLoopRanges(MachineLoop &loop);
     83     std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr,
     84                                               MachineLoop &loop);
     85 
     86     void dumpLoopRanges(MachineLoop &loop);
     87 
     88     void processHeader(LoopSplit &split);
     89     void processLoopExits(LoopSplit &split);
     90     void processLoopUses(LoopSplit &split);
     91 
     92     bool splitOverLoop(LiveInterval &li, MachineLoop &loop);
     93 
     94     void processInterval(LiveInterval &li);
     95 
     96     void processIntervals();
     97   };
     98 
     99 }
    100 
    101 #endif
    102