diff options
-rw-r--r-- | compiler/optimizing/instruction_simplifier_arm.h | 2 | ||||
-rw-r--r-- | compiler/optimizing/instruction_simplifier_arm64.h | 7 | ||||
-rw-r--r-- | test/562-checker-no-intermediate/expected.txt (renamed from test/562-no-intermediate/expected.txt) | 0 | ||||
-rw-r--r-- | test/562-checker-no-intermediate/info.txt (renamed from test/562-no-intermediate/info.txt) | 2 | ||||
-rw-r--r-- | test/562-checker-no-intermediate/src/Main.java | 97 | ||||
-rw-r--r-- | test/562-no-intermediate/src/Main.java | 27 | ||||
-rw-r--r-- | test/Android.run-test.mk | 7 |
7 files changed, 108 insertions, 34 deletions
diff --git a/compiler/optimizing/instruction_simplifier_arm.h b/compiler/optimizing/instruction_simplifier_arm.h index 782110c40a..9b54511340 100644 --- a/compiler/optimizing/instruction_simplifier_arm.h +++ b/compiler/optimizing/instruction_simplifier_arm.h @@ -48,7 +48,7 @@ class InstructionSimplifierArmVisitor : public HGraphVisitor { class InstructionSimplifierArm : public HOptimization { public: InstructionSimplifierArm(HGraph* graph, OptimizingCompilerStats* stats) - : HOptimization(graph, kInstructionSimplifierArmPassName, stats) {} + : HOptimization(graph, kInstructionSimplifierArmPassName, stats) {} static constexpr const char* kInstructionSimplifierArmPassName = "instruction_simplifier_arm"; diff --git a/compiler/optimizing/instruction_simplifier_arm64.h b/compiler/optimizing/instruction_simplifier_arm64.h index f71684efe9..d4cb1f14b7 100644 --- a/compiler/optimizing/instruction_simplifier_arm64.h +++ b/compiler/optimizing/instruction_simplifier_arm64.h @@ -82,9 +82,10 @@ class InstructionSimplifierArm64Visitor : public HGraphVisitor { class InstructionSimplifierArm64 : public HOptimization { public: InstructionSimplifierArm64(HGraph* graph, OptimizingCompilerStats* stats) - : HOptimization(graph, kInstructionSimplifierArm64PassName, stats) {} - static constexpr const char* kInstructionSimplifierArm64PassName - = "instruction_simplifier_arm64"; + : HOptimization(graph, kInstructionSimplifierArm64PassName, stats) {} + + static constexpr const char* kInstructionSimplifierArm64PassName = "instruction_simplifier_arm64"; + void Run() OVERRIDE { InstructionSimplifierArm64Visitor visitor(graph_, stats_); visitor.VisitReversePostOrder(); diff --git a/test/562-no-intermediate/expected.txt b/test/562-checker-no-intermediate/expected.txt index e69de29bb2..e69de29bb2 100644 --- a/test/562-no-intermediate/expected.txt +++ b/test/562-checker-no-intermediate/expected.txt diff --git a/test/562-no-intermediate/info.txt b/test/562-checker-no-intermediate/info.txt index 4f21aebd03..38f1f65dd6 100644 --- a/test/562-no-intermediate/info.txt +++ b/test/562-checker-no-intermediate/info.txt @@ -1,2 +1,2 @@ Regression test for optimizing, checking that there is no -intermediate address between a Java call. +intermediate address live across a Java call. diff --git a/test/562-checker-no-intermediate/src/Main.java b/test/562-checker-no-intermediate/src/Main.java new file mode 100644 index 0000000000..104ba8bc06 --- /dev/null +++ b/test/562-checker-no-intermediate/src/Main.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2016 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 { + + /** + * Check that the intermediate address computation is not reordered or merged + * across the call to Math.abs(). + */ + + /// CHECK-START-ARM: void Main.main(java.lang.String[]) instruction_simplifier_arm (before) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: ArraySet [<<Array>>,<<Index>>,<<Add>>] + + /// CHECK-START-ARM: void Main.main(java.lang.String[]) instruction_simplifier_arm (after) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: ArraySet [<<Address2>>,<<Index>>,<<Add>>] + + /// CHECK-START-ARM: void Main.main(java.lang.String[]) GVN$after_arch (after) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: ArraySet [<<Address2>>,<<Index>>,<<Add>>] + + + /// CHECK-START-ARM64: void Main.main(java.lang.String[]) instruction_simplifier_arm64 (before) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: ArraySet [<<Array>>,<<Index>>,<<Add>>] + + /// CHECK-START-ARM64: void Main.main(java.lang.String[]) instruction_simplifier_arm64 (after) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: ArraySet [<<Address2>>,<<Index>>,<<Add>>] + + /// CHECK-START-ARM64: void Main.main(java.lang.String[]) GVN$after_arch (after) + /// CHECK-DAG: <<ConstM42:i\d+>> IntConstant -42 + /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant + /// CHECK-DAG: <<Array:l\d+>> NullCheck + /// CHECK-DAG: <<Index:i\d+>> BoundsCheck + /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] + /// CHECK-DAG: <<AbsM42:i\d+>> InvokeStaticOrDirect [<<ConstM42>>] intrinsic:MathAbsInt + /// CHECK-DAG: <<Add:i\d+>> Add [<<ArrayGet>>,<<AbsM42>>] + /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] + /// CHECK-DAG: ArraySet [<<Address2>>,<<Index>>,<<Add>>] + + public static void main(String[] args) { + array[index] += Math.abs(-42); + } + + static int index = 0; + static int[] array = new int[2]; +} diff --git a/test/562-no-intermediate/src/Main.java b/test/562-no-intermediate/src/Main.java deleted file mode 100644 index 3b74d6f269..0000000000 --- a/test/562-no-intermediate/src/Main.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2016 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 { - - /// CHECK-START-ARM64: int Main.main(String[]) register_allocator (after) - /// CHECK-NOT: IntermediateAddress - public static void main(String[] args) { - array[index] += Math.cos(42); - } - - static int index = 0; - static double[] array = new double[2]; -} diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index ae569f91a3..11425e1377 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -384,7 +384,7 @@ TEST_ART_BROKEN_GCSTRESS_RUN_TESTS := \ 908-gc-start-finish \ 913-heaps \ 961-default-iface-resolution-gen \ - 964-default-iface-init-gen \ + 964-default-iface-init-gen ifneq (,$(filter gcstress,$(GC_TYPES))) ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,$(TARGET_TYPES),$(RUN_TYPES),$(PREBUILD_TYPES), \ @@ -610,9 +610,12 @@ TEST_ART_BROKEN_INTERPRETER_READ_BARRIER_RUN_TESTS := # more parallel moves on x86, thus some Checker assertions may fail. # 527: On ARM64 and ARM, the read barrier instrumentation does not support the HIntermediateAddress # instruction yet (b/26601270). +# 562: On ARM64 and ARM, the read barrier instrumentation does not support the HIntermediateAddress +# instruction yet (b/26601270). TEST_ART_BROKEN_OPTIMIZING_READ_BARRIER_RUN_TESTS := \ 484-checker-register-hints \ - 527-checker-array-access-split + 527-checker-array-access-split \ + 562-checker-no-intermediate # Tests that should fail in the read barrier configuration with JIT (Optimizing compiler). TEST_ART_BROKEN_JIT_READ_BARRIER_RUN_TESTS := |