summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <treehugger-gerrit@google.com> 2017-04-11 19:46:48 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2017-04-11 19:46:53 +0000
commit60efed530d38893eb6c1ff2c4135ecf5320f8fff (patch)
tree62694f043981758f678b236d485b2185042a17a7
parente2dfd30e752ed94944cb6f614f1a4cf18d038677 (diff)
parent3101e58114b21876f77940d716385c54f697761b (diff)
Merge "Fix bug in vectorization of charAt, with regression test"
-rw-r--r--compiler/optimizing/loop_optimization.cc6
-rw-r--r--test/623-checker-loop-regressions/src/Main.java15
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");
}