From c1bbd04dce9c0a839df39231a6473be3cca8b709 Mon Sep 17 00:00:00 2001 From: "kmillikin@chromium.org" Date: Wed, 26 Jan 2011 17:32:02 +0000 Subject: [PATCH] Remove the HInstruction utilities taking flag mask arguments. It is a type error to treat a flag (an enum) as if it were a flag mask (an int derived from shifting a bit by the enum value). It is error prone to have functions that take flag mask arguments because they will silently accept flags. Review URL: http://codereview.chromium.org/6373011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6500 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-instructions.cc | 6 +- src/hydrogen-instructions.h | 158 ++++++----------------------------- 2 files changed, 28 insertions(+), 136 deletions(-) diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index f89665ef00..2f8b6e263d 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -529,7 +529,7 @@ void HInstruction::Verify() { HCall::HCall(int count) : arguments_(Zone::NewArray(count), count) { for (int i = 0; i < count; ++i) arguments_[i] = NULL; set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } @@ -1124,10 +1124,10 @@ void HCompare::PrintDataTo(StringStream* stream) const { void HCompare::SetInputRepresentation(Representation r) { input_representation_ = r; if (r.IsTagged()) { - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); ClearFlag(kUseGVN); } else { - ClearFlagMask(AllSideEffects()); + ClearAllSideEffects(); SetFlag(kUseGVN); } } diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index 3de393f2ed..2a1af66622 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -46,112 +46,6 @@ class LInstruction; class LChunkBuilder; -// Type hierarchy: -// -// HValue -// HInstruction -// HAccessArgumentsAt -// HApplyArguments -// HArgumentsElements -// HArgumentsLength -// HArgumentsObject -// HBinaryOperation -// HArithmeticBinaryOperation -// HAdd -// HDiv -// HMod -// HMul -// HSub -// HBitwiseBinaryOperation -// HBitAnd -// HBitOr -// HBitXor -// HSar -// HShl -// HShr -// HBoundsCheck -// HCompare -// HCompareJSObjectEq -// HInstanceOf -// HInstanceOfKnownGlobal -// HLoadKeyed -// HLoadKeyedFastElement -// HLoadKeyedGeneric -// HPower -// HStoreNamed -// HStoreNamedField -// HStoreNamedGeneric -// HStringCharCodeAt -// HBlockEntry -// HCall -// HCallConstantFunction -// HCallFunction -// HCallGlobal -// HCallKeyed -// HCallKnownGlobal -// HCallNamed -// HCallNew -// HCallRuntime -// HCallStub -// HCheckPrototypeMaps -// HConstant -// HControlInstruction -// HDeoptimize -// HGoto -// HUnaryControlInstruction -// HCompareMap -// HReturn -// HTest -// HThrow -// HEnterInlined -// HFunctionLiteral -// HGlobalObject -// HGlobalReceiver -// HLeaveInlined -// HLoadContextSlot -// HLoadGlobal -// HMaterializedLiteral -// HArrayLiteral -// HObjectLiteral -// HRegExpLiteral -// HOsrEntry -// HParameter -// HSimulate -// HStackCheck -// HStoreKeyed -// HStoreKeyedFastElement -// HStoreKeyedGeneric -// HUnaryOperation -// HBitNot -// HChange -// HCheckFunction -// HCheckInstanceType -// HCheckMap -// HCheckNonSmi -// HCheckSmi -// HDeleteProperty -// HFixedArrayLength -// HJSArrayLength -// HLoadElements -// HLoadFunctionPrototype -// HLoadNamedField -// HLoadNamedGeneric -// HPushArgument -// HStringLength -// HTypeof -// HUnaryMathOperation -// HUnaryPredicate -// HClassOfTest -// HHasCachedArrayIndex -// HHasInstanceType -// HIsNull -// HIsObject -// HIsSmi -// HTypeofIs -// HValueOf -// HUnknownOSRValue -// HPhi - #define HYDROGEN_ALL_INSTRUCTION_LIST(V) \ V(ArithmeticBinaryOperation) \ V(BinaryOperation) \ @@ -572,11 +466,6 @@ class HValue: public ZoneObject { return flags << kChangesToDependsFlagsLeftShift; } - // A flag mask to mark an instruction as having arbitrary side effects. - static int AllSideEffects() { - return ChangesFlagsMask() & ~(1 << kChangesOsrEntries); - } - static HValue* cast(HValue* value) { return value; } enum Opcode { @@ -635,9 +524,6 @@ class HValue: public ZoneObject { return NULL; } - bool HasSideEffects() const { - return (flags_ & AllSideEffects()) != 0; - } bool IsDefinedAfter(HBasicBlock* other) const; // Operands. @@ -660,12 +546,13 @@ class HValue: public ZoneObject { void Delete(); int flags() const { return flags_; } - void SetFlagMask(int mask) { flags_ |= mask; } - void SetFlag(Flag f) { SetFlagMask(1 << f); } - void ClearFlagMask(int mask) { flags_ &= ~mask; } - void ClearFlag(Flag f) { ClearFlagMask(1 << f); } - bool CheckFlag(Flag f) const { return CheckFlagMask(1 << f); } - bool CheckFlagMask(int mask) const { return (flags_ & mask) != 0; } + void SetFlag(Flag f) { flags_ |= (1 << f); } + void ClearFlag(Flag f) { flags_ &= ~(1 << f); } + bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; } + + void SetAllSideEffects() { flags_ |= AllSideEffects(); } + void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); } + bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; } Range* range() const { return range_; } bool HasRange() const { return range_ != NULL; } @@ -739,6 +626,11 @@ class HValue: public ZoneObject { } private: + // A flag mask to mark an instruction as having arbitrary side effects. + static int AllSideEffects() { + return ChangesFlagsMask() & ~(1 << kChangesOsrEntries); + } + void InternalReplaceAtUse(HValue* use, HValue* other); void RegisterUse(int index, HValue* new_value); @@ -2073,7 +1965,7 @@ class HBitwiseBinaryOperation: public HBinaryOperation { : HBinaryOperation(left, right) { set_representation(Representation::Tagged()); SetFlag(kFlexibleRepresentation); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } virtual Representation RequiredInputRepresentation(int index) const { @@ -2083,7 +1975,7 @@ class HBitwiseBinaryOperation: public HBinaryOperation { virtual void RepresentationChanged(Representation to) { if (!to.IsTagged()) { ASSERT(to.IsInteger32()); - ClearFlagMask(AllSideEffects()); + ClearAllSideEffects(); SetFlag(kTruncatingToInt32); SetFlag(kUseGVN); } @@ -2101,12 +1993,12 @@ class HArithmeticBinaryOperation: public HBinaryOperation { : HBinaryOperation(left, right) { set_representation(Representation::Tagged()); SetFlag(kFlexibleRepresentation); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } virtual void RepresentationChanged(Representation to) { if (!to.IsTagged()) { - ClearFlagMask(AllSideEffects()); + ClearAllSideEffects(); SetFlag(kUseGVN); } } @@ -2132,7 +2024,7 @@ class HCompare: public HBinaryOperation { : HBinaryOperation(left, right), token_(token) { ASSERT(Token::IsCompareOp(token)); set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } void SetInputRepresentation(Representation r); @@ -2329,7 +2221,7 @@ class HInstanceOf: public HBinaryOperation { public: HInstanceOf(HValue* left, HValue* right) : HBinaryOperation(left, right) { set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } virtual bool EmitAtUses() const { return uses()->length() <= 1; } @@ -2347,7 +2239,7 @@ class HInstanceOfKnownGlobal: public HUnaryOperation { HInstanceOfKnownGlobal(HValue* left, Handle right) : HUnaryOperation(left), function_(right) { set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } Handle function() { return function_; } @@ -2614,7 +2506,7 @@ class HCallStub: public HInstruction { argument_count_(argument_count), transcendental_type_(TranscendentalCache::kNumberOfCaches) { set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } CodeStub::Major major_key() { return major_key_; } @@ -2778,7 +2670,7 @@ class HLoadNamedGeneric: public HUnaryOperation { HLoadNamedGeneric(HValue* object, Handle name) : HUnaryOperation(object), name_(name) { set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } HValue* object() const { return OperandAt(0); } @@ -2859,7 +2751,7 @@ class HLoadKeyedFastElement: public HLoadKeyed { class HLoadKeyedGeneric: public HLoadKeyed { public: HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") @@ -2940,7 +2832,7 @@ class HStoreNamedGeneric: public HStoreNamed { public: HStoreNamedGeneric(HValue* obj, Handle name, HValue* val) : HStoreNamed(obj, name, val) { - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic") @@ -3005,7 +2897,7 @@ class HStoreKeyedGeneric: public HStoreKeyed { public: HStoreKeyedGeneric(HValue* obj, HValue* key, HValue* val) : HStoreKeyed(obj, key, val) { - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") @@ -3194,7 +3086,7 @@ class HDeleteProperty: public HBinaryOperation { HDeleteProperty(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { set_representation(Representation::Tagged()); - SetFlagMask(AllSideEffects()); + SetAllSideEffects(); } virtual Representation RequiredInputRepresentation(int index) const {