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

Side by Side Diff: src/compiler/representation-change.cc

Issue 2366433003: [turbofan] Cleanup: Type only has a semantic dimension. (Closed)
Patch Set: REBASE. Created 4 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
« no previous file with comments | « no previous file | src/compiler/types.h » ('j') | src/compiler/types.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/representation-change.h" 5 #include "src/compiler/representation-change.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 } 204 }
205 case IrOpcode::kFloat64Constant: 205 case IrOpcode::kFloat64Constant:
206 case IrOpcode::kFloat32Constant: 206 case IrOpcode::kFloat32Constant:
207 return TypeError(node, output_rep, output_type, 207 return TypeError(node, output_rep, output_type,
208 MachineRepresentation::kTaggedSigned); 208 MachineRepresentation::kTaggedSigned);
209 default: 209 default:
210 break; 210 break;
211 } 211 }
212 // Select the correct X -> Tagged operator. 212 // Select the correct X -> Tagged operator.
213 const Operator* op; 213 const Operator* op;
214 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 214 if (output_type->Is(Type::None())) {
215 // This is an impossible value; it should not be used at runtime. 215 // This is an impossible value; it should not be used at runtime.
216 // We just provide a dummy value here. 216 // We just provide a dummy value here.
217 return jsgraph()->Constant(0); 217 return jsgraph()->Constant(0);
218 } else if (IsWord(output_rep)) { 218 } else if (IsWord(output_rep)) {
219 if (output_type->Is(Type::Signed31())) { 219 if (output_type->Is(Type::Signed31())) {
220 op = simplified()->ChangeInt31ToTaggedSigned(); 220 op = simplified()->ChangeInt31ToTaggedSigned();
221 } else if (machine()->Is64() && output_type->Is(Type::Signed32())) { 221 } else if (machine()->Is64() && output_type->Is(Type::Signed32())) {
222 op = simplified()->ChangeInt32ToTagged(); 222 op = simplified()->ChangeInt32ToTagged();
223 } else { 223 } else {
224 return TypeError(node, output_rep, output_type, 224 return TypeError(node, output_rep, output_type,
(...skipping 21 matching lines...) Expand all
246 MachineRepresentation::kTaggedPointer); 246 MachineRepresentation::kTaggedPointer);
247 } 247 }
248 case IrOpcode::kFloat64Constant: 248 case IrOpcode::kFloat64Constant:
249 case IrOpcode::kFloat32Constant: 249 case IrOpcode::kFloat32Constant:
250 return TypeError(node, output_rep, output_type, 250 return TypeError(node, output_rep, output_type,
251 MachineRepresentation::kTaggedPointer); 251 MachineRepresentation::kTaggedPointer);
252 default: 252 default:
253 break; 253 break;
254 } 254 }
255 // Select the correct X -> Tagged operator. 255 // Select the correct X -> Tagged operator.
256 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 256 if (output_type->Is(Type::None())) {
257 // This is an impossible value; it should not be used at runtime. 257 // This is an impossible value; it should not be used at runtime.
258 // We just provide a dummy value here. 258 // We just provide a dummy value here.
259 return jsgraph()->TheHoleConstant(); 259 return jsgraph()->TheHoleConstant();
260 } 260 }
261 return TypeError(node, output_rep, output_type, 261 return TypeError(node, output_rep, output_type,
262 MachineRepresentation::kTaggedPointer); 262 MachineRepresentation::kTaggedPointer);
263 } 263 }
264 264
265 Node* RepresentationChanger::GetTaggedRepresentationFor( 265 Node* RepresentationChanger::GetTaggedRepresentationFor(
266 Node* node, MachineRepresentation output_rep, Type* output_type, 266 Node* node, MachineRepresentation output_rep, Type* output_type,
(...skipping 24 matching lines...) Expand all
291 default: 291 default:
292 break; 292 break;
293 } 293 }
294 if (output_rep == MachineRepresentation::kTaggedSigned || 294 if (output_rep == MachineRepresentation::kTaggedSigned ||
295 output_rep == MachineRepresentation::kTaggedPointer) { 295 output_rep == MachineRepresentation::kTaggedPointer) {
296 // this is a no-op. 296 // this is a no-op.
297 return node; 297 return node;
298 } 298 }
299 // Select the correct X -> Tagged operator. 299 // Select the correct X -> Tagged operator.
300 const Operator* op; 300 const Operator* op;
301 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 301 if (output_type->Is(Type::None())) {
302 // This is an impossible value; it should not be used at runtime. 302 // This is an impossible value; it should not be used at runtime.
303 // We just provide a dummy value here. 303 // We just provide a dummy value here.
304 return jsgraph()->TheHoleConstant(); 304 return jsgraph()->TheHoleConstant();
305 } else if (output_rep == MachineRepresentation::kBit) { 305 } else if (output_rep == MachineRepresentation::kBit) {
306 if (output_type->Is(Type::Boolean())) { 306 if (output_type->Is(Type::Boolean())) {
307 op = simplified()->ChangeBitToTagged(); 307 op = simplified()->ChangeBitToTagged();
308 } else { 308 } else {
309 return TypeError(node, output_rep, output_type, 309 return TypeError(node, output_rep, output_type,
310 MachineRepresentation::kTagged); 310 MachineRepresentation::kTagged);
311 } 311 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 int32_t value = OpParameter<int32_t>(node); 373 int32_t value = OpParameter<int32_t>(node);
374 return jsgraph()->Float32Constant(static_cast<float>(value)); 374 return jsgraph()->Float32Constant(static_cast<float>(value));
375 } 375 }
376 case IrOpcode::kFloat32Constant: 376 case IrOpcode::kFloat32Constant:
377 return node; // No change necessary. 377 return node; // No change necessary.
378 default: 378 default:
379 break; 379 break;
380 } 380 }
381 // Select the correct X -> Float32 operator. 381 // Select the correct X -> Float32 operator.
382 const Operator* op = nullptr; 382 const Operator* op = nullptr;
383 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 383 if (output_type->Is(Type::None())) {
384 // This is an impossible value; it should not be used at runtime. 384 // This is an impossible value; it should not be used at runtime.
385 // We just provide a dummy value here. 385 // We just provide a dummy value here.
386 return jsgraph()->Float32Constant(0.0f); 386 return jsgraph()->Float32Constant(0.0f);
387 } else if (IsWord(output_rep)) { 387 } else if (IsWord(output_rep)) {
388 if (output_type->Is(Type::Signed32())) { 388 if (output_type->Is(Type::Signed32())) {
389 // int32 -> float64 -> float32 389 // int32 -> float64 -> float32
390 op = machine()->ChangeInt32ToFloat64(); 390 op = machine()->ChangeInt32ToFloat64();
391 node = jsgraph()->graph()->NewNode(op, node); 391 node = jsgraph()->graph()->NewNode(op, node);
392 op = machine()->TruncateFloat64ToFloat32(); 392 op = machine()->TruncateFloat64ToFloat32();
393 } else if (output_type->Is(Type::Unsigned32()) || 393 } else if (output_type->Is(Type::Unsigned32()) ||
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 case IrOpcode::kFloat64Constant: 443 case IrOpcode::kFloat64Constant:
444 return node; // No change necessary. 444 return node; // No change necessary.
445 case IrOpcode::kFloat32Constant: 445 case IrOpcode::kFloat32Constant:
446 return jsgraph()->Float64Constant(OpParameter<float>(node)); 446 return jsgraph()->Float64Constant(OpParameter<float>(node));
447 default: 447 default:
448 break; 448 break;
449 } 449 }
450 } 450 }
451 // Select the correct X -> Float64 operator. 451 // Select the correct X -> Float64 operator.
452 const Operator* op = nullptr; 452 const Operator* op = nullptr;
453 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 453 if (output_type->Is(Type::None())) {
454 // This is an impossible value; it should not be used at runtime. 454 // This is an impossible value; it should not be used at runtime.
455 // We just provide a dummy value here. 455 // We just provide a dummy value here.
456 return jsgraph()->Float64Constant(0.0); 456 return jsgraph()->Float64Constant(0.0);
457 } else if (IsWord(output_rep)) { 457 } else if (IsWord(output_rep)) {
458 if (output_type->Is(Type::Signed32())) { 458 if (output_type->Is(Type::Signed32())) {
459 op = machine()->ChangeInt32ToFloat64(); 459 op = machine()->ChangeInt32ToFloat64();
460 } else if (output_type->Is(Type::Unsigned32()) || 460 } else if (output_type->Is(Type::Unsigned32()) ||
461 use_info.truncation().IsUsedAsWord32()) { 461 use_info.truncation().IsUsedAsWord32()) {
462 // Either the output is uint32 or the uses only care about the 462 // Either the output is uint32 or the uses only care about the
463 // low 32 bits (so we can pick uint32 safely). 463 // low 32 bits (so we can pick uint32 safely).
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 return MakeTruncatedInt32Constant(fv); 529 return MakeTruncatedInt32Constant(fv);
530 } 530 }
531 break; 531 break;
532 } 532 }
533 default: 533 default:
534 break; 534 break;
535 } 535 }
536 536
537 // Select the correct X -> Word32 operator. 537 // Select the correct X -> Word32 operator.
538 const Operator* op = nullptr; 538 const Operator* op = nullptr;
539 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 539 if (output_type->Is(Type::None())) {
540 // This is an impossible value; it should not be used at runtime. 540 // This is an impossible value; it should not be used at runtime.
541 // We just provide a dummy value here. 541 // We just provide a dummy value here.
542 return jsgraph()->Int32Constant(0); 542 return jsgraph()->Int32Constant(0);
543 } else if (output_rep == MachineRepresentation::kBit) { 543 } else if (output_rep == MachineRepresentation::kBit) {
544 return node; // Sloppy comparison -> word32 544 return node; // Sloppy comparison -> word32
545 } else if (output_rep == MachineRepresentation::kFloat64) { 545 } else if (output_rep == MachineRepresentation::kFloat64) {
546 if (output_type->Is(Type::Unsigned32())) { 546 if (output_type->Is(Type::Unsigned32())) {
547 op = machine()->ChangeFloat64ToUint32(); 547 op = machine()->ChangeFloat64ToUint32();
548 } else if (output_type->Is(Type::Signed32())) { 548 } else if (output_type->Is(Type::Signed32())) {
549 op = machine()->ChangeFloat64ToInt32(); 549 op = machine()->ChangeFloat64ToInt32();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 switch (node->opcode()) { 651 switch (node->opcode()) {
652 case IrOpcode::kHeapConstant: { 652 case IrOpcode::kHeapConstant: {
653 Handle<HeapObject> value = OpParameter<Handle<HeapObject>>(node); 653 Handle<HeapObject> value = OpParameter<Handle<HeapObject>>(node);
654 return jsgraph()->Int32Constant(value->BooleanValue() ? 1 : 0); 654 return jsgraph()->Int32Constant(value->BooleanValue() ? 1 : 0);
655 } 655 }
656 default: 656 default:
657 break; 657 break;
658 } 658 }
659 // Select the correct X -> Bit operator. 659 // Select the correct X -> Bit operator.
660 const Operator* op; 660 const Operator* op;
661 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 661 if (output_type->Is(Type::None())) {
662 // This is an impossible value; it should not be used at runtime. 662 // This is an impossible value; it should not be used at runtime.
663 // We just provide a dummy value here. 663 // We just provide a dummy value here.
664 return jsgraph()->Int32Constant(0); 664 return jsgraph()->Int32Constant(0);
665 } else if (output_rep == MachineRepresentation::kTagged || 665 } else if (output_rep == MachineRepresentation::kTagged ||
666 output_rep == MachineRepresentation::kTaggedPointer) { 666 output_rep == MachineRepresentation::kTaggedPointer) {
667 if (output_type->Is(Type::BooleanOrNullOrUndefined())) { 667 if (output_type->Is(Type::BooleanOrNullOrUndefined())) {
668 // true is the only trueish Oddball. 668 // true is the only trueish Oddball.
669 op = simplified()->ChangeTaggedToBit(); 669 op = simplified()->ChangeTaggedToBit();
670 } else { 670 } else {
671 op = simplified()->TruncateTaggedToBit(); 671 op = simplified()->TruncateTaggedToBit();
(...skipping 18 matching lines...) Expand all
690 jsgraph()->Float64Constant(0.0), node); 690 jsgraph()->Float64Constant(0.0), node);
691 } else { 691 } else {
692 return TypeError(node, output_rep, output_type, 692 return TypeError(node, output_rep, output_type,
693 MachineRepresentation::kBit); 693 MachineRepresentation::kBit);
694 } 694 }
695 return jsgraph()->graph()->NewNode(op, node); 695 return jsgraph()->graph()->NewNode(op, node);
696 } 696 }
697 697
698 Node* RepresentationChanger::GetWord64RepresentationFor( 698 Node* RepresentationChanger::GetWord64RepresentationFor(
699 Node* node, MachineRepresentation output_rep, Type* output_type) { 699 Node* node, MachineRepresentation output_rep, Type* output_type) {
700 if (Type::Semantic(output_type, jsgraph()->zone())->Is(Type::None())) { 700 if (output_type->Is(Type::None())) {
701 // This is an impossible value; it should not be used at runtime. 701 // This is an impossible value; it should not be used at runtime.
702 // We just provide a dummy value here. 702 // We just provide a dummy value here.
703 return jsgraph()->Int64Constant(0); 703 return jsgraph()->Int64Constant(0);
704 } else if (output_rep == MachineRepresentation::kBit) { 704 } else if (output_rep == MachineRepresentation::kBit) {
705 return node; // Sloppy comparison -> word64 705 return node; // Sloppy comparison -> word64
706 } 706 }
707 // Can't really convert Word64 to anything else. Purported to be internal. 707 // Can't really convert Word64 to anything else. Purported to be internal.
708 return TypeError(node, output_rep, output_type, 708 return TypeError(node, output_rep, output_type,
709 MachineRepresentation::kWord64); 709 MachineRepresentation::kWord64);
710 } 710 }
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 } 952 }
953 953
954 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { 954 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) {
955 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), 955 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(),
956 node); 956 node);
957 } 957 }
958 958
959 } // namespace compiler 959 } // namespace compiler
960 } // namespace internal 960 } // namespace internal
961 } // namespace v8 961 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/types.h » ('j') | src/compiler/types.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698