blob: 060b1c1842fb663a1a598923297cc5c962e29599 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
Emily Bernierd0a1eb72015-03-24 16:35:39 -04005#include "src/code-stubs.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00006#include "src/compiler/change-lowering.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00007#include "src/compiler/js-graph.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -04008#include "src/compiler/linkage.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/compiler/node-properties-inl.h"
10#include "src/compiler/simplified-operator.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040011#include "test/unittests/compiler/compiler-test-utils.h"
12#include "test/unittests/compiler/graph-unittest.h"
13#include "test/unittests/compiler/node-test-utils.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000014#include "testing/gmock-support.h"
15
16using testing::_;
17using testing::AllOf;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040018using testing::BitEq;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000019using testing::Capture;
20using testing::CaptureEq;
21
22namespace v8 {
23namespace internal {
24namespace compiler {
25
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026class ChangeLoweringTest : public GraphTest {
27 public:
28 ChangeLoweringTest() : simplified_(zone()) {}
Emily Bernierd0a1eb72015-03-24 16:35:39 -040029 ~ChangeLoweringTest() OVERRIDE {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000030
31 virtual MachineType WordRepresentation() const = 0;
32
33 protected:
34 int HeapNumberValueOffset() const {
35 STATIC_ASSERT(HeapNumber::kValueOffset % kApiPointerSize == 0);
36 return (HeapNumber::kValueOffset / kApiPointerSize) * PointerSize() -
37 kHeapObjectTag;
38 }
39 bool Is32() const { return WordRepresentation() == kRepWord32; }
40 int PointerSize() const {
41 switch (WordRepresentation()) {
42 case kRepWord32:
43 return 4;
44 case kRepWord64:
45 return 8;
46 default:
47 break;
48 }
49 UNREACHABLE();
50 return 0;
51 }
52 int SmiMaxValue() const { return -(SmiMinValue() + 1); }
53 int SmiMinValue() const {
54 return static_cast<int>(0xffffffffu << (SmiValueSize() - 1));
55 }
56 int SmiShiftAmount() const { return kSmiTagSize + SmiShiftSize(); }
57 int SmiShiftSize() const {
58 return Is32() ? SmiTagging<4>::SmiShiftSize()
59 : SmiTagging<8>::SmiShiftSize();
60 }
61 int SmiValueSize() const {
62 return Is32() ? SmiTagging<4>::SmiValueSize()
63 : SmiTagging<8>::SmiValueSize();
64 }
65
Ben Murdochb8a8cc12014-11-26 15:28:44 +000066 Reduction Reduce(Node* node) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040067 MachineOperatorBuilder machine(zone(), WordRepresentation());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068 JSOperatorBuilder javascript(zone());
Emily Bernierd0a1eb72015-03-24 16:35:39 -040069 JSGraph jsgraph(graph(), common(), &javascript, &machine);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000070 CompilationInfo info(isolate(), zone());
Emily Bernierd0a1eb72015-03-24 16:35:39 -040071 Linkage linkage(zone(), &info);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072 ChangeLowering reducer(&jsgraph, &linkage);
73 return reducer.Reduce(node);
74 }
75
76 SimplifiedOperatorBuilder* simplified() { return &simplified_; }
77
78 Matcher<Node*> IsAllocateHeapNumber(const Matcher<Node*>& effect_matcher,
79 const Matcher<Node*>& control_matcher) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040080 return IsCall(_, IsHeapConstant(Unique<HeapObject>::CreateImmovable(
81 AllocateHeapNumberStub(isolate()).GetCode())),
82 IsNumberConstant(BitEq(0.0)), effect_matcher,
83 control_matcher);
84 }
85 Matcher<Node*> IsLoadHeapNumber(const Matcher<Node*>& value_matcher,
86 const Matcher<Node*>& control_matcher) {
87 return IsLoad(kMachFloat64, value_matcher,
88 IsIntPtrConstant(HeapNumberValueOffset()), graph()->start(),
89 control_matcher);
90 }
91 Matcher<Node*> IsIntPtrConstant(int value) {
92 return Is32() ? IsInt32Constant(value) : IsInt64Constant(value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000093 }
94 Matcher<Node*> IsWordEqual(const Matcher<Node*>& lhs_matcher,
95 const Matcher<Node*>& rhs_matcher) {
96 return Is32() ? IsWord32Equal(lhs_matcher, rhs_matcher)
97 : IsWord64Equal(lhs_matcher, rhs_matcher);
98 }
99
100 private:
101 SimplifiedOperatorBuilder simplified_;
102};
103
104
105// -----------------------------------------------------------------------------
106// Common.
107
108
109class ChangeLoweringCommonTest
110 : public ChangeLoweringTest,
111 public ::testing::WithParamInterface<MachineType> {
112 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400113 ~ChangeLoweringCommonTest() OVERRIDE {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000114
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400115 MachineType WordRepresentation() const FINAL { return GetParam(); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116};
117
118
119TARGET_TEST_P(ChangeLoweringCommonTest, ChangeBitToBool) {
120 Node* val = Parameter(0);
121 Node* node = graph()->NewNode(simplified()->ChangeBitToBool(), val);
122 Reduction reduction = Reduce(node);
123 ASSERT_TRUE(reduction.Changed());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400124 EXPECT_THAT(reduction.replacement(),
125 IsSelect(static_cast<MachineType>(kTypeBool | kRepTagged), val,
126 IsTrueConstant(), IsFalseConstant()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000127}
128
129
130TARGET_TEST_P(ChangeLoweringCommonTest, ChangeBoolToBit) {
131 Node* val = Parameter(0);
132 Node* node = graph()->NewNode(simplified()->ChangeBoolToBit(), val);
133 Reduction reduction = Reduce(node);
134 ASSERT_TRUE(reduction.Changed());
135
136 EXPECT_THAT(reduction.replacement(), IsWordEqual(val, IsTrueConstant()));
137}
138
139
140TARGET_TEST_P(ChangeLoweringCommonTest, ChangeFloat64ToTagged) {
141 Node* val = Parameter(0);
142 Node* node = graph()->NewNode(simplified()->ChangeFloat64ToTagged(), val);
143 Reduction reduction = Reduce(node);
144 ASSERT_TRUE(reduction.Changed());
145
146 Node* finish = reduction.replacement();
147 Capture<Node*> heap_number;
148 EXPECT_THAT(
149 finish,
150 IsFinish(
151 AllOf(CaptureEq(&heap_number),
152 IsAllocateHeapNumber(IsValueEffect(val), graph()->start())),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400153 IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier),
154 CaptureEq(&heap_number),
155 IsIntPtrConstant(HeapNumberValueOffset()), val,
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156 CaptureEq(&heap_number), graph()->start())));
157}
158
159
160TARGET_TEST_P(ChangeLoweringCommonTest, StringAdd) {
161 Node* node =
162 graph()->NewNode(simplified()->StringAdd(), Parameter(0), Parameter(1));
163 Reduction reduction = Reduce(node);
164 EXPECT_FALSE(reduction.Changed());
165}
166
167
168INSTANTIATE_TEST_CASE_P(ChangeLoweringTest, ChangeLoweringCommonTest,
169 ::testing::Values(kRepWord32, kRepWord64));
170
171
172// -----------------------------------------------------------------------------
173// 32-bit
174
175
176class ChangeLowering32Test : public ChangeLoweringTest {
177 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400178 ~ChangeLowering32Test() OVERRIDE {}
179 MachineType WordRepresentation() const FINAL { return kRepWord32; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000180};
181
182
183TARGET_TEST_F(ChangeLowering32Test, ChangeInt32ToTagged) {
184 Node* val = Parameter(0);
185 Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400186 NodeProperties::SetBounds(val, Bounds(Type::None(), Type::Signed32()));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 Reduction reduction = Reduce(node);
188 ASSERT_TRUE(reduction.Changed());
189
190 Node* phi = reduction.replacement();
191 Capture<Node*> add, branch, heap_number, if_true;
192 EXPECT_THAT(
193 phi,
194 IsPhi(kMachAnyTagged,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400195 IsFinish(AllOf(CaptureEq(&heap_number),
196 IsAllocateHeapNumber(_, CaptureEq(&if_true))),
197 IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier),
198 CaptureEq(&heap_number),
199 IsIntPtrConstant(HeapNumberValueOffset()),
200 IsChangeInt32ToFloat64(val),
201 CaptureEq(&heap_number), CaptureEq(&if_true))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000202 IsProjection(
203 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))),
204 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
205 IsIfFalse(AllOf(CaptureEq(&branch),
206 IsBranch(IsProjection(1, CaptureEq(&add)),
207 graph()->start()))))));
208}
209
210
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400211TARGET_TEST_F(ChangeLowering32Test, ChangeInt32ToTaggedSmall) {
212 Node* val = Parameter(0);
213 Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val);
214 NodeProperties::SetBounds(val, Bounds(Type::None(), Type::SignedSmall()));
215 Reduction reduction = Reduce(node);
216 ASSERT_TRUE(reduction.Changed());
217
218 Node* change = reduction.replacement();
219 Capture<Node*> add, branch, heap_number, if_true;
220 EXPECT_THAT(change, IsWord32Shl(val, IsInt32Constant(SmiShiftAmount())));
221}
222
223
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000224TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToFloat64) {
225 STATIC_ASSERT(kSmiTag == 0);
226 STATIC_ASSERT(kSmiTagSize == 1);
227
228 Node* val = Parameter(0);
229 Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val);
230 Reduction reduction = Reduce(node);
231 ASSERT_TRUE(reduction.Changed());
232
233 Node* phi = reduction.replacement();
234 Capture<Node*> branch, if_true;
235 EXPECT_THAT(
236 phi,
237 IsPhi(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400238 kMachFloat64, IsLoadHeapNumber(val, CaptureEq(&if_true)),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000239 IsChangeInt32ToFloat64(
240 IsWord32Sar(val, IsInt32Constant(SmiShiftAmount()))),
241 IsMerge(
242 AllOf(CaptureEq(&if_true),
243 IsIfTrue(AllOf(
244 CaptureEq(&branch),
245 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)),
246 graph()->start())))),
247 IsIfFalse(CaptureEq(&branch)))));
248}
249
250
251TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToInt32) {
252 STATIC_ASSERT(kSmiTag == 0);
253 STATIC_ASSERT(kSmiTagSize == 1);
254
255 Node* val = Parameter(0);
256 Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val);
257 Reduction reduction = Reduce(node);
258 ASSERT_TRUE(reduction.Changed());
259
260 Node* phi = reduction.replacement();
261 Capture<Node*> branch, if_true;
262 EXPECT_THAT(
263 phi,
264 IsPhi(kMachInt32,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400265 IsChangeFloat64ToInt32(IsLoadHeapNumber(val, CaptureEq(&if_true))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000266 IsWord32Sar(val, IsInt32Constant(SmiShiftAmount())),
267 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
268 IsIfFalse(AllOf(
269 CaptureEq(&branch),
270 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)),
271 graph()->start()))))));
272}
273
274
275TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToUint32) {
276 STATIC_ASSERT(kSmiTag == 0);
277 STATIC_ASSERT(kSmiTagSize == 1);
278
279 Node* val = Parameter(0);
280 Node* node = graph()->NewNode(simplified()->ChangeTaggedToUint32(), val);
281 Reduction reduction = Reduce(node);
282 ASSERT_TRUE(reduction.Changed());
283
284 Node* phi = reduction.replacement();
285 Capture<Node*> branch, if_true;
286 EXPECT_THAT(
287 phi,
288 IsPhi(kMachUint32,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400289 IsChangeFloat64ToUint32(IsLoadHeapNumber(val, CaptureEq(&if_true))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 IsWord32Sar(val, IsInt32Constant(SmiShiftAmount())),
291 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
292 IsIfFalse(AllOf(
293 CaptureEq(&branch),
294 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)),
295 graph()->start()))))));
296}
297
298
299TARGET_TEST_F(ChangeLowering32Test, ChangeUint32ToTagged) {
300 STATIC_ASSERT(kSmiTag == 0);
301 STATIC_ASSERT(kSmiTagSize == 1);
302
303 Node* val = Parameter(0);
304 Node* node = graph()->NewNode(simplified()->ChangeUint32ToTagged(), val);
305 Reduction reduction = Reduce(node);
306 ASSERT_TRUE(reduction.Changed());
307
308 Node* phi = reduction.replacement();
309 Capture<Node*> branch, heap_number, if_false;
310 EXPECT_THAT(
311 phi,
312 IsPhi(
313 kMachAnyTagged, IsWord32Shl(val, IsInt32Constant(SmiShiftAmount())),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400314 IsFinish(AllOf(CaptureEq(&heap_number),
315 IsAllocateHeapNumber(_, CaptureEq(&if_false))),
316 IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier),
317 CaptureEq(&heap_number),
318 IsInt32Constant(HeapNumberValueOffset()),
319 IsChangeUint32ToFloat64(val),
320 CaptureEq(&heap_number), CaptureEq(&if_false))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000321 IsMerge(
322 IsIfTrue(AllOf(CaptureEq(&branch),
323 IsBranch(IsUint32LessThanOrEqual(
324 val, IsInt32Constant(SmiMaxValue())),
325 graph()->start()))),
326 AllOf(CaptureEq(&if_false), IsIfFalse(CaptureEq(&branch))))));
327}
328
329
330// -----------------------------------------------------------------------------
331// 64-bit
332
333
334class ChangeLowering64Test : public ChangeLoweringTest {
335 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400336 ~ChangeLowering64Test() OVERRIDE {}
337 MachineType WordRepresentation() const FINAL { return kRepWord64; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338};
339
340
341TARGET_TEST_F(ChangeLowering64Test, ChangeInt32ToTagged) {
342 Node* val = Parameter(0);
343 Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val);
344 Reduction reduction = Reduce(node);
345 ASSERT_TRUE(reduction.Changed());
346
347 EXPECT_THAT(reduction.replacement(),
348 IsWord64Shl(IsChangeInt32ToInt64(val),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400349 IsInt64Constant(SmiShiftAmount())));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000350}
351
352
353TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToFloat64) {
354 STATIC_ASSERT(kSmiTag == 0);
355 STATIC_ASSERT(kSmiTagSize == 1);
356
357 Node* val = Parameter(0);
358 Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val);
359 Reduction reduction = Reduce(node);
360 ASSERT_TRUE(reduction.Changed());
361
362 Node* phi = reduction.replacement();
363 Capture<Node*> branch, if_true;
364 EXPECT_THAT(
365 phi,
366 IsPhi(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400367 kMachFloat64, IsLoadHeapNumber(val, CaptureEq(&if_true)),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000368 IsChangeInt32ToFloat64(IsTruncateInt64ToInt32(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400369 IsWord64Sar(val, IsInt64Constant(SmiShiftAmount())))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000370 IsMerge(
371 AllOf(CaptureEq(&if_true),
372 IsIfTrue(AllOf(
373 CaptureEq(&branch),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400374 IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000375 graph()->start())))),
376 IsIfFalse(CaptureEq(&branch)))));
377}
378
379
380TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToInt32) {
381 STATIC_ASSERT(kSmiTag == 0);
382 STATIC_ASSERT(kSmiTagSize == 1);
383
384 Node* val = Parameter(0);
385 Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val);
386 Reduction reduction = Reduce(node);
387 ASSERT_TRUE(reduction.Changed());
388
389 Node* phi = reduction.replacement();
390 Capture<Node*> branch, if_true;
391 EXPECT_THAT(
392 phi,
393 IsPhi(kMachInt32,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400394 IsChangeFloat64ToInt32(IsLoadHeapNumber(val, CaptureEq(&if_true))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000395 IsTruncateInt64ToInt32(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400396 IsWord64Sar(val, IsInt64Constant(SmiShiftAmount()))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000397 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
398 IsIfFalse(AllOf(
399 CaptureEq(&branch),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400400 IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000401 graph()->start()))))));
402}
403
404
405TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToUint32) {
406 STATIC_ASSERT(kSmiTag == 0);
407 STATIC_ASSERT(kSmiTagSize == 1);
408
409 Node* val = Parameter(0);
410 Node* node = graph()->NewNode(simplified()->ChangeTaggedToUint32(), val);
411 Reduction reduction = Reduce(node);
412 ASSERT_TRUE(reduction.Changed());
413
414 Node* phi = reduction.replacement();
415 Capture<Node*> branch, if_true;
416 EXPECT_THAT(
417 phi,
418 IsPhi(kMachUint32,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400419 IsChangeFloat64ToUint32(IsLoadHeapNumber(val, CaptureEq(&if_true))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000420 IsTruncateInt64ToInt32(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400421 IsWord64Sar(val, IsInt64Constant(SmiShiftAmount()))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000422 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))),
423 IsIfFalse(AllOf(
424 CaptureEq(&branch),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400425 IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426 graph()->start()))))));
427}
428
429
430TARGET_TEST_F(ChangeLowering64Test, ChangeUint32ToTagged) {
431 STATIC_ASSERT(kSmiTag == 0);
432 STATIC_ASSERT(kSmiTagSize == 1);
433
434 Node* val = Parameter(0);
435 Node* node = graph()->NewNode(simplified()->ChangeUint32ToTagged(), val);
436 Reduction reduction = Reduce(node);
437 ASSERT_TRUE(reduction.Changed());
438
439 Node* phi = reduction.replacement();
440 Capture<Node*> branch, heap_number, if_false;
441 EXPECT_THAT(
442 phi,
443 IsPhi(
444 kMachAnyTagged, IsWord64Shl(IsChangeUint32ToUint64(val),
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400445 IsInt64Constant(SmiShiftAmount())),
446 IsFinish(AllOf(CaptureEq(&heap_number),
447 IsAllocateHeapNumber(_, CaptureEq(&if_false))),
448 IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier),
449 CaptureEq(&heap_number),
450 IsInt64Constant(HeapNumberValueOffset()),
451 IsChangeUint32ToFloat64(val),
452 CaptureEq(&heap_number), CaptureEq(&if_false))),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000453 IsMerge(
454 IsIfTrue(AllOf(CaptureEq(&branch),
455 IsBranch(IsUint32LessThanOrEqual(
456 val, IsInt32Constant(SmiMaxValue())),
457 graph()->start()))),
458 AllOf(CaptureEq(&if_false), IsIfFalse(CaptureEq(&branch))))));
459}
460
461} // namespace compiler
462} // namespace internal
463} // namespace v8