diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/q.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/q.kt
new file mode 100644
index 0000000..1e5d508
--- /dev/null
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/q.kt
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.fir.caches
+
+import java.util.*
+import java.util.function.BiConsumer
+
+// binary representation of fractional part of phi = (sqrt(5) - 1) / 2
+private const val MAGIC: Int = 0x9E3779B9L.toInt() // ((sqrt(5.0) - 1) / 2 * pow(2.0, 32.0)).toLong().toString(16)
+private const val MAX_SHIFT = 27
+private const val THRESHOLD = ((1L shl 31) - 1).toInt() // 50% fill factor for speed
+private val EMPTY_ARRAY = arrayOf<Any?>()
+
+
+// For more details see for Knuth's multiplicative hash with golden ratio
+// Shortly, we're trying to keep distribution of it uniform independently of input
+// It's necessary because we use very simple linear probing
+@Suppress("NOTHING_TO_INLINE")
+private inline fun Any.computeHash(shift: Int) = ((hashCode() * MAGIC) ushr shift) shl 1
+
+/**
+ * The main ideas that might lead to better locality:
+ * - Storing values in the same array as keys
+ * - Using linear probes to avoid jumping to to new random indices
+ *
+ * This Map implementation is not intended to follow some of the maps' contracts:
+ * - `put` doesn't returns previous value
+ * - `entries` is unsupported (use forEach instead)
+ * - `remove` is unsupported
+ */
+internal class OpenAddressLinearProbingHashTableNullable<K : Any, V, CONTEXT>(
+    private val createValue: (K, CONTEXT) -> V
+) : FirCache<K, V, CONTEXT>() {
+    // fields be initialized later in `clear()`
+
+    // capacity = 1 << (32 - shift)
+    private var shift = 0
+    // keys are stored in even elements, values are in odd ones
+    private var array = EMPTY_ARRAY
+    private var size_ = 0
+
+    init {
+        clear()
+    }
+
+    private fun index(key: K): Int {
+        var i = key.computeHash(shift)
+        var k = array[i]
+
+        while (true) {
+            if (k === null) return -i
+            if (k == key) return i + 1
+            if (i == 0) {
+                i = array.size
+            }
+            i -= 2
+            k = array[i]
+        }
+    }
+
+    override fun getValueIfComputed(key: K): V? {
+        val index = index(key)
+        if (index <= 0) return null
+        @Suppress("UNCHECKED_CAST")
+        return array[index] as V
+    }
+
+    override fun getValue(key: K, context: CONTEXT): V {
+        val index = index(key)
+        @Suppress("UNCHECKED_CAST")
+        if (index > 0) return array[index] as V
+        val nIndex = -index
+        array[nIndex] = key
+        val newValue = createValue(key, context)
+        array[nIndex + 1] = newValue
+
+        rehashIfNeeded()
+
+        return newValue
+    }
+
+    private fun rehashIfNeeded() {
+        if (++size_ >= (THRESHOLD ushr shift)) {
+            rehash()
+        }
+    }
+
+    private fun rehash() {
+        val newShift = maxOf(shift - 3, 0)
+        val newArraySize = 1 shl (33 - newShift)
+        val newArray = arrayOfNulls<Any>(newArraySize)
+
+        var i = 0
+        val arraySize = array.size
+        while (i < arraySize) {
+            val key = array[i]
+            if (key != null) {
+                put(newArray, newShift, key, array[i + 1])
+            }
+            i += 2
+        }
+
+        shift = newShift
+        array = newArray
+    }
+
+    fun clear() {
+        shift = MAX_SHIFT
+        array = arrayOfNulls(1 shl (33 - shift))
+
+        size_ = 0
+    }
+
+    fun forEach(action: BiConsumer<in K, in V>) {
+        var i = 0
+        val arraySize = array.size
+        while (i < arraySize) {
+            val key = array[i]
+            if (key != null) {
+                @Suppress("UNCHECKED_CAST")
+                action.accept(key as K, array[i + 1] as V)
+            }
+            i += 2
+        }
+    }
+
+    val entries: MutableSet<MutableMap.MutableEntry<K, V>>
+        get() {
+            if (@Suppress("ConstantConditionIf") DEBUG) {
+                return Collections.unmodifiableSet(mutableSetOf<MutableMap.MutableEntry<K, V>>().apply {
+                    forEach { key, value -> add(Entry(key, value)) }
+                })
+            }
+
+            throw IllegalStateException("OpenAddressLinearProbingHashTable::entries is not supported and hardly will be")
+        }
+
+    private class Entry<K, V>(override val key: K, override val value: V) : MutableMap.MutableEntry<K, V> {
+        override fun setValue(newValue: V): V = throw UnsupportedOperationException("This Entry is not mutable.")
+    }
+
+    companion object {
+        // Change to "true" to be able to see the contents of the map in debugger views
+        private const val DEBUG = false
+    }
+}
+
+private fun put(array: Array<Any?>, aShift: Int, key: Any, value: Any?): Boolean {
+    var i = key.computeHash(aShift)
+
+    while (true) {
+        val k = array[i]
+        if (k == null) {
+            array[i] = key
+            array[i + 1] = value
+            return true
+        }
+        if (k == key) break
+        if (i == 0) {
+            i = array.size
+        }
+        i -= 2
+    }
+
+    array[i + 1] = value
+
+    return false
+}
diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt8050.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/kt8050.fir.kt
index fa84db2..08130aa 100644
--- a/compiler/testData/diagnostics/testsWithStdLib/kt8050.fir.kt
+++ b/compiler/testData/diagnostics/testsWithStdLib/kt8050.fir.kt
@@ -1,4 +1,4 @@
-private class X
+ class X
 
 private operator fun X?.plus(p: Int) = X()
 
@@ -8,4 +8,4 @@
     fun f() {
         map[""] += 1
     }
-}
\ No newline at end of file
+}
diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt8050.kt b/compiler/testData/diagnostics/testsWithStdLib/kt8050.kt
index 12547d5..ea7d373 100644
--- a/compiler/testData/diagnostics/testsWithStdLib/kt8050.kt
+++ b/compiler/testData/diagnostics/testsWithStdLib/kt8050.kt
@@ -1,11 +1,9 @@
-private class X
+class X
 
 private operator fun X?.plus(p: Int) = X()
 
 class C {
-    private val map = hashMapOf<String, X>()
-
-    fun f() {
-        map<!NO_SET_METHOD!>[""]<!> += 1
+    fun foo(x: X) {
+        x.plus(1)sda
     }
 }
