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;
