OLD | NEW |
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/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 // the effect uses to the effect input. | 333 // the effect uses to the effect input. |
334 return RemoveRegionNode(node); | 334 return RemoveRegionNode(node); |
335 } | 335 } |
336 | 336 |
337 // Special treatment for checkpoint nodes. | 337 // Special treatment for checkpoint nodes. |
338 if (node->opcode() == IrOpcode::kCheckpoint) { | 338 if (node->opcode() == IrOpcode::kCheckpoint) { |
339 // Unlink the check point; effect uses will be updated to the incoming | 339 // Unlink the check point; effect uses will be updated to the incoming |
340 // effect that is passed. The frame state is preserved for lowering. | 340 // effect that is passed. The frame state is preserved for lowering. |
341 DCHECK_EQ(RegionObservability::kObservable, region_observability_); | 341 DCHECK_EQ(RegionObservability::kObservable, region_observability_); |
342 *frame_state = NodeProperties::GetFrameStateInput(node, 0); | 342 *frame_state = NodeProperties::GetFrameStateInput(node, 0); |
343 node->TrimInputCount(0); | |
344 return; | 343 return; |
345 } | 344 } |
346 | 345 |
347 if (node->opcode() == IrOpcode::kIfSuccess) { | 346 if (node->opcode() == IrOpcode::kIfSuccess) { |
348 // We always schedule IfSuccess with its call, so skip it here. | 347 // We always schedule IfSuccess with its call, so skip it here. |
349 DCHECK_EQ(IrOpcode::kCall, node->InputAt(0)->opcode()); | 348 DCHECK_EQ(IrOpcode::kCall, node->InputAt(0)->opcode()); |
350 // The IfSuccess node should not belong to an exceptional call node | 349 // The IfSuccess node should not belong to an exceptional call node |
351 // because such IfSuccess nodes should only start a basic block (and | 350 // because such IfSuccess nodes should only start a basic block (and |
352 // basic block start nodes are not handled in the ProcessNode method). | 351 // basic block start nodes are not handled in the ProcessNode method). |
353 DCHECK(!NodeProperties::IsExceptionalCall(node->InputAt(0))); | 352 DCHECK(!NodeProperties::IsExceptionalCall(node->InputAt(0))); |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 EffectControlLinearizer::ValueEffectControl | 797 EffectControlLinearizer::ValueEffectControl |
799 EffectControlLinearizer::LowerCheckBounds(Node* node, Node* frame_state, | 798 EffectControlLinearizer::LowerCheckBounds(Node* node, Node* frame_state, |
800 Node* effect, Node* control) { | 799 Node* effect, Node* control) { |
801 Node* index = node->InputAt(0); | 800 Node* index = node->InputAt(0); |
802 Node* limit = node->InputAt(1); | 801 Node* limit = node->InputAt(1); |
803 | 802 |
804 Node* check = graph()->NewNode(machine()->Uint32LessThan(), index, limit); | 803 Node* check = graph()->NewNode(machine()->Uint32LessThan(), index, limit); |
805 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 804 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
806 frame_state, effect, control); | 805 frame_state, effect, control); |
807 | 806 |
808 // Make sure the lowered node does not appear in any use lists. | |
809 node->TrimInputCount(0); | |
810 | |
811 return ValueEffectControl(index, effect, control); | 807 return ValueEffectControl(index, effect, control); |
812 } | 808 } |
813 | 809 |
814 EffectControlLinearizer::ValueEffectControl | 810 EffectControlLinearizer::ValueEffectControl |
815 EffectControlLinearizer::LowerCheckNumber(Node* node, Node* frame_state, | 811 EffectControlLinearizer::LowerCheckNumber(Node* node, Node* frame_state, |
816 Node* effect, Node* control) { | 812 Node* effect, Node* control) { |
817 Node* value = node->InputAt(0); | 813 Node* value = node->InputAt(0); |
818 | 814 |
819 Node* check0 = ObjectIsSmi(value); | 815 Node* check0 = ObjectIsSmi(value); |
820 Node* branch0 = | 816 Node* branch0 = |
(...skipping 10 matching lines...) Expand all Loading... |
831 value, efalse0, if_false0); | 827 value, efalse0, if_false0); |
832 Node* check1 = graph()->NewNode(machine()->WordEqual(), value_map, | 828 Node* check1 = graph()->NewNode(machine()->WordEqual(), value_map, |
833 jsgraph()->HeapNumberMapConstant()); | 829 jsgraph()->HeapNumberMapConstant()); |
834 if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeUnless(), check1, | 830 if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeUnless(), check1, |
835 frame_state, efalse0, if_false0); | 831 frame_state, efalse0, if_false0); |
836 } | 832 } |
837 | 833 |
838 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); | 834 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); |
839 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); | 835 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); |
840 | 836 |
841 // Make sure the lowered node does not appear in any use lists. | |
842 node->TrimInputCount(0); | |
843 | |
844 return ValueEffectControl(value, effect, control); | 837 return ValueEffectControl(value, effect, control); |
845 } | 838 } |
846 | 839 |
847 EffectControlLinearizer::ValueEffectControl | 840 EffectControlLinearizer::ValueEffectControl |
848 EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state, | 841 EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state, |
849 Node* effect, Node* control) { | 842 Node* effect, Node* control) { |
850 Node* value = node->InputAt(0); | 843 Node* value = node->InputAt(0); |
851 | 844 |
852 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), value, | 845 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), value, |
853 frame_state, effect, control); | 846 frame_state, effect, control); |
854 | 847 |
855 // Make sure the lowered node does not appear in any use lists. | |
856 node->TrimInputCount(0); | |
857 | |
858 return ValueEffectControl(value, effect, control); | 848 return ValueEffectControl(value, effect, control); |
859 } | 849 } |
860 | 850 |
861 EffectControlLinearizer::ValueEffectControl | 851 EffectControlLinearizer::ValueEffectControl |
862 EffectControlLinearizer::LowerCheckTaggedPointer(Node* node, Node* frame_state, | 852 EffectControlLinearizer::LowerCheckTaggedPointer(Node* node, Node* frame_state, |
863 Node* effect, Node* control) { | 853 Node* effect, Node* control) { |
864 Node* value = node->InputAt(0); | 854 Node* value = node->InputAt(0); |
865 | 855 |
866 Node* check = ObjectIsSmi(value); | 856 Node* check = ObjectIsSmi(value); |
867 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, | 857 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
868 frame_state, effect, control); | 858 frame_state, effect, control); |
869 | 859 |
870 // Make sure the lowered node does not appear in any use lists. | |
871 node->TrimInputCount(0); | |
872 | |
873 return ValueEffectControl(value, effect, control); | 860 return ValueEffectControl(value, effect, control); |
874 } | 861 } |
875 | 862 |
876 EffectControlLinearizer::ValueEffectControl | 863 EffectControlLinearizer::ValueEffectControl |
877 EffectControlLinearizer::LowerCheckTaggedSigned(Node* node, Node* frame_state, | 864 EffectControlLinearizer::LowerCheckTaggedSigned(Node* node, Node* frame_state, |
878 Node* effect, Node* control) { | 865 Node* effect, Node* control) { |
879 Node* value = node->InputAt(0); | 866 Node* value = node->InputAt(0); |
880 | 867 |
881 Node* check = ObjectIsSmi(value); | 868 Node* check = ObjectIsSmi(value); |
882 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 869 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
883 frame_state, effect, control); | 870 frame_state, effect, control); |
884 | 871 |
885 // Make sure the lowered node does not appear in any use lists. | |
886 node->TrimInputCount(0); | |
887 | |
888 return ValueEffectControl(value, effect, control); | 872 return ValueEffectControl(value, effect, control); |
889 } | 873 } |
890 | 874 |
891 EffectControlLinearizer::ValueEffectControl | 875 EffectControlLinearizer::ValueEffectControl |
892 EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, | 876 EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, |
893 Node* effect, Node* control) { | 877 Node* effect, Node* control) { |
894 Node* lhs = node->InputAt(0); | 878 Node* lhs = node->InputAt(0); |
895 Node* rhs = node->InputAt(1); | 879 Node* rhs = node->InputAt(1); |
896 | 880 |
897 Node* value = | 881 Node* value = |
898 graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); | 882 graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); |
899 | 883 |
900 Node* check = graph()->NewNode(common()->Projection(1), value, control); | 884 Node* check = graph()->NewNode(common()->Projection(1), value, control); |
901 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, | 885 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
902 frame_state, effect, control); | 886 frame_state, effect, control); |
903 | 887 |
904 value = graph()->NewNode(common()->Projection(0), value, control); | 888 value = graph()->NewNode(common()->Projection(0), value, control); |
905 | 889 |
906 // Make sure the lowered node does not appear in any use lists. | |
907 node->TrimInputCount(0); | |
908 | |
909 return ValueEffectControl(value, effect, control); | 890 return ValueEffectControl(value, effect, control); |
910 } | 891 } |
911 | 892 |
912 EffectControlLinearizer::ValueEffectControl | 893 EffectControlLinearizer::ValueEffectControl |
913 EffectControlLinearizer::LowerCheckedInt32Sub(Node* node, Node* frame_state, | 894 EffectControlLinearizer::LowerCheckedInt32Sub(Node* node, Node* frame_state, |
914 Node* effect, Node* control) { | 895 Node* effect, Node* control) { |
915 Node* lhs = node->InputAt(0); | 896 Node* lhs = node->InputAt(0); |
916 Node* rhs = node->InputAt(1); | 897 Node* rhs = node->InputAt(1); |
917 | 898 |
918 Node* value = | 899 Node* value = |
919 graph()->NewNode(machine()->Int32SubWithOverflow(), lhs, rhs, control); | 900 graph()->NewNode(machine()->Int32SubWithOverflow(), lhs, rhs, control); |
920 | 901 |
921 Node* check = graph()->NewNode(common()->Projection(1), value, control); | 902 Node* check = graph()->NewNode(common()->Projection(1), value, control); |
922 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, | 903 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
923 frame_state, effect, control); | 904 frame_state, effect, control); |
924 | 905 |
925 value = graph()->NewNode(common()->Projection(0), value, control); | 906 value = graph()->NewNode(common()->Projection(0), value, control); |
926 | 907 |
927 // Make sure the lowered node does not appear in any use lists. | |
928 node->TrimInputCount(0); | |
929 | |
930 return ValueEffectControl(value, effect, control); | 908 return ValueEffectControl(value, effect, control); |
931 } | 909 } |
932 | 910 |
933 EffectControlLinearizer::ValueEffectControl | 911 EffectControlLinearizer::ValueEffectControl |
934 EffectControlLinearizer::LowerCheckedInt32Div(Node* node, Node* frame_state, | 912 EffectControlLinearizer::LowerCheckedInt32Div(Node* node, Node* frame_state, |
935 Node* effect, Node* control) { | 913 Node* effect, Node* control) { |
936 Node* zero = jsgraph()->Int32Constant(0); | 914 Node* zero = jsgraph()->Int32Constant(0); |
937 Node* minusone = jsgraph()->Int32Constant(-1); | 915 Node* minusone = jsgraph()->Int32Constant(-1); |
938 Node* minint = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::min()); | 916 Node* minint = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::min()); |
939 | 917 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
999 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), vtrue0, | 977 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), vtrue0, |
1000 vfalse0, control); | 978 vfalse0, control); |
1001 | 979 |
1002 // Check if the remainder is non-zero. | 980 // Check if the remainder is non-zero. |
1003 Node* check = | 981 Node* check = |
1004 graph()->NewNode(machine()->Word32Equal(), lhs, | 982 graph()->NewNode(machine()->Word32Equal(), lhs, |
1005 graph()->NewNode(machine()->Int32Mul(), rhs, value)); | 983 graph()->NewNode(machine()->Int32Mul(), rhs, value)); |
1006 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, | 984 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
1007 frame_state, effect, control); | 985 frame_state, effect, control); |
1008 | 986 |
1009 // Make sure the lowered node does not appear in any use lists. | |
1010 node->TrimInputCount(0); | |
1011 | |
1012 return ValueEffectControl(value, effect, control); | 987 return ValueEffectControl(value, effect, control); |
1013 } | 988 } |
1014 | 989 |
1015 EffectControlLinearizer::ValueEffectControl | 990 EffectControlLinearizer::ValueEffectControl |
1016 EffectControlLinearizer::LowerCheckedInt32Mod(Node* node, Node* frame_state, | 991 EffectControlLinearizer::LowerCheckedInt32Mod(Node* node, Node* frame_state, |
1017 Node* effect, Node* control) { | 992 Node* effect, Node* control) { |
1018 Node* zero = jsgraph()->Int32Constant(0); | 993 Node* zero = jsgraph()->Int32Constant(0); |
1019 Node* minusone = jsgraph()->Int32Constant(-1); | 994 Node* minusone = jsgraph()->Int32Constant(-1); |
1020 Node* minint = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::min()); | 995 Node* minint = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::min()); |
1021 | 996 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeIf(), check, | 1050 if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeIf(), check, |
1076 frame_state, efalse0, if_false0); | 1051 frame_state, efalse0, if_false0); |
1077 } | 1052 } |
1078 | 1053 |
1079 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); | 1054 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); |
1080 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); | 1055 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); |
1081 Node* value = | 1056 Node* value = |
1082 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), vtrue0, | 1057 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), vtrue0, |
1083 vfalse0, control); | 1058 vfalse0, control); |
1084 | 1059 |
1085 // Make sure the lowered node does not appear in any use lists. | |
1086 node->TrimInputCount(0); | |
1087 | |
1088 return ValueEffectControl(value, effect, control); | 1060 return ValueEffectControl(value, effect, control); |
1089 } | 1061 } |
1090 | 1062 |
1091 EffectControlLinearizer::ValueEffectControl | 1063 EffectControlLinearizer::ValueEffectControl |
1092 EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, | 1064 EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, |
1093 Node* frame_state, | 1065 Node* frame_state, |
1094 Node* effect, | 1066 Node* effect, |
1095 Node* control) { | 1067 Node* control) { |
1096 Node* value = node->InputAt(0); | 1068 Node* value = node->InputAt(0); |
1097 Node* max_int = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::max()); | 1069 Node* max_int = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::max()); |
1098 Node* is_safe = | 1070 Node* is_safe = |
1099 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); | 1071 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); |
1100 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), is_safe, | 1072 control = effect = graph()->NewNode(common()->DeoptimizeUnless(), is_safe, |
1101 frame_state, effect, control); | 1073 frame_state, effect, control); |
1102 | 1074 |
1103 // Make sure the lowered node does not appear in any use lists. | |
1104 node->TrimInputCount(0); | |
1105 | |
1106 return ValueEffectControl(value, effect, control); | 1075 return ValueEffectControl(value, effect, control); |
1107 } | 1076 } |
1108 | 1077 |
1109 EffectControlLinearizer::ValueEffectControl | 1078 EffectControlLinearizer::ValueEffectControl |
1110 EffectControlLinearizer::BuildCheckedFloat64ToInt32(Node* value, | 1079 EffectControlLinearizer::BuildCheckedFloat64ToInt32(Node* value, |
1111 Node* frame_state, | 1080 Node* frame_state, |
1112 Node* effect, | 1081 Node* effect, |
1113 Node* control) { | 1082 Node* control) { |
1114 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); | 1083 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); |
1115 Node* check_same = graph()->NewNode( | 1084 Node* check_same = graph()->NewNode( |
(...skipping 29 matching lines...) Expand all Loading... |
1145 return ValueEffectControl(value32, effect, merge); | 1114 return ValueEffectControl(value32, effect, merge); |
1146 } | 1115 } |
1147 | 1116 |
1148 EffectControlLinearizer::ValueEffectControl | 1117 EffectControlLinearizer::ValueEffectControl |
1149 EffectControlLinearizer::LowerCheckedFloat64ToInt32(Node* node, | 1118 EffectControlLinearizer::LowerCheckedFloat64ToInt32(Node* node, |
1150 Node* frame_state, | 1119 Node* frame_state, |
1151 Node* effect, | 1120 Node* effect, |
1152 Node* control) { | 1121 Node* control) { |
1153 Node* value = node->InputAt(0); | 1122 Node* value = node->InputAt(0); |
1154 | 1123 |
1155 // Make sure the lowered node does not appear in any use lists. | |
1156 node->TrimInputCount(0); | |
1157 | |
1158 return BuildCheckedFloat64ToInt32(value, frame_state, effect, control); | 1124 return BuildCheckedFloat64ToInt32(value, frame_state, effect, control); |
1159 } | 1125 } |
1160 | 1126 |
1161 EffectControlLinearizer::ValueEffectControl | 1127 EffectControlLinearizer::ValueEffectControl |
1162 EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node, | 1128 EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node, |
1163 Node* frame_state, | 1129 Node* frame_state, |
1164 Node* effect, | 1130 Node* effect, |
1165 Node* control) { | 1131 Node* control) { |
1166 Node* value = node->InputAt(0); | 1132 Node* value = node->InputAt(0); |
1167 | 1133 |
(...skipping 27 matching lines...) Expand all Loading... |
1195 if_false = state.control; | 1161 if_false = state.control; |
1196 efalse = state.effect; | 1162 efalse = state.effect; |
1197 vfalse = state.value; | 1163 vfalse = state.value; |
1198 } | 1164 } |
1199 | 1165 |
1200 control = graph()->NewNode(common()->Merge(2), if_true, if_false); | 1166 control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
1201 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); | 1167 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); |
1202 value = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), | 1168 value = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), |
1203 vtrue, vfalse, control); | 1169 vtrue, vfalse, control); |
1204 | 1170 |
1205 // Make sure the lowered node does not appear in any use lists. | |
1206 node->TrimInputCount(0); | |
1207 | |
1208 return ValueEffectControl(value, effect, control); | 1171 return ValueEffectControl(value, effect, control); |
1209 } | 1172 } |
1210 | 1173 |
1211 EffectControlLinearizer::ValueEffectControl | 1174 EffectControlLinearizer::ValueEffectControl |
1212 EffectControlLinearizer::BuildCheckedHeapNumberOrOddballToFloat64( | 1175 EffectControlLinearizer::BuildCheckedHeapNumberOrOddballToFloat64( |
1213 Node* value, Node* frame_state, Node* effect, Node* control) { | 1176 Node* value, Node* frame_state, Node* effect, Node* control) { |
1214 Node* value_map = effect = graph()->NewNode( | 1177 Node* value_map = effect = graph()->NewNode( |
1215 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); | 1178 simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); |
1216 Node* check_number = graph()->NewNode(machine()->WordEqual(), value_map, | 1179 Node* check_number = graph()->NewNode(machine()->WordEqual(), value_map, |
1217 jsgraph()->HeapNumberMapConstant()); | 1180 jsgraph()->HeapNumberMapConstant()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 value, frame_state, effect, if_false); | 1232 value, frame_state, effect, if_false); |
1270 | 1233 |
1271 Node* merge = | 1234 Node* merge = |
1272 graph()->NewNode(common()->Merge(2), if_true, number_state.control); | 1235 graph()->NewNode(common()->Merge(2), if_true, number_state.control); |
1273 Node* effect_phi = graph()->NewNode(common()->EffectPhi(2), etrue, | 1236 Node* effect_phi = graph()->NewNode(common()->EffectPhi(2), etrue, |
1274 number_state.effect, merge); | 1237 number_state.effect, merge); |
1275 Node* result = | 1238 Node* result = |
1276 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, | 1239 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, |
1277 number_state.value, merge); | 1240 number_state.value, merge); |
1278 | 1241 |
1279 // Make sure the lowered node does not appear in any use lists. | |
1280 node->TrimInputCount(0); | |
1281 | |
1282 return ValueEffectControl(result, effect_phi, merge); | 1242 return ValueEffectControl(result, effect_phi, merge); |
1283 } | 1243 } |
1284 | 1244 |
1285 EffectControlLinearizer::ValueEffectControl | 1245 EffectControlLinearizer::ValueEffectControl |
1286 EffectControlLinearizer::LowerTruncateTaggedToWord32(Node* node, Node* effect, | 1246 EffectControlLinearizer::LowerTruncateTaggedToWord32(Node* node, Node* effect, |
1287 Node* control) { | 1247 Node* control) { |
1288 Node* value = node->InputAt(0); | 1248 Node* value = node->InputAt(0); |
1289 | 1249 |
1290 Node* check = ObjectIsSmi(value); | 1250 Node* check = ObjectIsSmi(value); |
1291 Node* branch = | 1251 Node* branch = |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 // with allow-return-hole, we cannot do anything, so just deoptimize | 1592 // with allow-return-hole, we cannot do anything, so just deoptimize |
1633 // in case of the hole NaN (similar to Crankshaft). | 1593 // in case of the hole NaN (similar to Crankshaft). |
1634 Node* value = node->InputAt(0); | 1594 Node* value = node->InputAt(0); |
1635 Node* check = graph()->NewNode( | 1595 Node* check = graph()->NewNode( |
1636 machine()->Word32Equal(), | 1596 machine()->Word32Equal(), |
1637 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), | 1597 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), |
1638 jsgraph()->Int32Constant(kHoleNanUpper32)); | 1598 jsgraph()->Int32Constant(kHoleNanUpper32)); |
1639 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, | 1599 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
1640 frame_state, effect, control); | 1600 frame_state, effect, control); |
1641 | 1601 |
1642 // Make sure the lowered node does not appear in any use lists. | |
1643 node->TrimInputCount(0); | |
1644 | |
1645 return ValueEffectControl(value, effect, control); | 1602 return ValueEffectControl(value, effect, control); |
1646 } | 1603 } |
1647 | 1604 |
1648 EffectControlLinearizer::ValueEffectControl | 1605 EffectControlLinearizer::ValueEffectControl |
1649 EffectControlLinearizer::LowerCheckTaggedHole(Node* node, Node* frame_state, | 1606 EffectControlLinearizer::LowerCheckTaggedHole(Node* node, Node* frame_state, |
1650 Node* effect, Node* control) { | 1607 Node* effect, Node* control) { |
1651 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); | 1608 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); |
1652 Node* value = node->InputAt(0); | 1609 Node* value = node->InputAt(0); |
1653 Node* check = graph()->NewNode(machine()->WordEqual(), value, | 1610 Node* check = graph()->NewNode(machine()->WordEqual(), value, |
1654 jsgraph()->TheHoleConstant()); | 1611 jsgraph()->TheHoleConstant()); |
1655 switch (mode) { | 1612 switch (mode) { |
1656 case CheckTaggedHoleMode::kConvertHoleToUndefined: | 1613 case CheckTaggedHoleMode::kConvertHoleToUndefined: |
1657 value = graph()->NewNode( | 1614 value = graph()->NewNode( |
1658 common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse), | 1615 common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse), |
1659 check, jsgraph()->UndefinedConstant(), value); | 1616 check, jsgraph()->UndefinedConstant(), value); |
1660 break; | 1617 break; |
1661 case CheckTaggedHoleMode::kNeverReturnHole: | 1618 case CheckTaggedHoleMode::kNeverReturnHole: |
1662 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, | 1619 control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
1663 frame_state, effect, control); | 1620 frame_state, effect, control); |
1664 break; | 1621 break; |
1665 } | 1622 } |
1666 | 1623 |
1667 // Make sure the lowered node does not appear in any use lists. | |
1668 node->TrimInputCount(0); | |
1669 | |
1670 return ValueEffectControl(value, effect, control); | 1624 return ValueEffectControl(value, effect, control); |
1671 } | 1625 } |
1672 | 1626 |
1673 EffectControlLinearizer::ValueEffectControl | 1627 EffectControlLinearizer::ValueEffectControl |
1674 EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value, Node* effect, | 1628 EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value, Node* effect, |
1675 Node* control) { | 1629 Node* control) { |
1676 Node* result = effect = graph()->NewNode( | 1630 Node* result = effect = graph()->NewNode( |
1677 simplified()->Allocate(NOT_TENURED), | 1631 simplified()->Allocate(NOT_TENURED), |
1678 jsgraph()->Int32Constant(HeapNumber::kSize), effect, control); | 1632 jsgraph()->Int32Constant(HeapNumber::kSize), effect, control); |
1679 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 1633 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 1822 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
1869 Operator::kNoThrow); | 1823 Operator::kNoThrow); |
1870 to_number_operator_.set(common()->Call(desc)); | 1824 to_number_operator_.set(common()->Call(desc)); |
1871 } | 1825 } |
1872 return to_number_operator_.get(); | 1826 return to_number_operator_.get(); |
1873 } | 1827 } |
1874 | 1828 |
1875 } // namespace compiler | 1829 } // namespace compiler |
1876 } // namespace internal | 1830 } // namespace internal |
1877 } // namespace v8 | 1831 } // namespace v8 |
OLD | NEW |