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

Side by Side Diff: src/compiler/simplified-operator.cc

Issue 2202993005: [turbofan] Don't generate unnecessary minus zero checks. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@TurboFan_SignedSmall
Patch Set: Err, DCHECK, meh Created 4 years, 4 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
« no previous file with comments | « src/compiler/simplified-operator.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/simplified-operator.h" 5 #include "src/compiler/simplified-operator.h"
6 6
7 #include "src/base/lazy-instance.h" 7 #include "src/base/lazy-instance.h"
8 #include "src/compiler/opcodes.h" 8 #include "src/compiler/opcodes.h"
9 #include "src/compiler/operator.h" 9 #include "src/compiler/operator.h"
10 #include "src/types.h" 10 #include "src/types.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 UNREACHABLE(); 201 UNREACHABLE();
202 return os; 202 return os;
203 } 203 }
204 204
205 CheckFloat64HoleMode CheckFloat64HoleModeOf(const Operator* op) { 205 CheckFloat64HoleMode CheckFloat64HoleModeOf(const Operator* op) {
206 DCHECK_EQ(IrOpcode::kCheckFloat64Hole, op->opcode()); 206 DCHECK_EQ(IrOpcode::kCheckFloat64Hole, op->opcode());
207 return OpParameter<CheckFloat64HoleMode>(op); 207 return OpParameter<CheckFloat64HoleMode>(op);
208 } 208 }
209 209
210 CheckForMinusZeroMode CheckMinusZeroModeOf(const Operator* op) { 210 CheckForMinusZeroMode CheckMinusZeroModeOf(const Operator* op) {
211 DCHECK_EQ(IrOpcode::kCheckedInt32Mul, op->opcode()); 211 DCHECK(op->opcode() == IrOpcode::kCheckedInt32Mul ||
212 op->opcode() == IrOpcode::kCheckedFloat64ToInt32 ||
213 op->opcode() == IrOpcode::kCheckedTaggedToInt32);
212 return OpParameter<CheckForMinusZeroMode>(op); 214 return OpParameter<CheckForMinusZeroMode>(op);
213 } 215 }
214 216
215 size_t hash_value(CheckForMinusZeroMode mode) { 217 size_t hash_value(CheckForMinusZeroMode mode) {
216 return static_cast<size_t>(mode); 218 return static_cast<size_t>(mode);
217 } 219 }
218 220
219 std::ostream& operator<<(std::ostream& os, CheckForMinusZeroMode mode) { 221 std::ostream& operator<<(std::ostream& os, CheckForMinusZeroMode mode) {
220 switch (mode) { 222 switch (mode) {
221 case CheckForMinusZeroMode::kCheckForMinusZero: 223 case CheckForMinusZeroMode::kCheckForMinusZero:
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 V(CheckString, 1, 1) \ 390 V(CheckString, 1, 1) \
389 V(CheckTaggedPointer, 1, 1) \ 391 V(CheckTaggedPointer, 1, 1) \
390 V(CheckTaggedSigned, 1, 1) \ 392 V(CheckTaggedSigned, 1, 1) \
391 V(CheckedInt32Add, 2, 1) \ 393 V(CheckedInt32Add, 2, 1) \
392 V(CheckedInt32Sub, 2, 1) \ 394 V(CheckedInt32Sub, 2, 1) \
393 V(CheckedInt32Div, 2, 1) \ 395 V(CheckedInt32Div, 2, 1) \
394 V(CheckedInt32Mod, 2, 1) \ 396 V(CheckedInt32Mod, 2, 1) \
395 V(CheckedUint32Div, 2, 1) \ 397 V(CheckedUint32Div, 2, 1) \
396 V(CheckedUint32Mod, 2, 1) \ 398 V(CheckedUint32Mod, 2, 1) \
397 V(CheckedUint32ToInt32, 1, 1) \ 399 V(CheckedUint32ToInt32, 1, 1) \
398 V(CheckedFloat64ToInt32, 1, 1) \
399 V(CheckedTaggedSignedToInt32, 1, 1) \ 400 V(CheckedTaggedSignedToInt32, 1, 1) \
400 V(CheckedTaggedToInt32, 1, 1) \
401 V(CheckedTaggedToFloat64, 1, 1) \ 401 V(CheckedTaggedToFloat64, 1, 1) \
402 V(CheckedTruncateTaggedToWord32, 1, 1) 402 V(CheckedTruncateTaggedToWord32, 1, 1)
403 403
404 struct SimplifiedOperatorGlobalCache final { 404 struct SimplifiedOperatorGlobalCache final {
405 #define PURE(Name, properties, value_input_count, control_input_count) \ 405 #define PURE(Name, properties, value_input_count, control_input_count) \
406 struct Name##Operator final : public Operator { \ 406 struct Name##Operator final : public Operator { \
407 Name##Operator() \ 407 Name##Operator() \
408 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ 408 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
409 value_input_count, 0, control_input_count, 1, 0, 0) {} \ 409 value_input_count, 0, control_input_count, 1, 0, 0) {} \
410 }; \ 410 }; \
(...skipping 19 matching lines...) Expand all
430 : Operator1<CheckForMinusZeroMode>( 430 : Operator1<CheckForMinusZeroMode>(
431 IrOpcode::kCheckedInt32Mul, 431 IrOpcode::kCheckedInt32Mul,
432 Operator::kFoldable | Operator::kNoThrow, "CheckedInt32Mul", 2, 1, 432 Operator::kFoldable | Operator::kNoThrow, "CheckedInt32Mul", 2, 1,
433 1, 1, 1, 0, kMode) {} 433 1, 1, 1, 0, kMode) {}
434 }; 434 };
435 CheckedInt32MulOperator<CheckForMinusZeroMode::kCheckForMinusZero> 435 CheckedInt32MulOperator<CheckForMinusZeroMode::kCheckForMinusZero>
436 kCheckedInt32MulCheckForMinusZeroOperator; 436 kCheckedInt32MulCheckForMinusZeroOperator;
437 CheckedInt32MulOperator<CheckForMinusZeroMode::kDontCheckForMinusZero> 437 CheckedInt32MulOperator<CheckForMinusZeroMode::kDontCheckForMinusZero>
438 kCheckedInt32MulDontCheckForMinusZeroOperator; 438 kCheckedInt32MulDontCheckForMinusZeroOperator;
439 439
440 template <CheckForMinusZeroMode kMode>
441 struct CheckedFloat64ToInt32Operator final
442 : public Operator1<CheckForMinusZeroMode> {
443 CheckedFloat64ToInt32Operator()
444 : Operator1<CheckForMinusZeroMode>(
445 IrOpcode::kCheckedFloat64ToInt32,
446 Operator::kFoldable | Operator::kNoThrow, "CheckedFloat64ToInt32",
447 1, 1, 1, 1, 1, 0, kMode) {}
448 };
449 CheckedFloat64ToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
450 kCheckedFloat64ToInt32CheckForMinusZeroOperator;
451 CheckedFloat64ToInt32Operator<CheckForMinusZeroMode::kDontCheckForMinusZero>
452 kCheckedFloat64ToInt32DontCheckForMinusZeroOperator;
453
454 template <CheckForMinusZeroMode kMode>
455 struct CheckedTaggedToInt32Operator final
456 : public Operator1<CheckForMinusZeroMode> {
457 CheckedTaggedToInt32Operator()
458 : Operator1<CheckForMinusZeroMode>(
459 IrOpcode::kCheckedTaggedToInt32,
460 Operator::kFoldable | Operator::kNoThrow, "CheckedTaggedToInt32",
461 1, 1, 1, 1, 1, 0, kMode) {}
462 };
463 CheckedTaggedToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
464 kCheckedTaggedToInt32CheckForMinusZeroOperator;
465 CheckedTaggedToInt32Operator<CheckForMinusZeroMode::kDontCheckForMinusZero>
466 kCheckedTaggedToInt32DontCheckForMinusZeroOperator;
467
440 template <CheckFloat64HoleMode kMode> 468 template <CheckFloat64HoleMode kMode>
441 struct CheckFloat64HoleNaNOperator final 469 struct CheckFloat64HoleNaNOperator final
442 : public Operator1<CheckFloat64HoleMode> { 470 : public Operator1<CheckFloat64HoleMode> {
443 CheckFloat64HoleNaNOperator() 471 CheckFloat64HoleNaNOperator()
444 : Operator1<CheckFloat64HoleMode>( 472 : Operator1<CheckFloat64HoleMode>(
445 IrOpcode::kCheckFloat64Hole, 473 IrOpcode::kCheckFloat64Hole,
446 Operator::kFoldable | Operator::kNoThrow, "CheckFloat64Hole", 1, 474 Operator::kFoldable | Operator::kNoThrow, "CheckFloat64Hole", 1,
447 1, 1, 1, 1, 0, kMode) {} 475 1, 1, 1, 1, 0, kMode) {}
448 }; 476 };
449 CheckFloat64HoleNaNOperator<CheckFloat64HoleMode::kAllowReturnHole> 477 CheckFloat64HoleNaNOperator<CheckFloat64HoleMode::kAllowReturnHole>
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 switch (mode) { 545 switch (mode) {
518 case CheckForMinusZeroMode::kCheckForMinusZero: 546 case CheckForMinusZeroMode::kCheckForMinusZero:
519 return &cache_.kCheckedInt32MulCheckForMinusZeroOperator; 547 return &cache_.kCheckedInt32MulCheckForMinusZeroOperator;
520 case CheckForMinusZeroMode::kDontCheckForMinusZero: 548 case CheckForMinusZeroMode::kDontCheckForMinusZero:
521 return &cache_.kCheckedInt32MulDontCheckForMinusZeroOperator; 549 return &cache_.kCheckedInt32MulDontCheckForMinusZeroOperator;
522 } 550 }
523 UNREACHABLE(); 551 UNREACHABLE();
524 return nullptr; 552 return nullptr;
525 } 553 }
526 554
555 const Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt32(
556 CheckForMinusZeroMode mode) {
557 switch (mode) {
558 case CheckForMinusZeroMode::kCheckForMinusZero:
559 return &cache_.kCheckedFloat64ToInt32CheckForMinusZeroOperator;
560 case CheckForMinusZeroMode::kDontCheckForMinusZero:
561 return &cache_.kCheckedFloat64ToInt32DontCheckForMinusZeroOperator;
562 }
563 UNREACHABLE();
564 return nullptr;
565 }
566
567 const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt32(
568 CheckForMinusZeroMode mode) {
569 switch (mode) {
570 case CheckForMinusZeroMode::kCheckForMinusZero:
571 return &cache_.kCheckedTaggedToInt32CheckForMinusZeroOperator;
572 case CheckForMinusZeroMode::kDontCheckForMinusZero:
573 return &cache_.kCheckedTaggedToInt32DontCheckForMinusZeroOperator;
574 }
575 UNREACHABLE();
576 return nullptr;
577 }
578
527 const Operator* SimplifiedOperatorBuilder::CheckMaps(int map_input_count) { 579 const Operator* SimplifiedOperatorBuilder::CheckMaps(int map_input_count) {
528 // TODO(bmeurer): Cache the most important versions of this operator. 580 // TODO(bmeurer): Cache the most important versions of this operator.
529 DCHECK_LT(0, map_input_count); 581 DCHECK_LT(0, map_input_count);
530 int const value_input_count = 1 + map_input_count; 582 int const value_input_count = 1 + map_input_count;
531 return new (zone()) Operator1<int>( // -- 583 return new (zone()) Operator1<int>( // --
532 IrOpcode::kCheckMaps, // opcode 584 IrOpcode::kCheckMaps, // opcode
533 Operator::kNoThrow | Operator::kNoWrite, // flags 585 Operator::kNoThrow | Operator::kNoWrite, // flags
534 "CheckMaps", // name 586 "CheckMaps", // name
535 value_input_count, 1, 1, 0, 1, 0, // counts 587 value_input_count, 1, 1, 0, 1, 0, // counts
536 map_input_count); // parameter 588 map_input_count); // parameter
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 Operator::kNoDeopt | Operator::kNoThrow | properties, \ 715 Operator::kNoDeopt | Operator::kNoThrow | properties, \
664 #Name, value_input_count, 1, control_input_count, \ 716 #Name, value_input_count, 1, control_input_count, \
665 output_count, 1, 0, access); \ 717 output_count, 1, 0, access); \
666 } 718 }
667 ACCESS_OP_LIST(ACCESS) 719 ACCESS_OP_LIST(ACCESS)
668 #undef ACCESS 720 #undef ACCESS
669 721
670 } // namespace compiler 722 } // namespace compiler
671 } // namespace internal 723 } // namespace internal
672 } // namespace v8 724 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/simplified-operator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698