diff options
Diffstat (limited to 'lib/Target/Hexagon/HexagonGenPredicate.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonGenPredicate.cpp | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/lib/Target/Hexagon/HexagonGenPredicate.cpp b/lib/Target/Hexagon/HexagonGenPredicate.cpp index c0d2de90467a..e991fa8b61c8 100644 --- a/lib/Target/Hexagon/HexagonGenPredicate.cpp +++ b/lib/Target/Hexagon/HexagonGenPredicate.cpp @@ -1,9 +1,8 @@ //===- HexagonGenPredicate.cpp --------------------------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -46,17 +45,19 @@ namespace llvm { namespace { - struct Register { + // FIXME: Use TargetInstrInfo::RegSubRegPair + struct RegisterSubReg { unsigned R, S; - Register(unsigned r = 0, unsigned s = 0) : R(r), S(s) {} - Register(const MachineOperand &MO) : R(MO.getReg()), S(MO.getSubReg()) {} + RegisterSubReg(unsigned r = 0, unsigned s = 0) : R(r), S(s) {} + RegisterSubReg(const MachineOperand &MO) : R(MO.getReg()), S(MO.getSubReg()) {} + RegisterSubReg(const Register &Reg) : R(Reg), S(0) {} - bool operator== (const Register &Reg) const { + bool operator== (const RegisterSubReg &Reg) const { return R == Reg.R && S == Reg.S; } - bool operator< (const Register &Reg) const { + bool operator< (const RegisterSubReg &Reg) const { return R < Reg.R || (R == Reg.R && S < Reg.S); } }; @@ -64,10 +65,10 @@ namespace { struct PrintRegister { friend raw_ostream &operator<< (raw_ostream &OS, const PrintRegister &PR); - PrintRegister(Register R, const TargetRegisterInfo &I) : Reg(R), TRI(I) {} + PrintRegister(RegisterSubReg R, const TargetRegisterInfo &I) : Reg(R), TRI(I) {} private: - Register Reg; + RegisterSubReg Reg; const TargetRegisterInfo &TRI; }; @@ -99,8 +100,8 @@ namespace { private: using VectOfInst = SetVector<MachineInstr *>; - using SetOfReg = std::set<Register>; - using RegToRegMap = std::map<Register, Register>; + using SetOfReg = std::set<RegisterSubReg>; + using RegToRegMap = std::map<RegisterSubReg, RegisterSubReg>; const HexagonInstrInfo *TII = nullptr; const HexagonRegisterInfo *TRI = nullptr; @@ -111,12 +112,12 @@ namespace { bool isPredReg(unsigned R); void collectPredicateGPR(MachineFunction &MF); - void processPredicateGPR(const Register &Reg); + void processPredicateGPR(const RegisterSubReg &Reg); unsigned getPredForm(unsigned Opc); bool isConvertibleToPredForm(const MachineInstr *MI); bool isScalarCmp(unsigned Opc); - bool isScalarPred(Register PredReg); - Register getPredRegFor(const Register &Reg); + bool isScalarPred(RegisterSubReg PredReg); + RegisterSubReg getPredRegFor(const RegisterSubReg &Reg); bool convertToPredForm(MachineInstr *MI); bool eliminatePredCopies(MachineFunction &MF); }; @@ -211,7 +212,7 @@ void HexagonGenPredicate::collectPredicateGPR(MachineFunction &MF) { case Hexagon::C2_tfrpr: case TargetOpcode::COPY: if (isPredReg(MI->getOperand(1).getReg())) { - Register RD = MI->getOperand(0); + RegisterSubReg RD = MI->getOperand(0); if (TargetRegisterInfo::isVirtualRegister(RD.R)) PredGPRs.insert(RD); } @@ -221,7 +222,7 @@ void HexagonGenPredicate::collectPredicateGPR(MachineFunction &MF) { } } -void HexagonGenPredicate::processPredicateGPR(const Register &Reg) { +void HexagonGenPredicate::processPredicateGPR(const RegisterSubReg &Reg) { LLVM_DEBUG(dbgs() << __func__ << ": " << printReg(Reg.R, TRI, Reg.S) << "\n"); using use_iterator = MachineRegisterInfo::use_iterator; @@ -240,7 +241,7 @@ void HexagonGenPredicate::processPredicateGPR(const Register &Reg) { } } -Register HexagonGenPredicate::getPredRegFor(const Register &Reg) { +RegisterSubReg HexagonGenPredicate::getPredRegFor(const RegisterSubReg &Reg) { // Create a predicate register for a given Reg. The newly created register // will have its value copied from Reg, so that it can be later used as // an operand in other instructions. @@ -255,7 +256,7 @@ Register HexagonGenPredicate::getPredRegFor(const Register &Reg) { unsigned Opc = DefI->getOpcode(); if (Opc == Hexagon::C2_tfrpr || Opc == TargetOpcode::COPY) { assert(DefI->getOperand(0).isDef() && DefI->getOperand(1).isUse()); - Register PR = DefI->getOperand(1); + RegisterSubReg PR = DefI->getOperand(1); G2P.insert(std::make_pair(Reg, PR)); LLVM_DEBUG(dbgs() << " -> " << PrintRegister(PR, *TRI) << '\n'); return PR; @@ -272,10 +273,10 @@ Register HexagonGenPredicate::getPredRegFor(const Register &Reg) { MachineBasicBlock::iterator DefIt = DefI; BuildMI(B, std::next(DefIt), DL, TII->get(TargetOpcode::COPY), NewPR) .addReg(Reg.R, 0, Reg.S); - G2P.insert(std::make_pair(Reg, Register(NewPR))); - LLVM_DEBUG(dbgs() << " -> !" << PrintRegister(Register(NewPR), *TRI) + G2P.insert(std::make_pair(Reg, RegisterSubReg(NewPR))); + LLVM_DEBUG(dbgs() << " -> !" << PrintRegister(RegisterSubReg(NewPR), *TRI) << '\n'); - return Register(NewPR); + return RegisterSubReg(NewPR); } llvm_unreachable("Invalid argument"); @@ -317,12 +318,12 @@ bool HexagonGenPredicate::isScalarCmp(unsigned Opc) { return false; } -bool HexagonGenPredicate::isScalarPred(Register PredReg) { - std::queue<Register> WorkQ; +bool HexagonGenPredicate::isScalarPred(RegisterSubReg PredReg) { + std::queue<RegisterSubReg> WorkQ; WorkQ.push(PredReg); while (!WorkQ.empty()) { - Register PR = WorkQ.front(); + RegisterSubReg PR = WorkQ.front(); WorkQ.pop(); const MachineInstr *DefI = MRI->getVRegDef(PR.R); if (!DefI) @@ -351,7 +352,7 @@ bool HexagonGenPredicate::isScalarPred(Register PredReg) { // Add operands to the queue. for (const MachineOperand &MO : DefI->operands()) if (MO.isReg() && MO.isUse()) - WorkQ.push(Register(MO.getReg())); + WorkQ.push(RegisterSubReg(MO.getReg())); break; // All non-vector compares are ok, everything else is bad. @@ -373,7 +374,7 @@ bool HexagonGenPredicate::convertToPredForm(MachineInstr *MI) { MachineOperand &MO = MI->getOperand(i); if (!MO.isReg() || !MO.isUse()) continue; - Register Reg(MO); + RegisterSubReg Reg(MO); if (Reg.S && Reg.S != Hexagon::isub_lo) return false; if (!PredGPRs.count(Reg)) @@ -400,7 +401,7 @@ bool HexagonGenPredicate::convertToPredForm(MachineInstr *MI) { // If it's a scalar predicate register, then all bits in it are // the same. Otherwise, to determine whether all bits are 0 or not // we would need to use any8. - Register PR = getPredRegFor(MI->getOperand(1)); + RegisterSubReg PR = getPredRegFor(MI->getOperand(1)); if (!isScalarPred(PR)) return false; // This will skip the immediate argument when creating the predicate @@ -411,19 +412,19 @@ bool HexagonGenPredicate::convertToPredForm(MachineInstr *MI) { // Some sanity: check that def is in operand #0. MachineOperand &Op0 = MI->getOperand(0); assert(Op0.isDef()); - Register OutR(Op0); + RegisterSubReg OutR(Op0); // Don't use getPredRegFor, since it will create an association between // the argument and a created predicate register (i.e. it will insert a // copy if a new predicate register is created). const TargetRegisterClass *PredRC = &Hexagon::PredRegsRegClass; - Register NewPR = MRI->createVirtualRegister(PredRC); + RegisterSubReg NewPR = MRI->createVirtualRegister(PredRC); MachineInstrBuilder MIB = BuildMI(B, MI, DL, TII->get(NewOpc), NewPR.R); // Add predicate counterparts of the GPRs. for (unsigned i = 1; i < NumOps; ++i) { - Register GPR = MI->getOperand(i); - Register Pred = getPredRegFor(GPR); + RegisterSubReg GPR = MI->getOperand(i); + RegisterSubReg Pred = getPredRegFor(GPR); MIB.addReg(Pred.R, 0, Pred.S); } LLVM_DEBUG(dbgs() << "generated: " << *MIB); @@ -441,7 +442,7 @@ bool HexagonGenPredicate::convertToPredForm(MachineInstr *MI) { // then the output will be a predicate register. Do not visit the // users of it. if (!isPredReg(NewOutR)) { - Register R(NewOutR); + RegisterSubReg R(NewOutR); PredGPRs.insert(R); processPredicateGPR(R); } @@ -468,8 +469,8 @@ bool HexagonGenPredicate::eliminatePredCopies(MachineFunction &MF) { for (MachineInstr &MI : MBB) { if (MI.getOpcode() != TargetOpcode::COPY) continue; - Register DR = MI.getOperand(0); - Register SR = MI.getOperand(1); + RegisterSubReg DR = MI.getOperand(0); + RegisterSubReg SR = MI.getOperand(1); if (!TargetRegisterInfo::isVirtualRegister(DR.R)) continue; if (!TargetRegisterInfo::isVirtualRegister(SR.R)) |