diff --git a/llvm/tools/llvm-reduce/deltas/Delta.cpp b/llvm/tools/llvm-reduce/deltas/Delta.cpp index 0071cd0402dbd..932d7198e9791 100644 --- a/llvm/tools/llvm-reduce/deltas/Delta.cpp +++ b/llvm/tools/llvm-reduce/deltas/Delta.cpp @@ -136,7 +136,7 @@ static std::unique_ptr CheckChunk(Chunk &ChunkToCheckForUninterestingness, std::unique_ptr Clone, TestRunner &Test, ReductionFunc ExtractChunksFromModule, - std::set &UninterestingChunks, + DenseSet &UninterestingChunks, std::vector &ChunksStillConsideredInteresting) { // Take all of ChunksStillConsideredInteresting chunks, except those we've // already deemed uninteresting (UninterestingChunks) but didn't remove @@ -188,7 +188,7 @@ CheckChunk(Chunk &ChunkToCheckForUninterestingness, static SmallString<0> ProcessChunkFromSerializedBitcode( Chunk &ChunkToCheckForUninterestingness, TestRunner &Test, - ReductionFunc ExtractChunksFromModule, std::set &UninterestingChunks, + ReductionFunc ExtractChunksFromModule, DenseSet &UninterestingChunks, std::vector &ChunksStillConsideredInteresting, SmallString<0> &OriginalBC, std::atomic &AnyReduced) { LLVMContext Ctx; @@ -270,7 +270,7 @@ void llvm::runDeltaPass(TestRunner &Test, ReductionFunc ExtractChunksFromModule, do { FoundAtLeastOneNewUninterestingChunkWithCurrentGranularity = false; - std::set UninterestingChunks; + DenseSet UninterestingChunks; // When running with more than one thread, serialize the original bitcode // to OriginalBC. diff --git a/llvm/tools/llvm-reduce/deltas/Delta.h b/llvm/tools/llvm-reduce/deltas/Delta.h index e89cb72f10db9..6b595e796ef13 100644 --- a/llvm/tools/llvm-reduce/deltas/Delta.h +++ b/llvm/tools/llvm-reduce/deltas/Delta.h @@ -42,12 +42,39 @@ struct Chunk { return C1.Begin != C2.Begin || C1.End != C2.End; } + friend bool operator==(const Chunk &C1, const Chunk &C2) { + return C1.Begin == C2.Begin && C1.End == C2.End; + } + /// Operator used for sets friend bool operator<(const Chunk &C1, const Chunk &C2) { return std::tie(C1.Begin, C1.End) < std::tie(C2.Begin, C2.End); } }; +template<> +struct DenseMapInfo { + static inline Chunk getEmptyKey() { + return {DenseMapInfo::getEmptyKey(), + DenseMapInfo::getEmptyKey()}; + } + + static inline Chunk getTombstoneKey() { + return {DenseMapInfo::getTombstoneKey(), + DenseMapInfo::getTombstoneKey()}; + } + + static unsigned getHashValue(const Chunk Val) { + std::pair PairVal = std::make_pair(Val.Begin, Val.End); + return DenseMapInfo>::getHashValue(PairVal); + } + + static bool isEqual(const Chunk LHS, const Chunk RHS) { + return LHS == RHS; + } +}; + + /// Provides opaque interface for querying into ChunksToKeep without having to /// actually understand what is going on. class Oracle {