Mercurial > hg > CbC > CbC_llvm
diff lib/Target/Hexagon/HexagonBlockRanges.h @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | 1172e4bd9c6f |
children | c2174574ed3a |
line wrap: on
line diff
--- a/lib/Target/Hexagon/HexagonBlockRanges.h Fri Nov 25 19:14:25 2016 +0900 +++ b/lib/Target/Hexagon/HexagonBlockRanges.h Fri Oct 27 17:07:41 2017 +0900 @@ -1,4 +1,4 @@ -//===--- HexagonBlockRanges.h ---------------------------------------------===// +//===- HexagonBlockRanges.h -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -6,39 +6,39 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -#ifndef HEXAGON_BLOCK_RANGES_H -#define HEXAGON_BLOCK_RANGES_H + +#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONBLOCKRANGES_H +#define LLVM_LIB_TARGET_HEXAGON_HEXAGONBLOCKRANGES_H #include "llvm/ADT/BitVector.h" -#include "llvm/CodeGen/MachineBasicBlock.h" -#include "llvm/MC/MCRegisterInfo.h" // For MCPhysReg. +#include <cassert> #include <map> #include <set> +#include <utility> #include <vector> namespace llvm { - class Function; - class HexagonSubtarget; - class MachineBasicBlock; - class MachineFunction; - class MachineInstr; - class MCInstrDesc; - class raw_ostream; - class TargetInstrInfo; - class TargetRegisterClass; - class TargetRegisterInfo; - class Type; + +class HexagonSubtarget; +class MachineBasicBlock; +class MachineFunction; +class MachineInstr; +class MachineRegisterInfo; +class raw_ostream; +class TargetInstrInfo; +class TargetRegisterInfo; struct HexagonBlockRanges { HexagonBlockRanges(MachineFunction &MF); struct RegisterRef { unsigned Reg, Sub; + bool operator<(RegisterRef R) const { return Reg < R.Reg || (Reg == R.Reg && Sub < R.Sub); } }; - typedef std::set<RegisterRef> RegisterSet; + using RegisterSet = std::set<RegisterRef>; // This is to represent an "index", which is an abstraction of a position // of an instruction within a basic block. @@ -50,10 +50,12 @@ Exit = 2, First = 11 // 10th + 1st }; + + IndexType() {} + IndexType(unsigned Idx) : Index(Idx) {} + static bool isInstr(IndexType X) { return X.Index >= First; } - IndexType() : Index(None) {} - IndexType(unsigned Idx) : Index(Idx) {} operator unsigned() const; bool operator== (unsigned x) const; bool operator== (IndexType Idx) const; @@ -68,7 +70,7 @@ bool operator> (IndexType Idx) const; bool operator>= (IndexType Idx) const; - unsigned Index; + unsigned Index = None; }; // A range of indices, essentially a representation of a live range. @@ -76,21 +78,23 @@ // register is dead. class IndexRange : public std::pair<IndexType,IndexType> { public: - IndexRange() : Fixed(false), TiedEnd(false) {} + IndexRange() = default; IndexRange(IndexType Start, IndexType End, bool F = false, bool T = false) : std::pair<IndexType,IndexType>(Start, End), Fixed(F), TiedEnd(T) {} + IndexType start() const { return first; } IndexType end() const { return second; } bool operator< (const IndexRange &A) const { return start() < A.start(); } + bool overlaps(const IndexRange &A) const; bool contains(const IndexRange &A) const; void merge(const IndexRange &A); - bool Fixed; // Can be renamed? "Fixed" means "no". - bool TiedEnd; // The end is not a use, but a dead def tied to a use. + bool Fixed = false; // Can be renamed? "Fixed" means "no". + bool TiedEnd = false; // The end is not a use, but a dead def tied to a use. private: void setStart(const IndexType &S) { first = S; } @@ -107,6 +111,7 @@ void add(const IndexRange &Range) { push_back(Range); } + void include(const RangeList &RL); void unionize(bool MergeAdjacent = false); void subtract(const IndexRange &Range); @@ -118,6 +123,7 @@ class InstrIndexMap { public: InstrIndexMap(MachineBasicBlock &B); + MachineInstr *getInstr(IndexType Idx) const; IndexType getIndex(MachineInstr *MI) const; MachineBasicBlock &getBlock() const { return Block; } @@ -126,6 +132,7 @@ void replaceInstr(MachineInstr *OldMI, MachineInstr *NewMI); friend raw_ostream &operator<< (raw_ostream &OS, const InstrIndexMap &Map); + IndexType First, Last; private: @@ -133,7 +140,8 @@ std::map<IndexType,MachineInstr*> Map; }; - typedef std::map<RegisterRef,RangeList> RegToRangeMap; + using RegToRangeMap = std::map<RegisterRef, RangeList>; + RegToRangeMap computeLiveMap(InstrIndexMap &IndexMap); RegToRangeMap computeDeadMap(InstrIndexMap &IndexMap, RegToRangeMap &LiveMap); static RegisterSet expandToSubRegs(RegisterRef R, @@ -144,6 +152,7 @@ : Map(M), TRI(I) {} friend raw_ostream &operator<< (raw_ostream &OS, const PrintRangeMap &P); + private: const RegToRangeMap ⤅ const TargetRegisterInfo &TRI; @@ -163,7 +172,6 @@ BitVector Reserved; }; - inline HexagonBlockRanges::IndexType::operator unsigned() const { assert(Index >= First); return Index; @@ -224,7 +232,6 @@ return operator==(Idx) || operator<(Idx); } - raw_ostream &operator<< (raw_ostream &OS, HexagonBlockRanges::IndexType Idx); raw_ostream &operator<< (raw_ostream &OS, const HexagonBlockRanges::IndexRange &IR); @@ -235,6 +242,6 @@ raw_ostream &operator<< (raw_ostream &OS, const HexagonBlockRanges::PrintRangeMap &P); -} // namespace llvm +} // end namespace llvm -#endif +#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONBLOCKRANGES_H