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/machine-operator-reducer.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/generic-node-inl.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-graph.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-matchers.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorReducer::MachineOperatorReducer(JSGraph* jsgraph)
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : jsgraph_(jsgraph) {}
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorReducer::~MachineOperatorReducer() {}
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Float32Constant(volatile float value) {
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return graph()->NewNode(common()->Float32Constant(value));
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Float64Constant(volatile double value) {
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->Float64Constant(value);
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Int32Constant(int32_t value) {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->Int32Constant(value);
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Int64Constant(int64_t value) {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return graph()->NewNode(common()->Int64Constant(value));
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Perform constant folding and strength reduction on machine operators.
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction MachineOperatorReducer::Reduce(Node* node) {
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (node->opcode()) {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kProjection:
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ReduceProjection(OpParameter<size_t>(node), node->InputAt(0));
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32And: {
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.right().node());  // x & 0  => 0
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(-1)) return Replace(m.left().node());  // x & -1 => x
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                   // K & K  => K
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() & m.right().Value());
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return Replace(m.left().node());  // x & x => x
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Or: {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());    // x | 0  => x
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(-1)) return Replace(m.right().node());  // x | -1 => -1
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                    // K | K  => K
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() | m.right().Value());
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return Replace(m.left().node());  // x | x => x
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsWord32Shl() && m.right().IsWord32Shr()) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher mleft(m.left().node());
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher mright(m.right().node());
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (mleft.left().node() == mright.left().node()) {
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // (x << y) | (x >> (32 - y)) => x ror y
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (mright.right().IsInt32Sub()) {
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Int32BinopMatcher mrightright(mright.right().node());
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            if (mrightright.left().Is(32) &&
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                mrightright.right().node() == mleft.right().node()) {
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->set_op(machine()->Word32Ror());
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->ReplaceInput(0, mleft.left().node());
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->ReplaceInput(1, mleft.right().node());
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              return Changed(node);
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // (x << K) | (x >> (32 - K)) => x ror K
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (mleft.right().IsInRange(0, 31) &&
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              mright.right().Is(32 - mleft.right().Value())) {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->set_op(machine()->Word32Ror());
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->ReplaceInput(0, mleft.left().node());
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->ReplaceInput(1, mleft.right().node());
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            return Changed(node);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsWord32Shr() && m.right().IsWord32Shl()) {
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // (x >> (32 - y)) | (x << y)  => x ror y
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher mleft(m.left().node());
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher mright(m.right().node());
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (mleft.left().node() == mright.left().node()) {
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (mleft.right().IsInt32Sub()) {
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Int32BinopMatcher mleftright(mleft.right().node());
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            if (mleftright.left().Is(32) &&
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                mleftright.right().node() == mright.right().node()) {
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->set_op(machine()->Word32Ror());
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->ReplaceInput(0, mright.left().node());
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              node->ReplaceInput(1, mright.right().node());
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              return Changed(node);
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // (x >> (32 - K)) | (x << K) => x ror K
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (mright.right().IsInRange(0, 31) &&
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              mleft.right().Is(32 - mright.right().Value())) {
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->set_op(machine()->Word32Ror());
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->ReplaceInput(0, mright.left().node());
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            node->ReplaceInput(1, mright.right().node());
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            return Changed(node);
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Xor: {
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x ^ 0 => x
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K ^ K => K
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() ^ m.right().Value());
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceInt32(0);  // x ^ x => 0
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Shl: {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x << 0 => x
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K << K => K
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() << m.right().Value());
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Shr: {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32BinopMatcher m(node);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x >>> 0 => x
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K >>> K => K
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() >> m.right().Value());
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Sar: {
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x >> 0 => x
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K >> K => K
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() >> m.right().Value());
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Ror: {
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x ror 0 => x
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K ror K => K
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            base::bits::RotateRight32(m.left().Value(), m.right().Value()));
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Equal: {
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K == K => K
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceBool(m.left().Value() == m.right().Value());
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsInt32Sub() && m.right().Is(0)) {  // x - y == 0 => x == y
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher msub(m.left().node());
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, msub.left().node());
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, msub.right().node());
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): fold HeapConstant, ExternalReference, pointer compares
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceBool(true);  // x == x => true
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Add: {
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x + 0 => x
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K + K => K
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) +
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            static_cast<uint32_t>(m.right().Value()));
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Sub: {
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.left().node());  // x - 0 => x
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                  // K - K => K
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) -
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            static_cast<uint32_t>(m.right().Value()));
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceInt32(0);  // x - x => 0
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Mul: {
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return Replace(m.right().node());  // x * 0 => 0
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return Replace(m.left().node());   // x * 1 => x
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                   // K * K => K
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() * m.right().Value());
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(-1)) {  // x * -1 => 0 - x
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->set_op(machine()->Int32Sub());
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, Int32Constant(0));
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, m.left().node());
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsPowerOf2()) {  // x * 2^n => x << n
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->set_op(machine()->Word32Shl());
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, Int32Constant(WhichPowerOf2(m.right().Value())));
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Div: {
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return Replace(m.left().node());  // x / 1 => x
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.left().Is(0))
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().IsPowerOf2())
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().Is(0))
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.LeftEqualsRight())
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable() && !m.right().Is(0)) {  // K / K => K
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (m.right().Is(-1)) return ReplaceInt32(-m.left().Value());
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() / m.right().Value());
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(-1)) {  // x / -1 => 0 - x
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->set_op(machine()->Int32Sub());
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, Int32Constant(0));
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, m.left().node());
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32UDiv: {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32BinopMatcher m(node);
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return Replace(m.left().node());  // x / 1 => x
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.left().Is(0))
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().Is(0))
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.LeftEqualsRight())
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable() && !m.right().Is(0)) {  // K / K => K
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() / m.right().Value());
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsPowerOf2()) {  // x / 2^n => x >> n
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->set_op(machine()->Word32Shr());
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, Int32Constant(WhichPowerOf2(m.right().Value())));
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Mod: {
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return ReplaceInt32(0);   // x % 1  => 0
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(-1)) return ReplaceInt32(0);  // x % -1 => 0
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.left().Is(0))
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().IsPowerOf2())
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().Is(0))
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.LeftEqualsRight())
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable() && !m.right().Is(0)) {  // K % K => K
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() % m.right().Value());
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32UMod: {
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32BinopMatcher m(node);
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return ReplaceInt32(0);  // x % 1 => 0
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.left().Is(0))
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.right().Is(0))
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // TODO(turbofan): if (m.LeftEqualsRight())
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable() && !m.right().Is(0)) {  // K % K => K
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(m.left().Value() % m.right().Value());
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsPowerOf2()) {  // x % 2^n => x & 2^n-1
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->set_op(machine()->Word32And());
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, Int32Constant(m.right().Value() - 1));
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32LessThan: {
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K < K => K
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceBool(m.left().Value() < m.right().Value());
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsInt32Sub() && m.right().Is(0)) {  // x - y < 0 => x < y
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher msub(m.left().node());
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, msub.left().node());
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, msub.right().node());
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().Is(0) && m.right().IsInt32Sub()) {  // 0 < x - y => y < x
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher msub(m.right().node());
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, msub.right().node());
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, msub.left().node());
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceBool(false);  // x < x => false
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32LessThanOrEqual: {
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K <= K => K
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceBool(m.left().Value() <= m.right().Value());
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsInt32Sub() && m.right().Is(0)) {  // x - y <= 0 => x <= y
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher msub(m.left().node());
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, msub.left().node());
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, msub.right().node());
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().Is(0) && m.right().IsInt32Sub()) {  // 0 <= x - y => y <= x
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Int32BinopMatcher msub(m.right().node());
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(0, msub.right().node());
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        node->ReplaceInput(1, msub.left().node());
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Changed(node);
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceBool(true);  // x <= x => true
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kUint32LessThan: {
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32BinopMatcher m(node);
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().Is(kMaxUInt32)) return ReplaceBool(false);  // M < x => false
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) return ReplaceBool(false);          // x < 0 => false
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                    // K < K => K
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceBool(m.left().Value() < m.right().Value());
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceBool(false);  // x < x => false
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kUint32LessThanOrEqual: {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32BinopMatcher m(node);
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().Is(0)) return ReplaceBool(true);            // 0 <= x => true
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(kMaxUInt32)) return ReplaceBool(true);  // x <= M => true
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {                                    // K <= K => K
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceBool(m.left().Value() <= m.right().Value());
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.LeftEqualsRight()) return ReplaceBool(true);  // x <= x => true
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Add: {
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64BinopMatcher m(node);
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K + K => K
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceFloat64(m.left().Value() + m.right().Value());
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Sub: {
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64BinopMatcher m(node);
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K - K => K
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceFloat64(m.left().Value() - m.right().Value());
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Mul: {
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64BinopMatcher m(node);
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return Replace(m.left().node());  // x * 1.0 => x
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsNaN()) {                               // x * NaN => NaN
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(m.right().node());
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K * K => K
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceFloat64(m.left().Value() * m.right().Value());
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Div: {
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64BinopMatcher m(node);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(1)) return Replace(m.left().node());  // x / 1.0 => x
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsNaN()) {                               // x / NaN => NaN
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(m.right().node());
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsNaN()) {  // NaN / x => NaN
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(m.left().node());
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K / K => K
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceFloat64(m.left().Value() / m.right().Value());
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Mod: {
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64BinopMatcher m(node);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().IsNaN()) {  // x % NaN => NaN
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(m.right().node());
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.left().IsNaN()) {  // NaN % x => NaN
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(m.left().node());
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {  // K % K => K
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceFloat64(modulo(m.left().Value(), m.right().Value()));
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat32ToFloat64: {
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float32Matcher m(node->InputAt(0));
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceFloat64(m.Value());
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat64ToInt32: {
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64Matcher m(node->InputAt(0));
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt32(FastD2I(m.Value()));
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0));
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat64ToUint32: {
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64Matcher m(node->InputAt(0));
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt32(FastD2UI(m.Value()));
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeUint32ToFloat64()) return Replace(m.node()->InputAt(0));
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeInt32ToFloat64: {
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32Matcher m(node->InputAt(0));
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceFloat64(FastI2D(m.Value()));
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeInt32ToInt64: {
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32Matcher m(node->InputAt(0));
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt64(m.Value());
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeUint32ToFloat64: {
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32Matcher m(node->InputAt(0));
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceFloat64(FastUI2D(m.Value()));
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeUint32ToUint64: {
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32Matcher m(node->InputAt(0));
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt64(static_cast<uint64_t>(m.Value()));
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kTruncateFloat64ToInt32: {
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64Matcher m(node->InputAt(0));
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value()));
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0));
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kTruncateInt64ToInt32: {
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int64Matcher m(node->InputAt(0));
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value()));
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0));
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kTruncateFloat64ToFloat32: {
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64Matcher m(node->InputAt(0));
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value()));
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0));
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NoChange();
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction MachineOperatorReducer::ReduceProjection(size_t index, Node* node) {
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (node->opcode()) {
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32AddWithOverflow: {
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(index == 0 || index == 1);
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t val;
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        bool ovf = base::bits::SignedAddOverflow32(m.left().Value(),
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   m.right().Value(), &val);
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32((index == 0) ? val : ovf);
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) {
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0);
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32SubWithOverflow: {
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(index == 0 || index == 1);
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopMatcher m(node);
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsFoldable()) {
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t val;
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        bool ovf = base::bits::SignedSubOverflow32(m.left().Value(),
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   m.right().Value(), &val);
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32((index == 0) ? val : ovf);
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.right().Is(0)) {
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0);
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NoChange();
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommonOperatorBuilder* MachineOperatorReducer::common() const {
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->common();
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorBuilder* MachineOperatorReducer::machine() const {
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->machine();
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGraph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); }
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
505