diff options
author | 2019-04-29 10:55:09 +0100 | |
---|---|---|
committer | 2019-04-30 09:49:17 +0000 | |
commit | 256c94b568f35f8f23feaaf9ea0d64ed1edab1d4 (patch) | |
tree | 1f03dfa6f05ee6d4fc2c0a534ff8b5d5031c80cc /compiler/optimizing/superblock_cloner.h | |
parent | 7711c35fa603b86d520991c4e97ca297add81881 (diff) |
Update induction ranges in superblock cloner.
Because loop unrolling is part of a general loop optimization pass,
it needs to update induction ranges as it will invalidate its
instruction cache with new instructions.
Bug: 131174583
Test: 696-loop
Change-Id: Id3628efe316b58f69abbd9ebd43e891a8e42529f
Diffstat (limited to 'compiler/optimizing/superblock_cloner.h')
-rw-r--r-- | compiler/optimizing/superblock_cloner.h | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/compiler/optimizing/superblock_cloner.h b/compiler/optimizing/superblock_cloner.h index dbe9008e92..ece0914ddb 100644 --- a/compiler/optimizing/superblock_cloner.h +++ b/compiler/optimizing/superblock_cloner.h @@ -24,6 +24,8 @@ namespace art { +class InductionVarRange; + static const bool kSuperblockClonerLogging = false; // Represents an edge between two HBasicBlocks. @@ -140,7 +142,8 @@ class SuperblockCloner : public ValueObject { SuperblockCloner(HGraph* graph, const HBasicBlockSet* orig_bb_set, HBasicBlockMap* bb_map, - HInstructionMap* hir_map); + HInstructionMap* hir_map, + InductionVarRange* induction_range); // Sets edge successor remapping info specified by corresponding edge sets. void SetSuccessorRemappingInfo(const HEdgeSet* remap_orig_internal, @@ -309,6 +312,10 @@ class SuperblockCloner : public ValueObject { // Resolves the inputs of the phi. void ResolvePhi(HPhi* phi); + // Update induction range after when fixing SSA. + void UpdateInductionRangeInfoOf( + HInstruction* user, HInstruction* old_instruction, HInstruction* replacement); + // // Debug and logging methods. // @@ -339,6 +346,9 @@ class SuperblockCloner : public ValueObject { HBasicBlockMap* bb_map_; // Correspondence map for instructions: (original HInstruction, copy HInstruction). HInstructionMap* hir_map_; + // As a result of cloning, the induction range analysis information can be invalidated + // and must be updated. If not null, the cloner updates it for changed instructions. + InductionVarRange* induction_range_; // Area in the graph for which control flow (back edges, loops, dominators) needs to be adjusted. HLoopInformation* outer_loop_; HBasicBlockSet outer_loop_bb_set_; @@ -357,11 +367,12 @@ class SuperblockCloner : public ValueObject { // basic blocks/instructions are demanded. class PeelUnrollHelper : public ValueObject { public: - explicit PeelUnrollHelper(HLoopInformation* info, - SuperblockCloner::HBasicBlockMap* bb_map, - SuperblockCloner::HInstructionMap* hir_map) : + PeelUnrollHelper(HLoopInformation* info, + SuperblockCloner::HBasicBlockMap* bb_map, + SuperblockCloner::HInstructionMap* hir_map, + InductionVarRange* induction_range) : loop_info_(info), - cloner_(info->GetHeader()->GetGraph(), &info->GetBlocks(), bb_map, hir_map) { + cloner_(info->GetHeader()->GetGraph(), &info->GetBlocks(), bb_map, hir_map, induction_range) { // For now do peeling/unrolling only for natural loops. DCHECK(!info->IsIrreducible()); } @@ -395,7 +406,7 @@ class PeelUnrollHelper : public ValueObject { // original and copied basic blocks/instructions. class PeelUnrollSimpleHelper : public ValueObject { public: - explicit PeelUnrollSimpleHelper(HLoopInformation* info); + PeelUnrollSimpleHelper(HLoopInformation* info, InductionVarRange* induction_range); bool IsLoopClonable() const { return helper_.IsLoopClonable(); } HBasicBlock* DoPeeling() { return helper_.DoPeeling(); } HBasicBlock* DoUnrolling() { return helper_.DoUnrolling(); } |