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

Side by Side Diff: test/unittests/compiler/js-typed-lowering-unittest.cc

Issue 1092353002: [strong] Disallow implicit conversions for binary arithmetic operations (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase :( Created 5 years, 8 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/access-builder.h" 5 #include "src/compiler/access-builder.h"
6 #include "src/compiler/js-graph.h" 6 #include "src/compiler/js-graph.h"
7 #include "src/compiler/js-operator.h" 7 #include "src/compiler/js-operator.h"
8 #include "src/compiler/js-typed-lowering.h" 8 #include "src/compiler/js-typed-lowering.h"
9 #include "src/compiler/machine-operator.h" 9 #include "src/compiler/machine-operator.h"
10 #include "src/compiler/node-properties.h" 10 #include "src/compiler/node-properties.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 107
108 108
109 // ----------------------------------------------------------------------------- 109 // -----------------------------------------------------------------------------
110 // JSUnaryNot 110 // JSUnaryNot
111 111
112 112
113 TEST_F(JSTypedLoweringTest, JSUnaryNotWithBoolean) { 113 TEST_F(JSTypedLoweringTest, JSUnaryNotWithBoolean) {
114 Node* input = Parameter(Type::Boolean(), 0); 114 Node* input = Parameter(Type::Boolean(), 0);
115 Node* context = Parameter(Type::Any(), 1); 115 Node* context = Parameter(Type::Any(), 1);
116 Reduction r = 116 Reduction r =
117 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 117 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
118 input, context));
118 ASSERT_TRUE(r.Changed()); 119 ASSERT_TRUE(r.Changed());
119 EXPECT_THAT(r.replacement(), IsBooleanNot(input)); 120 EXPECT_THAT(r.replacement(), IsBooleanNot(input));
120 } 121 }
121 122
122 123
123 TEST_F(JSTypedLoweringTest, JSUnaryNotWithOrderedNumber) { 124 TEST_F(JSTypedLoweringTest, JSUnaryNotWithOrderedNumber) {
124 Node* input = Parameter(Type::OrderedNumber(), 0); 125 Node* input = Parameter(Type::OrderedNumber(), 0);
125 Node* context = Parameter(Type::Any(), 1); 126 Node* context = Parameter(Type::Any(), 1);
126 Reduction r = 127 Reduction r =
127 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 128 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
129 input, context));
128 ASSERT_TRUE(r.Changed()); 130 ASSERT_TRUE(r.Changed());
129 EXPECT_THAT(r.replacement(), IsNumberEqual(input, IsNumberConstant(0))); 131 EXPECT_THAT(r.replacement(), IsNumberEqual(input, IsNumberConstant(0)));
130 } 132 }
131 133
132 134
133 TEST_F(JSTypedLoweringTest, JSUnaryNotWithFalsish) { 135 TEST_F(JSTypedLoweringTest, JSUnaryNotWithFalsish) {
134 Node* input = Parameter( 136 Node* input = Parameter(
135 Type::Union( 137 Type::Union(
136 Type::MinusZero(), 138 Type::MinusZero(),
137 Type::Union( 139 Type::Union(
138 Type::NaN(), 140 Type::NaN(),
139 Type::Union( 141 Type::Union(
140 Type::Null(), 142 Type::Null(),
141 Type::Union( 143 Type::Union(
142 Type::Undefined(), 144 Type::Undefined(),
143 Type::Union( 145 Type::Union(
144 Type::Undetectable(), 146 Type::Undetectable(),
145 Type::Union( 147 Type::Union(
146 Type::Constant(factory()->false_value(), zone()), 148 Type::Constant(factory()->false_value(), zone()),
147 Type::Range(0.0, 0.0, zone()), zone()), 149 Type::Range(0.0, 0.0, zone()), zone()),
148 zone()), 150 zone()),
149 zone()), 151 zone()),
150 zone()), 152 zone()),
151 zone()), 153 zone()),
152 zone()), 154 zone()),
153 0); 155 0);
154 Node* context = Parameter(Type::Any(), 1); 156 Node* context = Parameter(Type::Any(), 1);
155 Reduction r = 157 Reduction r =
156 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 158 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
159 input, context));
157 ASSERT_TRUE(r.Changed()); 160 ASSERT_TRUE(r.Changed());
158 EXPECT_THAT(r.replacement(), IsTrueConstant()); 161 EXPECT_THAT(r.replacement(), IsTrueConstant());
159 } 162 }
160 163
161 164
162 TEST_F(JSTypedLoweringTest, JSUnaryNotWithTruish) { 165 TEST_F(JSTypedLoweringTest, JSUnaryNotWithTruish) {
163 Node* input = Parameter( 166 Node* input = Parameter(
164 Type::Union( 167 Type::Union(
165 Type::Constant(factory()->true_value(), zone()), 168 Type::Constant(factory()->true_value(), zone()),
166 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()), 169 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()),
167 zone()), 170 zone()),
168 0); 171 0);
169 Node* context = Parameter(Type::Any(), 1); 172 Node* context = Parameter(Type::Any(), 1);
170 Reduction r = 173 Reduction r =
171 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 174 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
175 input, context));
172 ASSERT_TRUE(r.Changed()); 176 ASSERT_TRUE(r.Changed());
173 EXPECT_THAT(r.replacement(), IsFalseConstant()); 177 EXPECT_THAT(r.replacement(), IsFalseConstant());
174 } 178 }
175 179
176 180
177 TEST_F(JSTypedLoweringTest, JSUnaryNotWithNonZeroPlainNumber) { 181 TEST_F(JSTypedLoweringTest, JSUnaryNotWithNonZeroPlainNumber) {
178 Node* input = Parameter(Type::Range(1.0, 42.0, zone()), 0); 182 Node* input = Parameter(Type::Range(1.0, 42.0, zone()), 0);
179 Node* context = Parameter(Type::Any(), 1); 183 Node* context = Parameter(Type::Any(), 1);
180 Reduction r = 184 Reduction r =
181 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 185 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
186 input, context));
182 ASSERT_TRUE(r.Changed()); 187 ASSERT_TRUE(r.Changed());
183 EXPECT_THAT(r.replacement(), IsFalseConstant()); 188 EXPECT_THAT(r.replacement(), IsFalseConstant());
184 } 189 }
185 190
186 191
187 TEST_F(JSTypedLoweringTest, JSUnaryNotWithString) { 192 TEST_F(JSTypedLoweringTest, JSUnaryNotWithString) {
188 Node* input = Parameter(Type::String(), 0); 193 Node* input = Parameter(Type::String(), 0);
189 Node* context = Parameter(Type::Any(), 1); 194 Node* context = Parameter(Type::Any(), 1);
190 Reduction r = 195 Reduction r =
191 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 196 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
197 input, context));
192 ASSERT_TRUE(r.Changed()); 198 ASSERT_TRUE(r.Changed());
193 EXPECT_THAT( 199 EXPECT_THAT(
194 r.replacement(), 200 r.replacement(),
195 IsNumberEqual(IsLoadField(AccessBuilder::ForStringLength(zone()), input, 201 IsNumberEqual(IsLoadField(AccessBuilder::ForStringLength(zone()), input,
196 graph()->start(), graph()->start()), 202 graph()->start(), graph()->start()),
197 IsNumberConstant(0.0))); 203 IsNumberConstant(0.0)));
198 } 204 }
199 205
200 206
201 TEST_F(JSTypedLoweringTest, JSUnaryNotWithAny) { 207 TEST_F(JSTypedLoweringTest, JSUnaryNotWithAny) {
202 Node* input = Parameter(Type::Any(), 0); 208 Node* input = Parameter(Type::Any(), 0);
203 Node* context = Parameter(Type::Any(), 1); 209 Node* context = Parameter(Type::Any(), 1);
204 Reduction r = 210 Reduction r =
205 Reduce(graph()->NewNode(javascript()->UnaryNot(), input, context)); 211 Reduce(graph()->NewNode(javascript()->UnaryNot(LanguageMode::SLOPPY),
212 input, context));
206 ASSERT_FALSE(r.Changed()); 213 ASSERT_FALSE(r.Changed());
207 } 214 }
208 215
209 216
210 // ----------------------------------------------------------------------------- 217 // -----------------------------------------------------------------------------
211 // Constant propagation 218 // Constant propagation
212 219
213 220
214 TEST_F(JSTypedLoweringTest, ParameterWithMinusZero) { 221 TEST_F(JSTypedLoweringTest, ParameterWithMinusZero) {
215 { 222 {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 // JSShiftLeft 455 // JSShiftLeft
449 456
450 457
451 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndConstant) { 458 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndConstant) {
452 Node* const lhs = Parameter(Type::Signed32()); 459 Node* const lhs = Parameter(Type::Signed32());
453 Node* const context = UndefinedConstant(); 460 Node* const context = UndefinedConstant();
454 Node* const effect = graph()->start(); 461 Node* const effect = graph()->start();
455 Node* const control = graph()->start(); 462 Node* const control = graph()->start();
456 TRACED_FORRANGE(double, rhs, 0, 31) { 463 TRACED_FORRANGE(double, rhs, 0, 31) {
457 Reduction r = 464 Reduction r =
458 Reduce(graph()->NewNode(javascript()->ShiftLeft(), lhs, 465 Reduce(graph()->NewNode(javascript()->ShiftLeft(LanguageMode::SLOPPY),
459 NumberConstant(rhs), context, effect, control)); 466 lhs, NumberConstant(rhs), context, effect,
467 control));
460 ASSERT_TRUE(r.Changed()); 468 ASSERT_TRUE(r.Changed());
461 EXPECT_THAT(r.replacement(), 469 EXPECT_THAT(r.replacement(),
462 IsWord32Shl(lhs, IsNumberConstant(BitEq(rhs)))); 470 IsWord32Shl(lhs, IsNumberConstant(BitEq(rhs))));
463 } 471 }
464 } 472 }
465 473
466 474
467 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndUnsigned32) { 475 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndUnsigned32) {
468 Node* const lhs = Parameter(Type::Signed32()); 476 Node* const lhs = Parameter(Type::Signed32());
469 Node* const rhs = Parameter(Type::Unsigned32()); 477 Node* const rhs = Parameter(Type::Unsigned32());
470 Node* const context = UndefinedConstant(); 478 Node* const context = UndefinedConstant();
471 Node* const effect = graph()->start(); 479 Node* const effect = graph()->start();
472 Node* const control = graph()->start(); 480 Node* const control = graph()->start();
473 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftLeft(), lhs, rhs, 481 Reduction r = Reduce(graph()->NewNode(javascript()->
474 context, effect, control)); 482 ShiftLeft(LanguageMode::SLOPPY),
483 lhs, rhs, context, effect, control));
475 ASSERT_TRUE(r.Changed()); 484 ASSERT_TRUE(r.Changed());
476 EXPECT_THAT(r.replacement(), 485 EXPECT_THAT(r.replacement(),
477 IsWord32Shl(lhs, IsWord32And(rhs, IsInt32Constant(0x1f)))); 486 IsWord32Shl(lhs, IsWord32And(rhs, IsInt32Constant(0x1f))));
478 } 487 }
479 488
480 489
481 // ----------------------------------------------------------------------------- 490 // -----------------------------------------------------------------------------
482 // JSShiftRight 491 // JSShiftRight
483 492
484 493
485 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndConstant) { 494 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndConstant) {
486 Node* const lhs = Parameter(Type::Signed32()); 495 Node* const lhs = Parameter(Type::Signed32());
487 Node* const context = UndefinedConstant(); 496 Node* const context = UndefinedConstant();
488 Node* const effect = graph()->start(); 497 Node* const effect = graph()->start();
489 Node* const control = graph()->start(); 498 Node* const control = graph()->start();
490 TRACED_FORRANGE(double, rhs, 0, 31) { 499 TRACED_FORRANGE(double, rhs, 0, 31) {
491 Reduction r = 500 Reduction r =
492 Reduce(graph()->NewNode(javascript()->ShiftRight(), lhs, 501 Reduce(graph()->NewNode(javascript()->
502 ShiftRight(LanguageMode::SLOPPY), lhs,
493 NumberConstant(rhs), context, effect, control)); 503 NumberConstant(rhs), context, effect, control));
494 ASSERT_TRUE(r.Changed()); 504 ASSERT_TRUE(r.Changed());
495 EXPECT_THAT(r.replacement(), 505 EXPECT_THAT(r.replacement(),
496 IsWord32Sar(lhs, IsNumberConstant(BitEq(rhs)))); 506 IsWord32Sar(lhs, IsNumberConstant(BitEq(rhs))));
497 } 507 }
498 } 508 }
499 509
500 510
501 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndUnsigned32) { 511 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndUnsigned32) {
502 Node* const lhs = Parameter(Type::Signed32()); 512 Node* const lhs = Parameter(Type::Signed32());
503 Node* const rhs = Parameter(Type::Unsigned32()); 513 Node* const rhs = Parameter(Type::Unsigned32());
504 Node* const context = UndefinedConstant(); 514 Node* const context = UndefinedConstant();
505 Node* const effect = graph()->start(); 515 Node* const effect = graph()->start();
506 Node* const control = graph()->start(); 516 Node* const control = graph()->start();
507 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftRight(), lhs, rhs, 517 Reduction r = Reduce(graph()->NewNode(javascript()->
508 context, effect, control)); 518 ShiftRight(LanguageMode::SLOPPY),
519 lhs, rhs, context, effect, control));
509 ASSERT_TRUE(r.Changed()); 520 ASSERT_TRUE(r.Changed());
510 EXPECT_THAT(r.replacement(), 521 EXPECT_THAT(r.replacement(),
511 IsWord32Sar(lhs, IsWord32And(rhs, IsInt32Constant(0x1f)))); 522 IsWord32Sar(lhs, IsWord32And(rhs, IsInt32Constant(0x1f))));
512 } 523 }
513 524
514 525
515 // ----------------------------------------------------------------------------- 526 // -----------------------------------------------------------------------------
516 // JSShiftRightLogical 527 // JSShiftRightLogical
517 528
518 529
519 TEST_F(JSTypedLoweringTest, JSShiftRightLogicalWithUnsigned32AndConstant) { 530 TEST_F(JSTypedLoweringTest,
531 JSShiftRightLogicalWithUnsigned32AndConstant) {
520 Node* const lhs = Parameter(Type::Unsigned32()); 532 Node* const lhs = Parameter(Type::Unsigned32());
521 Node* const context = UndefinedConstant(); 533 Node* const context = UndefinedConstant();
522 Node* const effect = graph()->start(); 534 Node* const effect = graph()->start();
523 Node* const control = graph()->start(); 535 Node* const control = graph()->start();
524 TRACED_FORRANGE(double, rhs, 0, 31) { 536 TRACED_FORRANGE(double, rhs, 0, 31) {
525 Reduction r = 537 Reduction r =
526 Reduce(graph()->NewNode(javascript()->ShiftRightLogical(), lhs, 538 Reduce(graph()->NewNode(javascript()->
527 NumberConstant(rhs), context, effect, control)); 539 ShiftRightLogical(LanguageMode::SLOPPY),
540 lhs, NumberConstant(rhs), context, effect,
541 control));
528 ASSERT_TRUE(r.Changed()); 542 ASSERT_TRUE(r.Changed());
529 EXPECT_THAT(r.replacement(), 543 EXPECT_THAT(r.replacement(),
530 IsWord32Shr(lhs, IsNumberConstant(BitEq(rhs)))); 544 IsWord32Shr(lhs, IsNumberConstant(BitEq(rhs))));
531 } 545 }
532 } 546 }
533 547
534 548
535 TEST_F(JSTypedLoweringTest, JSShiftRightLogicalWithUnsigned32AndUnsigned32) { 549 TEST_F(JSTypedLoweringTest,
550 JSShiftRightLogicalWithUnsigned32AndUnsigned32) {
536 Node* const lhs = Parameter(Type::Unsigned32()); 551 Node* const lhs = Parameter(Type::Unsigned32());
537 Node* const rhs = Parameter(Type::Unsigned32()); 552 Node* const rhs = Parameter(Type::Unsigned32());
538 Node* const context = UndefinedConstant(); 553 Node* const context = UndefinedConstant();
539 Node* const effect = graph()->start(); 554 Node* const effect = graph()->start();
540 Node* const control = graph()->start(); 555 Node* const control = graph()->start();
541 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftRightLogical(), lhs, 556 Reduction r = Reduce(graph()->NewNode(javascript()->
542 rhs, context, effect, control)); 557 ShiftRightLogical(LanguageMode::SLOPPY),
558 lhs, rhs, context, effect, control));
543 ASSERT_TRUE(r.Changed()); 559 ASSERT_TRUE(r.Changed());
544 EXPECT_THAT(r.replacement(), 560 EXPECT_THAT(r.replacement(),
545 IsWord32Shr(lhs, IsWord32And(rhs, IsInt32Constant(0x1f)))); 561 IsWord32Shr(lhs, IsWord32And(rhs, IsInt32Constant(0x1f))));
546 } 562 }
547 563
548 564
549 // ----------------------------------------------------------------------------- 565 // -----------------------------------------------------------------------------
550 // JSLoadContext 566 // JSLoadContext
551 567
552 568
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 context, EmptyFrameState(), effect, control)); 883 context, EmptyFrameState(), effect, control));
868 884
869 ASSERT_TRUE(r.Changed()); 885 ASSERT_TRUE(r.Changed());
870 EXPECT_THAT(r.replacement(), matches[i]); 886 EXPECT_THAT(r.replacement(), matches[i]);
871 } 887 }
872 } 888 }
873 889
874 } // namespace compiler 890 } // namespace compiler
875 } // namespace internal 891 } // namespace internal
876 } // namespace v8 892 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698