[llvm] [RFC][MC] Cache MCRegAliasIterator (PR #93510)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 04:50:15 PDT 2024
================
@@ -20,6 +20,85 @@
using namespace llvm;
+namespace {
+/// MCRegAliasIterator enumerates all registers aliasing Reg. This iterator
+/// does not guarantee any ordering or that entries are unique.
+class MCRegAliasIteratorImpl {
+private:
+ MCRegister Reg;
+ const MCRegisterInfo *MCRI;
+
+ MCRegUnitIterator RI;
+ MCRegUnitRootIterator RRI;
+ MCSuperRegIterator SI;
+
+public:
+ MCRegAliasIteratorImpl(MCRegister Reg, const MCRegisterInfo *MCRI)
+ : Reg(Reg), MCRI(MCRI) {
+
+ // Initialize the iterators.
+ for (RI = MCRegUnitIterator(Reg, MCRI); RI.isValid(); ++RI) {
+ for (RRI = MCRegUnitRootIterator(*RI, MCRI); RRI.isValid(); ++RRI) {
+ for (SI = MCSuperRegIterator(*RRI, MCRI, true); SI.isValid(); ++SI) {
+ if (Reg != *SI)
+ return;
+ }
+ }
+ }
+ }
+
+ bool isValid() const { return RI.isValid(); }
+
+ MCRegister operator*() const {
+ assert(SI.isValid() && "Cannot dereference an invalid iterator.");
+ return *SI;
+ }
+
+ void advance() {
+ // Assuming SI is valid.
+ ++SI;
+ if (SI.isValid())
+ return;
+
+ ++RRI;
+ if (RRI.isValid()) {
+ SI = MCSuperRegIterator(*RRI, MCRI, true);
+ return;
+ }
+
+ ++RI;
+ if (RI.isValid()) {
+ RRI = MCRegUnitRootIterator(*RI, MCRI);
+ SI = MCSuperRegIterator(*RRI, MCRI, true);
+ }
+ }
+
+ MCRegAliasIteratorImpl &operator++() {
+ assert(isValid() && "Cannot move off the end of the list.");
+ do
+ advance();
+ while (isValid() && *SI == Reg);
+ return *this;
+ }
+};
+} // namespace
+
+ArrayRef<MCPhysReg> MCRegisterInfo::getCachedAliasesOf(MCPhysReg R) const {
+ if (auto It = RegAliasesCache.find(R); It != RegAliasesCache.end())
+ return It->second;
+
+ auto &Aliases = RegAliasesCache[R];
+ for (MCRegAliasIteratorImpl It(R, this); It.isValid(); ++It)
+ Aliases.push_back(*It);
+
+ llvm::sort(Aliases);
+ Aliases.erase(unique(Aliases), Aliases.end());
----------------
s-barannikov wrote:
It might be more efficient to accumulate aliases in a DenseSet and then copy its contents into the vector.
It will save on sorting / erasing duplicates.
https://github.com/llvm/llvm-project/pull/93510
More information about the llvm-commits
mailing list