diff --git a/test/442-checker-constant-folding/build b/test/442-checker-constant-folding/build
new file mode 100755
index 0000000..49292c9
--- /dev/null
+++ b/test/442-checker-constant-folding/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/442-checker-constant-folding/src/Main.java b/test/442-checker-constant-folding/src/Main.java
index 64180d5..eba5137 100644
--- a/test/442-checker-constant-folding/src/Main.java
+++ b/test/442-checker-constant-folding/src/Main.java
@@ -27,12 +27,6 @@
     }
   }
 
-  public static void assertTrue(boolean condition) {
-    if (!condition) {
-      throw new Error();
-    }
-  }
-
   public static void assertIntEquals(int expected, int result) {
     if (expected != result) {
       throw new Error("Expected: " + expected + ", found: " + result);
@@ -57,21 +51,6 @@
     }
   }
 
-  private static int $inline$int(int x) {
-    return x;
-  }
-
-  private static long $inline$long(long x) {
-    return x;
-  }
-
-  private static float $inline$float(float x) {
-    return x;
-  }
-
-  private static double $inline$double(double x) {
-    return x;
-  }
 
   // Wrappers around methods located in file TestCmp.smali.
 
@@ -215,119 +194,121 @@
     return y;
   }
 
+
   /**
    * Exercise constant folding on addition.
    */
 
-  /// CHECK-START: int Main.IntAddition1() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntAddition1() constant_folding (before)
   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<Const1>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Add>>]
 
-  /// CHECK-START: int Main.IntAddition1() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntAddition1() constant_folding (after)
   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
   /// CHECK-DAG:                      Return [<<Const3>>]
 
-  /// CHECK-START: int Main.IntAddition1() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntAddition1() constant_folding (after)
   /// CHECK-NOT:                      Add
 
   public static int IntAddition1() {
     int a, b, c;
-    a = $inline$int(1);
-    b = $inline$int(2);
+    a = 1;
+    b = 2;
     c = a + b;
     return c;
   }
 
-  /// CHECK-START: int Main.IntAddition2() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntAddition2() constant_folding (before)
   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   /// CHECK-DAG:     <<Const5:i\d+>>  IntConstant 5
   /// CHECK-DAG:     <<Const6:i\d+>>  IntConstant 6
+  /// CHECK-DAG:     <<Const11:i\d+>> IntConstant 11
   /// CHECK-DAG:     <<Add1:i\d+>>    Add [<<Const1>>,<<Const2>>]
-  /// CHECK-DAG:     <<Add2:i\d+>>    Add [<<Const5>>,<<Const6>>]
-  /// CHECK-DAG:     <<Add3:i\d+>>    Add [<<Add1>>,<<Add2>>]
+  /// CHECK-DAG:                      Add [<<Const5>>,<<Const6>>]
+  /// CHECK-DAG:     <<Add3:i\d+>>    Add [<<Add1>>,<<Const11>>]
   /// CHECK-DAG:                      Return [<<Add3>>]
 
-  /// CHECK-START: int Main.IntAddition2() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntAddition2() constant_folding (after)
   /// CHECK-DAG:     <<Const14:i\d+>> IntConstant 14
   /// CHECK-DAG:                      Return [<<Const14>>]
 
-  /// CHECK-START: int Main.IntAddition2() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntAddition2() constant_folding (after)
   /// CHECK-NOT:                      Add
 
   public static int IntAddition2() {
     int a, b, c;
-    a = $inline$int(1);
-    b = $inline$int(2);
+    a = 1;
+    b = 2;
     a += b;
-    b = $inline$int(5);
-    c = $inline$int(6);
+    b = 5;
+    c = 6;
     b += c;
     c = a + b;
     return c;
   }
 
-  /// CHECK-START: long Main.LongAddition() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.LongAddition() constant_folding (before)
   /// CHECK-DAG:     <<Const1:j\d+>>  LongConstant 1
   /// CHECK-DAG:     <<Const2:j\d+>>  LongConstant 2
   /// CHECK-DAG:     <<Add:j\d+>>     Add [<<Const1>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Add>>]
 
-  /// CHECK-START: long Main.LongAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongAddition() constant_folding (after)
   /// CHECK-DAG:     <<Const3:j\d+>>  LongConstant 3
   /// CHECK-DAG:                      Return [<<Const3>>]
 
-  /// CHECK-START: long Main.LongAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongAddition() constant_folding (after)
   /// CHECK-NOT:                      Add
 
   public static long LongAddition() {
     long a, b, c;
-    a = $inline$long(1L);
-    b = $inline$long(2L);
+    a = 1L;
+    b = 2L;
     c = a + b;
     return c;
   }
 
-  /// CHECK-START: float Main.FloatAddition() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.FloatAddition() constant_folding (before)
   /// CHECK-DAG:     <<Const1:f\d+>>  FloatConstant 1
   /// CHECK-DAG:     <<Const2:f\d+>>  FloatConstant 2
   /// CHECK-DAG:     <<Add:f\d+>>     Add [<<Const1>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Add>>]
 
-  /// CHECK-START: float Main.FloatAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatAddition() constant_folding (after)
   /// CHECK-DAG:     <<Const3:f\d+>>  FloatConstant 3
   /// CHECK-DAG:                      Return [<<Const3>>]
 
-  /// CHECK-START: float Main.FloatAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatAddition() constant_folding (after)
   /// CHECK-NOT:                      Add
 
   public static float FloatAddition() {
     float a, b, c;
-    a = $inline$float(1F);
-    b = $inline$float(2F);
+    a = 1F;
+    b = 2F;
     c = a + b;
     return c;
   }
 
-  /// CHECK-START: double Main.DoubleAddition() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.DoubleAddition() constant_folding (before)
   /// CHECK-DAG:     <<Const1:d\d+>>  DoubleConstant 1
   /// CHECK-DAG:     <<Const2:d\d+>>  DoubleConstant 2
   /// CHECK-DAG:     <<Add:d\d+>>     Add [<<Const1>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Add>>]
 
-  /// CHECK-START: double Main.DoubleAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleAddition() constant_folding (after)
   /// CHECK-DAG:     <<Const3:d\d+>>  DoubleConstant 3
   /// CHECK-DAG:                      Return [<<Const3>>]
 
-  /// CHECK-START: double Main.DoubleAddition() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleAddition() constant_folding (after)
   /// CHECK-NOT:                      Add
 
   public static double DoubleAddition() {
     double a, b, c;
-    a = $inline$double(1D);
-    b = $inline$double(2D);
+    a = 1D;
+    b = 2D;
     c = a + b;
     return c;
   }
@@ -337,86 +318,86 @@
    * Exercise constant folding on subtraction.
    */
 
-  /// CHECK-START: int Main.IntSubtraction() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntSubtraction() constant_folding (before)
   /// CHECK-DAG:     <<Const6:i\d+>>  IntConstant 6
   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<Const6>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Sub>>]
 
-  /// CHECK-START: int Main.IntSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntSubtraction() constant_folding (after)
   /// CHECK-DAG:     <<Const4:i\d+>>  IntConstant 4
   /// CHECK-DAG:                      Return [<<Const4>>]
 
-  /// CHECK-START: int Main.IntSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntSubtraction() constant_folding (after)
   /// CHECK-NOT:                      Sub
 
   public static int IntSubtraction() {
     int a, b, c;
-    a = $inline$int(6);
-    b = $inline$int(2);
+    a = 6;
+    b = 2;
     c = a - b;
     return c;
   }
 
-  /// CHECK-START: long Main.LongSubtraction() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.LongSubtraction() constant_folding (before)
   /// CHECK-DAG:     <<Const6:j\d+>>  LongConstant 6
   /// CHECK-DAG:     <<Const2:j\d+>>  LongConstant 2
   /// CHECK-DAG:     <<Sub:j\d+>>     Sub [<<Const6>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Sub>>]
 
-  /// CHECK-START: long Main.LongSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongSubtraction() constant_folding (after)
   /// CHECK-DAG:     <<Const4:j\d+>>  LongConstant 4
   /// CHECK-DAG:                      Return [<<Const4>>]
 
