102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#ifndef LLVM_CODEGEN_SPLITTER_H
 | 
						|
#define LLVM_CODEGEN_SPLITTER_H
 | 
						|
 | 
						|
#include "llvm/CodeGen/MachineFunctionPass.h"
 | 
						|
#include "llvm/CodeGen/MachineLoopInfo.h"
 | 
						|
#include "llvm/CodeGen/SlotIndexes.h"
 | 
						|
 | 
						|
#include <deque>
 | 
						|
#include <map>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
 | 
						|
  class LiveInterval;
 | 
						|
  class LiveIntervals;
 | 
						|
  struct LiveRange;
 | 
						|
  class LoopSplit;
 | 
						|
  class MachineDominatorTree;
 | 
						|
  class MachineRegisterInfo;
 | 
						|
  class SlotIndexes;
 | 
						|
  class TargetInstrInfo;
 | 
						|
  class VNInfo;
 | 
						|
 | 
						|
  class LoopSplitter : public MachineFunctionPass {
 | 
						|
    friend class LoopSplit;
 | 
						|
  public:
 | 
						|
    static char ID;
 | 
						|
 | 
						|
    LoopSplitter() : MachineFunctionPass(ID) {
 | 
						|
      initializeLoopSplitterPass(*PassRegistry::getPassRegistry());
 | 
						|
    }
 | 
						|
 | 
						|
    virtual void getAnalysisUsage(AnalysisUsage &au) const;
 | 
						|
 | 
						|
    virtual bool runOnMachineFunction(MachineFunction &fn);
 | 
						|
 | 
						|
    virtual void releaseMemory();
 | 
						|
 | 
						|
 | 
						|
  private:
 | 
						|
 | 
						|
    MachineFunction *mf;
 | 
						|
    LiveIntervals *lis;
 | 
						|
    MachineLoopInfo *mli;
 | 
						|
    MachineRegisterInfo *mri;
 | 
						|
    MachineDominatorTree *mdt;
 | 
						|
    SlotIndexes *sis;
 | 
						|
    const TargetInstrInfo *tii;
 | 
						|
    const TargetRegisterInfo *tri;
 | 
						|
 | 
						|
    std::string fqn;
 | 
						|
    std::deque<LiveInterval*> intervals;
 | 
						|
 | 
						|
    typedef std::pair<SlotIndex, SlotIndex> SlotPair;
 | 
						|
    typedef std::vector<SlotPair> LoopRanges;
 | 
						|
    typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap;
 | 
						|
    LoopRangeMap loopRangeMap;
 | 
						|
 | 
						|
    void dumpLoopInfo(MachineLoop &loop);
 | 
						|
 | 
						|
    void dumpOddTerminators();
 | 
						|
 | 
						|
    void updateTerminators(MachineBasicBlock &mbb);
 | 
						|
 | 
						|
    bool canInsertPreHeader(MachineLoop &loop);
 | 
						|
    MachineBasicBlock& insertPreHeader(MachineLoop &loop);
 | 
						|
 | 
						|
    bool isCriticalEdge(MachineLoop::Edge &edge);
 | 
						|
    bool canSplitEdge(MachineLoop::Edge &edge);
 | 
						|
    MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop);
 | 
						|
 | 
						|
    LoopRanges& getLoopRanges(MachineLoop &loop);
 | 
						|
    std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr,
 | 
						|
                                              MachineLoop &loop);
 | 
						|
 | 
						|
    void dumpLoopRanges(MachineLoop &loop);
 | 
						|
 | 
						|
    void processHeader(LoopSplit &split);
 | 
						|
    void processLoopExits(LoopSplit &split);
 | 
						|
    void processLoopUses(LoopSplit &split);
 | 
						|
 | 
						|
    bool splitOverLoop(LiveInterval &li, MachineLoop &loop);
 | 
						|
 | 
						|
    void processInterval(LiveInterval &li);
 | 
						|
 | 
						|
    void processIntervals();
 | 
						|
  };
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |