summaryrefslogtreecommitdiff
path: root/compiler/optimizing/induction_var_range.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/induction_var_range.h')
-rw-r--r--compiler/optimizing/induction_var_range.h120
1 files changed, 74 insertions, 46 deletions
diff --git a/compiler/optimizing/induction_var_range.h b/compiler/optimizing/induction_var_range.h
index 906dc6bb7b..552837c044 100644
--- a/compiler/optimizing/induction_var_range.h
+++ b/compiler/optimizing/induction_var_range.h
@@ -58,13 +58,13 @@ class InductionVarRange {
explicit InductionVarRange(HInductionVarAnalysis* induction);
/**
- * Given a context denoted by the first instruction, returns a possibly conservative lower
+ * Given a context block, returns a possibly conservative lower
* and upper bound on the instruction's value in the output parameters min_val and max_val,
* respectively. The need_finite_test flag denotes if an additional finite-test is needed
* to protect the range evaluation inside its loop. The parameter chase_hint defines an
* instruction at which chasing may stop. Returns false on failure.
*/
- bool GetInductionRange(HInstruction* context,
+ bool GetInductionRange(const HBasicBlock* context,
HInstruction* instruction,
HInstruction* chase_hint,
/*out*/ Value* min_val,
@@ -77,7 +77,7 @@ class InductionVarRange {
* and need_taken test flags denote if an additional finite-test and/or taken-test
* are needed to protect the range evaluation inside its loop.
*/
- bool CanGenerateRange(HInstruction* context,
+ bool CanGenerateRange(const HBasicBlock* context,
HInstruction* instruction,
/*out*/ bool* needs_finite_test,
/*out*/ bool* needs_taken_test);
@@ -97,7 +97,7 @@ class InductionVarRange {
*
* Precondition: CanGenerateRange() returns true.
*/
- void GenerateRange(HInstruction* context,
+ void GenerateRange(const HBasicBlock* context,
HInstruction* instruction,
HGraph* graph,
HBasicBlock* block,
@@ -105,12 +105,12 @@ class InductionVarRange {
/*out*/ HInstruction** upper);
/**
- * Generates explicit taken-test for the loop in the given context. Code is generated in
+ * Generates explicit taken-test for the given `loop_control` instruction. Code is generated in
* given block and graph. Returns generated taken-test.
*
* Precondition: CanGenerateRange() returns true and needs_taken_test is set.
*/
- HInstruction* GenerateTakenTest(HInstruction* context, HGraph* graph, HBasicBlock* block);
+ HInstruction* GenerateTakenTest(HInstruction* loop_control, HGraph* graph, HBasicBlock* block);
/**
* Returns true if induction analysis is able to generate code for last value of
@@ -135,7 +135,7 @@ class InductionVarRange {
/**
* Incrementally updates induction information for just the given loop.
*/
- void ReVisit(HLoopInformation* loop) {
+ void ReVisit(const HLoopInformation* loop) {
induction_analysis_->induction_.erase(loop);
for (HInstructionIterator it(loop->GetHeader()->GetPhis()); !it.Done(); it.Advance()) {
induction_analysis_->cycles_.erase(it.Current()->AsPhi());
@@ -164,12 +164,12 @@ class InductionVarRange {
* Checks if header logic of a loop terminates. If trip count is known sets 'trip_count' to its
* value.
*/
- bool IsFinite(HLoopInformation* loop, /*out*/ int64_t* trip_count) const;
+ bool IsFinite(const HLoopInformation* loop, /*out*/ int64_t* trip_count) const;
/**
* Checks if a trip count is known for the loop and sets 'trip_count' to its value in this case.
*/
- bool HasKnownTripCount(HLoopInformation* loop, /*out*/ int64_t* trip_count) const;
+ bool HasKnownTripCount(const HLoopInformation* loop, /*out*/ int64_t* trip_count) const;
/**
* Checks if the given instruction is a unit stride induction inside the closest enveloping
@@ -177,7 +177,7 @@ class InductionVarRange {
* as context and the index as instruction to make sure the stride is tested against the
* loop that envelops the reference the closest). Returns invariant offset on success.
*/
- bool IsUnitStride(HInstruction* context,
+ bool IsUnitStride(const HBasicBlock* context,
HInstruction* instruction,
HGraph* graph,
/*out*/ HInstruction** offset) const;
@@ -187,7 +187,7 @@ class InductionVarRange {
* and graph. The expression is guarded by a taken test if needed. Returns the trip count
* expression on success or null otherwise.
*/
- HInstruction* GenerateTripCount(HLoopInformation* loop, HGraph* graph, HBasicBlock* block);
+ HInstruction* GenerateTripCount(const HLoopInformation* loop, HGraph* graph, HBasicBlock* block);
private:
/*
@@ -203,7 +203,7 @@ class InductionVarRange {
* Checks if header logic of a loop terminates. If trip count is known (constant) sets
* 'is_constant' to true and 'trip_count' to the trip count value.
*/
- bool CheckForFiniteAndConstantProps(HLoopInformation* loop,
+ bool CheckForFiniteAndConstantProps(const HLoopInformation* loop,
/*out*/ bool* is_constant,
/*out*/ int64_t* trip_count) const;
@@ -211,68 +211,87 @@ class InductionVarRange {
* Returns true if exact or upper/lower bound on the given induction
* information is known as a 64-bit constant, which is returned in value.
*/
- bool IsConstant(HInductionVarAnalysis::InductionInfo* info,
+ bool IsConstant(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
ConstantRequest request,
/*out*/ int64_t* value) const;
/** Returns whether induction information can be obtained. */
- bool HasInductionInfo(HInstruction* context,
+ bool HasInductionInfo(const HBasicBlock* context,
HInstruction* instruction,
- /*out*/ HLoopInformation** loop,
+ /*out*/ const HLoopInformation** loop,
/*out*/ HInductionVarAnalysis::InductionInfo** info,
/*out*/ HInductionVarAnalysis::InductionInfo** trip) const;
bool HasFetchInLoop(HInductionVarAnalysis::InductionInfo* info) const;
- bool NeedsTripCount(HInductionVarAnalysis::InductionInfo* info,
+ bool NeedsTripCount(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
/*out*/ int64_t* stride_value) const;
bool IsBodyTripCount(HInductionVarAnalysis::InductionInfo* trip) const;
bool IsUnsafeTripCount(HInductionVarAnalysis::InductionInfo* trip) const;
- bool IsWellBehavedTripCount(HInductionVarAnalysis::InductionInfo* trip) const;
+ bool IsWellBehavedTripCount(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* trip) const;
- Value GetLinear(HInductionVarAnalysis::InductionInfo* info,
+ Value GetLinear(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetPolynomial(HInductionVarAnalysis::InductionInfo* info,
+ Value GetPolynomial(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetGeometric(HInductionVarAnalysis::InductionInfo* info,
+ Value GetGeometric(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetFetch(HInstruction* instruction,
+ Value GetFetch(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInstruction* instruction,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetVal(HInductionVarAnalysis::InductionInfo* info,
+ Value GetVal(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetMul(HInductionVarAnalysis::InductionInfo* info1,
+ Value GetMul(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info1,
HInductionVarAnalysis::InductionInfo* info2,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetDiv(HInductionVarAnalysis::InductionInfo* info1,
+ Value GetDiv(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info1,
HInductionVarAnalysis::InductionInfo* info2,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value GetRem(HInductionVarAnalysis::InductionInfo* info1,
+ Value GetRem(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info1,
HInductionVarAnalysis::InductionInfo* info2) const;
- Value GetXor(HInductionVarAnalysis::InductionInfo* info1,
+ Value GetXor(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info1,
HInductionVarAnalysis::InductionInfo* info2) const;
- Value MulRangeAndConstant(int64_t value,
+ Value MulRangeAndConstant(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ int64_t value,
HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
- Value DivRangeAndConstant(int64_t value,
+ Value DivRangeAndConstant(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ int64_t value,
HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
- bool in_body,
bool is_min) const;
Value AddValue(Value v1, Value v2) const;
@@ -286,7 +305,7 @@ class InductionVarRange {
* success. With values nullptr, the method can be used to determine if code generation
* would be successful without generating actual code yet.
*/
- bool GenerateRangeOrLastValue(HInstruction* context,
+ bool GenerateRangeOrLastValue(const HBasicBlock* context,
HInstruction* instruction,
bool is_last_val,
HGraph* graph,
@@ -298,38 +317,47 @@ class InductionVarRange {
/*out*/ bool* needs_finite_test,
/*out*/ bool* needs_taken_test) const;
- bool GenerateLastValuePolynomial(HInductionVarAnalysis::InductionInfo* info,
+ bool GenerateLastValuePolynomial(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
HGraph* graph,
HBasicBlock* block,
/*out*/HInstruction** result) const;
- bool GenerateLastValueGeometric(HInductionVarAnalysis::InductionInfo* info,
+ bool GenerateLastValueGeometric(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
HGraph* graph,
HBasicBlock* block,
/*out*/HInstruction** result) const;
- bool GenerateLastValueWrapAround(HInductionVarAnalysis::InductionInfo* info,
+ bool GenerateLastValueWrapAround(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
HGraph* graph,
HBasicBlock* block,
/*out*/HInstruction** result) const;
- bool GenerateLastValuePeriodic(HInductionVarAnalysis::InductionInfo* info,
+ bool GenerateLastValuePeriodic(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
HGraph* graph,
HBasicBlock* block,
/*out*/HInstruction** result,
/*out*/ bool* needs_taken_test) const;
- bool GenerateCode(HInductionVarAnalysis::InductionInfo* info,
+ bool GenerateCode(const HBasicBlock* context,
+ const HLoopInformation* loop,
+ HInductionVarAnalysis::InductionInfo* info,
HInductionVarAnalysis::InductionInfo* trip,
HGraph* graph,
HBasicBlock* block,
- /*out*/ HInstruction** result,
- bool in_body,
- bool is_min) const;
+ bool is_min,
+ /*out*/ HInstruction** result) const;
void ReplaceInduction(HInductionVarAnalysis::InductionInfo* info,
HInstruction* fetch,