1
//===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
#ifndef LLVM_CODEGEN_SPLITTER_H
11
#define LLVM_CODEGEN_SPLITTER_H
13
#include "llvm/CodeGen/MachineFunctionPass.h"
14
#include "llvm/CodeGen/MachineLoopInfo.h"
15
#include "llvm/CodeGen/SlotIndexes.h"
28
class MachineDominatorTree;
29
class MachineRegisterInfo;
31
class TargetInstrInfo;
34
class LoopSplitter : public MachineFunctionPass {
35
friend class LoopSplit;
39
LoopSplitter() : MachineFunctionPass(ID) {}
41
virtual void getAnalysisUsage(AnalysisUsage &au) const;
43
virtual bool runOnMachineFunction(MachineFunction &fn);
45
virtual void releaseMemory();
53
MachineRegisterInfo *mri;
54
MachineDominatorTree *mdt;
56
const TargetInstrInfo *tii;
57
const TargetRegisterInfo *tri;
60
std::deque<LiveInterval*> intervals;
62
typedef std::pair<SlotIndex, SlotIndex> SlotPair;
63
typedef std::vector<SlotPair> LoopRanges;
64
typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap;
65
LoopRangeMap loopRangeMap;
67
void dumpLoopInfo(MachineLoop &loop);
69
void dumpOddTerminators();
71
void updateTerminators(MachineBasicBlock &mbb);
73
bool canInsertPreHeader(MachineLoop &loop);
74
MachineBasicBlock& insertPreHeader(MachineLoop &loop);
76
bool isCriticalEdge(MachineLoop::Edge &edge);
77
bool canSplitEdge(MachineLoop::Edge &edge);
78
MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop);
80
LoopRanges& getLoopRanges(MachineLoop &loop);
81
std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr,
84
void dumpLoopRanges(MachineLoop &loop);
86
void processHeader(LoopSplit &split);
87
void processLoopExits(LoopSplit &split);
88
void processLoopUses(LoopSplit &split);
90
bool splitOverLoop(LiveInterval &li, MachineLoop &loop);
92
void processInterval(LiveInterval &li);
94
void processIntervals();