summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2015-10-09 15:35:36 +0200
committermikaelpeltier <mikaelpeltier@google.com>2015-10-09 18:09:39 +0200
commitc4d52f618296769e86412b93219c92ad2dddb0c9 (patch)
treeea766e949326d9b045d0f4533106d6d96559b03b
parente2f2469aa089340ab1f95d416c58560ff7a097d0 (diff)
downloadtoolchain_jack-c4d52f618296769e86412b93219c92ad2dddb0c9.zip
toolchain_jack-c4d52f618296769e86412b93219c92ad2dddb0c9.tar.gz
toolchain_jack-c4d52f618296769e86412b93219c92ad2dddb0c9.tar.bz2
Fix UselessCastRemover scheduling issue
- Some casts written into the source code need to be kept until the ThreeAddressCodeBuilder to be able to generate variable well typed. Without the information provided by the cast instruction, Jack tries to generate boxing and unboxing instructions that are useless. - Add constraint on UselessCastRemover to have a correct scheduling - Move the test that exhibit the scheduling issue into cast tests Bug: 24796568 (cherry picked from commit 9b9d232aa2de0ffd98efd633d4d50bbd2028c4be) Change-Id: I6e44cdf553c12d4c14e6d39d654d6bc9cef4eded
-rw-r--r--jack-tests/tests/com/android/jack/cast/CastTests.java12
-rw-r--r--jack-tests/tests/com/android/jack/cast/useless004/dx/Tests.java31
-rw-r--r--jack-tests/tests/com/android/jack/cast/useless004/jack/UselessCast.java30
-rw-r--r--jack/src/com/android/jack/Jack.java2
-rw-r--r--jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java4
-rw-r--r--jack/src/com/android/jack/ir/JackFormatIr.java2
-rw-r--r--jack/src/com/android/jack/ir/JavaSourceIr.java2
-rw-r--r--jack/src/com/android/jack/transformations/cast/SourceCast.java28
-rw-r--r--jack/src/com/android/jack/transformations/cast/UselessCastRemover.java2
-rw-r--r--jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeBuilder.java3
10 files changed, 113 insertions, 3 deletions
diff --git a/jack-tests/tests/com/android/jack/cast/CastTests.java b/jack-tests/tests/com/android/jack/cast/CastTests.java
index 0debeaf..96fa92c 100644
--- a/jack-tests/tests/com/android/jack/cast/CastTests.java
+++ b/jack-tests/tests/com/android/jack/cast/CastTests.java
@@ -63,6 +63,10 @@ public class CastTests extends RuntimeTest {
AbstractTestTools.getTestRootDir("com.android.jack.cast.useless002"),
"com.android.jack.cast.useless002.dx.Tests");
+ private RuntimeTestInfo USELESS004 = new RuntimeTestInfo(
+ AbstractTestTools.getTestRootDir("com.android.jack.cast.useless004"),
+ "com.android.jack.cast.useless004.dx.Tests");
+
@Test
@Category(RuntimeRegressionTest.class)
public void explicit001() throws Exception {
@@ -121,6 +125,13 @@ public class CastTests extends RuntimeTest {
new RuntimeTestHelper(USELESS002).compileAndRunTest();
}
+ @Test
+ @Category(RuntimeRegressionTest.class)
+ public void useless004() throws Exception {
+ new RuntimeTestHelper(USELESS004).compileAndRunTest();
+ }
+
+
/**
* Verifies that the test source can compile from source to dex file.
*/
@@ -142,5 +153,6 @@ public class CastTests extends RuntimeTest {
rtTestInfos.add(IMPLICIT004);
rtTestInfos.add(USELESS001);
rtTestInfos.add(USELESS002);
+ rtTestInfos.add(USELESS004);
}
}
diff --git a/jack-tests/tests/com/android/jack/cast/useless004/dx/Tests.java b/jack-tests/tests/com/android/jack/cast/useless004/dx/Tests.java
new file mode 100644
index 0000000..233cc3c
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/cast/useless004/dx/Tests.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.jack.cast.useless004.dx;
+
+import com.android.jack.cast.useless004.jack.UselessCast;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class Tests {
+
+ @Test
+ public void test1() {
+ Assert.assertEquals(1, UselessCast.test(true));
+ Assert.assertEquals(2, UselessCast.test(false));
+ }
+}
diff --git a/jack-tests/tests/com/android/jack/cast/useless004/jack/UselessCast.java b/jack-tests/tests/com/android/jack/cast/useless004/jack/UselessCast.java
new file mode 100644
index 0000000..8c9d6c8
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/cast/useless004/jack/UselessCast.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.jack.cast.useless004.jack;
+
+public class UselessCast {
+
+ /**
+ * Check that casts that are written in the source code are kept until they are useful, even if
+ * they are useless for the generated dex and will be remove later into the plan.
+ */
+ public static long test(boolean b) {
+ Number result = (b) ? (Number)Integer.valueOf(1) : (Number)Long.valueOf(2);
+
+ return result.longValue();
+ }
+}
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index 84228a6..3c93b96 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -1072,7 +1072,6 @@ public abstract class Jack {
methodPlan.append(NestedAssignRemover.class);
methodPlan.append(TypeLegalizer.class);
methodPlan.append(RopCastLegalizer.class);
- methodPlan.append(UselessCastRemover.class);
if (features.contains(CodeStats.class)) {
methodPlan.append(BinaryOperationWithCst.class);
}
@@ -1085,6 +1084,7 @@ public abstract class Jack {
methodPlan.append(ExceptionRuntimeValueAdder.class);
methodPlan.append(DefinitionMarkerAdder.class);
methodPlan.append(ThreeAddressCodeBuilder.class);
+ methodPlan.append(UselessCastRemover.class);
methodPlan.append(DefinitionMarkerRemover.class);
methodPlan.append(TryCatchRemover.class);
methodPlan.append(ExpressionStatementLegalizer.class);
diff --git a/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java b/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
index 28a2c87..6af70f4 100644
--- a/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
+++ b/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
@@ -83,6 +83,7 @@ import com.android.jack.transformations.ast.UnassignedValues;
import com.android.jack.transformations.ast.inner.InnerAccessor;
import com.android.jack.transformations.ast.switches.UselessSwitches;
import com.android.jack.transformations.booleanoperators.FallThroughMarker;
+import com.android.jack.transformations.cast.SourceCast;
import com.android.jack.transformations.rop.cast.RopLegalCast;
import com.android.jack.transformations.threeaddresscode.ThreeAddressCodeForm;
import com.android.jack.util.filter.Filter;
@@ -136,7 +137,8 @@ import javax.annotation.Nonnull;
JAssertStatement.class,
JConditionalOperation.class,
EmptyClinit.class,
- UselessSwitches.class})
+ UselessSwitches.class,
+ SourceCast.class})
@Transform(add = DexCodeMarker.class)
public class CodeItemBuilder implements RunnableSchedulable<JMethod> {
diff --git a/jack/src/com/android/jack/ir/JackFormatIr.java b/jack/src/com/android/jack/ir/JackFormatIr.java
index 01f0549..be23111 100644
--- a/jack/src/com/android/jack/ir/JackFormatIr.java
+++ b/jack/src/com/android/jack/ir/JackFormatIr.java
@@ -122,6 +122,7 @@ import com.android.jack.transformations.ast.MultiDimensionNewArray;
import com.android.jack.transformations.ast.NoImplicitBlock;
import com.android.jack.transformations.ast.inner.InnerAccessor;
import com.android.jack.transformations.ast.switches.UselessSwitches;
+import com.android.jack.transformations.cast.SourceCast;
import com.android.sched.item.AbstractComponent;
import com.android.sched.item.ComposedOf;
import com.android.sched.item.Description;
@@ -238,6 +239,7 @@ import com.android.sched.item.Name;
NotSimplifier.NotExpressionsSimplified.class,
GenericSignature.class,
SimpleName.class,
+ SourceCast.class,
ThisRefTypeInfo.class,
UselessSwitches.class})
public class JackFormatIr implements AbstractComponent {
diff --git a/jack/src/com/android/jack/ir/JavaSourceIr.java b/jack/src/com/android/jack/ir/JavaSourceIr.java
index e16cd6a..4c2aeac 100644
--- a/jack/src/com/android/jack/ir/JavaSourceIr.java
+++ b/jack/src/com/android/jack/ir/JavaSourceIr.java
@@ -145,6 +145,7 @@ import com.android.jack.transformations.ast.MultiDimensionNewArray;
import com.android.jack.transformations.ast.removeinit.FieldInitMethod;
import com.android.jack.transformations.ast.removeinit.FieldInitMethodCall;
import com.android.jack.transformations.ast.switches.UselessSwitches;
+import com.android.jack.transformations.cast.SourceCast;
import com.android.sched.item.AbstractComponent;
import com.android.sched.item.ComposedOf;
import com.android.sched.item.Description;
@@ -285,6 +286,7 @@ import com.android.sched.item.Name;
MultiDimensionNewArray.class,
GenericSignature.class,
SimpleName.class,
+ SourceCast.class,
ThisRefTypeInfo.class,
ThrownExceptionMarker.class,
UselessSwitches.class})
diff --git a/jack/src/com/android/jack/transformations/cast/SourceCast.java b/jack/src/com/android/jack/transformations/cast/SourceCast.java
new file mode 100644
index 0000000..f6b4ade
--- /dev/null
+++ b/jack/src/com/android/jack/transformations/cast/SourceCast.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.jack.transformations.cast;
+
+import com.android.sched.item.Description;
+import com.android.sched.item.Tag;
+
+/**
+ * The tag {@code SourceCast} allows to know that the code contains all casts that have been written
+ * into the source.
+ */
+@Description("Code contains all casts that have been written into the source.")
+public final class SourceCast implements Tag {
+}
diff --git a/jack/src/com/android/jack/transformations/cast/UselessCastRemover.java b/jack/src/com/android/jack/transformations/cast/UselessCastRemover.java
index 42e9c4e..f4da144 100644
--- a/jack/src/com/android/jack/transformations/cast/UselessCastRemover.java
+++ b/jack/src/com/android/jack/transformations/cast/UselessCastRemover.java
@@ -32,6 +32,7 @@ import com.android.sched.item.Description;
import com.android.sched.item.Name;
import com.android.sched.schedulable.Constraint;
import com.android.sched.schedulable.RunnableSchedulable;
+import com.android.sched.schedulable.Transform;
import com.android.sched.util.config.ThreadConfig;
import javax.annotation.Nonnull;
@@ -41,6 +42,7 @@ import javax.annotation.Nonnull;
@Description("Removes useless casts.")
@Name("UselessCastRemover")
@Constraint(need = JDynamicCastOperation.class)
+@Transform(remove = SourceCast.class)
public class UselessCastRemover implements RunnableSchedulable<JMethod> {
@Nonnull
diff --git a/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeBuilder.java b/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeBuilder.java
index f79b8ee..aa454bf 100644
--- a/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeBuilder.java
+++ b/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeBuilder.java
@@ -56,6 +56,7 @@ import com.android.jack.transformations.ast.InitInNewArray;
import com.android.jack.transformations.ast.NoImplicitBlock;
import com.android.jack.transformations.ast.RefAsStatement;
import com.android.jack.transformations.booleanoperators.FallThroughMarker;
+import com.android.jack.transformations.cast.SourceCast;
import com.android.jack.transformations.request.AppendBefore;
import com.android.jack.transformations.request.Remove;
import com.android.jack.transformations.request.Replace;
@@ -82,7 +83,7 @@ import javax.annotation.Nonnull;
*/
@Description("Transform body of a JMethod to into a three address form.")
@Name("ThreeAddressCodeBuilder")
-@Constraint(need = {NoImplicitBlock.class}, no = {InitInNewArray.class,
+@Constraint(need = {NoImplicitBlock.class, SourceCast.class}, no = {InitInNewArray.class,
JAssertStatement.class, JAsgOperation.class, JFieldInitializer.class,
JConditionalOperation.class, JLoop.class})
@Transform(add = {ThreeAddressCodeForm.class,