| Index: runtime/vm/intermediate_language.cc
|
| diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
|
| index d43bd9fc983097a2bb0bf4caa31fa62b4ec0dfc0..c37c414e0e8a7d9415caf0cbd3580ce755f84072 100644
|
| --- a/runtime/vm/intermediate_language.cc
|
| +++ b/runtime/vm/intermediate_language.cc
|
| @@ -2121,72 +2121,40 @@ Definition* MathUnaryInstr::Canonicalize(FlowGraph* flow_graph) {
|
| }
|
|
|
|
|
| -bool LoadFieldInstr::Evaluate(const Object& instance, Object* result) {
|
| - if (field() == NULL || !field()->is_final() || !instance.IsInstance()) {
|
| - return false;
|
| - }
|
| -
|
| - // Check that instance really has the field which we
|
| - // are trying to load from.
|
| - Class& cls = Class::Handle(instance.clazz());
|
| - while (cls.raw() != Class::null() && cls.raw() != field()->Owner()) {
|
| - cls = cls.SuperClass();
|
| - }
|
| - if (cls.raw() != field()->Owner()) {
|
| - // Failed to find the field in class or its superclasses.
|
| - return false;
|
| - }
|
| -
|
| - // Object has the field: execute the load.
|
| - *result = Instance::Cast(instance).GetField(*field());
|
| - return true;
|
| -}
|
| -
|
| -
|
| Definition* LoadFieldInstr::Canonicalize(FlowGraph* flow_graph) {
|
| if (!HasUses()) return NULL;
|
| -
|
| - if (IsImmutableLengthLoad()) {
|
| - // For fixed length arrays if the array is the result of a known constructor
|
| - // call we can replace the length load with the length argument passed to
|
| - // the constructor.
|
| - StaticCallInstr* call =
|
| - instance()->definition()->OriginalDefinition()->AsStaticCall();
|
| - if (call != NULL) {
|
| - if (call->is_known_list_constructor() &&
|
| - IsFixedLengthArrayCid(call->Type()->ToCid())) {
|
| - return call->ArgumentAt(1);
|
| - }
|
| - }
|
| -
|
| - CreateArrayInstr* create_array =
|
| - instance()->definition()->OriginalDefinition()->AsCreateArray();
|
| - if ((create_array != NULL) &&
|
| - (recognized_kind() == MethodRecognizer::kObjectArrayLength)) {
|
| - return create_array->num_elements()->definition();
|
| + if (!IsImmutableLengthLoad()) return this;
|
| +
|
| + // For fixed length arrays if the array is the result of a known constructor
|
| + // call we can replace the length load with the length argument passed to
|
| + // the constructor.
|
| + StaticCallInstr* call =
|
| + instance()->definition()->OriginalDefinition()->AsStaticCall();
|
| + if (call != NULL) {
|
| + if (call->is_known_list_constructor() &&
|
| + IsFixedLengthArrayCid(call->Type()->ToCid())) {
|
| + return call->ArgumentAt(1);
|
| }
|
| + }
|
|
|
| - // For arrays with guarded lengths, replace the length load
|
| - // with a constant.
|
| - LoadFieldInstr* load_array =
|
| - instance()->definition()->OriginalDefinition()->AsLoadField();
|
| - if (load_array != NULL) {
|
| - const Field* field = load_array->field();
|
| - if ((field != NULL) && (field->guarded_list_length() >= 0)) {
|
| - return flow_graph->GetConstant(
|
| - Smi::Handle(Smi::New(field->guarded_list_length())));
|
| - }
|
| - }
|
| + CreateArrayInstr* create_array =
|
| + instance()->definition()->OriginalDefinition()->AsCreateArray();
|
| + if ((create_array != NULL) &&
|
| + (recognized_kind() == MethodRecognizer::kObjectArrayLength)) {
|
| + return create_array->num_elements()->definition();
|
| }
|
|
|
| - // Try folding away loads from constant objects.
|
| - if (instance()->BindsToConstant()) {
|
| - Object& result = Object::Handle();
|
| - if (Evaluate(instance()->BoundConstant(), &result)) {
|
| - return flow_graph->GetConstant(result);
|
| + // For arrays with guarded lengths, replace the length load
|
| + // with a constant.
|
| + LoadFieldInstr* load_array =
|
| + instance()->definition()->OriginalDefinition()->AsLoadField();
|
| + if (load_array != NULL) {
|
| + const Field* field = load_array->field();
|
| + if ((field != NULL) && (field->guarded_list_length() >= 0)) {
|
| + return flow_graph->GetConstant(
|
| + Smi::Handle(Smi::New(field->guarded_list_length())));
|
| }
|
| }
|
| -
|
| return this;
|
| }
|
|
|
|
|