-  /// CHECK-START: long Main.LongSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongSubtraction() constant_folding (after)
   /// CHECK-NOT:                      Sub
 
   public static long LongSubtraction() {
     long a, b, c;
-    a = $inline$long(6L);
-    b = $inline$long(2L);
+    a = 6L;
+    b = 2L;
     c = a - b;
     return c;
   }
 
-  /// CHECK-START: float Main.FloatSubtraction() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.FloatSubtraction() constant_folding (before)
   /// CHECK-DAG:     <<Const6:f\d+>>  FloatConstant 6
   /// CHECK-DAG:     <<Const2:f\d+>>  FloatConstant 2
   /// CHECK-DAG:     <<Sub:f\d+>>     Sub [<<Const6>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Sub>>]
 
-  /// CHECK-START: float Main.FloatSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatSubtraction() constant_folding (after)
   /// CHECK-DAG:     <<Const4:f\d+>>  FloatConstant 4
   /// CHECK-DAG:                      Return [<<Const4>>]
 
-  /// CHECK-START: float Main.FloatSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatSubtraction() constant_folding (after)
   /// CHECK-NOT:                      Sub
 
   public static float FloatSubtraction() {
     float a, b, c;
-    a = $inline$float(6F);
-    b = $inline$float(2F);
+    a = 6F;
+    b = 2F;
     c = a - b;
     return c;
   }
 
-  /// CHECK-START: double Main.DoubleSubtraction() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.DoubleSubtraction() constant_folding (before)
   /// CHECK-DAG:     <<Const6:d\d+>>  DoubleConstant 6
   /// CHECK-DAG:     <<Const2:d\d+>>  DoubleConstant 2
   /// CHECK-DAG:     <<Sub:d\d+>>     Sub [<<Const6>>,<<Const2>>]
   /// CHECK-DAG:                      Return [<<Sub>>]
 
-  /// CHECK-START: double Main.DoubleSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleSubtraction() constant_folding (after)
   /// CHECK-DAG:     <<Const4:d\d+>>  DoubleConstant 4
   /// CHECK-DAG:                      Return [<<Const4>>]
 
-  /// CHECK-START: double Main.DoubleSubtraction() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleSubtraction() constant_folding (after)
   /// CHECK-NOT:                      Sub
 
   public static double DoubleSubtraction() {
     double a, b, c;
-    a = $inline$double(6D);
-    b = $inline$double(2D);
+    a = 6D;
+    b = 2D;
     c = a - b;
     return c;
   }
@@ -426,86 +407,86 @@
    * Exercise constant folding on multiplication.
    */
 
-  /// CHECK-START: int Main.IntMultiplication() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntMultiplication() constant_folding (before)
   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
   /// CHECK-DAG:     <<Mul:i\d+>>     Mul [<<Const7>>,<<Const3>>]
   /// CHECK-DAG:                      Return [<<Mul>>]
 
-  /// CHECK-START: int Main.IntMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntMultiplication() constant_folding (after)
   /// CHECK-DAG:     <<Const21:i\d+>> IntConstant 21
   /// CHECK-DAG:                      Return [<<Const21>>]
 
-  /// CHECK-START: int Main.IntMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntMultiplication() constant_folding (after)
   /// CHECK-NOT:                      Mul
 
   public static int IntMultiplication() {
     int a, b, c;
-    a = $inline$int(7);
-    b = $inline$int(3);
+    a = 7;
+    b = 3;
     c = a * b;
     return c;
   }
 
-  /// CHECK-START: long Main.LongMultiplication() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.LongMultiplication() constant_folding (before)
   /// CHECK-DAG:     <<Const7:j\d+>>  LongConstant 7
   /// CHECK-DAG:     <<Const3:j\d+>>  LongConstant 3
   /// CHECK-DAG:     <<Mul:j\d+>>     Mul [<<Const7>>,<<Const3>>]
   /// CHECK-DAG:                      Return [<<Mul>>]
 
-  /// CHECK-START: long Main.LongMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongMultiplication() constant_folding (after)
   /// CHECK-DAG:     <<Const21:j\d+>> LongConstant 21
   /// CHECK-DAG:                      Return [<<Const21>>]
 
-  /// CHECK-START: long Main.LongMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongMultiplication() constant_folding (after)
   /// CHECK-NOT:                      Mul
 
   public static long LongMultiplication() {
     long a, b, c;
-    a = $inline$long(7L);
-    b = $inline$long(3L);
+    a = 7L;
+    b = 3L;
     c = a * b;
     return c;
   }
 
-  /// CHECK-START: float Main.FloatMultiplication() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.FloatMultiplication() constant_folding (before)
   /// CHECK-DAG:     <<Const7:f\d+>>  FloatConstant 7
   /// CHECK-DAG:     <<Const3:f\d+>>  FloatConstant 3
   /// CHECK-DAG:     <<Mul:f\d+>>     Mul [<<Const7>>,<<Const3>>]
   /// CHECK-DAG:                      Return [<<Mul>>]
 
-  /// CHECK-START: float Main.FloatMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatMultiplication() constant_folding (after)
   /// CHECK-DAG:     <<Const21:f\d+>> FloatConstant 21
   /// CHECK-DAG:                      Return [<<Const21>>]
 
-  /// CHECK-START: float Main.FloatMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatMultiplication() constant_folding (after)
   /// CHECK-NOT:                      Mul
 
   public static float FloatMultiplication() {
     float a, b, c;
-    a = $inline$float(7F);
-    b = $inline$float(3F);
+    a = 7F;
+    b = 3F;
     c = a * b;
     return c;
   }
 
-  /// CHECK-START: double Main.DoubleMultiplication() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.DoubleMultiplication() constant_folding (before)
   /// CHECK-DAG:     <<Const7:d\d+>>  DoubleConstant 7
   /// CHECK-DAG:     <<Const3:d\d+>>  DoubleConstant 3
   /// CHECK-DAG:     <<Mul:d\d+>>     Mul [<<Const7>>,<<Const3>>]
   /// CHECK-DAG:                      Return [<<Mul>>]
 
-  /// CHECK-START: double Main.DoubleMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleMultiplication() constant_folding (after)
   /// CHECK-DAG:     <<Const21:d\d+>> DoubleConstant 21
   /// CHECK-DAG:                      Return [<<Const21>>]
 
-  /// CHECK-START: double Main.DoubleMultiplication() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleMultiplication() constant_folding (after)
   /// CHECK-NOT:                      Mul
 
   public static double DoubleMultiplication() {
     double a, b, c;
-    a = $inline$double(7D);
-    b = $inline$double(3D);
+    a = 7D;
+    b = 3D;
     c = a * b;
     return c;
   }
@@ -515,90 +496,90 @@
    * Exercise constant folding on division.
    */
 
-  /// CHECK-START: int Main.IntDivision() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntDivision() constant_folding (before)
   /// CHECK-DAG:     <<Const8:i\d+>>   IntConstant 8
   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
   /// CHECK-DAG:     <<Div0Chk:i\d+>>  DivZeroCheck [<<Const3>>]
   /// CHECK-DAG:     <<Div:i\d+>>      Div [<<Const8>>,<<Div0Chk>>]
   /// CHECK-DAG:                       Return [<<Div>>]
 
-  /// CHECK-START: int Main.IntDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntDivision() constant_folding (after)
   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: int Main.IntDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntDivision() constant_folding (after)
   /// CHECK-NOT:                       DivZeroCheck
   /// CHECK-NOT:                       Div
 
   public static int IntDivision() {
     int a, b, c;
-    a = $inline$int(8);
-    b = $inline$int(3);
+    a = 8;
+    b = 3;
     c = a / b;
     return c;
   }
 
-  /// CHECK-START: long Main.LongDivision() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.LongDivision() constant_folding (before)
   /// CHECK-DAG:     <<Const8:j\d+>>   LongConstant 8
   /// CHECK-DAG:     <<Const3:j\d+>>   LongConstant 3
   /// CHECK-DAG:     <<Div0Chk:j\d+>>  DivZeroCheck [<<Const3>>]
   /// CHECK-DAG:     <<Div:j\d+>>      Div [<<Const8>>,<<Div0Chk>>]
   /// CHECK-DAG:                       Return [<<Div>>]
 
