| Index: runtime/vm/aot_optimizer.cc
|
| diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
|
| index bc3bf8b1cca5c3ca6b220e43966506df720d922f..0318786c8d310bf74481485ac474d41803ead4e6 100644
|
| --- a/runtime/vm/aot_optimizer.cc
|
| +++ b/runtime/vm/aot_optimizer.cc
|
| @@ -789,7 +789,7 @@ static bool IsLengthOneString(Definition* d) {
|
| return false;
|
| }
|
| } else {
|
| - return d->IsStringFromCharCode();
|
| + return d->IsOneByteStringFromCharCode();
|
| }
|
| }
|
|
|
| @@ -823,9 +823,10 @@ bool AotOptimizer::TryStringLengthOneEquality(InstanceCallInstr* call,
|
| ConstantInstr* char_code_left = flow_graph()->GetConstant(
|
| Smi::ZoneHandle(Z, Smi::New(static_cast<intptr_t>(str.CharAt(0)))));
|
| left_val = new(Z) Value(char_code_left);
|
| - } else if (left->IsStringFromCharCode()) {
|
| + } else if (left->IsOneByteStringFromCharCode()) {
|
| // Use input of string-from-charcode as left value.
|
| - StringFromCharCodeInstr* instr = left->AsStringFromCharCode();
|
| + OneByteStringFromCharCodeInstr* instr =
|
| + left->AsOneByteStringFromCharCode();
|
| left_val = new(Z) Value(instr->char_code()->definition());
|
| to_remove_left = instr;
|
| } else {
|
| @@ -835,9 +836,10 @@ bool AotOptimizer::TryStringLengthOneEquality(InstanceCallInstr* call,
|
|
|
| Definition* to_remove_right = NULL;
|
| Value* right_val = NULL;
|
| - if (right->IsStringFromCharCode()) {
|
| + if (right->IsOneByteStringFromCharCode()) {
|
| // Skip string-from-char-code, and use its input as right value.
|
| - StringFromCharCodeInstr* right_instr = right->AsStringFromCharCode();
|
| + OneByteStringFromCharCodeInstr* right_instr =
|
| + right->AsOneByteStringFromCharCode();
|
| right_val = new(Z) Value(right_instr->char_code()->definition());
|
| to_remove_right = right_instr;
|
| } else {
|
| @@ -1787,11 +1789,24 @@ bool AotOptimizer::TryInlineInstanceMethod(InstanceCallInstr* call) {
|
| return true;
|
| }
|
|
|
| - if (((recognized_kind == MethodRecognizer::kStringBaseCodeUnitAt) ||
|
| - (recognized_kind == MethodRecognizer::kStringBaseCharAt)) &&
|
| - (ic_data.NumberOfChecks() == 1) &&
|
| - ((class_ids[0] == kOneByteStringCid) ||
|
| - (class_ids[0] == kTwoByteStringCid))) {
|
| + if ((recognized_kind == MethodRecognizer::kOneByteStringCodeUnitAt) ||
|
| + (recognized_kind == MethodRecognizer::kTwoByteStringCodeUnitAt) ||
|
| + (recognized_kind == MethodRecognizer::kExternalOneByteStringCodeUnitAt) ||
|
| + (recognized_kind == MethodRecognizer::kExternalTwoByteStringCodeUnitAt)) {
|
| + ASSERT(ic_data.NumberOfChecks() == 1);
|
| + ASSERT((class_ids[0] == kOneByteStringCid) ||
|
| + (class_ids[0] == kTwoByteStringCid) ||
|
| + (class_ids[0] == kExternalOneByteStringCid) ||
|
| + (class_ids[0] == kExternalTwoByteStringCid));
|
| + return TryReplaceInstanceCallWithInline(call);
|
| + }
|
| +
|
| + if ((recognized_kind == MethodRecognizer::kStringBaseCharAt) &&
|
| + (ic_data.NumberOfChecks() == 1)) {
|
| + ASSERT((class_ids[0] == kOneByteStringCid) ||
|
| + (class_ids[0] == kTwoByteStringCid) ||
|
| + (class_ids[0] == kExternalOneByteStringCid) ||
|
| + (class_ids[0] == kExternalTwoByteStringCid));
|
| return TryReplaceInstanceCallWithInline(call);
|
| }
|
|
|
|
|