51 switch (node->opcode()) {
52 case IrOpcode::kBooleanNot: {
56 if (
m.IsBooleanNot())
return Replace(
m.InputAt(0));
59 case IrOpcode::kChangeBitToTagged: {
61 if (
m.Is(0))
return Replace(
jsgraph()->FalseConstant());
62 if (
m.Is(1))
return Replace(
jsgraph()->TrueConstant());
63 if (
m.IsChangeTaggedToBit())
return Replace(
m.InputAt(0));
66 case IrOpcode::kChangeTaggedToBit: {
68 if (
m.HasResolvedValue()) {
69 std::optional<bool> maybe_result =
71 if (maybe_result.has_value())
return ReplaceInt32(*maybe_result);
73 if (
m.IsChangeBitToTagged())
return Replace(
m.InputAt(0));
76 case IrOpcode::kChangeFloat64ToTagged: {
79 if (
m.IsChangeTaggedToFloat64())
return Replace(
m.node()->InputAt(0));
82 case IrOpcode::kChangeInt31ToTaggedSigned:
83 case IrOpcode::kChangeInt32ToTagged: {
86 if (
m.IsChangeTaggedSignedToInt32()) {
87 return Replace(
m.InputAt(0));
91 case IrOpcode::kChangeTaggedToFloat64:
92 case IrOpcode::kTruncateTaggedToFloat64: {
95 if (
m.IsChangeFloat64ToTagged() ||
m.IsChangeFloat64ToTaggedPointer()) {
96 return Replace(
m.node()->InputAt(0));
98 if (
m.IsChangeInt31ToTaggedSigned() ||
m.IsChangeInt32ToTagged()) {
99 return Change(node,
machine()->ChangeInt32ToFloat64(),
m.InputAt(0));
101 if (
m.IsChangeUint32ToTagged()) {
102 return Change(node,
machine()->ChangeUint32ToFloat64(),
m.InputAt(0));
106 case IrOpcode::kChangeTaggedSignedToInt32:
107 case IrOpcode::kChangeTaggedToInt32: {
109 if (
m.HasResolvedValue())
111 if (
m.IsChangeFloat64ToTagged() ||
m.IsChangeFloat64ToTaggedPointer()) {
112 return Change(node,
machine()->ChangeFloat64ToInt32(),
m.InputAt(0));
114 if (
m.IsChangeInt31ToTaggedSigned() ||
m.IsChangeInt32ToTagged()) {
115 return Replace(
m.InputAt(0));
119 case IrOpcode::kChangeTaggedToUint32: {
121 if (
m.HasResolvedValue())
123 if (
m.IsChangeFloat64ToTagged() ||
m.IsChangeFloat64ToTaggedPointer()) {
124 return Change(node,
machine()->ChangeFloat64ToUint32(),
m.InputAt(0));
126 if (
m.IsChangeUint32ToTagged())
return Replace(
m.InputAt(0));
129 case IrOpcode::kChangeUint32ToTagged: {
131 if (
m.HasResolvedValue())
135 case IrOpcode::kTruncateTaggedToWord32: {
137 if (
m.HasResolvedValue())
139 if (
m.IsChangeInt31ToTaggedSigned() ||
m.IsChangeInt32ToTagged() ||
140 m.IsChangeUint32ToTagged()) {
141 return Replace(
m.InputAt(0));
143 if (
m.IsChangeFloat64ToTagged() ||
m.IsChangeFloat64ToTaggedPointer()) {
144 return Change(node,
machine()->TruncateFloat64ToWord32(),
m.InputAt(0));
148 case IrOpcode::kCheckedFloat64ToInt32: {
153 ReplaceWithValue(node, value);
154 return Replace(value);
158 case IrOpcode::kCheckedTaggedToArrayIndex:
159 case IrOpcode::kCheckedTaggedToInt32:
160 case IrOpcode::kCheckedTaggedSignedToInt32: {
162 if (
m.IsConvertTaggedHoleToUndefined()) {
163 node->ReplaceInput(0,
m.InputAt(0));
164 return Changed(node);
168 case IrOpcode::kCheckIf: {
170 if (
m.Is(
factory()->true_value())) {
172 return Replace(effect);
176 case IrOpcode::kCheckNumberFitsInt32:
177 case IrOpcode::kCheckNumber: {
179 if (
m.IsConvertTaggedHoleToUndefined()) {
180 node->ReplaceInput(0,
m.InputAt(0));
181 return Changed(node);
185 case IrOpcode::kCheckHeapObject: {
188 ReplaceWithValue(node, input);
189 return Replace(input);
192 if (
m.IsCheckHeapObject()) {
193 ReplaceWithValue(node, input);
194 return Replace(input);
198 case IrOpcode::kCheckSmi: {
201 ReplaceWithValue(node, input);
202 return Replace(input);
205 if (
m.IsCheckSmi()) {
206 ReplaceWithValue(node, input);
207 return Replace(input);
208 }
else if (
m.IsConvertTaggedHoleToUndefined()) {
209 node->ReplaceInput(0,
m.InputAt(0));
210 return Changed(node);
214 case IrOpcode::kObjectIsSmi: {
216 switch (DecideObjectIsSmi(input)) {
226 case IrOpcode::kNumberAbs: {
228 if (
m.HasResolvedValue())
232 case IrOpcode::kReferenceEqual: {
237 case IrOpcode::kCheckedInt32Add: {
241 if (
m.right().HasResolvedValue()) {
242 Node* checked_int32_add =
m.left().node();
243 if (checked_int32_add->
opcode() == IrOpcode::kCheckedInt32Add) {
245 if (n.right().HasResolvedValue() &&
246 (n.right().ResolvedValue() >= 0) ==
247 (
m.right().ResolvedValue() >= 0)) {
250 n.right().ResolvedValue(),
m.right().ResolvedValue(), &val);
252 bool has_no_other_uses =
true;
254 if (!edge.from()->IsDead() && edge.from() != node) {
255 has_no_other_uses =
false;
259 if (has_no_other_uses) {
260 node->ReplaceInput(0, n.left().node());
261 node->ReplaceInput(1,
jsgraph()->Int32Constant(val));
262 RelaxEffectsAndControls(checked_int32_add);
263 checked_int32_add->
Kill();
264 return Changed(node);