141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// Redistribution and use in source and binary forms, with or without
341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// modification, are permitted provided that the following conditions are
441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// met:
541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//
641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//     * Redistributions of source code must retain the above copyright
741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       notice, this list of conditions and the following disclaimer.
841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//     * Redistributions in binary form must reproduce the above
941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       copyright notice, this list of conditions and the following
1041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       disclaimer in the documentation and/or other materials provided
1141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       with the distribution.
1241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//     * Neither the name of Google Inc. nor the names of its
1341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       contributors may be used to endorse or promote products derived
1441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//       from this software without specific prior written permission.
1541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org//
1641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
2841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// Flags: --allow-natives-syntax
29a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// Flags: --concurrent-recompilation --block-concurrent-recompilation
3041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
319259716434187c932704601f700375e53d865de8rossberg@chromium.orgif (!%IsConcurrentRecompilationSupported()) {
329259716434187c932704601f700375e53d865de8rossberg@chromium.org  print("Concurrent recompilation is disabled. Skipping this test.");
331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  quit();
341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgfunction f1(a, i) {
3741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return a[i] + 0.5;
3841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
3941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvar arr = [0.0,,2.5];
4141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgassertEquals(0.5, f1(arr, 0));
4241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgassertEquals(0.5, f1(arr, 0));
4341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org// Optimized code of f1 depends on initial object and array maps.
459259716434187c932704601f700375e53d865de8rossberg@chromium.org%OptimizeFunctionOnNextCall(f1, "concurrent");
46a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// Kick off recompilation;
4741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgassertEquals(0.5, f1(arr, 0));
48a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// Invalidate current initial object map after compile graph has been created.
49a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgObject.prototype[1] = 1.5;
5041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgassertEquals(2, f1(arr, 1));
51a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// Not yet optimized since concurrent recompilation is blocked.
52ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertUnoptimized(f1, "no sync");
53a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org// Let concurrent recompilation proceed.
54a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org%UnblockConcurrentRecompilation();
55ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Sync with background thread to conclude optimization, which bails out
56ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// due to map dependency.
57ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertUnoptimized(f1, "sync");
584954674151afa960af66efb4831df06bde727333yangguo@chromium.org//Clear type info for stress runs.
594954674151afa960af66efb4831df06bde727333yangguo@chromium.org%ClearFunctionTypeFeedback(f1);
60