1// Copyright 2016 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ 6#define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ 7 8#include "src/compiler/common-operator.h" 9#include "src/compiler/node.h" 10#include "src/compiler/simplified-operator.h" 11 12namespace v8 { 13namespace internal { 14 15class Zone; 16 17namespace compiler { 18 19class CommonOperatorBuilder; 20class SimplifiedOperatorBuilder; 21class MachineOperatorBuilder; 22class JSGraph; 23class Graph; 24class Schedule; 25 26class EffectControlLinearizer { 27 public: 28 EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone); 29 30 void Run(); 31 32 private: 33 void ProcessNode(Node* node, Node** frame_state, Node** effect, 34 Node** control); 35 36 struct ValueEffectControl { 37 Node* value; 38 Node* effect; 39 Node* control; 40 ValueEffectControl(Node* value, Node* effect, Node* control) 41 : value(value), effect(effect), control(control) {} 42 }; 43 44 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect, 45 Node** control); 46 ValueEffectControl LowerTypeGuard(Node* node, Node* effect, Node* control); 47 ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect, 48 Node* control); 49 ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect, 50 Node* control); 51 ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect, 52 Node* control); 53 ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect, 54 Node* control); 55 ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect, 56 Node* control); 57 ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect, 58 Node* control); 59 ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect, 60 Node* control); 61 ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect, 62 Node* control); 63 ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect, 64 Node* control); 65 ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state, 66 Node* effect, Node* control); 67 ValueEffectControl LowerCheckTaggedPointer(Node* node, Node* frame_state, 68 Node* effect, Node* control); 69 ValueEffectControl LowerCheckTaggedSigned(Node* node, Node* frame_state, 70 Node* effect, Node* control); 71 ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state, 72 Node* effect, Node* control); 73 ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state, 74 Node* effect, Node* control); 75 ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state, 76 Node* effect, Node* control); 77 ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state, 78 Node* effect, Node* control); 79 ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state, 80 Node* effect, Node* control); 81 ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state, 82 Node* effect, Node* control); 83 ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect, 84 Node* control); 85 ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect, 86 Node* control); 87 ValueEffectControl LowerTruncateTaggedToWord32(Node* node, Node* effect, 88 Node* control); 89 ValueEffectControl LowerObjectIsCallable(Node* node, Node* effect, 90 Node* control); 91 ValueEffectControl LowerObjectIsNumber(Node* node, Node* effect, 92 Node* control); 93 ValueEffectControl LowerObjectIsReceiver(Node* node, Node* effect, 94 Node* control); 95 ValueEffectControl LowerObjectIsSmi(Node* node, Node* effect, Node* control); 96 ValueEffectControl LowerObjectIsString(Node* node, Node* effect, 97 Node* control); 98 ValueEffectControl LowerObjectIsUndetectable(Node* node, Node* effect, 99 Node* control); 100 ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect, 101 Node* control); 102 ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state, 103 Node* effect, Node* control); 104 ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state, 105 Node* effect, Node* control); 106 ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect, 107 Node* control); 108 ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect, 109 Node* control); 110 ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect, 111 Node* control); 112 113 ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect, 114 Node* control); 115 ValueEffectControl BuildCheckedFloat64ToInt32(Node* value, Node* frame_state, 116 Node* effect, Node* control); 117 ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64(Node* value, 118 Node* frame_state, 119 Node* effect, 120 Node* control); 121 122 Node* ChangeInt32ToSmi(Node* value); 123 Node* ChangeUint32ToSmi(Node* value); 124 Node* ChangeInt32ToFloat64(Node* value); 125 Node* ChangeUint32ToFloat64(Node* value); 126 Node* ChangeSmiToInt32(Node* value); 127 Node* ObjectIsSmi(Node* value); 128 129 Node* SmiMaxValueConstant(); 130 Node* SmiShiftBitsConstant(); 131 132 Factory* factory() const; 133 Isolate* isolate() const; 134 JSGraph* jsgraph() const { return js_graph_; } 135 Graph* graph() const; 136 Schedule* schedule() const { return schedule_; } 137 Zone* temp_zone() const { return temp_zone_; } 138 CommonOperatorBuilder* common() const; 139 SimplifiedOperatorBuilder* simplified() const; 140 MachineOperatorBuilder* machine() const; 141 142 Operator const* ToNumberOperator(); 143 144 JSGraph* js_graph_; 145 Schedule* schedule_; 146 Zone* temp_zone_; 147 RegionObservability region_observability_ = RegionObservability::kObservable; 148 149 SetOncePointer<Operator const> to_number_operator_; 150}; 151 152} // namespace compiler 153} // namespace internal 154} // namespace v8 155 156#endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ 157