//===-- 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