Merge "Rewrite ClassStaticizerTest with new test builder."
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index c184e6e..0794d92 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -9,9 +9,14 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.ForceInline;
+import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.VmTestRunner;
@@ -36,13 +41,16 @@
 import com.android.tools.r8.ir.optimize.staticizer.trivial.Simple;
 import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithGetter;
 import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithParams;
+import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithPhi;
 import com.android.tools.r8.ir.optimize.staticizer.trivial.SimpleWithSideEffects;
 import com.android.tools.r8.ir.optimize.staticizer.trivial.TrivialTestClass;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Streams;
 import java.nio.file.Path;
@@ -50,26 +58,49 @@
 import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
-@RunWith(VmTestRunner.class)
+@RunWith(Parameterized.class)
 public class ClassStaticizerTest extends TestBase {
+  private Backend backend;
+
+  @Parameterized.Parameters(name = "Backend: {0}")
+  public static Backend[] data() {
+    return Backend.values();
+  }
+
+  public ClassStaticizerTest(Backend backend) {
+    this.backend = backend;
+  }
+
   @Test
   public void testTrivial() throws Exception {
-    byte[][] classes = {
-        ToolHelper.getClassAsBytes(TrivialTestClass.class),
-        ToolHelper.getClassAsBytes(Simple.class),
-        ToolHelper.getClassAsBytes(SimpleWithSideEffects.class),
-        ToolHelper.getClassAsBytes(SimpleWithParams.class),
-        ToolHelper.getClassAsBytes(SimpleWithGetter.class),
+    assumeTrue("b/112831361", backend == Backend.DEX);
+    Class<?> main = TrivialTestClass.class;
+    Class<?>[] classes = {
+        NeverInline.class,
+        TrivialTestClass.class,
+        Simple.class,
+        SimpleWithSideEffects.class,
+        SimpleWithParams.class,
+        SimpleWithGetter.class,
+        SimpleWithPhi.class,
+        SimpleWithPhi.Companion.class
     };
-    AndroidApp app = runR8(buildAndroidApp(classes), TrivialTestClass.class);
+    String javaOutput = runOnJava(main);
+    TestRunResult result = testForR8(backend)
+        .addProgramClasses(classes)
+        .enableProguardTestOptions()
+        .enableInliningAnnotations()
+        .addKeepMainRule(main)
+        .addKeepRules("-dontobfuscate", "-allowaccessmodification")
+        .addKeepRules("-keepattributes InnerClasses,EnclosingMethod")
+        .addOptionsModification(this::configure)
+        .run(main)
+        .assertSuccessWithOutput(javaOutput);
 
-    String javaOutput = runOnJava(TrivialTestClass.class);
-    String artOutput = runOnArt(app, TrivialTestClass.class);
-    assertEquals(javaOutput, artOutput);
-
-    CodeInspector inspector = new CodeInspector(app);
-    ClassSubject clazz = inspector.clazz(TrivialTestClass.class);
+    CodeInspector inspector = result.inspector();
+    ClassSubject clazz = inspector.clazz(main);
 
     assertEquals(
         Lists.newArrayList(
@@ -82,6 +113,16 @@
 
     assertEquals(
         Lists.newArrayList(
+            "STATIC: String trivial.SimpleWithPhi.bar(String)",
+            "STATIC: String trivial.SimpleWithPhi.foo()",
+            "STATIC: String trivial.SimpleWithPhi.foo()",
+            "STATIC: String trivial.TrivialTestClass.next()"),
+        references(clazz, "testSimpleWithPhi", "void", "int"));
+
+    assertTrue(instanceMethods(inspector.clazz(SimpleWithPhi.class)).isEmpty());
+
+    assertEquals(
+        Lists.newArrayList(
             "STATIC: String trivial.SimpleWithParams.bar(String)",
             "STATIC: String trivial.SimpleWithParams.foo()",
             "STATIC: String trivial.TrivialTestClass.next()"),
@@ -115,25 +156,33 @@
 
   @Test
   public void testMoveToHost() throws Exception {
-    byte[][] classes = {
-        ToolHelper.getClassAsBytes(MoveToHostTestClass.class),
-        ToolHelper.getClassAsBytes(HostOk.class),
-        ToolHelper.getClassAsBytes(CandidateOk.class),
-        ToolHelper.getClassAsBytes(HostOkSideEffects.class),
-        ToolHelper.getClassAsBytes(CandidateOkSideEffects.class),
-        ToolHelper.getClassAsBytes(HostConflictMethod.class),
-        ToolHelper.getClassAsBytes(CandidateConflictMethod.class),
-        ToolHelper.getClassAsBytes(HostConflictField.class),
-        ToolHelper.getClassAsBytes(CandidateConflictField.class),
+    assumeTrue("b/112831361", backend == Backend.DEX);
+    Class<?> main = MoveToHostTestClass.class;
+    Class<?>[] classes = {
+        NeverInline.class,
+        MoveToHostTestClass.class,
+        HostOk.class,
+        CandidateOk.class,
+        HostOkSideEffects.class,
+        CandidateOkSideEffects.class,
+        HostConflictMethod.class,
+        CandidateConflictMethod.class,
+        HostConflictField.class,
+        CandidateConflictField.class
     };
-    AndroidApp app = runR8(buildAndroidApp(classes), MoveToHostTestClass.class);
+    String javaOutput = runOnJava(main);
+    TestRunResult result = testForR8(backend)
+        .addProgramClasses(classes)
+        .enableProguardTestOptions()
+        .enableInliningAnnotations()
+        .addKeepMainRule(main)
+        .addKeepRules("-dontobfuscate", "-allowaccessmodification")
+        .addOptionsModification(this::configure)
+        .run(main)
+        .assertSuccessWithOutput(javaOutput);
 
-    String javaOutput = runOnJava(MoveToHostTestClass.class);
-    String artOutput = runOnArt(app, MoveToHostTestClass.class);
-    assertEquals(javaOutput, artOutput);
-
-    CodeInspector inspector = new CodeInspector(app);
-    ClassSubject clazz = inspector.clazz(MoveToHostTestClass.class);
+    CodeInspector inspector = result.inspector();
+    ClassSubject clazz = inspector.clazz(main);
 
     assertEquals(
         Lists.newArrayList(
@@ -232,40 +281,6 @@
     return type.toSourceString().startsWith("com.android.tools.r8.ir.optimize.staticizer");
   }
 
-  private AndroidApp runR8(AndroidApp app, Class mainClass) throws Exception {
-    AndroidApp compiled =
-        compileWithR8(app, getProguardConfig(mainClass.getCanonicalName()), this::configure);
-
-    // Materialize file for execution.
-    Path generatedDexFile = temp.getRoot().toPath().resolve("classes.jar");
-    compiled.writeToZip(generatedDexFile, OutputMode.DexIndexed);
-
-    // Run with ART.
-    String artOutput = ToolHelper.runArtNoVerificationErrors(
-        generatedDexFile.toString(), mainClass.getCanonicalName());
-
-    // Compare with Java.
-    ProcessResult javaResult = ToolHelper.runJava(
-        ToolHelper.getClassPathForTests(), mainClass.getCanonicalName());
-
-    if (javaResult.exitCode != 0) {
-      System.out.println(javaResult.stdout);
-      System.err.println(javaResult.stderr);
-      fail("JVM failed for: " + mainClass);
-    }
-    assertEquals("JVM and ART output differ", javaResult.stdout, artOutput);
-
-    return compiled;
-  }
-
-  private String getProguardConfig(String main) {
-    return keepMainProguardConfiguration(main)
-        + System.lineSeparator()
-        + "-dontobfuscate"
-        + System.lineSeparator()
-        + "-allowaccessmodification";
-  }
-
   private void configure(InternalOptions options) {
     options.enableClassInlining = false;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
index f2108b0..82eef8e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictField.java
@@ -4,18 +4,18 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class CandidateConflictField {
   public static String field;
 
+  @NeverInline
   public String foo() {
-    synchronized ("") {
-      return bar("CandidateConflictMethod::foo()");
-    }
+    return bar("CandidateConflictMethod::foo()");
   }
 
+  @NeverInline
   public String bar(String other) {
-    synchronized ("") {
-      return "CandidateConflictMethod::bar(" + other + ")";
-    }
+    return "CandidateConflictMethod::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
index 40d0576..4e5ce3a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateConflictMethod.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class CandidateConflictMethod {
+  @NeverInline
   public String foo() {
-    synchronized ("") {
-      return bar("CandidateConflictMethod::foo()");
-    }
+    return bar("CandidateConflictMethod::foo()");
   }
 
+  @NeverInline
   public String bar(String other) {
-    synchronized ("") {
-      return "CandidateConflictMethod::bar(" + other + ")";
-    }
+    return "CandidateConflictMethod::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
index daf5647..0834c000 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOk.java
@@ -4,22 +4,21 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class CandidateOk {
+  @NeverInline
   public String foo() {
-    synchronized ("") {
-      return bar("CandidateOk::foo()");
-    }
+    return bar("CandidateOk::foo()");
   }
 
+  @NeverInline
   public String bar(String other) {
-    synchronized ("") {
-      return "CandidateOk::bar(" + other + ")";
-    }
+    return "CandidateOk::bar(" + other + ")";
   }
 
+  @NeverInline
   public void blah(String other) {
-    synchronized ("") {
-      System.out.println("CandidateOk::blah(" + other + ")");
-    }
+    System.out.println("CandidateOk::blah(" + other + ")");
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
index 2077056..a02bed3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/CandidateOkSideEffects.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class CandidateOkSideEffects {
+  @NeverInline
   public String foo() {
-    synchronized ("") {
-      return bar("CandidateOkSideEffects::foo()");
-    }
+    return bar("CandidateOkSideEffects::foo()");
   }
 
+  @NeverInline
   public String bar(String other) {
-    synchronized ("") {
-      return "CandidateOkSideEffects::bar(" + other + ")";
-    }
+    return "CandidateOkSideEffects::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
index ad86b35..8804e14 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/HostConflictMethod.java
@@ -4,12 +4,13 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class HostConflictMethod {
   static CandidateConflictMethod INSTANCE = new CandidateConflictMethod();
 
+  @NeverInline
   public String bar(String other) {
-    synchronized ("") {
-      return "HostConflictMethod::bar(" + other + ")";
-    }
+    return "HostConflictMethod::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
index 3f31839..3be6e5f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostTestClass.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.movetohost;
 
+import com.android.tools.r8.NeverInline;
+
 public class MoveToHostTestClass {
   private static int ID = 0;
 
@@ -19,24 +21,28 @@
     test.testConflictField();
   }
 
-  private synchronized void testOk() {
+  @NeverInline
+  private void testOk() {
     System.out.println(HostOk.INSTANCE.foo());
     System.out.println(HostOk.INSTANCE.bar(next()));
     HostOk.INSTANCE.blah(next());
   }
 
-  private synchronized void testOkSideEffects() {
+  @NeverInline
+  private void testOkSideEffects() {
     System.out.println(HostOkSideEffects.INSTANCE.foo());
     System.out.println(HostOkSideEffects.INSTANCE.bar(next()));
   }
 
-  private synchronized void testConflictMethod() {
+  @NeverInline
+  private void testConflictMethod() {
     System.out.println(new HostConflictMethod().bar(next()));
     System.out.println(HostConflictMethod.INSTANCE.foo());
     System.out.println(HostConflictMethod.INSTANCE.bar(next()));
   }
 
-  private synchronized void testConflictField() {
+  @NeverInline
+  private void testConflictField() {
     System.out.println(new HostConflictField().field);
     System.out.println(CandidateConflictField.field);
     System.out.println(HostConflictField.INSTANCE.foo());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
index 8df079c..3cb1c49 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/Simple.java
@@ -4,18 +4,18 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.trivial;
 
+import com.android.tools.r8.NeverInline;
+
 public class Simple {
   static Simple INSTANCE = new Simple();
 
+  @NeverInline
   String foo() {
-    synchronized ("") {
-      return bar("Simple::foo()");
-    }
+    return bar("Simple::foo()");
   }
 
+  @NeverInline
   String bar(String other) {
-    synchronized ("") {
-      return "Simple::bar(" + other + ")";
-    }
+    return "Simple::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
index 9ff20c3..55487ac 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithGetter.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.trivial;
 
+import com.android.tools.r8.NeverInline;
+
 public class SimpleWithGetter {
   private static SimpleWithGetter INSTANCE = new SimpleWithGetter();
 
@@ -11,15 +13,13 @@
     return INSTANCE;
   }
 
+  @NeverInline
   String foo() {
-    synchronized ("") {
-      return bar("Simple::foo()");
-    }
+    return bar("Simple::foo()");
   }
 
+  @NeverInline
   String bar(String other) {
-    synchronized ("") {
-      return "Simple::bar(" + other + ")";
-    }
+    return "Simple::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
index a71f1f5..24edea4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithParams.java
@@ -4,21 +4,21 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.trivial;
 
+import com.android.tools.r8.NeverInline;
+
 public class SimpleWithParams {
   static SimpleWithParams INSTANCE = new SimpleWithParams(123);
 
   SimpleWithParams(int i) {
   }
 
+  @NeverInline
   String foo() {
-    synchronized ("") {
-      return bar("SimpleWithParams::foo()");
-    }
+    return bar("SimpleWithParams::foo()");
   }
 
+  @NeverInline
   String bar(String other) {
-    synchronized ("") {
-      return "SimpleWithParams::bar(" + other + ")";
-    }
+    return "SimpleWithParams::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java
new file mode 100644
index 0000000..f3c76cb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithPhi.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.optimize.staticizer.trivial;
+
+import com.android.tools.r8.NeverInline;
+
+public class SimpleWithPhi {
+  public static class Companion {
+    @NeverInline
+    String foo() {
+      return bar("SimpleWithPhi$Companion::foo()");
+    }
+
+    @NeverInline
+    String bar(String other) {
+      return "SimpleWithPhi$Companion::bar(" + other + ")";
+    }
+  }
+
+  static Companion INSTANCE = new Companion();
+
+  @NeverInline
+  static String foo() {
+    return INSTANCE.foo();
+  }
+
+  @NeverInline
+  static String bar(String other) {
+    if (other.length() > 2) {
+      return INSTANCE.foo();
+    } else {
+      return INSTANCE.bar(other);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
index 5ba97dc..2ee78f5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/SimpleWithSideEffects.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.trivial;
 
+import com.android.tools.r8.NeverInline;
+
 public class SimpleWithSideEffects {
   static SimpleWithSideEffects INSTANCE = new SimpleWithSideEffects();
 
@@ -11,15 +13,13 @@
     System.out.println("SimpleWithSideEffects::<clinit>()");
   }
 
+  @NeverInline
   String foo() {
-    synchronized ("") {
-      return bar("SimpleWithSideEffects::foo()");
-    }
+    return bar("SimpleWithSideEffects::foo()");
   }
 
+  @NeverInline
   String bar(String other) {
-    synchronized ("") {
-      return "SimpleWithSideEffects::bar(" + other + ")";
-    }
+    return "SimpleWithSideEffects::bar(" + other + ")";
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
index 2dad273..964567c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/trivial/TrivialTestClass.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.optimize.staticizer.trivial;
 
+import com.android.tools.r8.NeverInline;
+
 public class TrivialTestClass {
   private static int ID = 0;
 
@@ -14,27 +16,47 @@
   public static void main(String[] args) {
     TrivialTestClass test = new TrivialTestClass();
     test.testSimple();
+    test.testSimpleWithPhi(args.length);
     test.testSimpleWithSideEffects();
     test.testSimpleWithParams();
     test.testSimpleWithGetter();
   }
 
-  private synchronized void testSimple() {
+  @NeverInline
+  private void testSimple() {
     System.out.println(Simple.INSTANCE.foo());
     System.out.println(Simple.INSTANCE.bar(next()));
   }
 
-  private synchronized void testSimpleWithSideEffects() {
+  @NeverInline
+  private void testSimpleWithPhi(int arg) {
+    switch (arg) {
+      case 0:
+        System.out.println(SimpleWithPhi.foo() + " " + true);
+        break;
+      case 2:
+        System.out.println(SimpleWithPhi.foo() + " " + false);
+        break;
+      default:
+        System.out.println(SimpleWithPhi.bar(next()));
+        break;
+    }
+  }
+
+  @NeverInline
+  private void testSimpleWithSideEffects() {
     System.out.println(SimpleWithSideEffects.INSTANCE.foo());
     System.out.println(SimpleWithSideEffects.INSTANCE.bar(next()));
   }
 
-  private synchronized void testSimpleWithParams() {
+  @NeverInline
+  private void testSimpleWithParams() {
     System.out.println(SimpleWithParams.INSTANCE.foo());
     System.out.println(SimpleWithParams.INSTANCE.bar(next()));
   }
 
-  private synchronized void testSimpleWithGetter() {
+  @NeverInline
+  private void testSimpleWithGetter() {
     System.out.println(SimpleWithGetter.getInstance().foo());
     System.out.println(SimpleWithGetter.getInstance().bar(next()));
   }