OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 381 |
382 HUseListNode* HUseListNode::tail() { | 382 HUseListNode* HUseListNode::tail() { |
383 // Skip and remove dead items in the use list. | 383 // Skip and remove dead items in the use list. |
384 while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) { | 384 while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) { |
385 tail_ = tail_->tail_; | 385 tail_ = tail_->tail_; |
386 } | 386 } |
387 return tail_; | 387 return tail_; |
388 } | 388 } |
389 | 389 |
390 | 390 |
391 bool HValue::CheckUsesForFlag(Flag f) { | 391 bool HValue::CheckUsesForFlag(Flag f) const { |
392 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { | 392 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
393 if (it.value()->IsSimulate()) continue; | 393 if (it.value()->IsSimulate()) continue; |
394 if (!it.value()->CheckFlag(f)) return false; | 394 if (!it.value()->CheckFlag(f)) return false; |
395 } | 395 } |
396 return true; | 396 return true; |
397 } | 397 } |
398 | 398 |
399 | 399 |
400 bool HValue::HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) { | 400 bool HValue::HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const { |
401 bool return_value = false; | 401 bool return_value = false; |
402 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { | 402 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
403 if (it.value()->IsSimulate()) continue; | 403 if (it.value()->IsSimulate()) continue; |
404 if (!it.value()->CheckFlag(f)) return false; | 404 if (!it.value()->CheckFlag(f)) return false; |
405 return_value = true; | 405 return_value = true; |
406 } | 406 } |
407 return return_value; | 407 return return_value; |
408 } | 408 } |
409 | 409 |
410 | 410 |
(...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 | 1295 |
1296 if (val->IsDiv() && (val->UseCount() == 1)) { | 1296 if (val->IsDiv() && (val->UseCount() == 1)) { |
1297 HDiv* hdiv = HDiv::cast(val); | 1297 HDiv* hdiv = HDiv::cast(val); |
1298 HValue* left = hdiv->left(); | 1298 HValue* left = hdiv->left(); |
1299 HValue* right = hdiv->right(); | 1299 HValue* right = hdiv->right(); |
1300 // Try to simplify left and right values of the division. | 1300 // Try to simplify left and right values of the division. |
1301 HValue* new_left = SimplifiedDividendForMathFloorOfDiv(left); | 1301 HValue* new_left = SimplifiedDividendForMathFloorOfDiv(left); |
1302 if (new_left == NULL && | 1302 if (new_left == NULL && |
1303 hdiv->observed_input_representation(1).IsSmiOrInteger32()) { | 1303 hdiv->observed_input_representation(1).IsSmiOrInteger32()) { |
1304 new_left = new(block()->zone()) HChange( | 1304 new_left = new(block()->zone()) HChange( |
1305 left, Representation::Integer32(), false, false, false); | 1305 left, Representation::Integer32(), false, false); |
1306 HChange::cast(new_left)->InsertBefore(this); | 1306 HChange::cast(new_left)->InsertBefore(this); |
1307 } | 1307 } |
1308 HValue* new_right = | 1308 HValue* new_right = |
1309 LChunkBuilder::SimplifiedDivisorForMathFloorOfDiv(right); | 1309 LChunkBuilder::SimplifiedDivisorForMathFloorOfDiv(right); |
1310 if (new_right == NULL && | 1310 if (new_right == NULL && |
1311 #if V8_TARGET_ARCH_ARM | 1311 #if V8_TARGET_ARCH_ARM |
1312 CpuFeatures::IsSupported(SUDIV) && | 1312 CpuFeatures::IsSupported(SUDIV) && |
1313 #endif | 1313 #endif |
1314 hdiv->observed_input_representation(2).IsSmiOrInteger32()) { | 1314 hdiv->observed_input_representation(2).IsSmiOrInteger32()) { |
1315 new_right = new(block()->zone()) HChange( | 1315 new_right = new(block()->zone()) HChange( |
1316 right, Representation::Integer32(), false, false, false); | 1316 right, Representation::Integer32(), false, false); |
1317 HChange::cast(new_right)->InsertBefore(this); | 1317 HChange::cast(new_right)->InsertBefore(this); |
1318 } | 1318 } |
1319 | 1319 |
1320 // Return if left or right are not optimizable. | 1320 // Return if left or right are not optimizable. |
1321 if ((new_left == NULL) || (new_right == NULL)) return this; | 1321 if ((new_left == NULL) || (new_right == NULL)) return this; |
1322 | 1322 |
1323 // Insert the new values in the graph. | 1323 // Insert the new values in the graph. |
1324 if (new_left->IsInstruction() && | 1324 if (new_left->IsInstruction() && |
1325 !HInstruction::cast(new_left)->IsLinked()) { | 1325 !HInstruction::cast(new_left)->IsLinked()) { |
1326 HInstruction::cast(new_left)->InsertBefore(this); | 1326 HInstruction::cast(new_left)->InsertBefore(this); |
(...skipping 1439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2766 | 2766 |
2767 | 2767 |
2768 void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { | 2768 void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { |
2769 left()->PrintNameTo(stream); | 2769 left()->PrintNameTo(stream); |
2770 stream->Add(" "); | 2770 stream->Add(" "); |
2771 right()->PrintNameTo(stream); | 2771 right()->PrintNameTo(stream); |
2772 HControlInstruction::PrintDataTo(stream); | 2772 HControlInstruction::PrintDataTo(stream); |
2773 } | 2773 } |
2774 | 2774 |
2775 | 2775 |
| 2776 void HCompareHoleAndBranch::PrintDataTo(StringStream* stream) { |
| 2777 object()->PrintNameTo(stream); |
| 2778 HControlInstruction::PrintDataTo(stream); |
| 2779 } |
| 2780 |
| 2781 |
| 2782 void HCompareHoleAndBranch::InferRepresentation( |
| 2783 HInferRepresentationPhase* h_infer) { |
| 2784 ChangeRepresentation(object()->representation()); |
| 2785 } |
| 2786 |
| 2787 |
2776 void HGoto::PrintDataTo(StringStream* stream) { | 2788 void HGoto::PrintDataTo(StringStream* stream) { |
2777 stream->Add("B%d", SuccessorAt(0)->block_id()); | 2789 stream->Add("B%d", SuccessorAt(0)->block_id()); |
2778 } | 2790 } |
2779 | 2791 |
2780 | 2792 |
2781 void HCompareNumericAndBranch::InferRepresentation( | 2793 void HCompareNumericAndBranch::InferRepresentation( |
2782 HInferRepresentationPhase* h_infer) { | 2794 HInferRepresentationPhase* h_infer) { |
2783 Representation left_rep = left()->representation(); | 2795 Representation left_rep = left()->representation(); |
2784 Representation right_rep = right()->representation(); | 2796 Representation right_rep = right()->representation(); |
2785 Representation observed_left = observed_input_representation(0); | 2797 Representation observed_left = observed_input_representation(0); |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3078 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { | 3090 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
3079 HValue* use = it.value(); | 3091 HValue* use = it.value(); |
3080 if (!use->IsChange()) return false; | 3092 if (!use->IsChange()) return false; |
3081 } | 3093 } |
3082 | 3094 |
3083 return true; | 3095 return true; |
3084 } | 3096 } |
3085 | 3097 |
3086 | 3098 |
3087 bool HLoadKeyed::AllUsesCanTreatHoleAsNaN() const { | 3099 bool HLoadKeyed::AllUsesCanTreatHoleAsNaN() const { |
3088 if (!IsFastDoubleElementsKind(elements_kind())) { | 3100 return IsFastDoubleElementsKind(elements_kind()) && |
3089 return false; | 3101 CheckUsesForFlag(HValue::kAllowUndefinedAsNaN); |
3090 } | |
3091 | |
3092 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { | |
3093 HValue* use = it.value(); | |
3094 if (!use->CheckFlag(HValue::kAllowUndefinedAsNaN)) { | |
3095 return false; | |
3096 } | |
3097 } | |
3098 | |
3099 return true; | |
3100 } | 3102 } |
3101 | 3103 |
3102 | 3104 |
3103 bool HLoadKeyed::RequiresHoleCheck() const { | 3105 bool HLoadKeyed::RequiresHoleCheck() const { |
3104 if (IsFastPackedElementsKind(elements_kind())) { | 3106 if (IsFastPackedElementsKind(elements_kind())) { |
3105 return false; | 3107 return false; |
3106 } | 3108 } |
3107 | 3109 |
3108 if (IsExternalArrayElementsKind(elements_kind())) { | 3110 if (IsExternalArrayElementsKind(elements_kind())) { |
3109 return false; | 3111 return false; |
(...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4135 break; | 4137 break; |
4136 case kExternalMemory: | 4138 case kExternalMemory: |
4137 stream->Add("[external-memory]"); | 4139 stream->Add("[external-memory]"); |
4138 break; | 4140 break; |
4139 } | 4141 } |
4140 | 4142 |
4141 stream->Add("@%d", offset()); | 4143 stream->Add("@%d", offset()); |
4142 } | 4144 } |
4143 | 4145 |
4144 } } // namespace v8::internal | 4146 } } // namespace v8::internal |
OLD | NEW |