OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 #ifndef V8_COMPILER_PHI_REDUCER_H_ | |
6 #define V8_COMPILER_PHI_REDUCER_H_ | |
7 | |
8 #include "src/compiler/generic-node-inl.h" | |
9 #include "src/compiler/graph-reducer.h" | |
10 | |
11 namespace v8 { | |
12 namespace internal { | |
13 namespace compiler { | |
14 | |
15 // Replaces redundant phis if all the inputs are the same or the phi itself. | |
16 class PhiReducer FINAL : public Reducer { | |
17 public: | |
18 virtual Reduction Reduce(Node* node) OVERRIDE { | |
19 if (node->opcode() != IrOpcode::kPhi && | |
20 node->opcode() != IrOpcode::kEffectPhi) | |
21 return NoChange(); | |
22 | |
23 int n = node->op()->InputCount(); | |
24 if (n == 1) return Replace(node->InputAt(0)); | |
25 | |
26 Node* replacement = NULL; | |
27 Node::Inputs inputs = node->inputs(); | |
28 for (InputIter it = inputs.begin(); n > 0; --n, ++it) { | |
29 Node* input = *it; | |
30 if (input != node && input != replacement) { | |
31 if (replacement != NULL) return NoChange(); | |
32 replacement = input; | |
33 } | |
34 } | |
35 DCHECK_NE(node, replacement); | |
36 return Replace(replacement); | |
37 } | |
38 }; | |
39 } | |
40 } | |
41 } // namespace v8::internal::compiler | |
42 | |
43 #endif // V8_COMPILER_PHI_REDUCER_H_ | |
OLD | NEW |