| Index: src/compiler/simplified-operator.cc
|
| diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc
|
| index 5c5e8010ffa23645190077ff30ec4699435b3aec..2c2fac594afe5e7bf0a50972ea54c9a573481eba 100644
|
| --- a/src/compiler/simplified-operator.cc
|
| +++ b/src/compiler/simplified-operator.cc
|
| @@ -309,6 +309,8 @@ CompareOperationHints::Hint CompareOperationHintOf(const Operator* op) {
|
| V(SpeculativeNumberModulus)
|
|
|
| #define CHECKED_OP_LIST(V) \
|
| + V(CheckTaggedPointer) \
|
| + V(CheckTaggedSigned) \
|
| V(CheckedUint32ToInt32) \
|
| V(CheckedFloat64ToInt32) \
|
| V(CheckedTaggedToInt32) \
|
| @@ -328,8 +330,9 @@ struct SimplifiedOperatorGlobalCache final {
|
| #define CHECKED(Name) \
|
| struct Name##Operator final : public Operator { \
|
| Name##Operator() \
|
| - : Operator(IrOpcode::k##Name, Operator::kPure, #Name, 1, 1, 1, 1, 1, \
|
| - 0) {} \
|
| + : Operator(IrOpcode::k##Name, \
|
| + Operator::kFoldable | Operator::kNoThrow, #Name, 1, 1, 1, \
|
| + 1, 1, 0) {} \
|
| }; \
|
| Name##Operator k##Name;
|
| CHECKED_OP_LIST(CHECKED)
|
| @@ -339,9 +342,10 @@ struct SimplifiedOperatorGlobalCache final {
|
| struct CheckFloat64HoleNaNOperatortor final
|
| : public Operator1<CheckFloat64HoleMode> {
|
| CheckFloat64HoleNaNOperatortor()
|
| - : Operator1<CheckFloat64HoleMode>(IrOpcode::kCheckFloat64Hole,
|
| - Operator::kPure, "CheckFloat64Hole",
|
| - 1, 1, 1, 1, 1, 0, kMode) {}
|
| + : Operator1<CheckFloat64HoleMode>(
|
| + IrOpcode::kCheckFloat64Hole,
|
| + Operator::kFoldable | Operator::kNoDeopt, "CheckFloat64Hole", 1,
|
| + 1, 1, 1, 1, 0, kMode) {}
|
| };
|
| CheckFloat64HoleNaNOperatortor<CheckFloat64HoleMode::kAllowReturnHole>
|
| kCheckFloat64HoleAllowReturnHoleOperator;
|
| @@ -351,9 +355,10 @@ struct SimplifiedOperatorGlobalCache final {
|
| template <CheckTaggedHoleMode kMode>
|
| struct CheckTaggedHoleOperator final : public Operator1<CheckTaggedHoleMode> {
|
| CheckTaggedHoleOperator()
|
| - : Operator1<CheckTaggedHoleMode>(IrOpcode::kCheckTaggedHole,
|
| - Operator::kPure, "CheckTaggedHole", 1,
|
| - 1, 1, 1, 1, 0, kMode) {}
|
| + : Operator1<CheckTaggedHoleMode>(
|
| + IrOpcode::kCheckTaggedHole,
|
| + Operator::kFoldable | Operator::kNoDeopt, "CheckTaggedHole", 1, 1,
|
| + 1, 1, 1, 0, kMode) {}
|
| };
|
| CheckTaggedHoleOperator<CheckTaggedHoleMode::kConvertHoleToUndefined>
|
| kCheckTaggedHoleConvertHoleToUndefinedOperator;
|
| @@ -362,16 +367,18 @@ struct SimplifiedOperatorGlobalCache final {
|
|
|
| struct CheckIfOperator final : public Operator {
|
| CheckIfOperator()
|
| - : Operator(IrOpcode::kCheckIf, Operator::kPure, "CheckIf", 1, 1, 1, 0,
|
| - 1, 0) {}
|
| + : Operator(IrOpcode::kCheckIf, Operator::kFoldable | Operator::kNoDeopt,
|
| + "CheckIf", 1, 1, 1, 0, 1, 0) {}
|
| };
|
| CheckIfOperator kCheckIf;
|
|
|
| template <PretenureFlag kPretenure>
|
| struct AllocateOperator final : public Operator1<PretenureFlag> {
|
| AllocateOperator()
|
| - : Operator1<PretenureFlag>(IrOpcode::kAllocate, Operator::kNoThrow,
|
| - "Allocate", 1, 1, 1, 1, 1, 0, kPretenure) {}
|
| + : Operator1<PretenureFlag>(
|
| + IrOpcode::kAllocate,
|
| + Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite,
|
| + "Allocate", 1, 1, 1, 1, 1, 0, kPretenure) {}
|
| };
|
| AllocateOperator<NOT_TENURED> kAllocateNotTenuredOperator;
|
| AllocateOperator<TENURED> kAllocateTenuredOperator;
|
| @@ -379,17 +386,19 @@ struct SimplifiedOperatorGlobalCache final {
|
| #define BUFFER_ACCESS(Type, type, TYPE, ctype, size) \
|
| struct LoadBuffer##Type##Operator final : public Operator1<BufferAccess> { \
|
| LoadBuffer##Type##Operator() \
|
| - : Operator1<BufferAccess>(IrOpcode::kLoadBuffer, \
|
| - Operator::kNoThrow | Operator::kNoWrite, \
|
| - "LoadBuffer", 3, 1, 1, 1, 1, 0, \
|
| - BufferAccess(kExternal##Type##Array)) {} \
|
| + : Operator1<BufferAccess>( \
|
| + IrOpcode::kLoadBuffer, \
|
| + Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
|
| + "LoadBuffer", 3, 1, 1, 1, 1, 0, \
|
| + BufferAccess(kExternal##Type##Array)) {} \
|
| }; \
|
| struct StoreBuffer##Type##Operator final : public Operator1<BufferAccess> { \
|
| StoreBuffer##Type##Operator() \
|
| - : Operator1<BufferAccess>(IrOpcode::kStoreBuffer, \
|
| - Operator::kNoRead | Operator::kNoThrow, \
|
| - "StoreBuffer", 4, 1, 1, 0, 1, 0, \
|
| - BufferAccess(kExternal##Type##Array)) {} \
|
| + : Operator1<BufferAccess>( \
|
| + IrOpcode::kStoreBuffer, \
|
| + Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
|
| + "StoreBuffer", 4, 1, 1, 0, 1, 0, \
|
| + BufferAccess(kExternal##Type##Array)) {} \
|
| }; \
|
| LoadBuffer##Type##Operator kLoadBuffer##Type; \
|
| StoreBuffer##Type##Operator kStoreBuffer##Type;
|
| @@ -451,8 +460,9 @@ const Operator* SimplifiedOperatorBuilder::ReferenceEqual(Type* type) {
|
|
|
| const Operator* SimplifiedOperatorBuilder::CheckBounds() {
|
| // TODO(bmeurer): Cache this operator. Make it pure!
|
| - return new (zone()) Operator(IrOpcode::kCheckBounds, Operator::kPure,
|
| - "CheckBounds", 2, 1, 1, 1, 1, 0);
|
| + return new (zone())
|
| + Operator(IrOpcode::kCheckBounds, Operator::kFoldable | Operator::kNoThrow,
|
| + "CheckBounds", 2, 1, 1, 1, 1, 0);
|
| }
|
|
|
| const Operator* SimplifiedOperatorBuilder::TypeGuard(Type* type) {
|
| @@ -509,11 +519,12 @@ const Operator* SimplifiedOperatorBuilder::StoreBuffer(BufferAccess access) {
|
| return nullptr;
|
| }
|
|
|
| -#define SPECULATIVE_BINOP_DEF(Name) \
|
| - const Operator* SimplifiedOperatorBuilder::Name( \
|
| - BinaryOperationHints::Hint hint) { \
|
| - return new (zone()) Operator1<BinaryOperationHints::Hint>( \
|
| - IrOpcode::k##Name, Operator::kPure, #Name, 2, 1, 1, 1, 1, 1, hint); \
|
| +#define SPECULATIVE_BINOP_DEF(Name) \
|
| + const Operator* SimplifiedOperatorBuilder::Name( \
|
| + BinaryOperationHints::Hint hint) { \
|
| + return new (zone()) Operator1<BinaryOperationHints::Hint>( \
|
| + IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, #Name, 2, \
|
| + 1, 1, 1, 1, 1, hint); \
|
| }
|
| SPECULATIVE_BINOP_LIST(SPECULATIVE_BINOP_DEF)
|
| #undef SPECULATIVE_BINOP_DEF
|
| @@ -521,21 +532,24 @@ SPECULATIVE_BINOP_LIST(SPECULATIVE_BINOP_DEF)
|
| const Operator* SimplifiedOperatorBuilder::SpeculativeNumberEqual(
|
| CompareOperationHints::Hint hint) {
|
| return new (zone()) Operator1<CompareOperationHints::Hint>(
|
| - IrOpcode::kSpeculativeNumberEqual, Operator::kPure,
|
| - "SpeculativeNumberEqual", 2, 1, 1, 1, 1, 1, hint);
|
| + IrOpcode::kSpeculativeNumberEqual,
|
| + Operator::kFoldable | Operator::kNoThrow, "SpeculativeNumberEqual", 2, 1,
|
| + 1, 1, 1, 1, hint);
|
| }
|
|
|
| const Operator* SimplifiedOperatorBuilder::SpeculativeNumberLessThan(
|
| CompareOperationHints::Hint hint) {
|
| return new (zone()) Operator1<CompareOperationHints::Hint>(
|
| - IrOpcode::kSpeculativeNumberLessThan, Operator::kPure,
|
| - "SpeculativeNumberLessThan", 2, 1, 1, 1, 1, 1, hint);
|
| + IrOpcode::kSpeculativeNumberLessThan,
|
| + Operator::kFoldable | Operator::kNoThrow, "SpeculativeNumberLessThan", 2,
|
| + 1, 1, 1, 1, 1, hint);
|
| }
|
|
|
| const Operator* SimplifiedOperatorBuilder::SpeculativeNumberLessThanOrEqual(
|
| CompareOperationHints::Hint hint) {
|
| return new (zone()) Operator1<CompareOperationHints::Hint>(
|
| - IrOpcode::kSpeculativeNumberLessThanOrEqual, Operator::kPure,
|
| + IrOpcode::kSpeculativeNumberLessThanOrEqual,
|
| + Operator::kFoldable | Operator::kNoThrow,
|
| "SpeculativeNumberLessThanOrEqual", 2, 1, 1, 1, 1, 1, hint);
|
| }
|
|
|
| @@ -545,12 +559,12 @@ const Operator* SimplifiedOperatorBuilder::SpeculativeNumberLessThanOrEqual(
|
| V(LoadElement, ElementAccess, Operator::kNoWrite, 2, 1, 1) \
|
| V(StoreElement, ElementAccess, Operator::kNoRead, 3, 1, 0)
|
|
|
| -
|
| #define ACCESS(Name, Type, properties, value_input_count, control_input_count, \
|
| output_count) \
|
| const Operator* SimplifiedOperatorBuilder::Name(const Type& access) { \
|
| return new (zone()) \
|
| - Operator1<Type>(IrOpcode::k##Name, Operator::kNoThrow | properties, \
|
| + Operator1<Type>(IrOpcode::k##Name, \
|
| + Operator::kNoDeopt | Operator::kNoThrow | properties, \
|
| #Name, value_input_count, 1, control_input_count, \
|
| output_count, 1, 0, access); \
|
| }
|
|
|