From 68c7299f16aa6a6990f35a0d10d084b971a6f389 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Wed, 4 May 2022 11:42:14 -0700 Subject: [BOLT][NFC] Fix MCPlusBuilder::getAliases caching behavior Caching behavior of `getAliases` causes a failure in unit tests where two MCPlusBuilder objects are created corresponding to AArch64 and X86: the alias cache is created for AArch64 but then used for X86. https://lab.llvm.org/staging/#/builders/211/builds/126 The issue only affects unit tests as we only construct one MCPlusBuilder for ELF binary. Resolve the issue by moving alias bitvectors to MCPlusBuilder object. Reviewed By: yota9 Differential Revision: https://reviews.llvm.org/D124942 --- bolt/include/bolt/Core/MCPlusBuilder.h | 10 ++++++++++ bolt/lib/Core/MCPlusBuilder.cpp | 20 ++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) (limited to 'bolt') diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h index 64e98e5f400e..1b4159dd932d 100644 --- a/bolt/include/bolt/Core/MCPlusBuilder.h +++ b/bolt/include/bolt/Core/MCPlusBuilder.h @@ -282,6 +282,8 @@ public: // Initialize the default annotation allocator with id 0 AnnotationAllocators.emplace(0, AnnotationAllocator()); MaxAllocatorId++; + // Build alias map + initAliases(); } /// Initialize a new annotation allocator and return its id @@ -1135,6 +1137,9 @@ public: virtual const BitVector &getAliases(MCPhysReg Reg, bool OnlySmaller = false) const; + /// Initialize aliases tables. + virtual void initAliases(); + /// Change \p Regs setting all registers used to pass parameters according /// to the host abi. Do nothing if not implemented. virtual BitVector getRegsUsedAsParams() const { @@ -1904,6 +1909,11 @@ public: llvm_unreachable("not implemented"); return BlocksVectorTy(); } + + // AliasMap caches a mapping of registers to the set of registers that + // alias (are sub or superregs of itself, including itself). + std::vector AliasMap; + std::vector SmallerAliasMap; }; MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *, diff --git a/bolt/lib/Core/MCPlusBuilder.cpp b/bolt/lib/Core/MCPlusBuilder.cpp index b983a6b8d342..3c04cd6d7bff 100644 --- a/bolt/lib/Core/MCPlusBuilder.cpp +++ b/bolt/lib/Core/MCPlusBuilder.cpp @@ -441,17 +441,13 @@ bool MCPlusBuilder::hasUseOfPhysReg(const MCInst &MI, unsigned Reg) const { const BitVector &MCPlusBuilder::getAliases(MCPhysReg Reg, bool OnlySmaller) const { - // AliasMap caches a mapping of registers to the set of registers that - // alias (are sub or superregs of itself, including itself). - static std::vector AliasMap; - static std::vector SmallerAliasMap; - - if (AliasMap.size() > 0) { - if (OnlySmaller) - return SmallerAliasMap[Reg]; - return AliasMap[Reg]; - } + if (OnlySmaller) + return SmallerAliasMap[Reg]; + return AliasMap[Reg]; +} +void MCPlusBuilder::initAliases() { + assert(AliasMap.size() == 0 && SmallerAliasMap.size() == 0); // Build alias map for (MCPhysReg I = 0, E = RegInfo->getNumRegs(); I != E; ++I) { BitVector BV(RegInfo->getNumRegs(), false); @@ -492,10 +488,6 @@ const BitVector &MCPlusBuilder::getAliases(MCPhysReg Reg, dbgs() << "\n"; } }); - - if (OnlySmaller) - return SmallerAliasMap[Reg]; - return AliasMap[Reg]; } uint8_t MCPlusBuilder::getRegSize(MCPhysReg Reg) const { -- cgit v1.2.3