| //===-- RegisterAliasing.cpp ------------------------------------*- C++ -*-===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "RegisterAliasing.h" |
| |
| namespace llvm { |
| namespace exegesis { |
| |
| BitVector getAliasedBits(const MCRegisterInfo &RegInfo, |
| const BitVector &SourceBits) { |
| BitVector AliasedBits(RegInfo.getNumRegs()); |
| for (const size_t PhysReg : SourceBits.set_bits()) { |
| using RegAliasItr = MCRegAliasIterator; |
| for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid(); |
| ++Itr) { |
| AliasedBits.set(*Itr); |
| } |
| } |
| return AliasedBits; |
| } |
| |
| RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo) |
| : SourceBits(RegInfo.getNumRegs()), AliasedBits(RegInfo.getNumRegs()), |
| Origins(RegInfo.getNumRegs()) {} |
| |
| RegisterAliasingTracker::RegisterAliasingTracker( |
| const MCRegisterInfo &RegInfo, const BitVector &ReservedReg, |
| const MCRegisterClass &RegClass) |
| : RegisterAliasingTracker(RegInfo) { |
| for (MCPhysReg PhysReg : RegClass) |
| if (!ReservedReg[PhysReg]) // Removing reserved registers. |
| SourceBits.set(PhysReg); |
| FillOriginAndAliasedBits(RegInfo, SourceBits); |
| } |
| |
| RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo, |
| const MCPhysReg PhysReg) |
| : RegisterAliasingTracker(RegInfo) { |
| SourceBits.set(PhysReg); |
| FillOriginAndAliasedBits(RegInfo, SourceBits); |
| } |
| |
| void RegisterAliasingTracker::FillOriginAndAliasedBits( |
| const MCRegisterInfo &RegInfo, const BitVector &SourceBits) { |
| using RegAliasItr = MCRegAliasIterator; |
| for (const size_t PhysReg : SourceBits.set_bits()) { |
| for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid(); |
| ++Itr) { |
| AliasedBits.set(*Itr); |
| Origins[*Itr] = PhysReg; |
| } |
| } |
| } |
| |
| RegisterAliasingTrackerCache::RegisterAliasingTrackerCache( |
| const MCRegisterInfo &RegInfo, const BitVector &ReservedReg) |
| : RegInfo(RegInfo), ReservedReg(ReservedReg), |
| EmptyRegisters(RegInfo.getNumRegs()) {} |
| |
| const RegisterAliasingTracker & |
| RegisterAliasingTrackerCache::getRegister(MCPhysReg PhysReg) const { |
| auto &Found = Registers[PhysReg]; |
| if (!Found) |
| Found.reset(new RegisterAliasingTracker(RegInfo, PhysReg)); |
| return *Found; |
| } |
| |
| const RegisterAliasingTracker & |
| RegisterAliasingTrackerCache::getRegisterClass(unsigned RegClassIndex) const { |
| auto &Found = RegisterClasses[RegClassIndex]; |
| const auto &RegClass = RegInfo.getRegClass(RegClassIndex); |
| if (!Found) |
| Found.reset(new RegisterAliasingTracker(RegInfo, ReservedReg, RegClass)); |
| return *Found; |
| } |
| |
| std::string debugString(const MCRegisterInfo &RegInfo, const BitVector &Regs) { |
| std::string Result; |
| for (const unsigned Reg : Regs.set_bits()) { |
| Result.append(RegInfo.getName(Reg)); |
| Result.push_back(' '); |
| } |
| return Result; |
| } |
| |
| } // namespace exegesis |
| } // namespace llvm |