diff options
Diffstat (limited to 'compiler/optimizing/induction_var_analysis.h')
-rw-r--r-- | compiler/optimizing/induction_var_analysis.h | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/compiler/optimizing/induction_var_analysis.h b/compiler/optimizing/induction_var_analysis.h index 616100b068..09417722da 100644 --- a/compiler/optimizing/induction_var_analysis.h +++ b/compiler/optimizing/induction_var_analysis.h @@ -119,9 +119,13 @@ class HInductionVarAnalysis : public HOptimization { }; - InductionInfo* CreateInvariantOp(InductionOp op, InductionInfo* a, InductionInfo* b) { + InductionInfo* CreateInvariantOp(const HBasicBlock* context, + const HLoopInformation* loop, + InductionOp op, + InductionInfo* a, + InductionInfo* b) { DCHECK(((op != kNeg && a != nullptr) || (op == kNeg && a == nullptr)) && b != nullptr); - return CreateSimplifiedInvariant(op, a, b); + return CreateSimplifiedInvariant(context, loop, op, a, b); } InductionInfo* CreateInvariantFetch(HInstruction* f) { @@ -149,29 +153,38 @@ class HInductionVarAnalysis : public HOptimization { } // Methods for analysis. - void VisitLoop(HLoopInformation* loop); - size_t TryVisitNodes(HLoopInformation* loop, + void VisitLoop(const HLoopInformation* loop); + size_t TryVisitNodes(const HLoopInformation* loop, HInstruction* start_instruction, size_t global_depth, /*inout*/ ScopedArenaSafeMap<HInstruction*, NodeInfo>* visited_instructions); void ExtractScc(ArrayRef<const StackEntry> stack_tail, ScopedArenaVector<HInstruction*>* scc); - void ClassifyTrivial(HLoopInformation* loop, HInstruction* instruction); - void ClassifyNonTrivial(HLoopInformation* loop, ArrayRef<const StackEntry> stack_tail); + void ClassifyTrivial(const HLoopInformation* loop, HInstruction* instruction); + void ClassifyNonTrivial(const HLoopInformation* loop, ArrayRef<const StackEntry> stack_tail); InductionInfo* RotatePeriodicInduction(InductionInfo* induction, InductionInfo* last, DataType::Type type); // Transfer operations. - InductionInfo* TransferPhi(HLoopInformation* loop, + InductionInfo* TransferPhi(const HLoopInformation* loop, HInstruction* phi, size_t input_index, size_t adjust_input_size); - InductionInfo* TransferAddSub(InductionInfo* a, + InductionInfo* TransferAddSub(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* a, InductionInfo* b, InductionOp op, DataType::Type type); - InductionInfo* TransferNeg(InductionInfo* a, DataType::Type type); - InductionInfo* TransferMul(InductionInfo* a, InductionInfo* b, DataType::Type type); + InductionInfo* TransferNeg(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* a, + DataType::Type type); + InductionInfo* TransferMul(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* a, + InductionInfo* b, + DataType::Type type); InductionInfo* TransferConversion(InductionInfo* a, DataType::Type from, DataType::Type to); // Solvers. @@ -179,12 +192,12 @@ class HInductionVarAnalysis : public HOptimization { size_t input_index, size_t adjust_input_size, const ScopedArenaSafeMap<HInstruction*, InductionInfo*>& cycle); - InductionInfo* SolvePhiAllInputs(HLoopInformation* loop, + InductionInfo* SolvePhiAllInputs(const HLoopInformation* loop, HInstruction* entry_phi, HInstruction* phi, const ScopedArenaSafeMap<HInstruction*, InductionInfo*>& cycle, DataType::Type type); - InductionInfo* SolveAddSub(HLoopInformation* loop, + InductionInfo* SolveAddSub(const HLoopInformation* loop, HInstruction* entry_phi, HInstruction* instruction, HInstruction* x, @@ -192,19 +205,19 @@ class HInductionVarAnalysis : public HOptimization { InductionOp op, const ScopedArenaSafeMap<HInstruction*, InductionInfo*>& cycle, DataType::Type type); - InductionInfo* SolveOp(HLoopInformation* loop, + InductionInfo* SolveOp(const HLoopInformation* loop, HInstruction* entry_phi, HInstruction* instruction, HInstruction* x, HInstruction* y, InductionOp op, DataType::Type type); - InductionInfo* SolveTest(HLoopInformation* loop, + InductionInfo* SolveTest(const HLoopInformation* loop, HInstruction* entry_phi, HInstruction* instruction, int64_t opposite_value, DataType::Type type); - InductionInfo* SolveConversion(HLoopInformation* loop, + InductionInfo* SolveConversion(const HLoopInformation* loop, HInstruction* entry_phi, HTypeConversion* conversion, const ScopedArenaSafeMap<HInstruction*, InductionInfo*>& cycle, @@ -215,31 +228,42 @@ class HInductionVarAnalysis : public HOptimization { // // Trip count information. - void VisitControl(HLoopInformation* loop); - void VisitCondition(HLoopInformation* loop, + void VisitControl(const HLoopInformation* loop); + void VisitCondition(const HBasicBlock* context, + const HLoopInformation* loop, HBasicBlock* body, InductionInfo* a, InductionInfo* b, DataType::Type type, IfCondition cmp); - void VisitTripCount(HLoopInformation* loop, + void VisitTripCount(const HBasicBlock* context, + const HLoopInformation* loop, InductionInfo* lower_expr, InductionInfo* upper_expr, InductionInfo* stride, int64_t stride_value, DataType::Type type, IfCondition cmp); - bool IsTaken(InductionInfo* lower_expr, InductionInfo* upper_expr, IfCondition cmp); - bool IsFinite(InductionInfo* upper_expr, + bool IsTaken(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* lower_expr, + InductionInfo* upper_expr, + IfCondition cmp); + bool IsFinite(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* upper_expr, int64_t stride_value, DataType::Type type, IfCondition cmp); - bool FitsNarrowerControl(InductionInfo* lower_expr, + bool FitsNarrowerControl(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* lower_expr, InductionInfo* upper_expr, int64_t stride_value, DataType::Type type, IfCondition cmp); - bool RewriteBreakLoop(HLoopInformation* loop, + bool RewriteBreakLoop(const HBasicBlock* context, + const HLoopInformation* loop, HBasicBlock* body, int64_t stride_value, DataType::Type type); @@ -249,20 +273,33 @@ class HInductionVarAnalysis : public HOptimization { // // Assign and lookup. - void AssignInfo(HLoopInformation* loop, HInstruction* instruction, InductionInfo* info); - InductionInfo* LookupInfo(HLoopInformation* loop, HInstruction* instruction); + void AssignInfo(const HLoopInformation* loop, HInstruction* instruction, InductionInfo* info); + InductionInfo* LookupInfo(const HLoopInformation* loop, HInstruction* instruction); InductionInfo* CreateConstant(int64_t value, DataType::Type type); - InductionInfo* CreateSimplifiedInvariant(InductionOp op, InductionInfo* a, InductionInfo* b); - HInstruction* GetShiftConstant(HLoopInformation* loop, + InductionInfo* CreateSimplifiedInvariant(const HBasicBlock* context, + const HLoopInformation* loop, + InductionOp op, + InductionInfo* a, + InductionInfo* b); + HInstruction* GetShiftConstant(const HLoopInformation* loop, HInstruction* instruction, InductionInfo* initial); void AssignCycle(HPhi* phi, ArrayRef<HInstruction* const> scc); ArenaSet<HInstruction*>* LookupCycle(HPhi* phi); // Constants. - bool IsExact(InductionInfo* info, /*out*/ int64_t* value); - bool IsAtMost(InductionInfo* info, /*out*/ int64_t* value); - bool IsAtLeast(InductionInfo* info, /*out*/ int64_t* value); + bool IsExact(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* info, + /*out*/int64_t* value); + bool IsAtMost(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* info, + /*out*/int64_t* value); + bool IsAtLeast(const HBasicBlock* context, + const HLoopInformation* loop, + InductionInfo* info, + /*out*/int64_t* value); // Helpers. static bool IsNarrowingLinear(InductionInfo* info); @@ -274,7 +311,7 @@ class HInductionVarAnalysis : public HOptimization { * Maintains the results of the analysis as a mapping from loops to a mapping from instructions * to the induction information for that instruction in that loop. */ - ArenaSafeMap<HLoopInformation*, ArenaSafeMap<HInstruction*, InductionInfo*>> induction_; + ArenaSafeMap<const HLoopInformation*, ArenaSafeMap<HInstruction*, InductionInfo*>> induction_; /** * Preserves induction cycle information for each loop-phi. |