Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/bolt
diff options
context:
space:
mode:
authorAmir Ayupov <amir.aupov@gmail.com>2022-05-04 21:42:14 +0300
committerAmir Ayupov <aaupov@fb.com>2022-05-04 22:53:26 +0300
commit68c7299f16aa6a6990f35a0d10d084b971a6f389 (patch)
treef6123975a65fa624c0fb4d6ba8bd7210b9b51941 /bolt
parent2966f0fa505266735dbc8324b8821b7f0aa901ff (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.h10
-rw-r--r--bolt/lib/Core/MCPlusBuilder.cpp20
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 {