Mercurial > hg > CbC > CbC_llvm
diff llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @ 252:1f2b6ac9f198 llvm-original
LLVM16-1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Aug 2023 09:04:13 +0900 |
parents | c4bab56944e8 |
children |
line wrap: on
line diff
--- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp Wed Nov 09 17:47:54 2022 +0900 +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp Fri Aug 18 09:04:13 2023 +0900 @@ -19,6 +19,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/DFAPacketizer.h" #include "llvm/CodeGen/LivePhysRegs.h" @@ -33,6 +34,7 @@ #include "llvm/CodeGen/MachineMemOperand.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/MachineValueType.h" #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" @@ -48,7 +50,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/MachineValueType.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" @@ -57,6 +58,7 @@ #include <cstdint> #include <cstring> #include <iterator> +#include <optional> #include <string> #include <utility> @@ -126,12 +128,12 @@ } } -static bool isIntRegForSubInst(unsigned Reg) { +static bool isIntRegForSubInst(Register Reg) { return (Reg >= Hexagon::R0 && Reg <= Hexagon::R7) || (Reg >= Hexagon::R16 && Reg <= Hexagon::R23); } -static bool isDblRegForSubInst(unsigned Reg, const HexagonRegisterInfo &HRI) { +static bool isDblRegForSubInst(Register Reg, const HexagonRegisterInfo &HRI) { return isIntRegForSubInst(HRI.getSubReg(Reg, Hexagon::isub_lo)) && isIntRegForSubInst(HRI.getSubReg(Reg, Hexagon::isub_hi)); } @@ -233,7 +235,7 @@ /// This treats possible (predicated) defs as actually happening ones /// (conservatively). static inline void parseOperands(const MachineInstr &MI, - SmallVector<unsigned, 4> &Defs, SmallVector<unsigned, 8> &Uses) { + SmallVectorImpl<Register> &Defs, SmallVectorImpl<Register> &Uses) { Defs.clear(); Uses.clear(); @@ -750,12 +752,12 @@ return MI == EndLoop; } - Optional<bool> - createTripCountGreaterCondition(int TC, MachineBasicBlock &MBB, - SmallVectorImpl<MachineOperand> &Cond) override { + std::optional<bool> createTripCountGreaterCondition( + int TC, MachineBasicBlock &MBB, + SmallVectorImpl<MachineOperand> &Cond) override { if (TripCount == -1) { // Check if we're done with the loop. - unsigned Done = TII->createVR(MF, MVT::i1); + Register Done = TII->createVR(MF, MVT::i1); MachineInstr *NewCmp = BuildMI(&MBB, DL, TII->get(Hexagon::C2_cmpgtui), Done) .addReg(LoopCount) @@ -953,8 +955,11 @@ } void HexagonInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, Register SrcReg, bool isKill, int FI, - const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const { + MachineBasicBlock::iterator I, + Register SrcReg, bool isKill, int FI, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI, + Register VReg) const { DebugLoc DL = MBB.findDebugLoc(I); MachineFunction &MF = *MBB.getParent(); MachineFrameInfo &MFI = MF.getFrameInfo(); @@ -997,10 +1002,12 @@ } } -void HexagonInstrInfo::loadRegFromStackSlot( - MachineBasicBlock &MBB, MachineBasicBlock::iterator I, Register DestReg, - int FI, const TargetRegisterClass *RC, - const TargetRegisterInfo *TRI) const { +void HexagonInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, + MachineBasicBlock::iterator I, + Register DestReg, int FI, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI, + Register VReg) const { DebugLoc DL = MBB.findDebugLoc(I); MachineFunction &MF = *MBB.getParent(); MachineFrameInfo &MFI = MF.getFrameInfo(); @@ -1052,7 +1059,7 @@ auto RealCirc = [&](unsigned Opc, bool HasImm, unsigned MxOp) { Register Mx = MI.getOperand(MxOp).getReg(); - unsigned CSx = (Mx == Hexagon::M0 ? Hexagon::CS0 : Hexagon::CS1); + Register CSx = (Mx == Hexagon::M0 ? Hexagon::CS0 : Hexagon::CS1); BuildMI(MBB, MI, DL, get(Hexagon::A2_tfrrcr), CSx) .add(MI.getOperand((HasImm ? 5 : 4))); auto MIB = BuildMI(MBB, MI, DL, get(Opc)).add(MI.getOperand(0)) @@ -1690,7 +1697,8 @@ NOp++; } - unsigned PredReg, PredRegPos, PredRegFlags; + Register PredReg; + unsigned PredRegPos, PredRegFlags; bool GotPredReg = getPredReg(Cond, PredReg, PredRegPos, PredRegFlags); (void)GotPredReg; assert(GotPredReg); @@ -1734,7 +1742,7 @@ } continue; } else if (MO.isRegMask()) { - for (unsigned PR : Hexagon::PredRegsRegClass) { + for (Register PR : Hexagon::PredRegsRegClass) { if (!MI.modifiesRegister(PR, &HRI)) continue; Pred.push_back(MO); @@ -2076,7 +2084,7 @@ {MO_IEGOT, "hexagon-iegot"}, {MO_TPREL, "hexagon-tprel"} }; - return makeArrayRef(Flags); + return ArrayRef(Flags); } ArrayRef<std::pair<unsigned, const char*>> @@ -2086,10 +2094,10 @@ static const std::pair<unsigned, const char*> Flags[] = { {HMOTF_ConstExtended, "hexagon-ext"} }; - return makeArrayRef(Flags); + return ArrayRef(Flags); } -unsigned HexagonInstrInfo::createVR(MachineFunction *MF, MVT VT) const { +Register HexagonInstrInfo::createVR(MachineFunction *MF, MVT VT) const { MachineRegisterInfo &MRI = MF->getRegInfo(); const TargetRegisterClass *TRC; if (VT == MVT::i1) { @@ -2170,11 +2178,17 @@ // have 'isExtended' flag set. assert(MO.isImm() && "Extendable operand must be Immediate type"); - int MinValue = getMinValue(MI); - int MaxValue = getMaxValue(MI); - int ImmValue = MO.getImm(); - - return (ImmValue < MinValue || ImmValue > MaxValue); + int64_t Value = MO.getImm(); + if ((F >> HexagonII::ExtentSignedPos) & HexagonII::ExtentSignedMask) { + int32_t SValue = Value; + int32_t MinValue = getMinValue(MI); + int32_t MaxValue = getMaxValue(MI); + return SValue < MinValue || SValue > MaxValue; + } + uint32_t UValue = Value; + uint32_t MinValue = getMinValue(MI); + uint32_t MaxValue = getMaxValue(MI); + return UValue < MinValue || UValue > MaxValue; } bool HexagonInstrInfo::isDeallocRet(const MachineInstr &MI) const { @@ -2198,10 +2212,10 @@ return false; const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo(); - SmallVector<unsigned, 4> DefsA; - SmallVector<unsigned, 4> DefsB; - SmallVector<unsigned, 8> UsesA; - SmallVector<unsigned, 8> UsesB; + SmallVector<Register, 4> DefsA; + SmallVector<Register, 4> DefsB; + SmallVector<Register, 8> UsesA; + SmallVector<Register, 8> UsesB; parseOperands(ProdMI, DefsA, UsesA); parseOperands(ConsMI, DefsB, UsesB); @@ -2212,15 +2226,11 @@ if (RegA == RegB) return true; - if (Register::isPhysicalRegister(RegA)) - for (MCSubRegIterator SubRegs(RegA, &HRI); SubRegs.isValid(); ++SubRegs) - if (RegB == *SubRegs) - return true; - - if (Register::isPhysicalRegister(RegB)) - for (MCSubRegIterator SubRegs(RegB, &HRI); SubRegs.isValid(); ++SubRegs) - if (RegA == *SubRegs) - return true; + if (RegA.isPhysical() && llvm::is_contained(HRI.subregs(RegA), RegB)) + return true; + + if (RegB.isPhysical() && llvm::is_contained(HRI.subregs(RegB), RegA)) + return true; } return false; @@ -3188,7 +3198,7 @@ } bool HexagonInstrInfo::predCanBeUsedAsDotNew(const MachineInstr &MI, - unsigned PredReg) const { + Register PredReg) const { for (const MachineOperand &MO : MI.operands()) { // Predicate register must be explicitly defined. if (MO.isRegMask() && MO.clobbersPhysReg(PredReg)) @@ -3385,7 +3395,7 @@ // If so, return its group. Zero otherwise. HexagonII::CompoundGroup HexagonInstrInfo::getCompoundCandidateGroup( const MachineInstr &MI) const { - unsigned DstReg, SrcReg, Src1Reg, Src2Reg; + Register DstReg, SrcReg, Src1Reg, Src2Reg; switch (MI.getOpcode()) { default: @@ -3837,7 +3847,7 @@ // All Hexagon architectures have prediction bits on dot-new branches, // but only Hexagon V60+ has prediction bits on dot-old ones. Make sure // to pick the right opcode when converting back to dot-old. - if (!Subtarget.getFeatureBits()[Hexagon::ArchV60]) { + if (!Subtarget.hasFeature(Hexagon::ArchV60)) { switch (NewOp) { case Hexagon::J2_jumptpt: NewOp = Hexagon::J2_jumpt; @@ -3883,7 +3893,7 @@ // If so, return its group. Zero otherwise. HexagonII::SubInstructionGroup HexagonInstrInfo::getDuplexCandidateGroup( const MachineInstr &MI) const { - unsigned DstReg, SrcReg, Src1Reg, Src2Reg; + Register DstReg, SrcReg, Src1Reg, Src2Reg; const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo(); switch (MI.getOpcode()) { @@ -4295,10 +4305,10 @@ // Get DefIdx and UseIdx for super registers. const MachineOperand &DefMO = DefMI.getOperand(DefIdx); - if (DefMO.isReg() && Register::isPhysicalRegister(DefMO.getReg())) { + if (DefMO.isReg() && DefMO.getReg().isPhysical()) { if (DefMO.isImplicit()) { - for (MCSuperRegIterator SR(DefMO.getReg(), &HRI); SR.isValid(); ++SR) { - int Idx = DefMI.findRegisterDefOperandIdx(*SR, false, false, &HRI); + for (MCPhysReg SR : HRI.superregs(DefMO.getReg())) { + int Idx = DefMI.findRegisterDefOperandIdx(SR, false, false, &HRI); if (Idx != -1) { DefIdx = Idx; break; @@ -4308,8 +4318,8 @@ const MachineOperand &UseMO = UseMI.getOperand(UseIdx); if (UseMO.isImplicit()) { - for (MCSuperRegIterator SR(UseMO.getReg(), &HRI); SR.isValid(); ++SR) { - int Idx = UseMI.findRegisterUseOperandIdx(*SR, false, &HRI); + for (MCPhysReg SR : HRI.superregs(UseMO.getReg())) { + int Idx = UseMI.findRegisterUseOperandIdx(SR, false, &HRI); if (Idx != -1) { UseIdx = Idx; break; @@ -4510,7 +4520,7 @@ } bool HexagonInstrInfo::getPredReg(ArrayRef<MachineOperand> Cond, - unsigned &PredReg, unsigned &PredRegPos, unsigned &PredRegFlags) const { + Register &PredReg, unsigned &PredRegPos, unsigned &PredRegFlags) const { if (Cond.empty()) return false; assert(Cond.size() == 2);