-  /// CHECK-START: long Main.LongDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongDivision() constant_folding (after)
   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: long Main.LongDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongDivision() constant_folding (after)
   /// CHECK-NOT:                       DivZeroCheck
   /// CHECK-NOT:                       Div
 
   public static long LongDivision() {
     long a, b, c;
-    a = $inline$long(8L);
-    b = $inline$long(3L);
+    a = 8L;
+    b = 3L;
     c = a / b;
     return c;
   }
 
-  /// CHECK-START: float Main.FloatDivision() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.FloatDivision() constant_folding (before)
   /// CHECK-DAG:     <<Const8:f\d+>>   FloatConstant 8
   /// CHECK-DAG:     <<Const2P5:f\d+>> FloatConstant 2.5
   /// CHECK-DAG:     <<Div:f\d+>>      Div [<<Const8>>,<<Const2P5>>]
   /// CHECK-DAG:                       Return [<<Div>>]
 
-  /// CHECK-START: float Main.FloatDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatDivision() constant_folding (after)
   /// CHECK-DAG:     <<Const3P2:f\d+>> FloatConstant 3.2
   /// CHECK-DAG:                       Return [<<Const3P2>>]
 
-  /// CHECK-START: float Main.FloatDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatDivision() constant_folding (after)
   /// CHECK-NOT:                       Div
 
   public static float FloatDivision() {
     float a, b, c;
-    a = $inline$float(8F);
-    b = $inline$float(2.5F);
+    a = 8F;
+    b = 2.5F;
     c = a / b;
     return c;
   }
 
-  /// CHECK-START: double Main.DoubleDivision() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.DoubleDivision() constant_folding (before)
   /// CHECK-DAG:     <<Const8:d\d+>>   DoubleConstant 8
   /// CHECK-DAG:     <<Const2P5:d\d+>> DoubleConstant 2.5
   /// CHECK-DAG:     <<Div:d\d+>>      Div [<<Const8>>,<<Const2P5>>]
   /// CHECK-DAG:                       Return [<<Div>>]
 
-  /// CHECK-START: double Main.DoubleDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleDivision() constant_folding (after)
   /// CHECK-DAG:     <<Const3P2:d\d+>> DoubleConstant 3.2
   /// CHECK-DAG:                       Return [<<Const3P2>>]
 
-  /// CHECK-START: double Main.DoubleDivision() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleDivision() constant_folding (after)
   /// CHECK-NOT:                       Div
 
   public static double DoubleDivision() {
     double a, b, c;
-    a = $inline$double(8D);
-    b = $inline$double(2.5D);
+    a = 8D;
+    b = 2.5D;
     c = a / b;
     return c;
   }
@@ -608,90 +589,90 @@
    * Exercise constant folding on remainder.
    */
 
-  /// CHECK-START: int Main.IntRemainder() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.IntRemainder() constant_folding (before)
   /// CHECK-DAG:     <<Const8:i\d+>>   IntConstant 8
   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
   /// CHECK-DAG:     <<Div0Chk:i\d+>>  DivZeroCheck [<<Const3>>]
   /// CHECK-DAG:     <<Rem:i\d+>>      Rem [<<Const8>>,<<Div0Chk>>]
   /// CHECK-DAG:                       Return [<<Rem>>]
 
-  /// CHECK-START: int Main.IntRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntRemainder() constant_folding (after)
   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: int Main.IntRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.IntRemainder() constant_folding (after)
   /// CHECK-NOT:                       DivZeroCheck
   /// CHECK-NOT:                       Rem
 
   public static int IntRemainder() {
     int a, b, c;
-    a = $inline$int(8);
-    b = $inline$int(3);
+    a = 8;
+    b = 3;
     c = a % b;
     return c;
   }
 
-  /// CHECK-START: long Main.LongRemainder() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.LongRemainder() constant_folding (before)
   /// CHECK-DAG:     <<Const8:j\d+>>   LongConstant 8
   /// CHECK-DAG:     <<Const3:j\d+>>   LongConstant 3
   /// CHECK-DAG:     <<Div0Chk:j\d+>>  DivZeroCheck [<<Const3>>]
   /// CHECK-DAG:     <<Rem:j\d+>>      Rem [<<Const8>>,<<Div0Chk>>]
   /// CHECK-DAG:                       Return [<<Rem>>]
 
-  /// CHECK-START: long Main.LongRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongRemainder() constant_folding (after)
   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: long Main.LongRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.LongRemainder() constant_folding (after)
   /// CHECK-NOT:                       DivZeroCheck
   /// CHECK-NOT:                       Rem
 
   public static long LongRemainder() {
     long a, b, c;
-    a = $inline$long(8L);
-    b = $inline$long(3L);
+    a = 8L;
+    b = 3L;
     c = a % b;
     return c;
   }
 
-  /// CHECK-START: float Main.FloatRemainder() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.FloatRemainder() constant_folding (before)
   /// CHECK-DAG:     <<Const8:f\d+>>   FloatConstant 8
   /// CHECK-DAG:     <<Const2P5:f\d+>> FloatConstant 2.5
   /// CHECK-DAG:     <<Rem:f\d+>>      Rem [<<Const8>>,<<Const2P5>>]
   /// CHECK-DAG:                       Return [<<Rem>>]
 
-  /// CHECK-START: float Main.FloatRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatRemainder() constant_folding (after)
   /// CHECK-DAG:     <<Const0P5:f\d+>> FloatConstant 0.5
   /// CHECK-DAG:                       Return [<<Const0P5>>]
 
-  /// CHECK-START: float Main.FloatRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.FloatRemainder() constant_folding (after)
   /// CHECK-NOT:                       Rem
 
   public static float FloatRemainder() {
     float a, b, c;
-    a = $inline$float(8F);
-    b = $inline$float(2.5F);
+    a = 8F;
+    b = 2.5F;
     c = a % b;
     return c;
   }
 
-  /// CHECK-START: double Main.DoubleRemainder() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.DoubleRemainder() constant_folding (before)
   /// CHECK-DAG:     <<Const8:d\d+>>   DoubleConstant 8
   /// CHECK-DAG:     <<Const2P5:d\d+>> DoubleConstant 2.5
   /// CHECK-DAG:     <<Rem:d\d+>>      Rem [<<Const8>>,<<Const2P5>>]
   /// CHECK-DAG:                       Return [<<Rem>>]
 
-  /// CHECK-START: double Main.DoubleRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleRemainder() constant_folding (after)
   /// CHECK-DAG:     <<Const0P5:d\d+>> DoubleConstant 0.5
   /// CHECK-DAG:                       Return [<<Const0P5>>]
 
-  /// CHECK-START: double Main.DoubleRemainder() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.DoubleRemainder() constant_folding (after)
   /// CHECK-NOT:                       Rem
 
   public static double DoubleRemainder() {
     double a, b, c;
-    a = $inline$double(8D);
-    b = $inline$double(2.5D);
+    a = 8D;
+    b = 2.5D;
     c = a % b;
     return c;
   }
@@ -701,42 +682,42 @@
    * Exercise constant folding on left shift.
    */
 
-  /// CHECK-START: int Main.ShlIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.ShlIntLong() constant_folding (before)
   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
   /// CHECK-DAG:     <<Shl:i\d+>>      Shl [<<Const1>>,<<TypeConv>>]
   /// CHECK-DAG:                       Return [<<Shl>>]
 
-  /// CHECK-START: int Main.ShlIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ShlIntLong() constant_folding (after)
   /// CHECK-DAG:     <<Const4:i\d+>>   IntConstant 4
   /// CHECK-DAG:                       Return [<<Const4>>]
 
-  /// CHECK-START: int Main.ShlIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ShlIntLong() constant_folding (after)
   /// CHECK-NOT:                       Shl
 
   public static int ShlIntLong() {
-    int lhs = $inline$int(1);
-    long rhs = $inline$long(2L);
+    int lhs = 1;
+    long rhs = 2;
     return lhs << rhs;
   }
 
