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
This commit is contained in:
parent
09e967b38f
commit
c1bbd04dce
@ -529,7 +529,7 @@ void HInstruction::Verify() {
|
|||||||
HCall::HCall(int count) : arguments_(Zone::NewArray<HValue*>(count), count) {
|
HCall::HCall(int count) : arguments_(Zone::NewArray<HValue*>(count), count) {
|
||||||
for (int i = 0; i < count; ++i) arguments_[i] = NULL;
|
for (int i = 0; i < count; ++i) arguments_[i] = NULL;
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1124,10 +1124,10 @@ void HCompare::PrintDataTo(StringStream* stream) const {
|
|||||||
void HCompare::SetInputRepresentation(Representation r) {
|
void HCompare::SetInputRepresentation(Representation r) {
|
||||||
input_representation_ = r;
|
input_representation_ = r;
|
||||||
if (r.IsTagged()) {
|
if (r.IsTagged()) {
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
ClearFlag(kUseGVN);
|
ClearFlag(kUseGVN);
|
||||||
} else {
|
} else {
|
||||||
ClearFlagMask(AllSideEffects());
|
ClearAllSideEffects();
|
||||||
SetFlag(kUseGVN);
|
SetFlag(kUseGVN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,112 +46,6 @@ class LInstruction;
|
|||||||
class LChunkBuilder;
|
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) \
|
#define HYDROGEN_ALL_INSTRUCTION_LIST(V) \
|
||||||
V(ArithmeticBinaryOperation) \
|
V(ArithmeticBinaryOperation) \
|
||||||
V(BinaryOperation) \
|
V(BinaryOperation) \
|
||||||
@ -572,11 +466,6 @@ class HValue: public ZoneObject {
|
|||||||
return flags << kChangesToDependsFlagsLeftShift;
|
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; }
|
static HValue* cast(HValue* value) { return value; }
|
||||||
|
|
||||||
enum Opcode {
|
enum Opcode {
|
||||||
@ -635,9 +524,6 @@ class HValue: public ZoneObject {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasSideEffects() const {
|
|
||||||
return (flags_ & AllSideEffects()) != 0;
|
|
||||||
}
|
|
||||||
bool IsDefinedAfter(HBasicBlock* other) const;
|
bool IsDefinedAfter(HBasicBlock* other) const;
|
||||||
|
|
||||||
// Operands.
|
// Operands.
|
||||||
@ -660,12 +546,13 @@ class HValue: public ZoneObject {
|
|||||||
void Delete();
|
void Delete();
|
||||||
|
|
||||||
int flags() const { return flags_; }
|
int flags() const { return flags_; }
|
||||||
void SetFlagMask(int mask) { flags_ |= mask; }
|
void SetFlag(Flag f) { flags_ |= (1 << f); }
|
||||||
void SetFlag(Flag f) { SetFlagMask(1 << f); }
|
void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
|
||||||
void ClearFlagMask(int mask) { flags_ &= ~mask; }
|
bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
|
||||||
void ClearFlag(Flag f) { ClearFlagMask(1 << f); }
|
|
||||||
bool CheckFlag(Flag f) const { return CheckFlagMask(1 << f); }
|
void SetAllSideEffects() { flags_ |= AllSideEffects(); }
|
||||||
bool CheckFlagMask(int mask) const { return (flags_ & mask) != 0; }
|
void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); }
|
||||||
|
bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; }
|
||||||
|
|
||||||
Range* range() const { return range_; }
|
Range* range() const { return range_; }
|
||||||
bool HasRange() const { return range_ != NULL; }
|
bool HasRange() const { return range_ != NULL; }
|
||||||
@ -739,6 +626,11 @@ class HValue: public ZoneObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
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 InternalReplaceAtUse(HValue* use, HValue* other);
|
||||||
void RegisterUse(int index, HValue* new_value);
|
void RegisterUse(int index, HValue* new_value);
|
||||||
|
|
||||||
@ -2073,7 +1965,7 @@ class HBitwiseBinaryOperation: public HBinaryOperation {
|
|||||||
: HBinaryOperation(left, right) {
|
: HBinaryOperation(left, right) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlag(kFlexibleRepresentation);
|
SetFlag(kFlexibleRepresentation);
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Representation RequiredInputRepresentation(int index) const {
|
virtual Representation RequiredInputRepresentation(int index) const {
|
||||||
@ -2083,7 +1975,7 @@ class HBitwiseBinaryOperation: public HBinaryOperation {
|
|||||||
virtual void RepresentationChanged(Representation to) {
|
virtual void RepresentationChanged(Representation to) {
|
||||||
if (!to.IsTagged()) {
|
if (!to.IsTagged()) {
|
||||||
ASSERT(to.IsInteger32());
|
ASSERT(to.IsInteger32());
|
||||||
ClearFlagMask(AllSideEffects());
|
ClearAllSideEffects();
|
||||||
SetFlag(kTruncatingToInt32);
|
SetFlag(kTruncatingToInt32);
|
||||||
SetFlag(kUseGVN);
|
SetFlag(kUseGVN);
|
||||||
}
|
}
|
||||||
@ -2101,12 +1993,12 @@ class HArithmeticBinaryOperation: public HBinaryOperation {
|
|||||||
: HBinaryOperation(left, right) {
|
: HBinaryOperation(left, right) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlag(kFlexibleRepresentation);
|
SetFlag(kFlexibleRepresentation);
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void RepresentationChanged(Representation to) {
|
virtual void RepresentationChanged(Representation to) {
|
||||||
if (!to.IsTagged()) {
|
if (!to.IsTagged()) {
|
||||||
ClearFlagMask(AllSideEffects());
|
ClearAllSideEffects();
|
||||||
SetFlag(kUseGVN);
|
SetFlag(kUseGVN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2132,7 +2024,7 @@ class HCompare: public HBinaryOperation {
|
|||||||
: HBinaryOperation(left, right), token_(token) {
|
: HBinaryOperation(left, right), token_(token) {
|
||||||
ASSERT(Token::IsCompareOp(token));
|
ASSERT(Token::IsCompareOp(token));
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetInputRepresentation(Representation r);
|
void SetInputRepresentation(Representation r);
|
||||||
@ -2329,7 +2221,7 @@ class HInstanceOf: public HBinaryOperation {
|
|||||||
public:
|
public:
|
||||||
HInstanceOf(HValue* left, HValue* right) : HBinaryOperation(left, right) {
|
HInstanceOf(HValue* left, HValue* right) : HBinaryOperation(left, right) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool EmitAtUses() const { return uses()->length() <= 1; }
|
virtual bool EmitAtUses() const { return uses()->length() <= 1; }
|
||||||
@ -2347,7 +2239,7 @@ class HInstanceOfKnownGlobal: public HUnaryOperation {
|
|||||||
HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
|
HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
|
||||||
: HUnaryOperation(left), function_(right) {
|
: HUnaryOperation(left), function_(right) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<JSFunction> function() { return function_; }
|
Handle<JSFunction> function() { return function_; }
|
||||||
@ -2614,7 +2506,7 @@ class HCallStub: public HInstruction {
|
|||||||
argument_count_(argument_count),
|
argument_count_(argument_count),
|
||||||
transcendental_type_(TranscendentalCache::kNumberOfCaches) {
|
transcendental_type_(TranscendentalCache::kNumberOfCaches) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeStub::Major major_key() { return major_key_; }
|
CodeStub::Major major_key() { return major_key_; }
|
||||||
@ -2778,7 +2670,7 @@ class HLoadNamedGeneric: public HUnaryOperation {
|
|||||||
HLoadNamedGeneric(HValue* object, Handle<Object> name)
|
HLoadNamedGeneric(HValue* object, Handle<Object> name)
|
||||||
: HUnaryOperation(object), name_(name) {
|
: HUnaryOperation(object), name_(name) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
HValue* object() const { return OperandAt(0); }
|
HValue* object() const { return OperandAt(0); }
|
||||||
@ -2859,7 +2751,7 @@ class HLoadKeyedFastElement: public HLoadKeyed {
|
|||||||
class HLoadKeyedGeneric: public HLoadKeyed {
|
class HLoadKeyedGeneric: public HLoadKeyed {
|
||||||
public:
|
public:
|
||||||
HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) {
|
HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) {
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
|
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
|
||||||
@ -2940,7 +2832,7 @@ class HStoreNamedGeneric: public HStoreNamed {
|
|||||||
public:
|
public:
|
||||||
HStoreNamedGeneric(HValue* obj, Handle<Object> name, HValue* val)
|
HStoreNamedGeneric(HValue* obj, Handle<Object> name, HValue* val)
|
||||||
: HStoreNamed(obj, name, val) {
|
: HStoreNamed(obj, name, val) {
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic")
|
DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic")
|
||||||
@ -3005,7 +2897,7 @@ class HStoreKeyedGeneric: public HStoreKeyed {
|
|||||||
public:
|
public:
|
||||||
HStoreKeyedGeneric(HValue* obj, HValue* key, HValue* val)
|
HStoreKeyedGeneric(HValue* obj, HValue* key, HValue* val)
|
||||||
: HStoreKeyed(obj, key, val) {
|
: HStoreKeyed(obj, key, val) {
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic")
|
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic")
|
||||||
@ -3194,7 +3086,7 @@ class HDeleteProperty: public HBinaryOperation {
|
|||||||
HDeleteProperty(HValue* obj, HValue* key)
|
HDeleteProperty(HValue* obj, HValue* key)
|
||||||
: HBinaryOperation(obj, key) {
|
: HBinaryOperation(obj, key) {
|
||||||
set_representation(Representation::Tagged());
|
set_representation(Representation::Tagged());
|
||||||
SetFlagMask(AllSideEffects());
|
SetAllSideEffects();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Representation RequiredInputRepresentation(int index) const {
|
virtual Representation RequiredInputRepresentation(int index) const {
|
||||||
|
Loading…
Reference in New Issue
Block a user