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