-  /// CHECK-START: long Main.ShlLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.ShlLongInt() constant_folding (before)
   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
   /// CHECK-DAG:     <<Shl:j\d+>>      Shl [<<Const3L>>,<<Const2>>]
   /// CHECK-DAG:                       Return [<<Shl>>]
 
-  /// CHECK-START: long Main.ShlLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ShlLongInt() constant_folding (after)
   /// CHECK-DAG:     <<Const12L:j\d+>> LongConstant 12
   /// CHECK-DAG:                       Return [<<Const12L>>]
 
-  /// CHECK-START: long Main.ShlLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ShlLongInt() constant_folding (after)
   /// CHECK-NOT:                       Shl
 
   public static long ShlLongInt() {
-    long lhs = $inline$long(3L);
-    int rhs = $inline$int(2);
+    long lhs = 3;
+    int rhs = 2;
     return lhs << rhs;
   }
 
@@ -745,42 +726,42 @@
    * Exercise constant folding on right shift.
    */
 
-  /// CHECK-START: int Main.ShrIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.ShrIntLong() constant_folding (before)
   /// CHECK-DAG:     <<Const7:i\d+>>   IntConstant 7
   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
   /// CHECK-DAG:     <<Shr:i\d+>>      Shr [<<Const7>>,<<TypeConv>>]
   /// CHECK-DAG:                       Return [<<Shr>>]
 
-  /// CHECK-START: int Main.ShrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ShrIntLong() constant_folding (after)
   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
   /// CHECK-DAG:                       Return [<<Const1>>]
 
-  /// CHECK-START: int Main.ShrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ShrIntLong() constant_folding (after)
   /// CHECK-NOT:                       Shr
 
   public static int ShrIntLong() {
-    int lhs = $inline$int(7);
-    long rhs = $inline$long(2L);
+    int lhs = 7;
+    long rhs = 2;
     return lhs >> rhs;
   }
 
-  /// CHECK-START: long Main.ShrLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.ShrLongInt() constant_folding (before)
   /// CHECK-DAG:     <<Const9L:j\d+>>  LongConstant 9
   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
   /// CHECK-DAG:     <<Shr:j\d+>>      Shr [<<Const9L>>,<<Const2>>]
   /// CHECK-DAG:                       Return [<<Shr>>]
 
-  /// CHECK-START: long Main.ShrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ShrLongInt() constant_folding (after)
   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
   /// CHECK-DAG:                       Return [<<Const2L>>]
 
-  /// CHECK-START: long Main.ShrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ShrLongInt() constant_folding (after)
   /// CHECK-NOT:                       Shr
 
   public static long ShrLongInt() {
-    long lhs = $inline$long(9);
-    int rhs = $inline$int(2);
+    long lhs = 9;
+    int rhs = 2;
     return lhs >> rhs;
   }
 
@@ -789,42 +770,42 @@
    * Exercise constant folding on unsigned right shift.
    */
 
-  /// CHECK-START: int Main.UShrIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.UShrIntLong() constant_folding (before)
   /// CHECK-DAG:     <<ConstM7:i\d+>>  IntConstant -7
   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
   /// CHECK-DAG:     <<UShr:i\d+>>     UShr [<<ConstM7>>,<<TypeConv>>]
   /// CHECK-DAG:                       Return [<<UShr>>]
 
-  /// CHECK-START: int Main.UShrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.UShrIntLong() constant_folding (after)
   /// CHECK-DAG:     <<ConstRes:i\d+>> IntConstant 1073741822
   /// CHECK-DAG:                       Return [<<ConstRes>>]
 
-  /// CHECK-START: int Main.UShrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.UShrIntLong() constant_folding (after)
   /// CHECK-NOT:                       UShr
 
   public static int UShrIntLong() {
-    int lhs = $inline$int(-7);
-    long rhs = $inline$long(2L);
+    int lhs = -7;
+    long rhs = 2;
     return lhs >>> rhs;
   }
 
-  /// CHECK-START: long Main.UShrLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.UShrLongInt() constant_folding (before)
   /// CHECK-DAG:     <<ConstM9L:j\d+>> LongConstant -9
   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
   /// CHECK-DAG:     <<UShr:j\d+>>     UShr [<<ConstM9L>>,<<Const2>>]
   /// CHECK-DAG:                       Return [<<UShr>>]
 
-  /// CHECK-START: long Main.UShrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.UShrLongInt() constant_folding (after)
   /// CHECK-DAG:     <<ConstRes:j\d+>> LongConstant 4611686018427387901
   /// CHECK-DAG:                       Return [<<ConstRes>>]
 
-  /// CHECK-START: long Main.UShrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.UShrLongInt() constant_folding (after)
   /// CHECK-NOT:                       UShr
 
   public static long UShrLongInt() {
-    long lhs = $inline$long(-9);
-    int rhs = $inline$int(2);
+    long lhs = -9;
+    int rhs = 2;
     return lhs >>> rhs;
   }
 
@@ -833,43 +814,43 @@
    * Exercise constant folding on logical and.
    */
 
-  /// CHECK-START: long Main.AndIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.AndIntLong() constant_folding (before)
   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
   /// CHECK-DAG:     <<And:j\d+>>      And [<<TypeConv>>,<<Const3L>>]
   /// CHECK-DAG:                       Return [<<And>>]
 
-  /// CHECK-START: long Main.AndIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.AndIntLong() constant_folding (after)
   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: long Main.AndIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.AndIntLong() constant_folding (after)
   /// CHECK-NOT:                       And
 
   public static long AndIntLong() {
-    int lhs = $inline$int(10);
-    long rhs = $inline$long(3L);
+    int lhs = 10;
+    long rhs = 3;
     return lhs & rhs;
   }
 
-  /// CHECK-START: long Main.AndLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.AndLongInt() constant_folding (before)
   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
   /// CHECK-DAG:     <<And:j\d+>>      And [<<TypeConv>>,<<Const10L>>]
   /// CHECK-DAG:                       Return [<<And>>]
 
-  /// CHECK-START: long Main.AndLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.AndLongInt() constant_folding (after)
   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
   /// CHECK-DAG:                       Return [<<Const2>>]
 
-  /// CHECK-START: long Main.AndLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.AndLongInt() constant_folding (after)
   /// CHECK-NOT:                       And
 
   public static long AndLongInt() {
-    long lhs = $inline$long(10L);
-    int rhs = $inline$int(3);
+    long lhs = 10;
+    int rhs = 3;
     return lhs & rhs;
   }
 
@@ -878,43 +859,43 @@
    * Exercise constant folding on logical or.
    */
 
-  /// CHECK-START: long Main.OrIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.OrIntLong() constant_folding (before)
   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
   /// CHECK-DAG:     <<Or:j\d+>>       Or [<<TypeConv>>,<<Const3L>>]
   /// CHECK-DAG:                       Return [<<Or>>]
 
-  /// CHECK-START: long Main.OrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.OrIntLong() constant_folding (after)
   /// CHECK-DAG:     <<Const11:j\d+>>  LongConstant 11
   /// CHECK-DAG:                       Return [<<Const11>>]
 
-  /// CHECK-START: long Main.OrIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.OrIntLong() constant_folding (after)
   /// CHECK-NOT:                       Or
 
   public static long OrIntLong() {
-    int lhs = $inline$int(10);
-    long rhs = $inline$long(3L);
+    int lhs = 10;
+    long rhs = 3;
     return lhs | rhs;
   }
 
-  /// CHECK-START: long Main.OrLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.OrLongInt() constant_folding (before)
   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
   /// CHECK-DAG:     <<Or:j\d+>>       Or [<<TypeConv>>,<<Const10L>>]
   /// CHECK-DAG:                       Return [<<Or>>]
 
-  /// CHECK-START: long Main.OrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.OrLongInt() constant_folding (after)
   /// CHECK-DAG:     <<Const11:j\d+>>  LongConstant 11
   /// CHECK-DAG:                       Return [<<Const11>>]
 
