diff options
| author | 2017-04-11 19:46:48 +0000 | |
|---|---|---|
| committer | 2017-04-11 19:46:53 +0000 | |
| commit | 60efed530d38893eb6c1ff2c4135ecf5320f8fff (patch) | |
| tree | 62694f043981758f678b236d485b2185042a17a7 | |
| parent | e2dfd30e752ed94944cb6f614f1a4cf18d038677 (diff) | |
| parent | 3101e58114b21876f77940d716385c54f697761b (diff) | |
Merge "Fix bug in vectorization of charAt, with regression test"
| -rw-r--r-- | compiler/optimizing/loop_optimization.cc | 6 | ||||
| -rw-r--r-- | test/623-checker-loop-regressions/src/Main.java | 15 |
2 files changed, 21 insertions, 0 deletions
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index 8eeff1f2f0..cf7acb36d1 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -623,6 +623,12 @@ bool HLoopOptimization::VectorizeUse(LoopNode* node, } return true; } else if (instruction->IsArrayGet()) { + // Strings are different, with a different offset to the actual data + // and some compressed to save memory. For now, all cases are rejected + // to avoid the complexity. + if (instruction->AsArrayGet()->IsStringCharAt()) { + return false; + } // Accept a right-hand-side array base[index] for // (1) exact matching vector type, // (2) loop-invariant base, diff --git a/test/623-checker-loop-regressions/src/Main.java b/test/623-checker-loop-regressions/src/Main.java index 182c07d983..f0b327840c 100644 --- a/test/623-checker-loop-regressions/src/Main.java +++ b/test/623-checker-loop-regressions/src/Main.java @@ -280,6 +280,14 @@ public class Main { } } + // If vectorized, string encoding should be dealt with. + private static void string2Bytes(char[] a, String b) { + int min = Math.min(a.length, b.length()); + for (int i = 0; i < min; i++) { + a[i] = b.charAt(i); + } + } + public static void main(String[] args) { expectEquals(10, earlyExitFirst(-1)); for (int i = 0; i <= 10; i++) { @@ -354,6 +362,13 @@ public class Main { expectEquals(2, yy[i]); } + char[] aa = new char[23]; + String bb = "hello world how are you"; + string2Bytes(aa, bb); + for (int i = 0; i < aa.length; i++) { + expectEquals(aa[i], bb.charAt(i)); + } + System.out.println("passed"); } |