106f32e7eSjoerg //===-- RegisterAliasing.cpp ------------------------------------*- C++ -*-===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg 
906f32e7eSjoerg #include "RegisterAliasing.h"
1006f32e7eSjoerg 
1106f32e7eSjoerg namespace llvm {
1206f32e7eSjoerg namespace exegesis {
1306f32e7eSjoerg 
getAliasedBits(const MCRegisterInfo & RegInfo,const BitVector & SourceBits)1406f32e7eSjoerg BitVector getAliasedBits(const MCRegisterInfo &RegInfo,
1506f32e7eSjoerg                          const BitVector &SourceBits) {
1606f32e7eSjoerg   BitVector AliasedBits(RegInfo.getNumRegs());
1706f32e7eSjoerg   for (const size_t PhysReg : SourceBits.set_bits()) {
1806f32e7eSjoerg     using RegAliasItr = MCRegAliasIterator;
1906f32e7eSjoerg     for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid();
2006f32e7eSjoerg          ++Itr) {
2106f32e7eSjoerg       AliasedBits.set(*Itr);
2206f32e7eSjoerg     }
2306f32e7eSjoerg   }
2406f32e7eSjoerg   return AliasedBits;
2506f32e7eSjoerg }
2606f32e7eSjoerg 
RegisterAliasingTracker(const MCRegisterInfo & RegInfo)2706f32e7eSjoerg RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo)
2806f32e7eSjoerg     : SourceBits(RegInfo.getNumRegs()), AliasedBits(RegInfo.getNumRegs()),
2906f32e7eSjoerg       Origins(RegInfo.getNumRegs()) {}
3006f32e7eSjoerg 
RegisterAliasingTracker(const MCRegisterInfo & RegInfo,const BitVector & ReservedReg,const MCRegisterClass & RegClass)3106f32e7eSjoerg RegisterAliasingTracker::RegisterAliasingTracker(
3206f32e7eSjoerg     const MCRegisterInfo &RegInfo, const BitVector &ReservedReg,
3306f32e7eSjoerg     const MCRegisterClass &RegClass)
3406f32e7eSjoerg     : RegisterAliasingTracker(RegInfo) {
3506f32e7eSjoerg   for (MCPhysReg PhysReg : RegClass)
3606f32e7eSjoerg     if (!ReservedReg[PhysReg]) // Removing reserved registers.
3706f32e7eSjoerg       SourceBits.set(PhysReg);
3806f32e7eSjoerg   FillOriginAndAliasedBits(RegInfo, SourceBits);
3906f32e7eSjoerg }
4006f32e7eSjoerg 
RegisterAliasingTracker(const MCRegisterInfo & RegInfo,const MCPhysReg PhysReg)4106f32e7eSjoerg RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo,
4206f32e7eSjoerg                                                  const MCPhysReg PhysReg)
4306f32e7eSjoerg     : RegisterAliasingTracker(RegInfo) {
4406f32e7eSjoerg   SourceBits.set(PhysReg);
4506f32e7eSjoerg   FillOriginAndAliasedBits(RegInfo, SourceBits);
4606f32e7eSjoerg }
4706f32e7eSjoerg 
FillOriginAndAliasedBits(const MCRegisterInfo & RegInfo,const BitVector & SourceBits)4806f32e7eSjoerg void RegisterAliasingTracker::FillOriginAndAliasedBits(
4906f32e7eSjoerg     const MCRegisterInfo &RegInfo, const BitVector &SourceBits) {
5006f32e7eSjoerg   using RegAliasItr = MCRegAliasIterator;
5106f32e7eSjoerg   for (const size_t PhysReg : SourceBits.set_bits()) {
5206f32e7eSjoerg     for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid();
5306f32e7eSjoerg          ++Itr) {
5406f32e7eSjoerg       AliasedBits.set(*Itr);
5506f32e7eSjoerg       Origins[*Itr] = PhysReg;
5606f32e7eSjoerg     }
5706f32e7eSjoerg   }
5806f32e7eSjoerg }
5906f32e7eSjoerg 
RegisterAliasingTrackerCache(const MCRegisterInfo & RegInfo,const BitVector & ReservedReg)6006f32e7eSjoerg RegisterAliasingTrackerCache::RegisterAliasingTrackerCache(
6106f32e7eSjoerg     const MCRegisterInfo &RegInfo, const BitVector &ReservedReg)
6206f32e7eSjoerg     : RegInfo(RegInfo), ReservedReg(ReservedReg),
6306f32e7eSjoerg       EmptyRegisters(RegInfo.getNumRegs()) {}
6406f32e7eSjoerg 
6506f32e7eSjoerg const RegisterAliasingTracker &
getRegister(MCPhysReg PhysReg) const6606f32e7eSjoerg RegisterAliasingTrackerCache::getRegister(MCPhysReg PhysReg) const {
6706f32e7eSjoerg   auto &Found = Registers[PhysReg];
6806f32e7eSjoerg   if (!Found)
6906f32e7eSjoerg     Found.reset(new RegisterAliasingTracker(RegInfo, PhysReg));
7006f32e7eSjoerg   return *Found;
7106f32e7eSjoerg }
7206f32e7eSjoerg 
7306f32e7eSjoerg const RegisterAliasingTracker &
getRegisterClass(unsigned RegClassIndex) const7406f32e7eSjoerg RegisterAliasingTrackerCache::getRegisterClass(unsigned RegClassIndex) const {
7506f32e7eSjoerg   auto &Found = RegisterClasses[RegClassIndex];
7606f32e7eSjoerg   const auto &RegClass = RegInfo.getRegClass(RegClassIndex);
7706f32e7eSjoerg   if (!Found)
7806f32e7eSjoerg     Found.reset(new RegisterAliasingTracker(RegInfo, ReservedReg, RegClass));
7906f32e7eSjoerg   return *Found;
8006f32e7eSjoerg }
8106f32e7eSjoerg 
debugString(const MCRegisterInfo & RegInfo,const BitVector & Regs)82*da58b97aSjoerg std::string debugString(const MCRegisterInfo &RegInfo, const BitVector &Regs) {
83*da58b97aSjoerg   std::string Result;
84*da58b97aSjoerg   for (const unsigned Reg : Regs.set_bits()) {
85*da58b97aSjoerg     Result.append(RegInfo.getName(Reg));
86*da58b97aSjoerg     Result.push_back(' ');
87*da58b97aSjoerg   }
88*da58b97aSjoerg   return Result;
89*da58b97aSjoerg }
90*da58b97aSjoerg 
9106f32e7eSjoerg } // namespace exegesis
9206f32e7eSjoerg } // namespace llvm
93