-  /// CHECK-START: long Main.OrLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.OrLongInt() constant_folding (after)
   /// CHECK-NOT:                       Or
 
   public static long OrLongInt() {
-    long lhs = $inline$long(10L);
-    int rhs = $inline$int(3);
+    long lhs = 10;
+    int rhs = 3;
     return lhs | rhs;
   }
 
@@ -923,43 +904,43 @@
    * Exercise constant folding on logical exclusive or.
    */
 
-  /// CHECK-START: long Main.XorIntLong() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.XorIntLong() constant_folding (before)
   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
   /// CHECK-DAG:     <<Xor:j\d+>>      Xor [<<TypeConv>>,<<Const3L>>]
   /// CHECK-DAG:                       Return [<<Xor>>]
 
-  /// CHECK-START: long Main.XorIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.XorIntLong() constant_folding (after)
   /// CHECK-DAG:     <<Const9:j\d+>>   LongConstant 9
   /// CHECK-DAG:                       Return [<<Const9>>]
 
-  /// CHECK-START: long Main.XorIntLong() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.XorIntLong() constant_folding (after)
   /// CHECK-NOT:                       Xor
 
   public static long XorIntLong() {
-    int lhs = $inline$int(10);
-    long rhs = $inline$long(3L);
+    int lhs = 10;
+    long rhs = 3;
     return lhs ^ rhs;
   }
 
-  /// CHECK-START: long Main.XorLongInt() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.XorLongInt() constant_folding (before)
   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
   /// CHECK-DAG:     <<Xor:j\d+>>      Xor [<<TypeConv>>,<<Const10L>>]
   /// CHECK-DAG:                       Return [<<Xor>>]
 
-  /// CHECK-START: long Main.XorLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.XorLongInt() constant_folding (after)
   /// CHECK-DAG:     <<Const9:j\d+>>   LongConstant 9
   /// CHECK-DAG:                       Return [<<Const9>>]
 
-  /// CHECK-START: long Main.XorLongInt() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.XorLongInt() constant_folding (after)
   /// CHECK-NOT:                       Xor
 
   public static long XorLongInt() {
-    long lhs = $inline$long(10L);
-    int rhs = $inline$int(3);
+    long lhs = 10;
+    int rhs = 3;
     return lhs ^ rhs;
   }
 
@@ -968,23 +949,23 @@
    * Exercise constant folding on constant (static) condition.
    */
 
-  /// CHECK-START: int Main.StaticCondition() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.StaticCondition() constant_folding (before)
   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   /// CHECK-DAG:     <<Cond:z\d+>>    GreaterThanOrEqual [<<Const7>>,<<Const2>>]
-  /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Cond>>]
+  /// CHECK-DAG:                      If [<<Cond>>]
 
-  /// CHECK-START: int Main.StaticCondition() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.StaticCondition() constant_folding (after)
   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
-  /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Const1>>]
+  /// CHECK-DAG:                      If [<<Const1>>]
 
-  /// CHECK-START: int Main.StaticCondition() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.StaticCondition() constant_folding (after)
   /// CHECK-NOT:                      GreaterThanOrEqual
 
   public static int StaticCondition() {
     int a, b, c;
-    a = $inline$int(7);
-    b = $inline$int(2);
+    a = 7;
+    b = 2;
     if (a < b)
       c = a + b;
     else
@@ -1029,30 +1010,28 @@
    * (forward) post-order traversal of the the dominator tree.
    */
 
-  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding$after_inlining (before)
-  /// CHECK-DAG:     <<Cond:z\d+>>    ParameterValue
+  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding (before)
   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   /// CHECK-DAG:     <<Const5:i\d+>>  IntConstant 5
   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<Const5>>,<<Const2>>]
   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<Const5>>,<<Const2>>]
-  /// CHECK-DAG:     <<Phi:i\d+>>     Select [<<Sub>>,<<Add>>,<<Cond>>]
+  /// CHECK-DAG:     <<Phi:i\d+>>     Phi [<<Add>>,<<Sub>>]
   /// CHECK-DAG:                      Return [<<Phi>>]
 
-  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding$after_inlining (after)
-  /// CHECK-DAG:     <<Cond:z\d+>>    ParameterValue
+  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding (after)
   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
-  /// CHECK-DAG:     <<Phi:i\d+>>     Select [<<Const3>>,<<Const7>>,<<Cond>>]
+  /// CHECK-DAG:     <<Phi:i\d+>>     Phi [<<Const7>>,<<Const3>>]
   /// CHECK-DAG:                      Return [<<Phi>>]
 
-  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding (after)
   /// CHECK-NOT:                      Add
   /// CHECK-NOT:                      Sub
 
   public static int JumpsAndConditionals(boolean cond) {
     int a, b, c;
-    a = $inline$int(5);
-    b = $inline$int(2);
+    a = 5;
+    b = 2;
     if (cond)
       c = a + b;
     else
@@ -1328,259 +1307,207 @@
 
 
   /**
-   * Test optimizations of comparisons with null yielding a constant result.
-   */
-
-  /// CHECK-START: boolean Main.ConstStringEqualsNull() constant_folding$after_inlining (before)
-  /// CHECK-DAG:     <<ConstStr:l\d+>> LoadString
-  /// CHECK-DAG:     <<Null:l\d+>>     NullConstant
-  /// CHECK-DAG:     <<Eq:z\d+>>       Equal [<<ConstStr>>,<<Null>>]
-  /// CHECK-DAG:                       If [<<Eq>>]
-
-  /// CHECK-START: boolean Main.ConstStringEqualsNull() constant_folding$after_inlining (after)
-  /// CHECK-DAG:     <<False:i\d+>>    IntConstant 0
-  /// CHECK-DAG:                       If [<<False>>]
-
-  /// CHECK-START: boolean Main.ConstStringEqualsNull() constant_folding$after_inlining (after)
-  /// CHECK-NOT:                       Equal
-
-  public static boolean ConstStringEqualsNull() {
-    // Due to Jack emitting code using the opposite condition, use != to generate Equal.
-    if ($inline$ConstString() != null) {
-      return false;
-    } else {
-      return true;
-    }
-  }
-
-  /// CHECK-START: boolean Main.ConstStringNotEqualsNull() constant_folding$after_inlining (before)
-  /// CHECK-DAG:     <<ConstStr:l\d+>> LoadString
-  /// CHECK-DAG:     <<Null:l\d+>>     NullConstant
-  /// CHECK-DAG:     <<Ne:z\d+>>       NotEqual [<<ConstStr>>,<<Null>>]
-  /// CHECK-DAG:                       If [<<Ne>>]
-
-  /// CHECK-START: boolean Main.ConstStringNotEqualsNull() constant_folding$after_inlining (after)
-  /// CHECK-DAG:     <<True:i\d+>>     IntConstant 1
-  /// CHECK-DAG:                       If [<<True>>]
-
-  /// CHECK-START: boolean Main.ConstStringNotEqualsNull() constant_folding$after_inlining (after)
-  /// CHECK-NOT:                       NotEqual
-
-  public static boolean ConstStringNotEqualsNull() {
-    // Due to Jack emitting code using the opposite condition, use == to generate NotEqual.
-    if ($inline$ConstString() == null) {
-      return false;
-    } else {
-      return true;
-    }
-  }
-
-  public static String $inline$ConstString() {
-    return "";
-  }
-
-  /**
    * Exercise constant folding on type conversions.
    */
 
-  /// CHECK-START: int Main.ReturnInt33() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.ReturnInt33() constant_folding (before)
   /// CHECK-DAG:     <<Const33:j\d+>>  LongConstant 33
   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<Const33>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: int Main.ReturnInt33() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnInt33() constant_folding (after)
   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   /// CHECK-DAG:                       Return [<<Const33>>]
 
-  /// CHECK-START: int Main.ReturnInt33() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnInt33() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static int ReturnInt33() {
-    long imm = $inline$long(33L);
+    long imm = 33L;
     return (int) imm;
   }
 
