ART: New types of Checker assertions
Checker now supports positive out-of-order assertions (CHECK-DAG),
which are useful for matching dependency graphs, and negative
assertions (CHECK-NOT) to test element removal.
ConstantFolding tests are rewritten using -DAG checks and Inliner
tests are added.
Change-Id: I5afb665f532b24683624b6d21ef4377cb441d731
diff --git a/compiler/optimizing/test/ConstantFolding.java b/compiler/optimizing/test/ConstantFolding.java
index 7fac5a9..92f2a77 100644
--- a/compiler/optimizing/test/ConstantFolding.java
+++ b/compiler/optimizing/test/ConstantFolding.java
@@ -22,13 +22,13 @@
*/
// CHECK-START: int ConstantFolding.IntNegation() constant_folding (before)
- // CHECK: [[Const42:i[0-9]+]] IntConstant 42
- // CHECK: [[Neg:i[0-9]+]] Neg [ [[Const42]] ]
- // CHECK: Return [ [[Neg]] ]
+ // CHECK-DAG: [[Const42:i[0-9]+]] IntConstant 42
+ // CHECK-DAG: [[Neg:i[0-9]+]] Neg [ [[Const42]] ]
+ // CHECK-DAG: Return [ [[Neg]] ]
// CHECK-START: int ConstantFolding.IntNegation() constant_folding (after)
- // CHECK: [[ConstN42:i[0-9]+]] IntConstant -42
- // CHECK: Return [ [[ConstN42]] ]
+ // CHECK-DAG: [[ConstN42:i[0-9]+]] IntConstant -42
+ // CHECK-DAG: Return [ [[ConstN42]] ]
public static int IntNegation() {
int x, y;
@@ -43,14 +43,14 @@
*/
// CHECK-START: int ConstantFolding.IntAddition1() constant_folding (before)
- // CHECK: [[Const1:i[0-9]+]] IntConstant 1
- // CHECK: [[Const2:i[0-9]+]] IntConstant 2
- // CHECK: [[Add:i[0-9]+]] Add [ [[Const1]] [[Const2]] ]
- // CHECK: Return [ [[Add]] ]
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: [[Const2:i[0-9]+]] IntConstant 2
+ // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const1]] [[Const2]] ]
+ // CHECK-DAG: Return [ [[Add]] ]
// CHECK-START: int ConstantFolding.IntAddition1() constant_folding (after)
- // CHECK: [[Const3:i[0-9]+]] IntConstant 3
- // CHECK: Return [ [[Const3]] ]
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: Return [ [[Const3]] ]
public static int IntAddition1() {
int a, b, c;
@@ -66,18 +66,18 @@
*/
// CHECK-START: int ConstantFolding.IntAddition2() constant_folding (before)
- // CHECK: [[Const1:i[0-9]+]] IntConstant 1
- // CHECK: [[Const2:i[0-9]+]] IntConstant 2
- // CHECK: [[Const5:i[0-9]+]] IntConstant 5
- // CHECK: [[Const6:i[0-9]+]] IntConstant 6
- // CHECK: [[Add1:i[0-9]+]] Add [ [[Const1]] [[Const2]] ]
- // CHECK: [[Add2:i[0-9]+]] Add [ [[Const5]] [[Const6]] ]
- // CHECK: [[Add3:i[0-9]+]] Add [ [[Add1]] [[Add2]] ]
- // CHECK: Return [ [[Add3]] ]
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: [[Const2:i[0-9]+]] IntConstant 2
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Const6:i[0-9]+]] IntConstant 6
+ // CHECK-DAG: [[Add1:i[0-9]+]] Add [ [[Const1]] [[Const2]] ]
+ // CHECK-DAG: [[Add2:i[0-9]+]] Add [ [[Const5]] [[Const6]] ]
+ // CHECK-DAG: [[Add3:i[0-9]+]] Add [ [[Add1]] [[Add2]] ]
+ // CHECK-DAG: Return [ [[Add3]] ]
// CHECK-START: int ConstantFolding.IntAddition2() constant_folding (after)
- // CHECK: [[Const14:i[0-9]+]] IntConstant 14
- // CHECK: Return [ [[Const14]] ]
+ // CHECK-DAG: [[Const14:i[0-9]+]] IntConstant 14
+ // CHECK-DAG: Return [ [[Const14]] ]
public static int IntAddition2() {
int a, b, c;
@@ -97,14 +97,14 @@
*/
// CHECK-START: int ConstantFolding.IntSubtraction() constant_folding (before)
- // CHECK: [[Const5:i[0-9]+]] IntConstant 5
- // CHECK: [[Const2:i[0-9]+]] IntConstant 2
- // CHECK: [[Sub:i[0-9]+]] Sub [ [[Const5]] [[Const2]] ]
- // CHECK: Return [ [[Sub]] ]
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Const2:i[0-9]+]] IntConstant 2
+ // CHECK-DAG: [[Sub:i[0-9]+]] Sub [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: Return [ [[Sub]] ]
// CHECK-START: int ConstantFolding.IntSubtraction() constant_folding (after)
- // CHECK: [[Const3:i[0-9]+]] IntConstant 3
- // CHECK: Return [ [[Const3]] ]
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: Return [ [[Const3]] ]
public static int IntSubtraction() {
int a, b, c;
@@ -120,14 +120,14 @@
*/
// CHECK-START: long ConstantFolding.LongAddition() constant_folding (before)
- // CHECK: [[Const1:j[0-9]+]] LongConstant 1
- // CHECK: [[Const2:j[0-9]+]] LongConstant 2
- // CHECK: [[Add:j[0-9]+]] Add [ [[Const1]] [[Const2]] ]
- // CHECK: Return [ [[Add]] ]
+ // CHECK-DAG: [[Const1:j[0-9]+]] LongConstant 1
+ // CHECK-DAG: [[Const2:j[0-9]+]] LongConstant 2
+ // CHECK-DAG: [[Add:j[0-9]+]] Add [ [[Const1]] [[Const2]] ]
+ // CHECK-DAG: Return [ [[Add]] ]
// CHECK-START: long ConstantFolding.LongAddition() constant_folding (after)
- // CHECK: [[Const3:j[0-9]+]] LongConstant 3
- // CHECK: Return [ [[Const3]] ]
+ // CHECK-DAG: [[Const3:j[0-9]+]] LongConstant 3
+ // CHECK-DAG: Return [ [[Const3]] ]
public static long LongAddition() {
long a, b, c;
@@ -143,14 +143,14 @@
*/
// CHECK-START: long ConstantFolding.LongSubtraction() constant_folding (before)
- // CHECK: [[Const5:j[0-9]+]] LongConstant 5
- // CHECK: [[Const2:j[0-9]+]] LongConstant 2
- // CHECK: [[Sub:j[0-9]+]] Sub [ [[Const5]] [[Const2]] ]
- // CHECK: Return [ [[Sub]] ]
+ // CHECK-DAG: [[Const5:j[0-9]+]] LongConstant 5
+ // CHECK-DAG: [[Const2:j[0-9]+]] LongConstant 2
+ // CHECK-DAG: [[Sub:j[0-9]+]] Sub [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: Return [ [[Sub]] ]
// CHECK-START: long ConstantFolding.LongSubtraction() constant_folding (after)
- // CHECK: [[Const3:j[0-9]+]] LongConstant 3
- // CHECK: Return [ [[Const3]] ]
+ // CHECK-DAG: [[Const3:j[0-9]+]] LongConstant 3
+ // CHECK-DAG: Return [ [[Const3]] ]
public static long LongSubtraction() {
long a, b, c;
@@ -165,14 +165,14 @@
*/
// CHECK-START: int ConstantFolding.StaticCondition() constant_folding (before)
- // CHECK: [[Const5:i[0-9]+]] IntConstant 5
- // CHECK: [[Const2:i[0-9]+]] IntConstant 2
- // CHECK: [[Cond:z[0-9]+]] GreaterThanOrEqual [ [[Const5]] [[Const2]] ]
- // CHECK: If [ [[Cond]] ]
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Const2:i[0-9]+]] IntConstant 2
+ // CHECK-DAG: [[Cond:z[0-9]+]] GreaterThanOrEqual [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: If [ [[Cond]] ]
// CHECK-START: int ConstantFolding.StaticCondition() constant_folding (after)
- // CHECK: [[Const1:i[0-9]+]] IntConstant 1
- // CHECK: If [ [[Const1]] ]
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: If [ [[Const1]] ]
public static int StaticCondition() {
int a, b, c;
@@ -195,18 +195,18 @@
*/
// CHECK-START: int ConstantFolding.JumpsAndConditionals(boolean) constant_folding (before)
- // CHECK: [[Const5:i[0-9]+]] IntConstant 5
- // CHECK: [[Const2:i[0-9]+]] IntConstant 2
- // CHECK: [[Add:i[0-9]+]] Add [ [[Const5]] [[Const2]] ]
- // CHECK: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub:i[0-9]+]] ]
- // CHECK: Return [ [[Phi]] ]
- // CHECK: [[Sub]] Sub [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: [[Const2:i[0-9]+]] IntConstant 2
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: [[Sub:i[0-9]+]] Sub [ [[Const5]] [[Const2]] ]
+ // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub]] ]
+ // CHECK-DAG: Return [ [[Phi]] ]
// CHECK-START: int ConstantFolding.JumpsAndConditionals(boolean) constant_folding (after)
- // CHECK: [[Const7:i[0-9]+]] IntConstant 7
- // CHECK: [[Phi:i[0-9]+]] Phi [ [[Const7]] [[Const3:i[0-9]+]] ]
- // CHECK: Return [ [[Phi]] ]
- // CHECK: [[Const3]] IntConstant 3
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: [[Const7:i[0-9]+]] IntConstant 7
+ // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Const7]] [[Const3]] ]
+ // CHECK-DAG: Return [ [[Phi]] ]
public static int JumpsAndConditionals(boolean cond) {
int a, b, c;
diff --git a/compiler/optimizing/test/Inliner.java b/compiler/optimizing/test/Inliner.java
new file mode 100644
index 0000000..6aa7f8d
--- /dev/null
+++ b/compiler/optimizing/test/Inliner.java
@@ -0,0 +1,186 @@
+public class Inliner {
+
+ // CHECK-START: void Inliner.InlineVoid() inliner (before)
+ // CHECK-DAG: [[Const42:i[0-9]+]] IntConstant 42
+ // CHECK-DAG: InvokeStaticOrDirect
+ // CHECK-DAG: InvokeStaticOrDirect [ [[Const42]] ]
+
+ // CHECK-START: void Inliner.InlineVoid() inliner (after)
+ // CHECK-NOT: InvokeStaticOrDirect
+
+ public static void InlineVoid() {
+ returnVoid();
+ returnVoidWithOneParameter(42);
+ }
+
+ // CHECK-START: int Inliner.InlineParameter(int) inliner (before)
+ // CHECK-DAG: [[Param:i[0-9]+]] ParameterValue
+ // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: int Inliner.InlineParameter(int) inliner (after)
+ // CHECK-DAG: [[Param:i[0-9]+]] ParameterValue
+ // CHECK-DAG: Return [ [[Param]] ]
+
+ public static int InlineParameter(int a) {
+ return returnParameter(a);
+ }
+
+ // CHECK-START: long Inliner.InlineWideParameter(long) inliner (before)
+ // CHECK-DAG: [[Param:j[0-9]+]] ParameterValue
+ // CHECK-DAG: [[Result:j[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: long Inliner.InlineWideParameter(long) inliner (after)
+ // CHECK-DAG: [[Param:j[0-9]+]] ParameterValue
+ // CHECK-DAG: Return [ [[Param]] ]
+
+ public static long InlineWideParameter(long a) {
+ return returnWideParameter(a);
+ }
+
+ // CHECK-START: java.lang.Object Inliner.InlineReferenceParameter(java.lang.Object) inliner (before)
+ // CHECK-DAG: [[Param:l[0-9]+]] ParameterValue
+ // CHECK-DAG: [[Result:l[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: java.lang.Object Inliner.InlineReferenceParameter(java.lang.Object) inliner (after)
+ // CHECK-DAG: [[Param:l[0-9]+]] ParameterValue
+ // CHECK-DAG: Return [ [[Param]] ]
+
+ public static Object InlineReferenceParameter(Object o) {
+ return returnReferenceParameter(o);
+ }
+
+ // CHECK-START: int Inliner.InlineInt() inliner (before)
+ // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: int Inliner.InlineInt() inliner (after)
+ // CHECK-DAG: [[Const4:i[0-9]+]] IntConstant 4
+ // CHECK-DAG: Return [ [[Const4]] ]
+
+ public static int InlineInt() {
+ return returnInt();
+ }
+
+ // CHECK-START: long Inliner.InlineWide() inliner (before)
+ // CHECK-DAG: [[Result:j[0-9]+]] InvokeStaticOrDirect
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: long Inliner.InlineWide() inliner (after)
+ // CHECK-DAG: [[Const8:j[0-9]+]] LongConstant 8
+ // CHECK-DAG: Return [ [[Const8]] ]
+
+ public static long InlineWide() {
+ return returnWide();
+ }
+
+ // CHECK-START: int Inliner.InlineAdd() inliner (before)
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect
+ // CHECK-DAG: Return [ [[Result]] ]
+
+ // CHECK-START: int Inliner.InlineAdd() inliner (after)
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const3]] [[Const5]] ]
+ // CHECK-DAG: Return [ [[Add]] ]
+
+ public static int InlineAdd() {
+ return returnAdd(3, 5);
+ }
+
+ // CHECK-START: int Inliner.InlineFieldAccess() inliner (before)
+ // CHECK-DAG: [[After:i[0-9]+]] InvokeStaticOrDirect
+ // CHECK-DAG: Return [ [[After]] ]
+
+ // CHECK-START: int Inliner.InlineFieldAccess() inliner (after)
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: [[Before:i[0-9]+]] StaticFieldGet
+ // CHECK-DAG: [[After:i[0-9]+]] Add [ [[Before]] [[Const1]] ]
+ // CHECK-DAG: StaticFieldSet [ {{l[0-9]+}} [[After]] ]
+ // CHECK-DAG: Return [ [[After]] ]
+
+ // CHECK-START: int Inliner.InlineFieldAccess() inliner (after)
+ // CHECK-NOT: InvokeStaticOrDirect
+
+ public static int InlineFieldAccess() {
+ return incCounter();
+ }
+
+ // CHECK-START: int Inliner.InlineWithControlFlow(boolean) inliner (before)
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Add:i[0-9]+]] InvokeStaticOrDirect [ [[Const1]] [[Const3]] ]
+ // CHECK-DAG: [[Sub:i[0-9]+]] InvokeStaticOrDirect [ [[Const5]] [[Const3]] ]
+ // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub]] ]
+ // CHECK-DAG: Return [ [[Phi]] ]
+
+ // CHECK-START: int Inliner.InlineWithControlFlow(boolean) inliner (after)
+ // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
+ // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
+ // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
+ // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const1]] [[Const3]] ]
+ // CHECK-DAG: [[Sub:i[0-9]+]] Sub [ [[Const5]] [[Const3]] ]
+ // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub]] ]
+ // CHECK-DAG: Return [ [[Phi]] ]
+
+ public static int InlineWithControlFlow(boolean cond) {
+ int x, const1, const3, const5;
+ const1 = 1;
+ const3 = 3;
+ const5 = 5;
+ if (cond) {
+ x = returnAdd(const1, const3);
+ } else {
+ x = returnSub(const5, const3);
+ }
+ return x;
+ }
+
+
+ private static void returnVoid() {
+ return;
+ }
+
+ private static void returnVoidWithOneParameter(int a) {
+ return;
+ }
+
+ private static int returnParameter(int a) {
+ return a;
+ }
+
+ private static long returnWideParameter(long a) {
+ return a;
+ }
+
+ private static Object returnReferenceParameter(Object o) {
+ return o;
+ }
+
+ private static int returnInt() {
+ return 4;
+ }
+
+ private static long returnWide() {
+ return 8L;
+ }
+
+ private static int returnAdd(int a, int b) {
+ return a + b;
+ }
+
+ private static int returnSub(int a, int b) {
+ return a - b;
+ }
+
+ private static int counter = 42;
+
+ private static int incCounter() {
+ return ++counter;
+ }
+}