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

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

Issue 599383002: [turbofan] add some simplifications in the machine operator reducer (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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 "test/cctest/cctest.h" 5 #include "test/cctest/cctest.h"
6 6
7 #include "src/base/utils/random-number-generator.h" 7 #include "src/base/utils/random-number-generator.h"
8 #include "src/compiler/graph-inl.h" 8 #include "src/compiler/graph-inl.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/machine-operator-reducer.h" 10 #include "src/compiler/machine-operator-reducer.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode()); 157 CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode());
158 CHECK_EQ(left_expect, r.replacement()->InputAt(0)); 158 CHECK_EQ(left_expect, r.replacement()->InputAt(0));
159 CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op())); 159 CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op()));
160 } 160 }
161 161
162 // Check that if the given constant appears on the left, the reducer will 162 // Check that if the given constant appears on the left, the reducer will
163 // swap it to be on the right. 163 // swap it to be on the right.
164 template <typename T> 164 template <typename T>
165 void CheckPutConstantOnRight(volatile T constant) { 165 void CheckPutConstantOnRight(volatile T constant) {
166 // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative)); 166 // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative));
167 Double tmp(static_cast<double>(constant));
168 if (tmp.IsSpecial() && !tmp.IsInfinite()) {
titzer 2014/09/25 09:08:41 I would prefer to have this check in the callers.
vincent.belliard 2014/09/25 09:51:18 Done.
169 // Don't check NaNs as they are reduced more.
170 return;
171 }
167 Node* p = Parameter(); 172 Node* p = Parameter();
168 Node* k = Constant<T>(constant); 173 Node* k = Constant<T>(constant);
169 { 174 {
170 Node* n = graph.NewNode(binop, k, p); 175 Node* n = graph.NewNode(binop, k, p);
171 MachineOperatorReducer reducer(&jsgraph); 176 MachineOperatorReducer reducer(&jsgraph);
172 Reduction reduction = reducer.Reduce(n); 177 Reduction reduction = reducer.Reduce(n);
173 CHECK(!reduction.Changed() || reduction.replacement() == n); 178 CHECK(!reduction.Changed() || reduction.replacement() == n);
174 CHECK_EQ(p, n->InputAt(0)); 179 CHECK_EQ(p, n->InputAt(0));
175 CHECK_EQ(k, n->InputAt(1)); 180 CHECK_EQ(k, n->InputAt(1));
176 } 181 }
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 685
681 static void CheckNans(ReducerTester* R) { 686 static void CheckNans(ReducerTester* R) {
682 Node* x = R->Parameter(); 687 Node* x = R->Parameter();
683 std::vector<double> nans = ValueHelper::nan_vector(); 688 std::vector<double> nans = ValueHelper::nan_vector();
684 for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end(); 689 for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end();
685 ++pl) { 690 ++pl) {
686 for (std::vector<double>::const_iterator pr = nans.begin(); 691 for (std::vector<double>::const_iterator pr = nans.begin();
687 pr != nans.end(); ++pr) { 692 pr != nans.end(); ++pr) {
688 Node* nan1 = R->Constant<double>(*pl); 693 Node* nan1 = R->Constant<double>(*pl);
689 Node* nan2 = R->Constant<double>(*pr); 694 Node* nan2 = R->Constant<double>(*pr);
690 R->CheckBinop(nan1, x, nan1); // x % NaN => NaN 695 R->CheckBinop(nan1, x, nan1); // x op NaN => NaN
691 R->CheckBinop(nan1, nan1, x); // NaN % x => NaN 696 R->CheckBinop(nan1, nan1, x); // NaN op x => NaN
692 R->CheckBinop(nan1, nan2, nan1); // NaN % NaN => NaN 697 R->CheckBinop(nan1, nan2, nan1); // NaN op NaN => NaN
693 } 698 }
694 } 699 }
695 } 700 }
696 701
697 702
698 TEST(ReduceFloat64Add) { 703 TEST(ReduceFloat64Add) {
699 ReducerTester R; 704 ReducerTester R;
700 R.binop = R.machine.Float64Add(); 705 R.binop = R.machine.Float64Add();
701 706
702 FOR_FLOAT64_INPUTS(pl) { 707 FOR_FLOAT64_INPUTS(pl) {
703 FOR_FLOAT64_INPUTS(pr) { 708 FOR_FLOAT64_INPUTS(pr) {
704 double x = *pl, y = *pr; 709 double x = *pl, y = *pr;
705 R.CheckFoldBinop<double>(x + y, x, y); 710 R.CheckFoldBinop<double>(x + y, x, y);
706 } 711 }
707 } 712 }
708 713
709 FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); } 714 FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); }
710 // TODO(titzer): CheckNans(&R); 715
716 CheckNans(&R);
711 } 717 }
712 718
713 719
714 TEST(ReduceFloat64Sub) { 720 TEST(ReduceFloat64Sub) {
715 ReducerTester R; 721 ReducerTester R;
716 R.binop = R.machine.Float64Sub(); 722 R.binop = R.machine.Float64Sub();
717 723
718 FOR_FLOAT64_INPUTS(pl) { 724 FOR_FLOAT64_INPUTS(pl) {
719 FOR_FLOAT64_INPUTS(pr) { 725 FOR_FLOAT64_INPUTS(pr) {
720 double x = *pl, y = *pr; 726 double x = *pl, y = *pr;
721 R.CheckFoldBinop<double>(x - y, x, y); 727 R.CheckFoldBinop<double>(x - y, x, y);
722 } 728 }
723 } 729 }
724 // TODO(titzer): CheckNans(&R); 730
731 Node* zero = R.Constant<double>(0.0);
732 Node* x = R.Parameter();
733
734 R.CheckBinop(x, x, zero); // x - 0.0 => x
735
736 CheckNans(&R);
725 } 737 }
726 738
727 739
728 TEST(ReduceFloat64Mul) { 740 TEST(ReduceFloat64Mul) {
729 ReducerTester R; 741 ReducerTester R;
730 R.binop = R.machine.Float64Mul(); 742 R.binop = R.machine.Float64Mul();
731 743
732 FOR_FLOAT64_INPUTS(pl) { 744 FOR_FLOAT64_INPUTS(pl) {
733 FOR_FLOAT64_INPUTS(pr) { 745 FOR_FLOAT64_INPUTS(pr) {
734 double x = *pl, y = *pr; 746 double x = *pl, y = *pr;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 ReducerTester R; 788 ReducerTester R;
777 R.binop = R.machine.Float64Mod(); 789 R.binop = R.machine.Float64Mod();
778 790
779 FOR_FLOAT64_INPUTS(pl) { 791 FOR_FLOAT64_INPUTS(pl) {
780 FOR_FLOAT64_INPUTS(pr) { 792 FOR_FLOAT64_INPUTS(pr) {
781 double x = *pl, y = *pr; 793 double x = *pl, y = *pr;
782 R.CheckFoldBinop<double>(modulo(x, y), x, y); 794 R.CheckFoldBinop<double>(modulo(x, y), x, y);
783 } 795 }
784 } 796 }
785 797
798 Node* x = R.Parameter();
799 Node* zero = R.Constant<double>(0.0);
800
801 R.CheckFoldBinop<double>(v8::base::OS::nan_value(), x, zero);
802
786 CheckNans(&R); 803 CheckNans(&R);
787 } 804 }
788 805
789 806
790 // TODO(titzer): test MachineOperatorReducer for Word64And 807 // TODO(titzer): test MachineOperatorReducer for Word64And
791 // TODO(titzer): test MachineOperatorReducer for Word64Or 808 // TODO(titzer): test MachineOperatorReducer for Word64Or
792 // TODO(titzer): test MachineOperatorReducer for Word64Xor 809 // TODO(titzer): test MachineOperatorReducer for Word64Xor
793 // TODO(titzer): test MachineOperatorReducer for Word64Shl 810 // TODO(titzer): test MachineOperatorReducer for Word64Shl
794 // TODO(titzer): test MachineOperatorReducer for Word64Shr 811 // TODO(titzer): test MachineOperatorReducer for Word64Shr
795 // TODO(titzer): test MachineOperatorReducer for Word64Sar 812 // TODO(titzer): test MachineOperatorReducer for Word64Sar
796 // TODO(titzer): test MachineOperatorReducer for Word64Equal 813 // TODO(titzer): test MachineOperatorReducer for Word64Equal
797 // TODO(titzer): test MachineOperatorReducer for Word64Not 814 // TODO(titzer): test MachineOperatorReducer for Word64Not
798 // TODO(titzer): test MachineOperatorReducer for Int64Add 815 // TODO(titzer): test MachineOperatorReducer for Int64Add
799 // TODO(titzer): test MachineOperatorReducer for Int64Sub 816 // TODO(titzer): test MachineOperatorReducer for Int64Sub
800 // TODO(titzer): test MachineOperatorReducer for Int64Mul 817 // TODO(titzer): test MachineOperatorReducer for Int64Mul
801 // TODO(titzer): test MachineOperatorReducer for Int64UMul 818 // TODO(titzer): test MachineOperatorReducer for Int64UMul
802 // TODO(titzer): test MachineOperatorReducer for Int64Div 819 // TODO(titzer): test MachineOperatorReducer for Int64Div
803 // TODO(titzer): test MachineOperatorReducer for Int64UDiv 820 // TODO(titzer): test MachineOperatorReducer for Int64UDiv
804 // TODO(titzer): test MachineOperatorReducer for Int64Mod 821 // TODO(titzer): test MachineOperatorReducer for Int64Mod
805 // TODO(titzer): test MachineOperatorReducer for Int64UMod 822 // TODO(titzer): test MachineOperatorReducer for Int64UMod
806 // TODO(titzer): test MachineOperatorReducer for Int64Neg 823 // TODO(titzer): test MachineOperatorReducer for Int64Neg
807 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64 824 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64
808 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32 825 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32
809 // TODO(titzer): test MachineOperatorReducer for Float64Compare 826 // TODO(titzer): test MachineOperatorReducer for Float64Compare
OLDNEW
« src/compiler/machine-operator-reducer.cc ('K') | « src/compiler/machine-operator-reducer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698