Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: test/unittests/compiler/tail-call-optimization-unittest.cc

Issue 1114163005: [turbofan] Fix tail call optimization. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "src/compiler/linkage.h"
6 #include "src/compiler/tail-call-optimization.h"
7 #include "test/unittests/compiler/graph-unittest.h"
8 #include "test/unittests/compiler/node-test-utils.h"
9
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13
14 class TailCallOptimizationTest : public GraphTest {
15 public:
16 explicit TailCallOptimizationTest(int num_parameters = 1)
17 : GraphTest(num_parameters) {}
18 ~TailCallOptimizationTest() override {}
19
20 protected:
21 Reduction Reduce(Node* node) {
22 TailCallOptimization tco(common(), graph());
23 return tco.Reduce(node);
24 }
25 };
26
27
28 TEST_F(TailCallOptimizationTest, CallCodeObject0) {
29 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
30 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
31 LinkageLocation(1)};
32 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
33 CallDescriptor::kCallCodeObject, kMachAnyTagged, LinkageLocation(0),
34 new (zone()) MachineSignature(1, 1, kMachineSignature),
35 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
36 Operator::kNoProperties, 0, CallDescriptor::kNoFlags);
37 Node* p0 = Parameter(0);
38 Node* p1 = Parameter(1);
39 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
40 graph()->start(), graph()->start());
41 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
42 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
43 Reduction r = Reduce(ret);
44 ASSERT_FALSE(r.Changed());
45 }
46
47
48 TEST_F(TailCallOptimizationTest, CallCodeObject1) {
49 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
50 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
51 LinkageLocation(1)};
52 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
53 CallDescriptor::kCallCodeObject, kMachAnyTagged, LinkageLocation(0),
54 new (zone()) MachineSignature(1, 1, kMachineSignature),
55 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
56 Operator::kNoProperties, 0, CallDescriptor::kSupportsTailCalls);
57 Node* p0 = Parameter(0);
58 Node* p1 = Parameter(1);
59 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
60 graph()->start(), graph()->start());
61 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
62 Node* if_exception = graph()->NewNode(common()->IfException(), call);
63 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
64 Node* end = graph()->NewNode(common()->End(), if_exception);
65 graph()->SetEnd(end);
66 Reduction r = Reduce(ret);
67 ASSERT_FALSE(r.Changed());
68 }
69
70
71 TEST_F(TailCallOptimizationTest, CallCodeObject2) {
72 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
73 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
74 LinkageLocation(1)};
75 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
76 CallDescriptor::kCallCodeObject, kMachAnyTagged, LinkageLocation(0),
77 new (zone()) MachineSignature(1, 1, kMachineSignature),
78 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
79 Operator::kNoProperties, 0, CallDescriptor::kSupportsTailCalls);
80 Node* p0 = Parameter(0);
81 Node* p1 = Parameter(1);
82 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
83 graph()->start(), graph()->start());
84 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
85 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
86 Reduction r = Reduce(ret);
87 ASSERT_TRUE(r.Changed());
88 EXPECT_THAT(r.replacement(), IsTailCall(kCallDescriptor, p0, p1,
89 graph()->start(), graph()->start()));
90 }
91
92
93 TEST_F(TailCallOptimizationTest, CallJSFunction0) {
94 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
95 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
96 LinkageLocation(1)};
97 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
98 CallDescriptor::kCallJSFunction, kMachAnyTagged, LinkageLocation(0),
99 new (zone()) MachineSignature(1, 1, kMachineSignature),
100 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
101 Operator::kNoProperties, 0, CallDescriptor::kNoFlags);
102 Node* p0 = Parameter(0);
103 Node* p1 = Parameter(1);
104 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
105 graph()->start(), graph()->start());
106 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
107 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
108 Reduction r = Reduce(ret);
109 ASSERT_FALSE(r.Changed());
110 }
111
112
113 TEST_F(TailCallOptimizationTest, CallJSFunction1) {
114 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
115 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
116 LinkageLocation(1)};
117 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
118 CallDescriptor::kCallJSFunction, kMachAnyTagged, LinkageLocation(0),
119 new (zone()) MachineSignature(1, 1, kMachineSignature),
120 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
121 Operator::kNoProperties, 0, CallDescriptor::kSupportsTailCalls);
122 Node* p0 = Parameter(0);
123 Node* p1 = Parameter(1);
124 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
125 graph()->start(), graph()->start());
126 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
127 Node* if_exception = graph()->NewNode(common()->IfException(), call);
128 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
129 Node* end = graph()->NewNode(common()->End(), if_exception);
130 graph()->SetEnd(end);
131 Reduction r = Reduce(ret);
132 ASSERT_FALSE(r.Changed());
133 }
134
135
136 TEST_F(TailCallOptimizationTest, CallJSFunction2) {
137 MachineType kMachineSignature[] = {kMachAnyTagged, kMachAnyTagged};
138 LinkageLocation kLocationSignature[] = {LinkageLocation(0),
139 LinkageLocation(1)};
140 const CallDescriptor* kCallDescriptor = new (zone()) CallDescriptor(
141 CallDescriptor::kCallJSFunction, kMachAnyTagged, LinkageLocation(0),
142 new (zone()) MachineSignature(1, 1, kMachineSignature),
143 new (zone()) LocationSignature(1, 1, kLocationSignature), 0,
144 Operator::kNoProperties, 0, CallDescriptor::kSupportsTailCalls);
145 Node* p0 = Parameter(0);
146 Node* p1 = Parameter(1);
147 Node* call = graph()->NewNode(common()->Call(kCallDescriptor), p0, p1,
148 graph()->start(), graph()->start());
149 Node* if_success = graph()->NewNode(common()->IfSuccess(), call);
150 Node* ret = graph()->NewNode(common()->Return(), call, call, if_success);
151 Reduction r = Reduce(ret);
152 ASSERT_TRUE(r.Changed());
153 EXPECT_THAT(r.replacement(), IsTailCall(kCallDescriptor, p0, p1,
154 graph()->start(), graph()->start()));
155 }
156
157
158 } // namespace compiler
159 } // namespace internal
160 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698