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