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

Side by Side Diff: src/compiler/js-typed-lowering.cc

Issue 1693833002: Remove strong mode support from binary operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix mistake. Created 4 years, 10 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/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/compilation-dependencies.h" 6 #include "src/compilation-dependencies.h"
7 #include "src/compiler/access-builder.h" 7 #include "src/compiler/access-builder.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/js-typed-lowering.h" 9 #include "src/compiler/js-typed-lowering.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 value->ReplaceInput(0, node_); 130 value->ReplaceInput(0, node_);
131 return lowering_->Replace(value); 131 return lowering_->Replace(value);
132 } 132 }
133 return lowering_->Changed(node_); 133 return lowering_->Changed(node_);
134 } 134 }
135 135
136 Reduction ChangeToPureOperator(const Operator* op, Type* type) { 136 Reduction ChangeToPureOperator(const Operator* op, Type* type) {
137 return ChangeToPureOperator(op, false, type); 137 return ChangeToPureOperator(op, false, type);
138 } 138 }
139 139
140 // TODO(turbofan): Strong mode should be killed soonish!
141 bool IsStrong() const {
142 if (node_->opcode() == IrOpcode::kJSLessThan ||
143 node_->opcode() == IrOpcode::kJSLessThanOrEqual ||
144 node_->opcode() == IrOpcode::kJSGreaterThan ||
145 node_->opcode() == IrOpcode::kJSGreaterThanOrEqual) {
146 return is_strong(OpParameter<LanguageMode>(node_));
147 }
148 return is_strong(BinaryOperationParametersOf(node_->op()).language_mode());
149 }
150
151 bool LeftInputIs(Type* t) { return left_type()->Is(t); } 140 bool LeftInputIs(Type* t) { return left_type()->Is(t); }
152 141
153 bool RightInputIs(Type* t) { return right_type()->Is(t); } 142 bool RightInputIs(Type* t) { return right_type()->Is(t); }
154 143
155 bool OneInputIs(Type* t) { return LeftInputIs(t) || RightInputIs(t); } 144 bool OneInputIs(Type* t) { return LeftInputIs(t) || RightInputIs(t); }
156 145
157 bool BothInputsAre(Type* t) { return LeftInputIs(t) && RightInputIs(t); } 146 bool BothInputsAre(Type* t) { return LeftInputIs(t) && RightInputIs(t); }
158 147
159 bool OneInputCannotBe(Type* t) { 148 bool OneInputCannotBe(Type* t) {
160 return !left_type()->Maybe(t) || !right_type()->Maybe(t); 149 return !left_type()->Maybe(t) || !right_type()->Maybe(t);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 358
370 359
371 Reduction JSTypedLowering::ReduceJSAdd(Node* node) { 360 Reduction JSTypedLowering::ReduceJSAdd(Node* node) {
372 if (flags() & kDisableBinaryOpReduction) return NoChange(); 361 if (flags() & kDisableBinaryOpReduction) return NoChange();
373 362
374 JSBinopReduction r(this, node); 363 JSBinopReduction r(this, node);
375 if (r.BothInputsAre(Type::Number())) { 364 if (r.BothInputsAre(Type::Number())) {
376 // JSAdd(x:number, y:number) => NumberAdd(x, y) 365 // JSAdd(x:number, y:number) => NumberAdd(x, y)
377 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); 366 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number());
378 } 367 }
379 if (r.NeitherInputCanBe(Type::StringOrReceiver()) && !r.IsStrong()) { 368 if (r.NeitherInputCanBe(Type::StringOrReceiver())) {
380 // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) 369 // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y))
381 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); 370 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1);
382 r.ConvertInputsToNumber(frame_state); 371 r.ConvertInputsToNumber(frame_state);
383 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); 372 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number());
384 } 373 }
385 if (r.BothInputsAre(Type::String())) { 374 if (r.BothInputsAre(Type::String())) {
386 // JSAdd(x:string, y:string) => CallStub[StringAdd](x, y) 375 // JSAdd(x:string, y:string) => CallStub[StringAdd](x, y)
387 Callable const callable = 376 Callable const callable =
388 CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); 377 CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED);
389 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( 378 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor(
(...skipping 21 matching lines...) Expand all
411 } 400 }
412 return NoChange(); 401 return NoChange();
413 } 402 }
414 403
415 404
416 Reduction JSTypedLowering::ReduceNumberBinop(Node* node, 405 Reduction JSTypedLowering::ReduceNumberBinop(Node* node,
417 const Operator* numberOp) { 406 const Operator* numberOp) {
418 if (flags() & kDisableBinaryOpReduction) return NoChange(); 407 if (flags() & kDisableBinaryOpReduction) return NoChange();
419 408
420 JSBinopReduction r(this, node); 409 JSBinopReduction r(this, node);
421 if (r.IsStrong() || numberOp == simplified()->NumberModulus()) { 410 if (numberOp == simplified()->NumberModulus()) {
422 if (r.BothInputsAre(Type::Number())) { 411 if (r.BothInputsAre(Type::Number())) {
423 return r.ChangeToPureOperator(numberOp, Type::Number()); 412 return r.ChangeToPureOperator(numberOp, Type::Number());
424 } 413 }
425 return NoChange(); 414 return NoChange();
426 } 415 }
427 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); 416 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1);
428 r.ConvertInputsToNumber(frame_state); 417 r.ConvertInputsToNumber(frame_state);
429 return r.ChangeToPureOperator(numberOp, Type::Number()); 418 return r.ChangeToPureOperator(numberOp, Type::Number());
430 } 419 }
431 420
432 421
433 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) { 422 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) {
434 if (flags() & kDisableBinaryOpReduction) return NoChange(); 423 if (flags() & kDisableBinaryOpReduction) return NoChange();
435 424
436 JSBinopReduction r(this, node); 425 JSBinopReduction r(this, node);
437 if (r.IsStrong()) {
438 if (r.BothInputsAre(Type::Number())) {
439 r.ConvertInputsToUI32(kSigned, kSigned);
440 return r.ChangeToPureOperator(intOp, Type::Integral32());
441 }
442 return NoChange();
443 }
444 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); 426 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1);
445 r.ConvertInputsToNumber(frame_state); 427 r.ConvertInputsToNumber(frame_state);
446 r.ConvertInputsToUI32(kSigned, kSigned); 428 r.ConvertInputsToUI32(kSigned, kSigned);
447 return r.ChangeToPureOperator(intOp, Type::Integral32()); 429 return r.ChangeToPureOperator(intOp, Type::Integral32());
448 } 430 }
449 431
450 432
451 Reduction JSTypedLowering::ReduceUI32Shift(Node* node, 433 Reduction JSTypedLowering::ReduceUI32Shift(Node* node,
452 Signedness left_signedness, 434 Signedness left_signedness,
453 const Operator* shift_op) { 435 const Operator* shift_op) {
454 if (flags() & kDisableBinaryOpReduction) return NoChange(); 436 if (flags() & kDisableBinaryOpReduction) return NoChange();
455 437
456 JSBinopReduction r(this, node); 438 JSBinopReduction r(this, node);
457 if (r.IsStrong()) {
458 if (r.BothInputsAre(Type::Number())) {
459 r.ConvertInputsToUI32(left_signedness, kUnsigned);
460 return r.ChangeToPureOperator(shift_op);
461 }
462 return NoChange();
463 }
464 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); 439 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1);
465 r.ConvertInputsToNumber(frame_state); 440 r.ConvertInputsToNumber(frame_state);
466 r.ConvertInputsToUI32(left_signedness, kUnsigned); 441 r.ConvertInputsToUI32(left_signedness, kUnsigned);
467 return r.ChangeToPureOperator(shift_op); 442 return r.ChangeToPureOperator(shift_op);
468 } 443 }
469 444
470 445
471 Reduction JSTypedLowering::ReduceJSComparison(Node* node) { 446 Reduction JSTypedLowering::ReduceJSComparison(Node* node) {
472 if (flags() & kDisableBinaryOpReduction) return NoChange(); 447 if (flags() & kDisableBinaryOpReduction) return NoChange();
473 448
(...skipping 26 matching lines...) Expand all
500 const Operator* less_than; 475 const Operator* less_than;
501 const Operator* less_than_or_equal; 476 const Operator* less_than_or_equal;
502 if (r.BothInputsAre(Type::Unsigned32())) { 477 if (r.BothInputsAre(Type::Unsigned32())) {
503 less_than = machine()->Uint32LessThan(); 478 less_than = machine()->Uint32LessThan();
504 less_than_or_equal = machine()->Uint32LessThanOrEqual(); 479 less_than_or_equal = machine()->Uint32LessThanOrEqual();
505 } else if (r.BothInputsAre(Type::Signed32())) { 480 } else if (r.BothInputsAre(Type::Signed32())) {
506 less_than = machine()->Int32LessThan(); 481 less_than = machine()->Int32LessThan();
507 less_than_or_equal = machine()->Int32LessThanOrEqual(); 482 less_than_or_equal = machine()->Int32LessThanOrEqual();
508 } else { 483 } else {
509 // TODO(turbofan): mixed signed/unsigned int32 comparisons. 484 // TODO(turbofan): mixed signed/unsigned int32 comparisons.
510 if (r.IsStrong() && !r.BothInputsAre(Type::Number())) {
511 return NoChange();
512 }
513 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); 485 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1);
514 r.ConvertInputsToNumber(frame_state); 486 r.ConvertInputsToNumber(frame_state);
515 less_than = simplified()->NumberLessThan(); 487 less_than = simplified()->NumberLessThan();
516 less_than_or_equal = simplified()->NumberLessThanOrEqual(); 488 less_than_or_equal = simplified()->NumberLessThanOrEqual();
517 } 489 }
518 const Operator* comparison; 490 const Operator* comparison;
519 switch (node->opcode()) { 491 switch (node->opcode()) {
520 case IrOpcode::kJSLessThan: 492 case IrOpcode::kJSLessThan:
521 comparison = less_than; 493 comparison = less_than;
522 break; 494 break;
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after
1788 } 1760 }
1789 1761
1790 1762
1791 CompilationDependencies* JSTypedLowering::dependencies() const { 1763 CompilationDependencies* JSTypedLowering::dependencies() const {
1792 return dependencies_; 1764 return dependencies_;
1793 } 1765 }
1794 1766
1795 } // namespace compiler 1767 } // namespace compiler
1796 } // namespace internal 1768 } // namespace internal
1797 } // namespace v8 1769 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698