Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: src/hydrogen.cc

Issue 16035016: Allow boundscheck elimination to work on Smi keys. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comment Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4097 matching lines...) Expand 10 before | Expand all | Expand 10 after
4108 HValue* IndexBase() const { return index_base_; } 4108 HValue* IndexBase() const { return index_base_; }
4109 HValue* Length() const { return length_; } 4109 HValue* Length() const { return length_; }
4110 4110
4111 uint32_t Hash() { 4111 uint32_t Hash() {
4112 return static_cast<uint32_t>(index_base_->Hashcode() ^ length_->Hashcode()); 4112 return static_cast<uint32_t>(index_base_->Hashcode() ^ length_->Hashcode());
4113 } 4113 }
4114 4114
4115 static BoundsCheckKey* Create(Zone* zone, 4115 static BoundsCheckKey* Create(Zone* zone,
4116 HBoundsCheck* check, 4116 HBoundsCheck* check,
4117 int32_t* offset) { 4117 int32_t* offset) {
4118 if (!check->index()->representation().IsInteger32()) return NULL; 4118 if (!check->index()->representation().IsSmiOrInteger32()) return NULL;
4119 4119
4120 HValue* index_base = NULL; 4120 HValue* index_base = NULL;
4121 HConstant* constant = NULL; 4121 HConstant* constant = NULL;
4122 bool is_sub = false; 4122 bool is_sub = false;
4123 4123
4124 if (check->index()->IsAdd()) { 4124 if (check->index()->IsAdd()) {
4125 HAdd* index = HAdd::cast(check->index()); 4125 HAdd* index = HAdd::cast(check->index());
4126 if (index->left()->IsConstant()) { 4126 if (index->left()->IsConstant()) {
4127 constant = HConstant::cast(index->left()); 4127 constant = HConstant::cast(index->left());
4128 index_base = index->right(); 4128 index_base = index->right();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
4204 // 4204 //
4205 // If HasSingleCheck() is true then new_check is added as "second check" 4205 // If HasSingleCheck() is true then new_check is added as "second check"
4206 // (either upper or lower; note that HasSingleCheck() becomes false). 4206 // (either upper or lower; note that HasSingleCheck() becomes false).
4207 // Otherwise one of the current checks is modified so that it also covers 4207 // Otherwise one of the current checks is modified so that it also covers
4208 // new_offset, and new_check is removed. 4208 // new_offset, and new_check is removed.
4209 // 4209 //
4210 // If the check cannot be modified because the context is unknown it 4210 // If the check cannot be modified because the context is unknown it
4211 // returns false, otherwise it returns true. 4211 // returns false, otherwise it returns true.
4212 bool CoverCheck(HBoundsCheck* new_check, 4212 bool CoverCheck(HBoundsCheck* new_check,
4213 int32_t new_offset) { 4213 int32_t new_offset) {
4214 ASSERT(new_check->index()->representation().IsInteger32()); 4214 ASSERT(new_check->index()->representation().IsSmiOrInteger32());
4215 bool keep_new_check = false; 4215 bool keep_new_check = false;
4216 4216
4217 if (new_offset > upper_offset_) { 4217 if (new_offset > upper_offset_) {
4218 upper_offset_ = new_offset; 4218 upper_offset_ = new_offset;
4219 if (HasSingleCheck()) { 4219 if (HasSingleCheck()) {
4220 keep_new_check = true; 4220 keep_new_check = true;
4221 upper_check_ = new_check; 4221 upper_check_ = new_check;
4222 } else { 4222 } else {
4223 bool result = BuildOffsetAdd(upper_check_, 4223 bool result = BuildOffsetAdd(upper_check_,
4224 &added_upper_index_, 4224 &added_upper_index_,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
4313 // current context cannot be determined. 4313 // current context cannot be determined.
4314 bool BuildOffsetAdd(HBoundsCheck* check, 4314 bool BuildOffsetAdd(HBoundsCheck* check,
4315 HInstruction** add, 4315 HInstruction** add,
4316 HConstant** constant, 4316 HConstant** constant,
4317 HValue* original_value, 4317 HValue* original_value,
4318 Representation representation, 4318 Representation representation,
4319 int32_t new_offset) { 4319 int32_t new_offset) {
4320 HValue* index_context = IndexContext(*add, check); 4320 HValue* index_context = IndexContext(*add, check);
4321 if (index_context == NULL) return false; 4321 if (index_context == NULL) return false;
4322 4322
4323 HConstant* new_constant = new(BasicBlock()->zone()) 4323 HConstant* new_constant = new(BasicBlock()->zone()) HConstant(
4324 HConstant(new_offset, Representation::Integer32()); 4324 new_offset, representation);
4325 if (*add == NULL) { 4325 if (*add == NULL) {
4326 new_constant->InsertBefore(check); 4326 new_constant->InsertBefore(check);
4327 (*add) = HAdd::New( 4327 (*add) = HAdd::New(
4328 BasicBlock()->zone(), index_context, original_value, new_constant); 4328 BasicBlock()->zone(), index_context, original_value, new_constant);
4329 (*add)->AssumeRepresentation(representation); 4329 (*add)->AssumeRepresentation(representation);
4330 (*add)->InsertBefore(check); 4330 (*add)->InsertBefore(check);
4331 } else { 4331 } else {
4332 new_constant->InsertBefore(*add); 4332 new_constant->InsertBefore(*add);
4333 (*constant)->DeleteAndReplaceWith(new_constant); 4333 (*constant)->DeleteAndReplaceWith(new_constant);
4334 } 4334 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
4446 4446
4447 void HGraph::EliminateRedundantBoundsChecks() { 4447 void HGraph::EliminateRedundantBoundsChecks() {
4448 HPhase phase("H_Eliminate bounds checks", this); 4448 HPhase phase("H_Eliminate bounds checks", this);
4449 BoundsCheckTable checks_table(zone()); 4449 BoundsCheckTable checks_table(zone());
4450 EliminateRedundantBoundsChecks(entry_block(), &checks_table); 4450 EliminateRedundantBoundsChecks(entry_block(), &checks_table);
4451 } 4451 }
4452 4452
4453 4453
4454 static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) { 4454 static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) {
4455 HValue* index = array_operation->GetKey()->ActualValue(); 4455 HValue* index = array_operation->GetKey()->ActualValue();
4456 if (!index->representation().IsInteger32()) return; 4456 if (!index->representation().IsSmiOrInteger32()) return;
4457 4457
4458 HConstant* constant; 4458 HConstant* constant;
4459 HValue* subexpression; 4459 HValue* subexpression;
4460 int32_t sign; 4460 int32_t sign;
4461 if (index->IsAdd()) { 4461 if (index->IsAdd()) {
4462 sign = 1; 4462 sign = 1;
4463 HAdd* add = HAdd::cast(index); 4463 HAdd* add = HAdd::cast(index);
4464 if (add->left()->IsConstant()) { 4464 if (add->left()->IsConstant()) {
4465 subexpression = add->right(); 4465 subexpression = add->right();
4466 constant = HConstant::cast(add->left()); 4466 constant = HConstant::cast(add->left());
(...skipping 7142 matching lines...) Expand 10 before | Expand all | Expand 10 after
11609 } 11609 }
11610 } 11610 }
11611 11611
11612 #ifdef DEBUG 11612 #ifdef DEBUG
11613 if (graph_ != NULL) graph_->Verify(false); // No full verify. 11613 if (graph_ != NULL) graph_->Verify(false); // No full verify.
11614 if (allocator_ != NULL) allocator_->Verify(); 11614 if (allocator_ != NULL) allocator_->Verify();
11615 #endif 11615 #endif
11616 } 11616 }
11617 11617
11618 } } // namespace v8::internal 11618 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698