summaryrefslogtreecommitdiffstats
path: root/test/431-type-propagation
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-11-24 15:28:45 +0000
committerNicolas Geoffray <ngeoffray@google.com>2014-11-25 00:55:07 +0000
commit3159674c0863f53cfbc1913d493550221ac47f02 (patch)
tree5dc34e8da8dc695cf80040ba0dbc5312060c10c1 /test/431-type-propagation
parent4d3ed1a6f34bd31ed30faaca0433cf2a4b19bb7b (diff)
downloadart-3159674c0863f53cfbc1913d493550221ac47f02.tar.gz
art-3159674c0863f53cfbc1913d493550221ac47f02.tar.bz2
art-3159674c0863f53cfbc1913d493550221ac47f02.zip
Fix a bug in the type analysis phase of optimizing.
Dex code can lead to the creation of a phi with one float input and one integer input. Since the SSA builder trusts the verifier, it assumes that the integer input must be converted to float. However, when the register is not used afterwards, the verifier hasn't ensured that. Therefore, the compiler must remove the phi prior to doing type propagation. Change-Id: Idcd51c4dccce827c59d1f2b253bc1c919bc07df5
Diffstat (limited to 'test/431-type-propagation')
-rw-r--r--test/431-type-propagation/expected.txt1
-rw-r--r--test/431-type-propagation/info.txt2
-rw-r--r--test/431-type-propagation/smali/TypePropagation.smali43
-rw-r--r--test/431-type-propagation/src/Main.java28
4 files changed, 74 insertions, 0 deletions
diff --git a/test/431-type-propagation/expected.txt b/test/431-type-propagation/expected.txt
new file mode 100644
index 0000000000..ccaf6f8f0f
--- /dev/null
+++ b/test/431-type-propagation/expected.txt
@@ -0,0 +1 @@
+Enter
diff --git a/test/431-type-propagation/info.txt b/test/431-type-propagation/info.txt
new file mode 100644
index 0000000000..b895e91f9d
--- /dev/null
+++ b/test/431-type-propagation/info.txt
@@ -0,0 +1,2 @@
+Regression test for the SSA building of the optimizing
+compiler. See comment in smali file.
diff --git a/test/431-type-propagation/smali/TypePropagation.smali b/test/431-type-propagation/smali/TypePropagation.smali
new file mode 100644
index 0000000000..817f0c55b1
--- /dev/null
+++ b/test/431-type-propagation/smali/TypePropagation.smali
@@ -0,0 +1,43 @@
+# Copyright (C) 2014 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 LTypePropagation;
+
+.super Ljava/lang/Object;
+
+.method public static method([I)V
+ .registers 3
+ const/4 v0, 0
+ aget v1, v2, v0
+ add-int v2, v1, v0
+ if-eq v1, v0, :end
+ # Putting a float in v1 will lead to the creation of a phi with one
+ # float input and one integer input. Since the SSA builder trusts
+ # the verifier, it assumes that the integer input must be converted
+ # to float. However, since v0 is not used afterwards, the verifier
+ # hasn't ensured that. Therefore, the compiler must remove
+ # the phi prior to doing type propagation.
+ int-to-float v1, v0
+ :end
+ # Do a call to create an environment that will capture all Dex registers.
+ # This environment is the reason why a phi is created at the join block
+ # of the if.
+ invoke-static {}, LTypePropagation;->emptyMethod()V
+ return-void
+.end method
+
+.method public static emptyMethod()V
+ .registers 0
+ return-void
+.end method
diff --git a/test/431-type-propagation/src/Main.java b/test/431-type-propagation/src/Main.java
new file mode 100644
index 0000000000..91dfe10845
--- /dev/null
+++ b/test/431-type-propagation/src/Main.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+import java.lang.reflect.Method;
+
+public class Main {
+ public static void main(String[] args) throws Exception {
+ System.out.println("Enter");
+ Class<?> c = Class.forName("TypePropagation");
+ Method m = c.getMethod("method", int[].class);
+ int[] array = new int[7];
+ Object[] arguments = { array };
+ m.invoke(null, arguments);
+ }
+}