Enable ReferenceEquality error prone check

Bug: b/296992810
Change-Id: I75fddc11fb6e246592f160505a847820e64ab2c7
diff --git a/build.gradle b/build.gradle
index c766f7b..58bb94a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -623,12 +623,19 @@
         !org.gradle.internal.jvm.Jvm.current().javaVersion.java8) {
     compileJava {
 
-        // Enable error prone for D8/R8 main sources and make all warnings errors.
-        // Warnings that we have chosen not to fix (or suppress) are disabled outright below.
-        options.compilerArgs << "-Werror"
+        // Enable error prone for D8/R8 main sources
         options.errorprone.enabled = true
 
+        // Make all warnings errors. Warnings that we have chosen not to fix (or suppress) are
+        // disabled outright below.
+        options.compilerArgs << "-Werror"
+
+        // Increase number of reported errors to 1000 (default is 100).
+        options.compilerArgs << "-Xmaxerrs"
+        options.compilerArgs << "1000"
+
         // Non-default / Experimental checks - explicitly enforced.
+        options.errorprone.check('ReferenceEquality', CheckSeverity.ERROR)
         options.errorprone.check('RemoveUnusedImports', CheckSeverity.ERROR)
         options.errorprone.check('InconsistentOverloads', CheckSeverity.ERROR)
         options.errorprone.check('MissingDefault', CheckSeverity.ERROR)
@@ -687,7 +694,6 @@
         options.errorprone.check('AlmostJavadoc', CheckSeverity.OFF)
 
         // Moving away from identity and canonical items is not planned.
-        options.errorprone.check('ReferenceEquality', CheckSeverity.OFF)
         options.errorprone.check('IdentityHashMapUsage', CheckSeverity.OFF)
     }
 }
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index b6a8bda..e37f0e4 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -166,12 +166,19 @@
   dependsOn(thirdPartyCompileDependenciesTask)
   println("NOTE: Running with JDK: " + org.gradle.internal.jvm.Jvm.current().javaHome)
 
-  // Enable error prone for D8/R8 main sources and make all warnings errors.
-  // Warnings that we have chosen not to fix (or suppress) are disabled outright below.
-  options.compilerArgs.add("-Werror")
+  // Enable error prone for D8/R8 main sources.
   options.errorprone.isEnabled.set(true)
 
+  // Make all warnings errors. Warnings that we have chosen not to fix (or suppress) are disabled
+  // outright below.
+  options.compilerArgs.add("-Werror")
+
+  // Increase number of reported errors to 1000 (default is 100).
+  options.compilerArgs.add("-Xmaxerrs")
+  options.compilerArgs.add("1000")
+
   // Non-default / Experimental checks - explicitly enforced.
+  options.errorprone.error("ReferenceEquality")
   options.errorprone.error("RemoveUnusedImports")
   options.errorprone.error("InconsistentOverloads")
   options.errorprone.error("MissingDefault")
@@ -229,6 +236,5 @@
   options.errorprone.disable("AlmostJavadoc")
 
   // Moving away from identity and canonical items is not planned.
