Lines Matching defs:node
12 #include "src/compiler/node-matchers.h"
13 #include "src/compiler/node-properties.h"
14 #include "src/compiler/node.h"
55 if (top.input_index == top.node->InputCount()) {
58 state_[top.node->id()] = State::kVisited;
59 LowerNode(top.node);
62 Node* input = top.node->InputAt(top.input_index++);
126 void Int64Lowering::LowerWord64AtomicBinop(Node* node, const Operator* op) {
127 DCHECK_EQ(5, node->InputCount());
128 LowerMemoryBaseAndIndex(node);
129 Node* value = node->InputAt(2);
130 node->ReplaceInput(2, GetReplacementLow(value));
131 node->InsertInput(zone(), 3, GetReplacementHigh(value));
132 NodeProperties::ChangeOp(node, op);
133 ReplaceNodeWithProjections(node);
136 void Int64Lowering::LowerWord64AtomicNarrowOp(Node* node, const Operator* op) {
137 DefaultLowering(node, true);
138 NodeProperties::ChangeOp(node, op);
139 ReplaceNode(node, node, graph()->NewNode(common()->Int32Constant(0)));
164 void Int64Lowering::LowerLoadOperator(Node* node, MachineRepresentation rep,
167 LowerMemoryBaseAndIndex(node);
168 Node* base = node->InputAt(0);
169 Node* index = node->InputAt(1);
174 if (node->InputCount() > 2) {
175 Node* effect_high = node->InputAt(2);
176 Node* control_high = node->InputAt(3);
181 node->ReplaceInput(2, high_node);
185 node->ReplaceInput(1, index_low);
186 NodeProperties::ChangeOp(node, load_op);
187 ReplaceNode(node, node, high_node);
189 DefaultLowering(node);
193 void Int64Lowering::LowerStoreOperator(Node* node, MachineRepresentation rep,
196 // We change the original store node to store the low word, and create
197 // a new store node to store the high word. The effect and control edges
198 // are copied from the original store to the new store node, the effect
200 LowerMemoryBaseAndIndex(node);
201 Node* base = node->InputAt(0);
202 Node* index = node->InputAt(1);
206 Node* value = node->InputAt(2);
211 if (node->InputCount() > 3) {
212 Node* effect_high = node->InputAt(3);
213 Node* control_high = node->InputAt(4);
217 node->ReplaceInput(3, high_node);
224 node->ReplaceInput(1, index_low);
225 node->ReplaceInput(2, GetReplacementLow(value));
226 NodeProperties::ChangeOp(node, store_op);
227 ReplaceNode(node, node, high_node);
229 DefaultLowering(node, true);
233 void Int64Lowering::LowerNode(Node* node) {
234 switch (node->opcode()) {
236 int64_t value = OpParameter<int64_t>(node->op());
241 ReplaceNode(node, low_node, high_node);
246 LoadRepresentationOf(node->op()).representation();
247 LowerLoadOperator(node, rep, machine()->Load(MachineType::Int32()));
252 LoadRepresentationOf(node->op()).representation();
253 LowerLoadOperator(node, rep,
259 LoadRepresentationOf(node->op()).representation();
260 LowerLoadOperator(node, rep,
265 ObjectAccess access = ObjectAccessOf(node->op());
266 LowerLoadOperator(node, access.machine_type.representation(),
272 ObjectAccess access = ObjectAccessOf(node->op());
273 LowerLoadOperator(node, access.machine_type.representation(),
279 StoreRepresentation store_rep = StoreRepresentationOf(node->op());
281 node, store_rep.representation(),
288 UnalignedStoreRepresentationOf(node->op());
290 node, store_rep,
295 ObjectAccess access = ObjectAccessOf(node->op());
296 LowerStoreOperator(node, access.machine_type.representation(),
302 ObjectAccess access = ObjectAccessOf(node->op());
303 LowerStoreOperator(node, access.machine_type.representation(),
310 // Only exchange the node if the parameter count actually changed.
314 int new_output_count = node->op()->ValueOutputCount() + delta;
315 NodeProperties::ChangeOp(node, common()->Start(new_output_count));
320 DCHECK_EQ(1, node->InputCount());
322 // Only exchange the node if the parameter count actually changed. We do
323 // not even have to do the default lowering because the the start node,
324 // the only input of a parameter node, only changes if the parameter count
327 int old_index = ParameterIndexOf(node->op());
333 NodeProperties::ChangeOp(node, common()->Parameter(new_index));
345 ReplaceNode(node, node, high_node);
351 int input_count = node->InputCount();
352 DefaultLowering(node);
353 if (input_count != node->InputCount()) {
356 NodeProperties::ChangeOp(node, common()->Return(new_return_count));
363 const_cast<CallDescriptor*>(CallDescriptorOf(node->op()));
367 if (DefaultLowering(node) || returns_require_lowering) {
371 node, common()->TailCall(LowerCallDescriptor(call_descriptor)));
376 auto call_descriptor = CallDescriptorOf(node->op());
381 if (DefaultLowering(node) || returns_require_lowering) {
384 node, common()->Call(LowerCallDescriptor(call_descriptor)));
390 ReplaceNodeWithProjections(node);
393 NodeProperties::CollectValueProjections(node, projections.data(),
409 common()->Projection(new_index + 1), node, graph()->start());
419 DCHECK_EQ(2, node->InputCount());
420 Node* left = node->InputAt(0);
421 Node* right = node->InputAt(1);
429 ReplaceNode(node, low_node, high_node);
433 DCHECK_EQ(1, node->InputCount());
434 Node* input = node->InputAt(0);
435 ReplaceNode(node, GetReplacementLow(input), nullptr);
436 node->NullAllInputs();
440 DCHECK_EQ(2, node->InputCount());
442 Node* right = node->InputAt(1);
443 node->ReplaceInput(1, GetReplacementLow(right));
444 node->AppendInput(zone(), GetReplacementHigh(right));
446 Node* left = node->InputAt(0);
447 node->ReplaceInput(0, GetReplacementLow(left));
448 node->InsertInput(zone(), 1, GetReplacementHigh(left));
450 NodeProperties::ChangeOp(node, machine()->Int32PairAdd());
452 ReplaceNodeWithProjections(node);
456 DCHECK_EQ(2, node->InputCount());
458 Node* right = node->InputAt(1);
459 node->ReplaceInput(1, GetReplacementLow(right));
460 node->AppendInput(zone(), GetReplacementHigh(right));
462 Node* left = node->InputAt(0);
463 node->ReplaceInput(0, GetReplacementLow(left));
464 node->InsertInput(zone(), 1, GetReplacementHigh(left));
466 NodeProperties::ChangeOp(node, machine()->Int32PairSub());
468 ReplaceNodeWithProjections(node);
472 DCHECK_EQ(2, node->InputCount());
474 Node* right = node->InputAt(1);
475 node->ReplaceInput(1, GetReplacementLow(right));
476 node->AppendInput(zone(), GetReplacementHigh(right));
478 Node* left = node->InputAt(0);
479 node->ReplaceInput(0, GetReplacementLow(left));
480 node->InsertInput(zone(), 1, GetReplacementHigh(left));
482 NodeProperties::ChangeOp(node, machine()->Int32PairMul());
484 ReplaceNodeWithProjections(node);
488 DCHECK_EQ(2, node->InputCount());
489 Node* left = node->InputAt(0);
490 Node* right = node->InputAt(1);
498 ReplaceNode(node, low_node, high_node);
502 DCHECK_EQ(2, node->InputCount());
503 Node* left = node->InputAt(0);
504 Node* right = node->InputAt(1);
512 ReplaceNode(node, low_node, high_node);
518 DCHECK_EQ(2, node->InputCount());
519 Node* shift = node->InputAt(1);
523 node->ReplaceInput(1, GetReplacementLow(shift));
526 Node* value = node->InputAt(0);
527 node->ReplaceInput(0, GetReplacementLow(value));
528 node->InsertInput(zone(), 1, GetReplacementHigh(value));
530 NodeProperties::ChangeOp(node, machine()->Word32PairShl());
532 ReplaceNodeWithProjections(node);
538 DCHECK_EQ(2, node->InputCount());
539 Node* shift = node->InputAt(1);
543 node->ReplaceInput(1, GetReplacementLow(shift));
546 Node* value = node->InputAt(0);
547 node->ReplaceInput(0, GetReplacementLow(value));
548 node->InsertInput(zone(), 1, GetReplacementHigh(value));
550 NodeProperties::ChangeOp(node, machine()->Word32PairShr());
552 ReplaceNodeWithProjections(node);
558 DCHECK_EQ(2, node->InputCount());
559 Node* shift = node->InputAt(1);
563 node->ReplaceInput(1, GetReplacementLow(shift));
566 Node* value = node->InputAt(0);
567 node->ReplaceInput(0, GetReplacementLow(value));
568 node->InsertInput(zone(), 1, GetReplacementHigh(value));
570 NodeProperties::ChangeOp(node, machine()->Word32PairSar());
572 ReplaceNodeWithProjections(node);
576 DCHECK_EQ(2, node->InputCount());
577 Node* left = node->InputAt(0);
578 Node* right = node->InputAt(1);
591 ReplaceNode(node, replacement, nullptr);
595 LowerComparison(node, machine()->Int32LessThan(),
600 LowerComparison(node, machine()->Int32LessThan(),
605 LowerComparison(node, machine()->Uint32LessThan(),
610 LowerComparison(node, machine()->Uint32LessThan(),
616 DCHECK_EQ(1, node->InputCount());
617 Node* input = node->InputAt(0);
623 node, input,
626 node->NullAllInputs();
630 DCHECK_EQ(1, node->InputCount());
631 Node* input = node->InputAt(0);
635 ReplaceNode(node, input, graph()->NewNode(common()->Int32Constant(0)));
636 node->NullAllInputs();
640 DCHECK_EQ(1, node->InputCount());
641 Node* input = node->InputAt(0);
668 ReplaceNode(node, load, nullptr);
672 DCHECK_EQ(1, node->InputCount());
673 Node* input = node->InputAt(0);
697 ReplaceNode(node, low_node, high_node);
704 DCHECK_EQ(3, node->InputCount());
705 Node* input = node->InputAt(0);
706 Node* shift = HasReplacementLow(node->InputAt(1))
707 ? GetReplacementLow(node->InputAt(1))
708 : node->InputAt(1);
714 ReplaceNode(node, GetReplacementLow(input),
717 ReplaceNode(node, GetReplacementHigh(input),
737 bool is_ror = node->opcode() == IrOpcode::kWord64RorLowerable;
748 ReplaceNode(node, low_node, high_node);
758 bool is_ror = node->opcode() == IrOpcode::kWord64RorLowerable;
790 lt32.Chain(NodeProperties::GetControlInput(node));
820 ReplaceNode(node, low_node, high_node);
825 DCHECK_EQ(2, node->InputCount());
826 Node* input = node->InputAt(0);
831 d.Chain(NodeProperties::GetControlInput(node));
840 ReplaceNode(node, low_node, graph()->NewNode(common()->Int32Constant(0)));
844 DCHECK_EQ(2, node->InputCount());
846 Node* input = node->InputAt(0);
851 d.Chain(NodeProperties::GetControlInput(node));
861 ReplaceNode(node, low_node, graph()->NewNode(common()->Int32Constant(0)));
869 node->op()->mnemonic());
871 DCHECK_EQ(1, node->InputCount());
872 Node* input = node->InputAt(0);
873 // We assume that a Word64Popcnt node only has been created if
876 ReplaceNode(node, graph()->NewNode(
886 MachineRepresentation rep = PhiRepresentationOf(node->op());
890 Node* low_node = GetReplacementLow(node);
891 Node* high_node = GetReplacementHigh(node);
892 for (int i = 0; i < node->op()->ValueInputCount(); i++) {
893 low_node->ReplaceInput(i, GetReplacementLow(node->InputAt(i)));
894 high_node->ReplaceInput(i, GetReplacementHigh(node->InputAt(i)));
897 DefaultLowering(node);
902 MachineRepresentation rep = LoopExitValueRepresentationOf(node->op());
906 GetReplacementLow(node->InputAt(0)), node->InputAt(1));
909 GetReplacementHigh(node->InputAt(0)), node->InputAt(1));
910 ReplaceNode(node, low_node, high_node);
912 DefaultLowering(node);
917 Node* input = node->InputAt(0);
918 ReplaceNode(node,
926 DCHECK_EQ(1, node->InputCount());
927 Node* input = node->InputAt(0);
931 // Sign extend low node to Int32
936 node, input,
939 node->NullAllInputs();
943 DCHECK_EQ(1, node->InputCount());
944 Node* input = node->InputAt(0);
948 // Sign extend low node to Int32
953 node, input,
956 node->NullAllInputs();
960 DCHECK_EQ(4, node->InputCount());
961 AtomicLoadParameters params = AtomicLoadParametersOf(node->op());
962 DefaultLowering(node, true);
965 node, machine()->Word32AtomicPairLoad(params.order()));
966 ReplaceNodeWithProjections(node);
968 NodeProperties::ChangeOp(node, machine()->Word32AtomicLoad(params));
969 ReplaceNode(node, node, graph()->NewNode(common()->Int32Constant(0)));
974 DCHECK_EQ(5, node->InputCount());
975 AtomicStoreParameters params = AtomicStoreParametersOf(node->op());
977 LowerMemoryBaseAndIndex(node);
978 Node* value = node->InputAt(2);
979 node->ReplaceInput(2, GetReplacementLow(value));
980 node->InsertInput(zone(), 3, GetReplacementHigh(value));
982 node, machine()->Word32AtomicPairStore(params.order()));
984 DefaultLowering(node, true);
985 NodeProperties::ChangeOp(node, machine()->Word32AtomicStore(params));
991 MachineType type = AtomicOpType(node->op()); \
993 LowerWord64AtomicBinop(node, machine()->Word32AtomicPair##name()); \
995 LowerWord64AtomicNarrowOp(node, machine()->Word32Atomic##name(type)); \
1007 MachineType type = AtomicOpType(node->op());
1009 LowerMemoryBaseAndIndex(node);
1010 Node* old_value = node->InputAt(2);
1011 Node* new_value = node->InputAt(3);
1012 node->ReplaceInput(2, GetReplacementLow(old_value));
1013 node->ReplaceInput(3, GetReplacementHigh(old_value));
1014 node->InsertInput(zone(), 4, GetReplacementLow(new_value));
1015 node->InsertInput(zone(), 5, GetReplacementHigh(new_value));
1016 NodeProperties::ChangeOp(node,
1018 ReplaceNodeWithProjections(node);
1022 DefaultLowering(node, true);
1023 NodeProperties::ChangeOp(node,
1025 ReplaceNode(node, node, graph()->NewNode(common()->Int32Constant(0)));
1030 DCHECK_EQ(1, node->InputCount());
1031 Node* input = node->InputAt(0);
1032 node->ReplaceInput(0, GetReplacementLow(input));
1033 node->AppendInput(zone(), GetReplacementHigh(input));
1034 NodeProperties::ChangeOp(node, machine()->I64x2SplatI32Pair());
1038 DCHECK_EQ(1, node->InputCount());
1039 Node* input = node->InputAt(0);
1040 int32_t lane = OpParameter<int32_t>(node->op());
1042 node, graph()->NewNode(machine()->I32x4ExtractLane(lane * 2), input),
1047 DCHECK_EQ(2, node->InputCount());
1048 int32_t lane = OpParameter<int32_t>(node->op());
1049 Node* input = node->InputAt(1);
1050 node->ReplaceInput(1, GetReplacementLow(input));
1051 node->AppendInput(zone(), GetReplacementHigh(input));
1052 NodeProperties::ChangeOp(node, machine()->I64x2ReplaceLaneI32Pair(lane));
1056 default: { DefaultLowering(node); }
1060 void Int64Lowering::LowerComparison(Node* node, const Operator* high_word_op,
1062 DCHECK_EQ(2, node->InputCount());
1063 Node* left = node->InputAt(0);
1064 Node* right = node->InputAt(1);
1076 ReplaceNode(node, replacement, nullptr);
1079 bool Int64Lowering::DefaultLowering(Node* node, bool low_word_only) {
1081 for (int i = NodeProperties::PastValueIndex(node) - 1; i >= 0; i--) {
1082 Node* input = node->InputAt(i);
1085 node->ReplaceInput(i, GetReplacementLow(input));
1089 node->InsertInput(zone(), i + 1, GetReplacementHigh(input));
1113 bool Int64Lowering::HasReplacementLow(Node* node) {
1114 return replacements_[node->id()].low != nullptr;
1117 Node* Int64Lowering::GetReplacementLow(Node* node) {
1118 Node* result = replacements_[node->id()].low;
1123 bool Int64Lowering::HasReplacementHigh(Node* node) {
1124 return replacements_[node->id()].high != nullptr;
1127 Node* Int64Lowering::GetReplacementHigh(Node* node) {
1128 Node* result = replacements_[node->id()].high;
1136 // We have to create the replacements for a phi node before we actually
1138 // input nodes do not exist yet, so we use a placeholder node to pass the
1159 void Int64Lowering::ReplaceNodeWithProjections(Node* node) {
1160 DCHECK(node != nullptr);
1162 graph()->NewNode(common()->Projection(0), node, graph()->start());
1164 graph()->NewNode(common()->Projection(1), node, graph()->start());
1165 ReplaceNode(node, low_node, high_node);
1168 void Int64Lowering::LowerMemoryBaseAndIndex(Node* node) {
1169 DCHECK(node != nullptr);
1171 Node* base = node->InputAt(0);
1172 Node* index = node->InputAt(1);
1174 node->ReplaceInput(0, GetReplacementLow(base));
1177 node->ReplaceInput(1, GetReplacementLow(index));