Index: src/hydrogen-gvn.cc |
diff --git a/src/hydrogen-gvn.cc b/src/hydrogen-gvn.cc |
index 6bf5a1b68e4fc3a2a8cdcaf02da63e614c63e1ee..4c98015bee1ef86d9ff7fc2f2c646c4e60e7fd82 100644 |
--- a/src/hydrogen-gvn.cc |
+++ b/src/hydrogen-gvn.cc |
@@ -367,15 +367,28 @@ void HSideEffectMap::Store(SideEffects side_effects, HInstruction* instr) { |
SideEffects SideEffectsTracker::ComputeChanges(HInstruction* instr) { |
+ int index; |
SideEffects result(instr->ChangesFlags()); |
+ if (result.ContainsFlag(kGlobalVars)) { |
+ if (instr->IsStoreGlobalCell() && |
+ ComputeGlobalVar(HStoreGlobalCell::cast(instr)->cell(), &index)) { |
+ result.RemoveFlag(kGlobalVars); |
+ result.AddSpecial(GlobalVar(index)); |
+ } else { |
+ for (index = 0; index < kNumberOfGlobalVars; ++index) { |
+ result.AddSpecial(GlobalVar(index)); |
+ } |
+ } |
+ } |
if (result.ContainsFlag(kInobjectFields)) { |
- int index; |
if (instr->IsStoreNamedField() && |
ComputeInobjectField(HStoreNamedField::cast(instr)->access(), &index)) { |
result.RemoveFlag(kInobjectFields); |
- result.AddSpecial(index); |
+ result.AddSpecial(InobjectField(index)); |
} else { |
- result.AddAllSpecial(); |
+ for (index = 0; index < kNumberOfInobjectFields; ++index) { |
+ result.AddSpecial(InobjectField(index)); |
+ } |
} |
} |
return result; |
@@ -383,15 +396,28 @@ SideEffects SideEffectsTracker::ComputeChanges(HInstruction* instr) { |
SideEffects SideEffectsTracker::ComputeDependsOn(HInstruction* instr) { |
+ int index; |
SideEffects result(instr->DependsOnFlags()); |
+ if (result.ContainsFlag(kGlobalVars)) { |
+ if (instr->IsLoadGlobalCell() && |
+ ComputeGlobalVar(HLoadGlobalCell::cast(instr)->cell(), &index)) { |
+ result.RemoveFlag(kGlobalVars); |
+ result.AddSpecial(GlobalVar(index)); |
+ } else { |
+ for (index = 0; index < kNumberOfGlobalVars; ++index) { |
+ result.AddSpecial(GlobalVar(index)); |
+ } |
+ } |
+ } |
if (result.ContainsFlag(kInobjectFields)) { |
- int index; |
if (instr->IsLoadNamedField() && |
ComputeInobjectField(HLoadNamedField::cast(instr)->access(), &index)) { |
result.RemoveFlag(kInobjectFields); |
- result.AddSpecial(index); |
+ result.AddSpecial(InobjectField(index)); |
} else { |
- result.AddAllSpecial(); |
+ for (index = 0; index < kNumberOfInobjectFields; ++index) { |
+ result.AddSpecial(InobjectField(index)); |
+ } |
} |
} |
return result; |
@@ -420,8 +446,15 @@ GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG) |
} |
} |
} |
+ for (int index = 0; index < num_global_vars_; ++index) { |
+ if (side_effects.ContainsSpecial(GlobalVar(index))) { |
+ stream->Add(separator); |
+ separator = ", "; |
+ stream->Add("[%p]", *global_vars_[index].handle()); |
+ } |
+ } |
for (int index = 0; index < num_inobject_fields_; ++index) { |
- if (side_effects.ContainsSpecial(index)) { |
+ if (side_effects.ContainsSpecial(InobjectField(index))) { |
stream->Add(separator); |
separator = ", "; |
inobject_fields_[index].PrintTo(stream); |
@@ -431,6 +464,29 @@ GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG) |
} |
+bool SideEffectsTracker::ComputeGlobalVar(Unique<Cell> cell, int* index) { |
+ for (int i = 0; i < num_global_vars_; ++i) { |
+ if (cell == global_vars_[i]) { |
+ *index = i; |
+ return true; |
+ } |
+ } |
+ if (num_global_vars_ < kNumberOfGlobalVars) { |
+ if (FLAG_trace_gvn) { |
+ HeapStringAllocator allocator; |
+ StringStream stream(&allocator); |
+ stream.Add("Tracking global var [%p] (mapped to index %d)\n", |
+ *cell.handle(), num_global_vars_); |
+ stream.OutputToStdOut(); |
+ } |
+ *index = num_global_vars_; |
+ global_vars_[num_global_vars_++] = cell; |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+ |
bool SideEffectsTracker::ComputeInobjectField(HObjectAccess access, |
int* index) { |
for (int i = 0; i < num_inobject_fields_; ++i) { |
@@ -439,13 +495,13 @@ bool SideEffectsTracker::ComputeInobjectField(HObjectAccess access, |
return true; |
} |
} |
- if (num_inobject_fields_ < SideEffects::kNumberOfSpecials) { |
+ if (num_inobject_fields_ < kNumberOfInobjectFields) { |
if (FLAG_trace_gvn) { |
HeapStringAllocator allocator; |
StringStream stream(&allocator); |
stream.Add("Tracking inobject field access "); |
access.PrintTo(&stream); |
- stream.Add(" (mapped to special index %d)\n", num_inobject_fields_); |
+ stream.Add(" (mapped to index %d)\n", num_inobject_fields_); |
stream.OutputToStdOut(); |
} |
*index = num_inobject_fields_; |