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

Side by Side Diff: test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc

Issue 2611313002: [complier] Enable parallel eager inner function compilation with compiler dispatcher. (Closed)
Patch Set: Move flag Created 3 years, 11 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
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 6
7 #include "include/v8.h" 7 #include "include/v8.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/ast/ast.h" 9 #include "src/ast/ast.h"
10 #include "src/ast/scopes.h" 10 #include "src/ast/scopes.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 130 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
131 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr), 131 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), nullptr),
132 FLAG_stack_size)); 132 FLAG_stack_size));
133 133
134 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 134 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
135 job->PrepareToParseOnMainThread(); 135 job->PrepareToParseOnMainThread();
136 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse); 136 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToParse);
137 job->Parse(); 137 job->Parse();
138 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); 138 ASSERT_TRUE(job->status() == CompileJobStatus::kParsed);
139 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); 139 ASSERT_TRUE(job->FinalizeParsingOnMainThread());
140 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyse); 140 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyze);
141 ASSERT_TRUE(job->AnalyzeOnMainThread());
142 ASSERT_TRUE(job->status() == CompileJobStatus::kAnalyzed);
141 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); 143 ASSERT_TRUE(job->PrepareToCompileOnMainThread());
142 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); 144 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile);
143 job->Compile(); 145 job->Compile();
144 ASSERT_TRUE(job->status() == CompileJobStatus::kCompiled); 146 ASSERT_TRUE(job->status() == CompileJobStatus::kCompiled);
145 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); 147 ASSERT_TRUE(job->FinalizeCompilingOnMainThread());
146 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); 148 ASSERT_TRUE(job->status() == CompileJobStatus::kDone);
147 job->ResetOnMainThread(); 149 job->ResetOnMainThread();
148 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 150 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
149 } 151 }
150 152
(...skipping 20 matching lines...) Expand all
171 "function g() { var y = 1; function f(x) { return x * y }; return f; } " 173 "function g() { var y = 1; function f(x) { return x * y }; return f; } "
172 "g();"; 174 "g();";
173 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); 175 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
174 176
175 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 177 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
176 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); 178 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size));
177 179
178 job->PrepareToParseOnMainThread(); 180 job->PrepareToParseOnMainThread();
179 job->Parse(); 181 job->Parse();
180 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); 182 ASSERT_TRUE(job->FinalizeParsingOnMainThread());
183 ASSERT_TRUE(job->AnalyzeOnMainThread());
181 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); 184 ASSERT_TRUE(job->PrepareToCompileOnMainThread());
182 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); 185 ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile);
183 186
184 const AstRawString* var_x = 187 const AstRawString* var_x =
185 job->parse_info_->ast_value_factory()->GetOneByteString("x"); 188 job->parse_info_->ast_value_factory()->GetOneByteString("x");
186 Variable* var = job->parse_info_->literal()->scope()->Lookup(var_x); 189 Variable* var = job->parse_info_->literal()->scope()->Lookup(var_x);
187 ASSERT_TRUE(var); 190 ASSERT_TRUE(var);
188 ASSERT_TRUE(var->IsParameter()); 191 ASSERT_TRUE(var->IsParameter());
189 192
190 const AstRawString* var_y = 193 const AstRawString* var_y =
(...skipping 16 matching lines...) Expand all
207 " return f;\n" 210 " return f;\n"
208 "}\n" 211 "}\n"
209 "g();"; 212 "g();";
210 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); 213 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
211 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 214 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
212 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); 215 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size));
213 216
214 job->PrepareToParseOnMainThread(); 217 job->PrepareToParseOnMainThread();
215 job->Parse(); 218 job->Parse();
216 job->FinalizeParsingOnMainThread(); 219 job->FinalizeParsingOnMainThread();
220 job->AnalyzeOnMainThread();
217 job->PrepareToCompileOnMainThread(); 221 job->PrepareToCompileOnMainThread();
218 job->Compile(); 222 job->Compile();
219 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); 223 ASSERT_TRUE(job->FinalizeCompilingOnMainThread());
220 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); 224 ASSERT_TRUE(job->status() == CompileJobStatus::kDone);
221 225
222 Smi* value = Smi::cast(*RunJS(isolate(), "f(100);")); 226 Smi* value = Smi::cast(*RunJS(isolate(), "f(100);"));
223 ASSERT_TRUE(value == Smi::FromInt(160)); 227 ASSERT_TRUE(value == Smi::FromInt(160));
224 228
225 job->ResetOnMainThread(); 229 job->ResetOnMainThread();
226 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 230 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
227 } 231 }
228 232
229 TEST_F(CompilerDispatcherJobTest, CompileFailureToPrepare) { 233 TEST_F(CompilerDispatcherJobTest, CompileFailureToAnalyse) {
230 std::string raw_script("() { var a = "); 234 std::string raw_script("() { var a = ");
231 for (int i = 0; i < 100000; i++) { 235 for (int i = 0; i < 100000; i++) {
232 raw_script += "'x' + "; 236 raw_script += "'x' + ";
233 } 237 }
234 raw_script += " 'x'; }"; 238 raw_script += " 'x'; }";
235 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); 239 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str()));
236 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 240 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
237 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), 241 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script),
238 100)); 242 100));
239 243
240 job->PrepareToParseOnMainThread(); 244 job->PrepareToParseOnMainThread();
241 job->Parse(); 245 job->Parse();
242 job->FinalizeParsingOnMainThread(); 246 job->FinalizeParsingOnMainThread();
243 ASSERT_FALSE(job->PrepareToCompileOnMainThread()); 247 ASSERT_FALSE(job->AnalyzeOnMainThread());
244 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); 248 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed);
245 ASSERT_TRUE(i_isolate()->has_pending_exception()); 249 ASSERT_TRUE(i_isolate()->has_pending_exception());
246 250
247 i_isolate()->clear_pending_exception(); 251 i_isolate()->clear_pending_exception();
248 job->ResetOnMainThread(); 252 job->ResetOnMainThread();
249 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 253 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
250 } 254 }
251 255
252 TEST_F(CompilerDispatcherJobTest, CompileFailureToFinalize) { 256 TEST_F(CompilerDispatcherJobTest, CompileFailureToFinalize) {
253 std::string raw_script("() { var a = "); 257 std::string raw_script("() { var a = ");
254 for (int i = 0; i < 1000; i++) { 258 for (int i = 0; i < 1000; i++) {
255 raw_script += "'x' + "; 259 raw_script += "'x' + ";
256 } 260 }
257 raw_script += " 'x'; }"; 261 raw_script += " 'x'; }";
258 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); 262 ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str()));
259 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 263 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
260 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), 264 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script),
261 50)); 265 50));
262 266
263 job->PrepareToParseOnMainThread(); 267 job->PrepareToParseOnMainThread();
264 job->Parse(); 268 job->Parse();
265 job->FinalizeParsingOnMainThread(); 269 job->FinalizeParsingOnMainThread();
270 job->AnalyzeOnMainThread();
266 job->PrepareToCompileOnMainThread(); 271 job->PrepareToCompileOnMainThread();
267 job->Compile(); 272 job->Compile();
268 ASSERT_FALSE(job->FinalizeCompilingOnMainThread()); 273 ASSERT_FALSE(job->FinalizeCompilingOnMainThread());
269 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); 274 ASSERT_TRUE(job->status() == CompileJobStatus::kFailed);
270 ASSERT_TRUE(i_isolate()->has_pending_exception()); 275 ASSERT_TRUE(i_isolate()->has_pending_exception());
271 276
272 i_isolate()->clear_pending_exception(); 277 i_isolate()->clear_pending_exception();
273 job->ResetOnMainThread(); 278 job->ResetOnMainThread();
274 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 279 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
275 } 280 }
(...skipping 24 matching lines...) Expand all
300 " return bar;" 305 " return bar;"
301 "}"; 306 "}";
302 ScriptResource script(raw_script, strlen(raw_script)); 307 ScriptResource script(raw_script, strlen(raw_script));
303 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 308 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
304 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script), 309 i_isolate(), tracer(), CreateSharedFunctionInfo(i_isolate(), &script),
305 100)); 310 100));
306 311
307 job->PrepareToParseOnMainThread(); 312 job->PrepareToParseOnMainThread();
308 job->Parse(); 313 job->Parse();
309 job->FinalizeParsingOnMainThread(); 314 job->FinalizeParsingOnMainThread();
315 job->AnalyzeOnMainThread();
310 job->PrepareToCompileOnMainThread(); 316 job->PrepareToCompileOnMainThread();
311 ASSERT_TRUE(job->can_compile_on_background_thread()); 317 ASSERT_TRUE(job->can_compile_on_background_thread());
312 318
313 base::Semaphore semaphore(0); 319 base::Semaphore semaphore(0);
314 CompileTask* background_task = new CompileTask(job.get(), &semaphore); 320 CompileTask* background_task = new CompileTask(job.get(), &semaphore);
315 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task, 321 V8::GetCurrentPlatform()->CallOnBackgroundThread(background_task,
316 Platform::kShortRunningTask); 322 Platform::kShortRunningTask);
317 semaphore.Wait(); 323 semaphore.Wait();
318 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); 324 ASSERT_TRUE(job->FinalizeCompilingOnMainThread());
319 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); 325 ASSERT_TRUE(job->status() == CompileJobStatus::kDone);
(...skipping 13 matching lines...) Expand all
333 "}\n" 339 "}\n"
334 "g();"; 340 "g();";
335 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); 341 Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script));
336 342
337 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( 343 std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob(
338 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size)); 344 i_isolate(), tracer(), handle(f->shared()), FLAG_stack_size));
339 345
340 job->PrepareToParseOnMainThread(); 346 job->PrepareToParseOnMainThread();
341 job->Parse(); 347 job->Parse();
342 ASSERT_TRUE(job->FinalizeParsingOnMainThread()); 348 ASSERT_TRUE(job->FinalizeParsingOnMainThread());
349 ASSERT_TRUE(job->AnalyzeOnMainThread());
343 ASSERT_TRUE(job->PrepareToCompileOnMainThread()); 350 ASSERT_TRUE(job->PrepareToCompileOnMainThread());
344 job->Compile(); 351 job->Compile();
345 ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); 352 ASSERT_TRUE(job->FinalizeCompilingOnMainThread());
346 ASSERT_TRUE(job->status() == CompileJobStatus::kDone); 353 ASSERT_TRUE(job->status() == CompileJobStatus::kDone);
347 354
348 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();")); 355 Handle<JSFunction> e = Handle<JSFunction>::cast(RunJS(isolate(), "f();"));
349 356
350 ASSERT_FALSE(e->shared()->HasBaselineCode()); 357 ASSERT_FALSE(e->shared()->HasBaselineCode());
351 358
352 job->ResetOnMainThread(); 359 job->ResetOnMainThread();
353 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); 360 ASSERT_TRUE(job->status() == CompileJobStatus::kInitial);
354 } 361 }
355 362
356 } // namespace internal 363 } // namespace internal
357 } // namespace v8 364 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698