diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h --- a/bolt/include/bolt/Core/MCPlusBuilder.h +++ b/bolt/include/bolt/Core/MCPlusBuilder.h @@ -1135,6 +1135,9 @@ 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 +1907,11 @@ 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 --- a/bolt/lib/Core/MCPlusBuilder.cpp +++ b/bolt/lib/Core/MCPlusBuilder.cpp @@ -441,17 +441,13 @@ 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 @@ dbgs() << "\n"; } }); - - if (OnlySmaller) - return SmallerAliasMap[Reg]; - return AliasMap[Reg]; } uint8_t MCPlusBuilder::getRegSize(MCPhysReg Reg) const { diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -1149,7 +1149,9 @@ MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info, const MCRegisterInfo *RegInfo) { - return new AArch64MCPlusBuilder(Analysis, Info, RegInfo); + MCPlusBuilder *MIB = new AArch64MCPlusBuilder(Analysis, Info, RegInfo); + MIB->initAliases(); + return MIB; } } // namespace bolt diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp --- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp +++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp @@ -3719,7 +3719,9 @@ MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info, const MCRegisterInfo *RegInfo) { - return new X86MCPlusBuilder(Analysis, Info, RegInfo); + MCPlusBuilder *MIB = new X86MCPlusBuilder(Analysis, Info, RegInfo); + MIB->initAliases(); + return MIB; } } // namespace bolt