Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 5d2099237b4c4ef24d2f9bcadd7ab70cf9e50325..d1e5b51a5e3e94ce7aac330bcf6df14a9ba0f3d4 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -3326,8 +3326,8 @@ bool HGraph::Optimize(SmartArrayPointer<char>* bailout_reason) { |
HStackCheckEliminator sce(this); |
sce.Process(); |
- if (FLAG_array_bounds_checks_elimination) EliminateRedundantBoundsChecks(); |
- if (FLAG_array_index_dehoisting) DehoistSimpleArrayIndexComputations(); |
+ EliminateRedundantBoundsChecks(); |
+ DehoistSimpleArrayIndexComputations(); |
if (FLAG_dead_code_elimination) DeadCodeElimination(); |
return true; |
@@ -3484,7 +3484,7 @@ class BoundsCheckBbData: public ZoneObject { |
} |
if (!keep_new_check) { |
- new_check->DeleteAndReplaceWith(new_check->index()); |
+ new_check->DeleteAndReplaceWith(NULL); |
} |
} |
@@ -3591,13 +3591,21 @@ class BoundsCheckTable : private ZoneHashMap { |
// Eliminates checks in bb and recursively in the dominated blocks. |
+// Also replace the results of check instructions with the original value, if |
+// the result is used. This is safe now, since we don't do code motion after |
+// this point. It enables better register allocation since the value produced |
+// by check instructions is really a copy of the original value. |
void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
BoundsCheckTable* table) { |
BoundsCheckBbData* bb_data_list = NULL; |
for (HInstruction* i = bb->first(); i != NULL; i = i->next()) { |
if (!i->IsBoundsCheck()) continue; |
+ |
HBoundsCheck* check = HBoundsCheck::cast(i); |
+ check->ReplaceAllUsesWith(check->index()); |
+ |
+ if (!FLAG_array_bounds_checks_elimination) continue; |
int32_t offset; |
BoundsCheckKey* key = |
@@ -3616,7 +3624,7 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, |
NULL); |
*data_p = bb_data_list; |
} else if (data->OffsetIsCovered(offset)) { |
- check->DeleteAndReplaceWith(check->index()); |
+ check->DeleteAndReplaceWith(NULL); |
} else if (data->BasicBlock() == bb) { |
data->CoverCheck(check, offset); |
} else { |
@@ -3711,6 +3719,8 @@ static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) { |
void HGraph::DehoistSimpleArrayIndexComputations() { |
+ if (!FLAG_array_index_dehoisting) return; |
+ |
HPhase phase("H_Dehoist index computations", this); |
for (int i = 0; i < blocks()->length(); ++i) { |
for (HInstruction* instr = blocks()->at(i)->first(); |