OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/common-operator-reducer.h" | 5 #include "src/compiler/common-operator-reducer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 Node* if_true = merge->InputAt(0); | 197 Node* if_true = merge->InputAt(0); |
198 Node* if_false = merge->InputAt(1); | 198 Node* if_false = merge->InputAt(1); |
199 if (if_true->opcode() != IrOpcode::kIfTrue) { | 199 if (if_true->opcode() != IrOpcode::kIfTrue) { |
200 std::swap(if_true, if_false); | 200 std::swap(if_true, if_false); |
201 std::swap(vtrue, vfalse); | 201 std::swap(vtrue, vfalse); |
202 } | 202 } |
203 if (if_true->opcode() == IrOpcode::kIfTrue && | 203 if (if_true->opcode() == IrOpcode::kIfTrue && |
204 if_false->opcode() == IrOpcode::kIfFalse && | 204 if_false->opcode() == IrOpcode::kIfFalse && |
205 if_true->InputAt(0) == if_false->InputAt(0)) { | 205 if_true->InputAt(0) == if_false->InputAt(0)) { |
206 Node* const branch = if_true->InputAt(0); | 206 Node* const branch = if_true->InputAt(0); |
| 207 // Check that the branch is not dead already. |
| 208 if (branch->opcode() != IrOpcode::kBranch) return NoChange(); |
207 Node* const cond = branch->InputAt(0); | 209 Node* const cond = branch->InputAt(0); |
208 if (cond->opcode() == IrOpcode::kFloat32LessThan) { | 210 if (cond->opcode() == IrOpcode::kFloat32LessThan) { |
209 Float32BinopMatcher mcond(cond); | 211 Float32BinopMatcher mcond(cond); |
210 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && | 212 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
211 vfalse->opcode() == IrOpcode::kFloat32Sub) { | 213 vfalse->opcode() == IrOpcode::kFloat32Sub) { |
212 Float32BinopMatcher mvfalse(vfalse); | 214 Float32BinopMatcher mvfalse(vfalse); |
213 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { | 215 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
214 // We might now be able to further reduce the {merge} node. | 216 // We might now be able to further reduce the {merge} node. |
215 Revisit(merge); | 217 Revisit(merge); |
216 return Change(node, machine()->Float32Abs(), vtrue); | 218 return Change(node, machine()->Float32Abs(), vtrue); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 node->ReplaceInput(0, a); | 386 node->ReplaceInput(0, a); |
385 node->ReplaceInput(1, b); | 387 node->ReplaceInput(1, b); |
386 node->TrimInputCount(2); | 388 node->TrimInputCount(2); |
387 NodeProperties::ChangeOp(node, op); | 389 NodeProperties::ChangeOp(node, op); |
388 return Changed(node); | 390 return Changed(node); |
389 } | 391 } |
390 | 392 |
391 } // namespace compiler | 393 } // namespace compiler |
392 } // namespace internal | 394 } // namespace internal |
393 } // namespace v8 | 395 } // namespace v8 |
OLD | NEW |