Remove extranous holder load in some prototype-chain checking cases
R=ulan@chromium.org Review URL: https://codereview.chromium.org/13620003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14136 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
a293d7dd27
commit
cb650a51de
@ -1933,7 +1933,7 @@ LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
|
||||
LUnallocated* temp1 = TempRegister();
|
||||
LOperand* temp2 = TempRegister();
|
||||
LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp1, temp2);
|
||||
return AssignEnvironment(Define(result, temp1));
|
||||
return AssignEnvironment(result);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2239,7 +2239,7 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<1, 0, 2> {
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 2> {
|
||||
public:
|
||||
LCheckPrototypeMaps(LOperand* temp, LOperand* temp2) {
|
||||
temps_[0] = temp;
|
||||
|
@ -5541,7 +5541,6 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
ASSERT(instr->temp()->Equals(instr->result()));
|
||||
Register prototype_reg = ToRegister(instr->temp());
|
||||
Register map_reg = ToRegister(instr->temp2());
|
||||
|
||||
@ -5554,8 +5553,6 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
for (int i = 0; i < maps->length(); i++) {
|
||||
prototype_maps_.Add(maps->at(i), info()->zone());
|
||||
}
|
||||
__ LoadHeapObject(prototype_reg,
|
||||
prototypes->at(prototypes->length() - 1));
|
||||
} else {
|
||||
for (int i = 0; i < prototypes->length(); i++) {
|
||||
__ LoadHeapObject(prototype_reg, prototypes->at(i));
|
||||
|
@ -7113,8 +7113,10 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
|
||||
Handle<JSObject> holder(lookup.holder());
|
||||
Handle<Map> holder_map(holder->map());
|
||||
AddCheckMap(object, map);
|
||||
HInstruction* holder_value = AddInstruction(
|
||||
AddInstruction(
|
||||
new(zone()) HCheckPrototypeMaps(prototype, holder, zone()));
|
||||
HValue* holder_value = AddInstruction(
|
||||
new(zone()) HConstant(holder, Representation::Tagged()));
|
||||
return BuildLoadNamedField(holder_value, holder_map, &lookup);
|
||||
}
|
||||
|
||||
|
@ -5415,7 +5415,6 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
ASSERT(instr->temp()->Equals(instr->result()));
|
||||
Register reg = ToRegister(instr->temp());
|
||||
|
||||
ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
|
||||
@ -5423,15 +5422,10 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
|
||||
ASSERT(prototypes->length() == maps->length());
|
||||
|
||||
// TODO(ulan): Move this check to hydrogen and split HCheckPrototypeMaps
|
||||
// into two instruction: one that checks the prototypes and another that
|
||||
// loads the holder (HConstant). Find a way to do it without breaking
|
||||
// parallel recompilation.
|
||||
if (instr->hydrogen()->CanOmitPrototypeChecks()) {
|
||||
for (int i = 0; i < maps->length(); i++) {
|
||||
prototype_maps_.Add(maps->at(i), info()->zone());
|
||||
}
|
||||
__ LoadHeapObject(reg, prototypes->at(prototypes->length() - 1));
|
||||
} else {
|
||||
for (int i = 0; i < prototypes->length(); i++) {
|
||||
__ LoadHeapObject(reg, prototypes->at(i));
|
||||
|
@ -1947,7 +1947,7 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
|
||||
LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
|
||||
LUnallocated* temp = TempRegister();
|
||||
LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp);
|
||||
return AssignEnvironment(Define(result, temp));
|
||||
return AssignEnvironment(result);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2313,7 +2313,7 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<1, 0, 1> {
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
|
||||
public:
|
||||
explicit LCheckPrototypeMaps(LOperand* temp) {
|
||||
temps_[0] = temp;
|
||||
|
@ -4977,7 +4977,6 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
ASSERT(instr->temp()->Equals(instr->result()));
|
||||
Register reg = ToRegister(instr->temp());
|
||||
|
||||
ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
|
||||
@ -4989,7 +4988,6 @@ void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
|
||||
for (int i = 0; i < maps->length(); i++) {
|
||||
prototype_maps_.Add(maps->at(i), info()->zone());
|
||||
}
|
||||
__ LoadHeapObject(reg, prototypes->at(prototypes->length() - 1));
|
||||
} else {
|
||||
for (int i = 0; i < prototypes->length(); i++) {
|
||||
__ LoadHeapObject(reg, prototypes->at(i));
|
||||
|
@ -1843,7 +1843,7 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
|
||||
LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
|
||||
LUnallocated* temp = TempRegister();
|
||||
LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp);
|
||||
return AssignEnvironment(Define(result, temp));
|
||||
return AssignEnvironment(result);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2158,7 +2158,7 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<1, 0, 1> {
|
||||
class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
|
||||
public:
|
||||
explicit LCheckPrototypeMaps(LOperand* temp) {
|
||||
temps_[0] = temp;
|
||||
|
Loading…
Reference in New Issue
Block a user