| 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();
 | 
| 
 |