Revision: 19115
Author: [email protected]
Date: Wed Feb 5 17:21:34 2014 UTC
Log: Perform a fix point iteration for GVN.
BUG=
[email protected]
Review URL: https://codereview.chromium.org/149573014
http://code.google.com/p/v8/source/detail?r=19115
Modified:
/branches/bleeding_edge/src/flag-definitions.h
/branches/bleeding_edge/src/hydrogen-gvn.cc
/branches/bleeding_edge/src/hydrogen-gvn.h
/branches/bleeding_edge/src/hydrogen-instructions.cc
/branches/bleeding_edge/src/hydrogen-instructions.h
=======================================
--- /branches/bleeding_edge/src/flag-definitions.h Mon Feb 3 07:57:07 2014
UTC
+++ /branches/bleeding_edge/src/flag-definitions.h Wed Feb 5 17:21:34 2014
UTC
@@ -247,6 +247,7 @@
DEFINE_string(hydrogen_filter, "*", "optimization filter")
DEFINE_bool(use_range, true, "use hydrogen range analysis")
DEFINE_bool(use_gvn, true, "use hydrogen global value numbering")
+DEFINE_int(gvn_iterations, 3, "maximum number of GVN fix-point iterations")
DEFINE_bool(use_canonicalizing, true, "use hydrogen instruction
canonicalizing")
DEFINE_bool(use_inlining, true, "use function inlining")
DEFINE_bool(use_escape_analysis, true, "use hydrogen escape analysis")
=======================================
--- /branches/bleeding_edge/src/hydrogen-gvn.cc Mon Dec 9 07:41:20 2013 UTC
+++ /branches/bleeding_edge/src/hydrogen-gvn.cc Wed Feb 5 17:21:34 2014 UTC
@@ -374,7 +374,19 @@
zone());
loop_side_effects_.AddBlock(GVNFlagSet(), graph->blocks()->length(),
zone());
- }
+}
+
+
+void HGlobalValueNumberingPhase::Reset() {
+ block_side_effects_.Clear();
+ loop_side_effects_.Clear();
+ visited_on_paths_.Clear();
+ block_side_effects_.AddBlock(GVNFlagSet(), graph()->blocks()->length(),
+ zone());
+ loop_side_effects_.AddBlock(GVNFlagSet(), graph()->blocks()->length(),
+ zone());
+}
+
void HGlobalValueNumberingPhase::Analyze() {
removed_side_effects_ = false;
@@ -791,7 +803,9 @@
instr->Mnemonic(),
other->id(),
other->Mnemonic());
- instr->HandleSideEffectDominator(changes_flag, other);
+ if (instr->HandleSideEffectDominator(changes_flag, other)) {
+ removed_side_effects_ = true;
+ }
}
}
}
=======================================
--- /branches/bleeding_edge/src/hydrogen-gvn.h Fri Aug 9 18:40:10 2013 UTC
+++ /branches/bleeding_edge/src/hydrogen-gvn.h Wed Feb 5 17:21:34 2014 UTC
@@ -42,17 +42,16 @@
explicit HGlobalValueNumberingPhase(HGraph* graph);
void Run() {
- Analyze();
- // Trigger a second analysis pass to further eliminate duplicate values
- // that could only be discovered by removing side-effect-generating
- // instructions during the first pass.
- if (FLAG_smi_only_arrays && removed_side_effects_) {
+ int max_fixpoint_iteration_count = FLAG_gvn_iterations;
+ for (int i = 0; i < max_fixpoint_iteration_count; i++) {
Analyze();
- // TODO(danno): Turn this into a fixpoint iteration.
+ if (!removed_side_effects_) break;
+ Reset();
}
}
private:
+ void Reset();
void Analyze();
GVNFlagSet CollectSideEffectsOnPathsToDominatedBlock(
HBasicBlock* dominator,
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Wed Feb 5
09:30:53 2014 UTC
+++ /branches/bleeding_edge/src/hydrogen-instructions.cc Wed Feb 5
17:21:34 2014 UTC
@@ -1514,7 +1514,7 @@
}
-void HCheckMaps::HandleSideEffectDominator(GVNFlag side_effect,
+bool HCheckMaps::HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) {
ASSERT(side_effect == kChangesMaps);
// TODO(mstarzinger): For now we specialize on HStoreNamedField, but once
@@ -1522,13 +1522,14 @@
// for which the map is known.
if (HasNoUses() && dominator->IsStoreNamedField()) {
HStoreNamedField* store = HStoreNamedField::cast(dominator);
- if (!store->has_transition() || store->object() != value()) return;
+ if (!store->has_transition() || store->object() != value()) return
false;
HConstant* transition = HConstant::cast(store->transition());
if (map_set_.Contains(transition->GetUnique())) {
DeleteAndReplaceWith(NULL);
- return;
+ return true;
}
}
+ return false;
}
@@ -3409,11 +3410,11 @@
}
-void HAllocate::HandleSideEffectDominator(GVNFlag side_effect,
+bool HAllocate::HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) {
ASSERT(side_effect == kChangesNewSpacePromotion);
Zone* zone = block()->zone();
- if (!FLAG_use_allocation_folding) return;
+ if (!FLAG_use_allocation_folding) return false;
// Try to fold allocations together with their dominating allocations.
if (!dominator->IsAllocate()) {
@@ -3421,7 +3422,7 @@
PrintF("#%d (%s) cannot fold into #%d (%s)\n",
id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
}
- return;
+ return false;
}
HAllocate* dominator_allocate = HAllocate::cast(dominator);
@@ -3435,12 +3436,12 @@
PrintF("#%d (%s) cannot fold into #%d (%s), dynamic allocation
size\n",
id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
}
- return;
+ return false;
}
dominator_allocate = GetFoldableDominator(dominator_allocate);
if (dominator_allocate == NULL) {
- return;
+ return false;
}
ASSERT((IsNewSpaceAllocation() &&
@@ -3477,7 +3478,7 @@
id(), Mnemonic(), dominator_allocate->id(),
dominator_allocate->Mnemonic(), new_dominator_size);
}
- return;
+ return false;
}
HInstruction* new_dominator_size_constant =
HConstant::CreateAndInsertBefore(
@@ -3525,6 +3526,7 @@
id(), Mnemonic(), dominator_allocate->id(),
dominator_allocate->Mnemonic());
}
+ return true;
}
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Wed Feb 5 15:22:54
2014 UTC
+++ /branches/bleeding_edge/src/hydrogen-instructions.h Wed Feb 5 17:21:34
2014 UTC
@@ -875,9 +875,11 @@
// This function must be overridden for instructions which have the
// kTrackSideEffectDominators flag set, to track instructions that are
// dominating side effects.
- virtual void HandleSideEffectDominator(GVNFlag side_effect,
+ // It returns true if it removed an instruction which had side effects.
+ virtual bool HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) {
UNREACHABLE();
+ return false;
}
// Check if this instruction has some reason that prevents elimination.
@@ -2680,7 +2682,7 @@
virtual Representation RequiredInputRepresentation(int index)
V8_OVERRIDE {
return Representation::Tagged();
}
- virtual void HandleSideEffectDominator(GVNFlag side_effect,
+ virtual bool HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) V8_OVERRIDE;
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
@@ -5349,7 +5351,7 @@
flags_ = static_cast<HAllocate::Flags>(flags_ |
ALLOCATE_DOUBLE_ALIGNED);
}
- virtual void HandleSideEffectDominator(GVNFlag side_effect,
+ virtual bool HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) V8_OVERRIDE;
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
@@ -6461,10 +6463,11 @@
}
return Representation::Tagged();
}
- virtual void HandleSideEffectDominator(GVNFlag side_effect,
+ virtual bool HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) V8_OVERRIDE {
ASSERT(side_effect == kChangesNewSpacePromotion);
new_space_dominator_ = dominator;
+ return false;
}
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
@@ -6691,10 +6694,11 @@
return value()->IsConstant() && HConstant::cast(value())->IsTheHole();
}
- virtual void HandleSideEffectDominator(GVNFlag side_effect,
+ virtual bool HandleSideEffectDominator(GVNFlag side_effect,
HValue* dominator) V8_OVERRIDE {
ASSERT(side_effect == kChangesNewSpacePromotion);
new_space_dominator_ = dominator;
+ return false;
}
HValue* new_space_dominator() const { return new_space_dominator_; }
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.