1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //===-- RegisterAliasing.cpp ------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "RegisterAliasing.h"
- namespace llvm {
- namespace exegesis {
- BitVector getAliasedBits(const MCRegisterInfo &RegInfo,
- const BitVector &SourceBits) {
- BitVector AliasedBits(RegInfo.getNumRegs());
- for (const size_t PhysReg : SourceBits.set_bits()) {
- using RegAliasItr = MCRegAliasIterator;
- for (auto Itr = RegAliasItr(PhysReg, &RegInfo, true); Itr.isValid();
- ++Itr) {
- AliasedBits.set(*Itr);
- }
- }
- return AliasedBits;
- }
- RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo)
- : SourceBits(RegInfo.getNumRegs()), AliasedBits(RegInfo.getNumRegs()),
- Origins(RegInfo.getNumRegs()) {}
- RegisterAliasingTracker::RegisterAliasingTracker(
- const MCRegisterInfo &RegInfo, const BitVector &ReservedReg,
- const MCRegisterClass &RegClass)
- : RegisterAliasingTracker(RegInfo) {
- for (MCPhysReg PhysReg : RegClass)
- if (!ReservedReg[PhysReg]) // Removing reserved registers.
- SourceBits.set(PhysReg);
- FillOriginAndAliasedBits(RegInfo, SourceBits);
- }
- RegisterAliasingTracker::RegisterAliasingTracker(const MCRegisterInfo &RegInfo,
- const MCPhysReg PhysReg)
- : RegisterAliasingTracker(RegInfo) {
- SourceBits.set(PhysReg);
- FillOriginAndAliasedBits(RegInfo, SourceBits);
- }
- void RegisterAliasingTracker::FillOriginAndAliasedBits(
- const MCRegisterInfo &RegInfo, const BitVector &SourceBits) {
- using RegAliasItr = 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 MCRegisterInfo &RegInfo, const BitVector &ReservedReg)
- : RegInfo(RegInfo), ReservedReg(ReservedReg),
- EmptyRegisters(RegInfo.getNumRegs()) {}
- const RegisterAliasingTracker &
- RegisterAliasingTrackerCache::getRegister(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;
- }
- std::string debugString(const MCRegisterInfo &RegInfo, const BitVector &Regs) {
- std::string Result;
- for (const unsigned Reg : Regs.set_bits()) {
- Result.append(RegInfo.getName(Reg));
- Result.push_back(' ');
- }
- return Result;
- }
- } // namespace exegesis
- } // namespace llvm
|