Add new VarHandle tests

Bug: b/247076137
Change-Id: Ibf4a77499ba17893f3f37b0ec77051217a0fa1b0
diff --git a/src/test/examplesJava9/varhandle/InstanceStringField.java b/src/test/examplesJava9/varhandle/InstanceStringField.java
new file mode 100644
index 0000000..1be6f67
--- /dev/null
+++ b/src/test/examplesJava9/varhandle/InstanceStringField.java
@@ -0,0 +1,45 @@
+// Copyright (c) 2022, 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 varhandle;
+
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+
+public class InstanceStringField {
+
+  private Object field;
+
+  private static void println(String s) {
+    System.out.println(s);
+  }
+
+  public static void testSet(VarHandle varHandle) {
+    System.out.println("testGet");
+
+    InstanceStringField instance = new InstanceStringField();
+
+    // Then polymorphic invoke will remove the cast and make that as the return type of the get.
+    println((String) varHandle.get(instance));
+    varHandle.set(instance, "1");
+    println((String) varHandle.get(instance));
+  }
+
+  public static void testCompareAndSet(VarHandle varHandle) {
+    System.out.println("testCompareAndSet");
+
+    InstanceStringField instance = new InstanceStringField();
+
+    varHandle.compareAndSet(instance, 0, "1");
+    println((String) varHandle.get(instance));
+    varHandle.compareAndSet(instance, null, "1");
+    println((String) varHandle.get(instance));
+  }
+
+  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
+    VarHandle varHandle =
+        MethodHandles.lookup().findVarHandle(InstanceStringField.class, "field", Object.class);
+    testSet(varHandle);
+    testCompareAndSet(varHandle);
+  }
+}