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
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "graph-tester.h"
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/common-operator.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-cache.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal;
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler;
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(Int32Constant_back_to_back) {
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Int32NodeCache cache;
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = -2000000000; i < 2000000000; i += 3315177) {
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), i);
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, pos);
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < 3; j++) {
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node** npos = cache.Find(graph.zone(), i);
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(pos, npos);
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(Int32Constant_five) {
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Int32NodeCache cache;
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(graph.zone());
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int32_t constants[] = {static_cast<int32_t>(0x80000000), -77, 0, 1, -1};
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
36fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Node* nodes[arraysize(constants)];
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
38fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (size_t i = 0; i < arraysize(constants); i++) {
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t k = constants[i];
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* node = graph.NewNode(common.Int32Constant(k));
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *cache.Find(graph.zone(), k) = nodes[i] = node;
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
44fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (size_t i = 0; i < arraysize(constants); i++) {
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t k = constants[i];
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(nodes[i], *cache.Find(graph.zone(), k));
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(Int32Constant_hits) {
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Int32NodeCache cache;
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const int32_t kSize = 1500;
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node** nodes = graph.zone()->NewArray<Node*>(kSize);
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(graph.zone());
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < kSize; i++) {
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t v = i * -55;
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    nodes[i] = graph.NewNode(common.Int32Constant(v));
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *cache.Find(graph.zone(), v) = nodes[i];
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int hits = 0;
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < kSize; i++) {
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t v = i * -55;
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), v);
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (*pos != NULL) {
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(nodes[i], *pos);
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      hits++;
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_LT(4, hits);
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(Int64Constant_back_to_back) {
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Int64NodeCache cache;
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int64_t i = -2000000000; i < 2000000000; i += 3315177) {
827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), i);
837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, pos);
847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < 3; j++) {
857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node** npos = cache.Find(graph.zone(), i);
867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(pos, npos);
877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(Int64Constant_hits) {
937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Int64NodeCache cache;
957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const int32_t kSize = 1500;
967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node** nodes = graph.zone()->NewArray<Node*>(kSize);
977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(graph.zone());
987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < kSize; i++) {
1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int64_t v = static_cast<int64_t>(i) * static_cast<int64_t>(5003001);
1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    nodes[i] = graph.NewNode(common.Int32Constant(i));
1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *cache.Find(graph.zone(), v) = nodes[i];
1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int hits = 0;
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < kSize; i++) {
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int64_t v = static_cast<int64_t>(i) * static_cast<int64_t>(5003001);
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), v);
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (*pos != NULL) {
1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(nodes[i], *pos);
1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      hits++;
1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_LT(4, hits);
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(PtrConstant_back_to_back) {
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PtrNodeCache cache;
1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int32_t buffer[50];
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int32_t* p = buffer;
124fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org       (p - buffer) < static_cast<ptrdiff_t>(arraysize(buffer)); p++) {
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), p);
1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, pos);
1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int j = 0; j < 3; j++) {
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node** npos = cache.Find(graph.zone(), p);
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(pos, npos);
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(PtrConstant_hits) {
1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  GraphTester graph;
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PtrNodeCache cache;
1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const int32_t kSize = 50;
1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int32_t buffer[kSize];
1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* nodes[kSize];
1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common(graph.zone());
1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
143fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (size_t i = 0; i < arraysize(buffer); i++) {
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int k = static_cast<int>(i);
1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t* p = &buffer[i];
1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    nodes[i] = graph.NewNode(common.Int32Constant(k));
1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *cache.Find(graph.zone(), p) = nodes[i];
1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int hits = 0;
151fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (size_t i = 0; i < arraysize(buffer); i++) {
1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    int32_t* p = &buffer[i];
1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node** pos = cache.Find(graph.zone(), p);
1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (*pos != NULL) {
1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(nodes[i], *pos);
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      hits++;
1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CHECK_LT(4, hits);
1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
161