summaryrefslogtreecommitdiff
path: root/compiler/optimizing/superblock_cloner.cc
diff options
context:
space:
mode:
author Artem Serov <artem.serov@linaro.org> 2017-10-19 16:18:07 +0100
committer Artem Serov <artem.serov@linaro.org> 2018-04-17 16:09:05 +0100
commit72411e6b3b286d91e4da894cd5b12e7a3dc88f40 (patch)
tree9bffb94a66fb5df1df05a53afa367406d069c773 /compiler/optimizing/superblock_cloner.cc
parentddc694267aee845c9b61779be2a5487eb65b1757 (diff)
ART: Implement scalar loop peeling.
Implement scalar loop peeling for invariant exits elimination (on arm64). If the loop exit condition is loop invariant then loop peeling + GVN + DCE can eliminate this exit in the loop body. Note: GVN and DCE aren't applied during loop optimizations. Note: this functionality is turned off by default now. Test: test-art-host, test-art-target, boot-to-gui. Change-Id: I98d20054a431838b452dc06bd25c075eb445960c
Diffstat (limited to 'compiler/optimizing/superblock_cloner.cc')
-rw-r--r--compiler/optimizing/superblock_cloner.cc21
1 files changed, 9 insertions, 12 deletions
diff --git a/compiler/optimizing/superblock_cloner.cc b/compiler/optimizing/superblock_cloner.cc
index ee74f1001f..fad7729956 100644
--- a/compiler/optimizing/superblock_cloner.cc
+++ b/compiler/optimizing/superblock_cloner.cc
@@ -28,11 +28,6 @@ using HInstructionMap = SuperblockCloner::HInstructionMap;
using HBasicBlockSet = SuperblockCloner::HBasicBlockSet;
using HEdgeSet = SuperblockCloner::HEdgeSet;
-// When doing peeling we can choose whether to keep original loop (made of original basic blocks)
-// and form a peeled iteration of the copy blocks (preserve the header) or transfer original loop
-// blocks to the peeled iteration and create new loop from the copy blocks. Similar for unrolling.
-static const bool kPeelUnrollPreserveHeader = true;
-
void HEdge::Dump(std::ostream& stream) const {
stream << "(" << from_ << "->" << to_ << ")";
}
@@ -926,16 +921,12 @@ void CollectRemappingInfoForPeelUnroll(bool to_unroll,
remap_orig_internal->Insert(e);
remap_copy_internal->Insert(e);
} else {
- if (kPeelUnrollPreserveHeader) {
- remap_copy_internal->Insert(e);
- } else {
- remap_orig_internal->Insert(e);
- }
+ remap_copy_internal->Insert(e);
}
}
// Set up remap_incoming edges set.
- if (to_unroll != kPeelUnrollPreserveHeader) {
+ if (!to_unroll) {
remap_incoming->Insert(HEdge(loop_info->GetPreHeader(), loop_header));
}
}
@@ -992,6 +983,9 @@ HBasicBlock* PeelUnrollHelper::DoPeelUnrollImpl(bool to_unroll) {
DCHECK(!loop_info_->IsIrreducible());
HBasicBlock* loop_header = loop_info_->GetHeader();
+ // Check that loop info is up-to-date.
+ DCHECK(loop_info_ == loop_header->GetLoopInformation());
+
HGraph* graph = loop_header->GetGraph();
ArenaAllocator allocator(graph->GetAllocator()->GetArenaPool());
@@ -1009,7 +1003,10 @@ HBasicBlock* PeelUnrollHelper::DoPeelUnrollImpl(bool to_unroll) {
cloner_.Run();
cloner_.CleanUp();
- return kPeelUnrollPreserveHeader ? loop_header : cloner_.GetBlockCopy(loop_header);
+ // Check that loop info is preserved.
+ DCHECK(loop_info_ == loop_header->GetLoopInformation());
+
+ return loop_header;
}
PeelUnrollSimpleHelper::PeelUnrollSimpleHelper(HLoopInformation* info)