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