-  /// CHECK-START: int Main.ReturnIntMax() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.ReturnIntMax() constant_folding (before)
   /// CHECK-DAG:     <<ConstMax:f\d+>> FloatConstant 1e+34
   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<ConstMax>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: int Main.ReturnIntMax() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnIntMax() constant_folding (after)
   /// CHECK-DAG:     <<ConstMax:i\d+>> IntConstant 2147483647
   /// CHECK-DAG:                       Return [<<ConstMax>>]
 
-  /// CHECK-START: int Main.ReturnIntMax() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnIntMax() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static int ReturnIntMax() {
-    float imm = $inline$float(1.0e34f);
+    float imm = 1.0e34f;
     return (int) imm;
   }
 
-  /// CHECK-START: int Main.ReturnInt0() constant_folding$after_inlining (before)
+  /// CHECK-START: int Main.ReturnInt0() constant_folding (before)
   /// CHECK-DAG:     <<ConstNaN:d\d+>> DoubleConstant nan
   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<ConstNaN>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: int Main.ReturnInt0() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnInt0() constant_folding (after)
   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   /// CHECK-DAG:                       Return [<<Const0>>]
 
-  /// CHECK-START: int Main.ReturnInt0() constant_folding$after_inlining (after)
+  /// CHECK-START: int Main.ReturnInt0() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static int ReturnInt0() {
-    double imm = $inline$double(Double.NaN);
+    double imm = Double.NaN;
     return (int) imm;
   }
 
-  /// CHECK-START: long Main.ReturnLong33() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.ReturnLong33() constant_folding (before)
   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<Const33>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: long Main.ReturnLong33() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong33() constant_folding (after)
   /// CHECK-DAG:     <<Const33:j\d+>>  LongConstant 33
   /// CHECK-DAG:                       Return [<<Const33>>]
 
-  /// CHECK-START: long Main.ReturnLong33() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong33() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static long ReturnLong33() {
-    int imm = $inline$int(33);
+    int imm = 33;
     return (long) imm;
   }
 
-  /// CHECK-START: long Main.ReturnLong34() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.ReturnLong34() constant_folding (before)
   /// CHECK-DAG:     <<Const34:f\d+>>  FloatConstant 34
   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<Const34>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: long Main.ReturnLong34() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong34() constant_folding (after)
   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   /// CHECK-DAG:                       Return [<<Const34>>]
 
-  /// CHECK-START: long Main.ReturnLong34() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong34() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static long ReturnLong34() {
-    float imm = $inline$float(34.0f);
+    float imm = 34.0f;
     return (long) imm;
   }
 
-  /// CHECK-START: long Main.ReturnLong0() constant_folding$after_inlining (before)
+  /// CHECK-START: long Main.ReturnLong0() constant_folding (before)
   /// CHECK-DAG:     <<ConstNaN:d\d+>> DoubleConstant nan
   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<ConstNaN>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: long Main.ReturnLong0() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong0() constant_folding (after)
   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   /// CHECK-DAG:                       Return [<<Const0>>]
 
-  /// CHECK-START: long Main.ReturnLong0() constant_folding$after_inlining (after)
+  /// CHECK-START: long Main.ReturnLong0() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static long ReturnLong0() {
-    double imm = $inline$double(-Double.NaN);
+    double imm = -Double.NaN;
     return (long) imm;
   }
 
-  /// CHECK-START: float Main.ReturnFloat33() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.ReturnFloat33() constant_folding (before)
   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const33>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: float Main.ReturnFloat33() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat33() constant_folding (after)
   /// CHECK-DAG:     <<Const33:f\d+>>  FloatConstant 33
   /// CHECK-DAG:                       Return [<<Const33>>]
 
-  /// CHECK-START: float Main.ReturnFloat33() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat33() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static float ReturnFloat33() {
-    int imm = $inline$int(33);
+    int imm = 33;
     return (float) imm;
   }
 
-  /// CHECK-START: float Main.ReturnFloat34() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.ReturnFloat34() constant_folding (before)
   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const34>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: float Main.ReturnFloat34() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat34() constant_folding (after)
   /// CHECK-DAG:     <<Const34:f\d+>>  FloatConstant 34
   /// CHECK-DAG:                       Return [<<Const34>>]
 
-  /// CHECK-START: float Main.ReturnFloat34() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat34() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static float ReturnFloat34() {
-    long imm = $inline$long(34L);
+    long imm = 34L;
     return (float) imm;
   }
 
-  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding$after_inlining (before)
+  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding (before)
   /// CHECK-DAG:     <<Const:d\d+>>    DoubleConstant 99.25
   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding (after)
   /// CHECK-DAG:     <<Const:f\d+>>    FloatConstant 99.25
   /// CHECK-DAG:                       Return [<<Const>>]
 
-  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding$after_inlining (after)
+  /// CHECK-START: float Main.ReturnFloat99P25() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static float ReturnFloat99P25() {
-    double imm = $inline$double(99.25);
+    double imm = 99.25;
     return (float) imm;
   }
 
-  /// CHECK-START: double Main.ReturnDouble33() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.ReturnDouble33() constant_folding (before)
   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const33>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: double Main.ReturnDouble33() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.ReturnDouble33() constant_folding (after)
   /// CHECK-DAG:     <<Const33:d\d+>>  DoubleConstant 33
   /// CHECK-DAG:                       Return [<<Const33>>]
 
   public static double ReturnDouble33() {
-    int imm = $inline$int(33);
+    int imm = 33;
     return (double) imm;
   }
 
-  /// CHECK-START: double Main.ReturnDouble34() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.ReturnDouble34() constant_folding (before)
   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const34>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: double Main.ReturnDouble34() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.ReturnDouble34() constant_folding (after)
   /// CHECK-DAG:     <<Const34:d\d+>>  DoubleConstant 34
   /// CHECK-DAG:                       Return [<<Const34>>]
 
-  /// CHECK-START: double Main.ReturnDouble34() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.ReturnDouble34() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static double ReturnDouble34() {
-    long imm = $inline$long(34L);
+    long imm = 34L;
     return (double) imm;
   }
 
-  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding$after_inlining (before)
+  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding (before)
   /// CHECK-DAG:     <<Const:f\d+>>    FloatConstant 99.25
   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const>>]
   /// CHECK-DAG:                       Return [<<Convert>>]
 
-  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding (after)
   /// CHECK-DAG:     <<Const:d\d+>>    DoubleConstant 99.25
   /// CHECK-DAG:                       Return [<<Const>>]
 
-  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding$after_inlining (after)
+  /// CHECK-START: double Main.ReturnDouble99P25() constant_folding (after)
   /// CHECK-NOT:                       TypeConversion
 
   public static double ReturnDouble99P25() {
-    float imm = $inline$float(99.25f);
+    float imm = 99.25f;
     return (double) imm;
   }
 
@@ -1659,9 +1586,6 @@
     assertFalse(CmpFloatGreaterThanNaN(arbitrary));
     assertFalse(CmpDoubleLessThanNaN(arbitrary));
 
-    assertFalse(ConstStringEqualsNull());
-    assertTrue(ConstStringNotEqualsNull());
-
     Main main = new Main();
     assertIntEquals(1, main.smaliCmpLongConstants());
     assertIntEquals(-1, main.smaliCmpGtFloatConstants());
