Merge "test: Modify 633-checker-rtp-getclass for javac/dx"
diff --git a/test/633-checker-rtp-getclass/build b/test/633-checker-rtp-getclass/build
new file mode 100755
index 0000000..49292c9
--- /dev/null
+++ b/test/633-checker-rtp-getclass/build
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This checker test is incompatible with jack bytecode output,
+# so force it to use javac/dx.
+export USE_JACK=false
+# Also disable desugar because it is missing in jack platform builds.
+export DESUGAR=false
+
+./default-build "$@"
diff --git a/test/633-checker-rtp-getclass/smali/SmaliTests.smali b/test/633-checker-rtp-getclass/smali/SmaliTests.smali
new file mode 100644
index 0000000..9ea0449
--- /dev/null
+++ b/test/633-checker-rtp-getclass/smali/SmaliTests.smali
@@ -0,0 +1,65 @@
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+.class public LSmaliTests;
+.super Ljava/lang/Object;
+
+# Checker test to make sure the only inlined instruction is SubMain.bar.
+
+## CHECK-START: int SmaliTests.$opt$noinline$foo(Main) inliner (after)
+## CHECK-DAG:                InvokeVirtual method_name:Main.foo
+## CHECK-DAG: <<Const:i\d+>> IntConstant 3
+## CHECK:                    begin_block
+## CHECK:                    BoundType klass:SubMain
+## CHECK:                    Return [<<Const>>]
+## CHECK-NOT:                begin_block
+## CHECK:                    end_block
+.method public static $opt$noinline$foo(LMain;)I
+    .registers 3
+    .param p0, "o"    # LMain;
+    .prologue
+
+    # if (doThrow) { throw new Error(); }
+    sget-boolean v0, LMain;->doThrow:Z
+    if-eqz v0, :doThrow_false
+    new-instance v0, Ljava/lang/Error;
+    invoke-direct {v0}, Ljava/lang/Error;-><init>()V
+    throw v0
+
+  :doThrow_false
+    # if (o.getClass() == Main.class || o.getClass() != SubMain.class)
+    invoke-virtual {p0}, LMain;->getClass()Ljava/lang/Class;
+    move-result-object v0
+    const-class v1, LMain;
+    if-eq v0, v1, :class_is_Main_and_not_SubMain
+
+    invoke-virtual {p0}, LMain;->getClass()Ljava/lang/Class;
+    move-result-object v0
+    const-class v1, LSubMain;
+    if-eq v0, v1, :else
+
+  :class_is_Main_and_not_SubMain
+    # return o.foo()
+    invoke-virtual {p0}, LMain;->foo()I
+    move-result v0
+    return v0
+
+  :else
+    # return o.bar()
+    invoke-virtual {p0}, LMain;->bar()I
+    move-result v0
+    return v0
+.end method
+
+
diff --git a/test/633-checker-rtp-getclass/src/Main.java b/test/633-checker-rtp-getclass/src/Main.java
index f29c139..d1145af 100644
--- a/test/633-checker-rtp-getclass/src/Main.java
+++ b/test/633-checker-rtp-getclass/src/Main.java
@@ -14,34 +14,13 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Method;
+
 public class Main {
   public static void main(String[] args) {
-    System.out.println($opt$noinline$foo(new Main()));
-    System.out.println($opt$noinline$foo(new SubMain()));
-    System.out.println($opt$noinline$foo(new SubSubMain()));
-  }
-
-
-  // Checker test to make sure the only inlined instruction is
-  // SubMain.bar.
-  /// CHECK-START: int Main.$opt$noinline$foo(Main) inliner (after)
-  /// CHECK-DAG:                InvokeVirtual method_name:Main.foo
-  /// CHECK-DAG: <<Const:i\d+>> IntConstant 3
-  /// CHECK:                    begin_block
-  /// CHECK:                    BoundType klass:SubMain
-  /// CHECK:                    Return [<<Const>>]
-  /// CHECK-NOT:                begin_block
-  /// CHECK:                    end_block
-  public static int $opt$noinline$foo(Main o) {
-    if (doThrow) { throw new Error(); }
-    // To exercise the bug on Jack, we need two getClass compares.
-    if (o.getClass() == Main.class || o.getClass() != SubMain.class) {
-      return o.foo();
-    } else {
-      // We used to wrongly bound the type of o to `Main` here and then realize that's
-      // impossible and mark this branch as dead.
-      return o.bar();
-    }
+    System.out.println($noinline$runSmaliTest("$opt$noinline$foo", new Main()));
+    System.out.println($noinline$runSmaliTest("$opt$noinline$foo", new SubMain()));
+    System.out.println($noinline$runSmaliTest("$opt$noinline$foo", new SubSubMain()));
   }
 
   public int bar() {
@@ -53,6 +32,16 @@
   }
 
   public static boolean doThrow = false;
+
+  public static int $noinline$runSmaliTest(String name, Main input) {
+    try {
+      Class<?> c = Class.forName("SmaliTests");
+      Method m = c.getMethod(name, Main.class);
+      return (Integer) m.invoke(null, input);
+    } catch (Exception ex) {
+      throw new Error(ex);
+    }
+  }
 }
 
 class SubMain extends Main {
diff --git a/test/knownfailures.json b/test/knownfailures.json
index 640eda1..c4a28a1 100644
--- a/test/knownfailures.json
+++ b/test/knownfailures.json
@@ -602,8 +602,7 @@
     },
     {
         "tests": [
-            "567-checker-compare",
-            "633-checker-rtp-getclass"
+            "567-checker-compare"
         ],
         "description": "Checker tests failing when run with --build-with-javac-dx.",
         "env_vars": {"ANDROID_COMPILE_WITH_JACK": "false"},