summaryrefslogtreecommitdiffstats
path: root/test/429-ssa-builder
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-11-17 17:50:33 +0000
committerNicolas Geoffray <ngeoffray@google.com>2014-11-17 18:48:36 +0000
commit21cc798cd56a069a3d51a0215020676065780939 (patch)
treefeb43656c44a12afa53c3c11d4d947ff42644adc /test/429-ssa-builder
parent1c18d5d0141ffa76b0838fb99615186dcbefc50e (diff)
downloadart-21cc798cd56a069a3d51a0215020676065780939.zip
art-21cc798cd56a069a3d51a0215020676065780939.tar.gz
art-21cc798cd56a069a3d51a0215020676065780939.tar.bz2
Fix a bug in the type propagation phase of optimizing.
The compiler was placing phis (and their floating point equivalent), in a way that it did not expect. Change-Id: I974be1ee4aae5d27d68c6bba171db0ed25377b70
Diffstat (limited to 'test/429-ssa-builder')
-rw-r--r--test/429-ssa-builder/expected.txt0
-rw-r--r--test/429-ssa-builder/info.txt3
-rw-r--r--test/429-ssa-builder/src/Main.java49
3 files changed, 52 insertions, 0 deletions
diff --git a/test/429-ssa-builder/expected.txt b/test/429-ssa-builder/expected.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/429-ssa-builder/expected.txt
diff --git a/test/429-ssa-builder/info.txt b/test/429-ssa-builder/info.txt
new file mode 100644
index 0000000..509d00f
--- /dev/null
+++ b/test/429-ssa-builder/info.txt
@@ -0,0 +1,3 @@
+Regression test for the type propagation phase of the optimizing
+compiler, that used to crash when dealing with phi floating-point
+equivalents.
diff --git a/test/429-ssa-builder/src/Main.java b/test/429-ssa-builder/src/Main.java
new file mode 100644
index 0000000..32fcef0
--- /dev/null
+++ b/test/429-ssa-builder/src/Main.java
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+public class Main {
+ public static void main(String[] args) {
+ if (new Main().$opt$TestFloatPhi() != 33.0f) {
+ throw new Error("Unexpected result");
+ }
+ }
+
+ public float $opt$TestFloatPhi() {
+ float a = floatField;
+ float b = 42.0f;
+ if (test1) {
+ // The phi for `a` will be found to be of type float.
+ a = otherFloatField;
+ // The phi for `b` will be found to be of type int (constants in DEX).
+ b = 33.0f;
+ }
+ // Use a different condition to avoid having dx being too clever.
+ if (test2) {
+ // Type propagation now realizes that `b` must be of type float. So
+ // it requests a float equivalent for `b`. Because the phi for `a` is
+ // next to the phi for `b` in the phi list, the compiler used to crash,
+ // assuming that a float phi following a phi *must* be for the same DEX
+ // register.
+ a = b;
+ }
+ return a;
+ }
+
+ float floatField = 4.2f;
+ float otherFloatField = 42.2f;
+ boolean test1 = true;
+ boolean test2 = true;
+}