From 3159674c0863f53cfbc1913d493550221ac47f02 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Mon, 24 Nov 2014 15:28:45 +0000 Subject: 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 --- test/431-type-propagation/expected.txt | 1 + test/431-type-propagation/info.txt | 2 + .../smali/TypePropagation.smali | 43 ++++++++++++++++++++++ test/431-type-propagation/src/Main.java | 28 ++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 test/431-type-propagation/expected.txt create mode 100644 test/431-type-propagation/info.txt create mode 100644 test/431-type-propagation/smali/TypePropagation.smali create mode 100644 test/431-type-propagation/src/Main.java (limited to 'test/431-type-propagation') 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); + } +} -- cgit v1.2.3