Fix join of interface

Before we would join null and I (in the test) to Object for the frame of the invoke.

Bug: b/337798768
Change-Id: I16df47ac08fb138e8ffe4b6cf98bde3bde5a9338
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 fee91ad..a081d34 100644
--- a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
 import com.android.tools.r8.ir.analysis.type.Nullability;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.Argument;
@@ -189,7 +190,12 @@
     }
     // All types are reference types so the join is either a class or an array.
     if (result.isClassType()) {
-      return result.asClassType().getClassType();
+      ClassTypeElement classType = result.asClassType();
+      if (classType.getClassType().isIdenticalTo(appView.dexItemFactory().objectType)
+          && classType.getInterfaces().hasSingleKnownInterface()) {
+        return classType.getInterfaces().getSingleKnownInterface();
+      }
+      return classType.getClassType();
     } else if (result.isArrayType()) {
       return result.asArrayType().toDexType(appView.dexItemFactory());
     }
diff --git a/src/test/java/com/android/tools/r8/regress/Regress337798768.java b/src/test/java/com/android/tools/r8/regress/Regress337798768.java
index 567db5a..02bb4c4 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress337798768.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress337798768.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.regress;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -25,15 +24,16 @@
     this.parameters = parameters;
   }
 
-  // TODO(b/337798768): should not fail verification
-  @Test(expected = CompilationFailedException.class)
+  @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(TestClass.class)
         .addOptionsModification(o -> o.testing.enableStrictFrameVerification = true)
         .addKeepClassAndMembersRules(A.class, B.class, I.class)
-        .compile();
+        .compile()
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("foobar");
   }
 
   interface I {