| //===-- RegisterAliasingTracker.cpp -----------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "RegisterAliasing.h" |
| |
| namespace exegesis { |
| |
| llvm::BitVector getAliasedBits(const llvm::MCRegisterInfo &RegInfo, |
| const llvm::BitVector &SourceBits) { |
| llvm::BitVector AliasedBits(RegInfo.getNumRegs()); |
| for (const size_t PhysReg : SourceBits.set_bits()) { |
| using RegAliasItr = llvm::MCRegAliasIterator; |
| for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid(); |
| ++Itr) { |
| AliasedBits.set(*Itr); |
| } |
| } |
| return AliasedBits; |
| } |
| |
| RegisterAliasingTracker::RegisterAliasingTracker( |
| const llvm::MCRegisterInfo &RegInfo) |
| : SourceBits(RegInfo.getNumRegs()), AliasedBits(RegInfo.getNumRegs()), |
| Origins(RegInfo.getNumRegs()) {} |
| |
| RegisterAliasingTracker::RegisterAliasingTracker( |
| const llvm::MCRegisterInfo &RegInfo, const llvm::BitVector &ReservedReg, |
| const llvm::MCRegisterClass &RegClass) |
| : RegisterAliasingTracker(RegInfo) { |
| for (llvm::MCPhysReg PhysReg : RegClass) |
| if (!ReservedReg[PhysReg]) // Removing reserved registers. |
| SourceBits.set(PhysReg); |
| FillOriginAndAliasedBits(RegInfo, SourceBits); |
| } |
| |
| RegisterAliasingTracker::RegisterAliasingTracker( |
| const llvm::MCRegisterInfo &RegInfo, const llvm::MCPhysReg PhysReg) |
| : RegisterAliasingTracker(RegInfo) { |
| SourceBits.set(PhysReg); |
| FillOriginAndAliasedBits(RegInfo, SourceBits); |
| } |
| |
| void RegisterAliasingTracker::FillOriginAndAliasedBits( |
| const llvm::MCRegisterInfo &RegInfo, const llvm::BitVector &SourceBits) { |
| using RegAliasItr = llvm::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 llvm::MCRegisterInfo &RegInfo, const llvm::BitVector &ReservedReg) |
| : RegInfo(RegInfo), ReservedReg(ReservedReg), |
| EmptyRegisters(RegInfo.getNumRegs()) {} |
| |
| const RegisterAliasingTracker & |
| RegisterAliasingTrackerCache::getRegister(llvm::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; |
| } |
| |
| } // namespace exegesis |