From fb5344cd02eac553b121594ab050a3fd75e84e00 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Fri, 10 May 2024 14:45:06 +0200 Subject: [PATCH 1/2] [CodeGen] Use SmallVector for FixedStackPSVs Frame indices are dense and consecutive, so use a vector instead of a std::map. Due to possible negative frame indices, use zig-zag encoding. IndexedMap was not usable, as it attempted to copy the null value, which is not possible with a std::unique_ptr. This is just a minor performance improvement, but a low-hanging fruit. --- llvm/include/llvm/CodeGen/PseudoSourceValueManager.h | 4 ++-- llvm/lib/CodeGen/PseudoSourceValue.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/CodeGen/PseudoSourceValueManager.h b/llvm/include/llvm/CodeGen/PseudoSourceValueManager.h index 4be6ae0b60cb8..8ea043bf0327d 100644 --- a/llvm/include/llvm/CodeGen/PseudoSourceValueManager.h +++ b/llvm/include/llvm/CodeGen/PseudoSourceValueManager.h @@ -13,10 +13,10 @@ #ifndef LLVM_CODEGEN_PSEUDOSOURCEVALUEMANAGER_H #define LLVM_CODEGEN_PSEUDOSOURCEVALUEMANAGER_H +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/CodeGen/PseudoSourceValue.h" #include "llvm/IR/ValueMap.h" -#include namespace llvm { @@ -27,7 +27,7 @@ class TargetMachine; class PseudoSourceValueManager { const TargetMachine &TM; const PseudoSourceValue StackPSV, GOTPSV, JumpTablePSV, ConstantPoolPSV; - std::map> FSValues; + SmallVector> FSValues; StringMap> ExternalCallEntries; ValueMap &V = FSValues[FI]; + // Frame index is often continuously positive, but can be negative. Use + // zig-zag encoding for dense index into FSValues vector. + unsigned Idx = FI >= 0 ? FI << 1 : (-FI - 1) << 1 | 1; + if (FSValues.size() <= Idx) + FSValues.resize(Idx + 1); + std::unique_ptr &V = FSValues[Idx]; if (!V) V = std::make_unique(FI, TM); return V.get(); From d42eab03cb555906ecd9cb934844e63bfec6a4fb Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Tue, 14 May 2024 11:42:34 +0200 Subject: [PATCH 2/2] [CodeGen] More efficient zig-zag encoding --- llvm/lib/CodeGen/PseudoSourceValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/PseudoSourceValue.cpp b/llvm/lib/CodeGen/PseudoSourceValue.cpp index f438b38dd481a..242889d317849 100644 --- a/llvm/lib/CodeGen/PseudoSourceValue.cpp +++ b/llvm/lib/CodeGen/PseudoSourceValue.cpp @@ -124,7 +124,7 @@ const PseudoSourceValue * PseudoSourceValueManager::getFixedStack(int FI) { // Frame index is often continuously positive, but can be negative. Use // zig-zag encoding for dense index into FSValues vector. - unsigned Idx = FI >= 0 ? FI << 1 : (-FI - 1) << 1 | 1; + unsigned Idx = (2 * unsigned(FI)) ^ (FI >> (sizeof(FI) * 8 - 1)); if (FSValues.size() <= Idx) FSValues.resize(Idx + 1); std::unique_ptr &V = FSValues[Idx];