diff --git a/test/450-checker-types/build b/test/450-checker-types/build
new file mode 100755
index 0000000..49292c9
--- /dev/null
+++ b/test/450-checker-types/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/450-checker-types/smali/SmaliTests.smali b/test/450-checker-types/smali/SmaliTests.smali
deleted file mode 100644
index 6a3122e..0000000
--- a/test/450-checker-types/smali/SmaliTests.smali
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright (C) 2016 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;
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ0_NotInlined(java.lang.Object) builder (after)
-## CHECK-DAG:     <<Cst0:i\d+>> IntConstant 0
-## CHECK-DAG:     <<IOf:z\d+>>  InstanceOf
-## CHECK-DAG:                   Equal [<<IOf>>,<<Cst0>>]
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ0_NotInlined(java.lang.Object) instruction_simplifier (before)
-## CHECK:         CheckCast
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ0_NotInlined(java.lang.Object) instruction_simplifier (after)
-## CHECK-NOT:     CheckCast
-
-.method public static testInstanceOf_EQ0_NotInlined(Ljava/lang/Object;)V
-  .registers 3
-
-  const v0, 0x0
-  instance-of v1, p0, LSubclassC;
-  if-eq v1, v0, :return
-
-  check-cast p0, LSubclassC;
-  invoke-virtual {p0}, LSubclassC;->$noinline$g()V
-
-  :return
-  return-void
-
-.end method
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ1_NotInlined(java.lang.Object) builder (after)
-## CHECK-DAG:     <<Cst1:i\d+>> IntConstant 1
-## CHECK-DAG:     <<IOf:z\d+>>  InstanceOf
-## CHECK-DAG:                   Equal [<<IOf>>,<<Cst1>>]
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ1_NotInlined(java.lang.Object) instruction_simplifier (before)
-## CHECK:         CheckCast
-
-## CHECK-START: void SmaliTests.testInstanceOf_EQ1_NotInlined(java.lang.Object) instruction_simplifier (after)
-## CHECK-NOT:     CheckCast
-
-.method public static testInstanceOf_EQ1_NotInlined(Ljava/lang/Object;)V
-  .registers 3
-
-  const v0, 0x1
-  instance-of v1, p0, LSubclassC;
-  if-eq v1, v0, :invoke
-  return-void
-
-  :invoke
-  check-cast p0, LSubclassC;
-  invoke-virtual {p0}, LSubclassC;->$noinline$g()V
-  return-void
-
-.end method
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE0_NotInlined(java.lang.Object) builder (after)
-## CHECK-DAG:     <<Cst0:i\d+>> IntConstant 0
-## CHECK-DAG:     <<IOf:z\d+>>  InstanceOf
-## CHECK-DAG:                   NotEqual [<<IOf>>,<<Cst0>>]
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE0_NotInlined(java.lang.Object) instruction_simplifier (before)
-## CHECK:         CheckCast
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE0_NotInlined(java.lang.Object) instruction_simplifier (after)
-## CHECK-NOT:     CheckCast
-
-.method public static testInstanceOf_NE0_NotInlined(Ljava/lang/Object;)V
-  .registers 3
-
-  const v0, 0x0
-  instance-of v1, p0, LSubclassC;
-  if-ne v1, v0, :invoke
-  return-void
-
-  :invoke
-  check-cast p0, LSubclassC;
-  invoke-virtual {p0}, LSubclassC;->$noinline$g()V
-  return-void
-
-.end method
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE1_NotInlined(java.lang.Object) builder (after)
-## CHECK-DAG:     <<Cst1:i\d+>> IntConstant 1
-## CHECK-DAG:     <<IOf:z\d+>>  InstanceOf
-## CHECK-DAG:                   NotEqual [<<IOf>>,<<Cst1>>]
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE1_NotInlined(java.lang.Object) instruction_simplifier (before)
-## CHECK:         CheckCast
-
-## CHECK-START: void SmaliTests.testInstanceOf_NE1_NotInlined(java.lang.Object) instruction_simplifier (after)
-## CHECK-NOT:     CheckCast
-
-.method public static testInstanceOf_NE1_NotInlined(Ljava/lang/Object;)V
-  .registers 3
-
-  const v0, 0x1
-  instance-of v1, p0, LSubclassC;
-  if-ne v1, v0, :return
-
-  check-cast p0, LSubclassC;
-  invoke-virtual {p0}, LSubclassC;->$noinline$g()V
-
-  :return
-  return-void
-
-.end method
diff --git a/test/450-checker-types/src/Main.java b/test/450-checker-types/src/Main.java
index ea8609e..ae0fdbe 100644
--- a/test/450-checker-types/src/Main.java
+++ b/test/450-checker-types/src/Main.java
@@ -210,6 +210,58 @@
   public static boolean $inline$InstanceofSubclassB(Object o) { return o instanceof SubclassB; }
   public static boolean $inline$InstanceofSubclassC(Object o) { return o instanceof SubclassC; }
 
+  /// CHECK-START: void Main.testInstanceOf_NotInlined(java.lang.Object) builder (after)
+  /// CHECK-DAG:     <<Cst0:i\d+>> IntConstant 0
+  /// CHECK-DAG:     <<Cst1:i\d+>> IntConstant 1
+  /// CHECK-DAG:     <<IOf1:z\d+>> InstanceOf
+  /// CHECK-DAG:                   NotEqual [<<IOf1>>,<<Cst1>>]
+  /// CHECK-DAG:     <<IOf2:z\d+>> InstanceOf
+  /// CHECK-DAG:                   Equal [<<IOf2>>,<<Cst0>>]
+
+  /// CHECK-START: void Main.testInstanceOf_NotInlined(java.lang.Object) instruction_simplifier (before)
+  /// CHECK:         CheckCast
+  /// CHECK:         CheckCast
+  /// CHECK-NOT:     CheckCast
+
+  /// CHECK-START: void Main.testInstanceOf_NotInlined(java.lang.Object) instruction_simplifier (after)
+  /// CHECK-NOT:     CheckCast
+  public void testInstanceOf_NotInlined(Object o) {
+    if ((o instanceof SubclassC) == true) {
+      ((SubclassC)o).$noinline$g();
+    }
+    if ((o instanceof SubclassB) != false) {
+      ((SubclassB)o).$noinline$g();
+    }
+  }
+
+  /// CHECK-START: void Main.testNotInstanceOf_NotInlined(java.lang.Object) builder (after)
+  /// CHECK-DAG:     <<Cst0:i\d+>> IntConstant 0
+  /// CHECK-DAG:     <<Cst1:i\d+>> IntConstant 1
+  /// CHECK-DAG:     <<IOf1:z\d+>> InstanceOf
+  /// CHECK-DAG:                   Equal [<<IOf1>>,<<Cst1>>]
+  /// CHECK-DAG:     <<IOf2:z\d+>> InstanceOf
+  /// CHECK-DAG:                   NotEqual [<<IOf2>>,<<Cst0>>]
+
+  /// CHECK-START: void Main.testNotInstanceOf_NotInlined(java.lang.Object) instruction_simplifier (before)
+  /// CHECK:         CheckCast
+  /// CHECK:         CheckCast
+  /// CHECK-NOT:     CheckCast
+
+  /// CHECK-START: void Main.testNotInstanceOf_NotInlined(java.lang.Object) instruction_simplifier (after)
+  /// CHECK-NOT:     CheckCast
+  public void testNotInstanceOf_NotInlined(Object o) {
+    if ((o instanceof SubclassC) != true) {
+      // Empty branch to flip the condition.
+    } else {
+      ((SubclassC)o).$noinline$g();
+    }
+    if ((o instanceof SubclassB) == false) {
+      // Empty branch to flip the condition.
+    } else {
+      ((SubclassB)o).$noinline$g();
+    }
+  }
+
   /// CHECK-START: void Main.testInstanceOf_Inlined(java.lang.Object) inliner (after)
   /// CHECK-DAG:     <<IOf:z\d+>>  InstanceOf
   /// CHECK-DAG:                   If [<<IOf>>]
@@ -634,7 +686,7 @@
   /// CHECK-DAG:     <<Null:l\d+>>  NullConstant
   /// CHECK-DAG:     <<Phi:l\d+>>   Phi [<<Arg>>,<<Null>>] klass:SubclassA
   /// CHECK-DAG:     <<NCPhi:l\d+>> NullCheck [<<Phi>>]
