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 "test/cctest/cctest.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/base/utils/random-number-generator.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph-inl.h" 9ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/js-graph.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator-reducer.h" 11ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/typer.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/value-helper.h" 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal; 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler; 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <typename T> 182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator(CommonOperatorBuilder* common, 192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org volatile T value); 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <> 222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator<int32_t>(CommonOperatorBuilder* common, 232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org volatile int32_t value) { 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return common->Int32Constant(value); 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <> 282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator<double>(CommonOperatorBuilder* common, 292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org volatile double value) { 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return common->Float64Constant(value); 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 34e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <typename T> 35e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgT ValueOfOperator(const Operator* op); 36e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 37e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <> 38e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgint32_t ValueOfOperator<int32_t>(const Operator* op) { 39e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(IrOpcode::kInt32Constant, op->opcode()); 40e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return OpParameter<int32_t>(op); 41e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 42e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 43e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <> 44e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgdouble ValueOfOperator<double>(const Operator* op) { 45e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CHECK_EQ(IrOpcode::kFloat64Constant, op->opcode()); 46e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return OpParameter<double>(op); 47e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 48e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 49e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass ReducerTester : public HandleAndZoneScope { 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org explicit ReducerTester(int num_parameters = 0) 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : isolate(main_isolate()), 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org binop(NULL), 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org unop(NULL), 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org common(main_zone()), 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org graph(main_zone()), 58b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org javascript(main_zone()), 59ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org typer(main_zone()), 60b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org jsgraph(&graph, &common, &javascript, &typer, &machine), 613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org maxuint32(Constant<int32_t>(kMaxUInt32)) { 623e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org Node* s = graph.NewNode(common.Start(num_parameters)); 633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org graph.SetStart(s); 643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Isolate* isolate; 672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* binop; 682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* unop; 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MachineOperatorBuilder machine; 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CommonOperatorBuilder common; 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Graph graph; 72b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org JSOperatorBuilder javascript; 73ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Typer typer; 74ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org JSGraph jsgraph; 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* maxuint32; 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* Constant(volatile T value) { 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return graph.NewNode(NewConstantOperator<T>(&common, value)); 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 82e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org template <typename T> 83e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org const T ValueOf(const Operator* op) { 84e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return ValueOfOperator<T>(op); 85e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org } 86e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to constants {a} and {b} 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // yields the {expect} value. 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckFoldBinop(volatile T expect, volatile T a, volatile T b) { 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CheckFoldBinop<T>(expect, Constant<T>(a), Constant<T>(b)); 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to {a} and {b} yields 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // the {expect} value. 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckFoldBinop(volatile T expect, Node* a, Node* b) { 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(NULL, binop); 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, a, b); 100ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(reduction.Changed()); 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(n, reduction.replacement()); 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(expect, ValueOf<T>(reduction.replacement()->op())); 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to {a} and {b} yields 1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // the {expect} node. 1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckBinop(Node* expect, Node* a, Node* b) { 1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(NULL, binop); 1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, a, b); 112ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(reduction.Changed()); 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(expect, reduction.replacement()); 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to {left} and {right} yields 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // this binop applied to {left_expect} and {right_expect}. 1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckFoldBinop(Node* left_expect, Node* right_expect, Node* left, 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* right) { 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(NULL, binop); 1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, left, right); 124ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(reduction.Changed()); 1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(binop, reduction.replacement()->op()); 1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(left_expect, reduction.replacement()->InputAt(0)); 1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(right_expect, reduction.replacement()->InputAt(1)); 1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to {left} and {right} yields 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // the {op_expect} applied to {left_expect} and {right_expect}. 1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 1352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org void CheckFoldBinop(volatile T left_expect, const Operator* op_expect, 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* right_expect, Node* left, Node* right) { 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(NULL, binop); 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, left, right); 139ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction r = reducer.Reduce(n); 1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(r.Changed()); 1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode()); 1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(left_expect, ValueOf<T>(r.replacement()->InputAt(0)->op())); 1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(right_expect, r.replacement()->InputAt(1)); 1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that the reduction of this binop applied to {left} and {right} yields 1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // the {op_expect} applied to {left_expect} and {right_expect}. 1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 1502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org void CheckFoldBinop(Node* left_expect, const Operator* op_expect, 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org volatile T right_expect, Node* left, Node* right) { 1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_NE(NULL, binop); 1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, left, right); 154ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction r = reducer.Reduce(n); 1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(r.Changed()); 1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode()); 1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(left_expect, r.replacement()->InputAt(0)); 1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op())); 1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that if the given constant appears on the left, the reducer will 1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // swap it to be on the right. 1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckPutConstantOnRight(volatile T constant) { 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative)); 1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* p = Parameter(); 1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* k = Constant<T>(constant); 1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org { 1707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, k, p); 171ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!reduction.Changed() || reduction.replacement() == n); 1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(p, n->InputAt(0)); 1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(k, n->InputAt(1)); 1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org { 1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, p, k); 179ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!reduction.Changed()); 1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(p, n->InputAt(0)); 1837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(k, n->InputAt(1)); 1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check that if the given constant appears on the left, the reducer will 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // *NOT* swap it to be on the right. 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org template <typename T> 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void CheckDontPutConstantOnRight(volatile T constant) { 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!binop->HasProperty(Operator::kCommutative)); 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* p = Parameter(); 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* k = Constant<T>(constant); 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* n = graph.NewNode(binop, k, p); 195ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&jsgraph); 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(n); 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!reduction.Changed()); 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(k, n->InputAt(0)); 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK_EQ(p, n->InputAt(1)); 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* Parameter(int32_t index = 0) { 2033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return graph.NewNode(common.Parameter(index), graph.start()); 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32And) { 2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32And(); 2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x & y, x, y); 2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(33); 2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(44000); 2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* minus_1 = R.Constant<int32_t>(-1); 2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(zero, x, zero); // x & 0 => 0 2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(zero, zero, x); // 0 & x => 0 2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, minus_1); // x & -1 => 0 2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, minus_1, x); // -1 & x => 0 2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, x); // x & x => x 2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Or) { 2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 2367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Or(); 2377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 2397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 2407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 2417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x | y, x, y); 2427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(36); 2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(44001); 2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 2507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* minus_1 = R.Constant<int32_t>(-1); 2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x & 0 => x 2537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, zero, x); // 0 & x => x 2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(minus_1, x, minus_1); // x & -1 => -1 2557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(minus_1, minus_1, x); // -1 & x => -1 2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, x); // x & x => x 2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Xor) { 2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Xor(); 2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x ^ y, x, y); 2687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(39); 2727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(4403); 2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x ^ 0 => x 2787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, zero, x); // 0 ^ x => x 2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, x); // x ^ x => 0 2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Shl) { 2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Shl(); 2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): out of range shifts 2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(i) { 2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int y = 0; y < 32; y++) { 2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *i; 2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x << y, x, y); 2927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(44); 2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x << 0 => x 3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Shr) { 3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Shr(); 3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): test out of range shifts 3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(i) { 3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (uint32_t y = 0; y < 32; y++) { 3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint32_t x = *i; 3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x >> y, x, y); 3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(44); 3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 3197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x >>> 0 => x 3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Sar) { 3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Sar(); 3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): test out of range shifts 3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(i) { 3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int32_t y = 0; y < 32; y++) { 3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *i; 3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x >> y, x, y); 3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(44); 3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x >> 0 => x 3437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Equal) { 3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Word32Equal(); 3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x == y ? 1 : 0, x, y); 3547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(48); 3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(-48); 3597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(0); 3617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* y = R.Parameter(1); 3627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 3637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y); 3647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(1, x, x); // x == x => 1 3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(x, y, sub, zero); // x - y == 0 => x == y 3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(x, y, zero, sub); // 0 == x - y => x == y 3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Add) { 3727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32Add(); 3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x + y, x, y); // TODO(titzer): signed overflow 3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(41); 3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(4407); 3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x + 0 => x 3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, zero, x); // 0 + x => x 3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 3917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Sub) { 3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 3957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32Sub(); 3967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 3977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 4007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x - y, x, y); 4017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(412); 4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 4077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 4087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, zero); // x - 0 => x 4107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Mul) { 4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32Mul(); 4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x * y, x, y); // TODO(titzer): signed overflow 4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(4111); 4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(-4407); 4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<int32_t>(1); 4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* minus_one = R.Constant<int32_t>(-1); 4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(zero, x, zero); // x * 0 => 0 4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(zero, zero, x); // 0 * x => 0 4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, one); // x * 1 => x 4357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, one, x); // 1 * x => x 4367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, minus_one, 4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org x); // -1 * x => 0 - x 4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, x, 4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org minus_one); // x * -1 => 0 - x 4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int32_t n = 1; n < 31; ++n) { 4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* multiplier = R.Constant<int32_t>(1 << n); 4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shl(), n, x, 4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org multiplier); // x * 2^n => x << n 4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shl(), n, multiplier, 4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org x); // 2^n * x => x << n 4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Div) { 4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32Div(); 4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (y == 0) continue; // TODO(titzer): test / 0 4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t r = y == -1 ? -x : x / y; // INT_MIN / -1 may explode in C 4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(r, x, y); 4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(41111); 4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-44071); 4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<int32_t>(1); 4697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* minus_one = R.Constant<int32_t>(-1); 4707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, one); // x / 1 => x 4727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): // 0 / x => 0 if x != 0 4737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): // x / 2^n => x >> n and round 4747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, x, 4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org minus_one); // x / -1 => 0 - x 4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32UDiv) { 4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32UDiv(); 4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pl) { 4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pr) { 4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint32_t x = *pl, y = *pr; 4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (y == 0) continue; // TODO(titzer): test / 0 4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x / y, x, y); 4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(41311); 4927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-44371); 4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 4957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<int32_t>(1); 4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, one); // x / 1 => x 4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): // 0 / x => 0 if x != 0 4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (uint32_t n = 1; n < 32; ++n) { 5017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* divisor = R.Constant<int32_t>(1u << n); 5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shr(), n, x, 5037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org divisor); // x / 2^n => x >> n 5047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 5067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Mod) { 5097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 5107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32Mod(); 5117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 5137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (y == 0) continue; // TODO(titzer): test % 0 5167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t r = y == -1 ? 0 : x % y; // INT_MIN % -1 may explode in C 5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(r, x, y); 5187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(413); 5227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-4401); 5237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<int32_t>(1); 5267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, one); // x % 1 => 0 5287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): // x % 2^n => x & 2^n-1 and round 5297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 5307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32UMod) { 5337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 5347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32UMod(); 5357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 5377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 5387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint32_t x = *pl, y = *pr; 5397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (y == 0) continue; // TODO(titzer): test x % 0 5407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x % y, x, y); 5417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(417); 5457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-4371); 5467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 5487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<int32_t>(1); 5497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, one); // x % 1 => 0 5517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (uint32_t n = 1; n < 32; ++n) { 5537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* divisor = R.Constant<int32_t>(1u << n); 5547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x, R.machine.Word32And(), (1u << n) - 1, x, 5557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org divisor); // x % 2^n => x & 2^n-1 5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 5587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32LessThan) { 5617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 5627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32LessThan(); 5637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 5657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 5667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 5677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x < y ? 1 : 0, x, y); 5687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(41399); 5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-440197); 5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(0); 5757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* y = R.Parameter(1); 5767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 5777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y); 5787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, x); // x < x => 0 5807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(x, y, sub, zero); // x - y < 0 => x < y 5817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(y, x, zero, sub); // 0 < x - y => y < x 5827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 5837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32LessThanOrEqual) { 5867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 5877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Int32LessThanOrEqual(); 5887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pl) { 5907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(pr) { 5917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int32_t x = *pl, y = *pr; 5927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x <= y ? 1 : 0, x, y); 5937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_INT32_INPUTS(i) { R.CheckDontPutConstantOnRight<int32_t>(*i); } 5977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(0); 5997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* y = R.Parameter(1); 6007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 6017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y); 6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(1, x, x); // x <= x => 1 6047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(x, y, sub, zero); // x - y <= 0 => x <= y 6057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop(y, x, zero, sub); // 0 <= x - y => y <= x 6067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceUint32LessThan) { 6107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Uint32LessThan(); 6127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pl) { 6147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pr) { 6157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint32_t x = *pl, y = *pr; 6167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x < y ? 1 : 0, x, y); 6177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(41399); 6217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-440197); 6227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 6247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* max = R.maxuint32; 6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 6267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, max, x); // M < x => 0 6287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, zero); // x < 0 => 0 6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(0, x, x); // x < x => 0 6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceUint32LessThanOrEqual) { 6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 6357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Uint32LessThanOrEqual(); 6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pl) { 6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_UINT32_INPUTS(pr) { 6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint32_t x = *pl, y = *pr; 6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(x <= y ? 1 : 0, x, y); 6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(41399); 6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckDontPutConstantOnRight(-440197); 6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* max = R.maxuint32; 6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* zero = R.Constant<int32_t>(0); 6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(1, x, max); // x <= M => 1 6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(1, zero, x); // 0 <= x => 1 6537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<int32_t>(1, x, x); // x <= x => 1 6547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceLoadStore) { 6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* base = R.Constant<int32_t>(11); 6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* index = R.Constant<int32_t>(4); 6625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Node* load = R.graph.NewNode(R.machine.Load(kMachInt32), base, index); 6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org { 665ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&R.jsgraph); 6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(load); 6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!reduction.Changed()); // loads should not be reduced. 6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org { 6716313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org Node* store = R.graph.NewNode( 6726313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org R.machine.Store(StoreRepresentation(kMachInt32, kNoWriteBarrier)), base, 6736313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org index, load); 674ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MachineOperatorReducer reducer(&R.jsgraph); 6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Reduction reduction = reducer.Reduce(store); 6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CHECK(!reduction.Changed()); // stores should not be reduced. 6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void CheckNans(ReducerTester* R) { 6827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R->Parameter(); 6837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org std::vector<double> nans = ValueHelper::nan_vector(); 6847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end(); 6857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ++pl) { 6867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (std::vector<double>::const_iterator pr = nans.begin(); 6877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org pr != nans.end(); ++pr) { 6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* nan1 = R->Constant<double>(*pl); 6897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* nan2 = R->Constant<double>(*pr); 6907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R->CheckBinop(nan1, x, nan1); // x % NaN => NaN 6917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R->CheckBinop(nan1, nan1, x); // NaN % x => NaN 6927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R->CheckBinop(nan1, nan2, nan1); // NaN % NaN => NaN 6937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Add) { 6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 7007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Float64Add(); 7017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pl) { 7037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pr) { 7047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double x = *pl, y = *pr; 7057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<double>(x + y, x, y); 7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); } 7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): CheckNans(&R); 7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Sub) { 7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Float64Sub(); 7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pl) { 7197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pr) { 7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double x = *pl, y = *pr; 7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<double>(x - y, x, y); 7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): CheckNans(&R); 7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Mul) { 7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Float64Mul(); 7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pl) { 7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pr) { 7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double x = *pl, y = *pr; 7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<double>(x * y, x, y); 7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double inf = V8_INFINITY; 7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(-inf); 7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(-0.1); 7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(0.1); 7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckPutConstantOnRight(inf); 7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<double>(1.0); 7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, one); // x * 1.0 => x 7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, one, x); // 1.0 * x => x 7507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CheckNans(&R); 7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Div) { 7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Float64Div(); 7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pl) { 7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pr) { 7617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double x = *pl, y = *pr; 7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<double>(x / y, x, y); 7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* x = R.Parameter(); 7677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* one = R.Constant<double>(1.0); 7687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckBinop(x, x, one); // x / 1.0 => x 7707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CheckNans(&R); 7727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Mod) { 7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ReducerTester R; 7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.binop = R.machine.Float64Mod(); 7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pl) { 7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FOR_FLOAT64_INPUTS(pr) { 7817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org double x = *pl, y = *pr; 7827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org R.CheckFoldBinop<double>(modulo(x, y), x, y); 7837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CheckNans(&R); 7877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64And 7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Or 7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Xor 7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Shl 7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Shr 7957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Sar 7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Equal 7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Not 7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Add 7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Sub 8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Mul 8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UMul 8027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Div 8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UDiv 8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Mod 8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UMod 8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Neg 807aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64 808aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32 8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Float64Compare 810