Chromium Code Reviews| Index: runtime/vm/flow_graph_optimizer.cc |
| =================================================================== |
| --- runtime/vm/flow_graph_optimizer.cc (revision 27768) |
| +++ runtime/vm/flow_graph_optimizer.cc (working copy) |
| @@ -692,8 +692,6 @@ |
| const ICData& ic_data = ICData::Handle(call->ic_data()->AsUnaryClassChecks()); |
| - if (ic_data.NumberOfChecks() == 0) return kIllegalCid; |
| - // TODO(vegorov): Add multiple receiver type support. |
| if (ic_data.NumberOfChecks() != 1) return kIllegalCid; |
| ASSERT(ic_data.HasOneTarget()); |
| @@ -1069,9 +1067,13 @@ |
| case MethodRecognizer::kExternalUint8ClampedArrayGetIndexed: |
| case MethodRecognizer::kInt16ArrayGetIndexed: |
| case MethodRecognizer::kUint16ArrayGetIndexed: |
| + return TryInlineGetIndexed(kind, call, ic_data, entry, last); |
| + case MethodRecognizer::kFloat32x4ArrayGetIndexed: |
| + if (!ShouldInlineSimd()) return false; |
|
Florian Schneider
2013/09/25 12:10:08
This check was not performed when this functions w
|
| + return TryInlineGetIndexed(kind, call, ic_data, entry, last); |
| case MethodRecognizer::kInt32ArrayGetIndexed: |
| case MethodRecognizer::kUint32ArrayGetIndexed: |
| - case MethodRecognizer::kFloat32x4ArrayGetIndexed: |
| + if (!CanUnboxInt32()) return false; |
| return TryInlineGetIndexed(kind, call, ic_data, entry, last); |
| default: |
| return false; |
| @@ -1176,44 +1178,24 @@ |
| bool FlowGraphOptimizer::TryReplaceWithLoadIndexed(InstanceCallInstr* call) { |
| - const intptr_t class_id = ReceiverClassId(call); |
| - switch (class_id) { |
| - case kArrayCid: |
| - case kImmutableArrayCid: |
| - case kGrowableObjectArrayCid: |
| - case kTypedDataFloat32ArrayCid: |
| - case kTypedDataFloat64ArrayCid: |
| - case kTypedDataInt8ArrayCid: |
| - case kTypedDataUint8ArrayCid: |
| - case kTypedDataUint8ClampedArrayCid: |
| - case kExternalTypedDataUint8ArrayCid: |
| - case kExternalTypedDataUint8ClampedArrayCid: |
| - case kTypedDataInt16ArrayCid: |
| - case kTypedDataUint16ArrayCid: |
| - break; |
| - case kTypedDataFloat32x4ArrayCid: |
| - if (!ShouldInlineSimd()) { |
| - return false; |
| - } |
| - break; |
| - case kTypedDataInt32ArrayCid: |
| - case kTypedDataUint32ArrayCid: |
| - if (!CanUnboxInt32()) return false; |
| - break; |
| - default: |
| - return false; |
| - } |
| + // Check for monomorphic IC data. |
| + if (!call->HasICData()) return false; |
| + const ICData& ic_data = ICData::Handle(call->ic_data()->AsUnaryClassChecks()); |
| + if (ic_data.NumberOfChecks() != 1) return false; |
| + ASSERT(ic_data.HasOneTarget()); |
| - const Function& target = |
| - Function::Handle(call->ic_data()->GetTargetAt(0)); |
| + const Function& target = Function::Handle(ic_data.GetTargetAt(0)); |
| TargetEntryInstr* entry; |
| Definition* last; |
| - ASSERT(class_id == MethodKindToCid(MethodRecognizer::RecognizeKind(target))); |
| - bool success = TryInlineRecognizedMethod(target, |
| - call, |
| - *call->ic_data(), |
| - &entry, &last); |
| - ASSERT(success); |
| + ASSERT(ReceiverClassId(call) == |
| + MethodKindToCid(MethodRecognizer::RecognizeKind(target))); |
| + if (!TryInlineRecognizedMethod(target, |
| + call, |
| + *call->ic_data(), |
| + &entry, &last)) { |
| + return false; |
| + } |
| + |
| // Insert receiver class check. |
| AddReceiverCheck(call); |
| // Remove the original push arguments. |