Make 624-checker-stringops less Dexer-sensitive.
Rewrite Dexer-sensitive tests from 624-checker-stringops using Smali
Bug: 65168732
Test: art/test/run-test ... 624-checker-stringops
Change-Id: Ia808f9237a6386a3a45a65245d902eb3f19c65f0
diff --git a/test/624-checker-stringops/build b/test/624-checker-stringops/build
deleted file mode 100644
index 42b99ad..0000000
--- a/test/624-checker-stringops/build
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# See b/65168732
-export DX=$ANDROID_HOST_OUT/bin/dx
-
-./default-build "$@"
diff --git a/test/624-checker-stringops/smali/Smali.smali b/test/624-checker-stringops/smali/Smali.smali
new file mode 100644
index 0000000..7b063c0
--- /dev/null
+++ b/test/624-checker-stringops/smali/Smali.smali
@@ -0,0 +1,212 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+.class public LSmali;
+.super Ljava/lang/Object;
+
+## CHECK-START: int Smali.bufferLen2() instruction_simplifier (before)
+## CHECK-DAG: <<New:l\d+>> NewInstance
+## CHECK-DAG: <<String1:l\d+>> LoadString
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend
+## CHECK-DAG: <<String2:l\d+>> LoadString
+## CHECK-DAG: <<Null1:l\d+>> NullCheck [<<Append1>>]
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null1>>,<<String2>>] intrinsic:StringBufferAppend
+## CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append2>>]
+## CHECK-DAG: InvokeVirtual [<<Null2>>] intrinsic:StringBufferLength
+
+## CHECK-START: int Smali.bufferLen2() instruction_simplifier (after)
+## CHECK-DAG: <<New:l\d+>> NewInstance
+## CHECK-DAG: <<String1:l\d+>> LoadString
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend
+## CHECK-DAG: <<String2:l\d+>> LoadString
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBufferAppend
+## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBufferLength
+.method public static bufferLen2()I
+ .registers 3
+
+ new-instance v0, Ljava/lang/StringBuffer;
+
+ invoke-direct {v0}, Ljava/lang/StringBuffer;-><init>()V
+
+ const-string v1, "x"
+ invoke-virtual {v0, v1}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
+ move-result-object v1
+
+ const-string v2, "x"
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
+ move-result-object v1
+
+ invoke-virtual {v1}, Ljava/lang/StringBuffer;->length()I
+ move-result v1
+
+ return v1
+.end method
+
+## CHECK-START: int Smali.builderLen2() instruction_simplifier (before)
+## CHECK-DAG: <<New:l\d+>> NewInstance
+## CHECK-DAG: <<String1:l\d+>> LoadString
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<String2:l\d+>> LoadString
+## CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>]
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>]
+## CHECK-DAG: InvokeVirtual [<<Null3>>] intrinsic:StringBuilderLength
+
+## CHECK-START: int Smali.builderLen2() instruction_simplifier (after)
+## CHECK-DAG: <<New:l\d+>> NewInstance
+## CHECK-DAG: <<String1:l\d+>> LoadString
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: <<String2:l\d+>> LoadString
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend
+## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBuilderLength
+.method public static builderLen2()I
+ .registers 3
+
+ new-instance v0, Ljava/lang/StringBuilder;
+
+ invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
+
+ const-string v1, "x"
+ invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ move-result-object v1
+
+ const-string v2, "x"
+ invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ move-result-object v1
+
+ invoke-virtual {v1}, Ljava/lang/StringBuilder;->length()I
+ move-result v1
+
+ return v1
+.end method
+
+## CHECK-START: int Smali.bufferLoopAppender() instruction_simplifier (before)
+## CHECK-DAG: <<New:l\d+>> NewInstance loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>] loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>] loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Null3>>,<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none
+## CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBufferLength loop:none
+
+## CHECK-START: int Smali.bufferLoopAppender() instruction_simplifier (after)
+## CHECK-DAG: <<New:l\d+>> NewInstance loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>>
+## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBufferLength loop:none
+.method public static bufferLoopAppender()I
+ .registers 4
+
+ new-instance v0, Ljava/lang/StringBuffer;
+
+ invoke-direct {v0}, Ljava/lang/StringBuffer;-><init>()V
+
+ const/4 v1, 0x0
+
+ :goto_6
+ const/16 v2, 0xa
+
+ if-ge v1, v2, :cond_1e
+
+ const-string v2, "x"
+ invoke-virtual {v0, v2}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
+ move-result-object v2
+
+ const-string v3, "y"
+ invoke-virtual {v2, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
+ move-result-object v2
+
+ const-string v3, "z"
+ invoke-virtual {v2, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
+
+ add-int/lit8 v1, v1, 0x1
+ goto :goto_6
+
+ :cond_1e
+ invoke-virtual {v0}, Ljava/lang/StringBuffer;->length()I
+
+ move-result v2
+
+ return v2
+.end method
+
+## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (before)
+## CHECK-DAG: <<New:l\d+>> NewInstance loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>] loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>] loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Null3>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none
+## CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBuilderLength loop:none
+
+## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (after)
+## CHECK-DAG: <<New:l\d+>> NewInstance loop:none
+## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>>
+## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
+## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBuilderLength loop:none
+.method public static builderLoopAppender()I
+ .registers 4
+
+ new-instance v0, Ljava/lang/StringBuilder;
+
+ invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
+
+ const/4 v1, 0x0
+
+ :goto_6
+ const/16 v2, 0xa
+
+ if-ge v1, v2, :cond_1e
+
+ const-string v2, "x"
+
+ invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ move-result-object v2
+ const-string v3, "y"
+
+ invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ move-result-object v2
+ const-string v3, "z"
+
+ invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ add-int/lit8 v1, v1, 0x1
+
+ goto :goto_6
+
+ :cond_1e
+ invoke-virtual {v0}, Ljava/lang/StringBuilder;->length()I
+
+ move-result v2
+
+ return v2
+.end method
diff --git a/test/624-checker-stringops/src/Main.java b/test/624-checker-stringops/src/Main.java
index 63da4f5..3aa6e56 100644
--- a/test/624-checker-stringops/src/Main.java
+++ b/test/624-checker-stringops/src/Main.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import java.lang.reflect.Method;
/**
* Tests properties of some string operations represented by intrinsics.
@@ -105,12 +106,10 @@
/// CHECK-START: int Main.bufferLen2() instruction_simplifier (before)
/// CHECK-DAG: <<New:l\d+>> NewInstance
/// CHECK-DAG: <<String1:l\d+>> LoadString
- /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend
+ /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend
/// CHECK-DAG: <<String2:l\d+>> LoadString
- /// CHECK-DAG: <<Null1:l\d+>> NullCheck [<<Append1>>]
- /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null1>>,<<String2>>] intrinsic:StringBufferAppend
- /// CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append2>>]
- /// CHECK-DAG: InvokeVirtual [<<Null2>>] intrinsic:StringBufferLength
+ /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBufferAppend
+ /// CHECK-DAG: InvokeVirtual [{{l\d+}}] intrinsic:StringBufferLength
//
/// CHECK-START: int Main.bufferLen2() instruction_simplifier (after)
/// CHECK-DAG: <<New:l\d+>> NewInstance
@@ -124,6 +123,12 @@
return s.append("x").append("x").length();
}
+ static int bufferLen2Smali() throws Exception {
+ Class<?> c = Class.forName("Smali");
+ Method m = c.getMethod("bufferLen2");
+ return (Integer) m.invoke(null);
+ }
+
//
// Allows combining of returned "this". Also ensures that similar looking append() calls
// are not combined somehow through returned result.
@@ -131,12 +136,10 @@
/// CHECK-START: int Main.builderLen2() instruction_simplifier (before)
/// CHECK-DAG: <<New:l\d+>> NewInstance
/// CHECK-DAG: <<String1:l\d+>> LoadString
- /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
+ /// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppend
/// CHECK-DAG: <<String2:l\d+>> LoadString
- /// CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>]
- /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBuilderAppend
- /// CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>]
- /// CHECK-DAG: InvokeVirtual [<<Null3>>] intrinsic:StringBuilderLength
+ /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBuilderAppend
+ /// CHECK-DAG: InvokeVirtual [{{l\d+}}] intrinsic:StringBuilderLength
//
/// CHECK-START: int Main.builderLen2() instruction_simplifier (after)
/// CHECK-DAG: <<New:l\d+>> NewInstance
@@ -150,6 +153,12 @@
return s.append("x").append("x").length();
}
+ static int builderLen2Smali() throws Exception {
+ Class<?> c = Class.forName("Smali");
+ Method m = c.getMethod("builderLen2");
+ return (Integer) m.invoke(null);
+ }
+
//
// Similar situation in a loop.
//
@@ -159,13 +168,10 @@
/// CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>>
/// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBufferAppend loop:<<Loop>>
/// CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
- /// CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>] loop:<<Loop>>
- /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>>
+ /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>>
/// CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
- /// CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>] loop:<<Loop>>
- /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Null3>>,<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>>
- /// CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none
- /// CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBufferLength loop:none
+ /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [{{l\d+}},<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>>
+ /// CHECK-DAG: InvokeVirtual [{{l\d+}}] intrinsic:StringBufferLength loop:none
//
/// CHECK-START: int Main.bufferLoopAppender() instruction_simplifier (after)
/// CHECK-DAG: <<New:l\d+>> NewInstance loop:none
@@ -184,6 +190,12 @@
return b.length();
}
+ static int bufferLoopAppenderSmali() throws Exception {
+ Class<?> c = Class.forName("Smali");
+ Method m = c.getMethod("bufferLoopAppender");
+ return (Integer) m.invoke(null);
+ }
+
//
// Similar situation in a loop.
//
@@ -193,13 +205,10 @@
/// CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>>
/// CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBuilderAppend loop:<<Loop>>
/// CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>>
- /// CHECK-DAG: <<Null2:l\d+>> NullCheck [<<Append1>>] loop:<<Loop>>
- /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Null2>>,<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+ /// CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [{{l\d+}},<<String2>>] intrinsic:StringBuilderAppend loop:<<Loop>>
/// CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>>
- /// CHECK-DAG: <<Null3:l\d+>> NullCheck [<<Append2>>] loop:<<Loop>>
- /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Null3>>,<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
- /// CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none
- /// CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBuilderLength loop:none
+ /// CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [{{l\d+}},<<String3>>] intrinsic:StringBuilderAppend loop:<<Loop>>
+ /// CHECK-DAG: InvokeVirtual [{{l\d+}}] intrinsic:StringBuilderLength loop:none
//
/// CHECK-START: int Main.builderLoopAppender() instruction_simplifier (after)
/// CHECK-DAG: <<New:l\d+>> NewInstance loop:none
@@ -218,6 +227,12 @@
return b.length();
}
+ static int builderLoopAppenderSmali() throws Exception {
+ Class<?> c = Class.forName("Smali");
+ Method m = c.getMethod("bufferLoopAppender");
+ return (Integer) m.invoke(null);
+ }
+
//
// All calls in the loop-body and thus loop can be eliminated.
//
@@ -274,7 +289,7 @@
x.toString();
}
- public static void main(String[] args) {
+ public static void main(String[] args) throws Exception {
expectEquals(1865, liveIndexOf());
expectEquals(29, deadIndexOf());
@@ -291,9 +306,13 @@
expectEquals(598, indexOfExceptions(ABC, XYZ));
expectEquals(2, bufferLen2());
+ expectEquals(2, bufferLen2Smali());
expectEquals(2, builderLen2());
+ expectEquals(2, builderLen2Smali());
expectEquals(30, bufferLoopAppender());
+ expectEquals(30, bufferLoopAppenderSmali());
expectEquals(30, builderLoopAppender());
+ expectEquals(30, builderLoopAppenderSmali());
expectEquals(0, bufferDeadLoop());
expectEquals(0, builderDeadLoop());