brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 00e699d Raw
120 lines · c
1//===-- RegisterAliasingTracker.h -------------------------------*- 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/// \file10/// Defines classes to keep track of register aliasing.11///12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_TOOLS_LLVM_EXEGESIS_ALIASINGTRACKER_H15#define LLVM_TOOLS_LLVM_EXEGESIS_ALIASINGTRACKER_H16 17#include <memory>18#include <unordered_map>19 20#include "llvm/ADT/BitVector.h"21#include "llvm/ADT/PackedVector.h"22#include "llvm/MC/MCRegisterInfo.h"23 24namespace llvm {25namespace exegesis {26 27// Returns the registers that are aliased by the ones set in SourceBits.28BitVector getAliasedBits(const MCRegisterInfo &RegInfo,29                         const BitVector &SourceBits);30 31// Keeps track of a mapping from one register (or a register class) to its32// aliased registers.33//34// e.g.35// RegisterAliasingTracker Tracker(RegInfo, X86::EAX);36// Tracker.sourceBits() == { X86::EAX }37// Tracker.aliasedBits() == { X86::AL, X86::AH, X86::AX,38//                            X86::EAX,X86::HAX, X86::RAX }39// Tracker.getOrigin(X86::AL) == X86::EAX;40// Tracker.getOrigin(X86::BX) == -1;41struct RegisterAliasingTracker {42  // Construct a tracker from an MCRegisterClass.43  RegisterAliasingTracker(const MCRegisterInfo &RegInfo,44                          const BitVector &ReservedReg,45                          const MCRegisterClass &RegClass);46 47  // Construct a tracker from an MCRegister.48  RegisterAliasingTracker(const MCRegisterInfo &RegInfo,49                          const MCRegister Register);50 51  const BitVector &sourceBits() const { return SourceBits; }52 53  // Retrieves all the touched registers as a BitVector.54  const BitVector &aliasedBits() const { return AliasedBits; }55 56  // Returns the origin of this register or -1.57  int getOrigin(MCPhysReg Aliased) const {58    if (!AliasedBits[Aliased])59      return -1;60    return Origins[Aliased];61  }62 63private:64  RegisterAliasingTracker(const MCRegisterInfo &RegInfo);65  RegisterAliasingTracker(const RegisterAliasingTracker &) = delete;66 67  void FillOriginAndAliasedBits(const MCRegisterInfo &RegInfo,68                                const BitVector &OriginalBits);69 70  BitVector SourceBits;71  BitVector AliasedBits;72  PackedVector<size_t, 10> Origins; // Max 1024 physical registers.73};74 75// A cache of existing trackers.76struct RegisterAliasingTrackerCache {77  // RegInfo must outlive the cache.78  RegisterAliasingTrackerCache(const MCRegisterInfo &RegInfo,79                               const BitVector &ReservedReg);80 81  // Convenient function to retrieve a BitVector of the right size.82  const BitVector &emptyRegisters() const { return EmptyRegisters; }83 84  // Convenient function to retrieve the registers the function body can't use.85  const BitVector &reservedRegisters() const { return ReservedReg; }86 87  // Convenient function to retrieve the underlying MCRegInfo.88  const MCRegisterInfo &regInfo() const { return RegInfo; }89 90  // Retrieves the RegisterAliasingTracker for this particular register.91  const RegisterAliasingTracker &getRegister(MCRegister Reg) const;92 93  // Retrieves the RegisterAliasingTracker for this particular register class.94  const RegisterAliasingTracker &getRegisterClass(unsigned RegClassIndex) const;95 96private:97  const MCRegisterInfo &RegInfo;98  const BitVector ReservedReg;99  const BitVector EmptyRegisters;100  mutable std::unordered_map<unsigned, std::unique_ptr<RegisterAliasingTracker>>101      Registers;102  mutable std::unordered_map<unsigned, std::unique_ptr<RegisterAliasingTracker>>103      RegisterClasses;104};105 106// `a = a & ~b`, optimized for few bit sets in B and no allocation.107inline void remove(BitVector &A, const BitVector &B) {108  assert(A.size() == B.size());109  for (auto I : B.set_bits())110    A.reset(I);111}112 113// Returns a debug string for the list of registers.114std::string debugString(const MCRegisterInfo &RegInfo, const BitVector &Regs);115 116} // namespace exegesis117} // namespace llvm118 119#endif // LLVM_TOOLS_LLVM_EXEGESIS_ALIASINGTRACKER_H120