[llvm] 1764924 - [SCEV] Optimize FoldID
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 27 16:59:46 PDT 2023
Author: Vitaly Buka
Date: 2023-06-27T16:59:34-07:00
New Revision: 1764924f3940a8a05b58f68cc6b7ce414f2a2f88
URL: https://github.com/llvm/llvm-project/commit/1764924f3940a8a05b58f68cc6b7ce414f2a2f88
DIFF: https://github.com/llvm/llvm-project/commit/1764924f3940a8a05b58f68cc6b7ce414f2a2f88.diff
LOG: [SCEV] Optimize FoldID
Improve compile time
https://llvm-compile-time-tracker.com/compare.php?from=773e5dfbc6bf4d4c5be568a039661e9baad80d15&to=7ba15f3a4b59181110e73dc397a9fe56165a2b73&stat=instructions:u
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D144335
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h
index ad6db524be5bf..44bff2bd51314 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolution.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -1312,48 +1312,26 @@ class ScalarEvolution {
bool loopIsFiniteByAssumption(const Loop *L);
class FoldID {
- SmallVector<unsigned, 5> Bits;
+ const SCEV *Op = nullptr;
+ const Type *Ty = nullptr;
+ unsigned short C;
public:
- void addInteger(unsigned long I) {
- if (sizeof(long) == sizeof(int))
- addInteger(unsigned(I));
- else if (sizeof(long) == sizeof(long long))
- addInteger((unsigned long long)I);
- else
- llvm_unreachable("unexpected sizeof(long)");
+ FoldID(SCEVTypes C, const SCEV *Op, const Type *Ty) : Op(Op), Ty(Ty), C(C) {
+ assert(Op);
+ assert(Ty);
}
- void addInteger(unsigned I) { Bits.push_back(I); }
- void addInteger(int I) { Bits.push_back(I); }
- void addInteger(unsigned long long I) {
- addInteger(unsigned(I));
- addInteger(unsigned(I >> 32));
- }
-
- void addPointer(const void *Ptr) {
- // Note: this adds pointers to the hash using sizes and endianness that
- // depend on the host. It doesn't matter, however, because hashing on
- // pointer values is inherently unstable. Nothing should depend on the
- // ordering of nodes in the folding set.
- static_assert(sizeof(uintptr_t) <= sizeof(unsigned long long),
- "unexpected pointer size");
- addInteger(reinterpret_cast<uintptr_t>(Ptr));
- }
+ FoldID(unsigned short C) : C(C) {}
unsigned computeHash() const {
- unsigned Hash = Bits.size();
- for (unsigned I = 0; I != Bits.size(); ++I)
- Hash = detail::combineHashValue(Hash, Bits[I]);
- return Hash;
+ return detail::combineHashValue(
+ C, detail::combineHashValue(reinterpret_cast<uintptr_t>(Op),
+ reinterpret_cast<uintptr_t>(Ty)));
}
+
bool operator==(const FoldID &RHS) const {
- if (Bits.size() != RHS.Bits.size())
- return false;
- for (unsigned I = 0; I != Bits.size(); ++I)
- if (Bits[I] != RHS.Bits[I])
- return false;
- return true;
+ return std::tie(Op, Ty, C) == std::tie(RHS.Op, RHS.Ty, RHS.C);
}
};
@@ -2394,13 +2372,11 @@ class PredicatedScalarEvolution {
template <> struct DenseMapInfo<ScalarEvolution::FoldID> {
static inline ScalarEvolution::FoldID getEmptyKey() {
- ScalarEvolution::FoldID ID;
- ID.addInteger(~0ULL);
+ ScalarEvolution::FoldID ID(0);
return ID;
}
static inline ScalarEvolution::FoldID getTombstoneKey() {
- ScalarEvolution::FoldID ID;
- ID.addInteger(~0ULL - 1ULL);
+ ScalarEvolution::FoldID ID(1);
return ID;
}
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 513be579ce614..e044f5e05e3e9 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -1551,10 +1551,7 @@ ScalarEvolution::getZeroExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth) {
assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
Ty = getEffectiveSCEVType(Ty);
- FoldID ID;
- ID.addInteger(scZeroExtend);
- ID.addPointer(Op);
- ID.addPointer(Ty);
+ FoldID ID(scZeroExtend, Op, Ty);
auto Iter = FoldCache.find(ID);
if (Iter != FoldCache.end())
return Iter->second;
@@ -1890,10 +1887,7 @@ ScalarEvolution::getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth) {
assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
Ty = getEffectiveSCEVType(Ty);
- FoldID ID;
- ID.addInteger(scSignExtend);
- ID.addPointer(Op);
- ID.addPointer(Ty);
+ FoldID ID(scSignExtend, Op, Ty);
auto Iter = FoldCache.find(ID);
if (Iter != FoldCache.end())
return Iter->second;
More information about the llvm-commits
mailing list