// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ #define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ #include "src/compiler/common-operator.h" #include "src/compiler/graph-assembler.h" #include "src/compiler/node.h" #include "src/compiler/simplified-operator.h" #include "src/globals.h" namespace v8 { namespace internal { // Forward declarations. class Callable; class Zone; namespace compiler { class CommonOperatorBuilder; class SimplifiedOperatorBuilder; class MachineOperatorBuilder; class JSGraph; class Graph; class Schedule; class SourcePositionTable; class NodeOriginTable; class V8_EXPORT_PRIVATE EffectControlLinearizer { public: enum MaskArrayIndexEnable { kDoNotMaskArrayIndex, kMaskArrayIndex }; EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone, SourcePositionTable* source_positions, NodeOriginTable* node_origins, MaskArrayIndexEnable mask_array_index); void Run(); private: void ProcessNode(Node* node, Node** frame_state, Node** effect, Node** control); bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect, Node** control); Node* LowerChangeBitToTagged(Node* node); Node* LowerChangeInt31ToTaggedSigned(Node* node); Node* LowerChangeInt32ToTagged(Node* node); Node* LowerChangeUint32ToTagged(Node* node); Node* LowerChangeFloat64ToTagged(Node* node); Node* LowerChangeFloat64ToTaggedPointer(Node* node); Node* LowerChangeTaggedSignedToInt32(Node* node); Node* LowerChangeTaggedToBit(Node* node); Node* LowerChangeTaggedToInt32(Node* node); Node* LowerChangeTaggedToUint32(Node* node); Node* LowerChangeTaggedToTaggedSigned(Node* node); Node* LowerCheckBounds(Node* node, Node* frame_state); Node* LowerPoisonIndex(Node* node); Node* LowerCheckInternalizedString(Node* node, Node* frame_state); void LowerCheckMaps(Node* node, Node* frame_state); Node* LowerCompareMaps(Node* node); Node* LowerCheckNumber(Node* node, Node* frame_state); Node* LowerCheckReceiver(Node* node, Node* frame_state); Node* LowerCheckString(Node* node, Node* frame_state); Node* LowerCheckSymbol(Node* node, Node* frame_state); void LowerCheckIf(Node* node, Node* frame_state); Node* LowerCheckedInt32Add(Node* node, Node* frame_state); Node* LowerCheckedInt32Sub(Node* node, Node* frame_state); Node* LowerCheckedInt32Div(Node* node, Node* frame_state); Node* LowerCheckedInt32Mod(Node* node, Node* frame_state); Node* LowerCheckedUint32Div(Node* node, Node* frame_state); Node* LowerCheckedUint32Mod(Node* node, Node* frame_state); Node* LowerCheckedInt32Mul(Node* node, Node* frame_state); Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state); Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state); Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state); Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state); Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state); Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state); Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state); Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state); Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state); Node* LowerChangeTaggedToFloat64(Node* node); void TruncateTaggedPointerToBit(Node* node, GraphAssemblerLabel<1>* done); Node* LowerTruncateTaggedToBit(Node* node); Node* LowerTruncateTaggedPointerToBit(Node* node); Node* LowerTruncateTaggedToFloat64(Node* node); Node* LowerTruncateTaggedToWord32(Node* node); Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state); Node* LowerAllocate(Node* node); Node* LowerNumberToString(Node* node); Node* LowerObjectIsArrayBufferView(Node* node); Node* LowerObjectIsBigInt(Node* node); Node* LowerObjectIsCallable(Node* node); Node* LowerObjectIsConstructor(Node* node); Node* LowerObjectIsDetectableCallable(Node* node); Node* LowerObjectIsMinusZero(Node* node); Node* LowerObjectIsNaN(Node* node); Node* LowerNumberIsNaN(Node* node); Node* LowerObjectIsNonCallable(Node* node); Node* LowerObjectIsNumber(Node* node); Node* LowerObjectIsReceiver(Node* node); Node* LowerObjectIsSmi(Node* node); Node* LowerObjectIsString(Node* node); Node* LowerObjectIsSymbol(Node* node); Node* LowerObjectIsUndetectable(Node* node); Node* LowerNumberIsFloat64Hole(Node* node); Node* LowerNumberIsFinite(Node* node); Node* LowerObjectIsFiniteNumber(Node* node); Node* LowerNumberIsInteger(Node* node); Node* LowerObjectIsInteger(Node* node); Node* LowerNumberIsSafeInteger(Node* node); Node* LowerObjectIsSafeInteger(Node* node); Node* LowerArgumentsFrame(Node* node); Node* LowerArgumentsLength(Node* node); Node* LowerNewDoubleElements(Node* node); Node* LowerNewSmiOrObjectElements(Node* node); Node* LowerNewArgumentsElements(Node* node); Node* LowerNewConsString(Node* node); Node* LowerArrayBufferWasNeutered(Node* node); Node* LowerSameValue(Node* node); Node* LowerDeadValue(Node* node); Node* LowerStringToNumber(Node* node); Node* LowerStringCharCodeAt(Node* node); Node* LowerStringCodePointAt(Node* node, UnicodeEncoding encoding); Node* LowerStringToLowerCaseIntl(Node* node); Node* LowerStringToUpperCaseIntl(Node* node); Node* LowerStringFromSingleCharCode(Node* node); Node* LowerStringFromSingleCodePoint(Node* node); Node* LowerStringIndexOf(Node* node); Node* LowerStringSubstring(Node* node); Node* LowerStringLength(Node* node); Node* LowerStringEqual(Node* node); Node* LowerStringLessThan(Node* node); Node* LowerStringLessThanOrEqual(Node* node); Node* LowerCheckFloat64Hole(Node* node, Node* frame_state); Node* LowerCheckNotTaggedHole(Node* node, Node* frame_state); Node* LowerConvertTaggedHoleToUndefined(Node* node); void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state); void LowerCheckEqualsSymbol(Node* node, Node* frame_state); Node* LowerTypeOf(Node* node); Node* LowerToBoolean(Node* node); Node* LowerPlainPrimitiveToNumber(Node* node); Node* LowerPlainPrimitiveToWord32(Node* node); Node* LowerPlainPrimitiveToFloat64(Node* node); Node* LowerEnsureWritableFastElements(Node* node); Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state); void LowerTransitionElementsKind(Node* node); Node* LowerLoadFieldByIndex(Node* node); Node* LowerLoadTypedElement(Node* node); Node* LowerLoadDataViewElement(Node* node); void LowerStoreTypedElement(Node* node); void LowerStoreDataViewElement(Node* node); void LowerStoreSignedSmallElement(Node* node); Node* LowerFindOrderedHashMapEntry(Node* node); Node* LowerFindOrderedHashMapEntryForInt32Key(Node* node); void LowerTransitionAndStoreElement(Node* node); void LowerTransitionAndStoreNumberElement(Node* node); void LowerTransitionAndStoreNonNumberElement(Node* node); void LowerRuntimeAbort(Node* node); Node* LowerConvertReceiver(Node* node); Node* LowerDateNow(Node* node); // Lowering of optional operators. Maybe LowerFloat64RoundUp(Node* node); Maybe LowerFloat64RoundDown(Node* node); Maybe LowerFloat64RoundTiesEven(Node* node); Maybe LowerFloat64RoundTruncate(Node* node); Node* AllocateHeapNumberWithValue(Node* node); Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, const VectorSlotPair& feedback, Node* value, Node* frame_state); Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode, const VectorSlotPair& feedback, Node* value, Node* frame_state); Node* BuildFloat64RoundDown(Node* value); Node* BuildFloat64RoundTruncate(Node* input); Node* ComputeIntegerHash(Node* value); Node* LowerStringComparison(Callable const& callable, Node* node); Node* IsElementsKindGreaterThan(Node* kind, ElementsKind reference_kind); Node* ChangeInt32ToSmi(Node* value); Node* ChangeInt32ToIntPtr(Node* value); Node* ChangeIntPtrToInt32(Node* value); Node* ChangeUint32ToUintPtr(Node* value); Node* ChangeUint32ToSmi(Node* value); Node* ChangeSmiToIntPtr(Node* value); Node* ChangeSmiToInt32(Node* value); Node* ObjectIsSmi(Node* value); Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte); Node* SmiMaxValueConstant(); Node* SmiShiftBitsConstant(); void TransitionElementsTo(Node* node, Node* array, ElementsKind from, ElementsKind to); Factory* factory() const; Isolate* isolate() const; JSGraph* jsgraph() const { return js_graph_; } Graph* graph() const; Schedule* schedule() const { return schedule_; } Zone* temp_zone() const { return temp_zone_; } CommonOperatorBuilder* common() const; SimplifiedOperatorBuilder* simplified() const; MachineOperatorBuilder* machine() const; GraphAssembler* gasm() { return &graph_assembler_; } JSGraph* js_graph_; Schedule* schedule_; Zone* temp_zone_; MaskArrayIndexEnable mask_array_index_; RegionObservability region_observability_ = RegionObservability::kObservable; SourcePositionTable* source_positions_; NodeOriginTable* node_origins_; GraphAssembler graph_assembler_; Node* frame_state_zapper_; // For tracking down compiler::Node::New crashes. }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_