diff options
author | Amir Ayupov <amir.aupov@gmail.com> | 2022-05-04 21:42:14 +0300 |
---|---|---|
committer | Amir Ayupov <aaupov@fb.com> | 2022-05-04 22:53:26 +0300 |
commit | 68c7299f16aa6a6990f35a0d10d084b971a6f389 (patch) | |
tree | f6123975a65fa624c0fb4d6ba8bd7210b9b51941 /bolt | |
parent | 2966f0fa505266735dbc8324b8821b7f0aa901ff (diff) |
[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
Diffstat (limited to 'bolt')
-rw-r--r-- | bolt/include/bolt/Core/MCPlusBuilder.h | 10 | ||||
-rw-r--r-- | bolt/lib/Core/MCPlusBuilder.cpp | 20 |
2 files changed, 16 insertions, 14 deletions
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<BitVector> AliasMap; + std::vector<BitVector> 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<BitVector> AliasMap; - static std::vector<BitVector> 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 { |