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/generic-node-inl.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-graph.h"
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-matchers.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator-reducer.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSimplifiedOperatorReducer::~SimplifiedOperatorReducer() {}
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::Reduce(Node* node) {
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (node->opcode()) {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kBooleanNot: {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HeapObjectMatcher<HeapObject> m(node->InputAt(0));
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->false_value()))) {
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(jsgraph()->TrueConstant());
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->true_value()))) {
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Replace(jsgraph()->FalseConstant());
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsBooleanNot()) return Replace(m.node()->InputAt(0));
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeBitToBool: {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32Matcher m(node->InputAt(0));
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(0)) return Replace(jsgraph()->FalseConstant());
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(1)) return Replace(jsgraph()->TrueConstant());
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeBoolToBit()) return Replace(m.node()->InputAt(0));
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeBoolToBit: {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HeapObjectMatcher<HeapObject> m(node->InputAt(0));
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->false_value()))) {
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(0);
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.Is(Unique<HeapObject>::CreateImmovable(factory()->true_value()))) {
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ReplaceInt32(1);
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeBitToBool()) return Replace(m.node()->InputAt(0));
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat64ToTagged: {
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Float64Matcher m(node->InputAt(0));
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceNumber(m.Value());
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeInt32ToTagged: {
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32Matcher m(node->InputAt(0));
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceNumber(m.Value());
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeTaggedToFloat64: {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NumberMatcher m(node->InputAt(0));
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceFloat64(m.Value());
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeFloat64ToTagged()) return Replace(m.node()->InputAt(0));
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeInt32ToTagged()) {
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Change(node, machine()->ChangeInt32ToFloat64(),
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      m.node()->InputAt(0));
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeUint32ToTagged()) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Change(node, machine()->ChangeUint32ToFloat64(),
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      m.node()->InputAt(0));
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeTaggedToInt32: {
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NumberMatcher m(node->InputAt(0));
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value()));
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeFloat64ToTagged()) {
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Change(node, machine()->ChangeFloat64ToInt32(),
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      m.node()->InputAt(0));
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeInt32ToTagged()) return Replace(m.node()->InputAt(0));
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeTaggedToUint32: {
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NumberMatcher m(node->InputAt(0));
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceUint32(DoubleToUint32(m.Value()));
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeFloat64ToTagged()) {
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Change(node, machine()->ChangeFloat64ToUint32(),
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      m.node()->InputAt(0));
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.IsChangeUint32ToTagged()) return Replace(m.node()->InputAt(0));
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeUint32ToTagged: {
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Uint32Matcher m(node->InputAt(0));
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (m.HasValue()) return ReplaceNumber(FastUI2D(m.Value()));
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NoChange();
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::Change(Node* node, const Operator* op,
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            Node* a) {
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  node->set_op(op);
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  node->ReplaceInput(0, a);
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Changed(node);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::ReplaceFloat64(double value) {
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Replace(jsgraph()->Float64Constant(value));
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::ReplaceInt32(int32_t value) {
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Replace(jsgraph()->Int32Constant(value));
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::ReplaceNumber(double value) {
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Replace(jsgraph()->Constant(value));
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction SimplifiedOperatorReducer::ReplaceNumber(int32_t value) {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Replace(jsgraph()->Constant(value));
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGraph* SimplifiedOperatorReducer::graph() const { return jsgraph()->graph(); }
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFactory* SimplifiedOperatorReducer::factory() const {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->isolate()->factory();
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorBuilder* SimplifiedOperatorReducer::machine() const {
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return jsgraph()->machine();
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
148