diff options
Diffstat (limited to 'contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp b/contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp index ecae27d..d90008a 100644 --- a/contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp +++ b/contrib/llvm/lib/Target/AMDGPU/R600OptimizeVectorRegisters.cpp @@ -31,22 +31,31 @@ #include "AMDGPUSubtarget.h" #include "R600Defines.h" #include "R600InstrInfo.h" -#include "llvm/CodeGen/DFAPacketizer.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineDominators.h" +#include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/Passes.h" +#include "llvm/IR/DebugLoc.h" +#include "llvm/PassAnalysisSupport.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" +#include <cassert> +#include <utility> +#include <vector> using namespace llvm; #define DEBUG_TYPE "vec-merger" -namespace { - static bool isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) { for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg), @@ -60,11 +69,14 @@ isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) { return false; } +namespace { + class RegSeqInfo { public: MachineInstr *Instr; DenseMap<unsigned, unsigned> RegToChan; std::vector<unsigned> UndefReg; + RegSeqInfo(MachineRegisterInfo &MRI, MachineInstr *MI) : Instr(MI) { assert(MI->getOpcode() == AMDGPU::REG_SEQUENCE); for (unsigned i = 1, e = Instr->getNumOperands(); i < e; i+=2) { @@ -76,7 +88,8 @@ public: RegToChan[MO.getReg()] = Chan; } } - RegSeqInfo() {} + + RegSeqInfo() = default; bool operator==(const RegSeqInfo &RSI) const { return RSI.Instr == Instr; @@ -87,28 +100,30 @@ class R600VectorRegMerger : public MachineFunctionPass { private: MachineRegisterInfo *MRI; const R600InstrInfo *TII; - bool canSwizzle(const MachineInstr &) const; + + bool canSwizzle(const MachineInstr &MI) const; bool areAllUsesSwizzeable(unsigned Reg) const; void SwizzleInput(MachineInstr &, - const std::vector<std::pair<unsigned, unsigned> > &) const; - bool tryMergeVector(const RegSeqInfo *, RegSeqInfo *, - std::vector<std::pair<unsigned, unsigned> > &Remap) const; + const std::vector<std::pair<unsigned, unsigned>> &RemapChan) const; + bool tryMergeVector(const RegSeqInfo *Untouched, RegSeqInfo *ToMerge, + std::vector<std::pair<unsigned, unsigned>> &Remap) const; bool tryMergeUsingCommonSlot(RegSeqInfo &RSI, RegSeqInfo &CompatibleRSI, - std::vector<std::pair<unsigned, unsigned> > &RemapChan); + std::vector<std::pair<unsigned, unsigned>> &RemapChan); bool tryMergeUsingFreeSlot(RegSeqInfo &RSI, RegSeqInfo &CompatibleRSI, - std::vector<std::pair<unsigned, unsigned> > &RemapChan); - MachineInstr *RebuildVector(RegSeqInfo *MI, - const RegSeqInfo *BaseVec, - const std::vector<std::pair<unsigned, unsigned> > &RemapChan) const; + std::vector<std::pair<unsigned, unsigned>> &RemapChan); + MachineInstr *RebuildVector(RegSeqInfo *MI, const RegSeqInfo *BaseVec, + const std::vector<std::pair<unsigned, unsigned>> &RemapChan) const; void RemoveMI(MachineInstr *); void trackRSI(const RegSeqInfo &RSI); - typedef DenseMap<unsigned, std::vector<MachineInstr *> > InstructionSetMap; + typedef DenseMap<unsigned, std::vector<MachineInstr *>> InstructionSetMap; DenseMap<MachineInstr *, RegSeqInfo> PreviousRegSeq; InstructionSetMap PreviousRegSeqByReg; InstructionSetMap PreviousRegSeqByUndefCount; + public: static char ID; + R600VectorRegMerger(TargetMachine &tm) : MachineFunctionPass(ID), TII(nullptr) { } @@ -121,13 +136,15 @@ public: MachineFunctionPass::getAnalysisUsage(AU); } - const char *getPassName() const override { + StringRef getPassName() const override { return "R600 Vector Registers Merge Pass"; } bool runOnMachineFunction(MachineFunction &Fn) override; }; +} // end anonymous namespace. + char R600VectorRegMerger::ID = 0; bool R600VectorRegMerger::canSwizzle(const MachineInstr &MI) @@ -144,7 +161,7 @@ bool R600VectorRegMerger::canSwizzle(const MachineInstr &MI) } bool R600VectorRegMerger::tryMergeVector(const RegSeqInfo *Untouched, - RegSeqInfo *ToMerge, std::vector< std::pair<unsigned, unsigned> > &Remap) + RegSeqInfo *ToMerge, std::vector< std::pair<unsigned, unsigned>> &Remap) const { unsigned CurrentUndexIdx = 0; for (DenseMap<unsigned, unsigned>::iterator It = ToMerge->RegToChan.begin(), @@ -167,7 +184,7 @@ bool R600VectorRegMerger::tryMergeVector(const RegSeqInfo *Untouched, static unsigned getReassignedChan( - const std::vector<std::pair<unsigned, unsigned> > &RemapChan, + const std::vector<std::pair<unsigned, unsigned>> &RemapChan, unsigned Chan) { for (unsigned j = 0, je = RemapChan.size(); j < je; j++) { if (RemapChan[j].first == Chan) @@ -178,7 +195,7 @@ unsigned getReassignedChan( MachineInstr *R600VectorRegMerger::RebuildVector( RegSeqInfo *RSI, const RegSeqInfo *BaseRSI, - const std::vector<std::pair<unsigned, unsigned> > &RemapChan) const { + const std::vector<std::pair<unsigned, unsigned>> &RemapChan) const { unsigned Reg = RSI->Instr->getOperand(0).getReg(); MachineBasicBlock::iterator Pos = RSI->Instr; MachineBasicBlock &MBB = *Pos->getParent(); @@ -200,12 +217,10 @@ MachineInstr *R600VectorRegMerger::RebuildVector( .addReg(SubReg) .addImm(Chan); UpdatedRegToChan[SubReg] = Chan; - std::vector<unsigned>::iterator ChanPos = - std::find(UpdatedUndef.begin(), UpdatedUndef.end(), Chan); + std::vector<unsigned>::iterator ChanPos = llvm::find(UpdatedUndef, Chan); if (ChanPos != UpdatedUndef.end()) UpdatedUndef.erase(ChanPos); - assert(std::find(UpdatedUndef.begin(), UpdatedUndef.end(), Chan) == - UpdatedUndef.end() && + assert(!is_contained(UpdatedUndef, Chan) && "UpdatedUndef shouldn't contain Chan more than once!"); DEBUG(dbgs() << " ->"; Tmp->dump();); (void)Tmp; @@ -236,17 +251,17 @@ void R600VectorRegMerger::RemoveMI(MachineInstr *MI) { for (InstructionSetMap::iterator It = PreviousRegSeqByReg.begin(), E = PreviousRegSeqByReg.end(); It != E; ++It) { std::vector<MachineInstr *> &MIs = (*It).second; - MIs.erase(std::find(MIs.begin(), MIs.end(), MI), MIs.end()); + MIs.erase(llvm::find(MIs, MI), MIs.end()); } for (InstructionSetMap::iterator It = PreviousRegSeqByUndefCount.begin(), E = PreviousRegSeqByUndefCount.end(); It != E; ++It) { std::vector<MachineInstr *> &MIs = (*It).second; - MIs.erase(std::find(MIs.begin(), MIs.end(), MI), MIs.end()); + MIs.erase(llvm::find(MIs, MI), MIs.end()); } } void R600VectorRegMerger::SwizzleInput(MachineInstr &MI, - const std::vector<std::pair<unsigned, unsigned> > &RemapChan) const { + const std::vector<std::pair<unsigned, unsigned>> &RemapChan) const { unsigned Offset; if (TII->get(MI.getOpcode()).TSFlags & R600_InstFlag::TEX_INST) Offset = 2; @@ -274,7 +289,7 @@ bool R600VectorRegMerger::areAllUsesSwizzeable(unsigned Reg) const { bool R600VectorRegMerger::tryMergeUsingCommonSlot(RegSeqInfo &RSI, RegSeqInfo &CompatibleRSI, - std::vector<std::pair<unsigned, unsigned> > &RemapChan) { + std::vector<std::pair<unsigned, unsigned>> &RemapChan) { for (MachineInstr::mop_iterator MOp = RSI.Instr->operands_begin(), MOE = RSI.Instr->operands_end(); MOp != MOE; ++MOp) { if (!MOp->isReg()) @@ -294,7 +309,7 @@ bool R600VectorRegMerger::tryMergeUsingCommonSlot(RegSeqInfo &RSI, bool R600VectorRegMerger::tryMergeUsingFreeSlot(RegSeqInfo &RSI, RegSeqInfo &CompatibleRSI, - std::vector<std::pair<unsigned, unsigned> > &RemapChan) { + std::vector<std::pair<unsigned, unsigned>> &RemapChan) { unsigned NeededUndefs = 4 - RSI.UndefReg.size(); if (PreviousRegSeqByUndefCount[NeededUndefs].empty()) return false; @@ -357,7 +372,7 @@ bool R600VectorRegMerger::runOnMachineFunction(MachineFunction &Fn) { }); RegSeqInfo CandidateRSI; - std::vector<std::pair<unsigned, unsigned> > RemapChan; + std::vector<std::pair<unsigned, unsigned>> RemapChan; DEBUG(dbgs() << "Using common slots...\n";); if (tryMergeUsingCommonSlot(RSI, CandidateRSI, RemapChan)) { // Remove CandidateRSI mapping @@ -381,8 +396,6 @@ bool R600VectorRegMerger::runOnMachineFunction(MachineFunction &Fn) { return false; } -} - llvm::FunctionPass *llvm::createR600VectorRegMerger(TargetMachine &tm) { return new R600VectorRegMerger(tm); } |