-  options.errorprone.disable("ReferenceEquality")
   options.errorprone.disable("IdentityHashMapUsage")
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
index f94af20..790fb9e 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepBindings.java
@@ -211,6 +211,7 @@
       return pattern.getClassReference().asBindingReference();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public KeepBindings build() {
       if (bindings.isEmpty()) {
         return NONE_INSTANCE;
diff --git a/src/main/java/com/android/tools/r8/DiagnosticsHandler.java b/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
index 8d73909..a332327 100644
--- a/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
+++ b/src/main/java/com/android/tools/r8/DiagnosticsHandler.java
@@ -16,6 +16,7 @@
 public interface DiagnosticsHandler {
 
   /** Should be considered private. */
+  @SuppressWarnings("ReferenceEquality")
   static void printDiagnosticToStream(Diagnostic diagnostic, String prefix, PrintStream stream) {
     if (diagnostic.getOrigin() != Origin.unknown()) {
       stream.print(prefix + " in " + diagnostic.getOrigin());
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
index 395a877..fc2188f 100644
--- a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
@@ -71,6 +71,7 @@
 @Keep
 public class GlobalSyntheticsGenerator {
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean ensureAllGlobalSyntheticsModeled(SyntheticNaming naming) {
     for (SyntheticKind kind : naming.kinds()) {
       assert !kind.isGlobal()
@@ -301,6 +302,7 @@
         executorService);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isExceptionType(AppView<?> appView, DexLibraryClass libraryClass) {
     DexType throwableType = appView.dexItemFactory().throwableType;
     DexType currentType = libraryClass.getType();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 9c1ab31..df434f9 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -942,6 +942,7 @@
         executorService);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean verifyMovedMethodsHaveOriginalMethodPosition(
       AppView<?> appView, DirectMappedDexApplication application) {
     application
@@ -968,6 +969,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean verifyOriginalMethodInPosition(
       Code code, DexMethod originalMethod, ProgramMethod context) {
     code.forEachPosition(
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index 83a0f5e..fc51eb0 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -75,6 +75,7 @@
     return lookup(reference, unknownValue, true);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ComputedApiLevel lookup(
       DexReference reference, ComputedApiLevel unknownValue, boolean ignoringDesugaredLibrary) {
     DexType contextType = reference.getContextType();
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index d4f9278..adcb0ae 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -172,6 +172,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isJavaType(DexType type, DexItemFactory factory) {
     DexString typeDescriptor = type.getDescriptor();
     return type == factory.objectType
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
index 8ad4f29..6341c03 100644
--- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -780,6 +780,7 @@
     builder.append(type);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void appendClass(DexType type) {
     assert type.isArrayType() || type.isClassType();
     if (type == DexItemFactory.nullValueType) {
diff --git a/src/main/java/com/android/tools/r8/cf/CfRegisterAllocator.java b/src/main/java/com/android/tools/r8/cf/CfRegisterAllocator.java
index 8ec6ba4d..ad077ea 100644
--- a/src/main/java/com/android/tools/r8/cf/CfRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/cf/CfRegisterAllocator.java
@@ -412,6 +412,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasEqualTypesAtEntry(BasicBlock first, BasicBlock second) {
     if (!java.util.Objects.equals(first.getLocalsAtEntry(), second.getLocalsAtEntry())) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
index db785cc..c5f1cac 100644
--- a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
@@ -198,6 +198,7 @@
             types.stream().map(DexType::toSourceString).collect(Collectors.toList())));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public TypeInfo join(TypeInfo info1, TypeInfo info2) {
     if (info1 == info2) {
       return info1;
@@ -220,10 +221,12 @@
     return TypeElement.fromDexType(type, Nullability.maybeNull(), appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public Map<Value, TypeInfo> computeVerificationTypes() {
     computingVerificationTypes = true;
     types = new HashMap<>();
     List<ConstNumber> nullsUsedInPhis = new ArrayList<>();
+    @SuppressWarnings("ReferenceEquality")
     Set<Value> worklist = Sets.newIdentityHashSet();
     {
       InstructionIterator it = code.instructionIterator();
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java b/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java
index d3f035b..d1ec598 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java
@@ -37,6 +37,7 @@
         : isFrameTypeAssignable(source.asWide(), target.asWide());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Based on https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.2.
   public boolean isFrameTypeAssignable(SingleFrameType source, SingleFrameType target) {
     if (source.equals(target) || target.isOneWord()) {
@@ -80,6 +81,7 @@
     return source.lessThanOrEqualTo(target);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Rules found at https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.2
   public boolean isAssignable(DexType source, DexType target) {
     assert !target.isNullValueType();
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
index 39e66b1..9045c59 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
@@ -36,6 +36,7 @@
     this(field, field);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public CfFieldInstruction(DexField field, DexField declaringField) {
     this.field = field;
     this.declaringField = declaringField;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifierDefaultAnalysisConfig.java b/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifierDefaultAnalysisConfig.java
index 82ea7ef..bd9f1a1 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifierDefaultAnalysisConfig.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFrameVerifierDefaultAnalysisConfig.java
@@ -48,6 +48,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean isImmediateSuperClassOfCurrentContext(DexType type) {
     // If the code is rewritten according to the graph lens, we perform a strict check that the
     // given type is the same as the current holder's super class.
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index a0f3d5e..8a87dd0 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -172,6 +172,7 @@
 
   // We should avoid interpreting a CF invoke using DEX semantics.
   @Deprecated
+  @SuppressWarnings("ReferenceEquality")
   public boolean isInvokeSuper(DexType clazz) {
     return opcode == Opcodes.INVOKESPECIAL
         && method.holder != clazz
@@ -283,6 +284,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public ConstraintWithTarget inliningConstraint(
       InliningConstraints inliningConstraints, CfCode code, ProgramMethod context) {
     GraphLens graphLens = inliningConstraints.getGraphLens();
@@ -368,6 +370,7 @@
     return frame.push(config, method.getReturnType());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private InvokeType computeInvokeTypeForInvokeSpecial(
       AppView<?> appView, DexMethod method, ProgramMethod context, DexType originalHolder) {
     if (appView.dexItemFactory().isConstructor(method)) {
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfSubtypingAssignability.java b/src/main/java/com/android/tools/r8/cf/code/CfSubtypingAssignability.java
index 0343076..147e879 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfSubtypingAssignability.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfSubtypingAssignability.java
@@ -16,6 +16,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   boolean internalIsClassTypeAssignableToClassType(DexType source, DexType target) {
     if (source == target || target == dexItemFactory.objectType) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
index d25fb70..6dde359 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/InitializedNonNullReferenceFrameTypeWithoutInterfaces.java
@@ -53,6 +53,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) {
     DexType rewrittenType = graphLens.lookupType(type);
     assert rewrittenType != DexItemFactory.nullValueType;
@@ -93,6 +94,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (this == obj) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/PreciseFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/PreciseFrameType.java
index 11f9a33..184b923 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/PreciseFrameType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/PreciseFrameType.java
@@ -10,6 +10,7 @@
 public interface PreciseFrameType extends FrameType {
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   default PreciseFrameType map(Function<DexType, DexType> fn) {
     assert !isInitializedNonNullReferenceTypeWithInterfaces();
     if (isInitializedNonNullReferenceTypeWithoutInterfaces()) {
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
index 5fe76fe..d41a82d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
+++ b/src/main/java/com/android/tools/r8/cf/code/frame/UninitializedNew.java
@@ -61,6 +61,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
index 8dc8979..ddadc01 100644
--- a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
+++ b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
@@ -119,6 +119,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {
       ClassReference rewrittenReference = rewrittenWithLens(tracedClass.getReference());
       super.acceptType(
@@ -132,6 +133,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {
       FieldReference rewrittenReference = rewrittenWithLens(tracedField.getReference());
       super.acceptField(
@@ -145,6 +147,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {
       MethodReference rewrittenReference = rewrittenWithLens(tracedMethod.getReference());
       super.acceptMethod(
@@ -198,6 +201,7 @@
       return internalRewrittenWithLens(classReference, type);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private ClassReference internalRewrittenWithLens(ClassReference classReference, DexType type) {
       DexString rewrittenDescriptor = namingLens.lookupClassDescriptor(type);
       return addCacheEntry(
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 930cdda..f6491b7 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -765,6 +765,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void insertAttributeAnnotationsForClass(DexProgramClass clazz) {
     EnclosingMethodAttribute enclosingMethod = clazz.getEnclosingMethodAttribute();
     List<InnerClassAttribute> innerClasses = clazz.getInnerClasses();
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index c797a4f..cb80f3d 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -1475,6 +1475,7 @@
       return enclosingMethodAttribute;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public AttributesAndAnnotations(
         DexType type, Origin origin, DexAnnotationSet annotations, InternalOptions options) {
       this.originalAnnotations = annotations;
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
index 70305e4..1673d39 100644
--- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
+++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -72,6 +72,7 @@
       this.endsAfterLastInstruction = endsAfterLastInstruction;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void replaceTarget(DexInstruction target, DexInstruction newTarget) {
       if (start == target) {
         start = newTarget;
@@ -474,6 +475,7 @@
     return offsetDelta;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void replaceTarget(DexInstruction target, DexInstruction newTarget) {
     for (List<DexInstruction> instructions : instructionTargets.values()) {
       instructions.replaceAll((i) -> i == target ? newTarget : i);
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index f44c562..72c0e2a 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -338,6 +338,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public List<VirtualFile> run() {
       Map<DexType, VirtualFile> files = new IdentityHashMap<>();
       Map<DexType, List<DexProgramClass>> derivedSynthetics = new LinkedHashMap<>();
@@ -1480,6 +1481,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private List<DexProgramClass> addNonStartupClasses() {
       int prefixLength = MINIMUM_PREFIX_LENGTH;
       int transactionStartIndex = 0;
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 0718573..a8935b6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -117,6 +117,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void write(
       ShortBuffer dest,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index e4ec21d..fcf77ed 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -53,6 +53,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void write(
       ShortBuffer dest,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphNode.java b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphNode.java
index 12661c0..640035a 100644
--- a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphNode.java
+++ b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphNode.java
@@ -36,6 +36,7 @@
     return CYCLE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final boolean isCycle() {
     return this == cycle();
   }
diff --git a/src/main/java/com/android/tools/r8/experimental/graphinfo/KeepRuleGraphNode.java b/src/main/java/com/android/tools/r8/experimental/graphinfo/KeepRuleGraphNode.java
index 3485f17..67feaf7 100644
--- a/src/main/java/com/android/tools/r8/experimental/graphinfo/KeepRuleGraphNode.java
+++ b/src/main/java/com/android/tools/r8/experimental/graphinfo/KeepRuleGraphNode.java
@@ -81,6 +81,7 @@
    * {@code <keep-rule-file>:<keep-rule-start-line>:<keep-rule-start-column>}.
    */
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public String toString() {
     return (getOrigin() == Origin.unknown() ? getContent() : getOrigin())
         + ":"
diff --git a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
index 0229986..a30eb47 100644
--- a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
+++ b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
@@ -221,6 +221,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     void flattenAccessContexts(DexField field) {
       if (accessesWithContexts != null) {
         ProgramMethodSet flattenedAccessContexts =
@@ -274,6 +275,7 @@
      * Returns true if this field is written by a method in the program other than {@param method}.
      */
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAccessedOutside(DexEncodedMethod method) {
       for (ProgramMethodSet encodedWriteContexts : accessesWithContexts.values()) {
         for (ProgramMethod encodedWriteContext : encodedWriteContexts) {
@@ -307,6 +309,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     ConcreteAccessContexts rewrittenWithLens(DexDefinitionSupplier definitions, GraphLens lens) {
       Map<DexField, ProgramMethodSet> rewrittenAccessesWithContexts = null;
       for (Entry<DexField, ProgramMethodSet> entry : accessesWithContexts.entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index d692cba..3819be8 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -115,6 +115,7 @@
     return OptionalBool.FALSE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isNestMate(DexClass clazz, DexClass context) {
     if (clazz == context) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 7052724..b02bb19 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -175,6 +175,7 @@
     return definitionForWithoutExistenceAssert(type) != null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexClass definitionForDesugarDependency(DexClass dependent, DexType type) {
     if (dependent.type == type) {
       return dependent;
@@ -205,6 +206,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void reportDependencyEdge(
       DesugarGraphConsumer consumer, Origin dependencyOrigin, Origin dependentOrigin) {
     if (dependencyOrigin == GlobalSyntheticOrigin.instance()
@@ -224,6 +226,7 @@
    * @param context the method the invoke is contained in, i.e., the caller.
    * @return The actual target for {@code method} if on the holder, or {@code null}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public final DexEncodedMethod lookupStaticTargetOnItself(
       DexMethod method, ProgramMethod context) {
     if (method.holder != context.getHolderType()) {
@@ -243,6 +246,7 @@
    * @param context the method the invoke is contained in, i.e., the caller.
    * @return The actual target for {@code method} if on the holder, or {@code null}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public final DexEncodedMethod lookupDirectTargetOnItself(
       DexMethod method, ProgramMethod context) {
     if (method.holder != context.getHolderType()) {
@@ -279,6 +283,7 @@
     return resolveFieldOn(field.holder, field, context);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public FieldResolutionResult resolveFieldOn(DexType type, DexField field, ProgramMethod context) {
     // Only allow resolution if the field is declared in the context.
     if (type != context.getHolderType()) {
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index 5e5d54d..2ef7860 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -270,6 +270,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSubtype(DexType subtype, DexType supertype) {
     assert subtype != null;
     assert supertype != null;
@@ -278,6 +279,7 @@
     return subtype == supertype || isStrictSubtypeOf(subtype, supertype);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isStrictSubtypeOf(DexType subtype, DexType supertype) {
     assert subtype != null;
     assert supertype != null;
@@ -313,6 +315,7 @@
         : isSubtypeOfClass(subclass, superclass);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSubtypeOfClass(DexClass subclass, DexClass superclass) {
     assert subclass != null;
     assert superclass != null;
@@ -323,6 +326,7 @@
     return subclass == superclass || isStrictSubtypeOfClass(subclass, superclass);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isStrictSubtypeOfClass(DexClass subclass, DexClass superclass) {
     assert subclass != null;
     assert superclass != null;
@@ -372,6 +376,7 @@
   }
 
   /** Collect all interfaces that this type directly or indirectly implements. */
+  @SuppressWarnings("ReferenceEquality")
   public InterfaceCollection implementedInterfaces(DexType type) {
     assert type.isClassType();
     DexClass clazz = definitionFor(type);
@@ -393,6 +398,7 @@
     }
     // First find all interface leafs from the class super-type chain.
     Set<DexType> seenAndKnown = Sets.newIdentityHashSet();
+    @SuppressWarnings("ReferenceEquality")
     Deque<Pair<DexClass, Boolean>> worklist = new ArrayDeque<>();
     {
       DexClass implementor = clazz;
@@ -476,6 +482,7 @@
     return Collections.emptyList();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isInterfaceInSuperTypes(
       DexProgramClass clazz, DexType ifaceToFind, WorkList<DexType> workList) {
     workList.addIfNotSeen(clazz.allImmediateSupertypes());
@@ -492,6 +499,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<DexProgramClass> computeChainInClassHierarchy(
       DexProgramClass subClass, DexType superType) {
     assert isSubtype(subClass.type, superType);
diff --git a/src/main/java/com/android/tools/r8/graph/AppServices.java b/src/main/java/com/android/tools/r8/graph/AppServices.java
index 0c1eb41..60956f4 100644
--- a/src/main/java/com/android/tools/r8/graph/AppServices.java
+++ b/src/main/java/com/android/tools/r8/graph/AppServices.java
@@ -192,6 +192,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyRewrittenWithLens() {
     for (Entry<DexType, Map<FeatureSplit, List<DexType>>> entry : services.entrySet()) {
       assert entry.getKey() == appView.graphLens().lookupClassType(entry.getKey(), applied);
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 259fc15..30bbe20 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -869,6 +869,7 @@
     return appViewWithLiveness;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public OptionalBool isSubtype(DexType subtype, DexType supertype) {
     // Even if we can compute isSubtype by having class hierarchy we may not be allowed to ask the
     // question for all code paths in D8. Having the check for liveness ensure that we are in R8
diff --git a/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java b/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
index 8e51a2e..b5f3a31 100644
--- a/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
+++ b/src/main/java/com/android/tools/r8/graph/ApplicationReaderMap.java
@@ -56,11 +56,13 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public DexType getType(DexType type) {
       return type == factory.recordTagType ? factory.recordType : type;
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public DexType getInvertedType(DexType type) {
       return type == factory.recordType ? factory.recordTagType : type;
     }
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 3fc29d6..cd2ab6a 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -75,6 +75,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   void writeClassHeader(DexProgramClass clazz, PrintStream ps) {
     String clazzName = retracer.toSourceString(clazz.getType());
     ps.println("# Bytecode for");
@@ -195,6 +196,7 @@
                 MethodConversionOptions.forD8(converter.appView)));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void writeAnnotations(
       DexProgramClass clazz, DexAnnotationSet annotations, PrintStream ps) {
     if (writeAnnotations) {
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index e2a42f7..b636a5c 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -416,6 +416,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void writeCf(
       ProgramMethod method,
       CfVersion classFileVersion,
@@ -823,6 +824,7 @@
     return new CfPrinter(this, method, retracer).toString();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ConstraintWithTarget computeInliningConstraint(
       ProgramMethod method,
       AppView<AppInfoWithLiveness> appView,
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 8a3f89d..566f79e 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -224,6 +224,7 @@
   }
 
   @Deprecated()
+  @SuppressWarnings("ReferenceEquality")
   // TODO(b/261971803): When having complete control over the positions we should not need this.
   private static Position removeSameMethodAndLineZero(
       Position calleePosition, Position callerPosition) {
diff --git a/src/main/java/com/android/tools/r8/graph/DebugLocalInfo.java b/src/main/java/com/android/tools/r8/graph/DebugLocalInfo.java
index 67a8eab..095f467 100644
--- a/src/main/java/com/android/tools/r8/graph/DebugLocalInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/DebugLocalInfo.java
@@ -68,6 +68,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Int2ReferenceSortedMap<DebugLocalInfo> endingLocals(
       Int2ReferenceMap<DebugLocalInfo> previousLocals,
       Int2ReferenceMap<DebugLocalInfo> nextLocals) {
@@ -82,6 +83,7 @@
     return ending;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Int2ReferenceSortedMap<DebugLocalInfo> startingLocals(
       Int2ReferenceMap<DebugLocalInfo> previousLocals,
       Int2ReferenceMap<DebugLocalInfo> nextLocals) {
@@ -97,6 +99,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object other) {
     if (this == other) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 4adaae6..b70ff11 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -87,6 +87,7 @@
     method.setCode(get().toCfCode(method, appView.dexItemFactory(), superType), appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean hasDefaultInstanceInitializerCode(
       ProgramMethod method, AppView<?> appView) {
     if (!method.getDefinition().isInstanceInitializer()) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 968863a..3d05de8 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -132,6 +132,7 @@
     mixedItems.add(this);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean retainCompileTimeAnnotation(DexType annotation, InternalOptions options) {
     if (options.retainCompileTimeAnnotations) {
       return true;
@@ -181,38 +182,46 @@
     return value.asDexValueMethod().value;
   }
 
-  public static boolean isEnclosingClassAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isEnclosingClassAnnotation(
+      DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationEnclosingClass;
   }
 
-  public static boolean isEnclosingMethodAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isEnclosingMethodAnnotation(
+      DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationEnclosingMethod;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isInnerClassAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationInnerClass;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isMemberClassesAnnotation(
       DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationMemberClasses;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isNestHostAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationNestHost;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isNestMembersAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationNestMembers;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isPermittedSubclassesAnnotation(
       DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationPermittedSubclasses;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isRecordAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.getAnnotationType() == factory.annotationRecord;
   }
@@ -232,6 +241,7 @@
             }));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Pair<DexString, Integer> getInnerClassFromAnnotation(
       DexAnnotation annotation, DexItemFactory factory) {
     assert isInnerClassAnnotation(annotation, factory);
@@ -642,6 +652,7 @@
         }));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexValue getSystemValueAnnotationValue(DexType type, DexAnnotation annotation) {
     assert annotation.visibility == VISIBILITY_SYSTEM;
     assert annotation.annotation.type == type;
@@ -650,6 +661,7 @@
         : annotation.annotation.elements[0].value;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexValue getSystemValueAnnotationValueWithName(
       DexType type, DexAnnotation annotation, DexString name) {
     assert annotation.visibility == VISIBILITY_SYSTEM;
@@ -662,34 +674,37 @@
     return null;
   }
 
-  public static boolean isThrowingAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isThrowingAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationThrows;
   }
 
-  public static boolean isSignatureAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isSignatureAnnotation(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationSignature;
 
   }
 
-  public static boolean isAnnotationDefaultAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isAnnotationDefaultAnnotation(
+      DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationDefault;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isJavaLangRetentionAnnotation(
       DexAnnotation annotation, DexItemFactory factory) {
     return annotation.getAnnotationType() == factory.retentionType;
   }
 
-  public static boolean isSourceDebugExtension(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isSourceDebugExtension(DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationSourceDebugExtension;
   }
 
-  public static boolean isParameterNameAnnotation(DexAnnotation annotation,
-      DexItemFactory factory) {
+  @SuppressWarnings("ReferenceEquality")
+  public static boolean isParameterNameAnnotation(
+      DexAnnotation annotation, DexItemFactory factory) {
     return annotation.annotation.type == factory.annotationMethodParameters;
   }
 
@@ -768,6 +783,7 @@
         != null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static SynthesizedAnnotationClassInfo getSynthesizedClassAnnotationInfo(
       DexAnnotationSet annotations,
       DexItemFactory factory,
@@ -839,6 +855,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexAnnotation rewrite(Function<DexEncodedAnnotation, DexEncodedAnnotation> rewriter) {
     DexEncodedAnnotation rewritten = rewriter.apply(annotation);
     if (rewritten == annotation) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
index 5dfb273..039e836 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
@@ -152,6 +152,7 @@
     sorted = hashCode();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexAnnotation getFirstMatching(DexType type) {
     for (DexAnnotation annotation : annotations) {
       if (annotation.annotation.type == type) {
@@ -161,6 +162,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexAnnotationSet getWithout(DexType annotationType) {
     int index = 0;
     for (DexAnnotation annotation : annotations) {
@@ -182,6 +184,7 @@
     return hashCode == UNSORTED ? 1 : hashCode;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexAnnotationSet getWithAddedOrReplaced(DexAnnotation newAnnotation) {
 
     // Check existing annotation for replacement.
@@ -218,6 +221,7 @@
     return rewritten != annotations ? create(rewritten) : this;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexAnnotationSet methodParametersWithFakeThisArguments(DexItemFactory factory) {
     DexAnnotation[] newAnnotations = null;
     for (int i = 0; i < annotations.length; i++) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 538f0e3..ed23497 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -85,6 +85,7 @@
   /** Generic signature information if the attribute is present in the input */
   protected ClassSignature classSignature;
 
+  @SuppressWarnings("ReferenceEquality")
   public DexClass(
       DexString sourceFile,
       DexTypeList interfaces,
@@ -468,10 +469,12 @@
     return fieldCollection.lookupInstanceField(field);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedField lookupUniqueInstanceFieldWithName(DexString name) {
     return internalLookupUniqueFieldThatMatches(field -> field.getName() == name, instanceFields());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedField lookupUniqueStaticFieldWithName(DexString name) {
     return internalLookupUniqueFieldThatMatches(field -> field.getName() == name, staticFields());
   }
@@ -546,6 +549,7 @@
     return methodCollection.getMethod(predicate);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod lookupSignaturePolymorphicMethod(
       DexString methodName, DexItemFactory factory) {
     if (type != factory.methodHandleType && type != factory.varHandleType) {
@@ -569,6 +573,7 @@
     return signaturePolymorphicMethod;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isSignaturePolymorphicMethod(
       DexEncodedMethod method, DexItemFactory factory) {
     assert method.getHolderType() == factory.methodHandleType
@@ -679,6 +684,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod getClassInitializer() {
     DexEncodedMethod classInitializer = methodCollection.getClassInitializer();
     assert classInitializer != DexEncodedMethod.SENTINEL;
@@ -1010,6 +1016,7 @@
     innerClasses.removeIf(predicate);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public InnerClassAttribute getInnerClassAttributeForThisClass() {
     for (InnerClassAttribute innerClassAttribute : getInnerClasses()) {
       if (type == innerClassAttribute.getInner()) {
@@ -1019,6 +1026,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void replaceInnerClassAttributeForThisClass(InnerClassAttribute newInnerClassAttribute) {
     ListIterator<InnerClassAttribute> iterator = getInnerClasses().listIterator();
     while (iterator.hasNext()) {
@@ -1047,6 +1055,7 @@
     permittedSubclasses.removeIf(predicate);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void replacePermittedSubclass(
       DexType currentPermittedSubclass, DexType newPermittedSubclass) {
     for (int i = 0; i < permittedSubclasses.size(); i++) {
@@ -1116,6 +1125,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isInSameNest(DexClass other) {
     return isInANest() && other.isInANest() && getNestHost() == other.getNestHost();
   }
@@ -1186,10 +1196,12 @@
     return fieldCollection.hasStaticFields();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasInstanceFields() {
     return fieldCollection.hasInstanceFields();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public List<DexClassAndField> getDirectAndIndirectInstanceFields(AppView<?> appView) {
     List<DexClassAndField> result = new ArrayList<>();
     DexClass current = this;
diff --git a/src/main/java/com/android/tools/r8/graph/DexClassAndMember.java b/src/main/java/com/android/tools/r8/graph/DexClassAndMember.java
index 703e841..44f6520 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClassAndMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClassAndMember.java
@@ -14,6 +14,7 @@
   private final DexClass holder;
   private final D definition;
 
+  @SuppressWarnings("ReferenceEquality")
   public DexClassAndMember(DexClass holder, D definition) {
     assert holder != null;
     assert definition != null;
diff --git a/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java b/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
index 3463789..4af04cb 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
@@ -36,6 +36,7 @@
     return getHolder().isInterface() && getDefinition().isDefaultMethod();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isStructurallyEqualTo(DexClassAndMethod other) {
     return getDefinition() == other.getDefinition() && getHolder() == other.getHolder();
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index 74b1589..c4eace2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -234,6 +234,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static void emitAdvancementEvents(
       int previousPc,
       Position previousPosition,
@@ -292,6 +293,7 @@
     events.add(factory.createDefault(specialOpcode));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void emitLocalChangeEvents(
       Int2ReferenceMap<DebugLocalInfo> previousLocals,
       Int2ReferenceMap<DebugLocalInfo> nextLocals,
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
index 22985dc..6cab690 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
@@ -38,6 +38,7 @@
    * @param context Context from which the lookup is taking place.
    * @return Definition of the type or null if no definition exists.
    */
+  @SuppressWarnings("ReferenceEquality")
   default DexClass definitionFor(DexType type, DexProgramClass context) {
     return type == context.type ? context : contextIndependentDefinitionFor(type);
   }
@@ -105,6 +106,7 @@
     return definitionFor(method) != null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   default ClassResolutionResult definitionForWithResolutionResult(
       DexType type, DexProgramClass context) {
     assert context.type != type || ClassResolutionResult.builder().add(context).build() == context;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
index 19aad9e..143dbe4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
@@ -107,6 +107,7 @@
     return hashCode == UNSORTED ? 1 : hashCode;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedAnnotation rewrite(
       Function<DexType, DexType> typeRewriter,
       Function<DexAnnotationElement, DexAnnotationElement> elementRewriter) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 5d63bdc..2093937 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -258,6 +258,7 @@
     this.staticValue = null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexValue getStaticValue() {
     assert accessFlags.isStatic();
     return staticValue == null ? DexValue.defaultForType(getReference().type) : staticValue;
@@ -267,6 +268,7 @@
     return toTypeSubstitutedField(appView, field, ConsumerUtils.emptyConsumer());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedField toTypeSubstitutedField(
       AppView<?> appView, DexField field, Consumer<Builder> consumer) {
     if (this.getReference() == field) {
@@ -281,6 +283,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean validateDexValue(DexItemFactory factory) {
     if (!accessFlags.isStatic() || staticValue == null) {
       return true;
@@ -331,6 +334,7 @@
     return isInlinableByJavaC;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean getOrComputeIsInlinableByJavaC(DexItemFactory dexItemFactory) {
     if (getIsInlinableByJavaC()) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index e5357fd..4811185 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -287,6 +287,7 @@
             DexEncodedMethod::hashCodeObject);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static int compareCodeObject(Code code1, Code code2, CompareToVisitor visitor) {
     if (code1 == code2) {
       return 0;
@@ -399,6 +400,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ProgramMethod asProgramMethod(DexProgramClass holder) {
     assert getHolderType() == holder.getType();
     return new ProgramMethod(holder, this);
@@ -569,11 +571,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean isStaticMember() {
     checkIfObsolete();
     return isStatic();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isAtLeastAsVisibleAsOtherInSameHierarchy(
       DexEncodedMethod other, AppView<? extends AppInfoWithClassHierarchy> appView) {
     assert getReference().getProto() == other.getReference().getProto();
@@ -593,6 +597,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSameVisibility(DexEncodedMethod other) {
     AccessFlags<MethodAccessFlags> accessFlags = getAccessFlags();
     if (accessFlags.getVisibilityOrdinal() != other.getAccessFlags().getVisibilityOrdinal()) {
@@ -670,6 +675,7 @@
         container.getHolderType(), inliningReason, appInfo, whyAreYouNotInliningReporter);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isInliningCandidate(
       DexType containerType,
       Reason inliningReason,
@@ -1141,6 +1147,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod toTypeSubstitutedMethodHelper(
       DexMethod method, boolean isD8R8Synthesized, Consumer<Builder> consumer) {
     checkIfObsolete();
@@ -1166,6 +1173,7 @@
     return builder.build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ProgramMethod toPrivateSyntheticMethod(DexProgramClass holder, DexMethod method) {
     assert !isStatic();
     assert !isPrivate();
@@ -1358,6 +1366,7 @@
     return code == null ? null : code.asDexWritableCode();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod rewrittenWithLens(
       GraphLens lens, GraphLens appliedLens, DexDefinitionSupplier definitions) {
     assert this != SENTINEL;
diff --git a/src/main/java/com/android/tools/r8/graph/DexField.java b/src/main/java/com/android/tools/r8/graph/DexField.java
index 7628bd6..02cced2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexField.java
@@ -191,6 +191,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean match(DexField field) {
     return field.name == name && field.type == type;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexFieldSignature.java b/src/main/java/com/android/tools/r8/graph/DexFieldSignature.java
index 2f22c1a..2428a1f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexFieldSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/DexFieldSignature.java
@@ -50,6 +50,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean isEqualTo(DexFieldSignature other) {
     return getName() == other.getName() && getType() == other.getType();
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 3713b4d..32f0cbd 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -1045,6 +1045,7 @@
     return skipNameValidationForTesting;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isLambdaMetafactoryMethod(DexMethod dexMethod) {
     return dexMethod == metafactoryMethod || dexMethod == metafactoryAltMethod;
   }
@@ -1770,6 +1771,7 @@
               requireNonNullMethodName);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isRequireNonNullMethod(DexMethod method) {
       return method == requireNonNull
           || method == requireNonNullWithMessage
@@ -1778,6 +1780,7 @@
           || method == requireNonNullElseGet;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isToStringMethod(DexMethod method) {
       return method == toStringWithObject || method == toStringWithObjectAndNullDefault;
     }
@@ -1855,6 +1858,7 @@
       getNames = ImmutableSet.of(getName, getCanonicalName, getSimpleName, getTypeName);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isReflectiveClassLookup(DexMethod method) {
       return method == forName || method == forName3;
     }
@@ -1988,6 +1992,7 @@
       fn.accept(ordinalField);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isNameOrOrdinalField(DexField field) {
       return field == nameField || field == ordinalField;
     }
@@ -1998,6 +2003,7 @@
       return accessFlags.isEnum() && accessFlags.isFinal();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // In some case, the enum field may be respecialized to an enum subtype. In this case, one
     // can pass the encoded field as well as the field with the super enum type for the checks.
     public boolean isEnumField(
@@ -2007,6 +2013,7 @@
           && isEnumFieldCandidate(staticField);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isValuesFieldCandidate(DexClassAndField staticField, DexType enumType) {
       FieldAccessFlags accessFlags = staticField.getAccessFlags();
       assert accessFlags.isStatic();
@@ -2296,10 +2303,12 @@
       return appendMethods.contains(method);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAppendObjectMethod(DexMethod method) {
       return method == appendObject;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAppendCharSequenceMethod(DexMethod method) {
       return method == appendCharSequence || method == appendSubCharSequence;
     }
@@ -2312,10 +2321,12 @@
       return appendPrimitiveMethods.contains(method);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAppendSubArrayMethod(DexMethod method) {
       return appendSubCharArray == method || appendSubCharSequence == method;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAppendStringMethod(DexMethod method) {
       return method == appendString;
     }
@@ -2324,6 +2335,7 @@
       return constructorMethods.contains(method);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean constructorInvokeIsSideEffectFree(
         DexMethod invokedMethod, List<Value> arguments) {
       if (invokedMethod == defaultConstructor) {
@@ -2356,6 +2368,7 @@
       return false;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isAppendCharArrayMethod(DexMethod method) {
       return method == appendCharArray || method == appendSubCharArray;
     }
@@ -2410,6 +2423,7 @@
             "weakCompareAndSetPlain",
             "weakCompareAndSetRelease");
 
+    @SuppressWarnings("ReferenceEquality")
     public DexMethod canonicalize(DexMethod invokeProto) {
       DexMethod result = null;
       if (invokeProto.holder == methodHandleType) {
@@ -2439,6 +2453,7 @@
       return map.keySet();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isPolymorphicInvoke(DexMethod invokeProto) {
       if (invokeProto.holder == methodHandleType) {
         return invokeProto.name == invokeMethodName || invokeProto.name == invokeExactMethodName;
@@ -2489,6 +2504,7 @@
           createMethod(serviceLoaderType, createProto(iteratorType), createString("iterator"));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isLoadMethod(DexMethod method) {
       return method == load || method == loadWithClassLoader || method == loadInstalled;
     }
@@ -2992,6 +3008,7 @@
     return createMethod(initialMethod.holder, newProto, initialMethod.name);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexProto applyClassMappingToProto(
       DexProto proto, Function<DexType, DexType> mapping, Map<DexProto, DexProto> cache) {
     assert cache != null;
@@ -3013,6 +3030,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexType[] applyClassMappingToDexTypes(
       DexType[] types, Function<DexType, DexType> mapping) {
     Map<Integer, DexType> changed = new Int2ReferenceArrayMap<>();
@@ -3157,10 +3175,12 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isConstructor(DexMethod method) {
     return method.name == constructorMethodName;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isClassConstructor(DexMethod method) {
     return method.name == classConstructorMethodName;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java
index a8c8ddf..156bfb1 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -244,6 +244,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean match(DexMethod method) {
     return method == this || match(method.getProto(), method.getName());
   }
@@ -252,6 +253,7 @@
     return match(method.getProto(), method.getName());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean match(DexProto methodProto, DexString methodName) {
     return proto == methodProto && name == methodName;
   }
@@ -305,6 +307,7 @@
     return builder.append(")").toString();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isLambdaDeserializeMethod(DexItemFactory dexItemFactory) {
     return name == dexItemFactory.deserializeLambdaMethodName
         && proto == dexItemFactory.deserializeLambdaMethodProto;
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
index e48785c..d763201 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
@@ -101,6 +101,7 @@
       return kind;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public static MethodHandleType fromAsmHandle(
         Handle handle, JarApplicationReader application, DexType clazz) {
       switch (handle.getTag()) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java b/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
index 61b63ca..e441972 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
@@ -71,6 +71,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) return true;
     if (!(o instanceof DexMethodSignature)) return false;
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 0ea604e..39f6136 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -191,6 +191,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DexProgramClass getContext() {
     return this;
   }
@@ -210,6 +211,7 @@
     return reachabilitySensitive.isTrue();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean internalComputeReachabilitySensitive(AppView<?> appView) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
     for (DexEncodedMember<?, ?> member : members()) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java
index 204d05e..81f65e4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexType.java
+++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -325,6 +325,7 @@
     return descriptor.getFirstByteAsChar() == 'D';
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isNullValueType() {
     boolean isNullValueType = descriptor.getFirstByteAsChar() == 'N';
     assert !isNullValueType || this == DexItemFactory.nullValueType;
diff --git a/src/main/java/com/android/tools/r8/graph/DexTypeUtils.java b/src/main/java/com/android/tools/r8/graph/DexTypeUtils.java
index 625b127..ac780e9 100644
--- a/src/main/java/com/android/tools/r8/graph/DexTypeUtils.java
+++ b/src/main/java/com/android/tools/r8/graph/DexTypeUtils.java
@@ -19,6 +19,7 @@
     return findApiSafeUpperBound(appView, toDexType(appView, join));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static DexType toDexType(
       AppView<? extends AppInfoWithClassHierarchy> appView, TypeElement type) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index b2bc5ce..0d5f834 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -408,6 +408,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isDefault(DexType type) {
     return this == defaultForType(type);
   }
@@ -1794,11 +1795,13 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     void internalAcceptHashing(HashingVisitor visitor) {
       assert this == NULL;
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     int internalAcceptCompareTo(DexValue other, CompareToVisitor visitor) {
       assert this == NULL;
       assert other == NULL;
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 29d7e96..1f97831 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -146,6 +146,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean mappingIsValid(
       Collection<DexProgramClass> classesBeforeLensApplication, GraphLens lens) {
     // The lens might either map to a different type that is already present in the application
diff --git a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
index 7d6b3a2..9e3f201 100644
--- a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
+++ b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
@@ -75,6 +75,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     return obj instanceof EnclosingMethodAttribute &&
         enclosingClass == ((EnclosingMethodAttribute) obj).enclosingClass &&
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
index 4344d55..0dae257 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
@@ -140,6 +140,7 @@
     forEachIndirectAccess(consumer, writesWithContexts, visited);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void forEachIndirectAccess(
       Consumer<DexField> consumer,
       AbstractAccessContexts accessesWithContexts,
@@ -157,6 +158,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void forEachIndirectAccessWithContexts(BiConsumer<DexField, ProgramMethodSet> consumer) {
     Map<DexField, ProgramMethodSet> indirectAccessesWithContexts = new IdentityHashMap<>();
     addAccessesWithContextsToMap(
diff --git a/src/main/java/com/android/tools/r8/graph/FieldArrayBacking.java b/src/main/java/com/android/tools/r8/graph/FieldArrayBacking.java
index ec0758a..35b5484 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldArrayBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldArrayBacking.java
@@ -280,6 +280,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexEncodedField[] replaceFieldsHelper(
       DexEncodedField[] fields,
       Function<DexEncodedField, DexEncodedField> replacement,
diff --git a/src/main/java/com/android/tools/r8/graph/FieldCollection.java b/src/main/java/com/android/tools/r8/graph/FieldCollection.java
index 9b3c09b..2c4b920 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldCollection.java
@@ -109,6 +109,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyCorrectnessOfFieldHolder(DexEncodedField field) {
     assert field.getHolderType() == holder.type
         : "Expected field `"
diff --git a/src/main/java/com/android/tools/r8/graph/FieldMapBacking.java b/src/main/java/com/android/tools/r8/graph/FieldMapBacking.java
index a6d9b57..f743dc2 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldMapBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldMapBacking.java
@@ -218,6 +218,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   void replaceFields(Function<DexEncodedField, DexEncodedField> replacement) {
     // The code assumes that when replacement.apply(field) is called, the map is up-to-date with
     // the previously replaced fields. We therefore cannot postpone the map updates to the end of
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
index ac9ff70..a383253 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -161,6 +161,7 @@
     private final T resolvedHolder;
     private final DexEncodedField resolvedField;
 
+    @SuppressWarnings("ReferenceEquality")
     SingleFieldResolutionResult(
         DexClass initialResolutionHolder, T resolvedHolder, DexEncodedField resolvedField) {
       assert resolvedHolder.type == resolvedField.getHolderType();
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
index d669d502..a339bde 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -312,6 +312,7 @@
       return toRenamedString(NamingLens.getIdentityLens(), alwaysTrue());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public List<FieldTypeSignature> getGenericArgumentsToSuperType(
         DexType type, DexItemFactory factory) {
       assert hasSignature();
@@ -364,6 +365,7 @@
         return this;
       }
 
+      @SuppressWarnings("ReferenceEquality")
       public ClassSignature build(DexItemFactory factory) {
         // Any trivial super class signature is always represented by the null value.
         if (superClassSignature != null) {
@@ -629,6 +631,7 @@
       this(type, typeArguments, enclosingTypeSignature, WildcardIndicator.NOT_AN_ARGUMENT);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private ClassTypeSignature(
         DexType type,
         List<FieldTypeSignature> typeArguments,
@@ -675,6 +678,7 @@
       return new ArrayTypeSignature(this);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public ClassTypeSignature visit(GenericSignatureVisitor visitor) {
       if (hasNoSignature()) {
         return this;
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
index b761eb99b..1a3e78f 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureContextBuilder.java
@@ -259,6 +259,7 @@
     return typeParameterContext.combine(methodFormals, prunedHere);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasPrunedRelationship(
       AppView<?> appView,
       DexReference enclosingReference,
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureCorrectnessHelper.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureCorrectnessHelper.java
index 8bac211..c3033f4 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureCorrectnessHelper.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureCorrectnessHelper.java
@@ -243,6 +243,7 @@
       this.context = context;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private SignatureEvaluationResult evaluateClassSignatureForContext(
         TypeParameterContext typeParameterContext) {
       ClassSignature classSignature = context.classSignature;
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
index 503000f..d8c58ee 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePartialTypeArgumentApplier.java
@@ -125,6 +125,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public List<FieldTypeSignature> visitTypeArguments(
       DexType originalType, DexType lookedUpType, List<FieldTypeSignature> typeArguments) {
     assert originalType == lookedUpType;
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index cdbc19b..d519324 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -151,6 +151,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public List<ClassTypeSignature> visitSuperInterfaces(
         List<ClassTypeSignature> interfaceSignatures) {
       if (interfaceSignatures.isEmpty()) {
@@ -172,6 +173,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
       ClassTypeSignature rewritten = classTypeSignature.visit(this);
       return rewritten == null || rewritten.type() == context.type ? null : rewritten;
diff --git a/src/main/java/com/android/tools/r8/graph/InvalidCode.java b/src/main/java/com/android/tools/r8/graph/InvalidCode.java
index b3016c9..ff2dc3d 100644
--- a/src/main/java/com/android/tools/r8/graph/InvalidCode.java
+++ b/src/main/java/com/android/tools/r8/graph/InvalidCode.java
@@ -17,6 +17,7 @@
     return INSTANCE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isInvalidCode(Code code) {
     return code == INSTANCE;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
index 6fbdc33..2c4ce38 100644
--- a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
@@ -187,6 +187,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void checkClassForMethodHandlesLookup(DexClass dexClass, ClassKind<?> classKind) {
     if (options.shouldDesugarVarHandle()) {
       if (VarHandleDesugaring.refersToMethodHandlesLookup(dexClass.getType(), getFactory())) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 067e0ae..fc6359f 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -590,6 +590,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean hasReachabilitySensitiveField() {
       DexType reachabilitySensitive = application.getFactory().annotationReachabilitySensitive;
       for (DexEncodedField field : Iterables.concat(instanceFields, staticFields)) {
@@ -721,6 +722,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexValue getStaticValue(Object value, DexType type) {
       if (value == null) {
         return null;
@@ -986,6 +988,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean isReachabilitySensitive() {
       DexType reachabilitySensitive =
           parent.application.getFactory().annotationReachabilitySensitive;
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index 7578c196..897d908 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -116,6 +116,7 @@
     private final ImmutableMap<DexType, DexClasspathClass> classpathClasses;
     private final ImmutableMap<DexType, DexLibraryClass> libraryClasses;
 
+    @SuppressWarnings("ReferenceEquality")
     AllClasses(
         LibraryClassCollection libraryClassesLoader,
         ClasspathClassCollection classpathClassesLoader,
diff --git a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
index 77d8fbd..9afb69a 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
@@ -365,6 +365,7 @@
     addVirtualMethods(newVirtualMethods);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<DexEncodedMethod> internalReplaceDirectMethods(
       Function<DexEncodedMethod, DexEncodedMethod> replacement) {
     List<DexEncodedMethod> newVirtualMethods = new ArrayList<>();
@@ -398,6 +399,7 @@
     addDirectMethods(newDirectMethods);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<DexEncodedMethod> internalReplaceVirtualMethods(
       Function<DexEncodedMethod, DexEncodedMethod> replacement) {
     List<DexEncodedMethod> newDirectMethods = new ArrayList<>();
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index 47d8a02..e14da8e 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -224,6 +224,7 @@
     cachedClassInitializer = DexEncodedMethod.SENTINEL;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public synchronized DexEncodedMethod getClassInitializer() {
     if (cachedClassInitializer == DexEncodedMethod.SENTINEL) {
       cachedClassInitializer = null;
@@ -394,6 +395,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyCorrectnessOfMethodHolder(DexEncodedMethod method) {
     assert method.getHolderType() == holder.type
         : "Expected method `"
diff --git a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
index 0e838b9..84f114f 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
@@ -273,6 +273,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   void replaceMethods(Function<DexEncodedMethod, DexEncodedMethod> replacement) {
     // The code assumes that when replacement.apply(method) is called, the map is up-to-date with
     // the previously replaced methods. We therefore cannot postpone the map updates to the end of
@@ -369,6 +370,7 @@
     assert verifyVirtualizedMethods(privateInstanceMethods);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyVirtualizedMethods(Set<DexEncodedMethod> methods) {
     for (DexEncodedMethod method : methods) {
       assert belongsToVirtualPool(method);
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolution.java b/src/main/java/com/android/tools/r8/graph/MethodResolution.java
index a56b0ef..15c3b51 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolution.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolution.java
@@ -108,6 +108,7 @@
    * 10.7 of the Java Language Specification</a>. All invokations will have target java.lang.Object
    * except clone which has no target.
    */
+  @SuppressWarnings("ReferenceEquality")
   private MethodResolutionResult resolveMethodOnArray(
       DexType holder, DexProto methodProto, DexString methodName) {
     assert holder.isArrayType();
@@ -588,6 +589,7 @@
       typesWithMultipleDefinitions.add(type);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void addCandidate(DexClass holder, DexEncodedMethod method, boolean isIncompletePath) {
       // If this candidate is already a candidate or it is shadowed, then no need to continue.
       if (isIncompletePath) {
@@ -614,6 +616,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void markShadowed(DexType type) {
       if (type == null) {
         return;
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
index 5d823bd..d7362d6 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
@@ -266,6 +266,7 @@
     private final T resolvedHolder;
     private final DexEncodedMethod resolvedMethod;
 
+    @SuppressWarnings("ReferenceEquality")
     public SingleResolutionResult(
         DexClass initialResolutionHolder, T resolvedHolder, DexEncodedMethod resolvedMethod) {
       assert initialResolutionHolder != null;
@@ -455,6 +456,7 @@
       return null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexClassAndMethod internalInvokeSpecialOrSuper(
         DexProgramClass context,
         AppInfoWithClassHierarchy appInfo,
@@ -538,6 +540,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public LookupResult lookupVirtualDispatchTargets(
         DexProgramClass context,
         AppView<? extends AppInfoWithClassHierarchy> appView,
@@ -724,6 +727,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public LookupMethodTarget lookupVirtualDispatchTarget(
         DexClass dynamicInstance, AppInfoWithClassHierarchy appInfo) {
       return lookupVirtualDispatchTarget(
@@ -750,6 +754,7 @@
           lambdaInstance, appInfo, typeCausingFailureConsumer, methodCausingFailureConsumer);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private LookupMethodTarget lookupVirtualDispatchTarget(
         DexClass dynamicInstance,
         AppInfoWithClassHierarchy appInfo,
@@ -856,6 +861,7 @@
       return null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private static DexClassAndMethod findWideningOverride(
         DexClassAndMethod resolvedMethod, DexClass clazz, AppInfoWithClassHierarchy appInfo) {
       // Otherwise, lookup to first override that is distinct from resolvedMethod.
@@ -1340,6 +1346,7 @@
       return true;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean verifyInvalidSymbolicReference() {
       BooleanBox invalidSymbolicReference = new BooleanBox(true);
       forEachFailureDependency(
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
index aea1754..0eb2d7e 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
@@ -192,6 +192,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public TraversalContinuation<?, ?> traverseInstantiatedSubtypes(
       DexType type,
       Function<DexProgramClass, TraversalContinuation<?, ?>> onClass,
@@ -446,6 +447,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void populateInstantiatedHierarchy(
         DexDefinitionSupplier definitions, DexType type, DexClass subtype) {
       if (type == definitions.dexItemFactory().objectType) {
@@ -575,11 +577,13 @@
       return true;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean typeIsInHierarchy(DexDefinitionSupplier definitions, DexType type) {
       return type == definitions.dexItemFactory().objectType
           || instantiatedHierarchy.containsKey(type);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean isImmediateSuperType(DexType type, DexClass subtype) {
       for (DexType supertype : subtype.allImmediateSupertypes()) {
         if (type == supertype) {
diff --git a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
index 7e21357..69ea102 100644
--- a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
+++ b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
@@ -193,6 +193,7 @@
   }
 
   /** Return a ParameterAnnotationsList extended to the given number of parameters. */
+  @SuppressWarnings("ReferenceEquality")
   public ParameterAnnotationsList withParameterCount(int parameterCount) {
     if (this == EMPTY_PARAMETER_ANNOTATIONS_LIST || parameterCount == size()) {
       return this;
@@ -224,6 +225,7 @@
    * Return a new ParameterAnnotationsList that keeps only the annotations matched by {@code
    * filter}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public ParameterAnnotationsList keepIf(Predicate<DexAnnotation> filter) {
     DexAnnotationSet[] filtered = null;
     boolean allEmpty = true;
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramField.java b/src/main/java/com/android/tools/r8/graph/ProgramField.java
index e564a79..adea688 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramField.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramField.java
@@ -44,6 +44,7 @@
                     && method.getHolder() == getHolder());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isStructurallyEqualTo(ProgramField other) {
     return getDefinition() == other.getDefinition() && getHolder() == other.getHolder();
   }
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 32ba2c2..6ef6ae4 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -203,6 +203,7 @@
     return appView.options().debug || getOrComputeReachabilitySensitive(appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ProgramMethod rewrittenWithLens(
       GraphLens lens, GraphLens appliedLens, DexDefinitionSupplier definitions) {
     DexMethod newMethod = lens.getRenamedMethodSignature(getReference(), appliedLens);
@@ -213,6 +214,7 @@
     return asProgramMethodOrNull(definitions.definitionFor(newMethod));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyIsConsistentWithLookup(DexDefinitionSupplier definitions) {
     DexClassAndMethod lookupMethod = definitions.definitionFor(getReference());
     assert getDefinition() == lookupMethod.getDefinition();
diff --git a/src/main/java/com/android/tools/r8/graph/SmaliWriter.java b/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
index 0eff9d1..6de8085 100644
--- a/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
@@ -40,6 +40,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   void writeClassHeader(DexProgramClass clazz, PrintStream ps) {
     ps.append(".class ");
     ps.append(clazz.accessFlags.toSmaliString());
diff --git a/src/main/java/com/android/tools/r8/graph/SubtypingInfo.java b/src/main/java/com/android/tools/r8/graph/SubtypingInfo.java
index e239b5e..dace46c 100644
--- a/src/main/java/com/android/tools/r8/graph/SubtypingInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/SubtypingInfo.java
@@ -93,6 +93,7 @@
     return typeInfo.computeIfAbsent(type, TypeInfo::new);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void populateAllSuperTypes(
       Map<DexType, Set<DexType>> map,
       Map<DexType, TypeInfo> typeInfo,
@@ -138,6 +139,7 @@
     assert validateLevelsAreCorrect(typeInfo, definitionSupplier);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean validateLevelsAreCorrect(
       Map<DexType, TypeInfo> typeInfo, DexDefinitionSupplier definitionSupplier) {
     Set<DexType> seenTypes = Sets.newIdentityHashSet();
@@ -283,6 +285,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (!(obj instanceof TypeInfo)) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
index 9f9d30a..7947f84 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
@@ -53,6 +53,7 @@
             .collect(Collectors.toList());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUsingJavaAssertionsDisabledField(DexField field) {
     // This does not check the holder, as for inner classes the field is read from the outer class
     // and not the class itself.
@@ -60,6 +61,7 @@
         && field.getType() == dexItemFactory.booleanType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUsingKotlinAssertionsEnabledField(DexField field) {
     return field == dexItemFactory.kotlin.assertions.enabledField;
   }
@@ -158,6 +160,7 @@
   private static List<Class<?>> jacocoInstructionSequence =
       ImmutableList.of(CfLoad.class, CfConstNumber.class, CfConstNumber.class, CfArrayStore.class);
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean hasJavacClinitAssertionCode(CfCode code) {
     for (int i = 0; i < code.getInstructions().size(); i++) {
       CfInstruction instruction = code.getInstructions().get(i);
@@ -186,6 +189,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean hasKotlincClinitAssertionCode(ProgramMethod method) {
     if (method.getHolderType() == dexItemFactory.kotlin.assertions.type) {
       CfCode code = method.getDefinition().getCode().asCfCode();
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
index 7c17e4c..94bf7ce 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
@@ -59,6 +59,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isInterfaceInSomeApiLevel(DexType type) {
     // CameraDevice was added as a class in API 21 (L), but was defined as an interface in the
     // framework before then.
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/MethodNamingUtility.java b/src/main/java/com/android/tools/r8/graph/fixup/MethodNamingUtility.java
index 688853d..d96e38c 100644
--- a/src/main/java/com/android/tools/r8/graph/fixup/MethodNamingUtility.java
+++ b/src/main/java/com/android/tools/r8/graph/fixup/MethodNamingUtility.java
@@ -29,6 +29,7 @@
     this.localSignatures = localSignatures;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexMethod nextUniqueMethod(
       DexEncodedMethod method, DexProto newProto, DexType initExtraType) {
     DexMethod reference = method.getReference();
@@ -50,6 +51,7 @@
     return nextUniquePrivateOrStaticMethod(reference, newProto);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod nextUniqueInitializer(
       DexMethod reference, DexProto newProto, DexType initExtraType) {
     assert !inheritedSignatures.containsKey(reference.getSignature());
@@ -92,6 +94,7 @@
         || inheritedSignatures.containsValue(method.getSignature());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod nextUniqueMethod(
       DexMethod reference, DexProto newProto, BiConsumer<DexMethod, DexMethod> registration) {
     // 1) We check if the reference has already been reserved (pinning or override).
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
index 035ab26..6464048 100644
--- a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
@@ -70,6 +70,7 @@
   }
 
   /** Rewrite missing references */
+  @SuppressWarnings("ReferenceEquality")
   public void recordFailedResolutionChanges() {
     // In order for optimizations to correctly rewrite field and method references that do not
     // resolve, we create a mapping from each failed resolution target to its reference reference.
@@ -113,6 +114,7 @@
     return newProgramClasses;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Should remain private as the correctness of the fixup requires the lazy 'newProgramClasses'.
   private DexProgramClass fixupClass(DexProgramClass clazz) {
     DexProgramClass newClass =
@@ -156,6 +158,7 @@
     return newClass;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected EnclosingMethodAttribute fixupEnclosingMethodAttribute(
       EnclosingMethodAttribute enclosingMethodAttribute) {
     if (enclosingMethodAttribute == null) {
@@ -194,6 +197,7 @@
     return newFields;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedField fixupField(
       DexEncodedField field, Consumer<DexEncodedField.Builder> consumer) {
     DexField fieldReference = field.getReference();
@@ -212,6 +216,7 @@
     return dexItemFactory.createField(newHolder, newType, field.name);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected List<InnerClassAttribute> fixupInnerClassAttributes(
       List<InnerClassAttribute> innerClassAttributes) {
     if (innerClassAttributes.isEmpty()) {
@@ -254,6 +259,7 @@
   }
 
   /** Fixup a method definition. */
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod fixupMethod(DexEncodedMethod method) {
     DexMethod methodReference = method.getReference();
     DexMethod newMethodReference = fixupMethodReference(methodReference);
@@ -275,6 +281,7 @@
         : null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected List<NestMemberClassAttribute> fixupNestMemberAttributes(
       List<NestMemberClassAttribute> nestMemberAttributes) {
     if (nestMemberAttributes.isEmpty()) {
@@ -292,6 +299,7 @@
     return changed ? newNestMemberAttributes : nestMemberAttributes;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected List<PermittedSubclassAttribute> fixupPermittedSubclassAttribute(
       List<PermittedSubclassAttribute> permittedSubclassAttributes) {
     if (permittedSubclassAttributes.isEmpty()) {
@@ -317,6 +325,7 @@
     return newPermittedSubclassAttributes;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected List<RecordComponentInfo> fixupRecordComponents(
       List<RecordComponentInfo> recordComponents) {
     if (recordComponents.isEmpty()) {
@@ -352,6 +361,7 @@
   }
 
   /** Fixup a type reference. */
+  @SuppressWarnings("ReferenceEquality")
   public DexType fixupType(DexType type) {
     if (type.isArrayType()) {
       DexType base = type.toBaseType(dexItemFactory);
@@ -367,6 +377,7 @@
     return type;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexType[] fixupTypes(DexType[] types) {
     boolean changed = false;
     DexType[] newTypes = new DexType[types.length];
diff --git a/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
index 8154252..e6ecef1 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
@@ -44,6 +44,7 @@
   // which is why we need an additional map.
   private final Map<DexMethod, DexMethod> extraOriginalMethodSignatures = new IdentityHashMap<>();
 
+  @SuppressWarnings("ReferenceEquality")
   public AppliedGraphLens(AppView<? extends AppInfoWithClassHierarchy> appView) {
     super(appView.dexItemFactory(), GraphLens.getIdentityLens());
     for (DexProgramClass clazz : appView.appInfo().classes()) {
@@ -90,6 +91,7 @@
     MapUtils.removeIdentityMappings(extraOriginalMethodSignatures);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void recordOriginalTypeNames(
       DexProgramClass clazz, AppView<? extends AppInfoWithClassHierarchy> appView) {
     DexType type = clazz.getType();
diff --git a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
index 682c08e..4d339e8 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
@@ -76,6 +76,7 @@
 
     protected Builder() {}
 
+    @SuppressWarnings("ReferenceEquality")
     public void move(DexMethod from, DexMethod to) {
       if (from == to) {
         return;
@@ -211,6 +212,7 @@
     return reference;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Predicate indicating if a rewritten reference is a simple renaming, meaning the move from one
   // reference to another is simply either just a renaming or/also renaming of the references. In
   // other words, the content of the definition, including the definition of all of its members is
@@ -450,6 +452,7 @@
     return this;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean assertFieldsNotModified(Iterable<DexEncodedField> fields) {
     for (DexEncodedField field : fields) {
       DexField reference = field.getReference();
@@ -467,6 +470,7 @@
     return assertReferencesNotModified(pinnedItems);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public <T extends DexReference> boolean assertReferencesNotModified(Iterable<T> references) {
     for (DexReference reference : references) {
       if (reference.isDexField()) {
@@ -504,6 +508,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public Set<DexField> rewriteFields(Set<DexField> fields, Timing timing) {
     timing.begin("Rewrite fields");
     GraphLens appliedLens = getIdentityLens();
@@ -541,6 +546,7 @@
     return rewrittenFields;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyIsIdentityLensForFields(
       Collection<DexField> fields, GraphLens appliedLens) {
     for (DexField field : fields) {
diff --git a/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java b/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
index e1d4ca6..bb8175a 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/InitClassLens.java
@@ -32,6 +32,7 @@
 
     private final Map<DexType, DexField> mapping = new ConcurrentHashMap<>();
 
+    @SuppressWarnings("ReferenceEquality")
     public void map(DexType type, DexField field) {
       assert field.holder == type;
       mapping.put(type, field);
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
index 93c76a0..cdd27a5 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLens.java
@@ -131,6 +131,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
     if (previous.hasReboundReference()) {
       // Rewrite the rebound reference and then "fixup" the non-rebound reference.
@@ -159,6 +160,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context, GraphLens codeLens) {
     if (previous.hasReboundReference()) {
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
index c022a8e..2c78950 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
@@ -81,6 +81,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public MethodLookupResult lookupMethod(
       DexMethod method, DexMethod context, InvokeType type, GraphLens codeLens) {
     if (method.getHolderType().isArrayType()) {
@@ -102,6 +103,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public final DexType lookupType(DexType type, GraphLens appliedLens) {
     if (type.isClassType()) {
       return lookupClassType(type, appliedLens);
diff --git a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
index f08d256..544940a 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/ArgumentInfoCollection.java
@@ -98,6 +98,7 @@
     return getArgumentInfo(argumentIndex).isRemovedArgumentInfo();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isEmpty() {
     return this == EMPTY;
   }
@@ -175,6 +176,7 @@
     return argumentInfosSize;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ArgumentInfoCollection rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
     if (isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
index 8d560c5..18bbc7f 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
@@ -85,6 +85,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public RemovedArgumentInfo rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
     SingleValue rewrittenSingleValue =
@@ -97,6 +98,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (obj == null || getClass() != obj.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
index 9bcda3a..b6d2d93 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
@@ -23,6 +23,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public RemovedReceiverInfo rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
     SingleValue rewrittenSingleValue =
@@ -35,6 +36,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (obj == null || getClass() != obj.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
index e149d62..e7cff1a 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
@@ -198,6 +198,7 @@
     return dexItemFactory.createProto(newReturnType, newParameters);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexType[] rewriteParameters(ProgramMethod method, DexItemFactory dexItemFactory) {
     DexType[] params = method.getParameters().values;
     if (isEmpty()) {
@@ -226,6 +227,7 @@
     return newParams;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public RewrittenPrototypeDescription rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
     ArgumentInfoCollection newArgumentInfoCollection =
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
index d3388bc..6f06fab 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
@@ -82,6 +82,7 @@
     return combine(info.asRewrittenTypeInfo());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public RewrittenTypeInfo combine(RewrittenTypeInfo other) {
     assert !getNewType().isVoidType();
     assert getNewType() == other.getOldType();
@@ -90,6 +91,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public RewrittenTypeInfo rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
     DexType rewrittenCastType = castType != null ? graphLens.lookupType(castType, codeLens) : null;
@@ -107,6 +109,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (obj == null || getClass() != obj.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index f43d5ec..fb0b12f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -229,6 +229,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean needsRelaxedType(
         DexEncodedField targetField, Iterable<DexEncodedField> sourceFields) {
       return Iterables.any(
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index c19eb5e..ac9ec55 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -156,6 +156,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void mergeDirectMethods(DexProgramClass toMerge) {
     toMerge.forEachProgramDirectMethod(
         method -> {
@@ -270,6 +271,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void fixNestMemberAttributes() {
     if (group.getTarget().isInANest() && !group.getTarget().hasNestMemberAttributes()) {
       for (DexProgramClass clazz : group.getSources()) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMethodsBuilder.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMethodsBuilder.java
index b87c6ad..bbd8646 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMethodsBuilder.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMethodsBuilder.java
@@ -33,6 +33,7 @@
     return !reservedMethods.contains(method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void setClassMethods(DexProgramClass clazz) {
     assert virtualMethods.stream().allMatch(method -> method.getHolderType() == clazz.type);
     assert virtualMethods.stream().allMatch(DexEncodedMethod::belongsToVirtualPool);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
index 59efae5..5a97ab6 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -409,6 +409,7 @@
    * Fix all references to merged classes using the {@link TreeFixer}. Construct a graph lens
    * containing all changes performed by horizontal class merging.
    */
+  @SuppressWarnings("ReferenceEquality")
   private HorizontalClassMergerGraphLens createLens(
       HorizontallyMergedClasses mergedClasses,
       HorizontalClassMergerGraphLens.Builder lensBuilder,
@@ -425,6 +426,7 @@
         .fixupTypeReferences();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean verifyNoCyclesInInterfaceHierarchies(
       AppView<?> appView, Collection<MergeGroup> groups) {
     for (MergeGroup group : groups) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
index b8f049d..394d483 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
@@ -87,6 +87,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
     FieldLookupResult lookup = super.internalDescribeLookupField(previous);
     if (lookup.getReference() == previous.getReference()) {
@@ -155,6 +156,7 @@
       newFieldSignatures.put(oldFieldSignature, newFieldSignature);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void recordNewFieldSignature(
         Iterable<DexField> oldFieldSignatures,
         DexField newFieldSignature,
@@ -194,6 +196,7 @@
       moveMethods(methods, to, null);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void moveMethods(Iterable<ProgramMethod> methods, DexMethod to, ProgramMethod representative) {
       for (ProgramMethod from : methods) {
         boolean isRepresentative = representative != null && from == representative;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
index 9117bcc..583d6be 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
@@ -63,6 +63,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static InstanceInitializerDescription analyze(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       IRCodeProvider codeProvider,
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
index 52a00c1..407cbce 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
@@ -92,6 +92,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (obj == null || getClass() != obj.getClass()) {
       return false;
@@ -138,6 +139,7 @@
       this(dexItemFactory, method.getReference());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void addInstancePut(DexField field, InstanceFieldInitializationInfo value) {
       if (parentConstructor == null) {
         instanceFieldAssignmentsPre.put(field, value);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
index 62def22..91bfef0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
@@ -297,6 +297,7 @@
   }
 
   /** Synthesize a new method which selects the constructor based on a parameter type. */
+  @SuppressWarnings("ReferenceEquality")
   void merge(
       ProfileCollectionAdditions profileCollectionAdditions,
       ClassMethodsBuilder classMethodsBuilder,
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index ee56cc7..8cca85f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -161,6 +161,7 @@
         fixupPermittedSubclassAttribute(clazz.getPermittedSubclassAttributes()));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void fixupProgramClassSuperTypes(DexProgramClass clazz) {
     DexType rewrittenSuperType = fixupType(clazz.getSuperType());
     if (rewrittenSuperType != clazz.getSuperType()) {
@@ -200,6 +201,7 @@
     return remappedClassVirtualMethods;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod fixupVirtualInterfaceMethod(DexEncodedMethod method) {
     DexMethod originalMethodReference = method.getReference();
 
@@ -255,6 +257,7 @@
     lensBuilder.commitPendingUpdates();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexTypeList fixupInterfaces(DexProgramClass clazz, DexTypeList interfaceTypes) {
     Set<DexType> seen = Sets.newIdentityHashSet();
     return interfaceTypes.map(
@@ -265,6 +268,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod fixupProgramMethod(
       DexMethod newMethodReference, DexEncodedMethod method) {
     DexMethod originalMethodReference = method.getReference();
@@ -434,6 +438,7 @@
     return fixupProgramMethod(newMethodReference, method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedField[] fixupFields(
       DexEncodedField[] fields, Set<DexField> newFieldReferences) {
     if (fields == null || ArrayUtils.isEmpty(fields)) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
index d937a8e..eca0a6f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
@@ -200,6 +200,7 @@
    * If there is only a single method that does not override anything then it is safe to just move
    * it to the target type if it is not already in it.
    */
+  @SuppressWarnings("ReferenceEquality")
   private void mergeTrivial(
       ClassMethodsBuilder classMethodsBuilder, HorizontalClassMergerGraphLens.Builder lensBuilder) {
     DexMethod newMethodReference = getNewMethodReference();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
index 6e94908..6d83173 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
@@ -125,6 +125,7 @@
         method.getName());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexType rewriteType(DexType type, Map<DexType, MergeGroup> groups) {
     if (type.isArrayType()) {
       DexType baseType = type.toBaseType(dexItemFactory);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
index 294d87d..3b37e83 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
@@ -121,6 +121,7 @@
     return newDefaultMethodsAddedToClassByMerge;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSafeToAddDefaultMethodsToClass(
       DexProgramClass clazz,
       Set<DexMethod> newDefaultMethodsAddedToClassByMerge,
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
index 043bd34..e466650 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
@@ -60,6 +60,7 @@
     return removeTrivialGroups(Lists.newLinkedList(newGroups.keySet()));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void addClassToGroup(
       DexProgramClass clazz,
       Map<MergeGroup, DexMethodSignatureMap<DexType>> newGroups,
@@ -94,6 +95,7 @@
     newGroups.put(new MergeGroup(clazz), classSignatures);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void addDefaultMethods(DexMethodSignatureMap<DexType> signatures, DexProgramClass iface) {
     // When the same signature is added from several interfaces just move to the "multiple" state
     // and do not keep track of the actual interfaces.
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
index 342a3fb..d50f0b3 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
@@ -42,6 +42,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isEnumSubtype(DexClass clazz) {
     if (cache.containsKey(clazz)) {
       return cache.getBoolean(clazz);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
index 0c19d53..361fdeb 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
@@ -26,6 +26,7 @@
     this.appView = appView;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean disallowInlining(ProgramMethod method) {
     Code code = method.getDefinition().getCode();
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
index 4c07501..bf5d475 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
@@ -280,6 +280,7 @@
     return getRelaxedSignature(instanceInitializer.getReference());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getRelaxedSignature(DexMethod instanceInitializerReference) {
     DexType objectType = appView.dexItemFactory().objectType;
     DexTypeList parameters = instanceInitializerReference.getParameters();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
index 60f57e4..60a279f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
@@ -74,6 +74,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == null) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
index 8e57e87..9c5d8b2 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
@@ -82,6 +82,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == null || getClass() != obj.getClass()) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/deadlock/SingleCallerInformation.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/deadlock/SingleCallerInformation.java
index bbf486f..deda00e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/deadlock/SingleCallerInformation.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/deadlock/SingleCallerInformation.java
@@ -100,6 +100,7 @@
         this.appView = appView;
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private void recordDispatchTarget(ProgramMethod target) {
         callers.compute(
             target,
@@ -142,6 +143,7 @@
         }
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private void triggerClassInitializer(DexProgramClass clazz) {
         Optional<ProgramMethod> callers = clinitCallers.get(clazz);
         if (callers != null) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
index 9a7ddd8..05e6f82 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
@@ -487,6 +487,7 @@
       return field != null && isTypeInitializedBy(instruction, type, field, appView, mode);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private static boolean isTypeInitializedBy(
         Instruction instruction,
         DexType typeToBeInitialized,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
index c791889..d6439aa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
@@ -73,6 +73,7 @@
       knownToBeInitialized.forEach(this::markInitializedOnNormalExit);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void markInitializedOnNormalExit(DexType knownToBeInitialized) {
       if (knownToBeInitialized == context.getHolderType()) {
         // Do not record that the given method causes its own holder to be initialized, since this
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
index 6af4d2e..9d7a65b 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
@@ -251,6 +251,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean addInvokeVirtualValueToValueGraph(
       Value value,
       Node node,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/VerifyTypesHelper.java b/src/main/java/com/android/tools/r8/ir/analysis/VerifyTypesHelper.java
index d8c1bb1..5643834 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/VerifyTypesHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/VerifyTypesHelper.java
@@ -19,6 +19,7 @@
     return new VerifyTypesHelper(appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isAssignable(TypeElement one, TypeElement other) {
     if (one.isPrimitiveType() != other.isPrimitiveType()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java b/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
index 187ac76..76c3362 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/equivalence/BasicBlockBehavioralSubsumption.java
@@ -252,6 +252,7 @@
     return instructionsDefineIdenticalValues(value.definition, other.definition);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean instructionsDefineIdenticalValues(Instruction instruction, Instruction other) {
     assert instruction.hasOutValue();
     assert other.hasOutValue();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysis.java
index b1821c3..a8e98f0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/escape/EscapeAnalysis.java
@@ -174,6 +174,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isDirectlyEscaping(
       Instruction instr, ProgramMethod context, List<Value> arguments) {
     // As return value.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
index 8d90411..49ecbf0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
@@ -145,6 +145,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void acceptClassInitializerDefaultsResult(
       ClassInitializerDefaultsResult classInitializerDefaultsResult) {
     classInitializerDefaultsResult.forEachOptimizedField(
@@ -323,6 +324,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void recordAllFieldPutsProcessed(
       ProgramField field, OptimizationFeedbackDelayed feedback) {
     FieldState fieldState = fieldStates.getOrDefault(field.getDefinition(), FieldState.bottom());
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
index a1e3eb5..bd2c545 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
@@ -62,6 +62,7 @@
     return bitsRead;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isOnlyUsedToUpdateFieldValue(Instruction user, DexEncodedField encodedField) {
     if (user.isLogicalBinop()) {
       LogicalBinop binop = user.asLogicalBinop();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index a938964..5f8e465 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -199,6 +199,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static FieldClassification classifyField(
       DexEncodedField field, AppView<AppInfoWithLiveness> appView) {
     FieldAccessInfo fieldAccessInfo =
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
index 8b00bfb..a2ef2fa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
@@ -120,6 +120,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   boolean isSubjectToOptimization(DexClassAndField field) {
     return !field.getAccessFlags().isStatic() && field.getHolderType() == context.getHolderType();
   }
@@ -136,6 +137,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void analyzeForwardingConstructorCall(InvokeDirect invoke, Value thisValue) {
     if (invoke.getReceiver() != thisValue
         || invoke.getInvokedMethod().getHolderType() != context.getHolderType()) {
@@ -166,6 +168,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void analyzeParentConstructorCall() {
     if (parentConstructor.getHolderType() == context.getHolderType()) {
       // Forwarding constructor calls are handled similar to instance-put instructions.
@@ -229,6 +232,7 @@
         field, getInstanceFieldInitializationInfo(field, value));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean fieldNeverWrittenBetweenInstancePutAndMethodExit(
       DexClassAndField field, InstancePut instancePut) {
     if (field.getAccessFlags().isFinal()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
index f03ac07..e8c03c3 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
@@ -119,6 +119,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   boolean isSubjectToOptimization(DexClassAndField field) {
     return field.getAccessFlags().isStatic()
         && field.getHolderType() == context.getHolderType()
@@ -126,6 +127,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   boolean isSubjectToOptimizationIgnoringPinning(DexClassAndField field) {
     return field.getAccessFlags().isStatic()
         && field.getHolderType() == context.getHolderType()
@@ -166,6 +168,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void updateFieldOptimizationInfoWith2Values(
       DexClassAndField field, Value valuePut, DexValue valueBeforePut) {
     // We are interested in the AbstractValue only if it's null or a value, so we can use the value
@@ -246,6 +249,7 @@
     return singleFieldValue;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private SingleFieldValue internalComputeSingleEnumFieldValueForValuesArray(Value value) {
     NewArrayEmpty newArrayEmpty = value.definition.asNewArrayEmpty();
     NewArrayFilled newArrayFilled = value.definition.asNewArrayFilled();
@@ -389,6 +393,7 @@
     return intValue == ordinal;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private SingleFieldValue computeSingleEnumFieldValueForInstance(Value value) {
     assert value.isDefinedByInstructionSatisfying(Instruction::isNewInstance);
 
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java b/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
index 95d68a4..ecaa39d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/modeling/LibraryMethodReadSetModeling.java
@@ -14,6 +14,7 @@
 /** Models if a given library method may cause a program field to be read. */
 public class LibraryMethodReadSetModeling {
 
+  @SuppressWarnings("ReferenceEquality")
   public static AbstractFieldSet getModeledReadSetOrUnknown(
       AppView<?> appView, InvokeMethod invoke) {
     DexMethod invokedMethod = invoke.getInvokedMethod();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
index 48c8084..96f7ef9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
@@ -116,6 +116,7 @@
    *
    * <p>We bail out if other virtual methods than the two expected ones are found and return null.
    */
+  @SuppressWarnings("ReferenceEquality")
   private DexProgramClass computeCorrespondingEnumLite(DexProgramClass enumLiteMap) {
     if (enumLiteMap.getMethodCollection().numberOfVirtualMethods() != 2) {
       return null;
@@ -145,6 +146,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean matchesFindValueByNumberMethod(DexMethod method) {
     return method.name == references.findValueByNumberName
         && method.getArity() == 1
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index 5fbfb59..d89ae34 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -253,6 +253,7 @@
     return field != null && isDeadProtoExtensionField(field, fieldAccessInfoCollection, keepInfo);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isDeadProtoExtensionField(
       ProgramField field,
       FieldAccessInfoCollection<?> fieldAccessInfoCollection,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
index 322907a..d5aa0af 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
@@ -132,6 +132,7 @@
     Set<DexProgramClass> seen = Sets.newIdentityHashSet();
     return new EnqueuerAnalysis() {
       @Override
+      @SuppressWarnings("ReferenceEquality")
       public void notifyFixpoint(Enqueuer enqueuer, EnqueuerWorklist worklist, Timing timing) {
         builders.forEach(
             (builder, dynamicMethod) -> {
@@ -184,6 +185,7 @@
   }
 
   /** Returns true if an action was deferred. */
+  @SuppressWarnings("ReferenceEquality")
   public boolean deferDeadProtoBuilders(
       DexProgramClass clazz, ProgramMethod method, BooleanSupplier register) {
     if (!enableAggressiveBuilderOptimization) {
@@ -229,6 +231,7 @@
     timing.end(); // Remove dead builder references
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewriteDeadBuilderReferencesFromDynamicMethod(
       AppView<AppInfoWithLiveness> appView,
       DexProgramClass builder,
@@ -395,6 +398,7 @@
    * <p>This is assuming that calling dynamicMethod() on a proto message with
    * MethodToInvoke.NEW_MUTABLE_INSTANCE will create an instance of the enclosing class.
    */
+  @SuppressWarnings("ReferenceEquality")
   private void strengthenCheckCastInstructions(IRCode code) {
     AffectedValues affectedValues = new AffectedValues();
     InstructionListIterator instructionIterator = code.instructionListIterator();
@@ -484,6 +488,7 @@
                   .isStrictSubtypeOf(type, references.generatedMessageLiteBuilderType));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void bypassClinitforInliningNewBuilderMethods(SubtypingInfo subtypingInfo) {
       for (DexType type : subtypingInfo.subtypes(references.generatedMessageLiteType)) {
         DexProgramClass clazz = appView.definitionFor(type).asProgramClass();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index bd541f8..75ca687 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -216,6 +216,7 @@
     assert code.isConsistentSSA(appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexType getNewMutableInstanceType(
       AppView<AppInfoWithLiveness> appView, Instruction instruction) {
     if (!instruction.isInvokeMethodWithReceiver()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
index 13495c35..ebfc1f4 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
@@ -75,6 +75,7 @@
    * traced manually by {@link ProtoEnqueuerExtension#tracePendingInstructionsInDynamicMethods}.
    */
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void registerStaticFieldRead(DexField field) {
     if (references.isDynamicMethod(getContextMethod())
         && field.getHolderType() != getContextHolder().getType()
@@ -85,6 +86,7 @@
     super.registerStaticFieldRead(field);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isStaticFieldReadForProtoSchemaDefinition(DexField field) {
     if (field == references.getDefaultInstanceField(getContextHolder())) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
index 5cbf665..2a3f855 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
@@ -44,6 +44,7 @@
     staticFieldValuesMapDelayed.clear();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isProtoEnum(DexProgramClass clazz) {
     assert clazz.isEnum();
     if (clazz.type == references.methodToInvokeType) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
index 337b88b..95ed51a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
@@ -53,6 +53,7 @@
         : parent.computeInliningReason(invoke, target, context, oracle, methodProcessor);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Reason computeInliningReasonForDynamicMethod(
       InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
     // Do not allow inlining of dynamicMethod() into a proto library class. This should only happen
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
index 0b15b9a..932e81d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
@@ -163,11 +163,13 @@
     return dexItemFactory.createField(holder.type, enumVerifierType, instanceFieldName);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isAbstractGeneratedMessageLiteBuilder(DexProgramClass clazz) {
     return clazz.type == generatedMessageLiteBuilderType
         || clazz.type == generatedMessageLiteExtendableBuilderType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isDynamicMethod(DexMethod method) {
     return method.name == dynamicMethodName && method.proto == dynamicMethodProto;
   }
@@ -180,6 +182,7 @@
     return isDynamicMethod(method.getReference());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isDynamicMethodBridge(DexMethod method) {
     return method == generatedMessageLiteMethods.dynamicMethodBridgeMethod
         || method == generatedMessageLiteMethods.dynamicMethodBridgeMethodWithObject;
@@ -193,6 +196,7 @@
     return isDynamicMethodBridge(method.getReference());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isFindLiteExtensionByNumberMethod(DexMethod method) {
     return method.proto == findLiteExtensionByNumberProto
         && method.name.startsWith(findLiteExtensionByNumberName)
@@ -203,12 +207,14 @@
     return isFindLiteExtensionByNumberMethod(method.getReference());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isGeneratedMessageLiteBuilder(DexProgramClass clazz) {
     return (clazz.superType == generatedMessageLiteBuilderType
             || clazz.superType == generatedMessageLiteExtendableBuilderType)
         && !isAbstractGeneratedMessageLiteBuilder(clazz);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isMessageInfoConstruction(InvokeMethod invoke) {
     if (invoke.getInvokedMethod().match(newMessageInfoMethod)) {
       return true;
@@ -261,6 +267,7 @@
       consumer.accept(constructorWithClass);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isConstructor(DexMethod method) {
       return method == constructor || method == constructorWithClass;
     }
@@ -405,6 +412,7 @@
       // Intentionally empty.
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isNewMutableInstanceEnum(DexField field) {
       return field == newMutableInstanceField;
     }
@@ -416,6 +424,7 @@
           && isNewMutableInstanceEnum(root.definition.asStaticGet().getField());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isMethodToInvokeWithSimpleBody(DexField field) {
       return field == getDefaultInstanceField
           || field == getMemoizedIsInitializedField
@@ -424,6 +433,7 @@
           || field == setMemoizedIsInitializedField;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isMethodToInvokeWithNonSimpleBody(DexField field) {
       return field == buildMessageInfoField || field == getParserField;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoUtils.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoUtils.java
index b6c1f4d..ac5c7aa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoUtils.java
@@ -14,6 +14,7 @@
 
   public static final int IS_PROTO_2_MASK = 0x1;
 
+  @SuppressWarnings("ReferenceEquality")
   public static Value getInfoValueFromMessageInfoConstructionInvoke(
       InvokeMethod invoke, ProtoReferences references) {
     assert references.isMessageInfoConstruction(invoke);
@@ -41,6 +42,7 @@
     throw new Unreachable();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static Value getObjectsValueFromMessageInfoConstructionInvoke(
       InvokeMethod invoke, ProtoReferences references) {
     assert references.isMessageInfoConstruction(invoke);
@@ -62,6 +64,7 @@
     throw new Unreachable();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static void setObjectsValueForMessageInfoConstructionInvoke(
       InvokeMethod invoke, Value newObjectsValue, ProtoReferences references) {
     assert references.isMessageInfoConstruction(invoke);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
index 8e43229..c81b099 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
@@ -110,6 +110,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void markGeneratedMessageLiteSubtypeAsInstantiated(
       DexProgramClass clazz, EnqueuerWorklist worklist) {
     if (clazz.isAbstract()) {
@@ -314,6 +315,7 @@
    *
    * <p>See also {@link #populateExtensionGraph}.
    */
+  @SuppressWarnings("ReferenceEquality")
   private void populateExtensionGraphWithExtensionFieldDefinition(StaticPut staticPut) {
     Value value = staticPut.value().getAliasedValue();
     if (value.isPhi()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
index 032e1798..d32a8b9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
@@ -38,6 +38,7 @@
    * A class initializer cannot be postponed if it writes a static field of another class, or if any
    * non-static-put instructions may have side effects.
    */
+  @SuppressWarnings("ReferenceEquality")
   public static ClassInitializerSideEffect classInitializerCanBePostponed(
       AppView<AppInfoWithLiveness> appView, IRCode code) {
     ProgramMethod context = code.context();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
index a2acb83..8a3686a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
@@ -131,6 +131,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public ArrayTypeElement fixupClassTypeReferences(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       Function<DexType, DexType> mapping,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
index 26993a6..ca9ebfd 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
@@ -154,6 +154,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DexType toDexType(DexItemFactory dexItemFactory) {
     if (type == dexItemFactory.objectType) {
       DexType singleKnownInterface = getInterfaces().getSingleKnownInterface();
@@ -193,6 +194,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public TypeElement fixupClassTypeReferences(
       AppView<? extends AppInfoWithClassHierarchy> ignore,
       Function<DexType, DexType> mapping,
@@ -301,6 +303,7 @@
     return joinWithClassHierarchy(lubType, other.getInterfaces(), other.nullability());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ClassTypeElement joinWithClassHierarchy(
       DexType lubType, InterfaceCollection otherInterfaces, Nullability nullability) {
     assert appView != null;
@@ -327,6 +330,7 @@
         : create(lubType, lubNullability, appView, lubInterfaces);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   ClassTypeElement joinWithoutClassHierarchy(
       DexType other, Nullability nullability, AppView<?> appView) {
     assert !appView.enableWholeProgramOptimizations();
@@ -401,6 +405,7 @@
       return left.isTrue() && right.isTrue();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     boolean merge(InterfaceMarker marker) {
       assert marker.isMarked();
       assert !marker.isMarkedOnBothSides();
@@ -428,6 +433,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static DexType computeLeastUpperBoundOfClasses(
       AppInfoWithClassHierarchy appInfo, DexType type1, DexType type2) {
     // Compiling R8 with R8, this hits more than 1/3 of cases.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index 617e995..dad9f87 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -76,6 +76,7 @@
     affectedValues.narrowingWithAssumeRemoval(appView, code);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyAllPhiOperandsAreBottom(Set<Phi> affectedPhis) {
     for (Phi phi : affectedPhis) {
       for (Value operand : phi.getOperands()) {
@@ -94,6 +95,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyAllChangedPhisAreScheduled(IRCode code, Set<Phi> affectedPhis) {
     ListIterator<BasicBlock> blocks = code.listIterator();
     while (blocks.hasNext()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/InterfaceCollection.java b/src/main/java/com/android/tools/r8/ir/analysis/type/InterfaceCollection.java
index 7f4e28a..62462bd 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/InterfaceCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/InterfaceCollection.java
@@ -21,6 +21,7 @@
 
 public class InterfaceCollection {
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isKnownToImplement(
       DexType iface, DexType implementor, InternalOptions options) {
     if (options.canHaveZipFileWithMissingCloseableBug()
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java
index 1e5260b..c6110d4 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java
@@ -131,6 +131,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   TypeElement join(PrimitiveTypeElement other) {
     if (this == other) {
       return this;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
index 9752734..a470a92 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
@@ -229,6 +229,7 @@
         invoke.getReceiver().getDynamicType(appView), invoke.getInvokedMethod(), appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static DexType toRefinedReceiverType(
       DynamicType dynamicReceiverType,
       DexMethod method,
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
index 6800d1c..a353a7e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
@@ -104,10 +104,12 @@
         appView, type -> graphLens.lookupType(type, codeLens), prunedTypes);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isNullable() {
     return nullability().isNullable();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public abstract Nullability nullability();
 
   /**
@@ -117,6 +119,7 @@
    * @param appView {@link DexDefinitionSupplier}.
    * @return {@link TypeElement}, a least upper bound of {@param this} and {@param other}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public TypeElement join(TypeElement other, AppView<?> appView) {
     if (this == other || other.isBottom()) {
       return this;
@@ -183,6 +186,7 @@
    * @param other to check for equality with this
    * @return {@code true} if {@param this} is equal up to nullability with {@param other}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public boolean lessThanOrEqualUpToNullability(TypeElement other, AppView<?> appView) {
     if (this == other) {
       return true;
@@ -217,6 +221,7 @@
    * @param other to check for equality with this
    * @return {@code true} if {@param this} is equal up to nullability with {@param other}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public boolean equalUpToNullability(TypeElement other) {
     if (this == other) {
       return true;
@@ -287,6 +292,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final boolean isClassType(DexType type) {
     assert type.isClassType();
     return isClassType() && asClassType().getClassType() == type;
@@ -391,6 +397,7 @@
     return nullability().isDefinitelyNotNull();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public int requiredRegisters() {
     assert !isBottom() && !isTop();
     return 1;
@@ -424,6 +431,7 @@
     return fromDexType(type, nullability, appView, false);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static TypeElement fromDexType(
       DexType type, Nullability nullability, AppView<?> appView, boolean asArrayElementType) {
     if (type == DexItemFactory.nullValueType) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeUtils.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeUtils.java
index 6ded2e5..aa30ed7 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeUtils.java
@@ -186,6 +186,7 @@
     return staticPut.getField().getType().toTypeElement(appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isNullPointerException(TypeElement type, AppView<?> appView) {
     return type.isClassType()
         && type.asClassType().getClassType() == appView.dexItemFactory().npeType;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index fc86d70..d5047ac 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -126,6 +126,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public SingleValue rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
     assert lens.lookupType(type, codeLens) == type;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
index ef1de40..da830b6 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
@@ -55,6 +55,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (o == null || getClass() != o.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index b78f18b..52f0af1 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -142,6 +142,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public SingleValue rewrittenWithLens(
       AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
     AbstractValueFactory factory = appView.abstractValueFactory();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatefulFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatefulFieldValue.java
index acc4577..3030116 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatefulFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatefulFieldValue.java
@@ -45,6 +45,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (o == null || getClass() != o.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatelessFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatelessFieldValue.java
index 8a58dfe..d64c67e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatelessFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStatelessFieldValue.java
@@ -30,6 +30,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (o == null || getClass() != o.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
index 1daf879..433e5f4 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/EnumValuesObjectState.java
@@ -133,6 +133,7 @@
           : new VariableObjectClassForOrdinal(valuesClass);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     static boolean sameType(DexType[] valuesClass) {
       DexType defaultType = valuesClass[0];
       for (DexType type : valuesClass) {
@@ -184,6 +185,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (!(obj instanceof UniformObjectClassForOrdinal)) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index ccce70a..1f6ea43 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -71,6 +71,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
     int array = builder.allocatedRegister(array(), getNumber());
@@ -156,11 +157,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasInvariantOutType() {
     return false;
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DexType computeVerificationType(AppView<?> appView, TypeVerificationHelper helper) {
     // This method is not called for ArrayGet on primitive array.
     assert this.outValue.getType().isReferenceType();
@@ -252,6 +255,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean outTypeKnownToBeBoolean(Set<Phi> seen) {
     return array().getType().isArrayType()
         && array().getType().asArrayType().getMemberType() == TypeElement.getBoolean();
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index 4beb3e7..9419bef 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -84,6 +84,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void buildDex(DexBuilder builder) {
     int value = builder.allocatedRegister(value(), getNumber());
     int array = builder.allocatedRegister(array(), getNumber());
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index f1db962..0dbf1fd 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -1105,6 +1105,7 @@
    *
    * @return true if any guards were renamed.
    */
+  @SuppressWarnings("ReferenceEquality")
   public boolean renameGuardsInCatchHandlers(NonIdentityGraphLens graphLens, GraphLens codeLens) {
     assert hasCatchHandlers();
     boolean anyGuardsRenamed = false;
@@ -2040,6 +2041,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void deduplicatePhis() {
     PhiEquivalence equivalence = new PhiEquivalence();
     HashMap<Wrapper<Phi>, Phi> wrapper2phi = new HashMap<>();
diff --git a/src/main/java/com/android/tools/r8/ir/code/CanonicalPositions.java b/src/main/java/com/android/tools/r8/ir/code/CanonicalPositions.java
index bde37fd..1a07f41 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CanonicalPositions.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CanonicalPositions.java
@@ -90,6 +90,7 @@
             : caller.builderWithCopy().setCallerPosition(callerOfCaller).build());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // If we need to emit a synthetic position for exceptional monitor exits, we try to cook up a
   // position that is not actually a valid program position, so as not to incorrectly position the
   // user on an exit that is not the actual exit being taken. Our heuristic for this is that if the
diff --git a/src/main/java/com/android/tools/r8/ir/code/CatchHandlers.java b/src/main/java/com/android/tools/r8/ir/code/CatchHandlers.java
index 6d8a713..1717cb3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CatchHandlers.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CatchHandlers.java
@@ -83,6 +83,7 @@
     return uniqueTargets;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasCatchAll(DexItemFactory factory) {
     return getGuards().size() > 0
         && getGuards().get(getGuards().size() - 1) == factory.throwableType;
@@ -95,6 +96,7 @@
     return new CatchHandlers<>(newGuards, newTargets);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public CatchHandlers<T> removeGuard(DexType guardToBeRemoved) {
     List<DexType> newGuards = new ArrayList<>();
     List<T> newTargets = new ArrayList<>();
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index 6de88b7..9845028 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -54,6 +54,7 @@
     return new Builder();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isRefiningStaticType(InternalOptions options) {
     TypeElement inType = object().getType();
     if (inType.isNullType()) {
@@ -126,6 +127,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isCheckCast() && other.asCheckCast().type == type;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index a1de12c..30b3b54 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -118,6 +118,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionInstanceCanThrow(
       AppView<?> appView,
       ProgramMethod context,
@@ -160,6 +161,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstClass() && other.asConstClass().clazz == clazz;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
index 58928b0..4336587 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
@@ -78,6 +78,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstMethodHandle() && other.asConstMethodHandle().methodHandle == methodHandle;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
index 87031d2..cbb68a6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -76,6 +76,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstMethodType() && other.asConstMethodType().methodType == methodType;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index c16a3de..ed93213 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -78,6 +78,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isConstString() && other.asConstString().value == value;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
index 089ee34..5852d5e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
@@ -105,6 +105,7 @@
     return inliningConstraints.forDebugLocalsChange();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean apply(Int2ReferenceMap<DebugLocalInfo> locals) {
     boolean changed = false;
     for (Entry<DebugLocalInfo> end : getEnding().int2ReferenceEntrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
index af0a214..bbd5430 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -94,6 +94,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isDexItemBasedConstString()
         && other.asDexItemBasedConstString().item == item
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index a4db6a0..5055a37 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -197,6 +197,7 @@
   /**
    * Compute the set of live values at the entry to each block using a backwards data-flow analysis.
    */
+  @SuppressWarnings("ReferenceEquality")
   public Map<BasicBlock, LiveAtEntrySets> computeLiveAtEntrySets() {
     Map<BasicBlock, LiveAtEntrySets> liveAtEntrySets = new IdentityHashMap<>();
     Queue<BasicBlock> worklist = new ArrayDeque<>();
@@ -709,6 +710,7 @@
         : "Multiple value definitions with number " + number + ": " + value + " and " + old;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean consistentDefUseChains() {
     Int2ReferenceMap<Value> values = new Int2ReferenceOpenHashMap<>();
     for (BasicBlock block : blocks) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
index dc3527c..bb3e50d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -99,11 +99,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInitClass() && clazz == other.asInitClass().clazz;
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionInstanceCanThrow(
       AppView<?> appView,
       ProgramMethod context,
@@ -129,6 +131,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) {
     if (appView.enableWholeProgramOptimizations()) {
       // In R8, check if the class initialization of `clazz` or any of its ancestor types may have
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
index d95a472..1719b30 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -150,6 +150,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isInstanceGet()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
index 9834a17..19b2929 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -75,6 +75,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInstanceOf() && other.asInstanceOf().type == type;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 0a0c10a..d54a445 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -188,6 +188,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isInstancePut()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index c46e899..a778b37 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -265,6 +265,7 @@
     oldValue.removeUser(this);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void replaceDebugValue(Value oldValue, Value newValue) {
     assert oldValue.hasLocalInfo();
     assert newValue.hasLocalInfo();
@@ -304,6 +305,7 @@
     assert false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public Value removeDebugValue(DebugLocalInfo localInfo) {
     if (debugValues != null) {
       Iterator<Value> it = debugValues.iterator();
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index 416ac24..4cd8e15 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -74,6 +74,7 @@
     return !arguments().isEmpty();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasReturnTypeVoid(DexItemFactory factory) {
     return getReturnType() == factory.voidType;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index 4539f17..ae2c6f0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -49,6 +49,7 @@
     return visitor.visit(this);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean verifyLambdaInterfaces(
       TypeElement returnType, InterfaceCollection lambdaInterfaceSet, DexType objectType) {
     InterfaceCollection primaryInterfaces = returnType.asClassType().getInterfaces();
@@ -67,6 +68,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public TypeElement evaluate(AppView<?> appView) {
     TypeElement returnType = super.evaluate(appView);
     if (!appView.appInfo().hasLiveness()) {
@@ -163,6 +165,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInvokeCustom() && callSite == other.asInvokeCustom().callSite;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index 73b0491..fa5469f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -93,6 +93,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInvokeMethod() && method == other.asInvokeMethod().getInvokedMethod();
   }
@@ -253,6 +254,7 @@
     return UnknownValue.getInstance();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   boolean verifyD8LookupResult(
       DexEncodedMethod hierarchyResult, DexEncodedMethod lookupDirectTargetOnItself) {
     if (lookupDirectTargetOnItself == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
index 5069737..27e709e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
@@ -94,6 +94,7 @@
    * <p>For desugaring we use invoke-direct instead. We need to do this as the Android Runtime will
    * not allow invoke-virtual of a private method.
    */
+  @SuppressWarnings("ReferenceEquality")
   protected boolean isPrivateMethodInvokedOnSelf(DexBuilder builder) {
     DexMethod method = getInvokedMethod();
     if (method.getHolderType()
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
index a7bd599..9b5eb96 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -74,6 +74,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isInvokeMultiNewArray() && type == other.asInvokeMultiNewArray().type;
   }
@@ -121,6 +122,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionInstanceCanThrow(
       AppView<?> appView,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeType.java b/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
index bed9095..de333be 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeType.java
@@ -54,6 +54,7 @@
     return fromCfOpcode(opcode, invokedMethod, context, appView, appView.codeLens());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static InvokeType fromCfOpcode(
       int opcode,
       DexMethod invokedMethod,
@@ -77,6 +78,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static InvokeType fromInvokeSpecial(
       DexMethod invokedMethod, DexClassAndMethod context, AppView<?> appView, GraphLens codeLens) {
     if (invokedMethod.isInstanceInitializer(appView.dexItemFactory())) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
index 73836d1..15082ac 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -62,6 +62,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isMoveException()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
index 2dd948d..af8c834 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -120,6 +120,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isNewArrayEmpty() && other.asNewArrayEmpty().type == type;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilled.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilled.java
index a7c393e..11dce59 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilled.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilled.java
@@ -98,6 +98,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isNewArrayFilled() && type == other.asNewArrayFilled().type;
   }
@@ -159,6 +160,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionInstanceCanThrow(
       AppView<?> appView,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index f86e17c..f946940 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -81,6 +81,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isNewInstance() && other.asNewInstance().clazz == clazz;
   }
@@ -155,6 +156,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionMayHaveSideEffects(
       AppView<?> appView,
       ProgramMethod context,
@@ -212,11 +214,13 @@
     allowSpilling = false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSpillingAllowed() {
     return allowSpilling;
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) {
     if (appView.enableWholeProgramOptimizations()) {
       // In R8, check if the class initialization of the holder or any of its ancestor types may
@@ -230,6 +234,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyTypes(
       AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
     TypeElement type = getOutType();
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
index d42756d..cafceff 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
@@ -84,6 +84,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     return other.isNewUnboxedEnumInstance() && other.asNewUnboxedEnumInstance().clazz == clazz;
   }
@@ -155,6 +156,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyTypes(
       AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
     TypeElement type = getOutType();
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index f332682..a20b6ec 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -258,6 +258,7 @@
     return removeTrivialPhi(null, null);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean removeTrivialPhi(IRBuilder builder, Set<Value> affectedValues) {
     Value same = null;
     for (Value op : operands) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Position.java b/src/main/java/com/android/tools/r8/ir/code/Position.java
index c7829a5..187fe6a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Position.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Position.java
@@ -128,10 +128,12 @@
         .withBool(Position::isD8R8Synthesized);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Position syntheticNone() {
     return SyntheticPosition.NO_POSITION_SYNTHETIC;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Position getPositionForInlining(
       AppView<?> appView, InvokeMethod invoke, ProgramMethod context) {
     Position position = invoke.getPosition();
@@ -157,6 +159,7 @@
     return line == -1;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSyntheticNone() {
     return this == syntheticNone();
   }
@@ -206,6 +209,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean hasMethodInChain(DexMethod method) {
     return hasPositionMatching(position -> position.getMethod() == method);
   }
@@ -219,6 +223,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public Position replacePosition(Position originalPosition, Position newPosition) {
     if (this == originalPosition) {
       return newPosition;
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
index ebf27a2..46b9cc2 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -168,6 +168,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isStaticGet()) {
       return false;
@@ -244,11 +245,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean outTypeKnownToBeBoolean(Set<Phi> seen) {
     return getField().type.isBooleanType();
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) {
     DexType holder = getField().holder;
     if (appView.enableWholeProgramOptimizations()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index 3fcbe63..b201864 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -184,6 +184,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean identicalNonValueNonPositionParts(Instruction other) {
     if (!other.isStaticPut()) {
       return false;
@@ -244,6 +245,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean definitelyTriggersClassInitialization(
       DexType clazz,
       ProgramMethod context,
@@ -255,6 +257,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) {
     DexType holder = getField().holder;
     if (appView.enableWholeProgramOptimizations()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Throw.java b/src/main/java/com/android/tools/r8/ir/code/Throw.java
index 86b9f0e..e873dd8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Throw.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Throw.java
@@ -84,6 +84,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void buildCf(CfBuilder builder) {
     builder.add(new CfThrow(), this);
   }
@@ -94,6 +95,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean throwsNpeIfValueIsNull(Value value, AppView<?> appView, ProgramMethod context) {
     if (exception() == value) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index c40197a..c0253ac 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -54,6 +54,7 @@
 
 public class Value implements Comparable<Value> {
 
+  @SuppressWarnings("ReferenceEquality")
   public void constrainType(
       ValueTypeConstraint constraint, DexMethod method, Origin origin, Reporter reporter) {
     TypeElement constrainedType = constrainedType(constraint);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index b5b9532..9f48b43 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -288,6 +288,7 @@
     assert !(isInstanceInitializer && thisInitializers == null);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<InvokeDirect> computeInitializers(Value value) {
     List<InvokeDirect> initializers = new ArrayList<>();
     for (Instruction user : value.uniqueUsers()) {
@@ -444,6 +445,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewriteIincPatterns() {
     for (BasicBlock block : code.blocks) {
       InstructionListIterator it = block.listIterator(code);
@@ -554,6 +556,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void updatePositionAndLocals(Instruction instruction) {
     Position position = instruction.getPosition();
     boolean didLocalsChange = localsChanged();
@@ -579,6 +582,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void updateLocals(CfLabel label) {
     Int2ReferenceSortedMap<DebugLocalInfo> ending =
         DebugLocalInfo.endingLocals(emittedLocals, pendingLocals);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index 4e95364..f4f6a36 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -92,6 +92,7 @@
       return guards.isEmpty();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     static TryHandlerList computeTryHandlers(
         int instructionOffset,
         List<CfTryCatch> tryCatchRanges,
@@ -447,6 +448,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void buildBlockTransfer(
       IRBuilder builder, int predecessorOffset, int successorOffset, boolean isExceptional) {
     if (predecessorOffset == IRBuilder.INITIAL_BLOCK_OFFSET
@@ -490,6 +492,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void buildInstruction(
       IRBuilder builder, int instructionIndex, boolean firstBlockInstruction) {
     if (isExceptionalExitForMethodSynchronization(instructionIndex)) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 89ab593..300998f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -436,6 +436,7 @@
     return current.exit().asGoto().getTarget() != nextBlock;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Eliminates unneeded debug positions.
   //
   // After this pass all remaining debug positions mark places where we must ensure a materializing
@@ -1002,6 +1003,7 @@
     return tries;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private TryHandler[] getDexTryHandlers(Map<Integer, CatchHandlers<BasicBlock>> catchHandlers) {
     TryHandler[] handlers = new TryHandler[catchHandlers.size()];
     for (int j = 0; j < catchHandlers.size(); j++) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 229fcfc..2edb76d 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -217,6 +217,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void updateCurrentCatchHandlers(int instructionIndex, DexItemFactory factory) {
     Try tryRange = getTryForOffset(instructionOffset(instructionIndex));
     if (tryRange == currentTryRange) {
@@ -423,6 +424,7 @@
     return new CatchHandlers<>(handlerGuards, handlerOffsets);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void forEachTryRange(
       Try tryRange, DexItemFactory factory, BiConsumer<DexType, Integer> fn) {
     TryHandler handler = code.handlers[tryRange.handlerIndex];
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ExtraConstantIntParameter.java b/src/main/java/com/android/tools/r8/ir/conversion/ExtraConstantIntParameter.java
index ec2df95..7803f4e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ExtraConstantIntParameter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ExtraConstantIntParameter.java
@@ -24,6 +24,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public TypeElement getTypeElement(AppView<?> appView, DexType argType) {
     assert argType == appView.dexItemFactory().intType;
     return TypeElement.getInt();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 0221302..d1d7ab6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -536,6 +536,7 @@
     currentBlock = block;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void buildArgumentsWithRewrittenPrototypeChanges(
       int register, DexEncodedMethod method, BiConsumer<Integer, DexType> writeCallback) {
     ArgumentInfoCollection argumentsInfo = prototypeChanges.getArgumentInfoCollection();
@@ -983,6 +984,7 @@
     addInstruction(ir);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void addThisArgument(int register) {
     boolean receiverCouldBeNull = context != null && context != method;
     Nullability nullability = receiverCouldBeNull ? maybeNull() : definitelyNotNull();
@@ -1031,12 +1033,14 @@
     argumentValues.add(argument.outValue());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isValidFor(Value value, DebugLocalInfo local) {
     // Invalid debug-info may cause attempt to read a local that is not actually alive.
     // See b/37722432 and regression test {@code jasmin.InvalidDebugInfoTests::testInvalidInfoThrow}
     return !value.isUninitializedLocal() && value.getLocalInfo() == local;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void addDebugLocalStart(int register, DebugLocalInfo local) {
     assert local != null;
     if (!isDebugMode()) {
@@ -1307,6 +1311,7 @@
     addMove(ValueTypeConstraint.fromValueType(valueType), dest, src);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void addMove(ValueTypeConstraint constraint, int dest, int src) {
     Value in = readRegister(src, constraint);
     if (isDebugMode()) {
@@ -1510,6 +1515,7 @@
     add(new RecordFieldValues(fields, out, arguments));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyRepresentablePolymorphicInvoke(InvokeType type, DexItem item) {
     if (type != InvokeType.POLYMORPHIC) {
       return true;
@@ -2113,6 +2119,7 @@
 
   // Value abstraction methods.
 
+  @SuppressWarnings("ReferenceEquality")
   public Value readRegister(int register, ValueTypeConstraint constraint) {
     DebugLocalInfo local = getIncomingLocal(register);
     Value value =
@@ -2254,6 +2261,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Value getUninitializedDebugLocalValue(int register, ValueTypeConstraint typeConstraint) {
     if (appView.options().invalidDebugInfoStrict) {
       throw new InvalidDebugInfoException(
@@ -2330,6 +2338,7 @@
     return value;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public Value writeRegister(int register, TypeElement typeLattice, ThrowingInfo throwing) {
     DebugLocalInfo incomingLocal = getIncomingLocal(register);
     DebugLocalInfo outgoingLocal = getOutgoingLocal(register);
@@ -2415,6 +2424,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void attachLocalValues(Instruction ir) {
     if (!isDebugMode()) {
       assert previousLocalValue == null;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 3e89f7e..cd1dbbf 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -250,6 +250,7 @@
         unusedArguments);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewritePartialDefault(
       IRCode code,
       ProgramMethod method,
@@ -1275,6 +1276,7 @@
     return TypeElement.getNull();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // If the given invoke is on the form "invoke-direct A.<init>, v0, ..." and the definition of
   // value v0 is "new-instance v0, B", where B is a subtype of A (see the Art800 and B116282409
   // tests), then fail with a compilation error if A has previously been merged into B.
@@ -1368,6 +1370,7 @@
       this.affectedPhis = affectedPhis;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     Instruction replaceInstructionIfTypeChanged(
         DexType type,
         BiFunction<DexType, Value, Instruction> constructor,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
index b82af15..013bfde 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriterUtils.java
@@ -77,6 +77,7 @@
         callSite, ignored -> rewriteCallSiteInternal(callSite, context));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexCallSite rewriteCallSiteInternal(DexCallSite callSite, ProgramMethod context) {
     DexItemFactory dexItemFactory = definitions.dexItemFactory();
     DexProto newMethodProto = rewriteProto(callSite.methodProto);
@@ -117,6 +118,7 @@
         .getName();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexMethodHandle rewriteDexMethodHandle(
       DexMethodHandle methodHandle, MethodHandleUse use, ProgramMethod context) {
     if (methodHandle.isMethodHandle()) {
@@ -181,6 +183,7 @@
     return methodHandle;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public List<DexValue> rewriteBootstrapArguments(
       List<DexValue> bootstrapArgs, MethodHandleUse use, ProgramMethod context) {
     List<DexValue> newBootstrapArgs = null;
@@ -201,12 +204,14 @@
     return changed ? newBootstrapArgs : bootstrapArgs;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValueMethodType rewriteDexMethodType(DexValueMethodType type) {
     DexProto oldProto = type.value;
     DexProto newProto = rewriteProto(oldProto);
     return newProto != oldProto ? new DexValueMethodType(newProto) : type;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValue rewriteBootstrapArgument(
       DexValue value, MethodHandleUse use, ProgramMethod context) {
     switch (value.getValueKind()) {
@@ -230,6 +235,7 @@
             proto, type -> graphLens.lookupType(type, codeLens), protoFixupCache);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValueMethodHandle rewriteDexValueMethodHandle(
       DexValueMethodHandle methodHandle, MethodHandleUse use, ProgramMethod context) {
     DexMethodHandle oldHandle = methodHandle.value;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LibraryDesugaredChecker.java b/src/main/java/com/android/tools/r8/ir/conversion/LibraryDesugaredChecker.java
index fff6884..d1528b8 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LibraryDesugaredChecker.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LibraryDesugaredChecker.java
@@ -97,6 +97,7 @@
       registerField(field.getReference());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerMethod(ProgramMethod method) {
       registerMethod(method.getReference());
       for (DexAnnotation annotation : method.getDefinition().annotations().annotations) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index 5496a1b..bc66527 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -318,6 +318,7 @@
     appView.setGraphLens(rewrittenMemberRebindingLens);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void finalizeLirMethodToOutputFormat(
       ProgramMethod method,
       DeadCodeRemover deadCodeRemover,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchConverter.java
index 489f0a6..5d7faef 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchConverter.java
@@ -187,6 +187,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isDefinedByStringHashCode(Value value, DexItemFactory dexItemFactory) {
     Value root = value.getAliasedValue();
     if (root.isPhi()) {
@@ -408,6 +409,7 @@
         return toBeExtended;
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private StringToIdMapping extendWithPredecessor(
           StringToIdMapping toBeExtended, BasicBlock block) {
         boolean mayExtendWithPredecessor = true;
@@ -528,6 +530,7 @@
         return addMappingsForStringsWithHash(block, hash, extension, Sets.newIdentityHashSet());
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private boolean addMappingsForStringsWithHash(
           BasicBlock block,
           int hash,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
index 8dfef13..925f84c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
@@ -239,6 +239,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Link two values as having the same type.
   private void link(Value canonical1, Value canonical2) {
     if (canonical1 == canonical2) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/CallSiteInformation.java b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/CallSiteInformation.java
index e412ed7..ca4492f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/CallSiteInformation.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/CallSiteInformation.java
@@ -134,6 +134,7 @@
      * library method this always returns false.
      */
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean hasSingleCallSite(ProgramMethod method, ProgramMethod context) {
       return singleCallerMethods.get(method.getReference()) == context.getReference();
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
index 38bc387..21e446b 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/InvokeExtractor.java
@@ -92,6 +92,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   protected void processSingleTarget(ProgramMethod singleTarget, ProgramMethod context) {
     assert !context.getDefinition().isBridge()
         || singleTarget.getDefinition() != context.getDefinition();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
index bc4ea2d..985a626 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ArrayConstructionSimplifier.java
@@ -200,6 +200,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private FilledArrayConversionInfo computeConversionInfo(
       IRCode code, FilledArrayCandidate candidate, LinearFlowInstructionListIterator it) {
     NewArrayEmpty newArrayEmpty = candidate.newArrayEmpty;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java
index 024fc1c..306cdeb 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java
@@ -427,6 +427,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ConstNumber getConstNumber(Value val) {
     ConstNumber constNumber = getConstNumberIfConstant(val);
     if (constNumber != null) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java
index c5a5743..c6b6a35 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java
@@ -284,6 +284,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean simplifyNonIfZeroTest(IRCode code, BasicBlock block, If theIf) {
     Value lhs = theIf.lhs();
     Value lhsRoot = lhs.getAliasedValue();
@@ -532,6 +533,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isBlockSupportedBySimplifyKnownBooleanCondition(BasicBlock b) {
     if (b.isTrivialGoto()) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
index 4297b03..7da91d4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
@@ -113,6 +113,7 @@
     return CodeRewriterResult.HAS_CHANGED;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean canUseNewArrayFilled(NewArrayFilled newArrayFilled) {
     if (!options.isGeneratingDex()) {
       return false;
@@ -167,6 +168,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean canStoreElementInNewArrayFilled(TypeElement valueType, DexType elementType) {
     if (elementType == dexItemFactory.objectType) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java
index 566996d..a1722af 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java
@@ -145,6 +145,7 @@
     return newTargets;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isNumberAgainstConstNumberIf(If theIf) {
     if (!(theIf.lhs().getType().isInt() || theIf.lhs().getType().isFloat())) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
index aa44257..23ec985 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
@@ -65,6 +65,7 @@
     return CodeRewriterResult.hasChanged(hasChanged);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Rewrite 'throw new NullPointerException()' to 'throw null'.
   private boolean rewriteThrowNullPointerException(IRCode code) {
     boolean hasChanged = false;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialPhiSimplifier.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialPhiSimplifier.java
index 7fa9b79..27a3cba 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialPhiSimplifier.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialPhiSimplifier.java
@@ -30,6 +30,7 @@
     assert !unusedArgument.outValue().hasPhiUsers();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static void ensureDirectStringNewToInit(AppView<?> appView, IRCode code) {
     boolean changed = false;
     DexItemFactory dexItemFactory = appView.dexItemFactory();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
index 3f80a47..b2d4efa 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
@@ -61,6 +61,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod matchingBufferCovariantMethod(DexMethod invokedMethod) {
     if (invokedMethod.getArity() > 1
         || (invokedMethod.getArity() == 1 && !invokedMethod.getParameter(0).isIntType())
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
index 3afabd5..76a4b02 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -227,6 +227,7 @@
     return covariantReturnTypes;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void getCovariantReturnTypesFromAnnotation(
       DexClass clazz,
       DexEncodedMethod method,
@@ -290,6 +291,7 @@
     return isCovariantReturnTypeAnnotation(annotation.type, factory);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isCovariantReturnTypeAnnotation(DexType type, DexItemFactory factory) {
     return type == factory.annotationCovariantReturnType
         || type == factory.annotationCovariantReturnTypes;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
index ddc3f35..79041fe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
@@ -52,6 +52,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod privateMethodInvokedOnSelf(CfInvoke invoke, ProgramMethod context) {
     DexMethod method = invoke.getMethod();
     if (method.getHolderType() != context.getHolderType()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 8a9aa86..dc59f92 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -133,6 +133,7 @@
     return type;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void setClass(DexProgramClass clazz) {
     assert this.clazz == null;
     assert clazz != null;
@@ -367,6 +368,7 @@
         && !desugaring.isDirectTargetedLambdaImplementationMethod(descriptor.implHandle);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Target createLambdaImplMethodTarget(ProgramMethod accessedFrom) {
     DexMethodHandle implHandle = descriptor.implHandle;
     assert implHandle != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
index 7ccba56..d5673fd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
@@ -21,6 +21,7 @@
 
 final class LambdaConstructorSourceCode {
 
+  @SuppressWarnings("ReferenceEquality")
   public static CfCode build(LambdaClass lambda) {
     int maxStack = 1;
     ImmutableList<CfTryCatch> tryCatchRanges = ImmutableList.of();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
index bbd4fe0..9f4c5d0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
@@ -179,6 +179,7 @@
     return encodedMethod.isPublicized() && isInstanceMethod(encodedMethod);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final boolean verifyTargetFoundInClass(DexType type) {
     return targetHolder == type;
   }
@@ -299,6 +300,7 @@
    * Matches call site for lambda metafactory invocation pattern and returns extracted match
    * information, or MATCH_FAILED if match failed.
    */
+  @SuppressWarnings("ReferenceEquality")
   static LambdaDescriptor infer(
       DexCallSite callSite,
       AppView<?> appView,
@@ -460,11 +462,11 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Checks if the types are the same OR both types are reference types and
   // `subType` is derived from `b`. Note that in the latter case we only check if
   // both types are class types, for the reasons mentioned in isSameOrAdaptableTo(...).
-  static boolean isSameOrDerived(
-      DexItemFactory factory, DexType subType, DexType superType) {
+  static boolean isSameOrDerived(DexItemFactory factory, DexType subType, DexType superType) {
     if (subType == superType || (subType.isClassType() && superType.isClassType())) {
       return true;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
index 9be92a4..e581cf6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
@@ -87,6 +87,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Checks if the types are the same OR type `a` is adaptable to type `b`.
   private static boolean isSameOrAdaptableTo(DexType a, DexType b, DexItemFactory factory) {
     if (a == b) {
@@ -170,6 +171,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static CfCode build(
       LambdaClass lambda, DexMethod mainMethod, DesugarInvoke desugarInvoke) {
     DexItemFactory factory = lambda.appView.dexItemFactory();
@@ -363,6 +365,7 @@
     return adjustType(enforcedType, expectedType, false, instructions, factory);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void enforceParameterType(
       DexType paramType,
       DexType enforcedType,
@@ -377,6 +380,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static int adjustType(
       DexType fromType,
       DexType toType,
@@ -398,6 +402,7 @@
             ValueType.fromDexType(toType).requiredRegisters()));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void internalAdjustType(
       DexType fromType,
       DexType toType,
@@ -475,6 +480,7 @@
         + fromType.toSourceString() + " to " + toType);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void addPrimitiveWideningConversion(
       DexType fromType, DexType toType, Builder<CfInstruction> instructions) {
     assert fromType.isPrimitiveType() && toType.isPrimitiveType();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java
index a529491..d075274 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java
@@ -79,6 +79,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void rewriteType(DexType type, DexType rewrittenType) {
       rewriteType.compute(
           type,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
index 63a6e08..7a72b2d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
@@ -88,6 +88,7 @@
   // Considered final but is set after due to circularity in allocation.
   private DexProgramClass clazz = null;
 
+  @SuppressWarnings("ReferenceEquality")
   public ConstantDynamicClass(
       SyntheticProgramClassBuilder builder,
       AppView<?> appView,
@@ -404,6 +405,7 @@
     assert finalMethod.getDefinition().isPublicMethod();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexType mapLookupTypeToObject(DexType type) {
     return type == appView.dexItemFactory().lookupType ? appView.dexItemFactory().objectType : type;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 0ee4ce0..5021e7b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -49,6 +49,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (!instruction.isConstDynamic()) {
       return DesugarDescription.nothing();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
index b14bc1d..25c157a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
@@ -149,6 +149,7 @@
     return overridesNonFinalLibraryMethod(method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean overridesNonFinalLibraryMethod(ProgramMethod method) {
     // We look up everywhere to see if there is a supertype/interface implementing the method...
     DexProgramClass holder = method.getHolder();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
index 5460d4f..b1a71cf 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
@@ -383,6 +383,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private CfCode computeParameterConversionCfCode(
       DexType holder, DexMethod invokedMethod, DexMethod[] parameterConversions) {
     ArrayList<CfInstruction> cfInstructions = new ArrayList<>();
@@ -581,6 +582,7 @@
         method.getHolderType());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod convertedMethod(
       DexMethod method,
       boolean parameterDestIsVivified,
@@ -619,6 +621,7 @@
     return convertedAPI;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexType invalidType(
       DexMethod invokedMethod,
       DexMethod returnConversion,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index 77f5885..b19056a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -168,6 +168,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod ensureApiGenericConversion(
       DexMethod conversion, DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
     if (appView.appInfoForDesugaring().resolveMethod(conversion, false).isSingleResolution()) {
@@ -192,6 +193,7 @@
     return conversion;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexMethod ensureConversionMethod(
       DexType type,
       boolean destIsVivified,
@@ -228,6 +230,7 @@
     return conversion;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod ensureArrayConversionMethod(
       DexType type,
       DexType srcType,
@@ -247,6 +250,7 @@
         srcType, destType, eventConsumer, context, contextSupplier, conversion);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod ensureArrayConversionMethodFromExistingBaseConversion(
       DexType type,
       DexType srcType,
@@ -297,6 +301,7 @@
     return arrayConversion.getReference();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexMethod getExistingProgramConversionMethod(
       DexType type,
       boolean destIsVivified,
@@ -331,6 +336,7 @@
     return conversion;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getCustomConversion(DexType type, DexType srcType, DexType destType) {
     // ConversionType holds the methods "rewrittenType convert(type)" and the other way around.
     // But everything is going to be rewritten, so we need to use vivifiedType and type".
@@ -587,6 +593,7 @@
                         wrapperField, reverseWrapperField, context, subwrapperConvertList)));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getConversion(DexProgramClass subwrapperWrapper) {
     Iterator<DexEncodedMethod> iterator = subwrapperWrapper.directMethods().iterator();
     DexEncodedMethod method;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
index cf713d7..a602e52 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
@@ -90,6 +90,7 @@
     return rewrittenField != null ? fieldInstruction.createWithField(rewrittenField) : null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private CfInstruction rewriteTypeInstruction(CfTypeInstruction typeInstruction) {
     DexType rewrittenType = helper.rewriteType(typeInstruction.getType());
     return rewrittenType != typeInstruction.getType()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarerHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarerHelper.java
index f4526ae..2bf5df0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarerHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarerHelper.java
@@ -36,6 +36,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   DexMethod rewriteMethod(DexMethod method, boolean isInterface, ProgramMethod context) {
     DexType newHolder = rewriteType(method.getHolderType());
     DexMethod rewrittenMethod = methodWithVivifiedTypeInSignature(method, newHolder, appView);
@@ -48,6 +49,7 @@
     return rewrittenMethod;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   DexField rewriteField(DexField field, ProgramDefinition context) {
     if (isRewrittenType(field.getHolderType())) {
       // This case never happens within the supported set of classes. We can support it if required.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
index ad9735c..269be28 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/MultiAPILevelHumanDesugaredLibrarySpecificationFlagDeduplicator.java
@@ -33,6 +33,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void deduplicateFlags(
       MultiAPILevelHumanDesugaredLibrarySpecification specification,
       Reporter reporter,
@@ -148,6 +149,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void deduplicateAmendLibraryMemberFlags(
       HumanRewritingFlags flags,
       HumanRewritingFlags otherFlags,
@@ -211,6 +213,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static <T extends DexItem> void deduplicateFlags(
       Map<T, DexType> flags,
       Map<T, DexType> otherFlags,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClasses.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClasses.java
index ea96ecc..12970fc 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClasses.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClasses.java
@@ -146,11 +146,13 @@
         }
       }
 
+      @SuppressWarnings("ReferenceEquality")
       void addSupportedMethod(DexEncodedMethod method) {
         assert method.getHolderType() == clazz.type;
         supportedMethods.put(method.getReference(), method);
       }
 
+      @SuppressWarnings("ReferenceEquality")
       void addSupportedField(DexEncodedField field) {
         assert field.getHolderType() == clazz.type;
         supportedFields.put(field.getReference(), field);
@@ -162,6 +164,7 @@
         classAnnotation = annotation;
       }
 
+      @SuppressWarnings("ReferenceEquality")
       void annotateMethod(DexMethod method, MethodAnnotation annotation) {
         assert method.getHolderType() == clazz.type;
         MethodAnnotation prev =
@@ -169,6 +172,7 @@
         methodAnnotations.put(method, annotation.combine(prev));
       }
 
+      @SuppressWarnings("ReferenceEquality")
       void annotateField(DexField field, FieldAnnotation annotation) {
         assert field.getHolderType() == clazz.type;
         FieldAnnotation prev = fieldAnnotations.getOrDefault(field, FieldAnnotation.getDefault());
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index 90203a2..f79e61a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -111,8 +111,8 @@
   }
 
   private <EM extends DexEncodedMember<EM, M>, M extends DexMember<EM, M>>
-      boolean analyzeMissingMembers(
-          Iterable<EM> maxClassMembers, Collection<EM> referenceMembers, List<M> missingMembers) {
+      @SuppressWarnings("ReferenceEquality") boolean analyzeMissingMembers(
+      Iterable<EM> maxClassMembers, Collection<EM> referenceMembers, List<M> missingMembers) {
     boolean fullySupported = true;
     for (EM member : maxClassMembers) {
       if (!(member.getAccessFlags().isPublic() || member.getAccessFlags().isProtected())) {
@@ -413,6 +413,7 @@
     return dexEncodedMethod;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void addBackports(DexProgramClass clazz, List<DexMethod> backports) {
     for (DexMethod backport : backports) {
       if (clazz.type == backport.getHolderType()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java
index 6579f8f..9e424b8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java
@@ -11,6 +11,7 @@
   private final DexMethod to;
   private final DexMethod from;
 
+  @SuppressWarnings("ReferenceEquality")
   public CustomConversionDescriptor(DexMethod to, DexMethod from) {
     this.to = to;
     this.from = from;
@@ -33,6 +34,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/DerivedMethod.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/DerivedMethod.java
index 714cef4..747cd8f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/DerivedMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/DerivedMethod.java
@@ -68,6 +68,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
index fee2962..80ca5b3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
@@ -41,6 +41,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index a30322f..d27ba9b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -177,6 +177,7 @@
     return dontRetarget;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isCustomConversionRewrittenType(DexType type) {
     return Iterables.any(
         customConversions.values(),
@@ -209,6 +210,7 @@
         || !staticFieldRetarget.isEmpty();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isEmulatedInterfaceRewrittenType(DexType type) {
     return Iterables.any(
         emulatedInterfaces.values(), descriptor -> descriptor.getRewrittenType() == type);
@@ -279,6 +281,7 @@
     return builder.build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private EmulatedInterfaceDescriptor descriptorWithPostPrefix(
       EmulatedInterfaceDescriptor descriptor,
       DexItemFactory factory,
@@ -372,6 +375,7 @@
     private final ImmutableMap.Builder<DexField, FieldAccessFlags> amendLibraryField =
         ImmutableMap.builder();
 
+    @SuppressWarnings("ReferenceEquality")
     public void rewriteType(DexType src, DexType target) {
       assert src != null;
       assert target != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
index be8dd14..5e3b847 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
@@ -52,6 +52,7 @@
     ensureInterfacesAndForwardingMethodsSynthesized(programClasses, eventConsumer);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void ensureInterfacesAndForwardingMethodsSynthesized(
       Collection<DexProgramClass> programClasses,
       DesugaredLibraryRetargeterPostProcessingEventConsumer eventConsumer) {
@@ -83,6 +84,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean inherit(
       DexLibraryClass clazz,
       DexType typeToInherit,
@@ -142,6 +144,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod createForwardingMethod(
       DexMethod target, EmulatedDispatchMethodDescriptor descriptor, DexClass clazz) {
     // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
index 52fa933..99b56db 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -61,6 +61,7 @@
     return method.getReference();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexMethod ensureRetargetMethod(
       DexMethod retarget, DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
     DexClass holderClass = appView.definitionFor(retarget.getHolderType());
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
index 15c644b..6cb30a4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
@@ -130,6 +130,7 @@
     return extraDispatchCases;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean implementsInterface(DexClass clazz, DexType interfaceType) {
     WorkList<DexType> workList =
         WorkList.newIdentityWorkList(Arrays.asList(clazz.interfaces.values));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
index e8c8073..feaccc2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
@@ -176,7 +176,7 @@
   }
 
   // TODO(b/270398965): Replace LinkedList.
-  @SuppressWarnings("JdkObsolete")
+  @SuppressWarnings({"JdkObsolete", "ReferenceEquality"})
   private void fillDescriptors(
       DexClass wrapperClass,
       Set<DexMethod> excludedMethods,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
index 277285e..32994c4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
@@ -279,6 +279,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<DexClassAndMethod> findMethodsWithName(
       DexString methodName,
       DexClass clazz,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
index 9a8ba77..c946b68 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
@@ -31,6 +31,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (!instruction.isInvokeSpecial()) {
       return DesugarDescription.nothing();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index f69890a..2a423c2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -229,6 +229,7 @@
       return this == EMPTY;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     boolean isTargetedByForwards(DexClassAndMethod method) {
       return IterableUtils.any(
               forwardedMethodTargets,
@@ -534,6 +535,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Computes the set of method signatures that may need forwarding methods on derived classes.
   private SignaturesInfo computeInterfaceInfo(DexClass iface, SignaturesInfo interfaceInfo) {
     assert iface.isInterface();
@@ -550,6 +552,7 @@
     return interfaceInfo;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private SignaturesInfo computeEmulatedInterfaceInfo(
       DexClass iface, SignaturesInfo interfaceInfo) {
     assert iface.isInterface();
@@ -617,6 +620,7 @@
         superInfo, additionalForwards.build(), signatureInfo.emulatedInterfaceInfo);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // All classes implementing an emulated interface and overriding a default method should now
   // implement the interface and the emulated one for correct emulated dispatch.
   // The class signature won't include the correct type parameters for the duplicated interfaces,
@@ -1027,6 +1031,7 @@
         desugaringForwardingMethod.asProgramMethod(clazz.asProgramClass()), target);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Topological order traversal and its helpers.
   private DexClass definitionOrNull(DexType type, ReportingContext context) {
     // No forwards at the top of the class hierarchy (assuming java.lang.Object is never amended).
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/DefaultMethodsHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/DefaultMethodsHelper.java
index 717f235..20f3ab8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/DefaultMethodsHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/DefaultMethodsHelper.java
@@ -39,6 +39,7 @@
       this.hidden = hidden;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // If there is just one live method having specified
     // signature return it, otherwise return null.
     DexMethod getSingleCandidate(DexMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
index d33fcec..8de8311 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
@@ -52,6 +52,7 @@
     builder.replaceProgramClasses(newProgramClasses);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // The method transforms emulated interface such as they now have the rewritten type and
   // implement the rewritten version of each emulated interface they implement.
   private DexProgramClass rewriteEmulatedInterface(DexProgramClass emulatedInterface) {
@@ -94,6 +95,7 @@
     return newEmulatedInterface;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<GenericSignature.ClassTypeSignature> getRewrittenInterfacesOfEmulatedInterface(
       DexProgramClass emulatedInterface) {
     List<GenericSignature.ClassTypeSignature> newInterfaces = new ArrayList<>();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 15e9f06..4912fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -541,6 +541,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DesugarDescription computeInvokeDirect(
       DexClass clazz, CfInvoke invoke, ProgramMethod context) {
     DexMethod invokedMethod = invoke.getMethod();
@@ -692,6 +693,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DesugarDescription rewriteInvokeSuper(CfInvoke invoke, ProgramMethod context) {
     DexMethod invokedMethod = invoke.getMethod();
     DexClass clazz = appView.definitionFor(invokedMethod.holder, context);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriterFixup.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriterFixup.java
index 1e4b4dc..e6f5b0b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriterFixup.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriterFixup.java
@@ -36,6 +36,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private EnclosingMethodAttribute fixupEnclosingMethodAttribute(
       EnclosingMethodAttribute enclosingMethodAttribute) {
     DexMethod enclosingMethod = enclosingMethodAttribute.getEnclosingMethod();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/AccessBridgeFactory.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/AccessBridgeFactory.java
index b81ea84..0b7fc43 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/AccessBridgeFactory.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/AccessBridgeFactory.java
@@ -15,6 +15,7 @@
 
 public class AccessBridgeFactory {
 
+  @SuppressWarnings("ReferenceEquality")
   static ProgramMethod createFieldAccessorBridge(
       DexMethod bridgeMethodReference, ProgramField field, boolean isGet) {
     assert bridgeMethodReference.getHolderType() == field.getHolderType();
@@ -42,6 +43,7 @@
             .build());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static ProgramMethod createInitializerAccessorBridge(
       DexMethod bridgeMethodReference, ProgramMethod method, DexItemFactory dexItemFactory) {
     assert bridgeMethodReference.getHolderType() == method.getHolderType();
@@ -64,6 +66,7 @@
             .build());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static ProgramMethod createMethodAccessorBridge(
       DexMethod bridgeMethodReference, ProgramMethod method, DexItemFactory dexItemFactory) {
     assert bridgeMethodReference.getHolderType() == method.getHolderType();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 03304e5..54f5677 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -115,6 +115,7 @@
     private final DexMethod bridge;
     private final T target;
 
+    @SuppressWarnings("ReferenceEquality")
     public BridgeAndTarget(DexMethod bridge, T target) {
       this.bridge = bridge;
       this.target = target;
@@ -304,6 +305,7 @@
     return member != null && needsDesugaring(member, context);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean needsDesugaring(DexClassAndMember<?, ?> member, DexClassAndMethod context) {
     return member.getAccessFlags().isPrivate()
         && member.getHolderType() != context.getHolderType()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index c8a0668..9bc7654 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -108,6 +108,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void prepareInvokeDynamicOnRecord(
       CfInvokeDynamic invokeDynamic,
       ProgramAdditions programAdditions,
@@ -170,6 +171,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (instruction.isInvokeDynamic()) {
       if (needsDesugaring(instruction.asInvokeDynamic(), context)) {
@@ -226,6 +228,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private List<CfInstruction> desugarInvokeDynamicOnRecord(
       CfInvokeDynamic invokeDynamic,
       LocalStackAllocator localStackAllocator,
@@ -525,10 +528,12 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean refersToRecord(DexType type, DexItemFactory factory) {
     return type == factory.recordType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean needsDesugaring(DexMethod method, boolean isSuper) {
     return rewriteMethod(method, isSuper) != method;
   }
@@ -537,7 +542,7 @@
     return isInvokeDynamicOnRecord(invokeDynamic, appView, context);
   }
 
-  @SuppressWarnings("ConstantConditions")
+  @SuppressWarnings({"ConstantConditions", "ReferenceEquality"})
   private DexMethod rewriteMethod(DexMethod method, boolean isSuper) {
     if (!(method == factory.recordMembers.equals
         || method == factory.recordMembers.hashCode
@@ -596,6 +601,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void postProcessingDesugaring(
       Collection<DexProgramClass> programClasses,
       CfPostProcessingDesugaringEventConsumer eventConsumer,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriterHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriterHelper.java
index 3eb87cb..50c6963 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriterHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriterHelper.java
@@ -28,6 +28,7 @@
     return isInvokeDynamicOnRecord(invokeDynamic.getCallSite(), appView, context);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isInvokeDynamicOnRecord(
       DexCallSite callSite, AppView<?> appView, ProgramMethod context) {
     DexItemFactory factory = appView.dexItemFactory();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
index ac70a25..52ac56e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
@@ -68,6 +68,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (instruction.isInvokeDynamic()) {
       // We are interested in bootstrap methods StringConcatFactory::makeConcat
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 2fbf5d3..9127af6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -161,12 +161,14 @@
         && matchesMethodOfThrowable(instruction.asInvoke().getMethod(), suppressed);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean matchesMethodOfThrowable(DexMethod invoked, DexMethod expected) {
     return invoked.name == expected.name
         && invoked.proto == expected.proto
         && isSubtypeOfThrowable(invoked.holder);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSubtypeOfThrowable(DexType type) {
     while (type != null && type != dexItemFactory.objectType) {
       if (type == dexItemFactory.throwableType) {
@@ -189,6 +191,7 @@
         && isTwrCloseResourceMethod(instruction.asInvoke().getMethod());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isTwrCloseResourceMethod(DexMethod method) {
     return method.name == dexItemFactory.twrCloseResourceMethodName
         && method.proto == dexItemFactory.twrCloseResourceMethodProto;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
index a5f2b75..bb81445 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
@@ -68,6 +68,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void scan(
       ProgramMethod programMethod, CfInstructionDesugaringEventConsumer eventConsumer) {
     if (programMethod.getHolderType() == factory.varHandleType) {
@@ -103,6 +104,7 @@
     return synthesizedClasses;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean refersToVarHandle(DexType type, DexItemFactory factory) {
     if (type == factory.desugarVarHandleType) {
       // All references to java.lang.invoke.VarHandle is rewritten during application writing.
@@ -143,6 +145,7 @@
     return refersToVarHandle(field.type, factory);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean refersToMethodHandlesLookup(DexType type, DexItemFactory factory) {
     if (type == factory.desugarMethodHandlesLookupType) {
       // All references to java.lang.invoke.MethodHandles$Lookup is rewritten during application
@@ -183,7 +186,7 @@
     return refersToMethodHandlesLookup(field.type, factory);
   }
 
-  @SuppressWarnings("InconsistentOverloads")
+  @SuppressWarnings({"InconsistentOverloads", "ReferenceEquality"})
   public static void ensureMethodHandlesLookupClass(
       AppView<?> appView,
       VarHandleDesugaringEventConsumer eventConsumer,
@@ -214,7 +217,7 @@
     ensureMethodHandlesLookupClass(appView, eventConsumer, ImmutableList.of(context));
   }
 
-  @SuppressWarnings("InconsistentOverloads")
+  @SuppressWarnings({"InconsistentOverloads", "ReferenceEquality"})
   public static void ensureVarHandleClass(
       AppView<?> appView,
       VarHandleDesugaringEventConsumer eventConsumer,
@@ -240,6 +243,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void ensureVarHandleClass(
       VarHandleDesugaringEventConsumer eventConsumer, ProgramDefinition context) {
     if (context.getContextType() != factory.varHandleType) {
@@ -248,6 +252,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (!instruction.isInvoke()) {
       return DesugarDescription.nothing();
@@ -424,6 +429,7 @@
     return isPrimitiveThatIsNotBoxed(type) || type.isVoidType() ? type : factory.objectType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Collection<CfInstruction> desugarSignaturePolymorphicMethod(
       CfInvoke invoke,
       int coordinates,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
index 1ba1bb4..d1201b5 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
@@ -42,6 +42,7 @@
     this.dexItemFactory = appView.dexItemFactory();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void rewrite(
       IRCode code,
       MethodProcessor methodProcessor,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
index e32a6f5..2db87df 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
@@ -181,6 +181,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isDescriptorForClassOrInnerClass(
       DexString classDescriptor, DexString classOrInnerClassDescriptor) {
     // Same string same class.
@@ -354,6 +355,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean runInternal(DexEncodedMethod method, IRCode code) {
     ConfigurationEntryWithDexString configuration = getTransformationForMethod(method);
     if (configuration.isPassthrough()) {
@@ -504,6 +506,7 @@
     return needsDeadCodeRemoval;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewriteKotlinAssertionEnable(
       IRCode code,
       ConfigurationEntryWithDexString configuration,
@@ -546,6 +549,7 @@
         || isUsingKotlinAssertionsEnabledField(instruction);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUsingJavaAssertionsDisabledField(FieldInstruction instruction) {
     // This does not check the holder, as for inner classe the field is read from the outer class
     // and not the class itself.
@@ -553,6 +557,7 @@
         && instruction.getField().getType() == dexItemFactory.booleanType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUsingKotlinAssertionsEnabledField(FieldInstruction instruction) {
     return instruction.getField() == dexItemFactory.kotlin.assertions.enabledField;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
index 9c94862..c48cb06 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
@@ -139,6 +139,7 @@
     this.dexItemFactory = appView.dexItemFactory();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ClassInitializerDefaultsResult optimize(IRCode code, OptimizationFeedback feedback) {
     if (appView.options().debug) {
       return ClassInitializerDefaultsResult.empty();
@@ -335,6 +336,7 @@
     return getDexStringValueForInvoke(invoke.getInvokedMethod(), holder);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValue getDexStringValueForInvoke(DexMethod invokedMethod, DexType holder) {
     DexClass clazz = appView.definitionFor(holder);
     if (clazz == null) {
@@ -379,6 +381,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Map<DexEncodedField, StaticPut> findFinalFieldPutsWhileCollectingUnnecessaryStaticPuts(
       IRCode code, ProgramMethod context, Set<StaticPut> unnecessaryStaticPuts) {
     Map<DexEncodedField, StaticPut> finalFieldPuts = Maps.newIdentityHashMap();
@@ -531,6 +534,7 @@
     return finalFieldPuts;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Check if the static put is a constant derived from the class holding the method.
   // This checks for java.lang.Class.get*Name.
   private boolean isClassNameConstantOf(DexClass clazz, StaticPut put) {
@@ -544,6 +548,7 @@
     return isClassNameConstantOf(clazz, value.definition);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isClassNameConstantOf(DexClass clazz, Instruction instruction) {
     if (instruction.isInvokeVirtual()) {
       InvokeVirtual invoke = instruction.asInvokeVirtual();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index e96ef16..8e7364f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -123,6 +123,7 @@
     assert code.isConsistentSSA(appView);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static void removeOrReplaceByDebugLocalWrite(
       Instruction currentInstruction, InstructionListIterator it, Value inValue, Value outValue) {
     if (outValue.hasLocalInfo() && outValue.getLocalInfo() != inValue.getLocalInfo()) {
@@ -139,6 +140,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // TODO(mikaelpeltier) Manage that from and to instruction do not belong to the same block.
   private static boolean hasLocalOrLineChangeBetween(
       Instruction from, Instruction to, DexString localVar) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index c7ddc68..6405fb1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -532,6 +532,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isEffectivelyFinalField(StaticGet staticGet) {
     AbstractValue abstractValue = staticGet.outValue().getAbstractValue(appView, context);
     if (!abstractValue.isSingleFieldValue()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
index c728e5b..5a1d5b0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
@@ -132,6 +132,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void removeDeadInstructions(
       Queue<BasicBlock> worklist,
       IRCode code,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 79ba9d1..1c9f9fe 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -472,6 +472,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean canInlineInstanceInitializer(
       IRCode code,
       InvokeDirect invoke,
@@ -505,6 +506,7 @@
       return true;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // Only allow inlining a constructor into a non-constructor if:
     // (1) the first use of the uninitialized object is the receiver of an invoke of <init>(),
     // (2) the constructor does not initialize any final fields, as such is only allowed from within
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
index f53576a..f399865 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -55,6 +55,7 @@
     this.options = appView.options();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void devirtualizeInvokeInterface(IRCode code) {
     AffectedValues affectedValues = new AffectedValues();
     ProgramMethod context = code.context();
@@ -314,6 +315,7 @@
   }
 
   /** This rebinds invoke-super instructions to their most specific target. */
+  @SuppressWarnings("ReferenceEquality")
   private DexClass rebindSuperInvokeToMostSpecific(DexMethod target, ProgramMethod context) {
     DexClassAndMethod method = appView.appInfo().lookupSuperTarget(target, context, appView);
     if (method == null) {
@@ -357,6 +359,7 @@
    * <p>If A.foo() ends up being unused, this helps to ensure that we can get rid of A.foo()
    * entirely. Without this rewriting, we would have to keep A.foo() because the method is targeted.
    */
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod rebindVirtualInvokeToMostSpecific(
       DexMethod target, Value receiver, ProgramMethod context) {
     if (!receiver.getType().isClassType()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
index e37d406..a73733e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
@@ -86,6 +86,7 @@
     return action;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private InlineAction computeForInvoke(
       InvokeMethod invoke,
       SingleResolutionResult<?> resolutionResult,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 95f43b9..f4f0970 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -122,6 +122,7 @@
             : null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ConstraintWithTarget instructionAllowedForInlining(
       Instruction instruction, InliningConstraints inliningConstraints, ProgramMethod context) {
     ConstraintWithTarget result = instruction.inliningConstraint(inliningConstraints, context);
@@ -131,6 +132,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ConstraintWithTarget computeInliningConstraint(IRCode code) {
     if (containsPotentialCatchHandlerVerificationError(code)) {
       return ConstraintWithTarget.NEVER;
@@ -276,6 +278,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object other) {
       if (!(other instanceof ConstraintWithTarget)) {
         return false;
@@ -285,6 +288,7 @@
           && this.targetHolder == o.targetHolder;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public static ConstraintWithTarget deriveConstraint(
         ProgramMethod context, DexType targetHolder, AccessFlags<?> flags, AppView<?> appView) {
       if (flags.isPublic()) {
@@ -330,6 +334,7 @@
           : deriveConstraint(context, clazz, definition.accessFlags, appView);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public static ConstraintWithTarget meet(
         ConstraintWithTarget one, ConstraintWithTarget other, AppView<?> appView) {
       if (one.equals(other)) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 0a8b0e7..054a256 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -222,7 +222,7 @@
     return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
   }
 
-  @SuppressWarnings("ConstantConditions")
+  @SuppressWarnings({"ConstantConditions", "ReferenceEquality"})
   private DexEncodedMethod singleTargetWhileVerticalClassMerging(
       MethodResolutionResult resolutionResult,
       ProgramMethod context,
@@ -381,6 +381,7 @@
         resolutionResult.getInitialResolutionHolder(), context, resolutionResult.getSingleTarget());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ConstraintWithTarget forResolvedMember(
       DexClass initialResolutionHolder,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
index 5ee91d0..3468120 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
@@ -21,6 +21,7 @@
 
 public class NestUtils {
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean sameNest(DexType type1, DexType type2, DexDefinitionSupplier definitions) {
     if (type1 == type2) {
       return true;
@@ -41,6 +42,7 @@
     return clazz1.getNestHost() == clazz2.getNestHost();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static void rewriteNestCallsForInlining(
       IRCode code, ProgramMethod callerContext, AppView<?> appView) {
     // This method is called when inlining code into the nest member callerHolder.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
index f81a309..a7d22be 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
@@ -215,6 +215,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object other) {
       if (!(other instanceof FieldAndObject)) {
         return false;
@@ -337,6 +338,7 @@
       return appView.libraryMethodOptimizer().isFinalLibraryField(field.getDefinition());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexClassAndField resolveField(DexField field) {
       if (appView.enableWholeProgramOptimizations()) {
         SingleFieldResolutionResult resolutionResult =
@@ -614,6 +616,7 @@
       return activeState.markClassAsInitialized(type);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void markMostRecentInitClassForRemoval(DexType initializedType) {
       InitClass mostRecentInitClass = activeState.getMostRecentInitClass();
       if (mostRecentInitClass != null && mostRecentInitClass.getClassValue() == initializedType) {
@@ -1093,6 +1096,7 @@
       clearMostRecentStaticFieldWrites();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void clearMostRecentInstanceFieldWrite(DexField field) {
       if (mostRecentInstanceFieldWrites != null) {
         mostRecentInstanceFieldWrites.keySet().removeIf(key -> key.field == field);
@@ -1308,6 +1312,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void removeNonFinalInstanceFields(DexField field) {
       if (nonFinalInstanceFieldValues != null) {
         nonFinalInstanceFieldValues.keySet().removeIf(key -> key.field == field);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
index d03fccb..0aa891a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
@@ -147,6 +147,7 @@
     };
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void applyTypeForGetClassTo(
       AppView<AppInfoWithLiveness> appView,
       ProgramMethod context,
@@ -199,6 +200,7 @@
     consumer.accept(type, clazz);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void applyTypeForClassForNameTo(
       AppView<AppInfoWithLiveness> appView,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RemoveVerificationErrorForUnknownReturnedValues.java b/src/main/java/com/android/tools/r8/ir/optimize/RemoveVerificationErrorForUnknownReturnedValues.java
index 1b4ad0f..6262a76 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RemoveVerificationErrorForUnknownReturnedValues.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RemoveVerificationErrorForUnknownReturnedValues.java
@@ -99,6 +99,7 @@
     timing.end();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Set<Return> getReturnsPotentiallyNeedingCheckCast(
       AppInfoWithClassHierarchy appInfo, ProgramMethod context, IRCode code) {
     if (syntheticItems.isSyntheticOfKind(context.getHolderType(), kinds -> kinds.API_MODEL_OUTLINE)
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
index 9ae8565..f8caa1b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
@@ -36,6 +36,7 @@
 
   private static final int SELF_RECURSION_LIMIT = 4;
 
+  @SuppressWarnings("ReferenceEquality")
   // For method with many self-recursive calls, insert a try-catch to disable inlining.
   // Marshmallow dex2oat aggressively inlines and eats up all the memory on devices.
   public static void workaroundDex2OatInliningIssue(AppView<?> appView, IRCode code) {
@@ -227,6 +228,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static void workaroundForwardingInitializerBug(IRCode code, InternalOptions options) {
     if (!options.canHaveForwardingInitInliningBug()) {
       return;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index e79cac4..e39ebf6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -87,6 +87,7 @@
         || appInfo.isWhyAreYouNotInliningMethod(serviceLoaderMethods.loadWithClassLoader);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void rewrite(
       IRCode code,
       MethodProcessor methodProcessor,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
index cdb30da..5a0ec0d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
@@ -103,6 +103,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void extractSwitchMap(DexEncodedField encodedField, IRCode initializer) {
     DexField field = encodedField.getReference();
     Int2ReferenceMap<DexField> switchMap = new Int2ReferenceArrayMap<>();
@@ -164,6 +165,7 @@
     switchMaps.put(field, switchMap);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean maybeIsSwitchMap(DexEncodedField dexEncodedField) {
     // We are looking for synthetic fields of type int[].
     DexField field = dexEncodedField.getReference();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
index 647be44..3c4eac4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
@@ -262,6 +262,7 @@
     return eligible;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Class is eligible for this optimization. Eligibility implementation:
   //   - is not an abstract class or interface
   //   - does not declare finalizer
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
index 833ceaa..0e185da 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
@@ -123,6 +123,7 @@
     return value;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Value getValueDefinedInTheBlock(BasicBlock block, Instruction stopAt) {
     InstructionIterator iterator =
         stopAt == null ? block.iterator(block.getInstructions().size()) : block.iterator(stopAt);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 256d368..c332087 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -394,6 +394,7 @@
     return anyInlinedMethods;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean forceInlineDirectMethodInvocations(
       IRCode code, InliningIRProvider inliningIRProvider) throws IllegalClassInlinerStateException {
     if (directMethodCalls.isEmpty()) {
@@ -458,6 +459,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean forceInlineIndirectMethodInvocations(
       IRCode code, InliningIRProvider inliningIRProvider) throws IllegalClassInlinerStateException {
     if (indirectMethodCallsOnInstance.isEmpty()) {
@@ -585,6 +587,7 @@
     assert eligibleInstance.aliasedUsers().stream().noneMatch(Instruction::isCheckCast);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Remove miscellaneous users before handling field reads.
   private void removeMiscUsages(IRCode code, AffectedValues affectedValues) {
     boolean needToRemoveUnreachableBlocks = false;
@@ -856,6 +859,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private InliningInfo isEligibleConstructorCall(InvokeDirect invoke, ProgramMethod singleTarget) {
     assert dexItemFactory.isConstructor(invoke.getInvokedMethod());
     assert isEligibleSingleTarget(singleTarget);
@@ -1027,6 +1031,7 @@
         && !nonEmptyUsage.isParameterReturned();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isEligibleVirtualMethodCall(DexMethod callee, ProgramMethod singleTarget) {
     assert isEligibleSingleTarget(singleTarget);
 
@@ -1120,6 +1125,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isEligibleLibraryMethodCall(InvokeMethod invoke, LibraryMethod singleTarget) {
     boolean isSideEffectFree =
         appView.getLibraryMethodSideEffectModelCollection().isSideEffectFree(invoke, singleTarget);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
index f6bc6e6..6e1643e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
@@ -85,6 +85,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public TransferFunctionResult<ParameterUsages> apply(
       Instruction instruction, ParameterUsages state) {
     if (instruction.isArgument()) {
@@ -309,6 +310,7 @@
         receiverRoot, (context, usage) -> usage.addMethodCallWithParameterAsReceiver(invoke));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private ParameterUsages analyzeInvokeStatic(InvokeStatic invoke, NonEmptyParameterUsages state) {
     // We generally don't class inline instances that escape through invoke-static calls, but we
     // make an exception for calls to Objects.requireNonNull().
@@ -392,6 +394,7 @@
         : isMaybeEligibleForClassInlining(clazz.asClasspathOrLibraryClass());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isMaybeEligibleForClassInlining(DexProgramClass clazz) {
     // We can only class inline parameters that does not inherit from other classpath or library
     // classes than java.lang.Object.
@@ -408,6 +411,7 @@
     } while (true);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isMaybeEligibleForClassInlining(ClasspathOrLibraryClass clazz) {
     // We can only class inline a parameter that is either java.lang.Object or an interface type.
     return clazz.getType() == dexItemFactory.objectType || clazz.isInterface();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/controlflow/SwitchCaseAnalyzer.java b/src/main/java/com/android/tools/r8/ir/optimize/controlflow/SwitchCaseAnalyzer.java
index 538f997..068c269 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/controlflow/SwitchCaseAnalyzer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/controlflow/SwitchCaseAnalyzer.java
@@ -22,6 +22,7 @@
     return INSTANCE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean switchCaseIsAlwaysHit(Switch theSwitch, int index) {
     Value switchValue = theSwitch.value();
     if (theSwitch.isIntSwitch()) {
@@ -39,6 +40,7 @@
         && key == rootSwitchValue.definition.asConstString().getValue();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean switchCaseIsUnreachable(
       Switch theSwitch, AbstractValue switchAbstractValue, int index) {
     Value switchValue = theSwitch.value();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumDataMap.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumDataMap.java
index 06cb686..f01fd1c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumDataMap.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumDataMap.java
@@ -60,6 +60,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isAssignableTo(DexType subtype, DexType superType) {
     assert superType != null;
     assert subtype != null;
@@ -232,6 +233,7 @@
       return null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public SingleNumberValue subEnumTypeSingleValue(AbstractValueFactory factory, DexType type) {
       assert valuesTypes.values().stream().filter(t -> t == type).count() <= 1;
       for (Entry<DexType> entry : valuesTypes.int2ReferenceEntrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index f1aba56..8ec6037 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -346,6 +346,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void analyzeInvokeCustom(
       InvokeCustom invoke, Set<DexType> eligibleEnums, ProgramMethod context) {
     invoke.getCallSite().getMethodProto().forEachType(t -> markEnumEligible(t, eligibleEnums));
@@ -500,6 +501,7 @@
     eligibleEnums.add(enumType);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isLegitimateConstClassUser(
       Instruction user, ProgramMethod context, DexProgramClass enumClass) {
     if (user.isAssume()) {
@@ -576,6 +578,7 @@
         enumClass, factory.enumMembers.nameField);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUnboxableNameMethod(DexMethod method) {
     return method == factory.classMethods.getName
         || method == factory.classMethods.getCanonicalName
@@ -852,6 +855,7 @@
     return enumDataMap;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private EnumDataMap analyzeEnumInstances() {
     ImmutableMap.Builder<DexType, DexType> enumSubtypes = ImmutableMap.builder();
     ImmutableMap.Builder<DexType, EnumData> builder = ImmutableMap.builder();
@@ -1265,6 +1269,7 @@
     return Reason.INVALID_ARRAY_PUT;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Reason analyzeNewArrayFilledUser(
       NewArrayFilled newArrayFilled,
       IRCode code,
@@ -1338,6 +1343,7 @@
     return Reason.ELIGIBLE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // An If using enum as inValue is valid if it matches e == null
   // or e == X with X of same enum type as e. Ex: if (e == MyEnum.A).
   private Reason analyzeIfUser(
@@ -1359,6 +1365,7 @@
     return Reason.INVALID_IF_TYPES;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Reason analyzeInstanceGetUser(
       InstanceGet instanceGet,
       IRCode code,
@@ -1371,6 +1378,7 @@
     return Reason.ELIGIBLE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // All invokes in the library are invalid, besides a few cherry picked cases such as ordinal().
   private Reason analyzeInvokeUser(
       InvokeMethod invoke,
@@ -1507,6 +1515,7 @@
     return new UnboxedValueNonComparable(invoke.getInvokedMethod(), type1, type2);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private Reason analyzeLibraryInvoke(
       InvokeMethod invoke,
       IRCode code,
@@ -1637,6 +1646,7 @@
     return new UnsupportedLibraryInvokeReason(singleTargetReference);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Return is used for valueOf methods.
   private Reason analyzeReturnUser(
       Return theReturn,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
index 4531523..86709f7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
@@ -85,6 +85,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void analyzeEnum(GraphLens graphLensForPrimaryOptimizationPass, DexProgramClass clazz) {
     if (clazz.superType == factory.enumType) {
       if (isSuperEnumUnboxingCandidate(clazz)) {
@@ -102,6 +103,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSubEnumUnboxingCandidate(DexProgramClass clazz) {
     assert clazz.isEnum();
     boolean result = true;
@@ -130,6 +132,7 @@
     return result;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSuperEnumUnboxingCandidate(DexProgramClass clazz) {
     assert clazz.isEnum();
 
@@ -197,6 +200,7 @@
         options);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void removePinnedIfNotHolder(DexMember<?, ?> member, DexType type) {
     DexType baseType = type.toBaseType(factory);
     if (baseType != member.holder) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
index 6235749..aaa428d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateInfoCollection.java
@@ -90,6 +90,7 @@
   }
 
   /** Answers true if both enums are identical, or if one inherit from the other. */
+  @SuppressWarnings("ReferenceEquality")
   public boolean isAssignableTo(DexType subtype, DexType superType) {
     assert superType != null;
     assert subtype != null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
index dd803f9..8a5f087 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
@@ -91,6 +91,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyIsContextFreeForMethod(DexMethod method, GraphLens codeLens) {
     if (codeLens == this) {
       return true;
@@ -134,6 +135,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context, GraphLens codeLens) {
     assert context != null || verifyIsContextFreeForMethod(previous.getReference(), codeLens);
@@ -174,6 +176,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected RewrittenPrototypeDescription internalDescribePrototypeChanges(
       RewrittenPrototypeDescription prototypeChanges, DexMethod method) {
     // Rewrite the single value of the given RewrittenPrototypeDescription if it is referring to an
@@ -216,6 +219,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected InvokeType mapInvocationType(
       DexMethod newMethod, DexMethod originalMethod, InvokeType type) {
     if (typeMap.containsKey(originalMethod.getHolderType())) {
@@ -261,6 +265,7 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void move(DexField from, DexField to) {
       if (from == to) {
         return;
@@ -308,6 +313,7 @@
       return prototypeChanges;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private RewrittenPrototypeDescription computePrototypeChanges(
         DexMethod from,
         DexMethod to,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
index b30fae9..0dcc57a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
@@ -361,6 +361,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Rewrites specific enum methods, such as ordinal, into their corresponding enum unboxed
   // counterpart. The rewriting (== or match) is based on the following:
   // - name, ordinal and compareTo are final and implemented only on java.lang.Enum,
@@ -518,6 +519,7 @@
     convertedEnums.put(newArray, newArrayFilled.getArrayType());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewriteInvokeStatic(
       InvokeStatic invoke,
       IRCode code,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index bcaf48b..82f61ed 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -182,6 +182,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean shouldReserveAsIfPinned(ProgramMethod method) {
     DexProto oldProto = method.getProto();
     DexProto newProto = fixupProto(oldProto);
@@ -304,6 +305,7 @@
         executorService);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void fixupSuperEnumClassInitializer(
       IRConverter converter, DexProgramClass unboxedEnum, DexEncodedField ordinalField) {
     if (!unboxedEnum.hasClassInitializer()) {
@@ -579,6 +581,7 @@
                         }));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void processMethod(
       ProgramMethod method,
       DexMethodSignatureSet nonPrivateVirtualMethods,
@@ -640,6 +643,7 @@
     return localUtilityMethods.values();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void processVirtualMethod(
       DexMethodSignature nonPrivateVirtualMethod,
       DexProgramClass unboxedEnum,
@@ -885,6 +889,7 @@
             && !field.getDefinition().getOptimizationInfo().isDead());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod fixupEncodedMethod(
       DexEncodedMethod method, MethodNamingUtility utility) {
     DexProto oldProto = method.getProto();
@@ -921,6 +926,7 @@
                     method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedField fixupEncodedField(DexEncodedField encodedField) {
     DexField field = encodedField.getReference();
     DexType newType = fixupType(field.type);
@@ -945,6 +951,7 @@
     return factory.createProto(returnType, arguments);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexType fixupType(DexType type) {
     if (type.isArrayType()) {
       DexType base = type.toBaseType(factory);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
index 6ae8689..cff3e70 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
@@ -59,6 +59,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected CodeRewriterResult rewriteCode(IRCode code) {
     assert appView.enableWholeProgramOptimizations();
     boolean hasChanged = false;
@@ -430,6 +431,7 @@
    *
    * and extracts the components and the index and ordinal maps.
    */
+  @SuppressWarnings("ReferenceEquality")
   private EnumSwitchInfo analyzeSwitchOverEnum(IntSwitch switchInsn) {
     Instruction input = switchInsn.inValues().get(0).definition;
     if (input == null || !input.isArrayGet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
index d56f416..12078e6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
@@ -68,6 +68,7 @@
     return method;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexString computeGetInstanceFieldMethodName(DexField field, DexItemFactory factory) {
     String fieldName = field.getName().toString();
     if (field.getHolderType() == getSynthesizingContext().getType()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/classification/EnumUnboxerMethodClassificationAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/classification/EnumUnboxerMethodClassificationAnalysis.java
index 1cedaf3..93bd925 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/classification/EnumUnboxerMethodClassificationAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/classification/EnumUnboxerMethodClassificationAnalysis.java
@@ -30,6 +30,7 @@
    * CheckNotNullEnumUnboxerMethodClassification} if the method is static and has a parameter of
    * type Object, which has a single if-zero user.
    */
+  @SuppressWarnings("ReferenceEquality")
   public static EnumUnboxerMethodClassification analyze(
       AppView<AppInfoWithLiveness> appView,
       ProgramMethod method,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 7b759b2..3c06996 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -261,6 +261,7 @@
         method, InstanceInitializerInfoCollection.of(instanceInitializerInfo));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // This method defines trivial instance initializer as follows:
   //
   // ** The holder class must not define a finalize method.
@@ -728,6 +729,7 @@
    * Returns true if the given instruction is {@code v <- new-instance NullPointerException}, and
    * the next instruction is {@code invoke-direct v, NullPointerException.<init>()}.
    */
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isInstantiationOfNullPointerException(
       Instruction instruction, InstructionIterator it, DexItemFactory dexItemFactory) {
     if (!instruction.isNewInstance()
@@ -961,6 +963,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Returns true if the given class overrides the method `void java.lang.Object.finalize()`.
   private boolean hasNonTrivialFinalizeMethod(DexProgramClass clazz) {
     if (clazz.isInterface()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java b/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
index fbf5056..853c734 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/bridge/BridgeAnalyzer.java
@@ -113,6 +113,7 @@
         : analyzeCheckCastAfterInvoke(method, checkCast, invoke);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean analyzeCheckCastBeforeInvoke(CheckCast checkCast) {
     Value object = checkCast.object().getAliasedValue();
     // It must be casting one of the arguments.
@@ -153,6 +154,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean analyzeCheckCastAfterInvoke(
       DexEncodedMethod method, CheckCast checkCast, InvokeMethod invoke) {
     Value returnValue = invoke.outValue();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
index 096adfb..425e3e9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
@@ -223,6 +223,7 @@
       return parent;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public Builder setParent(DexMethod parent) {
       assert !hasParent() || getParent() == parent;
       this.parent = parent;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
index 77121b6..53fd831 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
@@ -38,6 +38,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -55,6 +56,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void optimizeBooleanValue(
       IRCode code, InstructionListIterator instructionIterator, InvokeMethod invoke) {
     Value argument = invoke.arguments().get(0).getAliasedValue();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/ByteMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/ByteMethodOptimizer.java
index 952d7cc..a1b2c39 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/ByteMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/ByteMethodOptimizer.java
@@ -33,6 +33,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -46,6 +47,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void optimizeByteValue(
       InstructionListIterator instructionIterator, InvokeMethod byteValueInvoke) {
     // Optimize Byte.valueOf(b).byteValue() into b.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/EnumMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/EnumMethodOptimizer.java
index fd78da3..a3eba42 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/EnumMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/EnumMethodOptimizer.java
@@ -36,6 +36,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -52,6 +53,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void insertAssumeDynamicType(
       AppView<AppInfoWithLiveness> appView,
       IRCode code,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
index 821561c..3e3b850 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
@@ -137,6 +137,7 @@
    * @return The log level of the given invoke if it is a call to an android.util.Log method and the
    *     log level can be determined, otherwise returns -1.
    */
+  @SuppressWarnings("ReferenceEquality")
   private int getLogLevel(InvokeMethod invoke, DexClassAndMethod singleTarget) {
     DexMethod singleTargetReference = singleTarget.getReference();
     switch (singleTargetReference.getName().getFirstByteAsChar()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectMethodOptimizer.java
index 98e0014..72c4a3e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectMethodOptimizer.java
@@ -30,6 +30,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectsMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectsMethodOptimizer.java
index 7e55ce3..9890bca 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectsMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/ObjectsMethodOptimizer.java
@@ -44,6 +44,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -169,6 +170,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void optimizeRequireNonNull(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -212,6 +214,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void optimizeToStringWithObject(
       IRCode code,
       InstructionListIterator instructionIterator,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/StringBuilderMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/StringBuilderMethodOptimizer.java
index fb14d81..f5e8538 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/StringBuilderMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/StringBuilderMethodOptimizer.java
@@ -68,6 +68,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -195,6 +196,7 @@
      * Adds all the aliases of the given StringBuilder value to {@param aliases}, or returns false
      * if all aliases were not found (e.g., due to a phi user).
      */
+    @SuppressWarnings("ReferenceEquality")
     private boolean computeAllAliasesIfUnusedStringBuilder(Value value, Set<Value> aliases) {
       WorkList<Value> worklist = WorkList.newIdentityWorkList(value);
       while (worklist.hasNext()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
index 6e4abef..f49beb1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
@@ -40,6 +40,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void optimize(
       IRCode code,
       BasicBlockIterator blockIterator,
@@ -101,6 +102,7 @@
    * {@param constStringValue} is a constant string that is identical to the name of a class that
    * has been pruned by the {@link com.android.tools.r8.shaking.Enqueuer}.
    */
+  @SuppressWarnings("ReferenceEquality")
   private boolean isPrunedClassNameComparison(
       Value classNameValue, Value constStringValue, ProgramMethod context) {
     if (classNameValue.isPhi() || constStringValue.isPhi()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
index 54da041..a4ea5c9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
@@ -224,6 +224,7 @@
     rewriteFieldGet(code, affectedValues, blocks, iterator, current);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void rewriteFieldGet(
       IRCode code,
       Set<Value> affectedValues,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
index 0004e86..342eefc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfo.java
@@ -52,6 +52,7 @@
     return assumeValue;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isEmpty() {
     if (this == empty()) {
       return true;
@@ -98,11 +99,13 @@
     return AbstractValue.bottom();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean internalMeetIsSideEffectFree(
       boolean isSideEffectFree, boolean otherIsSideEffectFree) {
     return isSideEffectFree || otherIsSideEffectFree;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public AssumeInfo rewrittenWithLens(AppView<?> appView, GraphLens graphLens) {
     // Verify that there is no need to rewrite the assumed type.
     assert assumeType.isNotNullType() || assumeType.isUnknown();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
index 0816edc..3e3dbdd 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -340,6 +340,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object other) {
       if (!(other instanceof NewInstanceOutlineInstruction)) {
         return false;
@@ -395,6 +396,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean needsLensRewriting(GraphLens currentGraphLens) {
       return currentGraphLens.lookupType(clazz) != clazz;
     }
@@ -446,6 +448,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object other) {
       if (!(other instanceof InvokeOutlineInstruction)) {
         return false;
@@ -538,6 +541,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean needsLensRewriting(GraphLens currentGraphLens) {
       return currentGraphLens.getRenamedMethodSignature(method) != method;
     }
@@ -621,6 +625,7 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean needsLensRewriting(GraphLens currentGraphLens) {
       for (DexType argumentType : argumentTypes) {
         if (currentGraphLens.lookupType(argumentType) != argumentType) {
@@ -636,6 +641,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object other) {
       if (!(other instanceof Outline)) {
         return false;
@@ -721,6 +727,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public String toString() {
       // The printing of the code for an outline maps the value numbers to the arguments numbers.
       int outRegisterNumber = argumentTypes.size();
@@ -861,6 +868,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // Check if the current instruction can be included in the outline.
     private boolean canIncludeInstruction(Instruction instruction) {
       // Find the users of the active out-value (potential return value).
@@ -994,6 +1002,7 @@
       return false;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType argumentTypeFromValue(Value value, InvokeMethod invoke, int argumentIndex) {
       assert supportedArgumentType(value);
       DexItemFactory itemFactory = appView.options().itemFactory;
@@ -1320,6 +1329,7 @@
     }
 
     /** When assertions are enabled, remove method from the outline's list. */
+    @SuppressWarnings("ReferenceEquality")
     private boolean removeMethodFromOutlineList(Outline outline) {
       synchronized (outlineSites) {
         assert ListUtils.removeFirstMatch(
@@ -1727,6 +1737,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void buildInstruction(
         IRBuilder builder, int instructionIndex, boolean firstBlockInstruction) {
       if (instructionIndex == outline.templateInstructions.size()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
index 36d883a..35d18a5 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
@@ -112,6 +112,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isPotentionalIncInstruction(InstructionListIterator it) {
     it.previous();
     Load load = it.next().asLoad();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAction.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAction.java
index c19f65e..1b36879 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAction.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAction.java
@@ -151,6 +151,7 @@
           || factory.stringBuilderMethods.isAppendStringMethod(method);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexMethod getAppendWithStringParameter(
         DexMethod invokedMethod, DexItemFactory factory) {
       if (invokedMethod.getHolderType() == factory.stringBufferType) {
@@ -359,6 +360,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static DexMethod getConstructorWithStringParameter(
       DexMethod invokedMethod, DexItemFactory factory) {
     if (invokedMethod.getHolderType() == factory.stringBufferType) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java
index af05e80..1c81b90 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java
@@ -285,6 +285,7 @@
             }
           }
 
+          @SuppressWarnings("ReferenceEquality")
           private void createNodesForStringBuilderInstruction(
               Instruction instruction,
               StringBuilderEscapeState escapeState,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderEscapeState.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderEscapeState.java
index f1e7fb8..73ffb73 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderEscapeState.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderEscapeState.java
@@ -94,6 +94,7 @@
     return newlyEscaped;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isBottom() {
     return this == BOTTOM;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
index a795308..4a7af31 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderHelper.java
@@ -41,6 +41,7 @@
     return instruction.isAssume() || instruction.isCheckCast() || oracle.isAppend(instruction);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static String extractConstantArgument(
       DexItemFactory factory, DexMethod method, Value arg, DexType argumentType) {
     if (arg.isPhi()) {
@@ -80,6 +81,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static Number extractConstantNumber(DexItemFactory factory, Value arg) {
     if (arg.isPhi()) {
       return null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
index 8b59c2f..2c43b60 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOracle.java
@@ -58,6 +58,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isModeledStringBuilderInstruction(
         Instruction instruction, Predicate<Value> isLiveStringBuilder) {
       if (instruction.isNewInstance()) {
@@ -75,6 +76,7 @@
       return false;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean isStringBuildingMethod(StringBuildingMethods methods, DexMethod method) {
       return methods.isAppendMethod(method)
           || methods.isConstructorMethod(method)
@@ -89,11 +91,13 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isStringBuilderType(DexType type) {
       return type == factory.stringBuilderType || type == factory.stringBufferType;
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isToString(Instruction instruction, Value value) {
       if (!instruction.isInvokeMethod()) {
         return false;
@@ -158,6 +162,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isInspecting(Instruction instruction) {
       if (!instruction.isInvokeMethodWithReceiver()) {
         return false;
@@ -225,6 +230,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isStringConstructor(Instruction instruction) {
       if (!instruction.isInvokeMethod()) {
         return false;
@@ -235,6 +241,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isConstructorInvokeSideEffectFree(Instruction instruction) {
       if (!instruction.isInvokeConstructor(factory)) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index 85838a5..bd5a79b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -69,6 +69,7 @@
     return CodeRewriterResult.hasChanged(hasChanged);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // boolean String#isEmpty()
   // boolean String#startsWith(String)
   // boolean String#endsWith(String)
@@ -252,6 +253,7 @@
     return hasChanged;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // Find Class#get*Name() with a constant-class and replace it with a const-string if possible.
   private boolean rewriteClassGetName(IRCode code) {
     boolean hasChanged = false;
@@ -413,6 +415,7 @@
     return hasChanged;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   // String#valueOf(null) -> "null"
   // String#valueOf(String s) -> s
   // str.toString() -> str
@@ -492,6 +495,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean isLegitimateEscapeRoute(
         AppView<?> appView,
         EscapeAnalysis escapeAnalysis,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/typechecks/CheckCastAndInstanceOfMethodSpecialization.java b/src/main/java/com/android/tools/r8/ir/optimize/typechecks/CheckCastAndInstanceOfMethodSpecialization.java
index 4d3075c..d89c044 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/typechecks/CheckCastAndInstanceOfMethodSpecialization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/typechecks/CheckCastAndInstanceOfMethodSpecialization.java
@@ -84,6 +84,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void processCandidateForInstanceOfOptimization(
       ProgramMethod method, MethodProcessor methodProcessor) {
     DexEncodedMethod definition = method.getDefinition();
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index b65fb0c..a13c810 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -248,7 +248,7 @@
   }
 
   // TODO(b/270398965): Replace LinkedList.
-  @SuppressWarnings("JdkObsolete")
+  @SuppressWarnings({"JdkObsolete", "ReferenceEquality"})
   public static void computeDebugInfo(
       IRCode code,
       ImmutableList<BasicBlock> blocks,
@@ -462,6 +462,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void setLocalsAtEntry(
       BasicBlock block,
       InstructionListIterator instructionIterator,
@@ -512,6 +513,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DebugLocalsChange createLocalsChange(
       Int2ReferenceMap<DebugLocalInfo> ending,
       Int2ReferenceMap<DebugLocalInfo> starting,
@@ -1071,6 +1073,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void setHintForDestRegOfCheckCast(LiveIntervals unhandledInterval) {
     if (unhandledInterval.getHint() == null &&
         unhandledInterval.getValue().definition instanceof CheckCast) {
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
index 60c7c49..be68587 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
@@ -39,6 +39,7 @@
     return dst == register;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isBlocked(Set<RegisterMove> moveSet, Map<Integer, Integer> valueMap) {
     for (RegisterMove move : moveSet) {
       if (move.src == LiveIntervals.NO_REGISTER) {
@@ -64,6 +65,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object other) {
     if (!(other instanceof RegisterMove)) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
index b33743e..3edfd86 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
@@ -40,6 +40,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object other) {
     if (other == this) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
index 52116a1..bace7c1 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
@@ -159,6 +159,7 @@
     return usedTempRegisters;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private TypeElement moveTypeForIntervals(LiveIntervals to, LiveIntervals from) {
     TypeElement toType = to.getValue().getType();
     TypeElement fromType = from.getValue().getType();
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
index 7b43ba8..9caa410 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
@@ -111,6 +111,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void addReturn(List<CfInstruction> instructions) {
     if (interfaceMethod.proto.returnType == appView.dexItemFactory().voidType) {
       instructions.add(new CfReturnVoid());
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
index da1d23f..378f813 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
@@ -51,6 +51,7 @@
     super(appView, holder);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void addCfInstructionsForAbstractValue(
       List<CfInstruction> instructions, AbstractValue value, DexType returnType) {
     // TODO(b/155368026): Support fields and const class fields.
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java
index 8d50c17..af638fb 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodBuilder.java
@@ -151,6 +151,7 @@
     return this;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public CfCode build() {
     assert validate();
     int maxStack = 0;
@@ -215,6 +216,7 @@
         localVariables);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void maybeInsertArgumentCast(
       int argumentIndex, DexType sourceArgumentType, Builder<CfInstruction> instructions) {
     if (appInfoForCastArguments == null) {
@@ -283,6 +285,7 @@
         + (isStaticTarget() || isConstructorDelegate ? 0 : 1);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean validate() {
     assert sourceMethod != null;
     assert targetMethod != null;
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
index 729f071..24e8151 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
@@ -142,6 +142,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean checkSignatures() {
     List<DexType> sourceParams = new ArrayList<>();
     if (receiver != null) {
@@ -174,6 +175,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected void prepareInstructions() {
     // Prepare call arguments.
     List<ValueType> argValueTypes = new ArrayList<>();
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
index 5abcb38..1d328aa 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
@@ -114,6 +114,7 @@
       return standardCfCodeFromInstructions(instructions);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void loadFieldAsObject(List<CfInstruction> instructions, DexField field) {
       DexItemFactory factory = appView.dexItemFactory();
       instructions.add(new CfLoad(ValueType.OBJECT, 0));
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index c2bbb70..c1db29c 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -499,6 +499,7 @@
     visitor.visitEnd();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void writeMethodParametersAnnotation(MethodVisitor visitor, DexAnnotation[] annotations) {
     for (DexAnnotation annotation : annotations) {
       if (annotation.annotation.type == appView.dexItemFactory().annotationMethodParameters) {
@@ -580,6 +581,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void writeAnnotationElement(AnnotationVisitor visitor, String name, DexValue value) {
     switch (value.getValueKind()) {
       case ANNOTATION:
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index d59a9ca..c18c564 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -284,11 +284,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public KotlinClassInfo asClass() {
     return this;
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
     KmClass kmClass = new KmClass();
     // TODO(b/154348683): Set flags.
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index 9abed29..0c159d2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -179,6 +179,7 @@
     return builder.build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   boolean rewrite(
       Consumer<KmFunction> functionConsumer,
       Consumer<KmProperty> propertyConsumer,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index dd7f94a..a376f4a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -53,6 +53,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public void done(Enqueuer enqueuer) {
     // In the first round of tree shaking build up all metadata such that it can be traced later.
     boolean keepKotlinMetadata =
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index 583bd40..5e707db 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -80,6 +80,7 @@
     this.kotlin = factory.kotlin;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isNotKotlinMetadata(DexAnnotation annotation, DexType kotlinMetadataType) {
     return annotation.annotation.type != kotlinMetadataType;
   }
@@ -163,6 +164,7 @@
         executorService);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void writeKotlinInfoToAnnotation(
       DexClass clazz,
       KotlinClassLevelInfo kotlinInfo,
@@ -220,6 +222,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean kotlinMetadataFieldExists(
       DexClass kotlinMetadata, AppView<?> appView, DexString fieldName) {
     if (!appView.appInfo().hasLiveness()) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index bece7b9..b5de2c0 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -118,6 +118,7 @@
       kmProperty.accept(
           new KmPropertyVisitor() {
             @Override
+            @SuppressWarnings("ReferenceEquality")
             public KmPropertyExtensionVisitor visitExtensions(KmExtensionType type) {
               if (type != JvmPropertyExtensionVisitor.TYPE) {
                 return null;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index f00c011..a266093 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -48,6 +48,7 @@
 
   static final String INDENT = "  ";
 
+  @SuppressWarnings("ReferenceEquality")
   public static void writeKotlinMetadataAnnotation(
       String prefix, DexAnnotation annotation, PrintStream ps, Kotlin kotlin) {
     assert annotation.annotation.type == kotlin.factory.kotlinMetadataType;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index 2fb5dd1..23c7d92 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -106,6 +106,7 @@
     return metadataVersion;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static Flavour getFlavour(DexClass clazz, Kotlin kotlin) {
     // Returns KotlinStyleLambda if the given clazz has shape of a Kotlin-style lambda:
     //   a class that directly extends kotlin.jvm.internal.Lambda
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
index 2b04e91..58e4a54 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -288,6 +288,7 @@
               : null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void parseArguments(ProgramMethod method) {
       ArgumentInfoCollection argumentsInfo = protoChanges.getArgumentInfoCollection();
       currentBlock = getBasicBlock(ENTRY_BLOCK_INDEX);
@@ -339,6 +340,7 @@
       advanceNextPositionEntry();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void ensureDebugInfo() {
       if (code.getDebugLocalInfoTable() == null) {
         return;
diff --git a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
index d21044f..927e17f 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -764,6 +764,7 @@
     return addNoOperandInstruction(LirOpcodes.RETURN);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public LirBuilder<V, EV> addDebugPosition(Position position) {
     assert currentPosition == position;
     return addNoOperandInstruction(LirOpcodes.DEBUGPOS);
diff --git a/src/main/java/com/android/tools/r8/lightir/LirStrategy.java b/src/main/java/com/android/tools/r8/lightir/LirStrategy.java
index 2f0d90b..cd3511a 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirStrategy.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirStrategy.java
@@ -292,6 +292,7 @@
       }
 
       @Override
+      @SuppressWarnings("ReferenceEquality")
       public Value getValueDefinitionForInstructionIndex(
           int index, TypeElement type, Function<PhiOrValue, DebugLocalInfo> getLocalInfo) {
         PhiOrValue encodedValue = new PhiOrValue(index);
diff --git a/src/main/java/com/android/tools/r8/lightir/PhiInInstructionsStrategy.java b/src/main/java/com/android/tools/r8/lightir/PhiInInstructionsStrategy.java
index 0a26062..e628667 100644
--- a/src/main/java/com/android/tools/r8/lightir/PhiInInstructionsStrategy.java
+++ b/src/main/java/com/android/tools/r8/lightir/PhiInInstructionsStrategy.java
@@ -119,6 +119,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public Value getValueDefinitionForInstructionIndex(
         int index, TypeElement type, Function<Integer, DebugLocalInfo> getLocalInfo) {
       DebugLocalInfo localInfo = getLocalInfo.apply(index);
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
index ad33448..80208b8 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
@@ -378,6 +378,7 @@
     return new ClassNameMapper(builder.build(), mapVersions, originalSourceFiles, preamble);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyIsSorted() {
     Iterator<Entry<String, ClassNamingForNameMapper>> iterator =
         getClassNameMappings().entrySet().iterator();
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
index f45b126..02afaab 100644
--- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
+++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -685,6 +685,7 @@
       return composedRanges;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private List<MappedRange> fixupInlinedOutlines(
         ComputedOutlineInformation computedOutlineInformation, List<MappedRange> composedRanges)
         throws MappingComposeException {
diff --git a/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java b/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
index 618e1f5..2f4b4b9 100644
--- a/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
@@ -98,6 +98,7 @@
         type, ignore -> new ReservedFieldNamingState(appView));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void reserveFieldNames() {
     // Build up all reservations in the class hierarchy such that all reserved names are placed
     // at the boundary between a library class and a program class - referred to as the frontier.
@@ -213,6 +214,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void renameFieldsInUnrelatedClasspathClasses() {
     if (appView.options().getProguardConfiguration().hasApplyMappingFile()) {
       appView
@@ -272,6 +274,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexString renameField(ProgramField field, FieldNamingState state) {
     DexString newName = state.getOrCreateNameFor(field);
     if (newName != field.getReference().name) {
@@ -290,6 +293,7 @@
     fieldAccessInfo.forEachIndirectAccess(this::renameNonReboundAccessToField);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void renameNonReboundAccessToField(DexField field) {
     // If the given field reference is a non-rebound reference to a program field, then assign the
     // same name as the resolved field.
@@ -333,6 +337,7 @@
       return partitions;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private Set<DexClass> buildSortedPartition(DexClass src) {
       Set<DexClass> partition = new TreeSet<>(Comparator.comparing(DexClass::getType));
 
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index fce5c53..2928629 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -127,6 +127,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexString getRenamedStringLiteral(DexString originalLiteral) {
     String descriptor =
         DescriptorUtils.javaTypeToDescriptorIfValidJavaType(originalLiteral.toString());
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 7f17e72..caf0a51 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -333,6 +333,7 @@
     return iterator;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private int getIdentifierPositionInArguments(InvokeMethod invoke) {
     DexType returnType = invoke.getReturnType();
     if (isClassNameComparison(invoke, appView.dexItemFactory())) {
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
index c9438e7..9700c94 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -49,6 +49,7 @@
    * @param method to test
    * @return {@code true} if the given {@param method} is a reflection method in Java.
    */
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isReflectionMethod(DexItemFactory dexItemFactory, DexMethod method) {
     // So, why is this simply not like:
     //   return dexItemFactory.classMethods.isReflectiveClassLookup(method)
@@ -178,6 +179,7 @@
         && isClassNameComparison(invoke.asInvokeVirtual(), dexItemFactory);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   static boolean isClassNameComparison(InvokeVirtual invoke, DexItemFactory dexItemFactory) {
     return invoke.getInvokedMethod() == dexItemFactory.stringMembers.equals
         && (isClassNameValue(invoke.getReceiver(), dexItemFactory)
@@ -202,6 +204,7 @@
    * @return {@link DexReference} corresponding to the first constant string argument that matches a
    *     class or member name, or {@code null} if no such constant was found.
    */
+  @SuppressWarnings("ReferenceEquality")
   public static IdentifierNameStringLookupResult<?> identifyIdentifier(
       InvokeMethod invoke, DexDefinitionSupplier definitions, ProgramMethod context) {
     DexItemFactory dexItemFactory = definitions.dexItemFactory();
@@ -378,6 +381,7 @@
     return itemBasedString;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexField inferFieldInHolder(DexClass holder, String name, DexType fieldType) {
     for (DexEncodedField encodedField : holder.fields()) {
       if (encodedField.getReference().name.toString().equals(name)
@@ -527,6 +531,7 @@
    * @param classListValue the register that holds an array of {@link Class}'s
    * @return a list of {@link DexType} that corresponds to const class in {@param classListValue}
    */
+  @SuppressWarnings("ReferenceEquality")
   private static DexTypeList retrieveDexTypeListFromClassList(
       InvokeMethod invoke, Value classListValue, DexItemFactory factory) {
 
diff --git a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
index d607d71..ef75e94 100644
--- a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
@@ -260,6 +260,7 @@
       callSites.add(callSite);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     DexString getReservedName() {
       if (methodStates.isEmpty()) {
         return null;
@@ -410,6 +411,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void assignNamesToInterfaceMethods(Timing timing, Iterable<DexClass> interfaces) {
     timing.begin("Interface minification");
     // Reserve all the names that are required for interfaces.
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index 3c53944..64e6247 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -96,6 +96,7 @@
   // from the method name minifier to the interface method name minifier.
   class State {
 
+    @SuppressWarnings("ReferenceEquality")
     void putRenaming(DexEncodedMethod key, DexString newName) {
       if (newName != key.getName()) {
         renaming.put(key.getReference(), newName);
@@ -242,6 +243,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void renameMethodsInUnrelatedClasspathClasses() {
     if (appView.options().getProguardConfiguration().hasApplyMappingFile()) {
       appView
@@ -258,6 +260,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void assignNameToMethod(
       DexClass holder, DexEncodedMethod method, MethodNamingState<?> state) {
     if (method.isInitializer()) {
@@ -276,6 +279,7 @@
     state.addRenaming(newName, method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void reserveNamesInClasses() {
     // Ensure reservation state for java.lang.Object is always created, even if the type is missing.
     allocateReservationStateAndReserve(
@@ -317,6 +321,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private MethodNamingState<?> getOrAllocateMethodNamingStates(DexType type) {
     MethodNamingState<?> namingState = namingStates.get(type);
     if (namingState == null) {
@@ -372,6 +377,7 @@
     renaming.putAll(nonReboundRenamings);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void renameNonReboundMethodReference(
       DexMethod method, Map<DexMethod, DexString> nonReboundRenamings) {
     if (method.getHolderType().isArrayType()) {
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
index d4b20fe..d6028ef 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
@@ -100,6 +100,7 @@
    * renaming of the resolution target of {@param method}.
    */
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean verifyRenamingConsistentWithResolution(DexMethod method) {
     if (method.holder.isArrayType()) {
       // Array methods are never renamed, so do not bother to check.
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index ca69f67..ed4bbbb 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -41,6 +41,7 @@
 
   public abstract DexString lookupDescriptor(DexType type);
 
+  @SuppressWarnings("ReferenceEquality")
   public DexString lookupClassDescriptor(DexType type) {
     assert type.isClassType();
     return internalLookupClassDescriptor(type);
@@ -52,6 +53,7 @@
 
   public abstract DexString lookupName(DexMethod method);
 
+  @SuppressWarnings("ReferenceEquality")
   public final DexString lookupMethodName(DexCallSite callSite, AppView<?> appView) {
     if (!appView.appInfo().hasLiveness()) {
       return callSite.methodName;
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 38a950d..75322ca 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -299,6 +299,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void checkAndAddMappedNames(DexType type, DexString mappedName, Position position) {
     if (mappedNames.inverse().containsKey(mappedName)
         && mappedNames.inverse().get(mappedName) != type) {
@@ -333,6 +334,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void computeDefaultInterfaceMethodMappingsForType(
       DexType type,
       ClassNamingForMapApplier classNaming,
@@ -439,6 +441,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public DexString next(
         DexEncodedMethod method,
         InternalNamingState internalState,
@@ -539,6 +542,7 @@
     private final Set<DexReference> unmappedReferences;
     private final Map<DexString, DexType> classRenamingsMappingToDifferentName;
 
+    @SuppressWarnings("ReferenceEquality")
     ProguardMapMinifiedRenaming(
         AppView<? extends AppInfoWithClassHierarchy> appView,
         ClassRenaming classRenaming,
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 50f9d4d..84b7242 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -340,6 +340,7 @@
     return false;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void parseMemberMappings(
       ProguardMap.Builder mapBuilder, ClassNaming.Builder classNamingBuilder) throws IOException {
     MemberNaming lastAddedNaming = null;
diff --git a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
index 9fdb66a..c6d68d3 100644
--- a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
@@ -41,6 +41,7 @@
     return getRenaming(type) != null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexString getRenaming(DexType type) {
     if (type == factory.recordType) {
       return factory.recordTagType.descriptor;
diff --git a/src/main/java/com/android/tools/r8/naming/VarHandleDesugaringRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/VarHandleDesugaringRewritingNamingLens.java
index 0d7078f..1d1dceb 100644
--- a/src/main/java/com/android/tools/r8/naming/VarHandleDesugaringRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/VarHandleDesugaringRewritingNamingLens.java
@@ -24,6 +24,7 @@
   private final NamingLens namingLens;
   private final Map<DexType, DexString> mapping;
 
+  @SuppressWarnings("ReferenceEquality")
   public static NamingLens createVarHandleDesugaringRewritingNamingLens(AppView<?> appView) {
     DexItemFactory factory = appView.dexItemFactory();
     if (appView.options().shouldDesugarVarHandle()
@@ -102,6 +103,7 @@
     return getRenaming(type) != null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexString getRenaming(DexType type) {
     assert type != factory.desugarMethodHandlesLookupType;
     assert type != factory.desugarVarHandleType;
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 8749939..82a9980 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -284,6 +284,7 @@
         methodAccessInfoCollection::forEachStaticInvoke, this::resolveMethod, InvokeType.STATIC);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void computeMethodRebinding(
       BiForEachable<DexMethod, ProgramMethodSet> methodsWithContexts,
       Function<DexMethod, MethodResolutionResult> resolver,
@@ -442,6 +443,7 @@
     return findHolderForInterfaceMethodBridge(superClass.asProgramClass(), iface);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean mayNeedBridgeForVisibility(ProgramMethod context, DexClassAndMethod method) {
     DexType holderType = method.getHolderType();
     DexClass holder = appView.definitionFor(holderType);
@@ -529,6 +531,7 @@
     appView.notifyOptimizationFinishedForTesting();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyFieldAccessCollectionContainsAllNonReboundFieldReferences(
       ExecutorService executorService) throws ExecutionException {
     Set<DexField> nonReboundFieldReferences = computeNonReboundFieldReferences(executorService);
@@ -582,6 +585,7 @@
                     registerFieldReference(field);
                   }
 
+                  @SuppressWarnings("ReferenceEquality")
                   private void registerFieldReference(DexField field) {
                     appView()
                         .appInfo()
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
index a310d2b..616ac22 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
@@ -85,6 +85,7 @@
         .build();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getReboundMethodReference(DexMethod method) {
     DexMethod rebound = nonReboundMethodReferenceToDefinitionMap.get(method);
     assert method != rebound;
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
index d95c587..7367af3 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
@@ -143,6 +143,7 @@
       registerFieldAccess(field);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerFieldAccess(DexField field) {
       if (!seenFieldReferences.add(field)) {
         return;
@@ -204,6 +205,7 @@
       registerInvokeMethod(method, methodAccessInfoCollectionBuilder.getVirtualInvokes());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerInvokeMethod(DexMethod method, Map<DexMethod, ProgramMethodSet> invokes) {
       if (!seenMethodReferences.add(method)) {
         return;
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
index 15b6ae9..283581a 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
@@ -125,6 +125,7 @@
       this.appView = appView;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void map(DexMethod from, DexMethod to, InvokeType type) {
       if (from == to) {
         assert !methodMaps.containsKey(type) || methodMaps.get(type).getOrDefault(from, to) == to;
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingUtils.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingUtils.java
index 1b72c3a..cfb4f09 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingUtils.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingUtils.java
@@ -13,6 +13,7 @@
 
 public class MemberRebindingUtils {
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isNonReboundMethodReference(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       DexMethod method,
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
index b388d09..fba2f6f 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
@@ -157,6 +157,7 @@
             method -> publicizeMethod(method, localNamingState, namingState, traversalState));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod publicizeMethod(
       ProgramMethod method,
       BiMap<DexMethod, DexMethod> localNamingState,
@@ -207,6 +208,7 @@
     return commitMethod(method, localNamingState, namingState);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getAndReserveNewMethodReference(
       ProgramMethod method,
       BiMap<DexMethod, DexMethod> localNamingState,
@@ -308,6 +310,7 @@
         method, getAndReserveNewMethodReference(method, localNamingState, namingState));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod commitMethod(ProgramMethod method, DexMethod newMethodReference) {
     DexProgramClass holder = method.getHolder();
     if (newMethodReference != method.getReference()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierLens.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierLens.java
index 8810cd6..8a649e1 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierLens.java
@@ -56,6 +56,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context, GraphLens codeLens) {
     assert !previous.hasReboundReference();
@@ -95,6 +96,7 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public Builder recordMove(DexMethod from, DexMethod to) {
       assert from != to;
       synchronized (methodMap) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index b5818fd..4f97afa 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -88,6 +88,7 @@
             builder -> builder.setGenericSignature(FieldTypeSignature.noSignature())));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void fixupMethods(DexProgramClass clazz) {
     MethodCollection methodCollection = clazz.getMethodCollection();
     methodCollection.replaceMethods(
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
index c42b054..0d98394 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
@@ -517,6 +517,7 @@
         : new ConcretePrimitiveTypeParameterState(abstractValue);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexMethod getRepresentative(InvokeMethod invoke, ProgramMethod resolvedMethod) {
     if (resolvedMethod.getDefinition().belongsToDirectPool()) {
       return resolvedMethod.getReference();
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
index af130e8..d20c06b 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
@@ -57,6 +57,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
     FieldLookupResult lookupResult = super.internalDescribeLookupField(previous);
     if (lookupResult.getReference().getType() != previous.getReference().getType()) {
@@ -124,12 +125,14 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public Builder recordMove(DexField from, DexField to) {
       assert from != to;
       newFieldSignatures.put(from, to);
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public Builder recordMove(
         DexMethod from, DexMethod to, RewrittenPrototypeDescription prototypeChangesForMethod) {
       assert from != to;
@@ -160,6 +163,7 @@
       return argumentPropagatorGraphLens;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void fixupPrototypeChangesAfterFieldSignatureChanges(
         ArgumentPropagatorGraphLens argumentPropagatorGraphLens) {
       for (Entry<DexMethod, RewrittenPrototypeDescription> entry : prototypeChanges.entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
index aa0bde9..85c77a4 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
@@ -186,6 +186,7 @@
       registerInvokeMethod(method);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerInvokeMethod(DexMethod method) {
       SingleResolutionResult<?> resolutionResult =
           appView.appInfo().unsafeResolveMethodDueToDexFormatLegacy(method).asSingleResolution();
@@ -222,6 +223,7 @@
       registerFieldAccess(field);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerFieldAccess(DexField field) {
       FieldResolutionResult resolutionResult = appView.appInfo().resolveField(field);
       if (resolutionResult.getSingleProgramField() == null) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 94a7d22..c4d5fee 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -158,6 +158,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == null || getClass() != obj.getClass()) {
         return false;
@@ -347,6 +348,7 @@
           newMethodSignature, new Pair<>(allowedPrototypeChanges, originalMethodSignature));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void computePrototypeChangesForVirtualMethods(
         Set<DexProgramClass> stronglyConnectedProgramClasses,
         DexMethodSignatureSet interfaceDispatchOutsideProgram) {
@@ -524,6 +526,7 @@
       return true;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getNewReturnTypeForVirtualMethods(
         ProgramMethodSet methods, SingleValue returnValue) {
       if (returnValue != null || isReturnValueUnusedForVirtualMethods(methods)) {
@@ -557,6 +560,7 @@
                       && method.getOptimizationInfo().isReturnValueUsed().isFalse());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getNewParameterTypeForVirtualMethods(
         ProgramMethodSet methods, int parameterIndex) {
       DexType newParameterType = null;
@@ -578,6 +582,7 @@
     }
 
     // Returns true if the class was changed as a result of argument propagation.
+    @SuppressWarnings("ReferenceEquality")
     private boolean visitClass(
         DexProgramClass clazz,
         DexMethodSignatureSet interfaceDispatchOutsideProgram,
@@ -653,6 +658,7 @@
       return affected.get();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getNewFieldType(ProgramField field) {
       DynamicType dynamicType = field.getOptimizationInfo().getDynamicType();
       DexType staticType = field.getType();
@@ -728,6 +734,7 @@
       return newStaticFieldType;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexField getNewFieldSignature(
         ProgramField field,
         Set<DexField> newFieldSignatures,
@@ -964,6 +971,7 @@
           method, method.getOptimizationInfo().isReturnValueUsed(), getReturnValue(method));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getNewReturnType(
         ProgramMethod method, OptionalBool isReturnValueUsed, SingleValue returnValue) {
       DexType staticType = method.getReturnType();
@@ -1026,6 +1034,7 @@
           : null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getNewParameterType(ProgramMethod method, int parameterIndex) {
       if (!appView.getKeepInfo(method).isParameterTypeStrengtheningAllowed(options)) {
         return null;
@@ -1081,6 +1090,7 @@
               method, canBeConvertedToStaticMethod, newParameterTypes, removableParameterIndices));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private ArgumentInfoCollection computeParameterChangesForMethod(
         ProgramMethod method,
         boolean canBeConvertedToStaticMethod,
@@ -1147,6 +1157,7 @@
       return parameterChangesBuilder.build();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private RewrittenTypeInfo computeReturnChangesForMethod(
         ProgramMethod method, DexType newReturnType) {
       if (newReturnType == null) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
index 2ef79c7..c0dab86 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
@@ -99,6 +99,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public ParameterState mutableJoin(
       AppView<AppInfoWithLiveness> appView,
       ConcreteReferenceTypeParameterState parameterState,
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
index 3b3f3cb..c0fc006 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
@@ -50,6 +50,7 @@
     return new ConcretePrimitiveTypeParameterState(abstractValue, copyInParameters());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ParameterState mutableJoin(
       AppView<AppInfoWithLiveness> appView,
       ConcretePrimitiveTypeParameterState parameterState,
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameter.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameter.java
index b9c09de..21e3df1 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameter.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameter.java
@@ -26,6 +26,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object obj) {
     if (obj == null || getClass() != obj.getClass()) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysis.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysis.java
index d33cfb8..422b122 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysis.java
@@ -49,6 +49,7 @@
       this.root = root;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void addOverride(ProgramMethod override) {
       assert override != root;
       assert override.getMethodSignature().equals(root.getMethodSignature());
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
index 313b6ca..4b3349c 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
@@ -55,6 +55,7 @@
           clazz, superclass -> addParentState(clazz, superclass));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // TODO(b/190154391): This currently copies the state of the superclass into its immediate
     //  given subclass. Instead of copying the state, consider linking the states. This would reduce
     //  memory usage, but would require visiting all transitive (program) super classes for each
@@ -159,6 +160,7 @@
       return methodState;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean shouldActivateMethodStateGuardedByBounds(
         ClassTypeElement upperBound, DexProgramClass currentClass, DexProgramClass superClass) {
       ClassTypeElement classType =
@@ -276,6 +278,7 @@
     propagationStates.put(clazz, propagationState);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isUpperBoundSatisfied(ClassTypeElement upperBound, DexProgramClass currentClass) {
     DexType upperBoundType =
         upperBound.getClassType() == appView.dexItemFactory().objectType
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
index 4a737f4..d8149d7 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
@@ -351,6 +351,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private CfCode createCfCodeForVirtualBridge(CfCode code, DexMethod methodToInvoke) {
     List<CfInstruction> newInstructions = new ArrayList<>();
     boolean modified = false;
@@ -377,6 +378,7 @@
         : code;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexCode createDexCodeForVirtualBridge(DexCode code, DexMethod methodToInvoke) {
     DexInstruction[] newInstructions = new DexInstruction[code.instructions.length];
     boolean modified = false;
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java
index b15a35f..fd8be1c 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java
@@ -69,11 +69,13 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public CfFrameState asAbstractState() {
     return this;
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean isGreaterThanOrEquals(AppView<?> appView, CfFrameState state) {
     if (this == state) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java
index b870c4a..c33be3c 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java
@@ -125,6 +125,7 @@
       }
 
       @Override
+      @SuppressWarnings("ReferenceEquality")
       public boolean isImmediateSuperClassOfCurrentContext(DexType type) {
         return type == method.getHolder().getSuperType();
       }
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysisHelper.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysisHelper.java
index 515fa4e..e06916b 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysisHelper.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysisHelper.java
@@ -150,6 +150,7 @@
     processAssignment(fromType, toType.toTypeElement(appView));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void processAssignment(TypeElement fromType, TypeElement toType) {
     // If the type is an interface type, then check that the assigned value is a subtype of the
     // interface type, or mark the interface as open.
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
index 86dd3d8..81fcbfd 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
@@ -171,6 +171,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public CfFrameState pop(BiFunction<CfFrameState, PreciseFrameType, CfFrameState> fn) {
     if (stack.isEmpty()) {
       return error("Unexpected pop from empty stack");
@@ -181,6 +182,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public CfFrameState popAndInitialize(
       AppView<?> appView, DexMethod constructor, CfAnalysisConfig config) {
     return pop(
@@ -467,6 +469,7 @@
     setSingleLocalToTop(localIndex, builder);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void joinWideLocalsWithSameIndex(
       int localIndex,
       WidePrimitiveFrameType frameType,
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
index b8d14cc..532c558 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/collection/OpenClosedInterfacesCollection.java
@@ -45,6 +45,7 @@
         appView, () -> value.getDynamicType(appView), value.getType());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final boolean isDefinitelyInstanceOfStaticType(
       AppView<?> appView, Supplier<DynamicType> dynamicTypeSupplier, TypeElement staticType) {
     if (!staticType.isClassType()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
index 47df2ba..3cac2b3 100644
--- a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
@@ -84,6 +84,7 @@
       }
 
       @Override
+      @SuppressWarnings("ReferenceEquality")
       protected TraversalContinuation<Void, LocalReservationState> joiner(
           DFSNodeWithState<DexClass, LocalReservationState> node,
           List<DFSNodeWithState<DexClass, LocalReservationState>> childStates) {
diff --git a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
index 2a7d000..74e3046 100644
--- a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizerGraphLens.java
@@ -41,6 +41,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public RewrittenPrototypeDescription lookupPrototypeChangesForMethodDefinition(
       DexMethod method, GraphLens codeLens) {
     if (this == codeLens) {
@@ -57,6 +58,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context, GraphLens codeLens) {
     DexMethod methodSignature = previous.getReference();
@@ -100,6 +102,7 @@
       this.appView = appView;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public RewrittenPrototypeDescription recordNewMethodSignature(
         DexEncodedMethod method, DexMethod newMethodSignature) {
       assert method.getReference() != newMethodSignature;
@@ -114,6 +117,7 @@
     }
 
     // TODO(b/195112263): Canonicalize the permutation maps.
+    @SuppressWarnings("ReferenceEquality")
     private static RewrittenPrototypeDescription computePrototypeChanges(
         DexEncodedMethod method, DexMethod newMethodSignature) {
       int firstNonReceiverArgumentIndex = method.getFirstNonReceiverArgumentIndex();
diff --git a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java
index d5c8736..53b3147 100644
--- a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java
+++ b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java
@@ -193,6 +193,7 @@
     return traversal.getRemovedBridges();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexClassAndMethod getTargetForRedundantAbstractBridge(ProgramMethod method) {
     if (!method.getAccessFlags().isAbstract() || method.getDefinition().getCode() != null) {
       return null;
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
index 3eee55a..f33323f 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
@@ -89,6 +89,7 @@
     return (ArtProfileMethodRule) rules.get(method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public int size() {
     return rules.size();
   }
@@ -111,6 +112,7 @@
                         methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo())));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ArtProfile rewrittenWithLens(AppView<?> appView, EnumUnboxingLens lens) {
     return transform(
         (classRule, classRuleBuilderFactory) -> {
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRule.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRule.java
index 55590a0..b09934e 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRule.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRule.java
@@ -69,6 +69,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index 3050741..9b4ceb2 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -193,6 +193,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void addLambdaVirtualMethodsIfLambdaImplementationIsInProfile(
       LambdaClass lambdaClass, ProgramMethod context) {
     Target target = lambdaClass.getTarget();
@@ -221,6 +222,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean shouldConservativelyAddLambdaVirtualMethodsIfLambdaInstantiated(
       LambdaClass lambdaClass, ProgramMethod context) {
     Target target = lambdaClass.getTarget();
diff --git a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
index 8919b83..550458f 100644
--- a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
@@ -133,6 +133,7 @@
         InstrumentationServerFactory.createClass(dexItemFactory), instrumentationServerImplClass);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void instrumentClass(DexProgramClass clazz) {
     // Do not instrument the instrumentation server if it is already in the app.
     if (clazz.getType() == references.instrumentationServerType
diff --git a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
index 83aa6c8..f879adb 100644
--- a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileClassRule.java
@@ -52,6 +52,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
index bc5e098..5f8e2b5 100644
--- a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
@@ -52,6 +52,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public boolean equals(Object o) {
     if (this == o) {
       return true;
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index f4c023f..b79ae30 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -129,6 +129,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private RepackagingLens repackageClasses(
       DirectMappedDexApplication.Builder appBuilder, ExecutorService executorService)
       throws ExecutionException {
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
index 81badc6..0b40c72 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
@@ -40,6 +40,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public <T extends DexReference> boolean isSimpleRenaming(T from, T to) {
     if (from == to) {
       assert false : "The from and to references should not be equal";
@@ -58,6 +59,7 @@
         this::isSimpleTypeRenamingOrEqual);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSimpleTypeRenamingOrEqual(DexType from, DexType to) {
     return from == to || newTypes.get(from) == to;
   }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultData.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultData.java
index 639b1d5..c3cba5e 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultData.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultData.java
@@ -24,6 +24,7 @@
     this.position = position;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   boolean isAmbiguous() {
     if (memberNamingWithMappedRanges == null) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
index 8d7d20f..8f9e219 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
@@ -124,6 +124,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object o) {
       if (this == o) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
index eb92c40..65ada3d 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
@@ -65,6 +65,7 @@
     return rewritten;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexAnnotationElement rewriteAnnotationElement(DexAnnotationElement original) {
     DexValue rewrittenValue = rewriteComplexValue(original.value);
     if (rewrittenValue != original.value) {
@@ -73,6 +74,7 @@
     return original;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValue rewriteComplexValue(DexValue value) {
     if (value.isDexValueArray()) {
       DexValue[] originalValues = value.asDexValueArray().getValues();
@@ -92,6 +94,7 @@
     return rewriteNestedValue(value);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexValue rewriteNestedValue(DexValue value) {
     if (value.isDexItemBasedValueString()) {
       DexItemBasedValueString valueString = value.asDexItemBasedValueString();
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationMatchResult.java b/src/main/java/com/android/tools/r8/shaking/AnnotationMatchResult.java
index c83cbfc..b21807c 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationMatchResult.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationMatchResult.java
@@ -81,6 +81,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == this) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
index 1666178..c41d870 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
@@ -261,6 +261,7 @@
     return rewrite;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexAnnotationElement rewriteAnnotationElement(
       DexType annotationType, DexAnnotationElement original) {
     // The dalvik.annotation.AnnotationDefault is typically not on bootclasspath. However, if it
@@ -325,6 +326,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean shouldRetainRetentionAnnotationOnAnnotationClass(DexAnnotation annotation) {
     // Retain @Retention annotations that are different from @Retention(RetentionPolicy.CLASS).
     if (annotation.annotation.getNumberOfElements() != 1) {
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 8f6b03f..927f14b 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -831,6 +831,7 @@
    * @param callSite Call site to resolve.
    * @return Methods implemented by the lambda expression that created the {@code callSite}.
    */
+  @SuppressWarnings("ReferenceEquality")
   public Set<DexEncodedMethod> lookupLambdaImplementedMethods(
       DexCallSite callSite, AppView<AppInfoWithLiveness> appView) {
     assert checkIfObsolete();
@@ -996,6 +997,7 @@
         && !fieldAccessInfo.isWrittenOutside(method);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isInstanceFieldWrittenOnlyInInstanceInitializers(DexClassAndField field) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
@@ -1338,6 +1340,7 @@
         appView, method, context, isInterface, modeledPredicate, DynamicType.unknown());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod lookupSingleVirtualTarget(
       AppView<AppInfoWithLiveness> appView,
       DexMethod method,
@@ -1446,6 +1449,7 @@
     return singleMethodTarget;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private DexEncodedMethod getMethodTargetFromExactRuntimeInformation(
       DexType refinedReceiverType,
       ClassTypeElement receiverLowerBoundType,
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index c2b3460..b6d4948 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1101,6 +1101,7 @@
     return info;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean registerFieldAccess(
       DexField field, ProgramMethod context, boolean isRead, boolean isReflective) {
     FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field);
@@ -1234,6 +1235,7 @@
     internalTraceConstClassOrCheckCast(type, currentMethod, true);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void traceConstClass(
       DexType type,
       ProgramMethod currentMethod,
@@ -1263,6 +1265,7 @@
    *
    * <p>Some common usages of const-class values are handled, such as calls to Class.get*Name().
    */
+  @SuppressWarnings("ReferenceEquality")
   private boolean isConstClassMaybeUsedAsLock(
       ProgramMethod currentMethod, ListIterator<? extends CfOrDexInstruction> iterator) {
     if (iterator == null) {
@@ -1475,6 +1478,7 @@
     traceInvokeStatic(invokedMethod, context, KeepReason.invokedFromLambdaCreatedIn(context));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void traceInvokeStatic(
       DexMethod invokedMethod, ProgramMethod context, KeepReason reason) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
@@ -1524,6 +1528,7 @@
     traceInvokeVirtual(invokedMethod, context, KeepReason.invokedFromLambdaCreatedIn(context));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void traceInvokeVirtual(
       DexMethod invokedMethod, ProgramMethod context, KeepReason reason) {
     if (invokedMethod == appView.dexItemFactory().classMethods.newInstance
@@ -1680,6 +1685,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void traceInstanceFieldRead(
       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
     if (!metadata.isDeferred() && !registerFieldRead(fieldReference, currentMethod)) {
@@ -1741,6 +1747,7 @@
     traceInstanceFieldWrite(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void traceInstanceFieldWrite(
       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
     if (!metadata.isDeferred() && !registerFieldWrite(fieldReference, currentMethod)) {
@@ -1804,6 +1811,7 @@
     traceStaticFieldRead(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void traceStaticFieldRead(
       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
     if (!metadata.isDeferred() && !registerFieldRead(fieldReference, currentMethod)) {
@@ -1884,6 +1892,7 @@
     traceStaticFieldWrite(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   void traceStaticFieldWrite(
       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
     if (!metadata.isDeferred() && !registerFieldWrite(fieldReference, currentMethod)) {
@@ -2180,6 +2189,7 @@
     analyses.forEach(analysis -> analysis.processNewlyLiveClass(clazz, workList));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void processDeferredAnnotations(
       DexProgramClass clazz,
       Map<DexType, Map<DexAnnotation, List<ProgramDefinition>>> deferredAnnotations,
@@ -2945,6 +2955,7 @@
             });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void markLibraryAndClasspathMethodOverridesAsLive(
       InstantiatedObject instantiation, DexClass libraryClass) {
     assert libraryClass.isNotProgramClass();
@@ -4188,6 +4199,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private EnqueuerResult createEnqueuerResult(AppInfoWithClassHierarchy appInfo, Timing timing)
       throws ExecutionException {
     timing.begin("Remove dead protos");
@@ -4632,6 +4644,7 @@
   private final Map<DexMethod, InterfaceMethodSyntheticBridgeAction>
       syntheticInterfaceMethodBridges = new LinkedHashMap<>();
 
+  @SuppressWarnings("ReferenceEquality")
   private void identifySyntheticInterfaceMethodBridges(
       InterfaceMethodSyntheticBridgeAction action) {
     ProgramMethod methodToKeep = action.getMethodToKeep();
@@ -4938,6 +4951,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private void handleReflectiveBehavior(ProgramMethod method, Instruction instruction) {
     if (!instruction.isInvokeMethod()) {
       return;
@@ -5082,6 +5096,7 @@
   }
 
   /** Handles reflective uses of {@link java.lang.reflect.Constructor#newInstance(Object...)}. */
+  @SuppressWarnings("ReferenceEquality")
   private void handleJavaLangReflectConstructorNewInstance(
       ProgramMethod method, InvokeMethod invoke) {
     if (!invoke.isInvokeVirtual()) {
@@ -5476,6 +5491,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean addField(DexField fieldReference) {
       recordFieldReference(fieldReference, context);
       DexProgramClass holder = getProgramHolderOrNull(fieldReference, context);
@@ -5517,6 +5533,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean addMethod(DexMethod method) {
       // Record the references in case they are not program types.
       recordMethodReference(method, context);
@@ -5592,6 +5609,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object o) {
       if (o == null || getClass() != o.getClass()) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
index e43b081..62017f6 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerEvent.java
@@ -124,6 +124,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
       DexType rewrittenType = lens.lookupType(getType());
       if (rewrittenType == getType()) {
@@ -136,6 +137,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == this) {
         return true;
@@ -174,6 +176,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
       DexType rewrittenType = lens.lookupType(getType());
       if (rewrittenType == getType()) {
@@ -186,6 +189,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean equals(Object obj) {
       if (obj == this) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
index 4e99cc6..d0ae107 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -377,6 +377,7 @@
       this.metadata = metadata;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     protected boolean baseEquals(TraceFieldAccessAction action) {
       return field == action.field
           && context.isStructurallyEqualTo(action.context)
diff --git a/src/main/java/com/android/tools/r8/shaking/GraphReporter.java b/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
index c3bd5fd..40b2940 100644
--- a/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
+++ b/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
@@ -179,6 +179,7 @@
     return KeepReasonWitness.INSTANCE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public KeepReasonWitness reportCompatKeepDefaultInitializer(ProgramMethod defaultInitializer) {
     assert defaultInitializer.getHolder().getDefaultInitializer()
         == defaultInitializer.getDefinition();
@@ -265,6 +266,7 @@
     return KeepReasonWitness.INSTANCE;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public KeepReasonWitness reportReachableMethodAsLive(
       DexMethod overriddenMethod, ProgramMethod derivedMethod) {
     if (keptGraphConsumer != null
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
index f56779b..06fee94 100644
--- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
+++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -224,6 +224,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean evaluateIfRuleMembersAndMaterialize(
       ProguardIfRule rule, DexClass sourceClass, DexClass targetClass) {
     Collection<ProguardMemberRule> memberKeepRules = rule.getMemberRules();
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
index f9c2474..fcabc9d 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -113,6 +113,7 @@
     return getMethodInfo(method.getDefinition(), method.getHolder());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final KeepMethodInfo getMethodInfo(
       DexEncodedMethod method, DexDefinitionSupplier definitions) {
     DexProgramClass holder =
@@ -139,6 +140,7 @@
     return getFieldInfo(field.getDefinition(), field.getHolder());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public final KeepFieldInfo getFieldInfo(
       DexEncodedField field, DexDefinitionSupplier definitions) {
     DexProgramClass holder =
@@ -352,6 +354,7 @@
       return result;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private Map<DexType, KeepClassInfo> rewriteClassInfo(
         NonIdentityGraphLens lens, InternalOptions options, Timing timing) {
       timing.begin("Rewrite class info");
@@ -374,6 +377,7 @@
       return newClassInfo;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private Map<DexField, KeepFieldInfo> rewriteFieldInfo(
         NonIdentityGraphLens lens, InternalOptions options, Timing timing) {
       timing.begin("Rewrite field info");
@@ -391,6 +395,7 @@
       return newFieldInfo;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private Map<DexMethod, KeepMethodInfo> rewriteMethodInfo(
         NonIdentityGraphLens lens, InternalOptions options, Timing timing) {
       timing.begin("Rewrite method info");
@@ -495,12 +500,14 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public KeepMethodInfo getMethodInfo(DexEncodedMethod method, DexProgramClass holder) {
       assert method.getHolderType() == holder.type;
       return keepMethodInfo.getOrDefault(method.getReference(), KeepMethodInfo.bottom());
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public KeepFieldInfo getFieldInfo(DexEncodedField field, DexProgramClass holder) {
       assert field.getHolderType() == holder.type;
       return keepFieldInfo.getOrDefault(field.getReference(), KeepFieldInfo.bottom());
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepReason.java b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
index a05c9ac..0299b05 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepReason.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
@@ -160,6 +160,7 @@
 
   private static class InvokedFrom extends BasedOnOtherMethod {
 
+    @SuppressWarnings("ReferenceEquality")
     private InvokedFrom(DexProgramClass holder, DexEncodedMethod method) {
       super(method);
       assert holder.type == method.getHolderType();
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
index a961e10..4a5ffd6 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
@@ -198,6 +198,7 @@
     return MainDexGroup.NOT_IN_MAIN_DEX;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean disallowInliningIntoContext(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       ProgramDefinition context,
diff --git a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
index 2fa2e2c..e5e514d 100644
--- a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
+++ b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
@@ -73,6 +73,7 @@
       this.alreadyMissingClasses = alreadyMissingClasses;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void addNewMissingClass(DexType type, ProgramDerivedContext context) {
       assert context != null;
       assert context.getContext().getContextType() != type;
diff --git a/src/main/java/com/android/tools/r8/shaking/ObjectAllocationInfoCollectionUtils.java b/src/main/java/com/android/tools/r8/shaking/ObjectAllocationInfoCollectionUtils.java
index a578485..7eb81ce 100644
--- a/src/main/java/com/android/tools/r8/shaking/ObjectAllocationInfoCollectionUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ObjectAllocationInfoCollectionUtils.java
@@ -20,6 +20,7 @@
         appView, type, appView.appInfo().getObjectAllocationInfoCollection());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean mayHaveFinalizeMethodDirectlyOrIndirectly(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       ClassTypeElement type,
@@ -35,6 +36,7 @@
         appView, type.getClassType(), objectAllocationInfoCollection);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean mayHaveFinalizeMethodDirectlyOrIndirectly(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       DexType type,
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardClassSpecification.java b/src/main/java/com/android/tools/r8/shaking/ProguardClassSpecification.java
index f4542d8..0700049 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardClassSpecification.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardClassSpecification.java
@@ -206,6 +206,7 @@
   private final boolean inheritanceIsExtends;
   private final List<ProguardMemberRule> memberRules;
 
+  @SuppressWarnings("ReferenceEquality")
   protected ProguardClassSpecification(
       Origin origin,
       Position position,
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
index fee5278..71057cd 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
@@ -345,6 +345,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public boolean matches(DexType type) {
       return this.type == type;
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index afe4006..513b132 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -1437,6 +1437,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void evaluateAssumeNoSideEffectsRule(
         Definition item, ProguardAssumeNoSideEffectRule context, ProguardMemberRule rule) {
       assert assumeInfoCollectionBuilder != null;
@@ -1732,6 +1733,7 @@
           && item.asMethod().getDefinition().hasCode();
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void reportAssumeNoSideEffectsWarningForJavaLangClassMethod(
         DexClassAndMethod method, ProguardAssumeNoSideEffectRule context) {
       assert method.getHolderType() == options.dexItemFactory().objectType;
@@ -1741,6 +1743,7 @@
           .add(method.getReference());
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean isWaitOrNotifyMethod(DexMethod method) {
       return method.name == options.itemFactory.waitMethodName
           || method.name == options.itemFactory.notifyMethodName
diff --git a/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java b/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
index 33b7d4e..392ae35 100644
--- a/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
+++ b/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
@@ -17,6 +17,7 @@
 
   private Map<DexType, Map<DexMethod, DexEncodedMethod>> cache = new ConcurrentHashMap<>();
 
+  @SuppressWarnings("ReferenceEquality")
   public void addToCache(DexType refinedReceiverType, DexMethod method, DexEncodedMethod target) {
     assert target != DexEncodedMethod.SENTINEL;
     Map<DexMethod, DexEncodedMethod> methodCache =
@@ -48,6 +49,7 @@
         });
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public DexEncodedMethod getCachedItem(DexType receiverType, DexMethod method) {
     Map<DexMethod, DexEncodedMethod> cachedMethods = cache.get(receiverType);
     if (cachedMethods == null) {
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index ec15263..0c0da4e 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -284,6 +284,7 @@
                     && !isLive.test(nestMemberAttr.getNestMember()));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static void claimNestOwnership(
       DexClass newHost, Predicate<DexType> isLive, Function<DexType, DexClass> definition) {
     DexClass previousHost = definition.apply(newHost.getNestHost());
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 380efdb..760e11e 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -303,6 +303,7 @@
 
   // Returns true if [clazz] is a merge candidate. Note that the result of the checks in this
   // method do not change in response to any class merges.
+  @SuppressWarnings("ReferenceEquality")
   private boolean isMergeCandidate(
       DexProgramClass sourceClass, DexProgramClass targetClass, Set<DexType> pinnedTypes) {
     assert targetClass != null;
@@ -391,6 +392,7 @@
   // Returns true if [clazz] is a merge candidate. Note that the result of the checks in this
   // method may change in response to class merges. Therefore, this method should always be called
   // before merging [clazz] into its subtype.
+  @SuppressWarnings("ReferenceEquality")
   private boolean isStillMergeCandidate(DexProgramClass sourceClass, DexProgramClass targetClass) {
     assert isMergeCandidate(sourceClass, targetClass, pinnedTypes);
     assert !mergedClasses.containsValue(sourceClass.getType());
@@ -517,6 +519,7 @@
       }
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public Collection<DexMethod> get() {
       Map<DexString, DexProto> overloadingInfo = new HashMap<>();
 
@@ -658,6 +661,7 @@
     return lens;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean verifyGraphLens(VerticalClassMergerGraphLens graphLens) {
     // Note that the method assertReferencesNotModified() relies on getRenamedFieldSignature() and
     // getRenamedMethodSignature() instead of lookupField() and lookupMethod(). This is important
@@ -719,6 +723,7 @@
     return true;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean methodResolutionMayChange(DexProgramClass source, DexProgramClass target) {
     for (DexEncodedMethod virtualSourceMethod : source.virtualMethods()) {
       DexEncodedMethod directTargetMethod =
@@ -836,6 +841,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean fieldResolutionMayChange(DexClass source, DexClass target) {
     if (source.type == target.superType) {
       // If there is a "iget Target.f" or "iput Target.f" instruction in target, and the class
@@ -1468,6 +1474,7 @@
       return bridge;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // Returns the method that shadows the given method, or null if method is not shadowed.
     private DexEncodedMethod findMethodInTarget(DexEncodedMethod method) {
       MethodResolutionResult resolutionResult =
@@ -1808,6 +1815,7 @@
 
     }
 
+    @SuppressWarnings("ReferenceEquality")
     // Given a method signature and a type, this method computes a bit vector that denotes the
     // positions at which the given type is used in the method signature.
     private int computePositionsFor(
@@ -1848,6 +1856,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private AbortReason disallowInlining(ProgramMethod method, DexProgramClass context) {
     if (appView.options().inlinerOptions().enableInlining) {
       Code code = method.getDefinition().getCode();
@@ -1899,6 +1908,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public final DexType getNextClassType(DexType type) {
       return type == source ? target.type : mergedClasses.getOrDefault(type, type);
     }
@@ -2169,6 +2179,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void registerInvokeSpecial(DexMethod method) {
       ProgramMethod context = getContext();
       if (method.getHolderType() != context.getHolderType()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
index 0f89af1..d4525f0 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
@@ -216,6 +216,7 @@
       this.dexItemFactory = dexItemFactory;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     static Builder createBuilderForFixup(Builder builder, VerticallyMergedClasses mergedClasses) {
       Builder newBuilder = new Builder(builder.dexItemFactory);
       builder.fieldMap.forEach(
@@ -292,6 +293,7 @@
           prototypeChanges);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexField getFieldSignatureAfterClassMerging(
         DexField field, VerticallyMergedClasses mergedClasses) {
       assert !field.holder.isArrayType();
@@ -308,6 +310,7 @@
       return dexItemFactory.createField(newHolder, newType, field.name);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexMethod getMethodSignatureAfterClassMerging(
         DexMethod signature, VerticallyMergedClasses mergedClasses) {
       assert !signature.holder.isArrayType();
@@ -326,6 +329,7 @@
       return dexItemFactory.createMethod(newHolder, newProto, signature.name);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private DexType getTypeAfterClassMerging(DexType type, VerticallyMergedClasses mergedClasses) {
       if (type.isArrayType()) {
         DexType baseType = type.toBaseType(dexItemFactory);
@@ -405,6 +409,7 @@
       virtualToDirectMethodMap.put(from, to);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public void merge(VerticalClassMergerGraphLens.Builder builder) {
       fieldMap.putAll(builder.fieldMap);
       methodMap.putAll(builder.methodMap);
diff --git a/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java b/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
index 483db26..0d7cb4a 100644
--- a/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
+++ b/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
@@ -58,6 +58,7 @@
     super(subConsumer);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ClassGraphNode getClassNode(ClassReference clazz) {
     for (GraphNode node : getTargets()) {
       if (node instanceof ClassGraphNode && ((ClassGraphNode) node).getReference() == clazz) {
@@ -67,6 +68,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public MethodGraphNode getMethodNode(MethodReference method) {
     for (GraphNode node : getTargets()) {
       if (node instanceof MethodGraphNode && ((MethodGraphNode) node).getReference() == method) {
@@ -76,6 +78,7 @@
     return null;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public FieldGraphNode getFieldNode(FieldReference field) {
     for (GraphNode node : getTargets()) {
       if (node instanceof FieldGraphNode && ((FieldGraphNode) node).getReference() == field) {
@@ -193,6 +196,7 @@
     addNodeMessage(node, formatter);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private String getNodeString(GraphNode node) {
     if (node instanceof ClassGraphNode) {
       return DescriptorUtils.descriptorToJavaType(
diff --git a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
index 162be3d..442b507 100644
--- a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
+++ b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
@@ -217,6 +217,7 @@
     return methods.containsKey(type) || classes.containsKey(type);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   boolean containsTypeOfKind(DexType type, SyntheticKind kind) {
     List<SyntheticProgramClassReference> synthetics = classes.get(type);
     if (synthetics == null) {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
index 21fd289..0b552a1 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
@@ -97,6 +97,7 @@
     this.featureSplit = featureSplit;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public boolean isSyntheticInputClass() {
     return synthesizingContextType != inputContextType;
   }
@@ -129,6 +130,7 @@
     return featureSplit;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   SynthesizingContext rewrite(NonIdentityGraphLens lens) {
     DexType rewrittenInputContextType = lens.lookupType(inputContextType);
     DexType rewrittenSynthesizingContextType = lens.lookupType(synthesizingContextType);
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
index cd6fcbf..168d05a 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticClasspathClassReference.java
@@ -34,6 +34,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   SyntheticClasspathClassReference internalRewrite(
       SynthesizingContext rewrittenContext, NonIdentityGraphLens lens) {
     assert type == lens.lookupType(type)
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
index 1ad0796..f0080f3 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
@@ -103,6 +103,7 @@
     return compareTo(other, includeContext, graphLens, classToFeatureSplitMap) == 0;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   int compareTo(
       D other,
       boolean includeContext,
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 4dcc8c9..a8a25a6 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -123,11 +123,13 @@
       return false;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void move(DexType from, DexType to) {
       DexType old = typeMap.put(from, to);
       assert old == null || old == to;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     void move(DexField from, DexField to) {
       DexField old = fieldMap.put(from, to);
       assert old == null || old == to;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 5446ed9..11ef4e3 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -187,6 +187,7 @@
       return definitions.containsKey(type);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     boolean containsTypeOfKind(DexType type, SyntheticKind kind) {
       SyntheticDefinition<?, ?, ?> definition = definitions.get(type);
       return definition != null && definition.getKind() == kind;
@@ -215,6 +216,7 @@
   private final ContextsForGlobalSynthetics globalContexts;
   private final GlobalSyntheticsStrategy globalSyntheticsStrategy;
 
+  @SuppressWarnings("ReferenceEquality")
   public Set<DexType> collectSyntheticsFromContext(DexType context) {
     Set<DexType> result = Sets.newIdentityHashSet();
     committed
@@ -407,6 +409,7 @@
     return mode.isFinal() || isSyntheticLambda(clazz);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private boolean isSyntheticLambda(DexProgramClass clazz) {
     if (!isSynthetic(clazz)) {
       return false;
@@ -1194,6 +1197,7 @@
         .computeFinalSynthetics(appView, timing);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public void reportSyntheticsInformation(SyntheticInfoConsumer consumer) {
     assert isFinalized();
     Map<DexType, DexType> seen = new IdentityHashMap<>();
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
index d2daa6c..64746c9 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
@@ -63,6 +63,7 @@
     return setName(factory.createString(name));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public SyntheticMethodBuilder setName(DexString name) {
     assert name != null;
     assert this.name == null || this.name == name;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
index 8853f7c8..e649f48 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodReference.java
@@ -52,6 +52,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   SyntheticMethodReference internalRewrite(
       SynthesizingContext rewrittenContext, NonIdentityGraphLens lens) {
     DexMethod rewritten = lens.getRenamedMethodSignature(method);
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
index 4845892..00493ed 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticProgramClassReference.java
@@ -36,6 +36,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   SyntheticProgramClassReference internalRewrite(
       SynthesizingContext rewrittenContext, NonIdentityGraphLens lens) {
     DexType rewritten = lens.lookupType(type);
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index b1d434a..f35f32b 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -215,6 +215,7 @@
       addType(field.getType(), referencedFrom);
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerMethod(ProgramMethod method) {
       DefinitionContext referencedFrom = DefinitionContextUtils.create(method);
       addTypes(method.getParameters(), referencedFrom);
@@ -244,6 +245,7 @@
       method.registerCodeReferences(new MethodUseCollector(method));
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private void registerSuperType(
         DexProgramClass clazz, DexType superType, DefinitionContext referencedFrom) {
       addType(superType, referencedFrom);
@@ -389,6 +391,7 @@
             method, resolvedMethod == null ? null : resolvedMethod.getDefinition());
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private void handleRewrittenMethodReference(
           DexMethod method, DexEncodedMethod resolvedMethod) {
         assert resolvedMethod == null
@@ -451,6 +454,7 @@
         handleRewrittenFieldReference(lookupResult.getReference());
       }
 
+      @SuppressWarnings("ReferenceEquality")
       private void handleRewrittenFieldReference(DexField field) {
         addType(field.getHolderType(), referencedFrom);
         addType(field.getType(), referencedFrom);
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
index 1a2d82b..85c637c 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
@@ -35,6 +35,7 @@
         caller, inlinee, options, NopWhyAreYouNotInliningReporter.getInstance());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isApiSafeForInlining(
       ProgramMethod caller,
       ProgramMethod inlinee,
@@ -121,6 +122,7 @@
         definition, appView.apiLevelCompute(), appView.options(), appView.dexItemFactory());
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static boolean isApiSafeForReference(
       LibraryDefinition definition,
       AndroidApiLevelCompute androidApiLevelCompute,
@@ -153,6 +155,7 @@
     return apiLevel.isLessThanOrEqualTo(apiLevelOfOriginal).isTrue();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isApiSafeForTypeStrengthening(
       DexType newType, DexType oldType, AppView<? extends AppInfoWithClassHierarchy> appView) {
     // Type strengthening only applies to reference types.
diff --git a/src/main/java/com/android/tools/r8/utils/BooleanLatticeElement.java b/src/main/java/com/android/tools/r8/utils/BooleanLatticeElement.java
index 9e955c6..3049b3f 100644
--- a/src/main/java/com/android/tools/r8/utils/BooleanLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/utils/BooleanLatticeElement.java
@@ -52,6 +52,7 @@
     return isFalse() || isUnknown();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public BooleanLatticeElement join(BooleanLatticeElement other) {
     if (this == other || other.isBottom() || isUnknown()) {
       return this;
diff --git a/src/main/java/com/android/tools/r8/utils/ClassMap.java b/src/main/java/com/android/tools/r8/utils/ClassMap.java
index 915a2f7..ea5e988 100644
--- a/src/main/java/com/android/tools/r8/utils/ClassMap.java
+++ b/src/main/java/com/android/tools/r8/utils/ClassMap.java
@@ -174,11 +174,12 @@
 
   /**
    * Forces loading of all the classes satisfying the criteria specified.
-   * <p>
-   * NOTE: after this method finishes, the class map is considered to be fully-loaded and thus
+   *
+   * <p>NOTE: after this method finishes, the class map is considered to be fully-loaded and thus
    * sealed. This has one side-effect: if we filter out some of the classes with `load` predicate,
    * these classes will never be loaded.
    */
+  @SuppressWarnings("ReferenceEquality")
   public void forceLoad(Predicate<DexType> load) {
     Set<DexType> knownClasses;
     ClassProvider<T> classProvider;
@@ -268,6 +269,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public T get() {
       if (ready) {
         return clazz;
diff --git a/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java b/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java
index 8b36c33..154fba4 100644
--- a/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java
+++ b/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java
@@ -18,6 +18,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected boolean doEquivalent(DexClassAndField field, DexClassAndField other) {
     return field.getDefinition() == other.getDefinition();
   }
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index b4282d9..73b664e 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -93,6 +93,7 @@
         AbortException.class);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static <T extends Exception, A extends Exception> T failWithFakeEntry(
       DiagnosticsHandler diagnosticsHandler,
       Throwable topMostException,
@@ -272,6 +273,7 @@
       this.position = position;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private static boolean needsAttachment(RuntimeException e, Origin origin, Position position) {
       if (origin == Origin.unknown() && position == Position.UNKNOWN) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/utils/FileUtils.java b/src/main/java/com/android/tools/r8/utils/FileUtils.java
index 347e254..c3d670c 100644
--- a/src/main/java/com/android/tools/r8/utils/FileUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/FileUtils.java
@@ -213,6 +213,7 @@
     }
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static ZipFile createZipFile(File file, Charset charset) throws IOException {
     if (!isAndroid) {
       return new ZipFile(file, charset);
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 961117a..93162ce 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2115,10 +2115,12 @@
           || enableEnumLiteProtoShrinking;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean isEnumLiteProtoShrinkingEnabled() {
       return enableEnumLiteProtoShrinking;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public boolean shouldApplyInliningToInlinee(
         AppView<?> appView, ProgramMethod inlinee, int inliningDepth) {
       if (isProtoShrinkingEnabled()) {
diff --git a/src/main/java/com/android/tools/r8/utils/ProgramClassCollection.java b/src/main/java/com/android/tools/r8/utils/ProgramClassCollection.java
index aca16a9..b177056 100644
--- a/src/main/java/com/android/tools/r8/utils/ProgramClassCollection.java
+++ b/src/main/java/com/android/tools/r8/utils/ProgramClassCollection.java
@@ -67,6 +67,7 @@
     return wrappedConflictResolver(null, reporter);
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static ProgramClassConflictResolver wrappedConflictResolver(
       ClassConflictResolver clientResolver, Reporter reporter) {
     return (a, b) -> {
@@ -99,6 +100,7 @@
             ImmutableList.of(a.getOrigin(), b.getOrigin())));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   private static DexProgramClass mergeClasses(DexProgramClass a, DexProgramClass b) {
     assert a.type == b.type;
     boolean syntheticA = a.accessFlags.isSynthetic();
diff --git a/src/main/java/com/android/tools/r8/utils/ProgramMethodEquivalence.java b/src/main/java/com/android/tools/r8/utils/ProgramMethodEquivalence.java
index 91553b8..cdb98b8 100644
--- a/src/main/java/com/android/tools/r8/utils/ProgramMethodEquivalence.java
+++ b/src/main/java/com/android/tools/r8/utils/ProgramMethodEquivalence.java
@@ -18,6 +18,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   protected boolean doEquivalent(ProgramMethod method, ProgramMethod other) {
     return method.getDefinition() == other.getDefinition();
   }
diff --git a/src/main/java/com/android/tools/r8/utils/ValueUtils.java b/src/main/java/com/android/tools/r8/utils/ValueUtils.java
index 8121493..60b2e4e 100644
--- a/src/main/java/com/android/tools/r8/utils/ValueUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ValueUtils.java
@@ -13,12 +13,14 @@
 
 public class ValueUtils {
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isStringBuilder(Value value, DexItemFactory dexItemFactory) {
     TypeElement type = value.getType();
     return type.isClassType()
         && type.asClassType().getClassType() == dexItemFactory.stringBuilderType;
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static boolean isNonNullStringBuilder(Value value, DexItemFactory dexItemFactory) {
     while (true) {
       if (value.isPhi()) {
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
index a53de2f..1147830 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
@@ -86,6 +86,7 @@
     return add(new ProgramMethod(clazz, definition));
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public ProgramMethodSet rewrittenWithLens(DexDefinitionSupplier definitions, GraphLens lens) {
     GraphLens appliedLens = GraphLens.getIdentityLens();
     List<ProgramMethod> elementsToRemove = null;
diff --git a/src/main/java/com/android/tools/r8/utils/positions/DexPositionToNoPcMappedRangeMapper.java b/src/main/java/com/android/tools/r8/utils/positions/DexPositionToNoPcMappedRangeMapper.java
index e80a0a7..8e0fcbb 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/DexPositionToNoPcMappedRangeMapper.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/DexPositionToNoPcMappedRangeMapper.java
@@ -117,6 +117,7 @@
 
     // A default event denotes a line table entry and must always be emitted. Remap its line.
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public void visit(Default defaultEvent) {
       super.visit(defaultEvent);
       assert getCurrentLine() >= 0;
diff --git a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
index 881fbe2..68968a8 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
@@ -99,6 +99,7 @@
         || newMapVersion.isUnknown();
   }
 
+  @SuppressWarnings("ReferenceEquality")
   public static ClassNameMapper run(
       AppView<?> appView,
       AndroidApp inputApp,
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index 543e7d9..f272a71 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -187,6 +187,7 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private MappedPositionToClassNamingBuilder addFields() {
       MapVersion mapFileVersion = appView.options().getMapFileVersion();
       clazz.forEachField(
@@ -216,6 +217,7 @@
       return this;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     public MappedPositionToClassNamingBuilder addMappedPositions(
         ProgramMethod method,
         List<MappedPosition> mappedPositions,
@@ -476,6 +478,7 @@
       return outermostCaller.isOutline() ? outermostCaller.getMethod() : null;
     }
 
+    @SuppressWarnings("ReferenceEquality")
     private boolean isIdentityMapping(
         MapVersion mapFileVersion,
         List<MappedPosition> mappedPositions,
diff --git a/src/main/java/com/android/tools/r8/utils/positions/PositionRemapper.java b/src/main/java/com/android/tools/r8/utils/positions/PositionRemapper.java
index 861c9dc..1d7e99f 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/PositionRemapper.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/PositionRemapper.java
@@ -77,6 +77,7 @@
     }
 
     @Override
+    @SuppressWarnings("ReferenceEquality")
     public Pair<Position, Position> createRemappedPosition(Position position) {
       assert position.getMethod() != null;
       if (previousMethod == position.getMethod()) {
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
index 6ccce86..35c709c 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithNamingLens.java
@@ -31,6 +31,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexType(DexType type1, DexType type2) {
     if (type1 == type2) {
       return 0;
@@ -42,6 +43,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexField(DexField field1, DexField field2) {
     if (field1 == field2) {
       return 0;
@@ -58,6 +60,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexMethod(DexMethod method1, DexMethod method2) {
     if (method1 == method2) {
       return 0;
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
index 398e32f..5ed2d5c 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithStringTable.java
@@ -18,6 +18,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexString(DexString string1, DexString string2) {
     if (string1 == string2) {
       return 0;
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
index f139bc9..152e8c7 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeEquivalence.java
@@ -28,6 +28,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexType(DexType type1, DexType type2) {
     if (type1 == type2) {
       return 0;
diff --git a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
index 2ec2980..a4ae2d4 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/CompareToVisitorWithTypeTable.java
@@ -21,6 +21,7 @@
   }
 
   @Override
+  @SuppressWarnings("ReferenceEquality")
   public int visitDexType(DexType type1, DexType type2) {
     if (type1 == type2) {
       return 0;