93 lines · cpp
1//===-- RegisterAliasing.cpp ------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "RegisterAliasing.h"10 11namespace llvm {12namespace exegesis {13 14BitVector getAliasedBits(const MCRegisterInfo &RegInfo,15 const BitVector &SourceBits) {16 BitVector AliasedBits(RegInfo.getNumRegs());17 for (const size_t PhysReg : SourceBits.set_bits()) {18 using RegAliasItr = MCRegAliasIterator;19 for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid();20 ++Itr) {21 AliasedBits.set(*Itr);22 }23 }24 return AliasedBits;25}26 27RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo)28 : SourceBits(RegInfo.getNumRegs()), AliasedBits(RegInfo.getNumRegs()),29 Origins(RegInfo.getNumRegs()) {}30 31RegisterAliasingTracker::RegisterAliasingTracker(32 const MCRegisterInfo &RegInfo, const BitVector &ReservedReg,33 const MCRegisterClass &RegClass)34 : RegisterAliasingTracker(RegInfo) {35 for (MCPhysReg PhysReg : RegClass)36 if (!ReservedReg[PhysReg]) // Removing reserved registers.37 SourceBits.set(PhysReg);38 FillOriginAndAliasedBits(RegInfo, SourceBits);39}40 41RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo,42 const MCRegister PhysReg)43 : RegisterAliasingTracker(RegInfo) {44 SourceBits.set(PhysReg.id());45 FillOriginAndAliasedBits(RegInfo, SourceBits);46}47 48void RegisterAliasingTracker::FillOriginAndAliasedBits(49 const MCRegisterInfo &RegInfo, const BitVector &SourceBits) {50 using RegAliasItr = MCRegAliasIterator;51 for (const size_t PhysReg : SourceBits.set_bits()) {52 for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid();53 ++Itr) {54 AliasedBits.set(*Itr);55 Origins[*Itr] = PhysReg;56 }57 }58}59 60RegisterAliasingTrackerCache::RegisterAliasingTrackerCache(61 const MCRegisterInfo &RegInfo, const BitVector &ReservedReg)62 : RegInfo(RegInfo), ReservedReg(ReservedReg),63 EmptyRegisters(RegInfo.getNumRegs()) {}64 65const RegisterAliasingTracker &66RegisterAliasingTrackerCache::getRegister(MCRegister PhysReg) const {67 auto &Found = Registers[PhysReg.id()];68 if (!Found)69 Found.reset(new RegisterAliasingTracker(RegInfo, PhysReg));70 return *Found;71}72 73const RegisterAliasingTracker &74RegisterAliasingTrackerCache::getRegisterClass(unsigned RegClassIndex) const {75 auto &Found = RegisterClasses[RegClassIndex];76 const auto &RegClass = RegInfo.getRegClass(RegClassIndex);77 if (!Found)78 Found.reset(new RegisterAliasingTracker(RegInfo, ReservedReg, RegClass));79 return *Found;80}81 82std::string debugString(const MCRegisterInfo &RegInfo, const BitVector &Regs) {83 std::string Result;84 for (const unsigned Reg : Regs.set_bits()) {85 Result.append(RegInfo.getName(Reg));86 Result.push_back(' ');87 }88 return Result;89}90 91} // namespace exegesis92} // namespace llvm93