-  /// CHECK-DAG:                    InvokeVirtual [<<NCPhi>>] method_name:Super.hashCode
+  /// CHECK-DAG:                    InvokeVirtual [<<NCPhi>>] method_name:java.lang.Object.hashCode
 
   public void testThisArgumentMoreSpecific(boolean cond) {
     // Inlining method from Super will build it with `this` typed as Super.
@@ -655,7 +707,7 @@
   /// CHECK-START: void Main.testExplicitArgumentMoreSpecific(SubclassA) inliner (after)
   /// CHECK-DAG:     <<Arg:l\d+>>   ParameterValue klass:SubclassA
   /// CHECK-DAG:     <<NCArg:l\d+>> NullCheck [<<Arg>>] klass:SubclassA
-  /// CHECK-DAG:                    InvokeVirtual [<<NCArg>>] method_name:Super.hashCode
+  /// CHECK-DAG:                    InvokeVirtual [<<NCArg>>] method_name:java.lang.Object.hashCode
 
   public void testExplicitArgumentMoreSpecific(SubclassA obj) {
     // Inlining a method will build it with reference types from its signature,
diff --git a/test/463-checker-boolean-simplifier/build b/test/463-checker-boolean-simplifier/build
new file mode 100755
index 0000000..49292c9
--- /dev/null
+++ b/test/463-checker-boolean-simplifier/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/463-checker-boolean-simplifier/smali/BooleanNotDx.smali b/test/463-checker-boolean-simplifier/smali/BooleanNotDx.smali
deleted file mode 100644
index 765d0eb..0000000
--- a/test/463-checker-boolean-simplifier/smali/BooleanNotDx.smali
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright (C) 2016 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 LBooleanNotSmali;
-.super Ljava/lang/Object;
-
-#
-# Elementary test negating a boolean. Verifies that blocks are merged and
-# empty branches removed.
-#
-
-## CHECK-START: boolean BooleanNotSmali.BooleanNot(boolean) select_generator (before)
-## CHECK-DAG:     <<Param:z\d+>>    ParameterValue
-## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
-## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
-## CHECK-DAG:                       If [<<Param>>]
-## CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const0>>,<<Const1>>]
-## CHECK-DAG:                       Return [<<Phi>>]
-
-## CHECK-START: boolean BooleanNotSmali.BooleanNot(boolean) select_generator (before)
-## CHECK:                           Goto
-## CHECK:                           Goto
-## CHECK:                           Goto
-## CHECK-NOT:                       Goto
-
-## CHECK-START: boolean BooleanNotSmali.BooleanNot(boolean) select_generator (after)
-## CHECK-DAG:     <<Param:z\d+>>    ParameterValue
-## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
-## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
-## CHECK-DAG:     <<NotParam:i\d+>> Select [<<Const1>>,<<Const0>>,<<Param>>]
-## CHECK-DAG:                       Return [<<NotParam>>]
-
-## CHECK-START: boolean BooleanNotSmali.BooleanNot(boolean) select_generator (after)
-## CHECK-NOT:                       If
-## CHECK-NOT:                       Phi
-
-## CHECK-START: boolean BooleanNotSmali.BooleanNot(boolean) select_generator (after)
-## CHECK:                           Goto
-## CHECK-NOT:                       Goto
-
-.method public static BooleanNot(Z)Z
-  .registers 2
-
-  if-eqz v1, :true_start
-  const/4 v0, 0x0
-
-:return_start
-  return v0
-
-:true_start
-  const/4 v0, 0x1
-  goto :return_start
-
-.end method
diff --git a/test/463-checker-boolean-simplifier/src/Main.java b/test/463-checker-boolean-simplifier/src/Main.java
index 9368488..d1d02cd 100644
--- a/test/463-checker-boolean-simplifier/src/Main.java
+++ b/test/463-checker-boolean-simplifier/src/Main.java
@@ -32,14 +32,42 @@
     }
   }
 
-  // Invoke a method written in smali that implements the boolean ! operator. This method
-  // uses the if/else pattern generated by dx (while Jack generates a different pattern).
-  // Since this method is in a smali-generated class, we invoke it through reflection.
-  public static boolean SmaliBooleanNot(boolean x) throws Exception {
-      Class<?> c = Class.forName("BooleanNotSmali");
-      java.lang.reflect.Method method = c.getMethod("BooleanNot", boolean.class);
-      Object retValue = method.invoke(null, new Object[] { Boolean.valueOf(x) });
-      return ((Boolean) retValue).booleanValue();
+  /*
+   * Elementary test negating a boolean. Verifies that blocks are merged and
+   * empty branches removed.
+   */
+
+  /// CHECK-START: boolean Main.BooleanNot(boolean) select_generator (before)
+  /// CHECK-DAG:     <<Param:z\d+>>    ParameterValue
+  /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
+  /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
+  /// CHECK-DAG:                       If [<<Param>>]
+  /// CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Const1>>,<<Const0>>]
+  /// CHECK-DAG:                       Return [<<Phi>>]
+
+  /// CHECK-START: boolean Main.BooleanNot(boolean) select_generator (before)
+  /// CHECK:                           Goto
+  /// CHECK:                           Goto
+  /// CHECK:                           Goto
+  /// CHECK-NOT:                       Goto
+
+  /// CHECK-START: boolean Main.BooleanNot(boolean) select_generator (after)
+  /// CHECK-DAG:     <<Param:z\d+>>    ParameterValue
+  /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
+  /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
+  /// CHECK-DAG:     <<NotParam:i\d+>> Select [<<Const1>>,<<Const0>>,<<Param>>]
+  /// CHECK-DAG:                       Return [<<NotParam>>]
+
+  /// CHECK-START: boolean Main.BooleanNot(boolean) select_generator (after)
+  /// CHECK-NOT:                       If
+  /// CHECK-NOT:                       Phi
+
+  /// CHECK-START: boolean Main.BooleanNot(boolean) select_generator (after)
+  /// CHECK:                           Goto
+  /// CHECK-NOT:                       Goto
+
+  public static boolean BooleanNot(boolean x) {
+    return !x;
   }
 
   /*
@@ -157,7 +185,11 @@
   /// CHECK-NOT:                       BooleanNot
 
   public static int NegatedCondition(boolean x) {
-    return (x != false) ? 42 : 43;
+    if (x != false) {
+      return 42;
+    } else {
+      return 43;
+    }
   }
 
   /// CHECK-START: int Main.SimpleTrueBlock(boolean, int) select_generator (after)
@@ -221,7 +253,13 @@
   /// CHECK-DAG:                        Return [<<Select123>>]
 
   public static int ThreeBlocks(boolean x, boolean y) {
-    return x ? 1 : (y ? 2 : 3);
+    if (x) {
+      return 1;
+    } else if (y) {
+      return 2;
+    } else {
+      return 3;
+    }
   }
 
   /// CHECK-START: int Main.MultiplePhis() select_generator (before)
@@ -254,10 +292,8 @@
     while (y++ < 10) {
       if (y > 1) {
         x = 13;
-        continue;
       } else {
         x = 42;
-        continue;
       }
     }
     return x;
@@ -330,8 +366,8 @@
   }
 
   public static void main(String[] args) throws Exception {
-    assertBoolEquals(false, SmaliBooleanNot(true));
-    assertBoolEquals(true, SmaliBooleanNot(false));
+    assertBoolEquals(false, BooleanNot(true));
+    assertBoolEquals(true, BooleanNot(false));
     assertBoolEquals(true, GreaterThan(10, 5));
     assertBoolEquals(false, GreaterThan(10, 10));
     assertBoolEquals(false, GreaterThan(5, 10));
diff --git a/test/537-checker-inline-and-unverified/build b/test/537-checker-inline-and-unverified/build
new file mode 100755
index 0000000..49292c9
--- /dev/null
+++ b/test/537-checker-inline-and-unverified/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/537-checker-inline-and-unverified/src/Main.java b/test/537-checker-inline-and-unverified/src/Main.java
index b9d5fc9..bdc14b0 100644
--- a/test/537-checker-inline-and-unverified/src/Main.java
+++ b/test/537-checker-inline-and-unverified/src/Main.java
@@ -45,14 +45,12 @@
     }
 
     public static boolean $opt$noinline$testNoInline() {
-        boolean result = true;
         try {
-            result = (null instanceof InaccessibleClass);
-            throw new Error("Unreachable");
+            return null instanceof InaccessibleClass;
         } catch (IllegalAccessError e) {
             // expected
         }
-        return result;
+        return false;
     }
 
     public static boolean $opt$inline$testInline() {
