Refactor HCheckMaps to have a private constructor, removing duplicated code and simplifying calls in clients.
Ignore bsuite directory. Review URL: https://codereview.chromium.org/14367023 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14362 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7155b96d41
commit
3575f97036
1
.gitignore
vendored
1
.gitignore
vendored
@ -19,6 +19,7 @@
|
||||
*~
|
||||
.cpplint-cache
|
||||
.d8_history
|
||||
bsuite
|
||||
d8
|
||||
d8_g
|
||||
shell
|
||||
|
@ -2680,39 +2680,27 @@ class HLoadExternalArrayPointer: public HUnaryOperation {
|
||||
|
||||
class HCheckMaps: public HTemplateInstruction<2> {
|
||||
public:
|
||||
HCheckMaps(HValue* value, Handle<Map> map, Zone* zone,
|
||||
HValue* typecheck = NULL)
|
||||
: map_unique_ids_(0, zone) {
|
||||
SetOperandAt(0, value);
|
||||
// If callers don't depend on a typecheck, they can pass in NULL. In that
|
||||
// case we use a copy of the |value| argument as a dummy value.
|
||||
SetOperandAt(1, typecheck != NULL ? typecheck : value);
|
||||
set_representation(Representation::Tagged());
|
||||
SetFlag(kUseGVN);
|
||||
SetFlag(kTrackSideEffectDominators);
|
||||
SetGVNFlag(kDependsOnMaps);
|
||||
SetGVNFlag(kDependsOnElementsKind);
|
||||
map_set()->Add(map, zone);
|
||||
}
|
||||
HCheckMaps(HValue* value, SmallMapList* maps, Zone* zone)
|
||||
: map_unique_ids_(0, zone) {
|
||||
SetOperandAt(0, value);
|
||||
SetOperandAt(1, value);
|
||||
set_representation(Representation::Tagged());
|
||||
SetFlag(kUseGVN);
|
||||
SetFlag(kTrackSideEffectDominators);
|
||||
SetGVNFlag(kDependsOnMaps);
|
||||
SetGVNFlag(kDependsOnElementsKind);
|
||||
for (int i = 0; i < maps->length(); i++) {
|
||||
map_set()->Add(maps->at(i), zone);
|
||||
}
|
||||
map_set()->Sort();
|
||||
static HCheckMaps* New(HValue* value, Handle<Map> map, Zone* zone,
|
||||
HValue *typecheck = NULL) {
|
||||
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
|
||||
check_map->map_set_.Add(map, zone);
|
||||
return check_map;
|
||||
}
|
||||
|
||||
static HCheckMaps* NewWithTransitions(HValue* object, Handle<Map> map,
|
||||
static HCheckMaps* New(HValue* value, SmallMapList* maps, Zone* zone,
|
||||
HValue *typecheck = NULL) {
|
||||
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
|
||||
for (int i = 0; i < maps->length(); i++) {
|
||||
check_map->map_set_.Add(maps->at(i), zone);
|
||||
}
|
||||
check_map->map_set_.Sort();
|
||||
return check_map;
|
||||
}
|
||||
|
||||
static HCheckMaps* NewWithTransitions(HValue* value, Handle<Map> map,
|
||||
Zone* zone) {
|
||||
HCheckMaps* check_map = new(zone) HCheckMaps(object, map, zone);
|
||||
SmallMapList* map_set = check_map->map_set();
|
||||
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, value);
|
||||
check_map->map_set_.Add(map, zone);
|
||||
|
||||
// Since transitioned elements maps of the initial map don't fail the map
|
||||
// check, the CheckMaps instruction doesn't need to depend on ElementsKinds.
|
||||
@ -2725,10 +2713,10 @@ class HCheckMaps: public HTemplateInstruction<2> {
|
||||
Map* transitioned_map =
|
||||
map->LookupElementsTransitionMap(kind);
|
||||
if (transitioned_map) {
|
||||
map_set->Add(Handle<Map>(transitioned_map), zone);
|
||||
check_map->map_set_.Add(Handle<Map>(transitioned_map), zone);
|
||||
}
|
||||
};
|
||||
map_set->Sort();
|
||||
check_map->map_set_.Sort();
|
||||
return check_map;
|
||||
}
|
||||
|
||||
@ -2763,6 +2751,20 @@ class HCheckMaps: public HTemplateInstruction<2> {
|
||||
}
|
||||
|
||||
private:
|
||||
// Clients should use one of the static New* methods above.
|
||||
HCheckMaps(HValue* value, Zone *zone, HValue* typecheck)
|
||||
: map_unique_ids_(0, zone) {
|
||||
SetOperandAt(0, value);
|
||||
// Use the object value for the dependency if NULL is passed.
|
||||
// TODO(titzer): do GVN flags already express this dependency?
|
||||
SetOperandAt(1, typecheck != NULL ? typecheck : value);
|
||||
set_representation(Representation::Tagged());
|
||||
SetFlag(kUseGVN);
|
||||
SetFlag(kTrackSideEffectDominators);
|
||||
SetGVNFlag(kDependsOnMaps);
|
||||
SetGVNFlag(kDependsOnElementsKind);
|
||||
}
|
||||
|
||||
SmallMapList map_set_;
|
||||
ZoneList<UniqueValueId> map_unique_ids_;
|
||||
};
|
||||
|
@ -1077,7 +1077,7 @@ HValue* HGraphBuilder::BuildCheckNonSmi(HValue* obj) {
|
||||
|
||||
HValue* HGraphBuilder::BuildCheckMap(HValue* obj,
|
||||
Handle<Map> map) {
|
||||
HCheckMaps* check = new(zone()) HCheckMaps(obj, map, zone());
|
||||
HCheckMaps* check = HCheckMaps::New(obj, map, zone());
|
||||
AddInstruction(check);
|
||||
return check;
|
||||
}
|
||||
@ -1293,7 +1293,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
||||
AddInstruction(new(zone) HLoadElements(object, mapcheck));
|
||||
if (is_store && (fast_elements || fast_smi_only_elements) &&
|
||||
store_mode != STORE_NO_TRANSITION_HANDLE_COW) {
|
||||
HCheckMaps* check_cow_map = new(zone) HCheckMaps(
|
||||
HCheckMaps* check_cow_map = HCheckMaps::New(
|
||||
elements, isolate()->factory()->fixed_array_map(), zone);
|
||||
check_cow_map->ClearGVNFlag(kDependsOnElementsKind);
|
||||
AddInstruction(check_cow_map);
|
||||
@ -1370,7 +1370,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
||||
elements = BuildCopyElementsOnWrite(object, elements, elements_kind,
|
||||
length);
|
||||
} else {
|
||||
HCheckMaps* check_cow_map = new(zone) HCheckMaps(
|
||||
HCheckMaps* check_cow_map = HCheckMaps::New(
|
||||
elements, isolate()->factory()->fixed_array_map(), zone);
|
||||
check_cow_map->ClearGVNFlag(kDependsOnElementsKind);
|
||||
AddInstruction(check_cow_map);
|
||||
@ -6651,7 +6651,7 @@ static int ComputeLoadStoreFieldIndex(Handle<Map> type,
|
||||
|
||||
void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) {
|
||||
AddInstruction(new(zone()) HCheckNonSmi(object));
|
||||
AddInstruction(new(zone()) HCheckMaps(object, map, zone()));
|
||||
AddInstruction(HCheckMaps::New(object, map, zone()));
|
||||
}
|
||||
|
||||
|
||||
@ -6780,7 +6780,7 @@ bool HOptimizedGraphBuilder::HandlePolymorphicArrayLengthLoad(
|
||||
AddInstruction(new(zone()) HCheckNonSmi(object));
|
||||
|
||||
HInstruction* typecheck =
|
||||
AddInstruction(new(zone()) HCheckMaps(object, types, zone()));
|
||||
AddInstruction(HCheckMaps::New(object, types, zone()));
|
||||
HInstruction* instr =
|
||||
HLoadNamedField::NewArrayLength(zone(), object, typecheck);
|
||||
instr->set_position(expr->position());
|
||||
@ -6832,7 +6832,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr,
|
||||
AddInstruction(new(zone()) HCheckNonSmi(object));
|
||||
HInstruction* instr;
|
||||
if (count == types->length() && is_monomorphic_field) {
|
||||
AddInstruction(new(zone()) HCheckMaps(object, types, zone()));
|
||||
AddInstruction(HCheckMaps::New(object, types, zone()));
|
||||
instr = BuildLoadNamedField(object, map, &lookup);
|
||||
} else {
|
||||
HValue* context = environment()->LookupContext();
|
||||
@ -7509,8 +7509,7 @@ HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess(
|
||||
Handle<Map> map,
|
||||
bool is_store,
|
||||
KeyedAccessStoreMode store_mode) {
|
||||
HCheckMaps* mapcheck = new(zone()) HCheckMaps(object, map,
|
||||
zone(), dependency);
|
||||
HCheckMaps* mapcheck = HCheckMaps::New(object, map, zone(), dependency);
|
||||
AddInstruction(mapcheck);
|
||||
if (dependency) {
|
||||
mapcheck->ClearGVNFlag(kDependsOnElementsKind);
|
||||
@ -7567,7 +7566,7 @@ HInstruction* HOptimizedGraphBuilder::TryBuildConsolidatedElementLoad(
|
||||
}
|
||||
if (!has_double_maps && !has_smi_or_object_maps) return NULL;
|
||||
|
||||
HCheckMaps* check_maps = new(zone()) HCheckMaps(object, maps, zone());
|
||||
HCheckMaps* check_maps = HCheckMaps::New(object, maps, zone());
|
||||
AddInstruction(check_maps);
|
||||
HInstruction* instr = BuildUncheckedMonomorphicElementAccess(
|
||||
object, key, val, check_maps,
|
||||
@ -7719,7 +7718,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
|
||||
HInstruction* access;
|
||||
if (IsFastElementsKind(elements_kind)) {
|
||||
if (is_store && !IsFastDoubleElementsKind(elements_kind)) {
|
||||
AddInstruction(new(zone()) HCheckMaps(
|
||||
AddInstruction(HCheckMaps::New(
|
||||
elements, isolate()->factory()->fixed_array_map(),
|
||||
zone(), elements_kind_branch));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user