[llvm] 31282d3 - Fix LLVM_REVERSE_ITERATION

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 20 15:32:57 PDT 2020


Author: Chris Bieneman
Date: 2020-04-20T17:30:31-05:00
New Revision: 31282d399b79526303ae4b5d1f73ace8a40c6587

URL: https://github.com/llvm/llvm-project/commit/31282d399b79526303ae4b5d1f73ace8a40c6587
DIFF: https://github.com/llvm/llvm-project/commit/31282d399b79526303ae4b5d1f73ace8a40c6587.diff

LOG: Fix LLVM_REVERSE_ITERATION

A recent change (4e86e5eedc6), broke `LLVM_REVERSE_ITERATION` for DenseMaps by adding an assert. It is valid to de-reference and increment one step behind `End` when reverse iteration is enabled because `End` is actually the start of the pointer bucket.

Added: 
    

Modified: 
    llvm/include/llvm/ADT/DenseMap.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index df4f02024344..60f32f7ba4aa 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -1200,16 +1200,20 @@ class DenseMapIterator : DebugEpochBase::HandleBase {
 
   reference operator*() const {
     assert(isHandleInSync() && "invalid iterator access!");
-    assert(Ptr != End && "dereferencing end() iterator");
-    if (shouldReverseIterate<KeyT>())
+    if (shouldReverseIterate<KeyT>()) {
+      assert(Ptr != End[-1] && "dereferencing end() iterator");
       return Ptr[-1];
+    }
+    assert(Ptr != End && "dereferencing end() iterator");
     return *Ptr;
   }
   pointer operator->() const {
     assert(isHandleInSync() && "invalid iterator access!");
-    assert(Ptr != End && "dereferencing end() iterator");
-    if (shouldReverseIterate<KeyT>())
+    if (shouldReverseIterate<KeyT>()) {
+      assert(Ptr != End[-1] && "dereferencing end() iterator");
       return &(Ptr[-1]);
+    }
+    assert(Ptr != End && "dereferencing end() iterator");
     return Ptr;
   }
 
@@ -1230,12 +1234,13 @@ class DenseMapIterator : DebugEpochBase::HandleBase {
 
   inline DenseMapIterator& operator++() {  // Preincrement
     assert(isHandleInSync() && "invalid iterator access!");
-    assert(Ptr != End && "incrementing end() iterator");
     if (shouldReverseIterate<KeyT>()) {
+      assert(Ptr != End[-1] && "dereferencing end() iterator");
       --Ptr;
       RetreatPastEmptyBuckets();
       return *this;
     }
+    assert(Ptr != End && "incrementing end() iterator");
     ++Ptr;
     AdvancePastEmptyBuckets();
     return *this;


        


More information about the llvm-commits mailing list