diff options
author | 2016-01-22 10:43:39 +0000 | |
---|---|---|
committer | 2016-01-22 10:43:39 +0000 | |
commit | 69fd1b56021ac62c17e188bd0d4dd22fc911558e (patch) | |
tree | 0fb450426591148401bb76b854a7a8fe4e69f993 | |
parent | bf03fcd10a3ffa15468d335f26697b0473e45b36 (diff) |
Revert "Some minor simplifications in code and tests."
Fails 530-checker-loops on arm
This reverts commit bf03fcd10a3ffa15468d335f26697b0473e45b36.
Change-Id: I739aaaccd0509d02a62ef01e797a6d45bfe941df
-rw-r--r-- | compiler/optimizing/bounds_check_elimination.h | 4 | ||||
-rw-r--r-- | compiler/optimizing/graph_visualizer.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/nodes.cc | 5 | ||||
-rw-r--r-- | test/449-checker-bce/src/Main.java | 49 | ||||
-rw-r--r-- | test/530-checker-loops/src/Main.java | 571 |
5 files changed, 350 insertions, 281 deletions
diff --git a/compiler/optimizing/bounds_check_elimination.h b/compiler/optimizing/bounds_check_elimination.h index 6dc53207ea..b9df686ffd 100644 --- a/compiler/optimizing/bounds_check_elimination.h +++ b/compiler/optimizing/bounds_check_elimination.h @@ -29,13 +29,13 @@ class BoundsCheckElimination : public HOptimization { BoundsCheckElimination(HGraph* graph, const SideEffectsAnalysis& side_effects, HInductionVarAnalysis* induction_analysis) - : HOptimization(graph, kBoundsCheckEliminationPassName), + : HOptimization(graph, kBoundsCheckEliminiationPassName), side_effects_(side_effects), induction_analysis_(induction_analysis) {} void Run() OVERRIDE; - static constexpr const char* kBoundsCheckEliminationPassName = "BCE"; + static constexpr const char* kBoundsCheckEliminiationPassName = "BCE"; private: const SideEffectsAnalysis& side_effects_; diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc index 280516252b..32c3a925e0 100644 --- a/compiler/optimizing/graph_visualizer.cc +++ b/compiler/optimizing/graph_visualizer.cc @@ -21,7 +21,6 @@ #include <cctype> #include <sstream> -#include "bounds_check_elimination.h" #include "code_generator.h" #include "dead_code_elimination.h" #include "disassembler.h" @@ -506,7 +505,6 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor { if (IsPass(LICM::kLoopInvariantCodeMotionPassName) || IsPass(HDeadCodeElimination::kFinalDeadCodeEliminationPassName) || IsPass(HDeadCodeElimination::kInitialDeadCodeEliminationPassName) - || IsPass(BoundsCheckElimination::kBoundsCheckEliminationPassName) || IsPass(SsaBuilder::kSsaBuilderPassName)) { HLoopInformation* info = instruction->GetBlock()->GetLoopInformation(); if (info == nullptr) { diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index cb7bc58b0c..2eabadf861 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -2208,7 +2208,10 @@ void HInvoke::SetIntrinsic(Intrinsics intrinsic, SetSideEffects(GetSideEffects().Union(SideEffects::CanTriggerGC())); } // Adjust method's exception status from intrinsic table. - SetCanThrow(exceptions == kCanThrow); + switch (exceptions) { + case kNoThrow: SetCanThrow(false); break; + case kCanThrow: SetCanThrow(true); break; + } } bool HNewInstance::IsStringAlloc() const { diff --git a/test/449-checker-bce/src/Main.java b/test/449-checker-bce/src/Main.java index 06cfd0a606..3e6d1f4d94 100644 --- a/test/449-checker-bce/src/Main.java +++ b/test/449-checker-bce/src/Main.java @@ -622,39 +622,28 @@ public class Main { static int[][] mA; /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (before) - // Array references mA[i] and ..[j] both in inner loop. - /// CHECK-DAG: <<Get1:l\d+>> ArrayGet [<<Array1:l\d+>>,<<Bounds1:i\d+>>] loop:<<InnerLoop:B\d+>> - /// CHECK-DAG: <<Array1>> NullCheck [<<Field1:l\d+>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Len1:i\d+>> ArrayLength [<<Array1>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Bounds1>> BoundsCheck [<<Index1:i\d+>>,<<Len1>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [<<Array2:l\d+>>,<<Bounds2:i\d+>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Array2>> NullCheck [<<Get1>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Len2:i\d+>> ArrayLength [<<Array2>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Bounds2>> BoundsCheck [<<Index2:i\d+>>,<<Len2>>] loop:<<InnerLoop>> - /// CHECK-DAG: InvokeStaticOrDirect [<<Get2>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Index2>> Phi loop:<<InnerLoop>> - /// CHECK-DAG: <<Index1>> Phi loop:<<OuterLoop:B\d+>> - /// CHECK-DAG: <<Field1>> StaticFieldGet loop:none - /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>" - // - /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after) - // Array reference mA[i] hoisted to same level as deopt. - /// CHECK-DAG: Deoptimize loop:<<OuterLoop:B\d+>> - /// CHECK-DAG: ArrayLength loop:<<OuterLoop>> - /// CHECK-DAG: <<Get1:l\d+>> ArrayGet [<<Array1:l\d+>>,<<Index1:i\d+>>] loop:<<OuterLoop>> - // Array reference ..[j] still in inner loop, with a direct index. - /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [<<Array2:l\d+>>,<<Index2:i\d+>>] loop:<<InnerLoop:B\d+>> - /// CHECK-DAG: InvokeStaticOrDirect [<<Get2>>] loop:<<InnerLoop>> - /// CHECK-DAG: <<Index2>> Phi loop:<<InnerLoop>> - /// CHECK-DAG: <<Index1>> Phi loop:<<OuterLoop>> - // Synthetic phi. - /// CHECK-DAG: <<Array2>> Phi loop:<<OuterLoop>> - /// CHECK-DAG: <<Array1>> StaticFieldGet loop:none - /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>" - // + /// CHECK-DAG: NullCheck + /// CHECK-DAG: ArrayLength + /// CHECK-DAG: BoundsCheck + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: NullCheck + /// CHECK-DAG: ArrayLength + /// CHECK-DAG: BoundsCheck + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: InvokeStaticOrDirect + /// CHECK-DAG: ArraySet + /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after) /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength /// CHECK-NOT: BoundsCheck + /// CHECK-DAG: ArrayGet + /// CHECK-NOT: ArrayGet + /// CHECK-DAG: InvokeStaticOrDirect + /// CHECK-DAG: ArraySet + /// CHECK-DAG: Exit + /// CHECK-DAG: Deoptimize + static void dynamicBCEAndIntrinsic(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { diff --git a/test/530-checker-loops/src/Main.java b/test/530-checker-loops/src/Main.java index 5561055284..f1d9a37c88 100644 --- a/test/530-checker-loops/src/Main.java +++ b/test/530-checker-loops/src/Main.java @@ -26,7 +26,7 @@ public class Main { // /// CHECK-START: int Main.linear(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linear(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -40,7 +40,7 @@ public class Main { } /// CHECK-START: int Main.linearDown(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearDown(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -54,7 +54,7 @@ public class Main { } /// CHECK-START: int Main.linearObscure(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearObscure(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -69,7 +69,7 @@ public class Main { } /// CHECK-START: int Main.linearVeryObscure(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearVeryObscure(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -84,7 +84,7 @@ public class Main { } /// CHECK-START: int Main.hiddenStride(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.hiddenStride(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -101,7 +101,7 @@ public class Main { } /// CHECK-START: int Main.linearWhile(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWhile(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -116,7 +116,7 @@ public class Main { } /// CHECK-START: int Main.linearThreeWayPhi(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearThreeWayPhi(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -134,7 +134,7 @@ public class Main { } /// CHECK-START: int Main.linearFourWayPhi(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearFourWayPhi(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -156,7 +156,7 @@ public class Main { } /// CHECK-START: int Main.wrapAroundThenLinear(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.wrapAroundThenLinear(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -173,7 +173,7 @@ public class Main { } /// CHECK-START: int Main.wrapAroundThenLinearThreeWayPhi(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.wrapAroundThenLinearThreeWayPhi(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -194,7 +194,7 @@ public class Main { } /// CHECK-START: int[] Main.linearWithParameter(int) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int[] Main.linearWithParameter(int) BCE (after) /// CHECK-NOT: BoundsCheck @@ -208,7 +208,7 @@ public class Main { } /// CHECK-START: int[] Main.linearCopy(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int[] Main.linearCopy(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -223,8 +223,8 @@ public class Main { } /// CHECK-START: int Main.linearByTwo(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearByTwo(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -241,7 +241,7 @@ public class Main { } /// CHECK-START: int Main.linearByTwoSkip1(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearByTwoSkip1(int[]) BCE (after) /// CHECK-NOT: BoundsCheck @@ -255,12 +255,10 @@ public class Main { } /// CHECK-START: int Main.linearByTwoSkip2(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.linearByTwoSkip2(int[]) BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearByTwoSkip2(int[]) BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int linearByTwoSkip2(int x[]) { int result = 0; @@ -272,7 +270,7 @@ public class Main { } /// CHECK-START: int Main.linearWithCompoundStride() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWithCompoundStride() BCE (after) /// CHECK-NOT: BoundsCheck @@ -289,7 +287,7 @@ public class Main { } /// CHECK-START: int Main.linearWithLargePositiveStride() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWithLargePositiveStride() BCE (after) /// CHECK-NOT: BoundsCheck @@ -307,12 +305,10 @@ public class Main { } /// CHECK-START: int Main.linearWithVeryLargePositiveStride() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.linearWithVeryLargePositiveStride() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWithVeryLargePositiveStride() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int linearWithVeryLargePositiveStride() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -327,7 +323,7 @@ public class Main { } /// CHECK-START: int Main.linearWithLargeNegativeStride() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWithLargeNegativeStride() BCE (after) /// CHECK-NOT: BoundsCheck @@ -345,12 +341,10 @@ public class Main { } /// CHECK-START: int Main.linearWithVeryLargeNegativeStride() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.linearWithVeryLargeNegativeStride() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearWithVeryLargeNegativeStride() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int linearWithVeryLargeNegativeStride() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -365,7 +359,7 @@ public class Main { } /// CHECK-START: int Main.linearForNEUp() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearForNEUp() BCE (after) /// CHECK-NOT: BoundsCheck @@ -380,7 +374,7 @@ public class Main { } /// CHECK-START: int Main.linearForNEDown() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearForNEDown() BCE (after) /// CHECK-NOT: BoundsCheck @@ -395,7 +389,7 @@ public class Main { } /// CHECK-START: int Main.linearDoWhileUp() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearDoWhileUp() BCE (after) /// CHECK-NOT: BoundsCheck @@ -411,7 +405,7 @@ public class Main { } /// CHECK-START: int Main.linearDoWhileDown() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearDoWhileDown() BCE (after) /// CHECK-NOT: BoundsCheck @@ -427,12 +421,10 @@ public class Main { } /// CHECK-START: int Main.linearShort() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.linearShort() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.linearShort() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int linearShort() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; @@ -445,7 +437,7 @@ public class Main { } /// CHECK-START: int Main.invariantFromPreLoop(int[], int) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.invariantFromPreLoop(int[], int) BCE (after) /// CHECK-NOT: BoundsCheck @@ -466,11 +458,20 @@ public class Main { } /// CHECK-START: void Main.linearTriangularOnTwoArrayLengths(int) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: void Main.linearTriangularOnTwoArrayLengths(int) BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static void linearTriangularOnTwoArrayLengths(int n) { int[] a = new int[n]; @@ -487,11 +488,20 @@ public class Main { } /// CHECK-START: void Main.linearTriangularOnOneArrayLength(int) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: void Main.linearTriangularOnOneArrayLength(int) BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static void linearTriangularOnOneArrayLength(int n) { int[] a = new int[n]; @@ -508,11 +518,20 @@ public class Main { } /// CHECK-START: void Main.linearTriangularOnParameter(int) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: void Main.linearTriangularOnParameter(int) BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static void linearTriangularOnParameter(int n) { int[] a = new int[n]; @@ -529,13 +548,32 @@ public class Main { } /// CHECK-START: void Main.linearTriangularVariations(int) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: void Main.linearTriangularVariations(int) BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static void linearTriangularVariations(int n) { int[] a = new int[n]; @@ -578,11 +616,22 @@ public class Main { } /// CHECK-START: void Main.bubble(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: If + /// CHECK: ArraySet + /// CHECK: ArraySet // /// CHECK-START: void Main.bubble(int[]) BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: If + /// CHECK: ArraySet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static void bubble(int[] a) { for (int i = a.length; --i >= 0;) { @@ -597,7 +646,7 @@ public class Main { } /// CHECK-START: int Main.periodicIdiom(int) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.periodicIdiom(int) BCE (after) /// CHECK-NOT: BoundsCheck @@ -615,7 +664,7 @@ public class Main { } /// CHECK-START: int Main.periodicSequence2(int) BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.periodicSequence2(int) BCE (after) /// CHECK-NOT: BoundsCheck @@ -636,10 +685,10 @@ public class Main { } /// CHECK-START: int Main.periodicSequence4(int) BCE (before) - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.periodicSequence4(int) BCE (after) /// CHECK-NOT: BoundsCheck @@ -664,7 +713,7 @@ public class Main { } /// CHECK-START: int Main.justRightUp1() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightUp1() BCE (after) /// CHECK-NOT: BoundsCheck @@ -679,7 +728,7 @@ public class Main { } /// CHECK-START: int Main.justRightUp2() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightUp2() BCE (after) /// CHECK-NOT: BoundsCheck @@ -694,7 +743,7 @@ public class Main { } /// CHECK-START: int Main.justRightUp3() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightUp3() BCE (after) /// CHECK-NOT: BoundsCheck @@ -709,12 +758,10 @@ public class Main { } /// CHECK-START: int Main.justOOBUp() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.justOOBUp() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justOOBUp() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int justOOBUp() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; @@ -727,7 +774,7 @@ public class Main { } /// CHECK-START: int Main.justRightDown1() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightDown1() BCE (after) /// CHECK-NOT: BoundsCheck @@ -742,7 +789,7 @@ public class Main { } /// CHECK-START: int Main.justRightDown2() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightDown2() BCE (after) /// CHECK-NOT: BoundsCheck @@ -757,7 +804,7 @@ public class Main { } /// CHECK-START: int Main.justRightDown3() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justRightDown3() BCE (after) /// CHECK-NOT: BoundsCheck @@ -772,12 +819,10 @@ public class Main { } /// CHECK-START: int Main.justOOBDown() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int Main.justOOBDown() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.justOOBDown() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static int justOOBDown() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; @@ -790,74 +835,66 @@ public class Main { } /// CHECK-START: void Main.lowerOOB(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: void Main.lowerOOB(int[]) BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: void Main.lowerOOB(int[]) BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static void lowerOOB(int[] x) { - // OOB! for (int i = -1; i < x.length; i++) { sResult += x[i]; } } /// CHECK-START: void Main.upperOOB(int[]) BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: void Main.upperOOB(int[]) BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: void Main.upperOOB(int[]) BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static void upperOOB(int[] x) { - // OOB! for (int i = 0; i <= x.length; i++) { sResult += x[i]; } } /// CHECK-START: void Main.doWhileUpOOB() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: void Main.doWhileUpOOB() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: void Main.doWhileUpOOB() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static void doWhileUpOOB() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int i = 0; - // OOB! do { sResult += x[i++]; } while (i <= x.length); } /// CHECK-START: void Main.doWhileDownOOB() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: void Main.doWhileDownOOB() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: void Main.doWhileDownOOB() BCE (after) + /// CHECK: BoundsCheck /// CHECK-NOT: Deoptimize private static void doWhileDownOOB() { int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int i = x.length - 1; - // OOB! do { sResult += x[i--]; } while (-1 <= i); } /// CHECK-START: int[] Main.multiply1() BCE (before) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: int[] Main.multiply1() BCE (after) /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet /// CHECK-NOT: Deoptimize private static int[] multiply1() { int[] a = new int[10]; @@ -875,20 +912,21 @@ public class Main { } /// CHECK-START: int[] Main.multiply2() BCE (before) - /// CHECK-DAG: BoundsCheck - // - /// CHECK-START: int[] Main.multiply2() BCE (after) - /// CHECK-DAG: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet // /// CHECK-START: int[] Main.multiply2() BCE (after) - /// CHECK-NOT: Deoptimize + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: ArraySet static int[] multiply2() { int[] a = new int[10]; try { for (int i = -3; i <= 3; i++) { for (int j = -3; j <= 3; j++) { // Range [-9,9]: unsafe. - a[i * j] += 1; + a[i * j] += 1; } } } catch (Exception e) { @@ -898,19 +936,24 @@ public class Main { } /// CHECK-START: int Main.linearDynamicBCE1(int[], int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.linearDynamicBCE1(int[], int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:{{B\d+}} - /// CHECK-DAG: Deoptimize loop:none + /// CHECK: StaticFieldGet + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: StaticFieldSet // /// CHECK-START: int Main.linearDynamicBCE1(int[], int, int) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} + /// CHECK: StaticFieldGet + /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: StaticFieldSet + /// CHECK: Exit + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize private static int linearDynamicBCE1(int[] x, int lo, int hi) { int result = 0; for (int i = lo; i < hi; i++) { @@ -920,19 +963,24 @@ public class Main { } /// CHECK-START: int Main.linearDynamicBCE2(int[], int, int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> + /// CHECK: StaticFieldGet + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: StaticFieldSet // /// CHECK-START: int Main.linearDynamicBCE2(int[], int, int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:{{B\d+}} - /// CHECK-DAG: Deoptimize loop:none - // - /// CHECK-START: int Main.linearDynamicBCE2(int[], int, int, int) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} + /// CHECK: StaticFieldGet + /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: StaticFieldSet + /// CHECK: Exit + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize private static int linearDynamicBCE2(int[] x, int lo, int hi, int offset) { int result = 0; for (int i = lo; i < hi; i++) { @@ -942,19 +990,19 @@ public class Main { } /// CHECK-START: int Main.wrapAroundDynamicBCE(int[]) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.wrapAroundDynamicBCE(int[]) BCE (after) - /// CHECK-DAG: ArrayGet loop:{{B\d+}} - /// CHECK-DAG: Deoptimize loop:none + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet // /// CHECK-START: int Main.wrapAroundDynamicBCE(int[]) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet private static int wrapAroundDynamicBCE(int[] x) { int w = 9; int result = 0; @@ -966,19 +1014,19 @@ public class Main { } /// CHECK-START: int Main.periodicDynamicBCE(int[]) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.periodicDynamicBCE(int[]) BCE (after) - /// CHECK-DAG: ArrayGet loop:{{B\d+}} - /// CHECK-DAG: Deoptimize loop:none + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet // /// CHECK-START: int Main.periodicDynamicBCE(int[]) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet private static int periodicDynamicBCE(int[] x) { int k = 0; int result = 0; @@ -990,19 +1038,20 @@ public class Main { } /// CHECK-START: int Main.dynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet // /// CHECK-START: int Main.dynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:{{B\d+}} - /// CHECK-DAG: Deoptimize loop:none - // - /// CHECK-START: int Main.dynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} + /// CHECK-NOT: NullCheck + /// CHECK-NOT: ArrayLength + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: Exit + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize static int dynamicBCEPossiblyInfiniteLoop(int[] x, int lo, int hi) { // This loop could be infinite for hi = max int. Since i is also used // as subscript, however, dynamic bce can proceed. @@ -1014,14 +1063,16 @@ public class Main { } /// CHECK-START: int Main.noDynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.noDynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet // /// CHECK-START: int Main.noDynamicBCEPossiblyInfiniteLoop(int[], int, int) BCE (after) + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet /// CHECK-NOT: Deoptimize static int noDynamicBCEPossiblyInfiniteLoop(int[] x, int lo, int hi) { // As above, but now the index is not used as subscript, @@ -1034,14 +1085,16 @@ public class Main { } /// CHECK-START: int Main.noDynamicBCEMixedInductionTypes(int[], long, long) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.noDynamicBCEMixedInductionTypes(int[], long, long) BCE (after) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet // /// CHECK-START: int Main.noDynamicBCEMixedInductionTypes(int[], long, long) BCE (after) + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet /// CHECK-NOT: Deoptimize static int noDynamicBCEMixedInductionTypes(int[] x, long lo, long hi) { int result = 0; @@ -1054,21 +1107,42 @@ public class Main { } /// CHECK-START: int Main.dynamicBCEAndConstantIndices(int[], int[][], int, int) BCE (before) - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop>> - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop>> + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: NotEqual + /// CHECK: If + /// CHECK: If + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: If + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck // /// CHECK-START: int Main.dynamicBCEAndConstantIndices(int[], int[][], int, int) BCE (after) - // Order matters: - /// CHECK: Deoptimize loop:<<Loop:B\d+>> - // CHECK-NOT: Goto loop:<<Loop>> - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop>> - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop>> - /// CHECK-DAG: {{l\d+}} ArrayGet loop:<<Loop>> - /// CHECK: Goto loop:<<Loop>> - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndices(int[], int[][], int, int) BCE (after) - /// CHECK-DAG: Deoptimize loop:none + /// CHECK: NullCheck + /// CHECK: ArrayLength + /// CHECK: NotEqual + /// CHECK: If + /// CHECK: If + /// CHECK-NOT: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: If + /// CHECK: Deoptimize + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK: BoundsCheck + /// CHECK-NOT: BoundsCheck + /// CHECK: Exit + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK: Deoptimize + /// CHECK-NOT: ArrayGet static int dynamicBCEAndConstantIndices(int[] x, int[][] a, int lo, int hi) { // Deliberately test array length on a before the loop so that only bounds checks // on constant subscripts remain, making them a viable candidate for hoisting. @@ -1092,74 +1166,80 @@ public class Main { return result; } - /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllPrimTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - // For brevity, just test occurrence of at least one of each in the loop: - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllPrimTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-NOT: ArrayGet loop:<<Loop>> - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllPrimTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], int, int) BCE (after) - /// CHECK-NOT: NullCheck loop:{{B\d+}} - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllPrimTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], int, int) BCE (after) - /// CHECK-DAG: Deoptimize loop:none - static int dynamicBCEAndConstantIndicesAllPrimTypes(int[] q, - boolean[] r, - byte[] s, - char[] t, - short[] u, - int[] v, - long[] w, - float[] x, - double[] y, int lo, int hi) { + /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], java.lang.Integer[], int, int) BCE (before) + /// CHECK: If + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + /// CHECK: BoundsCheck + /// CHECK: ArrayGet + // + /// CHECK-START: int Main.dynamicBCEAndConstantIndicesAllTypes(int[], boolean[], byte[], char[], short[], int[], long[], float[], double[], java.lang.Integer[], int, int) BCE (after) + /// CHECK-DAG: If + /// CHECK-NOT: BoundsCheck + /// CHECK-DAG: ArrayGet + /// CHECK-NOT: BoundsCheck + /// CHECK-NOT: ArrayGet + /// CHECK-DAG: Exit + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: Deoptimize + /// CHECK-DAG: ArrayGet + static int dynamicBCEAndConstantIndicesAllTypes(int[] q, + boolean[] r, + byte[] s, + char[] t, + short[] u, + int[] v, + long[] w, + float[] x, + double[] y, + Integer[] z, int lo, int hi) { int result = 0; for (int i = lo; i < hi; i++) { - // All constant index array references can be hoisted out of the loop during BCE on q[i]. result += q[i] + (r[0] ? 1 : 0) + (int) s[0] + (int) t[0] + (int) u[0] + (int) v[0] + - (int) w[0] + (int) x[0] + (int) y[0]; - } - return result; - } - - /// CHECK-START: int Main.dynamicBCEAndConstantIndexRefType(int[], java.lang.Integer[], int, int) BCE (before) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: NullCheck loop:<<Loop>> - /// CHECK-DAG: ArrayLength loop:<<Loop>> - /// CHECK-DAG: BoundsCheck loop:<<Loop>> - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndexRefType(int[], java.lang.Integer[], int, int) BCE (after) - /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> - /// CHECK-DAG: ArrayGet loop:<<Loop>> - /// CHECK-DAG: Deoptimize loop:none - // - /// CHECK-START: int Main.dynamicBCEAndConstantIndexRefType(int[], java.lang.Integer[], int, int) BCE (after) - /// CHECK-NOT: ArrayLength loop:{{B\d+}} - /// CHECK-NOT: BoundsCheck loop:{{B\d+}} - static int dynamicBCEAndConstantIndexRefType(int[] q, Integer[] z, int lo, int hi) { - int result = 0; - for (int i = lo; i < hi; i++) { - // Similar to above, but now implicit virtual call to intValue() - // prevents hoisting z[0] array get itself during BCE on q[i]. - result += q[i] + z[0]; + (int) w[0] + (int) x[0] + (int) y[0] + (int) z[0]; } return result; } @@ -1421,10 +1501,9 @@ public class Main { long[] x6 = { 6 }; float[] x7 = { 7 }; double[] x8 = { 8 }; - expectEquals(415, - dynamicBCEAndConstantIndicesAllPrimTypes(x, x1, x2, x3, x4, x5, x6, x7, x8, 0, 10)); Integer[] x9 = { 9 }; - expectEquals(145, dynamicBCEAndConstantIndexRefType(x, x9, 0, 10)); + expectEquals(505, + dynamicBCEAndConstantIndicesAllTypes(x, x1, x2, x3, x4, x5, x6, x7, x8, x9, 0, 10)); } private static void expectEquals(int expected, int result) { |