Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: src/compiler/machine-operator-reducer.cc

Issue 846913002: [turbofan] Canonicalize x - K to x + -K. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/machine-operator-reducer.h" 5 #include "src/compiler/machine-operator-reducer.h"
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/base/division-by-constant.h" 8 #include "src/base/division-by-constant.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/compiler/diamond.h" 10 #include "src/compiler/diamond.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 68
69 69
70 Node* MachineOperatorReducer::Int32Add(Node* lhs, Node* rhs) { 70 Node* MachineOperatorReducer::Int32Add(Node* lhs, Node* rhs) {
71 Node* const node = graph()->NewNode(machine()->Int32Add(), lhs, rhs); 71 Node* const node = graph()->NewNode(machine()->Int32Add(), lhs, rhs);
72 Reduction const reduction = ReduceInt32Add(node); 72 Reduction const reduction = ReduceInt32Add(node);
73 return reduction.Changed() ? reduction.replacement() : node; 73 return reduction.Changed() ? reduction.replacement() : node;
74 } 74 }
75 75
76 76
77 Node* MachineOperatorReducer::Int32Sub(Node* lhs, Node* rhs) { 77 Node* MachineOperatorReducer::Int32Sub(Node* lhs, Node* rhs) {
78 return graph()->NewNode(machine()->Int32Sub(), lhs, rhs); 78 Node* const node = graph()->NewNode(machine()->Int32Sub(), lhs, rhs);
79 Reduction const reduction = ReduceInt32Sub(node);
80 return reduction.Changed() ? reduction.replacement() : node;
79 } 81 }
80 82
81 83
82 Node* MachineOperatorReducer::Int32Mul(Node* lhs, Node* rhs) { 84 Node* MachineOperatorReducer::Int32Mul(Node* lhs, Node* rhs) {
83 return graph()->NewNode(machine()->Int32Mul(), lhs, rhs); 85 return graph()->NewNode(machine()->Int32Mul(), lhs, rhs);
84 } 86 }
85 87
86 88
87 Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) { 89 Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) {
88 DCHECK_NE(0, divisor); 90 DCHECK_NE(0, divisor);
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 node->ReplaceInput(0, msub.left().node()); 211 node->ReplaceInput(0, msub.left().node());
210 node->ReplaceInput(1, msub.right().node()); 212 node->ReplaceInput(1, msub.right().node());
211 return Changed(node); 213 return Changed(node);
212 } 214 }
213 // TODO(turbofan): fold HeapConstant, ExternalReference, pointer compares 215 // TODO(turbofan): fold HeapConstant, ExternalReference, pointer compares
214 if (m.LeftEqualsRight()) return ReplaceBool(true); // x == x => true 216 if (m.LeftEqualsRight()) return ReplaceBool(true); // x == x => true
215 break; 217 break;
216 } 218 }
217 case IrOpcode::kInt32Add: 219 case IrOpcode::kInt32Add:
218 return ReduceInt32Add(node); 220 return ReduceInt32Add(node);
219 case IrOpcode::kInt32Sub: { 221 case IrOpcode::kInt32Sub:
220 Int32BinopMatcher m(node); 222 return ReduceInt32Sub(node);
221 if (m.right().Is(0)) return Replace(m.left().node()); // x - 0 => x
222 if (m.IsFoldable()) { // K - K => K
223 return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) -
224 static_cast<uint32_t>(m.right().Value()));
225 }
226 if (m.LeftEqualsRight()) return ReplaceInt32(0); // x - x => 0
227 break;
228 }
229 case IrOpcode::kInt32Mul: { 223 case IrOpcode::kInt32Mul: {
230 Int32BinopMatcher m(node); 224 Int32BinopMatcher m(node);
231 if (m.right().Is(0)) return Replace(m.right().node()); // x * 0 => 0 225 if (m.right().Is(0)) return Replace(m.right().node()); // x * 0 => 0
232 if (m.right().Is(1)) return Replace(m.left().node()); // x * 1 => x 226 if (m.right().Is(1)) return Replace(m.left().node()); // x * 1 => x
233 if (m.IsFoldable()) { // K * K => K 227 if (m.IsFoldable()) { // K * K => K
234 return ReplaceInt32(m.left().Value() * m.right().Value()); 228 return ReplaceInt32(m.left().Value() * m.right().Value());
235 } 229 }
236 if (m.right().Is(-1)) { // x * -1 => 0 - x 230 if (m.right().Is(-1)) { // x * -1 => 0 - x
237 node->set_op(machine()->Int32Sub()); 231 node->set_op(machine()->Int32Sub());
238 node->ReplaceInput(0, Int32Constant(0)); 232 node->ReplaceInput(0, Int32Constant(0));
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 Int32BinopMatcher m(node); 462 Int32BinopMatcher m(node);
469 if (m.right().Is(0)) return Replace(m.left().node()); // x + 0 => x 463 if (m.right().Is(0)) return Replace(m.left().node()); // x + 0 => x
470 if (m.IsFoldable()) { // K + K => K 464 if (m.IsFoldable()) { // K + K => K
471 return ReplaceUint32(bit_cast<uint32_t>(m.left().Value()) + 465 return ReplaceUint32(bit_cast<uint32_t>(m.left().Value()) +
472 bit_cast<uint32_t>(m.right().Value())); 466 bit_cast<uint32_t>(m.right().Value()));
473 } 467 }
474 return NoChange(); 468 return NoChange();
475 } 469 }
476 470
477 471
472 Reduction MachineOperatorReducer::ReduceInt32Sub(Node* node) {
473 DCHECK_EQ(IrOpcode::kInt32Sub, node->opcode());
474 Int32BinopMatcher m(node);
475 if (m.right().Is(0)) return Replace(m.left().node()); // x - 0 => x
476 if (m.IsFoldable()) { // K - K => K
477 return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) -
478 static_cast<uint32_t>(m.right().Value()));
479 }
480 if (m.LeftEqualsRight()) return ReplaceInt32(0); // x - x => 0
481 if (m.right().HasValue()) { // x - K => x + -K
482 node->set_op(machine()->Int32Add());
483 node->ReplaceInput(1, Int32Constant(-m.right().Value()));
484 Reduction const reduction = ReduceInt32Add(node);
485 return reduction.Changed() ? reduction : Changed(node);
486 }
487 return NoChange();
488 }
489
490
478 Reduction MachineOperatorReducer::ReduceInt32Div(Node* node) { 491 Reduction MachineOperatorReducer::ReduceInt32Div(Node* node) {
479 Int32BinopMatcher m(node); 492 Int32BinopMatcher m(node);
480 if (m.left().Is(0)) return Replace(m.left().node()); // 0 / x => 0 493 if (m.left().Is(0)) return Replace(m.left().node()); // 0 / x => 0
481 if (m.right().Is(0)) return Replace(m.right().node()); // x / 0 => 0 494 if (m.right().Is(0)) return Replace(m.right().node()); // x / 0 => 0
482 if (m.right().Is(1)) return Replace(m.left().node()); // x / 1 => x 495 if (m.right().Is(1)) return Replace(m.left().node()); // x / 1 => x
483 if (m.IsFoldable()) { // K / K => K 496 if (m.IsFoldable()) { // K / K => K
484 return ReplaceInt32( 497 return ReplaceInt32(
485 base::bits::SignedDiv32(m.left().Value(), m.right().Value())); 498 base::bits::SignedDiv32(m.left().Value(), m.right().Value()));
486 } 499 }
487 if (m.LeftEqualsRight()) { // x / x => x != 0 500 if (m.LeftEqualsRight()) { // x / x => x != 0
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 MachineOperatorBuilder* MachineOperatorReducer::machine() const { 926 MachineOperatorBuilder* MachineOperatorReducer::machine() const {
914 return jsgraph()->machine(); 927 return jsgraph()->machine();
915 } 928 }
916 929
917 930
918 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } 931 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); }
919 932
920 } // namespace compiler 933 } // namespace compiler
921 } // namespace internal 934 } // namespace internal
922 } // namespace v8 935 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/machine-operator-reducer.h ('k') | test/unittests/compiler/machine-operator-reducer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698