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

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

Issue 555833002: [turbofan] Add support for overflow add/sub to the MachineOperatorReducer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address nit. Created 6 years, 3 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 | Annotate | Revision Log
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/compiler/generic-node-inl.h" 8 #include "src/compiler/generic-node-inl.h"
9 #include "src/compiler/graph.h" 9 #include "src/compiler/graph.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 21 matching lines...) Expand all
32 32
33 33
34 Node* MachineOperatorReducer::Int64Constant(int64_t value) { 34 Node* MachineOperatorReducer::Int64Constant(int64_t value) {
35 return graph()->NewNode(common()->Int64Constant(value)); 35 return graph()->NewNode(common()->Int64Constant(value));
36 } 36 }
37 37
38 38
39 // Perform constant folding and strength reduction on machine operators. 39 // Perform constant folding and strength reduction on machine operators.
40 Reduction MachineOperatorReducer::Reduce(Node* node) { 40 Reduction MachineOperatorReducer::Reduce(Node* node) {
41 switch (node->opcode()) { 41 switch (node->opcode()) {
42 case IrOpcode::kProjection:
43 return ReduceProjection(OpParameter<size_t>(node), node->InputAt(0));
42 case IrOpcode::kWord32And: { 44 case IrOpcode::kWord32And: {
43 Int32BinopMatcher m(node); 45 Int32BinopMatcher m(node);
44 if (m.right().Is(0)) return Replace(m.right().node()); // x & 0 => 0 46 if (m.right().Is(0)) return Replace(m.right().node()); // x & 0 => 0
45 if (m.right().Is(-1)) return Replace(m.left().node()); // x & -1 => x 47 if (m.right().Is(-1)) return Replace(m.left().node()); // x & -1 => x
46 if (m.IsFoldable()) { // K & K => K 48 if (m.IsFoldable()) { // K & K => K
47 return ReplaceInt32(m.left().Value() & m.right().Value()); 49 return ReplaceInt32(m.left().Value() & m.right().Value());
48 } 50 }
49 if (m.LeftEqualsRight()) return Replace(m.left().node()); // x & x => x 51 if (m.LeftEqualsRight()) return Replace(m.left().node()); // x & x => x
50 break; 52 break;
51 } 53 }
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 break; 428 break;
427 } 429 }
428 // TODO(turbofan): strength-reduce and fold floating point operations. 430 // TODO(turbofan): strength-reduce and fold floating point operations.
429 default: 431 default:
430 break; 432 break;
431 } 433 }
432 return NoChange(); 434 return NoChange();
433 } 435 }
434 436
435 437
438 Reduction MachineOperatorReducer::ReduceProjection(size_t index, Node* node) {
439 switch (node->opcode()) {
440 case IrOpcode::kInt32AddWithOverflow: {
441 DCHECK(index == 0 || index == 1);
442 Int32BinopMatcher m(node);
443 if (m.IsFoldable()) {
444 int32_t val;
445 bool ovf = base::bits::SignedAddOverflow32(m.left().Value(),
446 m.right().Value(), &val);
447 return ReplaceInt32((index == 0) ? val : ovf);
448 }
449 if (m.right().Is(0)) {
450 return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0);
451 }
452 break;
453 }
454 case IrOpcode::kInt32SubWithOverflow: {
455 DCHECK(index == 0 || index == 1);
456 Int32BinopMatcher m(node);
457 if (m.IsFoldable()) {
458 int32_t val;
459 bool ovf = base::bits::SignedSubOverflow32(m.left().Value(),
460 m.right().Value(), &val);
461 return ReplaceInt32((index == 0) ? val : ovf);
462 }
463 if (m.right().Is(0)) {
464 return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0);
465 }
466 break;
467 }
468 default:
469 break;
470 }
471 return NoChange();
472 }
473
474
436 CommonOperatorBuilder* MachineOperatorReducer::common() const { 475 CommonOperatorBuilder* MachineOperatorReducer::common() const {
437 return jsgraph()->common(); 476 return jsgraph()->common();
438 } 477 }
439 478
440 479
441 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } 480 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); }
442 481
443 } // namespace compiler 482 } // namespace compiler
444 } // namespace internal 483 } // namespace internal
445 } // namespace v8 484 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/machine-operator-reducer.h ('k') | src/compiler/machine-operator-reducer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698