Home | History | Annotate | Download | only in src
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/hydrogen-canonicalize.h"
      6 #include "src/hydrogen-redundant-phi.h"
      7 
      8 namespace v8 {
      9 namespace internal {
     10 
     11 void HCanonicalizePhase::Run() {
     12   const ZoneList<HBasicBlock*>* blocks(graph()->blocks());
     13   // Before removing no-op instructions, save their semantic value.
     14   // We must be careful not to set the flag unnecessarily, because GVN
     15   // cannot identify two instructions when their flag value differs.
     16   for (int i = 0; i < blocks->length(); ++i) {
     17     for (HInstructionIterator it(blocks->at(i)); !it.Done(); it.Advance()) {
     18       HInstruction* instr = it.Current();
     19       if (instr->IsArithmeticBinaryOperation()) {
     20         if (instr->representation().IsInteger32()) {
     21           if (instr->HasAtLeastOneUseWithFlagAndNoneWithout(
     22                   HInstruction::kTruncatingToInt32)) {
     23             instr->SetFlag(HInstruction::kAllUsesTruncatingToInt32);
     24           }
     25         } else if (instr->representation().IsSmi()) {
     26           if (instr->HasAtLeastOneUseWithFlagAndNoneWithout(
     27                   HInstruction::kTruncatingToSmi)) {
     28             instr->SetFlag(HInstruction::kAllUsesTruncatingToSmi);
     29           } else if (instr->HasAtLeastOneUseWithFlagAndNoneWithout(
     30                          HInstruction::kTruncatingToInt32)) {
     31             // Avoid redundant minus zero check
     32             instr->SetFlag(HInstruction::kAllUsesTruncatingToInt32);
     33           }
     34         }
     35       }
     36     }
     37   }
     38 
     39   // Perform actual Canonicalization pass.
     40   HRedundantPhiEliminationPhase redundant_phi_eliminator(graph());
     41   for (int i = 0; i < blocks->length(); ++i) {
     42     // Eliminate redundant phis in the block first; changes to their inputs
     43     // might have made them redundant, and eliminating them creates more
     44     // opportunities for constant folding and strength reduction.
     45     redundant_phi_eliminator.ProcessBlock(blocks->at(i));
     46     // Now canonicalize each instruction.
     47     for (HInstructionIterator it(blocks->at(i)); !it.Done(); it.Advance()) {
     48       HInstruction* instr = it.Current();
     49       HValue* value = instr->Canonicalize();
     50       if (value != instr) instr->DeleteAndReplaceWith(value);
     51     }
     52   }
     53 }
     54 
     55 } }  // namespace v8::internal
     56