17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/v8.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 75e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#include "test/cctest/cctest.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/function-tester.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgusing namespace v8; 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal; 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler; 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 149d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org#if V8_TURBOFAN_TARGET 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void IsOptimized(const FunctionCallbackInfo<v8::Value>& args) { 175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org JavaScriptFrameIterator it(CcTest::i_isolate()); 185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org JavaScriptFrame* frame = it.frame(); 195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return args.GetReturnValue().Set(frame->is_optimized()); 205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void InstallIsOptimizedHelper(v8::Isolate* isolate) { 245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Local<v8::Context> context = isolate->GetCurrentContext(); 255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Local<v8::FunctionTemplate> t = FunctionTemplate::New(isolate, IsOptimized); 265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org context->Global()->Set(v8_str("IsOptimized"), t->GetFunction()); 275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TurboSimpleDeopt) { 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_turbo_deoptimization = true; 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T( 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "(function f(a) {" 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "var b = 1;" 375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "if (!IsOptimized()) return 0;" 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "%DeoptimizeFunction(f);" 395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "if (IsOptimized()) return 0;" 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "return a + b; })"); 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org InstallIsOptimizedHelper(CcTest::isolate()); 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(2), T.Val(1)); 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 479d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgTEST(TurboSimpleDeoptInExpr) { 489d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org FLAG_allow_natives_syntax = true; 499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org FLAG_turbo_deoptimization = true; 509d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 519d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org FunctionTester T( 529d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "(function f(a) {" 539d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var b = 1;" 549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var c = 2;" 555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "if (!IsOptimized()) return 0;" 569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "var d = b + (%DeoptimizeFunction(f), c);" 575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org "if (IsOptimized()) return 0;" 589d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org "return d + a; })"); 599d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org InstallIsOptimizedHelper(CcTest::isolate()); 619d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org T.CheckCall(T.Val(6), T.Val(3)); 629d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 639d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 649d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org#endif 659d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(TurboTrivialDeopt) { 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_allow_natives_syntax = true; 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FLAG_turbo_deoptimization = true; 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FunctionTester T( 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "(function foo() {" 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "%DeoptimizeFunction(foo);" 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org "return 1; })"); 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org T.CheckCall(T.Val(1)); 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 77