1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph-unittest.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-graph.h"
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator-reducer.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/typer.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SimplifiedOperatorReducerTest : public GraphTest {
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit SimplifiedOperatorReducerTest(int num_parameters = 1)
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : GraphTest(num_parameters), simplified_(zone()) {}
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~SimplifiedOperatorReducerTest() {}
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction Reduce(Node* node) {
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Typer typer(zone());
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MachineOperatorBuilder machine;
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSOperatorBuilder javascript(zone());
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSGraph jsgraph(graph(), common(), &javascript, &typer, &machine);
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SimplifiedOperatorReducer reducer(&jsgraph);
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reducer.Reduce(node);
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder* simplified() { return &simplified_; }
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified_;
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename T>
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SimplifiedOperatorReducerTestWithParam
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public SimplifiedOperatorReducerTest,
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      public ::testing::WithParamInterface<T> {
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit SimplifiedOperatorReducerTestWithParam(int num_parameters = 1)
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : SimplifiedOperatorReducerTest(num_parameters) {}
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~SimplifiedOperatorReducerTestWithParam() {}
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const double kFloat64Values[] = {
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -V8_INFINITY,  -6.52696e+290, -1.05768e+290, -5.34203e+268, -1.01997e+268,
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -8.22758e+266, -1.58402e+261, -5.15246e+241, -5.92107e+226, -1.21477e+226,
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1.67913e+188, -1.6257e+184,  -2.60043e+170, -2.52941e+168, -3.06033e+116,
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -4.56201e+52,  -3.56788e+50,  -9.9066e+38,   -3.07261e+31,  -2.1271e+09,
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1.91489e+09,  -1.73053e+09,  -9.30675e+08,  -26030,        -20453,
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -15790,        -11699,        -111,          -97,           -78,
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -63,           -58,           -1.53858e-06,  -2.98914e-12,  -1.14741e-39,
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -8.20347e-57,  -1.48932e-59,  -3.17692e-66,  -8.93103e-81,  -3.91337e-83,
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -6.0489e-92,   -8.83291e-113, -4.28266e-117, -1.92058e-178, -2.0567e-192,
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1.68167e-194, -1.51841e-214, -3.98738e-234, -7.31851e-242, -2.21875e-253,
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1.11612e-293, -0.0,          0.0,           2.22507e-308,  1.06526e-307,
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    4.16643e-227,  6.76624e-223,  2.0432e-197,   3.16254e-184,  1.37315e-173,
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    2.88603e-172,  1.54155e-99,   4.42923e-81,   1.40539e-73,   5.4462e-73,
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    1.24064e-58,   3.11167e-58,   2.75826e-39,   0.143815,      58,
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    67,            601,           7941,          11644,         13697,
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    25680,         29882,         1.32165e+08,   1.62439e+08,   4.16837e+08,
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    9.59097e+08,   1.32491e+09,   1.8728e+09,    1.0672e+17,    2.69606e+46,
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    1.98285e+79,   1.0098e+82,    7.93064e+88,   3.67444e+121,  9.36506e+123,
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    7.27954e+162,  3.05316e+168,  1.16171e+175,  1.64771e+189,  1.1622e+202,
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    2.00748e+239,  2.51778e+244,  3.90282e+306,  1.79769e+308,  V8_INFINITY};
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int32_t kInt32Values[] = {
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -2147483647 - 1, -2104508227, -2103151830, -1435284490, -1378926425,
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1318814539,     -1289388009, -1287537572, -1279026536, -1241605942,
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -1226046939,     -941837148,  -779818051,  -413830641,  -245798087,
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -184657557,      -127145950,  -105483328,  -32325,      -26653,
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -23858,          -23834,      -22363,      -19858,      -19044,
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -18744,          -15528,      -5309,       -3372,       -2093,
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -104,            -98,         -97,         -93,         -84,
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -80,             -78,         -76,         -72,         -58,
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -57,             -56,         -55,         -45,         -40,
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -34,             -32,         -25,         -24,         -5,
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    -2,              0,           3,           10,          24,
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    34,              42,          46,          47,          48,
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    52,              56,          64,          65,          71,
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    76,              79,          81,          82,          97,
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    102,             103,         104,         106,         107,
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    109,             116,         122,         3653,        4485,
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    12405,           16504,       26262,       28704,       29755,
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    30554,           16476817,    605431957,   832401070,   873617242,
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    914205764,       1062628108,  1087581664,  1488498068,  1534668023,
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    1661587028,      1696896187,  1866841746,  2032089723,  2147483647};
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const uint32_t kUint32Values[] = {
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x0,        0x5,        0x8,        0xc,        0xd,        0x26,
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x28,       0x29,       0x30,       0x34,       0x3e,       0x42,
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x50,       0x5b,       0x63,       0x71,       0x77,       0x7c,
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x83,       0x88,       0x96,       0x9c,       0xa3,       0xfa,
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x7a7,      0x165d,     0x234d,     0x3acb,     0x43a5,     0x4573,
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x5b4f,     0x5f14,     0x6996,     0x6c6e,     0x7289,     0x7b9a,
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x7bc9,     0x86bb,     0xa839,     0xaa41,     0xb03b,     0xc942,
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0xce68,     0xcf4c,     0xd3ad,     0xdea3,     0xe90c,     0xed86,
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0xfba5,     0x172dcc6,  0x114d8fc1, 0x182d6c9d, 0x1b1e3fad, 0x1db033bf,
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x1e1de755, 0x1f625c80, 0x28f6cf00, 0x2acb6a94, 0x2c20240e, 0x2f0fe54e,
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x31863a7c, 0x33325474, 0x3532fae3, 0x3bab82ea, 0x4c4b83a2, 0x4cd93d1e,
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x4f7331d4, 0x5491b09b, 0x57cc6ff9, 0x60d3b4dc, 0x653f5904, 0x690ae256,
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x69fe3276, 0x6bebf0ba, 0x6e2c69a3, 0x73b84ff7, 0x7b3a1924, 0x7ed032d9,
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x84dd734b, 0x8552ea53, 0x8680754f, 0x8e9660eb, 0x94fe2b9c, 0x972d30cf,
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0x9b98c482, 0xb158667e, 0xb432932c, 0xb5b70989, 0xb669971a, 0xb7c359d1,
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0xbeb15c0d, 0xc171c53d, 0xc743dd38, 0xc8e2af50, 0xc98e2df0, 0xd9d1cdf9,
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0xdcc91049, 0xe46f396d, 0xee991950, 0xef64e521, 0xf7aeefc9, 0xffffffff};
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMATCHER(IsNaN, std::string(negation ? "isn't" : "is") + " NaN") {
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return std::isnan(arg);
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Unary operators
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct UnaryOperator {
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* (SimplifiedOperatorBuilder::*constructor)();
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* constructor_name;
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstd::ostream& operator<<(std::ostream& os, const UnaryOperator& unop) {
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << unop.constructor_name;
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const UnaryOperator kUnaryOperators[] = {
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::BooleanNot, "BooleanNot"},
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeBitToBool, "ChangeBitToBool"},
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeBoolToBit, "ChangeBoolToBit"},
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeFloat64ToTagged,
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     "ChangeFloat64ToTagged"},
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeInt32ToTagged, "ChangeInt32ToTagged"},
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeTaggedToFloat64,
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     "ChangeTaggedToFloat64"},
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeTaggedToInt32, "ChangeTaggedToInt32"},
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeTaggedToUint32, "ChangeTaggedToUint32"},
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {&SimplifiedOperatorBuilder::ChangeUint32ToTagged, "ChangeUint32ToTagged"}};
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef SimplifiedOperatorReducerTestWithParam<UnaryOperator>
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SimplifiedUnaryOperatorTest;
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedUnaryOperatorTest, Parameter) {
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const UnaryOperator& unop = GetParam();
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode((simplified()->*unop.constructor)(), Parameter(0)));
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_FALSE(reduction.Changed());
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(SimplifiedOperatorReducerTest,
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        SimplifiedUnaryOperatorTest,
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ::testing::ValuesIn(kUnaryOperators));
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// BooleanNot
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, BooleanNotWithBooleanNot) {
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->BooleanNot(),
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       graph()->NewNode(simplified()->BooleanNot(), param0)));
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, BooleanNotWithFalseConstant) {
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction0 =
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->BooleanNot(), FalseConstant()));
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction0.Changed());
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction0.replacement(), IsTrueConstant());
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, BooleanNotWithTrueConstant) {
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction1 =
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->BooleanNot(), TrueConstant()));
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction1.Changed());
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction1.replacement(), IsFalseConstant());
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeBoolToBit
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBitToBoolWithChangeBoolToBit) {
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeBitToBool(),
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeBoolToBit(), param0)));
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBitToBoolWithZeroConstant) {
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeBitToBool(), Int32Constant(0)));
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsFalseConstant());
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBitToBoolWithOneConstant) {
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeBitToBool(), Int32Constant(1)));
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsTrueConstant());
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeBoolToBit
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBoolToBitWithFalseConstant) {
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeBoolToBit(), FalseConstant()));
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(0));
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBoolToBitWithTrueConstant) {
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeBoolToBit(), TrueConstant()));
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(1));
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeBoolToBitWithChangeBitToBool) {
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeBoolToBit(),
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeBitToBool(), param0)));
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeFloat64ToTagged
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeFloat64ToTaggedWithConstant) {
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(double, n, kFloat64Values) {
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction = Reduce(graph()->NewNode(
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        simplified()->ChangeFloat64ToTagged(), Float64Constant(n)));
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(), IsNumberConstant(n));
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeInt32ToTagged
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeInt32ToTaggedWithConstant) {
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(int32_t, n, kInt32Values) {
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction = Reduce(graph()->NewNode(
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        simplified()->ChangeInt32ToTagged(), Int32Constant(n)));
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(), IsNumberConstant(FastI2D(n)));
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeTaggedToFloat64
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToFloat64WithChangeFloat64ToTagged) {
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToFloat64(),
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0)));
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToFloat64WithChangeInt32ToTagged) {
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToFloat64(),
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0)));
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsChangeInt32ToFloat64(param0));
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToFloat64WithChangeUint32ToTagged) {
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToFloat64(),
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeUint32ToTagged(), param0)));
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsChangeUint32ToFloat64(param0));
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithConstant) {
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(double, n, kFloat64Values) {
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction = Reduce(graph()->NewNode(
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        simplified()->ChangeTaggedToFloat64(), NumberConstant(n)));
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(), IsFloat64Constant(n));
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant1) {
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(),
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(-base::OS::nan_value())));
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsFloat64Constant(IsNaN()));
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant2) {
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(),
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(base::OS::nan_value())));
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsFloat64Constant(IsNaN()));
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeTaggedToInt32
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToInt32WithChangeFloat64ToTagged) {
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToInt32(),
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0)));
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToInt32(param0));
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToInt32WithChangeInt32ToTagged) {
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToInt32(),
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0)));
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToInt32WithConstant) {
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(double, n, kFloat64Values) {
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction = Reduce(graph()->NewNode(
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        simplified()->ChangeTaggedToInt32(), NumberConstant(n)));
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(), IsInt32Constant(DoubleToInt32(n)));
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToInt32WithNaNConstant1) {
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToInt32(),
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(-base::OS::nan_value())));
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(0));
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToInt32WithNaNConstant2) {
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToInt32(),
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(base::OS::nan_value())));
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(0));
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeTaggedToUint32
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToUint32WithChangeFloat64ToTagged) {
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToUint32(),
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0)));
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToUint32(param0));
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest,
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ChangeTaggedToUint32WithChangeUint32ToTagged) {
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* param0 = Parameter(0);
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction = Reduce(graph()->NewNode(
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      simplified()->ChangeTaggedToUint32(),
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph()->NewNode(simplified()->ChangeUint32ToTagged(), param0)));
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(param0, reduction.replacement());
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToUint32WithConstant) {
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(double, n, kFloat64Values) {
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction = Reduce(graph()->NewNode(
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        simplified()->ChangeTaggedToUint32(), NumberConstant(n)));
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(),
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                IsInt32Constant(bit_cast<int32_t>(DoubleToUint32(n))));
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToUint32WithNaNConstant1) {
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToUint32(),
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(-base::OS::nan_value())));
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(0));
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToUint32WithNaNConstant2) {
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reduction reduction =
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Reduce(graph()->NewNode(simplified()->ChangeTaggedToUint32(),
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              NumberConstant(base::OS::nan_value())));
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSERT_TRUE(reduction.Changed());
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_THAT(reduction.replacement(), IsInt32Constant(0));
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ChangeUint32ToTagged
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_F(SimplifiedOperatorReducerTest, ChangeUint32ToTagged) {
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TRACED_FOREACH(uint32_t, n, kUint32Values) {
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Reduction reduction =
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Reduce(graph()->NewNode(simplified()->ChangeUint32ToTagged(),
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                Int32Constant(bit_cast<int32_t>(n))));
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSERT_TRUE(reduction.Changed());
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EXPECT_THAT(reduction.replacement(), IsNumberConstant(FastUI2D(n)));
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
484