ART: Change indentation to 4 spaces in run-test shards 15-19.
Created with
for testName in \
`git grep -E '^ public static void main\(String\[\]' \
-- test/*<i>-*/src/Main.java | \
sed '-es/\/src\/Main.java:.*//'`; \
do \
find $testName/ -type f -name *.java | \
xargs sed -E '-es/^(( )+)/\1\1/' --in-place ; \
done
with <i> manually set to 15 to 19.
Manually address many long lines and fix other style issues.
Test: testrunner.py --host --optimizing
Change-Id: I20e443155e4a2c91a6c484f24783c0d4b87ca928
diff --git a/test/118-noimage-dex2oat/src/Main.java b/test/118-noimage-dex2oat/src/Main.java
index cc19107..f83cadc 100644
--- a/test/118-noimage-dex2oat/src/Main.java
+++ b/test/118-noimage-dex2oat/src/Main.java
@@ -18,68 +18,68 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- System.loadLibrary(args[0]);
- boolean hasImage = hasImage();
- String instructionSet = VMRuntime.getCurrentInstructionSet();
- boolean isBootClassPathOnDisk = VMRuntime.isBootClassPathOnDisk(instructionSet);
- System.out.println(
- "Has image is " + hasImage + ", is image dex2oat enabled is "
- + isImageDex2OatEnabled() + ", is BOOTCLASSPATH on disk is "
- + isBootClassPathOnDisk + ".");
+ public static void main(String[] args) throws Exception {
+ System.loadLibrary(args[0]);
+ boolean hasImage = hasImage();
+ String instructionSet = VMRuntime.getCurrentInstructionSet();
+ boolean isBootClassPathOnDisk = VMRuntime.isBootClassPathOnDisk(instructionSet);
+ System.out.println(
+ "Has image is " + hasImage + ", is image dex2oat enabled is "
+ + isImageDex2OatEnabled() + ", is BOOTCLASSPATH on disk is "
+ + isBootClassPathOnDisk + ".");
- if (hasImage && !isImageDex2OatEnabled()) {
- throw new Error("Image with dex2oat disabled runs with an oat file");
- } else if (!hasImage && isImageDex2OatEnabled()) {
- throw new Error("Image with dex2oat enabled runs without an oat file");
- }
- if (hasImage && !isBootClassPathOnDisk) {
- throw new Error("Image with dex2oat disabled runs with an image file");
- } else if (!hasImage && isBootClassPathOnDisk) {
- throw new Error("Image with dex2oat enabled runs without an image file");
+ if (hasImage && !isImageDex2OatEnabled()) {
+ throw new Error("Image with dex2oat disabled runs with an oat file");
+ } else if (!hasImage && isImageDex2OatEnabled()) {
+ throw new Error("Image with dex2oat enabled runs without an oat file");
+ }
+ if (hasImage && !isBootClassPathOnDisk) {
+ throw new Error("Image with dex2oat disabled runs with an image file");
+ } else if (!hasImage && isBootClassPathOnDisk) {
+ throw new Error("Image with dex2oat enabled runs without an image file");
+ }
+
+ testB18485243();
}
- testB18485243();
- }
+ private native static boolean hasImage();
- private native static boolean hasImage();
+ private native static boolean isImageDex2OatEnabled();
- private native static boolean isImageDex2OatEnabled();
+ private static class VMRuntime {
+ private static final Method getCurrentInstructionSetMethod;
+ private static final Method isBootClassPathOnDiskMethod;
+ static {
+ try {
+ Class<?> c = Class.forName("dalvik.system.VMRuntime");
+ getCurrentInstructionSetMethod = c.getDeclaredMethod("getCurrentInstructionSet");
+ isBootClassPathOnDiskMethod =
+ c.getDeclaredMethod("isBootClassPathOnDisk", String.class);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
- private static class VMRuntime {
- private static final Method getCurrentInstructionSetMethod;
- private static final Method isBootClassPathOnDiskMethod;
- static {
- try {
- Class<?> c = Class.forName("dalvik.system.VMRuntime");
- getCurrentInstructionSetMethod = c.getDeclaredMethod("getCurrentInstructionSet");
- isBootClassPathOnDiskMethod = c.getDeclaredMethod("isBootClassPathOnDisk",
- String.class);
- } catch (Exception e) {
- throw new RuntimeException(e);
+ public static String getCurrentInstructionSet() throws Exception {
+ return (String) getCurrentInstructionSetMethod.invoke(null);
+ }
+ public static boolean isBootClassPathOnDisk(String instructionSet) throws Exception {
+ return (boolean) isBootClassPathOnDiskMethod.invoke(null, instructionSet);
}
}
- public static String getCurrentInstructionSet() throws Exception {
- return (String) getCurrentInstructionSetMethod.invoke(null);
+ private static void testB18485243() throws Exception {
+ Class<?> k = Class.forName("B18485243");
+ Object o = k.newInstance();
+ Method m = k.getDeclaredMethod("run");
+ try {
+ m.invoke(o);
+ } catch (InvocationTargetException e) {
+ Throwable actual = e.getTargetException();
+ if (!(actual instanceof IncompatibleClassChangeError)) {
+ throw new AssertionError("Expected IncompatibleClassChangeError", actual);
+ }
+ }
+ System.out.println("testB18485243 PASS");
}
- public static boolean isBootClassPathOnDisk(String instructionSet) throws Exception {
- return (boolean) isBootClassPathOnDiskMethod.invoke(null, instructionSet);
- }
- }
-
- private static void testB18485243() throws Exception {
- Class<?> k = Class.forName("B18485243");
- Object o = k.newInstance();
- Method m = k.getDeclaredMethod("run");
- try {
- m.invoke(o);
- } catch (InvocationTargetException e) {
- Throwable actual = e.getTargetException();
- if (!(actual instanceof IncompatibleClassChangeError)) {
- throw new AssertionError("Expected IncompatibleClassChangeError", actual);
- }
- }
- System.out.println("testB18485243 PASS");
- }
}
diff --git a/test/1915-get-set-local-current-thread/src/Main.java b/test/1915-get-set-local-current-thread/src/Main.java
index 47e6767..5ca6f09 100644
--- a/test/1915-get-set-local-current-thread/src/Main.java
+++ b/test/1915-get-set-local-current-thread/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1915.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1915.run();
+ }
}
diff --git a/test/1915-get-set-local-current-thread/src/art/Test1915.java b/test/1915-get-set-local-current-thread/src/art/Test1915.java
index a99a487..8398afa 100644
--- a/test/1915-get-set-local-current-thread/src/art/Test1915.java
+++ b/test/1915-get-set-local-current-thread/src/art/Test1915.java
@@ -31,75 +31,75 @@
import java.util.function.Consumer;
public class Test1915 {
- public static final int SET_VALUE = 1337;
- public static final String TARGET_VAR = "TARGET";
+ public static final int SET_VALUE = 1337;
+ public static final String TARGET_VAR = "TARGET";
- public static void reportValue(Object val) {
- System.out.println("\tValue is '" + val + "'");
- }
- public static interface ThrowRunnable {
- public void run() throws Exception;
- }
-
- public static void IntMethod(ThrowRunnable safepoint) throws Exception {
- int TARGET = 42;
- safepoint.run();
- reportValue(TARGET);
- }
-
- public static void run() throws Exception {
- Locals.EnableLocalVariableAccess();
- final Method target = Test1915.class.getDeclaredMethod("IntMethod", ThrowRunnable.class);
- // Get Variable.
- System.out.println("GetLocalInt on current thread!");
- IntMethod(() -> {
- StackTrace.StackFrameData frame = FindStackFrame(target);
- int depth = FindExpectedFrameDepth(frame);
- int slot = FindSlot(frame);
- int value = Locals.GetLocalVariableInt(Thread.currentThread(), depth, slot);
- System.out.println("From GetLocalInt(), value is " + value);
- });
- // Set Variable.
- System.out.println("SetLocalInt on current thread!");
- IntMethod(() -> {
- StackTrace.StackFrameData frame = FindStackFrame(target);
- int depth = FindExpectedFrameDepth(frame);
- int slot = FindSlot(frame);
- Locals.SetLocalVariableInt(Thread.currentThread(), depth, slot, SET_VALUE);
- });
- }
-
- public static int FindSlot(StackTrace.StackFrameData frame) throws Exception {
- long loc = frame.current_location;
- for (Locals.VariableDescription var : Locals.GetLocalVariableTable(frame.method)) {
- if (var.start_location <= loc &&
- var.length + var.start_location > loc &&
- var.name.equals(TARGET_VAR)) {
- return var.slot;
- }
+ public static void reportValue(Object val) {
+ System.out.println("\tValue is '" + val + "'");
}
- throw new Error(
- "Unable to find variable " + TARGET_VAR + " in " + frame.method + " at loc " + loc);
- }
-
- public static int FindExpectedFrameDepth(StackTrace.StackFrameData frame) throws Exception {
- // Adjust the 'frame' depth since it is modified by:
- // +1 for Get/SetLocalVariableInt in future.
- // -1 for FindStackFrame
- // -1 for GetStackTrace
- // -1 for GetStackTraceNative
- // ------------------------------
- // -2
- return frame.depth - 2;
- }
-
- private static StackTrace.StackFrameData FindStackFrame(Method target) {
- for (StackTrace.StackFrameData frame : StackTrace.GetStackTrace(Thread.currentThread())) {
- if (frame.method.equals(target)) {
- return frame;
- }
+ public static interface ThrowRunnable {
+ public void run() throws Exception;
}
- throw new Error("Unable to find stack frame in method " + target);
- }
+
+ public static void IntMethod(ThrowRunnable safepoint) throws Exception {
+ int TARGET = 42;
+ safepoint.run();
+ reportValue(TARGET);
+ }
+
+ public static void run() throws Exception {
+ Locals.EnableLocalVariableAccess();
+ final Method target = Test1915.class.getDeclaredMethod("IntMethod", ThrowRunnable.class);
+ // Get Variable.
+ System.out.println("GetLocalInt on current thread!");
+ IntMethod(() -> {
+ StackTrace.StackFrameData frame = FindStackFrame(target);
+ int depth = FindExpectedFrameDepth(frame);
+ int slot = FindSlot(frame);
+ int value = Locals.GetLocalVariableInt(Thread.currentThread(), depth, slot);
+ System.out.println("From GetLocalInt(), value is " + value);
+ });
+ // Set Variable.
+ System.out.println("SetLocalInt on current thread!");
+ IntMethod(() -> {
+ StackTrace.StackFrameData frame = FindStackFrame(target);
+ int depth = FindExpectedFrameDepth(frame);
+ int slot = FindSlot(frame);
+ Locals.SetLocalVariableInt(Thread.currentThread(), depth, slot, SET_VALUE);
+ });
+ }
+
+ public static int FindSlot(StackTrace.StackFrameData frame) throws Exception {
+ long loc = frame.current_location;
+ for (Locals.VariableDescription var : Locals.GetLocalVariableTable(frame.method)) {
+ if (var.start_location <= loc &&
+ var.length + var.start_location > loc &&
+ var.name.equals(TARGET_VAR)) {
+ return var.slot;
+ }
+ }
+ throw new Error(
+ "Unable to find variable " + TARGET_VAR + " in " + frame.method + " at loc " + loc);
+ }
+
+ public static int FindExpectedFrameDepth(StackTrace.StackFrameData frame) throws Exception {
+ // Adjust the 'frame' depth since it is modified by:
+ // +1 for Get/SetLocalVariableInt in future.
+ // -1 for FindStackFrame
+ // -1 for GetStackTrace
+ // -1 for GetStackTraceNative
+ // ------------------------------
+ // -2
+ return frame.depth - 2;
+ }
+
+ private static StackTrace.StackFrameData FindStackFrame(Method target) {
+ for (StackTrace.StackFrameData frame : StackTrace.GetStackTrace(Thread.currentThread())) {
+ if (frame.method.equals(target)) {
+ return frame;
+ }
+ }
+ throw new Error("Unable to find stack frame in method " + target);
+ }
}
diff --git a/test/1917-get-stack-frame/src/Main.java b/test/1917-get-stack-frame/src/Main.java
index c055a5c..c6f0853 100644
--- a/test/1917-get-stack-frame/src/Main.java
+++ b/test/1917-get-stack-frame/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1917.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1917.run();
+ }
}
diff --git a/test/1917-get-stack-frame/src/art/Test1917.java b/test/1917-get-stack-frame/src/art/Test1917.java
index 75af43b..47b06cf 100644
--- a/test/1917-get-stack-frame/src/art/Test1917.java
+++ b/test/1917-get-stack-frame/src/art/Test1917.java
@@ -34,124 +34,124 @@
import java.util.function.Consumer;
public class Test1917 {
- public final static boolean TEST_PRINT_ALL = false;
+ public final static boolean TEST_PRINT_ALL = false;
- public static class ThreadPauser implements Runnable {
- public Semaphore sem_wakeup_main = new Semaphore(0);
- public Semaphore sem_wait = new Semaphore(0);
+ public static class ThreadPauser implements Runnable {
+ public Semaphore sem_wakeup_main = new Semaphore(0);
+ public Semaphore sem_wait = new Semaphore(0);
- public void run() {
- try {
- sem_wakeup_main.release();
- sem_wait.acquire();
- } catch (Exception e) {
- throw new Error("Error with semaphores!", e);
- }
- }
-
- public void waitForOtherThreadToPause() throws Exception {
- sem_wakeup_main.acquire();
- while (!sem_wait.hasQueuedThreads()) {}
- }
-
- public void wakeupOtherThread() throws Exception {
- sem_wait.release();
- }
- }
-
- public static class StackTraceGenerator implements Runnable {
- private final Thread thr;
- private final Consumer<StackTrace.StackFrameData> con;
- public StackTraceGenerator(Thread thr, Consumer<StackTrace.StackFrameData> con) {
- this.thr = thr;
- this.con = con;
- }
-
- public StackTraceGenerator(Consumer<StackTrace.StackFrameData> con) {
- this(null, con);
- }
-
- public Thread getThread() {
- if (thr == null) {
- return Thread.currentThread();
- } else {
- return thr;
- }
- }
- public void run() {
- for (StackTrace.StackFrameData s : StackTrace.GetStackTrace(getThread())) {
- con.accept(s);
- }
- }
- }
-
- public static class RecurCount implements Runnable {
- private final int cnt;
- private final Runnable then;
- public RecurCount(int cnt, Runnable then) {
- this.cnt = cnt;
- this.then = then;
- }
-
- public void run() {
- doRecur(0);
- }
-
- public void doRecur(int n) {
- if (n < cnt) {
- doRecur(n + 1);
- } else {
- then.run();
- }
- }
- }
-
- public static Consumer<StackTrace.StackFrameData> makePrintStackFramesConsumer()
- throws Exception {
- final Method end_method = Test1917.class.getDeclaredMethod("run");
- return new Consumer<StackTrace.StackFrameData>() {
- public void accept(StackTrace.StackFrameData data) {
- if (TEST_PRINT_ALL) {
- System.out.println(data);
- } else {
- Package p = data.method.getDeclaringClass().getPackage();
- // Filter out anything to do with the testing harness.
- if (p != null && p.equals(Test1917.class.getPackage())) {
- System.out.printf("'%s' line: %d\n",
- data.method,
- Breakpoint.locationToLine(data.method, data.current_location));
- } else if (data.method.getDeclaringClass().equals(Semaphore.class)) {
- System.out.printf("'%s' line: <NOT-DETERMINISTIC>\n", data.method);
- }
+ public void run() {
+ try {
+ sem_wakeup_main.release();
+ sem_wait.acquire();
+ } catch (Exception e) {
+ throw new Error("Error with semaphores!", e);
+ }
}
- }
- };
- }
- public static void run() throws Exception {
- System.out.println("Recurring 5 times");
- new RecurCount(5, new StackTraceGenerator(makePrintStackFramesConsumer())).run();
+ public void waitForOtherThreadToPause() throws Exception {
+ sem_wakeup_main.acquire();
+ while (!sem_wait.hasQueuedThreads()) {}
+ }
- System.out.println("Recurring 5 times on another thread");
- Thread thr = new Thread(
- Thread.currentThread().getThreadGroup(),
- new RecurCount(5, new StackTraceGenerator(makePrintStackFramesConsumer())),
- "Recurring Thread 1",
- 10*1000000 /* 10 mb*/);
- thr.start();
- thr.join();
+ public void wakeupOtherThread() throws Exception {
+ sem_wait.release();
+ }
+ }
- System.out.println("Recurring 5 times on another thread. Stack trace from main thread!");
- ThreadPauser pause = new ThreadPauser();
- Thread thr2 = new Thread(
- Thread.currentThread().getThreadGroup(),
- new RecurCount(5, pause),
- "Recurring Thread 2",
- 10*1000000 /* 10 mb*/);
- thr2.start();
- pause.waitForOtherThreadToPause();
- new StackTraceGenerator(thr2, makePrintStackFramesConsumer()).run();
- pause.wakeupOtherThread();
- thr2.join();
- }
+ public static class StackTraceGenerator implements Runnable {
+ private final Thread thr;
+ private final Consumer<StackTrace.StackFrameData> con;
+ public StackTraceGenerator(Thread thr, Consumer<StackTrace.StackFrameData> con) {
+ this.thr = thr;
+ this.con = con;
+ }
+
+ public StackTraceGenerator(Consumer<StackTrace.StackFrameData> con) {
+ this(null, con);
+ }
+
+ public Thread getThread() {
+ if (thr == null) {
+ return Thread.currentThread();
+ } else {
+ return thr;
+ }
+ }
+ public void run() {
+ for (StackTrace.StackFrameData s : StackTrace.GetStackTrace(getThread())) {
+ con.accept(s);
+ }
+ }
+ }
+
+ public static class RecurCount implements Runnable {
+ private final int cnt;
+ private final Runnable then;
+ public RecurCount(int cnt, Runnable then) {
+ this.cnt = cnt;
+ this.then = then;
+ }
+
+ public void run() {
+ doRecur(0);
+ }
+
+ public void doRecur(int n) {
+ if (n < cnt) {
+ doRecur(n + 1);
+ } else {
+ then.run();
+ }
+ }
+ }
+
+ public static Consumer<StackTrace.StackFrameData> makePrintStackFramesConsumer()
+ throws Exception {
+ final Method end_method = Test1917.class.getDeclaredMethod("run");
+ return new Consumer<StackTrace.StackFrameData>() {
+ public void accept(StackTrace.StackFrameData data) {
+ if (TEST_PRINT_ALL) {
+ System.out.println(data);
+ } else {
+ Package p = data.method.getDeclaringClass().getPackage();
+ // Filter out anything to do with the testing harness.
+ if (p != null && p.equals(Test1917.class.getPackage())) {
+ System.out.printf("'%s' line: %d\n",
+ data.method,
+ Breakpoint.locationToLine(data.method, data.current_location));
+ } else if (data.method.getDeclaringClass().equals(Semaphore.class)) {
+ System.out.printf("'%s' line: <NOT-DETERMINISTIC>\n", data.method);
+ }
+ }
+ }
+ };
+ }
+
+ public static void run() throws Exception {
+ System.out.println("Recurring 5 times");
+ new RecurCount(5, new StackTraceGenerator(makePrintStackFramesConsumer())).run();
+
+ System.out.println("Recurring 5 times on another thread");
+ Thread thr = new Thread(
+ Thread.currentThread().getThreadGroup(),
+ new RecurCount(5, new StackTraceGenerator(makePrintStackFramesConsumer())),
+ "Recurring Thread 1",
+ 10*1000000 /* 10 mb*/);
+ thr.start();
+ thr.join();
+
+ System.out.println("Recurring 5 times on another thread. Stack trace from main thread!");
+ ThreadPauser pause = new ThreadPauser();
+ Thread thr2 = new Thread(
+ Thread.currentThread().getThreadGroup(),
+ new RecurCount(5, pause),
+ "Recurring Thread 2",
+ 10*1000000 /* 10 mb*/);
+ thr2.start();
+ pause.waitForOtherThreadToPause();
+ new StackTraceGenerator(thr2, makePrintStackFramesConsumer()).run();
+ pause.wakeupOtherThread();
+ thr2.join();
+ }
}
diff --git a/test/1919-vminit-thread-start-timing/src/Main.java b/test/1919-vminit-thread-start-timing/src/Main.java
index 41baf24..32a45c5 100644
--- a/test/1919-vminit-thread-start-timing/src/Main.java
+++ b/test/1919-vminit-thread-start-timing/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test1919.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test1919.run();
+ }
}
diff --git a/test/1919-vminit-thread-start-timing/src/art/Test1919.java b/test/1919-vminit-thread-start-timing/src/art/Test1919.java
index 26ff49f..f146ae6 100644
--- a/test/1919-vminit-thread-start-timing/src/art/Test1919.java
+++ b/test/1919-vminit-thread-start-timing/src/art/Test1919.java
@@ -17,49 +17,49 @@
package art;
public class Test1919 {
- public static final boolean PRINT_ALL_THREADS = false;
+ public static final boolean PRINT_ALL_THREADS = false;
- public static void run() throws Exception {
- Thread testing_thread = getTestingThread();
- // TODO(b/124284724): For unknown reasons the testing thread will sometimes SEGV after the test
- // has otherwise completed successfully. This has only been observed on the release version of
- // art (libart.so) and I haven't had any luck reproing it. I assume it has something to do with
- // racing between the DetachCurrentThread and shutdown but I'm not sure. Since the runtime
- // normally never shuts down anyway for now I'll just ensure everything gets cleaned up early to
- // prevent the problem from showing up.
- testing_thread.join();
- for (Event e : getEvents()) {
- if (e.thr != null) {
- if (PRINT_ALL_THREADS ||
- e.thr.equals(Thread.currentThread()) ||
- e.thr.equals(testing_thread)) {
- System.out.println(e.name + ": " + e.thr.getName());
+ public static void run() throws Exception {
+ Thread testing_thread = getTestingThread();
+ // TODO(b/124284724): For unknown reasons the testing thread will sometimes SEGV after the
+ // test has otherwise completed successfully. This has only been observed on the release
+ // version of art (libart.so) and I haven't had any luck reproing it. I assume it has
+ // something to do with racing between the DetachCurrentThread and shutdown but I'm not
+ // sure. Since the runtime normally never shuts down anyway for now I'll just ensure
+ // everything gets cleaned up early to prevent the problem from showing up.
+ testing_thread.join();
+ for (Event e : getEvents()) {
+ if (e.thr != null) {
+ if (PRINT_ALL_THREADS ||
+ e.thr.equals(Thread.currentThread()) ||
+ e.thr.equals(testing_thread)) {
+ System.out.println(e.name + ": " + e.thr.getName());
+ }
+ }
}
- }
}
- }
- static class Event {
- public final String name;
- public final Thread thr;
- public Event(String name, Thread thr) {
- this.name = name;
- this.thr = thr;
+ static class Event {
+ public final String name;
+ public final Thread thr;
+ public Event(String name, Thread thr) {
+ this.name = name;
+ this.thr = thr;
+ }
}
- }
- public static Event[] getEvents() {
- String[] ns = getEventNames();
- Thread[] ts = getEventThreads();
- Event[] es = new Event[Math.min(ns.length, ts.length)];
- for (int i = 0; i < es.length; i++) {
- es[i] = new Event(ns[i], ts[i]);
+ public static Event[] getEvents() {
+ String[] ns = getEventNames();
+ Thread[] ts = getEventThreads();
+ Event[] es = new Event[Math.min(ns.length, ts.length)];
+ for (int i = 0; i < es.length; i++) {
+ es[i] = new Event(ns[i], ts[i]);
+ }
+ return es;
}
- return es;
- }
- public static native String[] getEventNames();
- public static native Thread[] getEventThreads();
+ public static native String[] getEventNames();
+ public static native Thread[] getEventThreads();
- public static native Thread getTestingThread();
+ public static native Thread getTestingThread();
}
diff --git a/test/418-const-string/src/Main.java b/test/418-const-string/src/Main.java
index 7c1ffec..3b7d8e2 100644
--- a/test/418-const-string/src/Main.java
+++ b/test/418-const-string/src/Main.java
@@ -15,14 +15,14 @@
*/
public class Main {
- public static void main(String[] args) {
- // First call: may go in slow path.
- System.out.println($opt$ReturnHelloWorld());
- // Second call: no slow path.
- System.out.println($opt$ReturnHelloWorld());
- }
+ public static void main(String[] args) {
+ // First call: may go in slow path.
+ System.out.println($opt$ReturnHelloWorld());
+ // Second call: no slow path.
+ System.out.println($opt$ReturnHelloWorld());
+ }
- public static String $opt$ReturnHelloWorld() {
- return "Hello World";
- }
+ public static String $opt$ReturnHelloWorld() {
+ return "Hello World";
+ }
}
diff --git a/test/419-long-parameter/src/Main.java b/test/419-long-parameter/src/Main.java
index 808b7f6..f83b3f7 100644
--- a/test/419-long-parameter/src/Main.java
+++ b/test/419-long-parameter/src/Main.java
@@ -15,20 +15,20 @@
*/
public class Main {
- public static void main(String[] args) {
- if ($opt$TestCallee(1.0, 2.0, 1L, 2L) != 1L) {
- throw new Error("Unexpected result");
+ public static void main(String[] args) {
+ if ($opt$TestCallee(1.0, 2.0, 1L, 2L) != 1L) {
+ throw new Error("Unexpected result");
+ }
+ if ($opt$TestCaller() != 1L) {
+ throw new Error("Unexpected result");
+ }
}
- if ($opt$TestCaller() != 1L) {
- throw new Error("Unexpected result");
+
+ public static long $opt$TestCallee(double a, double b, long c, long d) {
+ return d - c;
}
- }
- public static long $opt$TestCallee(double a, double b, long c, long d) {
- return d - c;
- }
-
- public static long $opt$TestCaller() {
- return $opt$TestCallee(1.0, 2.0, 1L, 2L);
- }
+ public static long $opt$TestCaller() {
+ return $opt$TestCallee(1.0, 2.0, 1L, 2L);
+ }
}
diff --git a/test/515-dce-dominator/src/Main.java b/test/515-dce-dominator/src/Main.java
index 8c6ce75..f36b90c 100644
--- a/test/515-dce-dominator/src/Main.java
+++ b/test/515-dce-dominator/src/Main.java
@@ -17,10 +17,10 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- Class<?> c = Class.forName("Dominator");
- Method m = c.getMethod("method", int.class);
- Object[] arguments = { 5 };
- m.invoke(null, arguments);
- }
+ public static void main(String[] args) throws Exception {
+ Class<?> c = Class.forName("Dominator");
+ Method m = c.getMethod("method", int.class);
+ Object[] arguments = { 5 };
+ m.invoke(null, arguments);
+ }
}
diff --git a/test/517-checker-builder-fallthrough/src/Main.java b/test/517-checker-builder-fallthrough/src/Main.java
index 14170f5..5bec073 100644
--- a/test/517-checker-builder-fallthrough/src/Main.java
+++ b/test/517-checker-builder-fallthrough/src/Main.java
@@ -18,15 +18,15 @@
public class Main {
- public static int runTest(int input) throws Exception {
- Class<?> c = Class.forName("TestCase");
- Method m = c.getMethod("testCase", int.class);
- return (Integer) m.invoke(null, input);
- }
-
- public static void main(String[] args) throws Exception {
- if (runTest(42) != 42) {
- throw new Error("Expected 42");
+ public static int runTest(int input) throws Exception {
+ Class<?> c = Class.forName("TestCase");
+ Method m = c.getMethod("testCase", int.class);
+ return (Integer) m.invoke(null, input);
}
- }
+
+ public static void main(String[] args) throws Exception {
+ if (runTest(42) != 42) {
+ throw new Error("Expected 42");
+ }
+ }
}
diff --git a/test/518-null-array-get/src/Main.java b/test/518-null-array-get/src/Main.java
index 7090194..12e2442 100644
--- a/test/518-null-array-get/src/Main.java
+++ b/test/518-null-array-get/src/Main.java
@@ -18,37 +18,37 @@
import java.lang.reflect.Method;
public class Main {
- public static void main(String[] args) throws Exception {
- checkLoad("NullArrayFailInt2Object", true);
- checkLoad("NullArrayFailObject2Int", true);
- checkLoad("NullArraySuccessInt", false);
- checkLoad("NullArraySuccessInt2Float", false);
- checkLoad("NullArraySuccessShort", false);
- checkLoad("NullArraySuccessRef", false);
- }
-
- private static void checkLoad(String className, boolean expectError) throws Exception {
- Class<?> c;
- try {
- c = Class.forName(className);
- if (expectError) {
- throw new RuntimeException("Expected error for " + className);
- }
- Method m = c.getMethod("method");
- try {
- m.invoke(null);
- throw new RuntimeException("Expected an InvocationTargetException");
- } catch (InvocationTargetException e) {
- if (!(e.getCause() instanceof NullPointerException)) {
- throw new RuntimeException("Expected a NullPointerException");
- }
- System.out.println(className);
- }
- } catch (VerifyError e) {
- if (!expectError) {
- throw new RuntimeException(e);
- }
- System.out.println(className);
+ public static void main(String[] args) throws Exception {
+ checkLoad("NullArrayFailInt2Object", true);
+ checkLoad("NullArrayFailObject2Int", true);
+ checkLoad("NullArraySuccessInt", false);
+ checkLoad("NullArraySuccessInt2Float", false);
+ checkLoad("NullArraySuccessShort", false);
+ checkLoad("NullArraySuccessRef", false);
}
- }
+
+ private static void checkLoad(String className, boolean expectError) throws Exception {
+ Class<?> c;
+ try {
+ c = Class.forName(className);
+ if (expectError) {
+ throw new RuntimeException("Expected error for " + className);
+ }
+ Method m = c.getMethod("method");
+ try {
+ m.invoke(null);
+ throw new RuntimeException("Expected an InvocationTargetException");
+ } catch (InvocationTargetException e) {
+ if (!(e.getCause() instanceof NullPointerException)) {
+ throw new RuntimeException("Expected a NullPointerException");
+ }
+ System.out.println(className);
+ }
+ } catch (VerifyError e) {
+ if (!expectError) {
+ throw new RuntimeException(e);
+ }
+ System.out.println(className);
+ }
+ }
}
diff --git a/test/519-bound-load-class/src/Main.java b/test/519-bound-load-class/src/Main.java
index cddeb09..c507aec 100644
--- a/test/519-bound-load-class/src/Main.java
+++ b/test/519-bound-load-class/src/Main.java
@@ -15,25 +15,25 @@
*/
public class Main {
- public static void main(String[] args) {
- testInstanceOf();
- try {
- testNull();
- throw new Error("Expected ClassClastException");
- } catch (ClassCastException e) { /* ignore */ }
- }
-
- public static void testInstanceOf() {
- Object o = Main.class;
- if (o instanceof Main) {
- System.out.println((Main)o);
+ public static void main(String[] args) {
+ testInstanceOf();
+ try {
+ testNull();
+ throw new Error("Expected ClassClastException");
+ } catch (ClassCastException e) { /* ignore */ }
}
- }
- public static void testNull() {
- Object o = Main.class;
- if (o != null) {
- System.out.println((Main)o);
+ public static void testInstanceOf() {
+ Object o = Main.class;
+ if (o instanceof Main) {
+ System.out.println((Main) o);
+ }
}
- }
+
+ public static void testNull() {
+ Object o = Main.class;
+ if (o != null) {
+ System.out.println((Main) o);
+ }
+ }
}
diff --git a/test/617-clinit-oome/src/Main.java b/test/617-clinit-oome/src/Main.java
index bab344f..005f0df 100644
--- a/test/617-clinit-oome/src/Main.java
+++ b/test/617-clinit-oome/src/Main.java
@@ -15,43 +15,43 @@
*/
public class Main {
- private static int exhaustJavaHeap(Object[] data, int index, int size) {
- Runtime.getRuntime().gc();
- while (size > 0) {
+ private static int exhaustJavaHeap(Object[] data, int index, int size) {
+ Runtime.getRuntime().gc();
+ while (size > 0) {
+ try {
+ data[index] = new byte[size];
+ index++;
+ } catch (OutOfMemoryError e) {
+ size /= 2;
+ }
+ }
+ return index;
+ }
+
+ public static void main(String[] args) {
+ Class klass = Other.class;
+ Object[] data = new Object[100000];
try {
- data[index] = new byte[size];
- index++;
+ System.out.println("Filling heap");
+
+ // Make sure that there is no reclaimable memory in the heap. Otherwise we may throw
+ // OOME to prevent GC thrashing, even if later allocations may succeed.
+ Runtime.getRuntime().gc();
+ System.runFinalization();
+ // NOTE: There is a GC invocation in the exhaustJavaHeap(). So we don't need one here.
+
+ int index = 0;
+ int initial_size = 256 * 1024 * 1024;
+ // Repeat to ensure there is no space left on the heap.
+ index = exhaustJavaHeap(data, index, initial_size);
+ index = exhaustJavaHeap(data, index, /*size*/ 4);
+ index = exhaustJavaHeap(data, index, /*size*/ 4);
+
+ // Initialize now that the heap is full.
+ Other.print();
} catch (OutOfMemoryError e) {
- size /= 2;
+ } catch (Exception e) {
+ System.out.println(e);
}
}
- return index;
- }
-
- public static void main(String[] args) {
- Class klass = Other.class;
- Object[] data = new Object[100000];
- try {
- System.out.println("Filling heap");
-
- // Make sure that there is no reclaimable memory in the heap. Otherwise we may throw
- // OOME to prevent GC thrashing, even if later allocations may succeed.
- Runtime.getRuntime().gc();
- System.runFinalization();
- // NOTE: There is a GC invocation in the exhaustJavaHeap(). So we don't need one here.
-
- int index = 0;
- int initial_size = 256 * 1024 * 1024;
- // Repeat to ensure there is no space left on the heap.
- index = exhaustJavaHeap(data, index, initial_size);
- index = exhaustJavaHeap(data, index, /*size*/ 4);
- index = exhaustJavaHeap(data, index, /*size*/ 4);
-
- // Initialize now that the heap is full.
- Other.print();
- } catch (OutOfMemoryError e) {
- } catch (Exception e) {
- System.out.println(e);
- }
- }
}
diff --git a/test/618-checker-induction/src/Main.java b/test/618-checker-induction/src/Main.java
index 824a8db..d15de18 100644
--- a/test/618-checker-induction/src/Main.java
+++ b/test/618-checker-induction/src/Main.java
@@ -19,1017 +19,1027 @@
*/
public class Main {
- static int[] a = new int[10];
+ static int[] a = new int[10];
- static int[] novec = new int[20]; // to prevent vectorization
+ static int[] novec = new int[20]; // to prevent vectorization
- /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- //
- /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
- /// CHECK-NOT: Phi
- static void deadSingleLoop() {
- for (int i = 0; i < 4; i++) {
- }
- }
-
- /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- //
- /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
- /// CHECK-NOT: Phi
- static void deadSingleLoopN(int n) {
- for (int i = 0; i < n; i++) {
- }
- }
-
- /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (before)
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- //
- /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (after)
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- static void potentialInfiniteLoop(int n) {
- for (int i = 0; i <= n; i++) { // loops forever when n = MAX_INT
- }
- }
-
- /// CHECK-START: void Main.deadNestedLoops() loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop>>
- //
- /// CHECK-START: void Main.deadNestedLoops() loop_optimization (after)
- /// CHECK-NOT: Phi
- static void deadNestedLoops() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- }
- }
- }
-
- /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop1:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
- /// CHECK-DAG: Phi loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop3>>
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- //
- /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (after)
- /// CHECK-NOT: Phi
- static void deadNestedAndFollowingLoops() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- for (int k = 0; k < 4; k++) {
+ /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ //
+ /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ static void deadSingleLoop() {
+ for (int i = 0; i < 4; i++) {
}
- for (int k = 0; k < 4; k++) {
+ }
+
+ /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ //
+ /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ static void deadSingleLoopN(int n) {
+ for (int i = 0; i < n; i++) {
}
- }
- for (int j = 0; j < 4; j++) {
- for (int k = 0; k < 4; k++) {
+ }
+
+ /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (before)
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ //
+ /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (after)
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ static void potentialInfiniteLoop(int n) {
+ for (int i = 0; i <= n; i++) { // loops forever when n = MAX_INT
}
- }
- }
- for (int i = 0; i < 4; i++) {
- }
- }
-
- /// CHECK-START: void Main.deadConditional(int) loop_optimization (before)
- /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
- //
- /// CHECK-START: void Main.deadConditional(int) loop_optimization (after)
- /// CHECK-NOT: Phi
- public static void deadConditional(int n) {
- int k = 0;
- int m = 0;
- for (int i = 0; i < n; i++) {
- if (i == 3)
- k = i;
- else
- m = i;
- }
- }
-
- /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- //
- /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (after)
- /// CHECK-NOT: Phi
- public static void deadConditionalCycle(int n) {
- int k = 0;
- int m = 0;
- for (int i = 0; i < n; i++) {
- if (i == 3)
- k--;
- else
- m++;
- }
- }
-
-
- /// CHECK-START: void Main.deadInduction() loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- //
- /// CHECK-START: void Main.deadInduction() loop_optimization (after)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- static void deadInduction() {
- int dead = 0;
- for (int i = 0; i < a.length; i++) {
- a[i] = novec[2 * i] + 1;
- dead += 5;
- }
- }
-
- /// CHECK-START: void Main.deadManyInduction() loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- //
- /// CHECK-START: void Main.deadManyInduction() loop_optimization (after)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- static void deadManyInduction() {
- int dead1 = 0, dead2 = 1, dead3 = 3;
- for (int i = 0; i < a.length; i++) {
- dead1 += 5;
- a[i] = novec[2 * i] + 2;
- dead2 += 10;
- dead3 += 100;
- }
- }
-
- /// CHECK-START: void Main.deadSequence() loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- //
- /// CHECK-START: void Main.deadSequence() loop_optimization (after)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- static void deadSequence() {
- int dead = 0;
- for (int i = 0; i < a.length; i++) {
- a[i] = novec[2 * i] + 3;
- // Increment value defined inside loop,
- // but sequence itself not used anywhere.
- dead += i;
- }
- }
-
- /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (before)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-NOT: BoundsCheck
- //
- /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (after)
- /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
- /// CHECK-NOT: ArrayGet loop:<<Loop>> outer_loop:none
- static void deadCycleWithException(int k) {
- int dead = 0;
- for (int i = 0; i < a.length; i++) {
- a[i] = novec[2 * i] + 4;
- // Increment value of dead cycle may throw exception. Dynamic
- // BCE takes care of the bounds check though, which enables
- // removing the ArrayGet after removing the dead cycle.
- dead += a[k];
- }
- }
-
- /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedFormInductionUp() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 12395 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int closedFormInductionUp() {
- int closed = 12345;
- for (int i = 0; i < 10; i++) {
- closed += 5;
- }
- return closed; // only needs last value
- }
-
- /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedFormInductionInAndDown(int) instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none
- /// CHECK-DAG: <<Int:i\d+>> IntConstant -50 loop:none
- /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Par>>] loop:none
- /// CHECK-DAG: Return [<<Add>>] loop:none
- static int closedFormInductionInAndDown(int closed) {
- for (int i = 0; i < 10; i++) {
- closed -= 5;
- }
- return closed; // only needs last value
- }
-
- /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Select loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (after)
- /// CHECK-NOT: Phi
- /// CHECK-NOT: Select
- //
- /// CHECK-START: int Main.closedFormInductionTrivialIf() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 81 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int closedFormInductionTrivialIf() {
- int closed = 11;
- for (int i = 0; i < 10; i++) {
- // Trivial if becomes trivial select at HIR level.
- // Make sure this is still recognized as induction.
- if (i < 5) {
- closed += 7;
- } else {
- closed += 7;
- }
- }
- return closed; // only needs last value
- }
-
- /// CHECK-START: int Main.closedFormNested() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
- /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
- /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedFormNested() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedFormNested() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 100 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int closedFormNested() {
- int closed = 0;
- for (int i = 0; i < 10; i++) {
- for (int j = 0; j < 10; j++) {
- closed++;
- }
- }
- return closed; // only needs last-value
- }
-
- /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
- /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
- /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedFormNestedAlt() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 15082 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int closedFormNestedAlt() {
- int closed = 12345;
- for (int i = 0; i < 17; i++) {
- for (int j = 0; j < 23; j++) {
- closed += 7;
- }
- }
- return closed; // only needs last-value
- }
-
- // TODO: taken test around closed form?
- static int closedFormInductionUpN(int n) {
- int closed = 12345;
- for (int i = 0; i < n; i++) {
- closed += 5;
- }
- return closed; // only needs last value
- }
-
- // TODO: taken test around closed form?
- static int closedFormInductionInAndDownN(int closed, int n) {
- for (int i = 0; i < n; i++) {
- closed -= 5;
- }
- return closed; // only needs last value
- }
-
- // TODO: move closed form even further out?
- static int closedFormNestedN(int n) {
- int closed = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < 10; j++) {
- closed++;
- }
- }
- return closed; // only needs last-value
- }
-
- // TODO: move closed form even further out?
- static int closedFormNestedNAlt(int n) {
- int closed = 12345;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < 23; j++) {
- closed += 7;
- }
- }
- return closed; // only needs last-value
- }
-
- // TODO: move closed form even further out?
- static int closedFormNestedMN(int m, int n) {
- int closed = 0;
- for (int i = 0; i < m; i++) {
- for (int j = 0; j < n; j++) {
- closed++;
- }
- }
- return closed; // only needs last-value
- }
-
- // TODO: move closed form even further out?
- static int closedFormNestedMNAlt(int m, int n) {
- int closed = 12345;
- for (int i = 0; i < m; i++) {
- for (int j = 0; j < n; j++) {
- closed += 7;
- }
- }
- return closed; // only needs last-value
- }
-
- /// CHECK-START: int Main.mainIndexReturned() loop_optimization (before)
- /// CHECK-DAG: <<Phi:i\d+>> Phi loop:{{B\d+}} outer_loop:none
- /// CHECK-DAG: Return [<<Phi>>] loop:none
- //
- /// CHECK-START: int Main.mainIndexReturned() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.mainIndexReturned() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int mainIndexReturned() {
- int i;
- for (i = 0; i < 10; i++);
- return i;
- }
-
- /// CHECK-START: int Main.periodicReturned9() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.periodicReturned9() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.periodicReturned9() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 1 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int periodicReturned9() {
- int k = 0;
- for (int i = 0; i < 9; i++) {
- k = 1 - k;
- }
- return k;
- }
-
- /// CHECK-START: int Main.periodicReturned10() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.periodicReturned10() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.periodicReturned10() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- static int periodicReturned10() {
- int k = 0;
- for (int i = 0; i < 10; i++) {
- k = 1 - k;
- }
- return k;
- }
-
- /// CHECK-START: int Main.getSum21() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: int Main.getSum21() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.getSum21() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 21 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int getSum21() {
- int k = 0;
- int sum = 0;
- for (int i = 0; i < 6; i++) {
- k++;
- sum += k;
- }
- return sum;
- }
-
- // Ensure double induction does not "overshoot" the subscript range.
- private static int getIncr2(int[] arr) {
- for (int i = 0; i < 12; ) {
- arr[i++] = 30;
- arr[i++] = 29;
- }
- int sum = 0;
- for (int i = 0; i < 12; i++) {
- sum += arr[i];
- }
- return sum;
- }
-
- // TODO: handle as closed/empty eventually?
- static int mainIndexReturnedN(int n) {
- int i;
- for (i = 0; i < n; i++);
- return i;
- }
-
- // TODO: handle as closed/empty eventually?
- static int mainIndexShort1(short s) {
- int i = 0;
- for (i = 0; i < s; i++) { }
- return i;
- }
-
- // TODO: handle as closed/empty eventually?
- static int mainIndexShort2(short s) {
- int i = 0;
- for (i = 0; s > i; i++) { }
- return i;
- }
-
- /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (after)
- /// CHECK-NOT: Phi
- static int periodicReturnedN(int n) {
- int k = 0;
- for (int i = 0; i < n; i++) {
- k = 1 - k;
- }
- return k;
- }
-
- // If ever replaced by closed form, last value should be correct!
- private static int getSumN(int n) {
- int k = 0;
- int sum = 0;
- for (int i = 0; i < n; i++) {
- k++;
- sum += k;
- }
- return sum;
- }
-
- // If ever replaced by closed form, last value should be correct!
- private static int closedTwice() {
- int closed = 0;
- for (int i = 0; i < 10; i++) {
- closed++;
- }
- // Closed form of first loop defines trip count of second loop.
- int other_closed = 0;
- for (int i = 0; i < closed; i++) {
- other_closed++;
- }
- return other_closed;
- }
-
- /// CHECK-START: int Main.closedFeed() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
- /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi3>>] loop:none
- /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
- //
- /// CHECK-START: int Main.closedFeed() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedFeed() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 20 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int closedFeed() {
- int closed = 0;
- for (int i = 0; i < 10; i++) {
- closed++;
- }
- // Closed form of first loop feeds into initial value of second loop,
- // used when generating closed form for the latter.
- for (int i = 0; i < 10; i++) {
- closed++;
- }
- return closed;
- }
-
- /// CHECK-START: int Main.closedLargeUp() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedLargeUp() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedLargeUp() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant -10 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int closedLargeUp() {
- int closed = 0;
- for (int i = 0; i < 10; i++) {
- closed += 0x7fffffff;
- }
- return closed;
- }
-
- /// CHECK-START: int Main.closedLargeDown() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedLargeDown() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedLargeDown() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int closedLargeDown() {
- int closed = 0;
- for (int i = 0; i < 10; i++) {
- closed -= 0x7fffffff;
- }
- return closed;
- }
-
- // Checks that we do not loop optimize if the calculation of the trip count would overflow.
- /// CHECK-START: int Main.closedLinearStepOverflow() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedLinearStepOverflow() loop_optimization (after)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- private static int closedLinearStepOverflow() {
- int closed = 0;
- // Note that this isn't a "one-off" error. We are using MIN and MAX to make sure we overflow.
- for (int i = Integer.MIN_VALUE; i < (Integer.MAX_VALUE - 80); i += 79) {
- closed++;
- }
- return closed;
- }
-
- // Since we cannot guarantee that the start/end wouldn't overflow we do not perform loop
- // optimization.
- /// CHECK-START: int Main.$inline$closedByParameters(int, int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.$inline$closedByParameters(int, int) loop_optimization (after)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- private static int $inline$closedByParameters(int start, int end) {
- int closed = 0;
- for (int i = start; i < end; i++) {
- closed++;
- }
- return closed;
- }
-
- // Since we are inlining `closedByParameters` we know that the parameters are fixed and
- // therefore we can perform loop optimization.
- /// CHECK-START: int Main.closedByParametersWithInline() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: int Main.closedByParametersWithInline() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.closedByParametersWithInline() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int closedByParametersWithInline() {
- return $inline$closedByParameters(0, 10);
- }
-
- /// CHECK-START: int Main.waterFall() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop3:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop4:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi5:i\d+>> Phi loop:<<Loop5:B\d+>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi5>>] loop:none
- //
- /// CHECK-START: int Main.waterFall() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: int Main.waterFall() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 50 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static int waterFall() {
- int i = 0;
- for (; i < 10; i++);
- for (; i < 20; i++);
- for (; i < 30; i++);
- for (; i < 40; i++);
- for (; i < 50; i++);
- return i; // this should become just 50
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom1() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static boolean periodicBoolIdiom1() {
- boolean x = true;
- for (int i = 0; i < 7; i++) {
- x = !x;
- }
- return x;
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom2() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static boolean periodicBoolIdiom2() {
- boolean x = true;
- for (int i = 0; i < 7; i++) {
- x = (x != true);
- }
- return x;
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi1>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom3() instruction_simplifier$after_bce (after)
- /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
- /// CHECK-DAG: Return [<<Int>>] loop:none
- private static boolean periodicBoolIdiom3() {
- boolean x = true;
- for (int i = 0; i < 7; i++) {
- x = (x == false);
- }
- return x;
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (after)
- /// CHECK-NOT: Phi
- private static boolean periodicBoolIdiom1N(boolean x, int n) {
- for (int i = 0; i < n; i++) {
- x = !x;
- }
- return x;
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (after)
- /// CHECK-NOT: Phi
- private static boolean periodicBoolIdiom2N(boolean x, int n) {
- for (int i = 0; i < n; i++) {
- x = (x != true);
- }
- return x;
- }
-
- /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (after)
- /// CHECK-NOT: Phi
- private static boolean periodicBoolIdiom3N(boolean x, int n) {
- for (int i = 0; i < n; i++) {
- x = (x == false);
- }
- return x;
- }
-
- /// CHECK-START: float Main.periodicFloat10() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
- /// CHECK-DAG: <<Float:f\d+>> FloatConstant 2 loop:none
- /// CHECK-DAG: Return [<<Float>>] loop:none
- private static float periodicFloat10() {
- float r = 4.5f;
- float s = 2.0f;
- float t = -1.0f;
- for (int i = 0; i < 10; i++) {
- float tmp = t; t = r; r = s; s = tmp;
- }
- return r;
- }
-
- /// CHECK-START: float Main.periodicFloat11() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
- /// CHECK-DAG: <<Float:f\d+>> FloatConstant -1 loop:none
- /// CHECK-DAG: Return [<<Float>>] loop:none
- private static float periodicFloat11() {
- float r = 4.5f;
- float s = 2.0f;
- float t = -1.0f;
- for (int i = 0; i < 11; i++) {
- float tmp = t; t = r; r = s; s = tmp;
- }
- return r;
- }
-
- /// CHECK-START: float Main.periodicFloat12() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
- /// CHECK-DAG: Return [<<Phi2>>] loop:none
- //
- /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
- /// CHECK-NOT: Phi
- //
- /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
- /// CHECK-DAG: <<Float:f\d+>> FloatConstant 4.5 loop:none
- /// CHECK-DAG: Return [<<Float>>] loop:none
- private static float periodicFloat12() {
- float r = 4.5f;
- float s = 2.0f;
- float t = -1.0f;
- for (int i = 0; i < 12; i++) {
- float tmp = t; t = r; r = s; s = tmp;
- }
- return r;
- }
-
- private static int exceptionExitBeforeAdd() {
- int k = 0;
- try {
- for (int i = 0; i < 10; i++) {
- a[i] = 0;
- k += 10; // increment last
- }
- } catch(Exception e) {
- // Flag error by returning current
- // value of k negated.
- return -k-1;
- }
- return k;
- }
-
- private static int exceptionExitAfterAdd() {
- int k = 0;
- try {
- for (int i = 0; i < 10; i++) {
- k += 10; // increment first
- a[i] = 0;
- }
- } catch(Exception e) {
- // Flag error by returning current
- // value of k negated.
- return -k-1;
- }
- return k;
- }
-
- /// CHECK-START: long Main.closedLinearInductionUnmatchedTypesNotOptimized() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:j\d+>> Phi loop:<<Loop>> outer_loop:none
- //
- /// CHECK-START: long Main.closedLinearInductionUnmatchedTypesNotOptimized() loop_optimization (after)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- /// CHECK-DAG: <<Phi2:j\d+>> Phi loop:<<Loop>> outer_loop:none
- private static long closedLinearInductionUnmatchedTypesNotOptimized() {
- long sum = 0;
- for (int i = 0; i < 10; ++i) {
- ++sum;
- }
- return sum;
- }
-
- /// CHECK-START: short Main.closedLinearInductionNarrowingNotOptimized() loop_optimization (before)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- //
- /// CHECK-START: short Main.closedLinearInductionNarrowingNotOptimized() loop_optimization (after)
- /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
- private static short closedLinearInductionNarrowingNotOptimized() {
- short i = 0;
- for (; i < 10; ++i);
- return i;
- }
-
- public static void main(String[] args) {
- deadSingleLoop();
- deadSingleLoopN(4);
- potentialInfiniteLoop(4);
- deadNestedLoops();
- deadNestedAndFollowingLoops();
- deadConditional(4);
- deadConditionalCycle(4);
-
- deadInduction();
- for (int i = 0; i < a.length; i++) {
- expectEquals(1, a[i]);
- }
- deadManyInduction();
- for (int i = 0; i < a.length; i++) {
- expectEquals(2, a[i]);
- }
- deadSequence();
- for (int i = 0; i < a.length; i++) {
- expectEquals(3, a[i]);
- }
- try {
- deadCycleWithException(-1);
- throw new Error("Expected: IOOB exception");
- } catch (IndexOutOfBoundsException e) {
- }
- for (int i = 0; i < a.length; i++) {
- expectEquals(i == 0 ? 4 : 3, a[i]);
- }
- deadCycleWithException(0);
- for (int i = 0; i < a.length; i++) {
- expectEquals(4, a[i]);
}
- expectEquals(12395, closedFormInductionUp());
- expectEquals(12295, closedFormInductionInAndDown(12345));
- expectEquals(81, closedFormInductionTrivialIf());
- expectEquals(10 * 10, closedFormNested());
- expectEquals(12345 + 17 * 23 * 7, closedFormNestedAlt());
- for (int n = -4; n < 10; n++) {
- int tc = (n <= 0) ? 0 : n;
- expectEquals(12345 + tc * 5, closedFormInductionUpN(n));
- expectEquals(12345 - tc * 5, closedFormInductionInAndDownN(12345, n));
- expectEquals(tc * 10, closedFormNestedN(n));
- expectEquals(12345 + tc * 23 * 7, closedFormNestedNAlt(n));
- expectEquals(tc * (tc + 1), closedFormNestedMN(n, n + 1));
- expectEquals(12345 + tc * (tc + 1) * 7, closedFormNestedMNAlt(n, n + 1));
+ /// CHECK-START: void Main.deadNestedLoops() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop>>
+ //
+ /// CHECK-START: void Main.deadNestedLoops() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ static void deadNestedLoops() {
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ }
+ }
}
- expectEquals(10, mainIndexReturned());
- expectEquals(1, periodicReturned9());
- expectEquals(0, periodicReturned10());
- expectEquals(21, getSum21());
- expectEquals(354, getIncr2(new int[12]));
- for (int n = -4; n < 4; n++) {
- int tc = (n <= 0) ? 0 : n;
- expectEquals(tc, mainIndexReturnedN(n));
- expectEquals(tc, mainIndexShort1((short) n));
- expectEquals(tc, mainIndexShort2((short) n));
- expectEquals(tc & 1, periodicReturnedN(n));
- expectEquals((tc * (tc + 1)) / 2, getSumN(n));
+ /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop1:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
+ /// CHECK-DAG: Phi loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop3>>
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ //
+ /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ static void deadNestedAndFollowingLoops() {
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ for (int k = 0; k < 4; k++) {
+ }
+ for (int k = 0; k < 4; k++) {
+ }
+ }
+ for (int j = 0; j < 4; j++) {
+ for (int k = 0; k < 4; k++) {
+ }
+ }
+ }
+ for (int i = 0; i < 4; i++) {
+ }
}
- expectEquals(10, closedTwice());
- expectEquals(20, closedFeed());
- expectEquals(-10, closedLargeUp());
- expectEquals(10, closedLargeDown());
- expectEquals(54366674, closedLinearStepOverflow());
- expectEquals(10, $inline$closedByParameters(0, 10));
- expectEquals(10, closedByParametersWithInline());
- expectEquals(50, waterFall());
-
- expectEquals(false, periodicBoolIdiom1());
- expectEquals(false, periodicBoolIdiom2());
- expectEquals(false, periodicBoolIdiom3());
- for (int n = -4; n < 10; n++) {
- int tc = (n <= 0) ? 0 : n;
- boolean even = (tc & 1) == 0;
- expectEquals(even, periodicBoolIdiom1N(true, n));
- expectEquals(!even, periodicBoolIdiom1N(false, n));
- expectEquals(even, periodicBoolIdiom2N(true, n));
- expectEquals(!even, periodicBoolIdiom2N(false, n));
- expectEquals(even, periodicBoolIdiom3N(true, n));
- expectEquals(!even, periodicBoolIdiom3N(false, n));
+ /// CHECK-START: void Main.deadConditional(int) loop_optimization (before)
+ /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
+ //
+ /// CHECK-START: void Main.deadConditional(int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ public static void deadConditional(int n) {
+ int k = 0;
+ int m = 0;
+ for (int i = 0; i < n; i++) {
+ if (i == 3)
+ k = i;
+ else
+ m = i;
+ }
}
- expectEquals( 2.0f, periodicFloat10());
- expectEquals(-1.0f, periodicFloat11());
- expectEquals( 4.5f, periodicFloat12());
-
- expectEquals(100, exceptionExitBeforeAdd());
- expectEquals(100, exceptionExitAfterAdd());
- a = null;
- expectEquals(-1, exceptionExitBeforeAdd());
- expectEquals(-11, exceptionExitAfterAdd());
- a = new int[4];
- expectEquals(-41, exceptionExitBeforeAdd());
- expectEquals(-51, exceptionExitAfterAdd());
-
- expectEquals(10, closedLinearInductionUnmatchedTypesNotOptimized());
- expectEquals(10, closedLinearInductionNarrowingNotOptimized());
-
- System.out.println("passed");
- }
-
- private static void expectEquals(float expected, float result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
+ /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ //
+ /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ public static void deadConditionalCycle(int n) {
+ int k = 0;
+ int m = 0;
+ for (int i = 0; i < n; i++) {
+ if (i == 3)
+ k--;
+ else
+ m++;
+ }
}
- }
- private static void expectEquals(int expected, int result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
- }
- }
- private static void expectEquals(boolean expected, boolean result) {
- if (expected != result) {
- throw new Error("Expected: " + expected + ", found: " + result);
+ /// CHECK-START: void Main.deadInduction() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ //
+ /// CHECK-START: void Main.deadInduction() loop_optimization (after)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ static void deadInduction() {
+ int dead = 0;
+ for (int i = 0; i < a.length; i++) {
+ a[i] = novec[2 * i] + 1;
+ dead += 5;
+ }
}
- }
+
+ /// CHECK-START: void Main.deadManyInduction() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ //
+ /// CHECK-START: void Main.deadManyInduction() loop_optimization (after)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ static void deadManyInduction() {
+ int dead1 = 0, dead2 = 1, dead3 = 3;
+ for (int i = 0; i < a.length; i++) {
+ dead1 += 5;
+ a[i] = novec[2 * i] + 2;
+ dead2 += 10;
+ dead3 += 100;
+ }
+ }
+
+ /// CHECK-START: void Main.deadSequence() loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ //
+ /// CHECK-START: void Main.deadSequence() loop_optimization (after)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ static void deadSequence() {
+ int dead = 0;
+ for (int i = 0; i < a.length; i++) {
+ a[i] = novec[2 * i] + 3;
+ // Increment value defined inside loop,
+ // but sequence itself not used anywhere.
+ dead += i;
+ }
+ }
+
+ /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (before)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-NOT: BoundsCheck
+ //
+ /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (after)
+ /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
+ /// CHECK-NOT: ArrayGet loop:<<Loop>> outer_loop:none
+ static void deadCycleWithException(int k) {
+ int dead = 0;
+ for (int i = 0; i < a.length; i++) {
+ a[i] = novec[2 * i] + 4;
+ // Increment value of dead cycle may throw exception. Dynamic
+ // BCE takes care of the bounds check though, which enables
+ // removing the ArrayGet after removing the dead cycle.
+ dead += a[k];
+ }
+ }
+
+ /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedFormInductionUp() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 12395 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int closedFormInductionUp() {
+ int closed = 12345;
+ for (int i = 0; i < 10; i++) {
+ closed += 5;
+ }
+ return closed; // only needs last value
+ }
+
+ /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedFormInductionInAndDown(int) instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant -50 loop:none
+ /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Par>>] loop:none
+ /// CHECK-DAG: Return [<<Add>>] loop:none
+ static int closedFormInductionInAndDown(int closed) {
+ for (int i = 0; i < 10; i++) {
+ closed -= 5;
+ }
+ return closed; // only needs last value
+ }
+
+ /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Select loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ /// CHECK-NOT: Select
+ //
+ /// CHECK-START: int Main.closedFormInductionTrivialIf() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 81 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int closedFormInductionTrivialIf() {
+ int closed = 11;
+ for (int i = 0; i < 10; i++) {
+ // Trivial if becomes trivial select at HIR level.
+ // Make sure this is still recognized as induction.
+ if (i < 5) {
+ closed += 7;
+ } else {
+ closed += 7;
+ }
+ }
+ return closed; // only needs last value
+ }
+
+ /// CHECK-START: int Main.closedFormNested() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedFormNested() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedFormNested() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 100 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int closedFormNested() {
+ int closed = 0;
+ for (int i = 0; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ closed++;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedFormNestedAlt() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 15082 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int closedFormNestedAlt() {
+ int closed = 12345;
+ for (int i = 0; i < 17; i++) {
+ for (int j = 0; j < 23; j++) {
+ closed += 7;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ // TODO: taken test around closed form?
+ static int closedFormInductionUpN(int n) {
+ int closed = 12345;
+ for (int i = 0; i < n; i++) {
+ closed += 5;
+ }
+ return closed; // only needs last value
+ }
+
+ // TODO: taken test around closed form?
+ static int closedFormInductionInAndDownN(int closed, int n) {
+ for (int i = 0; i < n; i++) {
+ closed -= 5;
+ }
+ return closed; // only needs last value
+ }
+
+ // TODO: move closed form even further out?
+ static int closedFormNestedN(int n) {
+ int closed = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < 10; j++) {
+ closed++;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ // TODO: move closed form even further out?
+ static int closedFormNestedNAlt(int n) {
+ int closed = 12345;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < 23; j++) {
+ closed += 7;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ // TODO: move closed form even further out?
+ static int closedFormNestedMN(int m, int n) {
+ int closed = 0;
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ closed++;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ // TODO: move closed form even further out?
+ static int closedFormNestedMNAlt(int m, int n) {
+ int closed = 12345;
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ closed += 7;
+ }
+ }
+ return closed; // only needs last-value
+ }
+
+ /// CHECK-START: int Main.mainIndexReturned() loop_optimization (before)
+ /// CHECK-DAG: <<Phi:i\d+>> Phi loop:{{B\d+}} outer_loop:none
+ /// CHECK-DAG: Return [<<Phi>>] loop:none
+ //
+ /// CHECK-START: int Main.mainIndexReturned() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.mainIndexReturned() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int mainIndexReturned() {
+ int i;
+ for (i = 0; i < 10; i++);
+ return i;
+ }
+
+ /// CHECK-START: int Main.periodicReturned9() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.periodicReturned9() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.periodicReturned9() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 1 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int periodicReturned9() {
+ int k = 0;
+ for (int i = 0; i < 9; i++) {
+ k = 1 - k;
+ }
+ return k;
+ }
+
+ /// CHECK-START: int Main.periodicReturned10() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.periodicReturned10() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.periodicReturned10() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ static int periodicReturned10() {
+ int k = 0;
+ for (int i = 0; i < 10; i++) {
+ k = 1 - k;
+ }
+ return k;
+ }
+
+ /// CHECK-START: int Main.getSum21() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: int Main.getSum21() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.getSum21() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 21 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int getSum21() {
+ int k = 0;
+ int sum = 0;
+ for (int i = 0; i < 6; i++) {
+ k++;
+ sum += k;
+ }
+ return sum;
+ }
+
+ // Ensure double induction does not "overshoot" the subscript range.
+ private static int getIncr2(int[] arr) {
+ for (int i = 0; i < 12; ) {
+ arr[i++] = 30;
+ arr[i++] = 29;
+ }
+ int sum = 0;
+ for (int i = 0; i < 12; i++) {
+ sum += arr[i];
+ }
+ return sum;
+ }
+
+ // TODO: handle as closed/empty eventually?
+ static int mainIndexReturnedN(int n) {
+ int i;
+ for (i = 0; i < n; i++);
+ return i;
+ }
+
+ // TODO: handle as closed/empty eventually?
+ static int mainIndexShort1(short s) {
+ int i = 0;
+ for (i = 0; i < s; i++) { }
+ return i;
+ }
+
+ // TODO: handle as closed/empty eventually?
+ static int mainIndexShort2(short s) {
+ int i = 0;
+ for (i = 0; s > i; i++) { }
+ return i;
+ }
+
+ /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ static int periodicReturnedN(int n) {
+ int k = 0;
+ for (int i = 0; i < n; i++) {
+ k = 1 - k;
+ }
+ return k;
+ }
+
+ // If ever replaced by closed form, last value should be correct!
+ private static int getSumN(int n) {
+ int k = 0;
+ int sum = 0;
+ for (int i = 0; i < n; i++) {
+ k++;
+ sum += k;
+ }
+ return sum;
+ }
+
+ // If ever replaced by closed form, last value should be correct!
+ private static int closedTwice() {
+ int closed = 0;
+ for (int i = 0; i < 10; i++) {
+ closed++;
+ }
+ // Closed form of first loop defines trip count of second loop.
+ int other_closed = 0;
+ for (int i = 0; i < closed; i++) {
+ other_closed++;
+ }
+ return other_closed;
+ }
+
+ /// CHECK-START: int Main.closedFeed() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi3>>] loop:none
+ /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
+ //
+ /// CHECK-START: int Main.closedFeed() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedFeed() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 20 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int closedFeed() {
+ int closed = 0;
+ for (int i = 0; i < 10; i++) {
+ closed++;
+ }
+ // Closed form of first loop feeds into initial value of second loop,
+ // used when generating closed form for the latter.
+ for (int i = 0; i < 10; i++) {
+ closed++;
+ }
+ return closed;
+ }
+
+ /// CHECK-START: int Main.closedLargeUp() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedLargeUp() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedLargeUp() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant -10 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int closedLargeUp() {
+ int closed = 0;
+ for (int i = 0; i < 10; i++) {
+ closed += 0x7fffffff;
+ }
+ return closed;
+ }
+
+ /// CHECK-START: int Main.closedLargeDown() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedLargeDown() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedLargeDown() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int closedLargeDown() {
+ int closed = 0;
+ for (int i = 0; i < 10; i++) {
+ closed -= 0x7fffffff;
+ }
+ return closed;
+ }
+
+ // Checks that we do not loop optimize if the calculation of the trip count would overflow.
+ /// CHECK-START: int Main.closedLinearStepOverflow() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedLinearStepOverflow() loop_optimization (after)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ private static int closedLinearStepOverflow() {
+ int closed = 0;
+ // Note that this isn't a "one-off" error.
+ // We are using MIN and MAX to make sure we overflow.
+ for (int i = Integer.MIN_VALUE; i < (Integer.MAX_VALUE - 80); i += 79) {
+ closed++;
+ }
+ return closed;
+ }
+
+ // Since we cannot guarantee that the start/end wouldn't overflow we do not perform loop
+ // optimization.
+ /// CHECK-START: int Main.$inline$closedByParameters(int, int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.$inline$closedByParameters(int, int) loop_optimization (after)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ private static int $inline$closedByParameters(int start, int end) {
+ int closed = 0;
+ for (int i = start; i < end; i++) {
+ closed++;
+ }
+ return closed;
+ }
+
+ // Since we are inlining `closedByParameters` we know that the parameters are fixed and
+ // therefore we can perform loop optimization.
+ /// CHECK-START: int Main.closedByParametersWithInline() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: int Main.closedByParametersWithInline() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.closedByParametersWithInline() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int closedByParametersWithInline() {
+ return $inline$closedByParameters(0, 10);
+ }
+
+ /// CHECK-START: int Main.waterFall() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop3:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop4:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi5:i\d+>> Phi loop:<<Loop5:B\d+>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi5>>] loop:none
+ //
+ /// CHECK-START: int Main.waterFall() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: int Main.waterFall() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 50 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static int waterFall() {
+ int i = 0;
+ for (; i < 10; i++);
+ for (; i < 20; i++);
+ for (; i < 30; i++);
+ for (; i < 40; i++);
+ for (; i < 50; i++);
+ return i; // this should become just 50
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom1() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static boolean periodicBoolIdiom1() {
+ boolean x = true;
+ for (int i = 0; i < 7; i++) {
+ x = !x;
+ }
+ return x;
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom2() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static boolean periodicBoolIdiom2() {
+ boolean x = true;
+ for (int i = 0; i < 7; i++) {
+ x = (x != true);
+ }
+ return x;
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi1>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom3() instruction_simplifier$after_bce (after)
+ /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
+ /// CHECK-DAG: Return [<<Int>>] loop:none
+ private static boolean periodicBoolIdiom3() {
+ boolean x = true;
+ for (int i = 0; i < 7; i++) {
+ x = (x == false);
+ }
+ return x;
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ private static boolean periodicBoolIdiom1N(boolean x, int n) {
+ for (int i = 0; i < n; i++) {
+ x = !x;
+ }
+ return x;
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ private static boolean periodicBoolIdiom2N(boolean x, int n) {
+ for (int i = 0; i < n; i++) {
+ x = (x != true);
+ }
+ return x;
+ }
+
+ /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (after)
+ /// CHECK-NOT: Phi
+ private static boolean periodicBoolIdiom3N(boolean x, int n) {
+ for (int i = 0; i < n; i++) {
+ x = (x == false);
+ }
+ return x;
+ }
+
+ /// CHECK-START: float Main.periodicFloat10() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
+ /// CHECK-DAG: <<Float:f\d+>> FloatConstant 2 loop:none
+ /// CHECK-DAG: Return [<<Float>>] loop:none
+ private static float periodicFloat10() {
+ float r = 4.5f;
+ float s = 2.0f;
+ float t = -1.0f;
+ for (int i = 0; i < 10; i++) {
+ float tmp = t;
+ t = r;
+ r = s;
+ s = tmp;
+ }
+ return r;
+ }
+
+ /// CHECK-START: float Main.periodicFloat11() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
+ /// CHECK-DAG: <<Float:f\d+>> FloatConstant -1 loop:none
+ /// CHECK-DAG: Return [<<Float>>] loop:none
+ private static float periodicFloat11() {
+ float r = 4.5f;
+ float s = 2.0f;
+ float t = -1.0f;
+ for (int i = 0; i < 11; i++) {
+ float tmp = t;
+ t = r;
+ r = s;
+ s = tmp;
+ }
+ return r;
+ }
+
+ /// CHECK-START: float Main.periodicFloat12() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
+ /// CHECK-DAG: Return [<<Phi2>>] loop:none
+ //
+ /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
+ /// CHECK-NOT: Phi
+ //
+ /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
+ /// CHECK-DAG: <<Float:f\d+>> FloatConstant 4.5 loop:none
+ /// CHECK-DAG: Return [<<Float>>] loop:none
+ private static float periodicFloat12() {
+ float r = 4.5f;
+ float s = 2.0f;
+ float t = -1.0f;
+ for (int i = 0; i < 12; i++) {
+ float tmp = t;
+ t = r;
+ r = s;
+ s = tmp;
+ }
+ return r;
+ }
+
+ private static int exceptionExitBeforeAdd() {
+ int k = 0;
+ try {
+ for (int i = 0; i < 10; i++) {
+ a[i] = 0;
+ k += 10; // increment last
+ }
+ } catch (Exception e) {
+ // Flag error by returning current
+ // value of k negated.
+ return -k - 1;
+ }
+ return k;
+ }
+
+ private static int exceptionExitAfterAdd() {
+ int k = 0;
+ try {
+ for (int i = 0; i < 10; i++) {
+ k += 10; // increment first
+ a[i] = 0;
+ }
+ } catch (Exception e) {
+ // Flag error by returning current
+ // value of k negated.
+ return -k - 1;
+ }
+ return k;
+ }
+
+ /// CHECK-START: long Main.closedLinearInductionUnmatchedTypesNotOptimized() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:j\d+>> Phi loop:<<Loop>> outer_loop:none
+ //
+ /// CHECK-START: long Main.closedLinearInductionUnmatchedTypesNotOptimized() loop_optimization (after)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ /// CHECK-DAG: <<Phi2:j\d+>> Phi loop:<<Loop>> outer_loop:none
+ private static long closedLinearInductionUnmatchedTypesNotOptimized() {
+ long sum = 0;
+ for (int i = 0; i < 10; ++i) {
+ ++sum;
+ }
+ return sum;
+ }
+
+ /// CHECK-START: short Main.closedLinearInductionNarrowingNotOptimized() loop_optimization (before)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ //
+ /// CHECK-START: short Main.closedLinearInductionNarrowingNotOptimized() loop_optimization (after)
+ /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
+ private static short closedLinearInductionNarrowingNotOptimized() {
+ short i = 0;
+ for (; i < 10; ++i);
+ return i;
+ }
+
+ public static void main(String[] args) {
+ deadSingleLoop();
+ deadSingleLoopN(4);
+ potentialInfiniteLoop(4);
+ deadNestedLoops();
+ deadNestedAndFollowingLoops();
+ deadConditional(4);
+ deadConditionalCycle(4);
+
+ deadInduction();
+ for (int i = 0; i < a.length; i++) {
+ expectEquals(1, a[i]);
+ }
+ deadManyInduction();
+ for (int i = 0; i < a.length; i++) {
+ expectEquals(2, a[i]);
+ }
+ deadSequence();
+ for (int i = 0; i < a.length; i++) {
+ expectEquals(3, a[i]);
+ }
+ try {
+ deadCycleWithException(-1);
+ throw new Error("Expected: IOOB exception");
+ } catch (IndexOutOfBoundsException e) {
+ }
+ for (int i = 0; i < a.length; i++) {
+ expectEquals(i == 0 ? 4 : 3, a[i]);
+ }
+ deadCycleWithException(0);
+ for (int i = 0; i < a.length; i++) {
+ expectEquals(4, a[i]);
+ }
+
+ expectEquals(12395, closedFormInductionUp());
+ expectEquals(12295, closedFormInductionInAndDown(12345));
+ expectEquals(81, closedFormInductionTrivialIf());
+ expectEquals(10 * 10, closedFormNested());
+ expectEquals(12345 + 17 * 23 * 7, closedFormNestedAlt());
+ for (int n = -4; n < 10; n++) {
+ int tc = (n <= 0) ? 0 : n;
+ expectEquals(12345 + tc * 5, closedFormInductionUpN(n));
+ expectEquals(12345 - tc * 5, closedFormInductionInAndDownN(12345, n));
+ expectEquals(tc * 10, closedFormNestedN(n));
+ expectEquals(12345 + tc * 23 * 7, closedFormNestedNAlt(n));
+ expectEquals(tc * (tc + 1), closedFormNestedMN(n, n + 1));
+ expectEquals(12345 + tc * (tc + 1) * 7, closedFormNestedMNAlt(n, n + 1));
+ }
+
+ expectEquals(10, mainIndexReturned());
+ expectEquals(1, periodicReturned9());
+ expectEquals(0, periodicReturned10());
+ expectEquals(21, getSum21());
+ expectEquals(354, getIncr2(new int[12]));
+ for (int n = -4; n < 4; n++) {
+ int tc = (n <= 0) ? 0 : n;
+ expectEquals(tc, mainIndexReturnedN(n));
+ expectEquals(tc, mainIndexShort1((short) n));
+ expectEquals(tc, mainIndexShort2((short) n));
+ expectEquals(tc & 1, periodicReturnedN(n));
+ expectEquals((tc * (tc + 1)) / 2, getSumN(n));
+ }
+
+ expectEquals(10, closedTwice());
+ expectEquals(20, closedFeed());
+ expectEquals(-10, closedLargeUp());
+ expectEquals(10, closedLargeDown());
+ expectEquals(54366674, closedLinearStepOverflow());
+ expectEquals(10, $inline$closedByParameters(0, 10));
+ expectEquals(10, closedByParametersWithInline());
+ expectEquals(50, waterFall());
+
+ expectEquals(false, periodicBoolIdiom1());
+ expectEquals(false, periodicBoolIdiom2());
+ expectEquals(false, periodicBoolIdiom3());
+ for (int n = -4; n < 10; n++) {
+ int tc = (n <= 0) ? 0 : n;
+ boolean even = (tc & 1) == 0;
+ expectEquals(even, periodicBoolIdiom1N(true, n));
+ expectEquals(!even, periodicBoolIdiom1N(false, n));
+ expectEquals(even, periodicBoolIdiom2N(true, n));
+ expectEquals(!even, periodicBoolIdiom2N(false, n));
+ expectEquals(even, periodicBoolIdiom3N(true, n));
+ expectEquals(!even, periodicBoolIdiom3N(false, n));
+ }
+
+ expectEquals( 2.0f, periodicFloat10());
+ expectEquals(-1.0f, periodicFloat11());
+ expectEquals( 4.5f, periodicFloat12());
+
+ expectEquals(100, exceptionExitBeforeAdd());
+ expectEquals(100, exceptionExitAfterAdd());
+ a = null;
+ expectEquals(-1, exceptionExitBeforeAdd());
+ expectEquals(-11, exceptionExitAfterAdd());
+ a = new int[4];
+ expectEquals(-41, exceptionExitBeforeAdd());
+ expectEquals(-51, exceptionExitAfterAdd());
+
+ expectEquals(10, closedLinearInductionUnmatchedTypesNotOptimized());
+ expectEquals(10, closedLinearInductionNarrowingNotOptimized());
+
+ System.out.println("passed");
+ }
+
+ private static void expectEquals(float expected, float result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
+
+ private static void expectEquals(int expected, int result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
+
+ private static void expectEquals(boolean expected, boolean result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
}
diff --git a/test/619-checker-current-method/src/Main.java b/test/619-checker-current-method/src/Main.java
index d829370..3ab73fa 100644
--- a/test/619-checker-current-method/src/Main.java
+++ b/test/619-checker-current-method/src/Main.java
@@ -15,19 +15,18 @@
*/
public class Main {
+ // Check that there is no instruction storing to stack.
+ /// CHECK-START-X86: int Main.foo(int, int, int, int, int, int) disassembly (after)
+ /// CHECK-NOT: mov [{{\w+}}], {{\w+}}
- // Check that there is no instruction storing to stack.
- /// CHECK-START-X86: int Main.foo(int, int, int, int, int, int) disassembly (after)
- /// CHECK-NOT: mov [{{\w+}}], {{\w+}}
-
- // Use enough parameters to ensure we'll need a frame.
- public static int foo(int a, int b, int c, int d, int e, int f) {
- return a + b + c + d + e + f;
- }
-
- public static void main(String[] args) {
- if (foo(1, 2, 3, 4, 5, 6) != 21) {
- throw new Error("Expected 21");
+ // Use enough parameters to ensure we'll need a frame.
+ public static int foo(int a, int b, int c, int d, int e, int f) {
+ return a + b + c + d + e + f;
}
- }
+
+ public static void main(String[] args) {
+ if (foo(1, 2, 3, 4, 5, 6) != 21) {
+ throw new Error("Expected 21");
+ }
+ }
}
diff --git a/test/719-varhandle-concurrency/src/Main.java b/test/719-varhandle-concurrency/src/Main.java
index 577cdbf..47f523f 100644
--- a/test/719-varhandle-concurrency/src/Main.java
+++ b/test/719-varhandle-concurrency/src/Main.java
@@ -33,197 +33,196 @@
* were not run at all (skipped by all threads).
*/
public class Main {
- private static final VarHandle QA;
- static {
- QA = MethodHandles.arrayElementVarHandle(TestTask[].class);
- }
-
- private static final int TASK_COUNT = 10000;
- private static final int THREAD_COUNT = 20;
- /* Each test may need several retries before a concurrent failure is seen. In the past, for a
- * known bug, between 5 and 10 retries were sufficient. Use RETRIES to configure how many
- * iterations to retry for each test scenario. However, to avoid the test running for too long,
- * for example with gcstress, set a cap duration in MAX_RETRIES_DURATION. With this at least one
- * iteration would run, but there could be fewer retries if each of them takes too long. */
- private static final int RETRIES = 50;
- // b/235431387: timeout reduced from 1 minute
- private static final Duration MAX_RETRIES_DURATION = Duration.ofSeconds(15);
-
- public static void main(String[] args) throws Throwable {
- testConcurrentProcessing(new CompareAndExchangeRunnerFactory(), "compareAndExchange");
- testConcurrentProcessing(new CompareAndSetRunnerFactory(), "compareAndSet");
- testConcurrentProcessing(new WeakCompareAndSetRunnerFactory(), "weakCompareAndSet");
- }
-
- private static void testConcurrentProcessing(RunnerFactory factory,
- String testName) throws Throwable {
- final Duration startTs = Duration.ofNanos(System.nanoTime());
- final Duration endTs = startTs.plus(MAX_RETRIES_DURATION);
- for (int i = 0; i < RETRIES; ++i) {
- concurrentProcessingTestIteration(factory, i, testName);
- Duration now = Duration.ofNanos(System.nanoTime());
- if (0 < now.compareTo(endTs)) {
- break;
- }
+ private static final VarHandle QA;
+ static {
+ QA = MethodHandles.arrayElementVarHandle(TestTask[].class);
}
- }
- private static void concurrentProcessingTestIteration(RunnerFactory factory,
- int iteration, String testName) throws Throwable {
- final TestTask[] tasks = new TestTask[TASK_COUNT];
- final AtomicInteger result = new AtomicInteger();
+ private static final int TASK_COUNT = 10000;
+ private static final int THREAD_COUNT = 20;
+ /* Each test may need several retries before a concurrent failure is seen. In the past, for a
+ * known bug, between 5 and 10 retries were sufficient. Use RETRIES to configure how many
+ * iterations to retry for each test scenario. However, to avoid the test running for too long,
+ * for example with gcstress, set a cap duration in MAX_RETRIES_DURATION. With this at least one
+ * iteration would run, but there could be fewer retries if each of them takes too long. */
+ private static final int RETRIES = 50;
+ // b/235431387: timeout reduced from 1 minute
+ private static final Duration MAX_RETRIES_DURATION = Duration.ofSeconds(15);
- for (int i = 0; i < TASK_COUNT; ++i) {
- tasks[i] = new TestTask(Integer.valueOf(i+1), result::addAndGet);
- }
-
- Thread[] threads = new Thread[THREAD_COUNT];
- for (int i = 0; i < THREAD_COUNT; ++i) {
- threads[i] = factory.createRunner(tasks);
- }
-
- for (int i = 0; i < THREAD_COUNT; ++i) {
- threads[i].start();
- }
-
- for (int i = 0; i < THREAD_COUNT; ++i) {
- threads[i].join();
- }
-
- check(result.get(), TASK_COUNT * (TASK_COUNT + 1) / 2,
- testName + " test result not as expected", iteration);
- }
-
- /**
- * Processes the task queue until there are no tasks left.
- *
- * The actual task-grabbing mechanism is implemented in subclasses through grabTask(). This allows
- * testing various mechanisms, like compareAndSet() and compareAndExchange().
- */
- private static abstract class TaskRunner extends Thread {
-
- protected final TestTask[] tasks;
-
- TaskRunner(TestTask[] tasks) {
- this.tasks = tasks;
- }
-
- @Override
- public void run() {
- int i = 0;
- while (i < TASK_COUNT) {
- TestTask t = (TestTask) QA.get(tasks, i);
- if (t == null) {
- ++i;
- continue;
- }
- if (!grabTask(t, i)) {
- continue;
- }
- ++i;
- VarHandle.releaseFence();
- t.exec();
- }
- }
-
- /**
- * Grabs the next task from the queue in an atomic way.
- *
- * Once a task is retrieved successfully, the queue should no longer hold a reference to it.
- * This would be done, for example, by swapping the task with a null value.
- *
- * @param t The task to get from the queue
- * @param i The index where the task is found
- *
- * @return {@code true} if the task has been retrieved and is not available to any other
- * threads. Otherwise {@code false}. If {@code false} is returned, then either the task was no
- * longer present on the queue due to another thread grabbing it, or, in case of spurious
- * failure, the task is still available and no other thread managed to grab it.
- */
- protected abstract boolean grabTask(TestTask t, int i);
- }
-
- private static class TaskRunnerWithCompareAndExchange extends TaskRunner {
-
- TaskRunnerWithCompareAndExchange(TestTask[] tasks) {
- super(tasks);
- }
-
- @Override
- protected boolean grabTask(TestTask t, int i) {
- return (t == QA.compareAndExchange(tasks, i, t, null));
- }
- }
-
- private static class TaskRunnerWithCompareAndSet extends TaskRunner {
-
- TaskRunnerWithCompareAndSet(TestTask[] tasks) {
- super(tasks);
- }
-
- @Override
- protected boolean grabTask(TestTask t, int i) {
- return QA.compareAndSet(tasks, i, t, null);
- }
- }
-
- private static class TaskRunnerWithWeakCompareAndSet extends TaskRunner {
-
- TaskRunnerWithWeakCompareAndSet(TestTask[] tasks) {
- super(tasks);
- }
-
- @Override
- protected boolean grabTask(TestTask t, int i) {
- return QA.weakCompareAndSet(tasks, i, t, null);
- }
- }
-
-
- private interface RunnerFactory {
- Thread createRunner(TestTask[] tasks);
- }
-
- private static class CompareAndExchangeRunnerFactory implements RunnerFactory {
- @Override
- public Thread createRunner(TestTask[] tasks) {
- return new TaskRunnerWithCompareAndExchange(tasks);
- }
- }
-
- private static class CompareAndSetRunnerFactory implements RunnerFactory {
- @Override
- public Thread createRunner(TestTask[] tasks) {
- return new TaskRunnerWithCompareAndSet(tasks);
- }
- }
-
- private static class WeakCompareAndSetRunnerFactory implements RunnerFactory {
- @Override
- public Thread createRunner(TestTask[] tasks) {
- return new TaskRunnerWithWeakCompareAndSet(tasks);
- }
- }
-
- private static class TestTask {
- private final Integer ord;
- private final Consumer<Integer> action;
-
- TestTask(Integer ord, Consumer<Integer> action) {
- this.ord = ord;
- this.action = action;
- }
-
- public void exec() {
- action.accept(ord);
- }
- }
-
- private static void check(int actual, int expected, String msg, int iteration) {
- if (actual != expected) {
- System.err.println(String.format("[iteration %d] %s : %d != %d",
- iteration, msg, actual, expected));
- System.exit(1);
+ public static void main(String[] args) throws Throwable {
+ testConcurrentProcessing(new CompareAndExchangeRunnerFactory(), "compareAndExchange");
+ testConcurrentProcessing(new CompareAndSetRunnerFactory(), "compareAndSet");
+ testConcurrentProcessing(new WeakCompareAndSetRunnerFactory(), "weakCompareAndSet");
}
- }
+
+ private static void testConcurrentProcessing(RunnerFactory factory, String testName)
+ throws Throwable {
+ final Duration startTs = Duration.ofNanos(System.nanoTime());
+ final Duration endTs = startTs.plus(MAX_RETRIES_DURATION);
+ for (int i = 0; i < RETRIES; ++i) {
+ concurrentProcessingTestIteration(factory, i, testName);
+ Duration now = Duration.ofNanos(System.nanoTime());
+ if (0 < now.compareTo(endTs)) {
+ break;
+ }
+ }
+ }
+
+ private static void concurrentProcessingTestIteration(
+ RunnerFactory factory, int iteration, String testName) throws Throwable {
+ final TestTask[] tasks = new TestTask[TASK_COUNT];
+ final AtomicInteger result = new AtomicInteger();
+
+ for (int i = 0; i < TASK_COUNT; ++i) {
+ tasks[i] = new TestTask(Integer.valueOf(i + 1), result::addAndGet);
+ }
+
+ Thread[] threads = new Thread[THREAD_COUNT];
+ for (int i = 0; i < THREAD_COUNT; ++i) {
+ threads[i] = factory.createRunner(tasks);
+ }
+
+ for (int i = 0; i < THREAD_COUNT; ++i) {
+ threads[i].start();
+ }
+
+ for (int i = 0; i < THREAD_COUNT; ++i) {
+ threads[i].join();
+ }
+
+ check(result.get(),
+ TASK_COUNT * (TASK_COUNT + 1) / 2,
+ testName + " test result not as expected",
+ iteration);
+ }
+
+ /**
+ * Processes the task queue until there are no tasks left.
+ *
+ * The actual task-grabbing mechanism is implemented in subclasses through grabTask().
+ * This allows testing various mechanisms, like compareAndSet() and compareAndExchange().
+ */
+ private static abstract class TaskRunner extends Thread {
+
+ protected final TestTask[] tasks;
+
+ TaskRunner(TestTask[] tasks) {
+ this.tasks = tasks;
+ }
+
+ @Override
+ public void run() {
+ int i = 0;
+ while (i < TASK_COUNT) {
+ TestTask t = (TestTask) QA.get(tasks, i);
+ if (t == null) {
+ ++i;
+ continue;
+ }
+ if (!grabTask(t, i)) {
+ continue;
+ }
+ ++i;
+ VarHandle.releaseFence();
+ t.exec();
+ }
+ }
+
+ /**
+ * Grabs the next task from the queue in an atomic way.
+ *
+ * Once a task is retrieved successfully, the queue should no longer hold a reference to it.
+ * This would be done, for example, by swapping the task with a null value.
+ *
+ * @param t The task to get from the queue
+ * @param i The index where the task is found
+ *
+ * @return {@code true} if the task has been retrieved and is not available to any other
+ * threads. Otherwise {@code false}. If {@code false} is returned, then either the task was
+ * no longer present on the queue due to another thread grabbing it, or, in case of spurious
+ * failure, the task is still available and no other thread managed to grab it.
+ */
+ protected abstract boolean grabTask(TestTask t, int i);
+ }
+
+ private static class TaskRunnerWithCompareAndExchange extends TaskRunner {
+ TaskRunnerWithCompareAndExchange(TestTask[] tasks) {
+ super(tasks);
+ }
+
+ @Override
+ protected boolean grabTask(TestTask t, int i) {
+ return (t == QA.compareAndExchange(tasks, i, t, null));
+ }
+ }
+
+ private static class TaskRunnerWithCompareAndSet extends TaskRunner {
+ TaskRunnerWithCompareAndSet(TestTask[] tasks) {
+ super(tasks);
+ }
+
+ @Override
+ protected boolean grabTask(TestTask t, int i) {
+ return QA.compareAndSet(tasks, i, t, null);
+ }
+ }
+
+ private static class TaskRunnerWithWeakCompareAndSet extends TaskRunner {
+ TaskRunnerWithWeakCompareAndSet(TestTask[] tasks) {
+ super(tasks);
+ }
+
+ @Override
+ protected boolean grabTask(TestTask t, int i) {
+ return QA.weakCompareAndSet(tasks, i, t, null);
+ }
+ }
+
+
+ private interface RunnerFactory {
+ Thread createRunner(TestTask[] tasks);
+ }
+
+ private static class CompareAndExchangeRunnerFactory implements RunnerFactory {
+ @Override
+ public Thread createRunner(TestTask[] tasks) {
+ return new TaskRunnerWithCompareAndExchange(tasks);
+ }
+ }
+
+ private static class CompareAndSetRunnerFactory implements RunnerFactory {
+ @Override
+ public Thread createRunner(TestTask[] tasks) {
+ return new TaskRunnerWithCompareAndSet(tasks);
+ }
+ }
+
+ private static class WeakCompareAndSetRunnerFactory implements RunnerFactory {
+ @Override
+ public Thread createRunner(TestTask[] tasks) {
+ return new TaskRunnerWithWeakCompareAndSet(tasks);
+ }
+ }
+
+ private static class TestTask {
+ private final Integer ord;
+ private final Consumer<Integer> action;
+
+ TestTask(Integer ord, Consumer<Integer> action) {
+ this.ord = ord;
+ this.action = action;
+ }
+
+ public void exec() {
+ action.accept(ord);
+ }
+ }
+
+ private static void check(int actual, int expected, String msg, int iteration) {
+ if (actual != expected) {
+ System.err.println(String.format(
+ "[iteration %d] %s : %d != %d", iteration, msg, actual, expected));
+ System.exit(1);
+ }
+ }
}
diff --git a/test/815-invokeinterface-default/src/Main.java b/test/815-invokeinterface-default/src/Main.java
index db3612b..97321c8 100644
--- a/test/815-invokeinterface-default/src/Main.java
+++ b/test/815-invokeinterface-default/src/Main.java
@@ -18,174 +18,174 @@
// An interface with enough methods to trigger a conflict.
interface Itf {
- public void method0a();
- public void method0b();
- public void method0c();
- public void method0d();
- public void method0e();
- public void method0f();
- public void method0g();
- public void method0h();
- public void method0i();
- public void method0j();
- public void method0k();
- public void method0l();
- public void method0m();
- public void method0n();
- public void method0o();
- public void method0p();
- public void method0q();
- public void method0r();
- public void method0s();
- public void method0t();
- public void method0u();
- public void method0v();
- public void method0w();
- public void method0x();
- public void method0y();
- public void method0z();
- public void method1a();
- public void method1b();
- public void method1c();
- public void method1d();
- public void method1e();
- public void method1f();
- public void method1g();
- public void method1h();
- public void method1i();
- public void method1j();
- public void method1k();
- public void method1l();
- public void method1m();
- public void method1n();
- public void method1o();
- public void method1p();
- public void method1q();
- public void method1r();
- public void method1s();
- public void method1t();
- public void method1u();
- public void method1v();
- public void method1w();
- public void method1x();
- public void method1y();
- public void method1z();
- public void method2a();
- public void method2b();
- public void method2c();
- public void method2d();
- public void method2e();
- public void method2f();
- public void method2g();
- public void method2h();
- public void method2i();
- public void method2j();
- public void method2k();
- public void method2l();
- public void method2m();
- public void method2n();
- public void method2o();
- public void method2p();
- public void method2q();
- public void method2r();
- public void method2s();
- public void method2t();
- public void method2u();
- public void method2v();
- public void method2w();
- public void method2x();
- public void method2y();
- public void method2z();
+ public void method0a();
+ public void method0b();
+ public void method0c();
+ public void method0d();
+ public void method0e();
+ public void method0f();
+ public void method0g();
+ public void method0h();
+ public void method0i();
+ public void method0j();
+ public void method0k();
+ public void method0l();
+ public void method0m();
+ public void method0n();
+ public void method0o();
+ public void method0p();
+ public void method0q();
+ public void method0r();
+ public void method0s();
+ public void method0t();
+ public void method0u();
+ public void method0v();
+ public void method0w();
+ public void method0x();
+ public void method0y();
+ public void method0z();
+ public void method1a();
+ public void method1b();
+ public void method1c();
+ public void method1d();
+ public void method1e();
+ public void method1f();
+ public void method1g();
+ public void method1h();
+ public void method1i();
+ public void method1j();
+ public void method1k();
+ public void method1l();
+ public void method1m();
+ public void method1n();
+ public void method1o();
+ public void method1p();
+ public void method1q();
+ public void method1r();
+ public void method1s();
+ public void method1t();
+ public void method1u();
+ public void method1v();
+ public void method1w();
+ public void method1x();
+ public void method1y();
+ public void method1z();
+ public void method2a();
+ public void method2b();
+ public void method2c();
+ public void method2d();
+ public void method2e();
+ public void method2f();
+ public void method2g();
+ public void method2h();
+ public void method2i();
+ public void method2j();
+ public void method2k();
+ public void method2l();
+ public void method2m();
+ public void method2n();
+ public void method2o();
+ public void method2p();
+ public void method2q();
+ public void method2r();
+ public void method2s();
+ public void method2t();
+ public void method2u();
+ public void method2v();
+ public void method2w();
+ public void method2x();
+ public void method2y();
+ public void method2z();
- public default void $noinline$defaultRecursiveMethod(boolean callRecursive) {
- if (callRecursive) {
- $noinline$defaultRecursiveMethod(false);
+ public default void $noinline$defaultRecursiveMethod(boolean callRecursive) {
+ if (callRecursive) {
+ $noinline$defaultRecursiveMethod(false);
+ }
}
- }
}
public class Main implements Itf {
- public static void main(String[] args) throws Exception {
- Main main = new Main();
- main.$noinline$defaultRecursiveMethod(true);
- }
+ public static void main(String[] args) throws Exception {
+ Main main = new Main();
+ main.$noinline$defaultRecursiveMethod(true);
+ }
- public void method0a() {}
- public void method0b() {}
- public void method0c() {}
- public void method0d() {}
- public void method0e() {}
- public void method0f() {}
- public void method0g() {}
- public void method0h() {}
- public void method0i() {}
- public void method0j() {}
- public void method0k() {}
- public void method0l() {}
- public void method0m() {}
- public void method0n() {}
- public void method0o() {}
- public void method0p() {}
- public void method0q() {}
- public void method0r() {}
- public void method0s() {}
- public void method0t() {}
- public void method0u() {}
- public void method0v() {}
- public void method0w() {}
- public void method0x() {}
- public void method0y() {}
- public void method0z() {}
- public void method1a() {}
- public void method1b() {}
- public void method1c() {}
- public void method1d() {}
- public void method1e() {}
- public void method1f() {}
- public void method1g() {}
- public void method1h() {}
- public void method1i() {}
- public void method1j() {}
- public void method1k() {}
- public void method1l() {}
- public void method1m() {}
- public void method1n() {}
- public void method1o() {}
- public void method1p() {}
- public void method1q() {}
- public void method1r() {}
- public void method1s() {}
- public void method1t() {}
- public void method1u() {}
- public void method1v() {}
- public void method1w() {}
- public void method1x() {}
- public void method1y() {}
- public void method1z() {}
- public void method2a() {}
- public void method2b() {}
- public void method2c() {}
- public void method2d() {}
- public void method2e() {}
- public void method2f() {}
- public void method2g() {}
- public void method2h() {}
- public void method2i() {}
- public void method2j() {}
- public void method2k() {}
- public void method2l() {}
- public void method2m() {}
- public void method2n() {}
- public void method2o() {}
- public void method2p() {}
- public void method2q() {}
- public void method2r() {}
- public void method2s() {}
- public void method2t() {}
- public void method2u() {}
- public void method2v() {}
- public void method2w() {}
- public void method2x() {}
- public void method2y() {}
- public void method2z() {}
+ public void method0a() {}
+ public void method0b() {}
+ public void method0c() {}
+ public void method0d() {}
+ public void method0e() {}
+ public void method0f() {}
+ public void method0g() {}
+ public void method0h() {}
+ public void method0i() {}
+ public void method0j() {}
+ public void method0k() {}
+ public void method0l() {}
+ public void method0m() {}
+ public void method0n() {}
+ public void method0o() {}
+ public void method0p() {}
+ public void method0q() {}
+ public void method0r() {}
+ public void method0s() {}
+ public void method0t() {}
+ public void method0u() {}
+ public void method0v() {}
+ public void method0w() {}
+ public void method0x() {}
+ public void method0y() {}
+ public void method0z() {}
+ public void method1a() {}
+ public void method1b() {}
+ public void method1c() {}
+ public void method1d() {}
+ public void method1e() {}
+ public void method1f() {}
+ public void method1g() {}
+ public void method1h() {}
+ public void method1i() {}
+ public void method1j() {}
+ public void method1k() {}
+ public void method1l() {}
+ public void method1m() {}
+ public void method1n() {}
+ public void method1o() {}
+ public void method1p() {}
+ public void method1q() {}
+ public void method1r() {}
+ public void method1s() {}
+ public void method1t() {}
+ public void method1u() {}
+ public void method1v() {}
+ public void method1w() {}
+ public void method1x() {}
+ public void method1y() {}
+ public void method1z() {}
+ public void method2a() {}
+ public void method2b() {}
+ public void method2c() {}
+ public void method2d() {}
+ public void method2e() {}
+ public void method2f() {}
+ public void method2g() {}
+ public void method2h() {}
+ public void method2i() {}
+ public void method2j() {}
+ public void method2k() {}
+ public void method2l() {}
+ public void method2m() {}
+ public void method2n() {}
+ public void method2o() {}
+ public void method2p() {}
+ public void method2q() {}
+ public void method2r() {}
+ public void method2s() {}
+ public void method2t() {}
+ public void method2u() {}
+ public void method2v() {}
+ public void method2w() {}
+ public void method2x() {}
+ public void method2y() {}
+ public void method2z() {}
}
diff --git a/test/818-clinit-nterp/src/Main.java b/test/818-clinit-nterp/src/Main.java
index 5342cec..5ebd384 100644
--- a/test/818-clinit-nterp/src/Main.java
+++ b/test/818-clinit-nterp/src/Main.java
@@ -15,20 +15,19 @@
*/
public class Main {
- public static void main(String[] args) {
- Clinit.run();
- if (!clinitDidRun) {
- throw new Error("Expected Clinit.<clinit> to have run");
+ public static void main(String[] args) {
+ Clinit.run();
+ if (!clinitDidRun) {
+ throw new Error("Expected Clinit.<clinit> to have run");
+ }
}
- }
- static boolean clinitDidRun = false;
+ static boolean clinitDidRun = false;
}
class Clinit {
- public static void run() {
- }
+ public static void run() {}
- static {
- Main.clinitDidRun = true;
- }
+ static {
+ Main.clinitDidRun = true;
+ }
}
diff --git a/test/915-obsolete-2/src/Main.java b/test/915-obsolete-2/src/Main.java
index be51234..58c4ab9 100644
--- a/test/915-obsolete-2/src/Main.java
+++ b/test/915-obsolete-2/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test915.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test915.run();
+ }
}
diff --git a/test/915-obsolete-2/src/art/Test915.java b/test/915-obsolete-2/src/art/Test915.java
index 63c7f34..2cb3c8f 100644
--- a/test/915-obsolete-2/src/art/Test915.java
+++ b/test/915-obsolete-2/src/art/Test915.java
@@ -19,105 +19,104 @@
import java.util.Base64;
public class Test915 {
+ static class Transform {
+ private void Start() {
+ System.out.println("hello - private");
+ }
- static class Transform {
- private void Start() {
- System.out.println("hello - private");
+ private void Finish() {
+ System.out.println("goodbye - private");
+ }
+
+ public void sayHi(Runnable r) {
+ System.out.println("Pre Start private method call");
+ Start();
+ System.out.println("Post Start private method call");
+ r.run();
+ System.out.println("Pre Finish private method call");
+ Finish();
+ System.out.println("Post Finish private method call");
+ }
}
- private void Finish() {
- System.out.println("goodbye - private");
+ // static class Transform {
+ // private void Start() {
+ // System.out.println("Hello - private - Transformed");
+ // }
+ //
+ // private void Finish() {
+ // System.out.println("Goodbye - private - Transformed");
+ // }
+ //
+ // public void sayHi(Runnable r) {
+ // System.out.println("Pre Start private method call - Transformed");
+ // Start();
+ // System.out.println("Post Start private method call - Transformed");
+ // r.run();
+ // System.out.println("Pre Finish private method call - Transformed");
+ // Finish();
+ // System.out.println("Post Finish private method call - Transformed");
+ // }
+ // }
+ private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
+ "yv66vgAAADQANgoADgAZCQAaABsIABwKAB0AHggAHwgAIAoADQAhCAAiCwAjACQIACUKAA0AJggA" +
+ "JwcAKQcALAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAAVTdGFydAEA" +
+ "BkZpbmlzaAEABXNheUhpAQAXKExqYXZhL2xhbmcvUnVubmFibGU7KVYBAApTb3VyY2VGaWxlAQAM" +
+ "VGVzdDkxNS5qYXZhDAAPABAHAC0MAC4ALwEAHUhlbGxvIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVk" +
+ "BwAwDAAxADIBAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkAQArUHJlIFN0YXJ0IHBy" +
+ "aXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAwAEwAQAQAsUG9zdCBTdGFydCBwcml2YXRl" +
+ "IG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQHADMMADQAEAEALFByZSBGaW5pc2ggcHJpdmF0ZSBt" +
+ "ZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAUABABAC1Qb3N0IEZpbmlzaCBwcml2YXRlIG1ldGhv" +
+ "ZCBjYWxsIC0gVHJhbnNmb3JtZWQHADUBABVhcnQvVGVzdDkxNSRUcmFuc2Zvcm0BAAlUcmFuc2Zv" +
+ "cm0BAAxJbm5lckNsYXNzZXMBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N5c3RlbQEA" +
+ "A291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmlu" +
+ "dGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQASamF2YS9sYW5nL1J1bm5hYmxlAQADcnVuAQAL" +
+ "YXJ0L1Rlc3Q5MTUAIAANAA4AAAAAAAQAAAAPABAAAQARAAAAHQABAAEAAAAFKrcAAbEAAAABABIA" +
+ "AAAGAAEAAAAFAAIAEwAQAAEAEQAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEAEgAAAAoAAgAAAAcA" +
+ "CAAIAAIAFAAQAAEAEQAAACUAAgABAAAACbIAAhIFtgAEsQAAAAEAEgAAAAoAAgAAAAoACAALAAEA" +
+ "FQAWAAEAEQAAAGMAAgACAAAAL7IAAhIGtgAEKrcAB7IAAhIItgAEK7kACQEAsgACEgq2AAQqtwAL" +
+ "sgACEgy2AASxAAAAAQASAAAAIgAIAAAADQAIAA4ADAAPABQAEAAaABEAIgASACYAEwAuABQAAgAX" +
+ "AAAAAgAYACsAAAAKAAEADQAoACoACA==");
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQAQ+GYcAAAAAAAAAAAAAAAAAAAAAAAAAADUBQAAcAAAAHhWNBIAAAAAAAAAABAFAAAd" +
+ "AAAAcAAAAAoAAADkAAAAAwAAAAwBAAABAAAAMAEAAAcAAAA4AQAAAQAAAHABAABEBAAAkAEAAJAB" +
+ "AACYAQAAoAEAAMEBAADgAQAA+QEAAAgCAAAsAgAATAIAAGMCAAB3AgAAjQIAAKECAAC1AgAA5AIA" +
+ "ABIDAABAAwAAbQMAAHQDAACCAwAAjQMAAJADAACUAwAAoQMAAKcDAACsAwAAtQMAALoDAADBAwAA" +
+ "BAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAAFAAAABQAAAAJAAAAAAAAABUAAAAJ" +
+ "AAAA0AMAABUAAAAJAAAAyAMAAAgABAAYAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAARAAAAAAABABsA" +
+ "AAAEAAIAGQAAAAUAAAAAAAAABgAAABoAAAAAAAAAAAAAAAUAAAAAAAAAEgAAAAAFAADMBAAAAAAA" +
+ "AAY8aW5pdD4ABkZpbmlzaAAfR29vZGJ5ZSAtIHByaXZhdGUgLSBUcmFuc2Zvcm1lZAAdSGVsbG8g" +
+ "LSBwcml2YXRlIC0gVHJhbnNmb3JtZWQAF0xhcnQvVGVzdDkxNSRUcmFuc2Zvcm07AA1MYXJ0L1Rl" +
+ "c3Q5MTU7ACJMZGFsdmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90" +
+ "YXRpb24vSW5uZXJDbGFzczsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmpl" +
+ "Y3Q7ABRMamF2YS9sYW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5n" +
+ "L1N5c3RlbTsALVBvc3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAs" +
+ "UG9zdCBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQALFByZSBGaW5pc2gg" +
+ "cHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkACtQcmUgU3RhcnQgcHJpdmF0ZSBtZXRo" +
+ "b2QgY2FsbCAtIFRyYW5zZm9ybWVkAAVTdGFydAAMVGVzdDkxNS5qYXZhAAlUcmFuc2Zvcm0AAVYA" +
+ "AlZMAAthY2Nlc3NGbGFncwAEbmFtZQADb3V0AAdwcmludGxuAANydW4ABXNheUhpAAV2YWx1ZQAB" +
+ "AAAABwAAAAEAAAAGAAAABQAHDgAKAAcOAQgPAAcABw4BCA8ADQEABw4BCA8BAw8BCA8BAw8BCA8B" +
+ "Aw8BCA8AAQABAAEAAADYAwAABAAAAHAQBQAAAA4AAwABAAIAAADdAwAACQAAAGIAAAAbAQIAAABu" +
+ "IAQAEAAOAAAAAwABAAIAAADlAwAACQAAAGIAAAAbAQMAAABuIAQAEAAOAAAABAACAAIAAADtAwAA" +
+ "KgAAAGIAAAAbARAAAABuIAQAEABwEAIAAgBiAAAAGwEOAAAAbiAEABAAchAGAAMAYgAAABsBDwAA" +
+ "AG4gBAAQAHAQAQACAGIAAAAbAQ0AAABuIAQAEAAOAAAAAwEAgIAEiAgBAqAIAQLECAMB6AgAAAIC" +
+ "ARwYAQIDAhYECBcXEwACAAAA5AQAAOoEAAD0BAAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAA" +
+ "AAEAAAAdAAAAcAAAAAIAAAAKAAAA5AAAAAMAAAADAAAADAEAAAQAAAABAAAAMAEAAAUAAAAHAAAA" +
+ "OAEAAAYAAAABAAAAcAEAAAIgAAAdAAAAkAEAAAEQAAACAAAAyAMAAAMgAAAEAAAA2AMAAAEgAAAE" +
+ "AAAACAQAAAAgAAABAAAAzAQAAAQgAAACAAAA5AQAAAMQAAABAAAA9AQAAAYgAAABAAAAAAUAAAAQ" +
+ "AAABAAAAEAUAAA==");
+
+ public static void run() {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest(new Transform());
}
- public void sayHi(Runnable r) {
- System.out.println("Pre Start private method call");
- Start();
- System.out.println("Post Start private method call");
- r.run();
- System.out.println("Pre Finish private method call");
- Finish();
- System.out.println("Post Finish private method call");
+ public static void doTest(Transform t) {
+ t.sayHi(() -> { System.out.println("Not doing anything here"); });
+ t.sayHi(() -> {
+ System.out.println("transforming calling function");
+ Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
+ });
+ t.sayHi(() -> { System.out.println("Not doing anything here"); });
}
- }
-
- // static class Transform {
- // private void Start() {
- // System.out.println("Hello - private - Transformed");
- // }
- //
- // private void Finish() {
- // System.out.println("Goodbye - private - Transformed");
- // }
- //
- // public void sayHi(Runnable r) {
- // System.out.println("Pre Start private method call - Transformed");
- // Start();
- // System.out.println("Post Start private method call - Transformed");
- // r.run();
- // System.out.println("Pre Finish private method call - Transformed");
- // Finish();
- // System.out.println("Post Finish private method call - Transformed");
- // }
- // }
- private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADQANgoADgAZCQAaABsIABwKAB0AHggAHwgAIAoADQAhCAAiCwAjACQIACUKAA0AJggA" +
- "JwcAKQcALAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAAVTdGFydAEA" +
- "BkZpbmlzaAEABXNheUhpAQAXKExqYXZhL2xhbmcvUnVubmFibGU7KVYBAApTb3VyY2VGaWxlAQAM" +
- "VGVzdDkxNS5qYXZhDAAPABAHAC0MAC4ALwEAHUhlbGxvIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVk" +
- "BwAwDAAxADIBAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkAQArUHJlIFN0YXJ0IHBy" +
- "aXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAwAEwAQAQAsUG9zdCBTdGFydCBwcml2YXRl" +
- "IG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQHADMMADQAEAEALFByZSBGaW5pc2ggcHJpdmF0ZSBt" +
- "ZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAUABABAC1Qb3N0IEZpbmlzaCBwcml2YXRlIG1ldGhv" +
- "ZCBjYWxsIC0gVHJhbnNmb3JtZWQHADUBABVhcnQvVGVzdDkxNSRUcmFuc2Zvcm0BAAlUcmFuc2Zv" +
- "cm0BAAxJbm5lckNsYXNzZXMBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N5c3RlbQEA" +
- "A291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmlu" +
- "dGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQASamF2YS9sYW5nL1J1bm5hYmxlAQADcnVuAQAL" +
- "YXJ0L1Rlc3Q5MTUAIAANAA4AAAAAAAQAAAAPABAAAQARAAAAHQABAAEAAAAFKrcAAbEAAAABABIA" +
- "AAAGAAEAAAAFAAIAEwAQAAEAEQAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEAEgAAAAoAAgAAAAcA" +
- "CAAIAAIAFAAQAAEAEQAAACUAAgABAAAACbIAAhIFtgAEsQAAAAEAEgAAAAoAAgAAAAoACAALAAEA" +
- "FQAWAAEAEQAAAGMAAgACAAAAL7IAAhIGtgAEKrcAB7IAAhIItgAEK7kACQEAsgACEgq2AAQqtwAL" +
- "sgACEgy2AASxAAAAAQASAAAAIgAIAAAADQAIAA4ADAAPABQAEAAaABEAIgASACYAEwAuABQAAgAX" +
- "AAAAAgAYACsAAAAKAAEADQAoACoACA==");
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQAQ+GYcAAAAAAAAAAAAAAAAAAAAAAAAAADUBQAAcAAAAHhWNBIAAAAAAAAAABAFAAAd" +
- "AAAAcAAAAAoAAADkAAAAAwAAAAwBAAABAAAAMAEAAAcAAAA4AQAAAQAAAHABAABEBAAAkAEAAJAB" +
- "AACYAQAAoAEAAMEBAADgAQAA+QEAAAgCAAAsAgAATAIAAGMCAAB3AgAAjQIAAKECAAC1AgAA5AIA" +
- "ABIDAABAAwAAbQMAAHQDAACCAwAAjQMAAJADAACUAwAAoQMAAKcDAACsAwAAtQMAALoDAADBAwAA" +
- "BAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAAFAAAABQAAAAJAAAAAAAAABUAAAAJ" +
- "AAAA0AMAABUAAAAJAAAAyAMAAAgABAAYAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAARAAAAAAABABsA" +
- "AAAEAAIAGQAAAAUAAAAAAAAABgAAABoAAAAAAAAAAAAAAAUAAAAAAAAAEgAAAAAFAADMBAAAAAAA" +
- "AAY8aW5pdD4ABkZpbmlzaAAfR29vZGJ5ZSAtIHByaXZhdGUgLSBUcmFuc2Zvcm1lZAAdSGVsbG8g" +
- "LSBwcml2YXRlIC0gVHJhbnNmb3JtZWQAF0xhcnQvVGVzdDkxNSRUcmFuc2Zvcm07AA1MYXJ0L1Rl" +
- "c3Q5MTU7ACJMZGFsdmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90" +
- "YXRpb24vSW5uZXJDbGFzczsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmpl" +
- "Y3Q7ABRMamF2YS9sYW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5n" +
- "L1N5c3RlbTsALVBvc3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAs" +
- "UG9zdCBTdGFydCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQALFByZSBGaW5pc2gg" +
- "cHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkACtQcmUgU3RhcnQgcHJpdmF0ZSBtZXRo" +
- "b2QgY2FsbCAtIFRyYW5zZm9ybWVkAAVTdGFydAAMVGVzdDkxNS5qYXZhAAlUcmFuc2Zvcm0AAVYA" +
- "AlZMAAthY2Nlc3NGbGFncwAEbmFtZQADb3V0AAdwcmludGxuAANydW4ABXNheUhpAAV2YWx1ZQAB" +
- "AAAABwAAAAEAAAAGAAAABQAHDgAKAAcOAQgPAAcABw4BCA8ADQEABw4BCA8BAw8BCA8BAw8BCA8B" +
- "Aw8BCA8AAQABAAEAAADYAwAABAAAAHAQBQAAAA4AAwABAAIAAADdAwAACQAAAGIAAAAbAQIAAABu" +
- "IAQAEAAOAAAAAwABAAIAAADlAwAACQAAAGIAAAAbAQMAAABuIAQAEAAOAAAABAACAAIAAADtAwAA" +
- "KgAAAGIAAAAbARAAAABuIAQAEABwEAIAAgBiAAAAGwEOAAAAbiAEABAAchAGAAMAYgAAABsBDwAA" +
- "AG4gBAAQAHAQAQACAGIAAAAbAQ0AAABuIAQAEAAOAAAAAwEAgIAEiAgBAqAIAQLECAMB6AgAAAIC" +
- "ARwYAQIDAhYECBcXEwACAAAA5AQAAOoEAAD0BAAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAA" +
- "AAEAAAAdAAAAcAAAAAIAAAAKAAAA5AAAAAMAAAADAAAADAEAAAQAAAABAAAAMAEAAAUAAAAHAAAA" +
- "OAEAAAYAAAABAAAAcAEAAAIgAAAdAAAAkAEAAAEQAAACAAAAyAMAAAMgAAAEAAAA2AMAAAEgAAAE" +
- "AAAACAQAAAAgAAABAAAAzAQAAAQgAAACAAAA5AQAAAMQAAABAAAA9AQAAAYgAAABAAAAAAUAAAAQ" +
- "AAABAAAAEAUAAA==");
-
- public static void run() {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest(new Transform());
- }
-
- public static void doTest(Transform t) {
- t.sayHi(() -> { System.out.println("Not doing anything here"); });
- t.sayHi(() -> {
- System.out.println("transforming calling function");
- Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
- });
- t.sayHi(() -> { System.out.println("Not doing anything here"); });
- }
}
diff --git a/test/917-fields-transformation/src/Main.java b/test/917-fields-transformation/src/Main.java
index 289b89f..e277deb 100644
--- a/test/917-fields-transformation/src/Main.java
+++ b/test/917-fields-transformation/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test917.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test917.run();
+ }
}
diff --git a/test/917-fields-transformation/src/art/Test917.java b/test/917-fields-transformation/src/art/Test917.java
index 245e92e..ba9a06b 100644
--- a/test/917-fields-transformation/src/art/Test917.java
+++ b/test/917-fields-transformation/src/art/Test917.java
@@ -18,80 +18,78 @@
import java.util.Base64;
public class Test917 {
+ static class Transform {
+ public String take1;
+ public String take2;
- static class Transform {
- public String take1;
- public String take2;
+ public Transform(String take1, String take2) {
+ this.take1 = take1;
+ this.take2 = take2;
+ }
- public Transform(String take1, String take2) {
- this.take1 = take1;
- this.take2 = take2;
+ public String getResult() {
+ return take1;
+ }
}
- public String getResult() {
- return take1;
+
+ // base64 encoded class/dex file for
+ // static class Transform {
+ // public String take1;
+ // public String take2;
+ //
+ // public Transform(String a, String b) {
+ // take1 = a;
+ // take2 = b;
+ // }
+ //
+ // public String getResult() {
+ // return take2;
+ // }
+ // }
+ private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
+ "yv66vgAAADQAGwoABQARCQAEABIJAAQAEwcAFQcAGAEABXRha2UxAQASTGphdmEvbGFuZy9TdHJp" +
+ "bmc7AQAFdGFrZTIBAAY8aW5pdD4BACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJp" +
+ "bmc7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAJZ2V0UmVzdWx0AQAUKClMamF2YS9sYW5n" +
+ "L1N0cmluZzsBAApTb3VyY2VGaWxlAQAMVGVzdDkxNy5qYXZhDAAJABkMAAYABwwACAAHBwAaAQAV" +
+ "YXJ0L1Rlc3Q5MTckVHJhbnNmb3JtAQAJVHJhbnNmb3JtAQAMSW5uZXJDbGFzc2VzAQAQamF2YS9s" +
+ "YW5nL09iamVjdAEAAygpVgEAC2FydC9UZXN0OTE3ACAABAAFAAAAAgABAAYABwAAAAEACAAHAAAA" +
+ "AgABAAkACgABAAsAAAAzAAIAAwAAAA8qtwABKiu1AAIqLLUAA7EAAAABAAwAAAASAAQAAAAJAAQA" +
+ "CgAJAAsADgAMAAEADQAOAAEACwAAAB0AAQABAAAABSq0AAOwAAAAAQAMAAAABgABAAAADwACAA8A" +
+ "AAACABAAFwAAAAoAAQAEABQAFgAI");
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQBdcPySAAAAAAAAAAAAAAAAAAAAAAAAAACQAwAAcAAAAHhWNBIAAAAAAAAAAMwCAAAS" +
+ "AAAAcAAAAAcAAAC4AAAAAwAAANQAAAACAAAA+AAAAAMAAAAIAQAAAQAAACABAABQAgAAQAEAAEAB" +
+ "AABIAQAASwEAAGQBAABzAQAAlwEAALcBAADLAQAA3wEAAO0BAAD4AQAA+wEAAAACAAANAgAAGAIA" +
+ "AB4CAAAlAgAALAIAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAoAAAABAAAABQAAAAAAAAAKAAAA" +
+ "BgAAAAAAAAALAAAABgAAADQCAAAAAAUADwAAAAAABQAQAAAAAAACAAAAAAAAAAAADQAAAAQAAQAA" +
+ "AAAAAAAAAAAAAAAEAAAAAAAAAAgAAAC8AgAAjAIAAAAAAAAGPGluaXQ+AAFMABdMYXJ0L1Rlc3Q5" +
+ "MTckVHJhbnNmb3JtOwANTGFydC9UZXN0OTE3OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xvc2lu" +
+ "Z0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABJMamF2YS9sYW5nL09iamVj" +
+ "dDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAMVGVzdDkxNy5qYXZhAAlUcmFuc2Zvcm0AAVYAA1ZMTAAL" +
+ "YWNjZXNzRmxhZ3MACWdldFJlc3VsdAAEbmFtZQAFdGFrZTEABXRha2UyAAV2YWx1ZQAAAgAAAAUA" +
+ "BQAJAgAABw4BAw8BAg8BAg8ADwAHDgAAAAADAAMAAQAAADwCAAAIAAAAcBACAAAAWwEAAFsCAQAO" +
+ "AAIAAQAAAAAATAIAAAMAAABUEAEAEQAAAAACAQEAAQEBAIGABNQEAQH0BAAAAgIBERgBAgMCDAQI" +
+ "DhcJAAIAAACgAgAApgIAALACAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAAAAAAAQAAABIAAABw" +
+ "AAAAAgAAAAcAAAC4AAAAAwAAAAMAAADUAAAABAAAAAIAAAD4AAAABQAAAAMAAAAIAQAABgAAAAEA" +
+ "AAAgAQAAAiAAABIAAABAAQAAARAAAAEAAAA0AgAAAyAAAAIAAAA8AgAAASAAAAIAAABUAgAAACAA" +
+ "AAEAAACMAgAABCAAAAIAAACgAgAAAxAAAAEAAACwAgAABiAAAAEAAAC8AgAAABAAAAEAAADMAgAA");
+
+ public static void run() {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ doTest(new Transform("Hello", "Goodbye"), new Transform("start", "end"));
}
- }
-
- // base64 encoded class/dex file for
- // static class Transform {
- // public String take1;
- // public String take2;
- //
- // public Transform(String a, String b) {
- // take1 = a;
- // take2 = b;
- // }
- //
- // public String getResult() {
- // return take2;
- // }
- // }
- private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADQAGwoABQARCQAEABIJAAQAEwcAFQcAGAEABXRha2UxAQASTGphdmEvbGFuZy9TdHJp" +
- "bmc7AQAFdGFrZTIBAAY8aW5pdD4BACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJp" +
- "bmc7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAJZ2V0UmVzdWx0AQAUKClMamF2YS9sYW5n" +
- "L1N0cmluZzsBAApTb3VyY2VGaWxlAQAMVGVzdDkxNy5qYXZhDAAJABkMAAYABwwACAAHBwAaAQAV" +
- "YXJ0L1Rlc3Q5MTckVHJhbnNmb3JtAQAJVHJhbnNmb3JtAQAMSW5uZXJDbGFzc2VzAQAQamF2YS9s" +
- "YW5nL09iamVjdAEAAygpVgEAC2FydC9UZXN0OTE3ACAABAAFAAAAAgABAAYABwAAAAEACAAHAAAA" +
- "AgABAAkACgABAAsAAAAzAAIAAwAAAA8qtwABKiu1AAIqLLUAA7EAAAABAAwAAAASAAQAAAAJAAQA" +
- "CgAJAAsADgAMAAEADQAOAAEACwAAAB0AAQABAAAABSq0AAOwAAAAAQAMAAAABgABAAAADwACAA8A" +
- "AAACABAAFwAAAAoAAQAEABQAFgAI");
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQBdcPySAAAAAAAAAAAAAAAAAAAAAAAAAACQAwAAcAAAAHhWNBIAAAAAAAAAAMwCAAAS" +
- "AAAAcAAAAAcAAAC4AAAAAwAAANQAAAACAAAA+AAAAAMAAAAIAQAAAQAAACABAABQAgAAQAEAAEAB" +
- "AABIAQAASwEAAGQBAABzAQAAlwEAALcBAADLAQAA3wEAAO0BAAD4AQAA+wEAAAACAAANAgAAGAIA" +
- "AB4CAAAlAgAALAIAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAoAAAABAAAABQAAAAAAAAAKAAAA" +
- "BgAAAAAAAAALAAAABgAAADQCAAAAAAUADwAAAAAABQAQAAAAAAACAAAAAAAAAAAADQAAAAQAAQAA" +
- "AAAAAAAAAAAAAAAEAAAAAAAAAAgAAAC8AgAAjAIAAAAAAAAGPGluaXQ+AAFMABdMYXJ0L1Rlc3Q5" +
- "MTckVHJhbnNmb3JtOwANTGFydC9UZXN0OTE3OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xvc2lu" +
- "Z0NsYXNzOwAeTGRhbHZpay9hbm5vdGF0aW9uL0lubmVyQ2xhc3M7ABJMamF2YS9sYW5nL09iamVj" +
- "dDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAMVGVzdDkxNy5qYXZhAAlUcmFuc2Zvcm0AAVYAA1ZMTAAL" +
- "YWNjZXNzRmxhZ3MACWdldFJlc3VsdAAEbmFtZQAFdGFrZTEABXRha2UyAAV2YWx1ZQAAAgAAAAUA" +
- "BQAJAgAABw4BAw8BAg8BAg8ADwAHDgAAAAADAAMAAQAAADwCAAAIAAAAcBACAAAAWwEAAFsCAQAO" +
- "AAIAAQAAAAAATAIAAAMAAABUEAEAEQAAAAACAQEAAQEBAIGABNQEAQH0BAAAAgIBERgBAgMCDAQI" +
- "DhcJAAIAAACgAgAApgIAALACAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAAAAAAAQAAABIAAABw" +
- "AAAAAgAAAAcAAAC4AAAAAwAAAAMAAADUAAAABAAAAAIAAAD4AAAABQAAAAMAAAAIAQAABgAAAAEA" +
- "AAAgAQAAAiAAABIAAABAAQAAARAAAAEAAAA0AgAAAyAAAAIAAAA8AgAAASAAAAIAAABUAgAAACAA" +
- "AAEAAACMAgAABCAAAAIAAACgAgAAAxAAAAEAAACwAgAABiAAAAEAAAC8AgAAABAAAAEAAADMAgAA");
-
- public static void run() {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest(new Transform("Hello", "Goodbye"),
- new Transform("start", "end"));
- }
-
- private static void printTransform(Transform t) {
- System.out.println("Result is " + t.getResult());
- System.out.println("take1 is " + t.take1);
- System.out.println("take2 is " + t.take2);
- }
- public static void doTest(Transform t1, Transform t2) {
- printTransform(t1);
- printTransform(t2);
- Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
- printTransform(t1);
- printTransform(t2);
- }
+ private static void printTransform(Transform t) {
+ System.out.println("Result is " + t.getResult());
+ System.out.println("take1 is " + t.take1);
+ System.out.println("take2 is " + t.take2);
+ }
+ public static void doTest(Transform t1, Transform t2) {
+ printTransform(t1);
+ printTransform(t2);
+ Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
+ printTransform(t1);
+ printTransform(t2);
+ }
}
diff --git a/test/918-fields/src/Main.java b/test/918-fields/src/Main.java
index e0ed65c..e9f9bc9 100644
--- a/test/918-fields/src/Main.java
+++ b/test/918-fields/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test918.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test918.run();
+ }
}
diff --git a/test/918-fields/src/art/Test918.java b/test/918-fields/src/art/Test918.java
index 5328b0b..966c093 100644
--- a/test/918-fields/src/art/Test918.java
+++ b/test/918-fields/src/art/Test918.java
@@ -21,58 +21,57 @@
import java.util.Arrays;
public class Test918 {
- public static void run() throws Exception {
- doTest();
- }
-
- public static void doTest() throws Exception {
- testField(Math.class, "PI");
- testField(InterruptedIOException.class, "bytesTransferred");
- testField(Foo.class, "this$0");
- testField(Bar.class, "VAL");
- testField(Generics.class, "generics");
- testField(Generics.class, "privateValue");
- }
-
- private static void testField(Class<?> base, String fieldName)
- throws Exception {
- Field f = base.getDeclaredField(fieldName);
- String[] result = getFieldName(f);
- System.out.println(Arrays.toString(result));
-
- Class<?> declClass = getFieldDeclaringClass(f);
- if (base != declClass) {
- throw new RuntimeException("Declaring class not equal: " + base + " vs " + declClass);
+ public static void run() throws Exception {
+ doTest();
}
- System.out.println(declClass);
- int modifiers = getFieldModifiers(f);
- if (modifiers != f.getModifiers()) {
- throw new RuntimeException("Modifiers not equal: " + f.getModifiers() + " vs " + modifiers);
+ public static void doTest() throws Exception {
+ testField(Math.class, "PI");
+ testField(InterruptedIOException.class, "bytesTransferred");
+ testField(Foo.class, "this$0");
+ testField(Bar.class, "VAL");
+ testField(Generics.class, "generics");
+ testField(Generics.class, "privateValue");
}
- System.out.println(modifiers);
- boolean synth = isFieldSynthetic(f);
- if (synth != f.isSynthetic()) {
- throw new RuntimeException("Synthetic not equal: " + f.isSynthetic() + " vs " + synth);
+ private static void testField(Class<?> base, String fieldName) throws Exception {
+ Field f = base.getDeclaredField(fieldName);
+ String[] result = getFieldName(f);
+ System.out.println(Arrays.toString(result));
+
+ Class<?> declClass = getFieldDeclaringClass(f);
+ if (base != declClass) {
+ throw new RuntimeException("Declaring class not equal: " + base + " vs " + declClass);
+ }
+ System.out.println(declClass);
+
+ int modifiers = getFieldModifiers(f);
+ if (modifiers != f.getModifiers()) {
+ throw new RuntimeException(
+ "Modifiers not equal: " + f.getModifiers() + " vs " + modifiers);
+ }
+ System.out.println(modifiers);
+
+ boolean synth = isFieldSynthetic(f);
+ if (synth != f.isSynthetic()) {
+ throw new RuntimeException("Synthetic not equal: " + f.isSynthetic() + " vs " + synth);
+ }
+ System.out.println(synth);
}
- System.out.println(synth);
- }
- private static native String[] getFieldName(Field f);
- private static native Class<?> getFieldDeclaringClass(Field f);
- private static native int getFieldModifiers(Field f);
- private static native boolean isFieldSynthetic(Field f);
+ private static native String[] getFieldName(Field f);
+ private static native Class<?> getFieldDeclaringClass(Field f);
+ private static native int getFieldModifiers(Field f);
+ private static native boolean isFieldSynthetic(Field f);
- private class Foo {
- }
+ private class Foo {}
- private static interface Bar {
- public static int VAL = 1;
- }
+ private static interface Bar {
+ public static int VAL = 1;
+ }
- private static class Generics<T> {
- T generics;
- private int privateValue = 42;
- }
+ private static class Generics<T> {
+ T generics;
+ private int privateValue = 42;
+ }
}
diff --git a/test/919-obsolete-fields/src/Main.java b/test/919-obsolete-fields/src/Main.java
index 10eadb2..bb08324 100644
--- a/test/919-obsolete-fields/src/Main.java
+++ b/test/919-obsolete-fields/src/Main.java
@@ -15,7 +15,7 @@
*/
public class Main {
- public static void main(String[] args) throws Exception {
- art.Test919.run();
- }
+ public static void main(String[] args) throws Exception {
+ art.Test919.run();
+ }
}
diff --git a/test/919-obsolete-fields/src/art/Test919.java b/test/919-obsolete-fields/src/art/Test919.java
index 11971ef..0ae5305 100644
--- a/test/919-obsolete-fields/src/art/Test919.java
+++ b/test/919-obsolete-fields/src/art/Test919.java
@@ -20,154 +20,153 @@
import java.util.Base64;
public class Test919 {
+ static class Transform {
+ private Consumer<String> reporter;
+ public Transform(Consumer<String> reporter) {
+ this.reporter = reporter;
+ }
- static class Transform {
- private Consumer<String> reporter;
- public Transform(Consumer<String> reporter) {
- this.reporter = reporter;
+ private void Start() {
+ reporter.accept("hello - private");
+ }
+
+ private void Finish() {
+ reporter.accept("goodbye - private");
+ }
+
+ public void sayHi(Runnable r) {
+ reporter.accept("Pre Start private method call");
+ Start();
+ reporter.accept("Post Start private method call");
+ r.run();
+ reporter.accept("Pre Finish private method call");
+ Finish();
+ reporter.accept("Post Finish private method call");
+ }
}
- private void Start() {
- reporter.accept("hello - private");
+
+ // What follows is the base64 encoded representation of the following class:
+ //
+ // import java.util.function.Consumer;
+ //
+ // static class Transform {
+ // private Consumer<String> reporter;
+ // public Transform(Consumer<String> reporter) {
+ // this.reporter = reporter;
+ // }
+ //
+ // private void Start() {
+ // reporter.accept("Hello - private - Transformed");
+ // }
+ //
+ // private void Finish() {
+ // reporter.accept("Goodbye - private - Transformed");
+ // }
+ //
+ // public void sayHi(Runnable r) {
+ // reporter.accept("pre Start private method call - Transformed");
+ // Start();
+ // reporter.accept("post Start private method call - Transformed");
+ // r.run();
+ // reporter.accept("pre Finish private method call - Transformed");
+ // Finish();
+ // reporter.accept("post Finish private method call - Transformed");
+ // }
+ // }
+ private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
+ "yv66vgAAADQAOAoADgAfCQANACAIACELACIAIwgAJAgAJQoADQAmCAAnCwAoACkIACoKAA0AKwgA" +
+ "LAcALgcAMQEACHJlcG9ydGVyAQAdTGphdmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjsBAAlTaWdu" +
+ "YXR1cmUBADFMamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xhbmcvU3RyaW5nOz47" +
+ "AQAGPGluaXQ+AQAgKExqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI7KVYBAARDb2RlAQAPTGlu" +
+ "ZU51bWJlclRhYmxlAQA0KExqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI8TGphdmEvbGFuZy9T" +
+ "dHJpbmc7PjspVgEABVN0YXJ0AQADKClWAQAGRmluaXNoAQAFc2F5SGkBABcoTGphdmEvbGFuZy9S" +
+ "dW5uYWJsZTspVgEAClNvdXJjZUZpbGUBAAxUZXN0OTE5LmphdmEMABMAGQwADwAQAQAdSGVsbG8g" +
+ "LSBwcml2YXRlIC0gVHJhbnNmb3JtZWQHADIMADMANAEAH0dvb2RieWUgLSBwcml2YXRlIC0gVHJh" +
+ "bnNmb3JtZWQBACtwcmUgU3RhcnQgcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAY" +
+ "ABkBACxwb3N0IFN0YXJ0IHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAcANQwANgAZ" +
+ "AQAscHJlIEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQMABoAGQEALXBv" +
+ "c3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAcANwEAFWFydC9UZXN0" +
+ "OTE5JFRyYW5zZm9ybQEACVRyYW5zZm9ybQEADElubmVyQ2xhc3NlcwEAEGphdmEvbGFuZy9PYmpl" +
+ "Y3QBABtqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXIBAAZhY2NlcHQBABUoTGphdmEvbGFuZy9P" +
+ "YmplY3Q7KVYBABJqYXZhL2xhbmcvUnVubmFibGUBAANydW4BAAthcnQvVGVzdDkxOQAgAA0ADgAA" +
+ "AAEAAgAPABAAAQARAAAAAgASAAQAAQATABQAAgAVAAAAKgACAAIAAAAKKrcAASortQACsQAAAAEA" +
+ "FgAAAA4AAwAAAAgABAAJAAkACgARAAAAAgAXAAIAGAAZAAEAFQAAACgAAgABAAAADCq0AAISA7kA" +
+ "BAIAsQAAAAEAFgAAAAoAAgAAAA0ACwAOAAIAGgAZAAEAFQAAACgAAgABAAAADCq0AAISBbkABAIA" +
+ "sQAAAAEAFgAAAAoAAgAAABEACwASAAEAGwAcAAEAFQAAAG8AAgACAAAAOyq0AAISBrkABAIAKrcA" +
+ "Byq0AAISCLkABAIAK7kACQEAKrQAAhIKuQAEAgAqtwALKrQAAhIMuQAEAgCxAAAAAQAWAAAAIgAI" +
+ "AAAAFQALABYADwAXABoAGAAgABkAKwAaAC8AGwA6ABwAAgAdAAAAAgAeADAAAAAKAAEADQAtAC8A" +
+ "CA==");
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQBeEZYBAAAAAAAAAAAAAAAAAAAAAAAAAACMBgAAcAAAAHhWNBIAAAAAAAAAAMgFAAAi" +
+ "AAAAcAAAAAkAAAD4AAAABAAAABwBAAABAAAATAEAAAcAAABUAQAAAQAAAIwBAADgBAAArAEAAKwB" +
+ "AACvAQAAsgEAALoBAAC+AQAAxAEAAMwBAADtAQAADAIAACUCAAA0AgAAWAIAAHgCAACXAgAAqwIA" +
+ "AMECAADVAgAA8wIAABIDAAAZAwAAJwMAADIDAAA1AwAAOQMAAEEDAABOAwAAVAMAAIMDAACxAwAA" +
+ "3wMAAAwEAAAWBAAAGwQAACIEAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAAEQAAABUAAAAV" +
+ "AAAACAAAAAAAAAAWAAAACAAAADQEAAAWAAAACAAAADwEAAAWAAAACAAAACwEAAAAAAcAHgAAAAAA" +
+ "AwACAAAAAAAAAAUAAAAAAAAAEgAAAAAAAgAgAAAABQAAAAIAAAAGAAAAHwAAAAcAAQAXAAAAAAAA" +
+ "AAAAAAAFAAAAAAAAABMAAACoBQAARAUAAAAAAAABKAABPAAGPGluaXQ+AAI+OwAEPjspVgAGRmlu" +
+ "aXNoAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkAB1IZWxsbyAtIHByaXZhdGUgLSBU" +
+ "cmFuc2Zvcm1lZAAXTGFydC9UZXN0OTE5JFRyYW5zZm9ybTsADUxhcnQvVGVzdDkxOTsAIkxkYWx2" +
+ "aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNs" +
+ "YXNzOwAdTGRhbHZpay9hbm5vdGF0aW9uL1NpZ25hdHVyZTsAEkxqYXZhL2xhbmcvT2JqZWN0OwAU" +
+ "TGphdmEvbGFuZy9SdW5uYWJsZTsAEkxqYXZhL2xhbmcvU3RyaW5nOwAcTGphdmEvdXRpbC9mdW5j" +
+ "dGlvbi9Db25zdW1lcgAdTGphdmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjsABVN0YXJ0AAxUZXN0" +
+ "OTE5LmphdmEACVRyYW5zZm9ybQABVgACVkwABmFjY2VwdAALYWNjZXNzRmxhZ3MABG5hbWUALXBv" +
+ "c3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAscG9zdCBTdGFydCBw" +
+ "cml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQALHByZSBGaW5pc2ggcHJpdmF0ZSBtZXRo" +
+ "b2QgY2FsbCAtIFRyYW5zZm9ybWVkACtwcmUgU3RhcnQgcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRy" +
+ "YW5zZm9ybWVkAAhyZXBvcnRlcgADcnVuAAVzYXlIaQAFdmFsdWUAAAAAAQAAAAcAAAABAAAABQAA" +
+ "AAEAAAAGAAAACAEABw4BAw8BAg8AEQAHDgEIDwANAAcOAQgPABUBAAcOAQgPAQMPAQgPAQMPAQgP" +
+ "AQMPAQgPAAACAAIAAQAAAEQEAAAGAAAAcBAEAAAAWwEAAA4AAwABAAIAAABQBAAACQAAAFQgAAAb" +
+ "AQYAAAByIAYAEAAOAAAAAwABAAIAAABYBAAACQAAAFQgAAAbAQcAAAByIAYAEAAOAAAABAACAAIA" +
+ "AABgBAAAKgAAAFQgAAAbAR0AAAByIAYAEABwEAIAAgBUIAAAGwEbAAAAciAGABAAchAFAAMAVCAA" +
+ "ABsBHAAAAHIgBgAQAHAQAQACAFQgAAAbARoAAAByIAYAEAAOAAABAwEAAgCBgAT8CAECmAkBArwJ" +
+ "AwHgCQICASEYAQIDAhgECBkXFAIEASEcBBcQFwEXDxcDAgQBIRwFFwAXEBcBFw8XBAAAAAIAAABc" +
+ "BQAAYgUAAAEAAABrBQAAAQAAAHkFAACMBQAAAQAAAAEAAAAAAAAAAAAAAJgFAAAAAAAAoAUAABAA" +
+ "AAAAAAAAAQAAAAAAAAABAAAAIgAAAHAAAAACAAAACQAAAPgAAAADAAAABAAAABwBAAAEAAAAAQAA" +
+ "AEwBAAAFAAAABwAAAFQBAAAGAAAAAQAAAIwBAAACIAAAIgAAAKwBAAABEAAAAwAAACwEAAADIAAA" +
+ "BAAAAEQEAAABIAAABAAAAHwEAAAAIAAAAQAAAEQFAAAEIAAABAAAAFwFAAADEAAAAwAAAIwFAAAG" +
+ "IAAAAQAAAKgFAAAAEAAAAQAAAMgFAAA=");
+
+ // A class that we can use to keep track of the output of this test.
+ private static class TestWatcher implements Consumer<String> {
+ private StringBuilder sb;
+ public TestWatcher() {
+ sb = new StringBuilder();
+ }
+
+ @Override
+ public void accept(String s) {
+ sb.append(s);
+ sb.append('\n');
+ }
+
+ public String getOutput() {
+ return sb.toString();
+ }
}
- private void Finish() {
- reporter.accept("goodbye - private");
+ public static void run() {
+ Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
+ TestWatcher w = new TestWatcher();
+ doTest(new Transform(w), w);
}
- public void sayHi(Runnable r) {
- reporter.accept("Pre Start private method call");
- Start();
- reporter.accept("Post Start private method call");
- r.run();
- reporter.accept("Pre Finish private method call");
- Finish();
- reporter.accept("Post Finish private method call");
+ public static void doTest(Transform t, TestWatcher w) {
+ Runnable do_redefinition = () -> {
+ w.accept("transforming calling function");
+ Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
+ };
+ // This just prints something out to show we are running the Runnable.
+ Runnable say_nothing = () -> { w.accept("Not doing anything here"); };
+
+ // Try and redefine.
+ t.sayHi(say_nothing);
+ t.sayHi(do_redefinition);
+ t.sayHi(say_nothing);
+
+ // Print output of last run.
+ System.out.print(w.getOutput());
}
- }
-
-
- // What follows is the base64 encoded representation of the following class:
- //
- // import java.util.function.Consumer;
- //
- // static class Transform {
- // private Consumer<String> reporter;
- // public Transform(Consumer<String> reporter) {
- // this.reporter = reporter;
- // }
- //
- // private void Start() {
- // reporter.accept("Hello - private - Transformed");
- // }
- //
- // private void Finish() {
- // reporter.accept("Goodbye - private - Transformed");
- // }
- //
- // public void sayHi(Runnable r) {
- // reporter.accept("pre Start private method call - Transformed");
- // Start();
- // reporter.accept("post Start private method call - Transformed");
- // r.run();
- // reporter.accept("pre Finish private method call - Transformed");
- // Finish();
- // reporter.accept("post Finish private method call - Transformed");
- // }
- // }
- private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
- "yv66vgAAADQAOAoADgAfCQANACAIACELACIAIwgAJAgAJQoADQAmCAAnCwAoACkIACoKAA0AKwgA" +
- "LAcALgcAMQEACHJlcG9ydGVyAQAdTGphdmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjsBAAlTaWdu" +
- "YXR1cmUBADFMamF2YS91dGlsL2Z1bmN0aW9uL0NvbnN1bWVyPExqYXZhL2xhbmcvU3RyaW5nOz47" +
- "AQAGPGluaXQ+AQAgKExqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI7KVYBAARDb2RlAQAPTGlu" +
- "ZU51bWJlclRhYmxlAQA0KExqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXI8TGphdmEvbGFuZy9T" +
- "dHJpbmc7PjspVgEABVN0YXJ0AQADKClWAQAGRmluaXNoAQAFc2F5SGkBABcoTGphdmEvbGFuZy9S" +
- "dW5uYWJsZTspVgEAClNvdXJjZUZpbGUBAAxUZXN0OTE5LmphdmEMABMAGQwADwAQAQAdSGVsbG8g" +
- "LSBwcml2YXRlIC0gVHJhbnNmb3JtZWQHADIMADMANAEAH0dvb2RieWUgLSBwcml2YXRlIC0gVHJh" +
- "bnNmb3JtZWQBACtwcmUgU3RhcnQgcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRyYW5zZm9ybWVkDAAY" +
- "ABkBACxwb3N0IFN0YXJ0IHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAcANQwANgAZ" +
- "AQAscHJlIEZpbmlzaCBwcml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQMABoAGQEALXBv" +
- "c3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAcANwEAFWFydC9UZXN0" +
- "OTE5JFRyYW5zZm9ybQEACVRyYW5zZm9ybQEADElubmVyQ2xhc3NlcwEAEGphdmEvbGFuZy9PYmpl" +
- "Y3QBABtqYXZhL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXIBAAZhY2NlcHQBABUoTGphdmEvbGFuZy9P" +
- "YmplY3Q7KVYBABJqYXZhL2xhbmcvUnVubmFibGUBAANydW4BAAthcnQvVGVzdDkxOQAgAA0ADgAA" +
- "AAEAAgAPABAAAQARAAAAAgASAAQAAQATABQAAgAVAAAAKgACAAIAAAAKKrcAASortQACsQAAAAEA" +
- "FgAAAA4AAwAAAAgABAAJAAkACgARAAAAAgAXAAIAGAAZAAEAFQAAACgAAgABAAAADCq0AAISA7kA" +
- "BAIAsQAAAAEAFgAAAAoAAgAAAA0ACwAOAAIAGgAZAAEAFQAAACgAAgABAAAADCq0AAISBbkABAIA" +
- "sQAAAAEAFgAAAAoAAgAAABEACwASAAEAGwAcAAEAFQAAAG8AAgACAAAAOyq0AAISBrkABAIAKrcA" +
- "Byq0AAISCLkABAIAK7kACQEAKrQAAhIKuQAEAgAqtwALKrQAAhIMuQAEAgCxAAAAAQAWAAAAIgAI" +
- "AAAAFQALABYADwAXABoAGAAgABkAKwAaAC8AGwA6ABwAAgAdAAAAAgAeADAAAAAKAAEADQAtAC8A" +
- "CA==");
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQBeEZYBAAAAAAAAAAAAAAAAAAAAAAAAAACMBgAAcAAAAHhWNBIAAAAAAAAAAMgFAAAi" +
- "AAAAcAAAAAkAAAD4AAAABAAAABwBAAABAAAATAEAAAcAAABUAQAAAQAAAIwBAADgBAAArAEAAKwB" +
- "AACvAQAAsgEAALoBAAC+AQAAxAEAAMwBAADtAQAADAIAACUCAAA0AgAAWAIAAHgCAACXAgAAqwIA" +
- "AMECAADVAgAA8wIAABIDAAAZAwAAJwMAADIDAAA1AwAAOQMAAEEDAABOAwAAVAMAAIMDAACxAwAA" +
- "3wMAAAwEAAAWBAAAGwQAACIEAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAAEQAAABUAAAAV" +
- "AAAACAAAAAAAAAAWAAAACAAAADQEAAAWAAAACAAAADwEAAAWAAAACAAAACwEAAAAAAcAHgAAAAAA" +
- "AwACAAAAAAAAAAUAAAAAAAAAEgAAAAAAAgAgAAAABQAAAAIAAAAGAAAAHwAAAAcAAQAXAAAAAAAA" +
- "AAAAAAAFAAAAAAAAABMAAACoBQAARAUAAAAAAAABKAABPAAGPGluaXQ+AAI+OwAEPjspVgAGRmlu" +
- "aXNoAB9Hb29kYnllIC0gcHJpdmF0ZSAtIFRyYW5zZm9ybWVkAB1IZWxsbyAtIHByaXZhdGUgLSBU" +
- "cmFuc2Zvcm1lZAAXTGFydC9UZXN0OTE5JFRyYW5zZm9ybTsADUxhcnQvVGVzdDkxOTsAIkxkYWx2" +
- "aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNs" +
- "YXNzOwAdTGRhbHZpay9hbm5vdGF0aW9uL1NpZ25hdHVyZTsAEkxqYXZhL2xhbmcvT2JqZWN0OwAU" +
- "TGphdmEvbGFuZy9SdW5uYWJsZTsAEkxqYXZhL2xhbmcvU3RyaW5nOwAcTGphdmEvdXRpbC9mdW5j" +
- "dGlvbi9Db25zdW1lcgAdTGphdmEvdXRpbC9mdW5jdGlvbi9Db25zdW1lcjsABVN0YXJ0AAxUZXN0" +
- "OTE5LmphdmEACVRyYW5zZm9ybQABVgACVkwABmFjY2VwdAALYWNjZXNzRmxhZ3MABG5hbWUALXBv" +
- "c3QgRmluaXNoIHByaXZhdGUgbWV0aG9kIGNhbGwgLSBUcmFuc2Zvcm1lZAAscG9zdCBTdGFydCBw" +
- "cml2YXRlIG1ldGhvZCBjYWxsIC0gVHJhbnNmb3JtZWQALHByZSBGaW5pc2ggcHJpdmF0ZSBtZXRo" +
- "b2QgY2FsbCAtIFRyYW5zZm9ybWVkACtwcmUgU3RhcnQgcHJpdmF0ZSBtZXRob2QgY2FsbCAtIFRy" +
- "YW5zZm9ybWVkAAhyZXBvcnRlcgADcnVuAAVzYXlIaQAFdmFsdWUAAAAAAQAAAAcAAAABAAAABQAA" +
- "AAEAAAAGAAAACAEABw4BAw8BAg8AEQAHDgEIDwANAAcOAQgPABUBAAcOAQgPAQMPAQgPAQMPAQgP" +
- "AQMPAQgPAAACAAIAAQAAAEQEAAAGAAAAcBAEAAAAWwEAAA4AAwABAAIAAABQBAAACQAAAFQgAAAb" +
- "AQYAAAByIAYAEAAOAAAAAwABAAIAAABYBAAACQAAAFQgAAAbAQcAAAByIAYAEAAOAAAABAACAAIA" +
- "AABgBAAAKgAAAFQgAAAbAR0AAAByIAYAEABwEAIAAgBUIAAAGwEbAAAAciAGABAAchAFAAMAVCAA" +
- "ABsBHAAAAHIgBgAQAHAQAQACAFQgAAAbARoAAAByIAYAEAAOAAABAwEAAgCBgAT8CAECmAkBArwJ" +
- "AwHgCQICASEYAQIDAhgECBkXFAIEASEcBBcQFwEXDxcDAgQBIRwFFwAXEBcBFw8XBAAAAAIAAABc" +
- "BQAAYgUAAAEAAABrBQAAAQAAAHkFAACMBQAAAQAAAAEAAAAAAAAAAAAAAJgFAAAAAAAAoAUAABAA" +
- "AAAAAAAAAQAAAAAAAAABAAAAIgAAAHAAAAACAAAACQAAAPgAAAADAAAABAAAABwBAAAEAAAAAQAA" +
- "AEwBAAAFAAAABwAAAFQBAAAGAAAAAQAAAIwBAAACIAAAIgAAAKwBAAABEAAAAwAAACwEAAADIAAA" +
- "BAAAAEQEAAABIAAABAAAAHwEAAAAIAAAAQAAAEQFAAAEIAAABAAAAFwFAAADEAAAAwAAAIwFAAAG" +
- "IAAAAQAAAKgFAAAAEAAAAQAAAMgFAAA=");
-
- // A class that we can use to keep track of the output of this test.
- private static class TestWatcher implements Consumer<String> {
- private StringBuilder sb;
- public TestWatcher() {
- sb = new StringBuilder();
- }
-
- @Override
- public void accept(String s) {
- sb.append(s);
- sb.append('\n');
- }
-
- public String getOutput() {
- return sb.toString();
- }
- }
-
- public static void run() {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- TestWatcher w = new TestWatcher();
- doTest(new Transform(w), w);
- }
-
- public static void doTest(Transform t, TestWatcher w) {
- Runnable do_redefinition = () -> {
- w.accept("transforming calling function");
- Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
- };
- // This just prints something out to show we are running the Runnable.
- Runnable say_nothing = () -> { w.accept("Not doing anything here"); };
-
- // Try and redefine.
- t.sayHi(say_nothing);
- t.sayHi(do_redefinition);
- t.sayHi(say_nothing);
-
- // Print output of last run.
- System.out.print(w.getOutput());
- }
}