diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-05-12 16:11:02 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-05-13 09:06:14 +0100 |
commit | 622d9c31febd950255b36a48b47e1f630197c5fe (patch) | |
tree | 8a7f14ce3c6c087955ad5fe91a3ce7d5b5a82461 /compiler/optimizing/ssa_builder.cc | |
parent | 98a8a542f95e41c09d214a329a940b270f08f5b3 (diff) | |
download | art-622d9c31febd950255b36a48b47e1f630197c5fe.zip art-622d9c31febd950255b36a48b47e1f630197c5fe.tar.gz art-622d9c31febd950255b36a48b47e1f630197c5fe.tar.bz2 |
Add loop recognition and CFG simplifications in new compiler.
We do three simplifications:
- Split critical edges, for code generation from SSA (new).
- Ensure one back edge per loop, to simplify loop recognition (new).
- Ensure only one pre header for a loop, to simplify SSA creation (existing).
Change-Id: I9bfccd4b236a00486a261078627b091c8a68be33
Diffstat (limited to 'compiler/optimizing/ssa_builder.cc')
-rw-r--r-- | compiler/optimizing/ssa_builder.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/compiler/optimizing/ssa_builder.cc b/compiler/optimizing/ssa_builder.cc index ee1e1e4..1fc041c 100644 --- a/compiler/optimizing/ssa_builder.cc +++ b/compiler/optimizing/ssa_builder.cc @@ -32,8 +32,8 @@ void SsaBuilder::BuildSsa() { HBasicBlock* block = loop_headers_.Get(i); for (HInstructionIterator it(*block->GetPhis()); !it.Done(); it.Advance()) { HPhi* phi = it.Current()->AsPhi(); - for (size_t pred = 0; pred < block->GetPredecessors()->Size(); pred++) { - phi->AddInput(ValueOfLocal(block->GetPredecessors()->Get(pred), phi->GetRegNumber())); + for (size_t pred = 0; pred < block->GetPredecessors().Size(); pred++) { + phi->AddInput(ValueOfLocal(block->GetPredecessors().Get(pred), phi->GetRegNumber())); } } } @@ -75,14 +75,14 @@ void SsaBuilder::VisitBasicBlock(HBasicBlock* block) { // Save the loop header so that the last phase of the analysis knows which // blocks need to be updated. loop_headers_.Add(block); - } else if (block->GetPredecessors()->Size() > 0) { + } else if (block->GetPredecessors().Size() > 0) { // All predecessors have already been visited because we are visiting in reverse post order. // We merge the values of all locals, creating phis if those values differ. for (size_t local = 0; local < current_locals_->Size(); local++) { bool is_different = false; - HInstruction* value = ValueOfLocal(block->GetPredecessors()->Get(0), local); - for (size_t i = 1; i < block->GetPredecessors()->Size(); i++) { - if (ValueOfLocal(block->GetPredecessors()->Get(i), local) != value) { + HInstruction* value = ValueOfLocal(block->GetPredecessors().Get(0), local); + for (size_t i = 1; i < block->GetPredecessors().Size(); i++) { + if (ValueOfLocal(block->GetPredecessors().Get(i), local) != value) { is_different = true; break; } @@ -90,9 +90,9 @@ void SsaBuilder::VisitBasicBlock(HBasicBlock* block) { if (is_different) { // TODO: Compute union type. HPhi* phi = new (GetGraph()->GetArena()) HPhi( - GetGraph()->GetArena(), local, block->GetPredecessors()->Size(), Primitive::kPrimVoid); - for (size_t i = 0; i < block->GetPredecessors()->Size(); i++) { - phi->SetRawInputAt(i, ValueOfLocal(block->GetPredecessors()->Get(i), local)); + GetGraph()->GetArena(), local, block->GetPredecessors().Size(), Primitive::kPrimVoid); + for (size_t i = 0; i < block->GetPredecessors().Size(); i++) { + phi->SetRawInputAt(i, ValueOfLocal(block->GetPredecessors().Get(i), local)); } block->AddPhi(phi); value = phi; |