@@ -89,7 +89,7 @@ NodeT* MaglevReducer<BaseT>::AddNewNode(
8989 if constexpr (Node::participate_in_cse (Node::opcode_of<NodeT>) &&
9090 ReducerBaseWithKNA<BaseT>) {
9191 if (v8_flags.maglev_cse ) {
92- return AddNewNodeOrGetEquivalent<NodeT>(inputs,
92+ return AddNewNodeOrGetEquivalent<NodeT>(true , inputs,
9393 std::forward<Args>(args)...);
9494 }
9595 }
@@ -99,6 +99,24 @@ NodeT* MaglevReducer<BaseT>::AddNewNode(
9999 return AttachExtraInfoAndAddToGraph (node);
100100}
101101
102+ template <typename BaseT>
103+ template <typename NodeT, typename ... Args>
104+ NodeT* MaglevReducer<BaseT>::AddNewNodeNoInputConversion(
105+ std::initializer_list<ValueNode*> inputs, Args&&... args) {
106+ static_assert (IsFixedInputNode<NodeT>());
107+ if constexpr (Node::participate_in_cse (Node::opcode_of<NodeT>) &&
108+ ReducerBaseWithKNA<BaseT>) {
109+ if (v8_flags.maglev_cse ) {
110+ return AddNewNodeOrGetEquivalent<NodeT>(false , inputs,
111+ std::forward<Args>(args)...);
112+ }
113+ }
114+ NodeT* node =
115+ NodeBase::New<NodeT>(zone (), inputs.size (), std::forward<Args>(args)...);
116+ SetNodeInputsNoConversion (node, inputs);
117+ return AttachExtraInfoAndAddToGraph (node);
118+ }
119+
102120template <typename BaseT>
103121template <typename NodeT, typename ... Args>
104122NodeT* MaglevReducer<BaseT>::AddUnbufferedNewNode(
@@ -115,7 +133,8 @@ NodeT* MaglevReducer<BaseT>::AddUnbufferedNewNode(
115133template <typename BaseT>
116134template <typename NodeT, typename ... Args>
117135NodeT* MaglevReducer<BaseT>::AddNewNodeOrGetEquivalent(
118- std::initializer_list<ValueNode*> raw_inputs, Args&&... args) {
136+ bool convert_inputs, std::initializer_list<ValueNode*> raw_inputs,
137+ Args&&... args) {
119138 DCHECK (v8_flags.maglev_cse );
120139 static constexpr Opcode op = Node::opcode_of<NodeT>;
121140 static_assert (Node::participate_in_cse (op));
@@ -133,9 +152,16 @@ NodeT* MaglevReducer<BaseT>::AddNewNodeOrGetEquivalent(
133152 int i = 0 ;
134153 constexpr UseReprHintRecording hint = ShouldRecordUseReprHint<NodeT>();
135154 for (ValueNode* raw_input : raw_inputs) {
136- // TODO(marja): Here we might already have the empty type for the
137- // node. Generate a deopt and make callers handle it.
138- inputs[i] = ConvertInputTo<hint>(raw_input, NodeT::kInputTypes [i]);
155+ if (convert_inputs) {
156+ // TODO(marja): Here we might already have the empty type for the
157+ // node. Generate a deopt and make callers handle it.
158+ inputs[i] = ConvertInputTo<hint>(raw_input, NodeT::kInputTypes [i]);
159+ } else {
160+ CHECK (ValueRepresentationIs (
161+ raw_input->properties ().value_representation (),
162+ NodeT::kInputTypes [i]));
163+ inputs[i] = raw_input;
164+ }
139165 i++;
140166 }
141167 if constexpr (IsCommutativeNode (Node::opcode_of<NodeT>)) {
@@ -196,11 +222,7 @@ NodeT* MaglevReducer<BaseT>::AddNewNodeOrGetEquivalent(
196222 }
197223 NodeT* node =
198224 NodeBase::New<NodeT>(zone (), inputs.size (), std::forward<Args>(args)...);
199- int i = 0 ;
200- for (ValueNode* input : inputs) {
201- DCHECK_NOT_NULL (input);
202- node->set_input (i++, input);
203- }
225+ SetNodeInputsNoConversion (node, inputs);
204226 DCHECK_EQ (node->options (), std::tuple{std::forward<Args>(args)...});
205227 uint32_t epoch = Node::needs_epoch_check (op)
206228 ? known_node_aspects ().effect_epoch ()
@@ -268,9 +290,8 @@ ValueNode* MaglevReducer<BaseT>::ConvertInputTo(ValueNode* input,
268290}
269291
270292template <typename BaseT>
271- template <typename NodeT>
272- void MaglevReducer<BaseT>::SetNodeInputs(
273- NodeT* node, std::initializer_list<ValueNode*> inputs) {
293+ template <typename NodeT, typename InputsT>
294+ void MaglevReducer<BaseT>::SetNodeInputs(NodeT* node, InputsT inputs) {
274295 // Nodes with zero input count don't have kInputTypes defined.
275296 if constexpr (NodeT::kInputCount > 0 ) {
276297 constexpr UseReprHintRecording hint = ShouldRecordUseReprHint<NodeT>();
@@ -283,6 +304,23 @@ void MaglevReducer<BaseT>::SetNodeInputs(
283304 }
284305}
285306
307+ template <typename BaseT>
308+ template <typename NodeT, typename InputsT>
309+ void MaglevReducer<BaseT>::SetNodeInputsNoConversion(NodeT* node,
310+ InputsT inputs) {
311+ // Nodes with zero input count don't have kInputTypes defined.
312+ if constexpr (NodeT::kInputCount > 0 ) {
313+ int i = 0 ;
314+ for (ValueNode* input : inputs) {
315+ DCHECK_NOT_NULL (input);
316+ CHECK (ValueRepresentationIs (input->properties ().value_representation (),
317+ NodeT::kInputTypes [i]));
318+ node->set_input (i, input);
319+ i++;
320+ }
321+ }
322+ }
323+
286324template <typename BaseT>
287325template <typename NodeT>
288326NodeT* MaglevReducer<BaseT>::AttachExtraInfoAndAddToGraph(NodeT* node) {
@@ -402,32 +440,40 @@ ValueNode* MaglevReducer<BaseT>::GetTaggedValue(
402440 case ValueRepresentation::kInt32 : {
403441 if (!IsEmptyNodeType (node_info->type ()) &&
404442 NodeTypeIsSmi (node_info->type ())) {
405- return alternative.set_tagged (AddNewNode<UnsafeSmiTagInt32>({value}));
443+ return alternative.set_tagged (
444+ AddNewNodeNoInputConversion<UnsafeSmiTagInt32>({value}));
406445 }
407- return alternative.set_tagged (AddNewNode<Int32ToNumber>({value}));
446+ return alternative.set_tagged (
447+ AddNewNodeNoInputConversion<Int32ToNumber>({value}));
408448 }
409449 case ValueRepresentation::kUint32 : {
410450 if (!IsEmptyNodeType (node_info->type ()) &&
411451 NodeTypeIsSmi (node_info->type ())) {
412- return alternative.set_tagged (AddNewNode<UnsafeSmiTagUint32>({value}));
452+ return alternative.set_tagged (
453+ AddNewNodeNoInputConversion<UnsafeSmiTagUint32>({value}));
413454 }
414- return alternative.set_tagged (AddNewNode<Uint32ToNumber>({value}));
455+ return alternative.set_tagged (
456+ AddNewNodeNoInputConversion<Uint32ToNumber>({value}));
415457 }
416458 case ValueRepresentation::kFloat64 : {
417- return alternative.set_tagged (AddNewNode<Float64ToTagged>(
418- {value}, Float64ToTagged::ConversionMode::kCanonicalizeSmi ));
459+ return alternative.set_tagged (
460+ AddNewNodeNoInputConversion<Float64ToTagged>(
461+ {value}, Float64ToTagged::ConversionMode::kCanonicalizeSmi ));
419462 }
420463 case ValueRepresentation::kHoleyFloat64 : {
421- return alternative.set_tagged (AddNewNode<HoleyFloat64ToTagged>(
422- {value}, HoleyFloat64ToTagged::ConversionMode::kForceHeapNumber ));
464+ return alternative.set_tagged (
465+ AddNewNodeNoInputConversion<HoleyFloat64ToTagged>(
466+ {value}, HoleyFloat64ToTagged::ConversionMode::kForceHeapNumber ));
423467 }
424468
425469 case ValueRepresentation::kIntPtr :
426470 if (!IsEmptyNodeType (node_info->type ()) &&
427471 NodeTypeIsSmi (node_info->type ())) {
428- return alternative.set_tagged (AddNewNode<UnsafeSmiTagIntPtr>({value}));
472+ return alternative.set_tagged (
473+ AddNewNodeNoInputConversion<UnsafeSmiTagIntPtr>({value}));
429474 }
430- return alternative.set_tagged (AddNewNode<IntPtrToNumber>({value}));
475+ return alternative.set_tagged (
476+ AddNewNodeNoInputConversion<IntPtrToNumber>({value}));
431477
432478 case ValueRepresentation::kTagged :
433479 UNREACHABLE ();
0 commit comments