| OLD | NEW |
| 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/verifier.h" | 5 #include "src/compiler/verifier.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <queue> | 9 #include <queue> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 // Boolean -> Boolean | 668 // Boolean -> Boolean |
| 669 CheckValueInputIs(node, 0, Type::Boolean()); | 669 CheckValueInputIs(node, 0, Type::Boolean()); |
| 670 CheckUpperIs(node, Type::Boolean()); | 670 CheckUpperIs(node, Type::Boolean()); |
| 671 break; | 671 break; |
| 672 case IrOpcode::kBooleanToNumber: | 672 case IrOpcode::kBooleanToNumber: |
| 673 // Boolean -> Number | 673 // Boolean -> Number |
| 674 CheckValueInputIs(node, 0, Type::Boolean()); | 674 CheckValueInputIs(node, 0, Type::Boolean()); |
| 675 CheckUpperIs(node, Type::Number()); | 675 CheckUpperIs(node, Type::Number()); |
| 676 break; | 676 break; |
| 677 case IrOpcode::kNumberEqual: | 677 case IrOpcode::kNumberEqual: |
| 678 // (NumberOrUndefined, NumberOrUndefined) -> Boolean | 678 // (Number, Number) -> Boolean |
| 679 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 679 CheckValueInputIs(node, 0, Type::Number()); |
| 680 CheckValueInputIs(node, 1, Type::NumberOrUndefined()); | 680 CheckValueInputIs(node, 1, Type::Number()); |
| 681 CheckUpperIs(node, Type::Boolean()); | 681 CheckUpperIs(node, Type::Boolean()); |
| 682 break; | 682 break; |
| 683 case IrOpcode::kNumberLessThan: | 683 case IrOpcode::kNumberLessThan: |
| 684 case IrOpcode::kNumberLessThanOrEqual: | 684 case IrOpcode::kNumberLessThanOrEqual: |
| 685 // (Number, Number) -> Boolean | 685 // (Number, Number) -> Boolean |
| 686 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 686 CheckValueInputIs(node, 0, Type::Number()); |
| 687 CheckValueInputIs(node, 1, Type::NumberOrUndefined()); | 687 CheckValueInputIs(node, 1, Type::Number()); |
| 688 CheckUpperIs(node, Type::Boolean()); | 688 CheckUpperIs(node, Type::Boolean()); |
| 689 break; | 689 break; |
| 690 case IrOpcode::kSpeculativeNumberAdd: | 690 case IrOpcode::kSpeculativeNumberAdd: |
| 691 case IrOpcode::kSpeculativeNumberSubtract: | 691 case IrOpcode::kSpeculativeNumberSubtract: |
| 692 break; | 692 break; |
| 693 case IrOpcode::kNumberAdd: | 693 case IrOpcode::kNumberAdd: |
| 694 case IrOpcode::kNumberSubtract: | 694 case IrOpcode::kNumberSubtract: |
| 695 case IrOpcode::kNumberMultiply: | 695 case IrOpcode::kNumberMultiply: |
| 696 case IrOpcode::kNumberDivide: | 696 case IrOpcode::kNumberDivide: |
| 697 // (Number, Number) -> Number | 697 // (Number, Number) -> Number |
| 698 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 698 CheckValueInputIs(node, 0, Type::Number()); |
| 699 CheckValueInputIs(node, 1, Type::NumberOrUndefined()); | 699 CheckValueInputIs(node, 1, Type::Number()); |
| 700 // CheckUpperIs(node, Type::Number()); | 700 CheckUpperIs(node, Type::Number()); |
| 701 break; | 701 break; |
| 702 case IrOpcode::kNumberModulus: | 702 case IrOpcode::kNumberModulus: |
| 703 // (Number, Number) -> Number | 703 // (Number, Number) -> Number |
| 704 CheckValueInputIs(node, 0, Type::Number()); | 704 CheckValueInputIs(node, 0, Type::Number()); |
| 705 CheckValueInputIs(node, 1, Type::Number()); | 705 CheckValueInputIs(node, 1, Type::Number()); |
| 706 // TODO(rossberg): activate once we retype after opcode changes. | 706 CheckUpperIs(node, Type::Number()); |
| 707 // CheckUpperIs(node, Type::Number()); | |
| 708 break; | 707 break; |
| 709 case IrOpcode::kNumberBitwiseOr: | 708 case IrOpcode::kNumberBitwiseOr: |
| 710 case IrOpcode::kNumberBitwiseXor: | 709 case IrOpcode::kNumberBitwiseXor: |
| 711 case IrOpcode::kNumberBitwiseAnd: | 710 case IrOpcode::kNumberBitwiseAnd: |
| 712 // (Signed32, Signed32) -> Signed32 | 711 // (Signed32, Signed32) -> Signed32 |
| 713 CheckValueInputIs(node, 0, Type::Signed32()); | 712 CheckValueInputIs(node, 0, Type::Signed32()); |
| 714 CheckValueInputIs(node, 1, Type::Signed32()); | 713 CheckValueInputIs(node, 1, Type::Signed32()); |
| 715 CheckUpperIs(node, Type::Signed32()); | 714 CheckUpperIs(node, Type::Signed32()); |
| 716 break; | 715 break; |
| 717 case IrOpcode::kNumberShiftLeft: | 716 case IrOpcode::kNumberShiftLeft: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 739 CheckUpperIs(node, Type::Unsigned32()); | 738 CheckUpperIs(node, Type::Unsigned32()); |
| 740 break; | 739 break; |
| 741 case IrOpcode::kNumberAtan2: | 740 case IrOpcode::kNumberAtan2: |
| 742 // (Number, Number) -> Number | 741 // (Number, Number) -> Number |
| 743 CheckValueInputIs(node, 0, Type::Number()); | 742 CheckValueInputIs(node, 0, Type::Number()); |
| 744 CheckValueInputIs(node, 1, Type::Number()); | 743 CheckValueInputIs(node, 1, Type::Number()); |
| 745 CheckUpperIs(node, Type::Number()); | 744 CheckUpperIs(node, Type::Number()); |
| 746 break; | 745 break; |
| 747 case IrOpcode::kNumberCeil: | 746 case IrOpcode::kNumberCeil: |
| 748 case IrOpcode::kNumberFloor: | 747 case IrOpcode::kNumberFloor: |
| 748 case IrOpcode::kNumberFround: |
| 749 case IrOpcode::kNumberAtan: | 749 case IrOpcode::kNumberAtan: |
| 750 case IrOpcode::kNumberLog: | 750 case IrOpcode::kNumberLog: |
| 751 case IrOpcode::kNumberLog1p: | 751 case IrOpcode::kNumberLog1p: |
| 752 case IrOpcode::kNumberRound: | 752 case IrOpcode::kNumberRound: |
| 753 case IrOpcode::kNumberSqrt: |
| 753 case IrOpcode::kNumberTrunc: | 754 case IrOpcode::kNumberTrunc: |
| 754 // Number -> Number | 755 // Number -> Number |
| 755 CheckValueInputIs(node, 0, Type::Number()); | 756 CheckValueInputIs(node, 0, Type::Number()); |
| 756 CheckUpperIs(node, Type::Number()); | 757 CheckUpperIs(node, Type::Number()); |
| 757 break; | 758 break; |
| 758 case IrOpcode::kNumberToInt32: | 759 case IrOpcode::kNumberToInt32: |
| 759 // Number -> Signed32 | 760 // Number -> Signed32 |
| 760 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 761 CheckValueInputIs(node, 0, Type::Number()); |
| 761 CheckUpperIs(node, Type::Signed32()); | 762 CheckUpperIs(node, Type::Signed32()); |
| 762 break; | 763 break; |
| 763 case IrOpcode::kNumberToUint32: | 764 case IrOpcode::kNumberToUint32: |
| 764 // Number -> Unsigned32 | 765 // Number -> Unsigned32 |
| 765 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 766 CheckValueInputIs(node, 0, Type::Number()); |
| 766 CheckUpperIs(node, Type::Unsigned32()); | 767 CheckUpperIs(node, Type::Unsigned32()); |
| 767 break; | 768 break; |
| 768 case IrOpcode::kNumberIsHoleNaN: | 769 case IrOpcode::kNumberIsHoleNaN: |
| 769 // Number -> Boolean | 770 // Number -> Boolean |
| 770 CheckValueInputIs(node, 0, Type::Number()); | 771 CheckValueInputIs(node, 0, Type::Number()); |
| 771 CheckUpperIs(node, Type::Boolean()); | 772 CheckUpperIs(node, Type::Boolean()); |
| 772 break; | 773 break; |
| 773 case IrOpcode::kNumberConvertHoleNaN: | 774 case IrOpcode::kNumberConvertHoleNaN: |
| 774 // Number -> Number \/ Undefined | 775 // Number -> Number \/ Undefined |
| 775 CheckValueInputIs(node, 0, Type::Number()); | 776 CheckValueInputIs(node, 0, Type::Number()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 case IrOpcode::kChangeTaggedToUint32: { | 845 case IrOpcode::kChangeTaggedToUint32: { |
| 845 // Unsigned32 /\ Tagged -> Unsigned32 /\ UntaggedInt32 | 846 // Unsigned32 /\ Tagged -> Unsigned32 /\ UntaggedInt32 |
| 846 // TODO(neis): Activate once ChangeRepresentation works in typer. | 847 // TODO(neis): Activate once ChangeRepresentation works in typer. |
| 847 // Type* from = Type::Intersect(Type::Unsigned32(), Type::Tagged()); | 848 // Type* from = Type::Intersect(Type::Unsigned32(), Type::Tagged()); |
| 848 // Type* to =Type::Intersect(Type::Unsigned32(), Type::UntaggedInt32()); | 849 // Type* to =Type::Intersect(Type::Unsigned32(), Type::UntaggedInt32()); |
| 849 // CheckValueInputIs(node, 0, from)); | 850 // CheckValueInputIs(node, 0, from)); |
| 850 // CheckUpperIs(node, to)); | 851 // CheckUpperIs(node, to)); |
| 851 break; | 852 break; |
| 852 } | 853 } |
| 853 case IrOpcode::kChangeTaggedToFloat64: { | 854 case IrOpcode::kChangeTaggedToFloat64: { |
| 854 // Number /\ Tagged -> Number /\ UntaggedFloat64 | 855 // NumberOrUndefined /\ Tagged -> Number /\ UntaggedFloat64 |
| 855 // TODO(neis): Activate once ChangeRepresentation works in typer. | 856 // TODO(neis): Activate once ChangeRepresentation works in typer. |
| 856 // Type* from = Type::Intersect(Type::Number(), Type::Tagged()); | 857 // Type* from = Type::Intersect(Type::Number(), Type::Tagged()); |
| 857 // Type* to = Type::Intersect(Type::Number(), Type::UntaggedFloat64()); | 858 // Type* to = Type::Intersect(Type::Number(), Type::UntaggedFloat64()); |
| 858 // CheckValueInputIs(node, 0, from)); | 859 // CheckValueInputIs(node, 0, from)); |
| 859 // CheckUpperIs(node, to)); | 860 // CheckUpperIs(node, to)); |
| 860 break; | 861 break; |
| 861 } | 862 } |
| 862 case IrOpcode::kTruncateTaggedToFloat64: { | 863 case IrOpcode::kTruncateTaggedToFloat64: { |
| 863 // NumberOrUndefined /\ Tagged -> Number /\ UntaggedFloat64 | 864 // NumberOrUndefined /\ Tagged -> Number /\ UntaggedFloat64 |
| 864 // TODO(neis): Activate once ChangeRepresentation works in typer. | 865 // TODO(neis): Activate once ChangeRepresentation works in typer. |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 case IrOpcode::kStoreBuffer: | 964 case IrOpcode::kStoreBuffer: |
| 964 break; | 965 break; |
| 965 case IrOpcode::kStoreElement: | 966 case IrOpcode::kStoreElement: |
| 966 // (Object, elementtype) -> _|_ | 967 // (Object, elementtype) -> _|_ |
| 967 // TODO(rossberg): activate once machine ops are typed. | 968 // TODO(rossberg): activate once machine ops are typed. |
| 968 // CheckValueInputIs(node, 0, Type::Object()); | 969 // CheckValueInputIs(node, 0, Type::Object()); |
| 969 // CheckValueInputIs(node, 1, ElementAccessOf(node->op()).type)); | 970 // CheckValueInputIs(node, 1, ElementAccessOf(node->op()).type)); |
| 970 CheckNotTyped(node); | 971 CheckNotTyped(node); |
| 971 break; | 972 break; |
| 972 case IrOpcode::kNumberSilenceNaN: | 973 case IrOpcode::kNumberSilenceNaN: |
| 973 CheckValueInputIs(node, 0, Type::NumberOrUndefined()); | 974 CheckValueInputIs(node, 0, Type::Number()); |
| 974 CheckUpperIs(node, Type::Number()); | 975 CheckUpperIs(node, Type::Number()); |
| 975 break; | 976 break; |
| 976 | 977 |
| 977 // Machine operators | 978 // Machine operators |
| 978 // ----------------------- | 979 // ----------------------- |
| 979 case IrOpcode::kLoad: | 980 case IrOpcode::kLoad: |
| 980 case IrOpcode::kStore: | 981 case IrOpcode::kStore: |
| 981 case IrOpcode::kStackSlot: | 982 case IrOpcode::kStackSlot: |
| 982 case IrOpcode::kWord32And: | 983 case IrOpcode::kWord32And: |
| 983 case IrOpcode::kWord32Or: | 984 case IrOpcode::kWord32Or: |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1445 replacement->op()->EffectOutputCount() > 0); | 1446 replacement->op()->EffectOutputCount() > 0); |
| 1446 DCHECK(!NodeProperties::IsFrameStateEdge(edge) || | 1447 DCHECK(!NodeProperties::IsFrameStateEdge(edge) || |
| 1447 replacement->opcode() == IrOpcode::kFrameState); | 1448 replacement->opcode() == IrOpcode::kFrameState); |
| 1448 } | 1449 } |
| 1449 | 1450 |
| 1450 #endif // DEBUG | 1451 #endif // DEBUG |
| 1451 | 1452 |
| 1452 } // namespace compiler | 1453 } // namespace compiler |
| 1453 } // namespace internal | 1454 } // namespace internal |
| 1454 } // namespace v8 | 1455 } // namespace v8 |
| OLD | NEW |