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